From b2377125acaa5f303d989e9bfa7ffd6f828ffc51 Mon Sep 17 00:00:00 2001 From: "Guillaume. R" Date: Fri, 24 Feb 2023 09:47:08 +0100 Subject: [PATCH] Fix: Fixed entryId collision + filtering in keyOfEntry (#27) --- server/utils/pick-entries.js | 78 ++++++++++++++++++++++++++++-------- 1 file changed, 61 insertions(+), 17 deletions(-) diff --git a/server/utils/pick-entries.js b/server/utils/pick-entries.js index eb23e6d..126133c 100644 --- a/server/utils/pick-entries.js +++ b/server/utils/pick-entries.js @@ -12,8 +12,16 @@ const isDynamicZoneKey = (key, transferSetupModel) => { } const dynamicPropertyEntryIdWithSquareBrackets = matches[1]; - const dynamicPropertyNamePart = key.split(".").find((s, index) => index > 1 && s.includes(dynamicPropertyEntryIdWithSquareBrackets)); - const dynamicPropertyName = dynamicPropertyNamePart.replace(dynamicPropertyEntryIdWithSquareBrackets, ""); + const dynamicPropertyNamePart = key + .split(".") + .find( + (s, index) => + index > 1 && s.includes(dynamicPropertyEntryIdWithSquareBrackets) + ); + const dynamicPropertyName = dynamicPropertyNamePart.replace( + dynamicPropertyEntryIdWithSquareBrackets, + "" + ); return Array.isArray(transferSetupModel[dynamicPropertyName]); }; @@ -25,19 +33,31 @@ const getDynamicZoneEntryId = (key, transferSetupModel) => { const matches = key.match(/\[\d+\]+/g); // remove square brackets - const id = matches[1].replace(/[\[\]']+/g, ''); + const id = matches[1].replace(/[\[\]']+/g, ""); return id; -} +}; + +const getUniqueDynamicZoneEntryId = (key, transferSetupModel) => { + if (!isDynamicZoneKey(key, transferSetupModel)) { + return undefined; + } + + const keySplittedByDot = key.split("."); + + return keySplittedByDot[2]; +}; const doesPickPathsIncludeTheComponent = (pickPaths, dzParameterKey) => { return pickPaths.some((pp) => pp.includes(dzParameterKey)); -} +}; const pickEntries = (flatten, pickPaths, transferSetupModel) => { // * dynamic zones properties must! always be in 1st level (not in component; Strapi restrictions) const dzEntryIdComponentMap = {}; - const flattenComponentProps = Object.fromEntries(Object.entries(flatten).filter(([key]) => key.includes('__component'))); + const flattenComponentProps = Object.fromEntries( + Object.entries(flatten).filter(([key]) => key.includes("__component")) + ); const pickedDeep = pickDeep(transferSetupModel, ["__component__"]); const flattenedPickedDeep = flattenObject(pickedDeep); @@ -52,25 +72,41 @@ const pickEntries = (flatten, pickPaths, transferSetupModel) => { return; } - const entryId = getDynamicZoneEntryId(key, transferSetupModel); - dzEntryIdComponentMap[entryId] = { + const keySplittedByDot = key.replace(".__component", "").split("."); + const componentName = keySplittedByDot[keySplittedByDot.length - 1].replace( + /\[.*\]/g, + "" + ); + const uniqueEntryId = getUniqueDynamicZoneEntryId(key, transferSetupModel); + + const keyOfEntry = Object.keys(flattenedPickedDeep) + .filter((fpdk) => fpdk.replace(/\[.*\]/g, "") == componentName) + .find((fpdk) => flattenedPickedDeep[fpdk] === flattenComponentProps[key]); + dzEntryIdComponentMap[uniqueEntryId] = { component: flattenComponentProps[key], - key: Object.keys(flattenedPickedDeep).find((fpdk) => flattenedPickedDeep[fpdk] === flattenComponentProps[key]), + key: keyOfEntry, }; }); const pickedEntries = {}; - const mappedPickPaths = pickPaths.map((pickPath) => pickPath.replace(/\[\d+\]/g, "")); + const mappedPickPaths = pickPaths.map((pickPath) => + pickPath.replace(/\[\d+\]/g, "") + ); // filter out "__component" - const filteredFlatten = Object.fromEntries(Object.entries(flatten).filter(([key]) => !key.includes('__component'))); + const filteredFlatten = Object.fromEntries( + Object.entries(flatten).filter(([key]) => !key.includes("__component")) + ); Object.keys(filteredFlatten).forEach((key) => { // decide whether it is a dynamic zone // handle dynamic zones, in case of similarly-named fields across more components const isDynamicZone = isDynamicZoneKey(key, transferSetupModel); if (isDynamicZone) { - const dzEntryId = getDynamicZoneEntryId(key, transferSetupModel); - const dzParameterKey = dzEntryIdComponentMap[dzEntryId].key; + const uniqueDzEntryId = getUniqueDynamicZoneEntryId( + key, + transferSetupModel + ); + const dzParameterKey = dzEntryIdComponentMap[uniqueDzEntryId].key; if (!doesPickPathsIncludeTheComponent(pickPaths, dzParameterKey)) { return; @@ -81,11 +117,19 @@ const pickEntries = (flatten, pickPaths, transferSetupModel) => { if (mappedPickPaths.includes(filteredKey)) { if (isDynamicZone) { const dzEntryId = getDynamicZoneEntryId(key, transferSetupModel); - const dzParameterKey = dzEntryIdComponentMap[dzEntryId].key; - - const dzParameterName = dzParameterKey.substring(0, dzParameterKey.indexOf('[')); + const uniqueDzEntryId = getUniqueDynamicZoneEntryId( + key, + transferSetupModel + ); + const dzParameterKey = dzEntryIdComponentMap[uniqueDzEntryId].key; + + const dzParameterName = dzParameterKey.substring( + 0, + dzParameterKey.indexOf("[") + ); const toBeReplaced = `${dzParameterName}[${dzEntryId}]`; - const dzParameterComponent = dzEntryIdComponentMap[dzEntryId].component; + const dzParameterComponent = + dzEntryIdComponentMap[uniqueDzEntryId].component; const componentAddition = `${dzParameterName}[${dzEntryId};${dzParameterComponent}]`; const replacedKey = key.replace(toBeReplaced, componentAddition); pickedEntries[replacedKey] = flatten[key];