Skip to content

Commit

Permalink
Fix: Fixed entryId collision + filtering in keyOfEntry (#27)
Browse files Browse the repository at this point in the history
  • Loading branch information
Grouviere authored Feb 24, 2023
1 parent 0f7ea09 commit b237712
Showing 1 changed file with 61 additions and 17 deletions.
78 changes: 61 additions & 17 deletions server/utils/pick-entries.js
Original file line number Diff line number Diff line change
Expand Up @@ -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]);
};
Expand All @@ -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);
Expand All @@ -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;
Expand All @@ -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];
Expand Down

0 comments on commit b237712

Please sign in to comment.