@webiny/api-headless-cms-ddb-es
Version:
DynamoDB and Elasticsearch storage operations plugin for Headless CMS API.
158 lines (157 loc) • 4.06 kB
JavaScript
import { getFieldIdentifiers } from "../../../helpers/index.js";
import { CmsEntryOpenSearchFieldIndex } from "../abstractions/CmsEntryOpenSearchFieldIndex.js";
const processToIndex = params => {
const {
fields,
value: sourceValue,
rawValue: sourceRawValue,
getFieldIndex,
fieldRegistry,
model
} = params;
return fields.reduce((values, field) => {
const plugin = getFieldIndex(field.type);
const identifiers = getFieldIdentifiers(sourceValue, sourceRawValue, field);
if (!identifiers) {
return values;
}
const {
value,
rawValue
} = plugin.toIndex({
model,
field,
value: sourceValue[identifiers.valueIdentifier || identifiers.rawValueIdentifier],
rawValue: sourceRawValue[identifiers.rawValueIdentifier || identifiers.valueIdentifier],
getFieldIndex,
fieldRegistry
});
if (value !== undefined) {
values.value[identifiers.valueIdentifier || identifiers.rawValueIdentifier] = value;
}
if (rawValue !== undefined) {
values.rawValue[identifiers.rawValueIdentifier || identifiers.valueIdentifier] = rawValue;
}
return values;
}, {
value: {},
rawValue: {}
});
};
const processFromIndex = params => {
const {
fields,
value: sourceValue,
rawValue: sourceRawValue,
getFieldIndex,
fieldRegistry,
model
} = params;
return fields.reduce((values, field) => {
const plugin = getFieldIndex(field.type);
const identifiers = getFieldIdentifiers(sourceValue, sourceRawValue, field);
if (!identifiers) {
return values;
}
const value = plugin.fromIndex({
fieldRegistry,
model,
field,
value: sourceValue[identifiers.valueIdentifier || identifiers.rawValueIdentifier],
rawValue: sourceRawValue ? sourceRawValue[identifiers.rawValueIdentifier || identifiers.valueIdentifier] : null,
getFieldIndex
});
if (value !== undefined) {
values[identifiers.valueIdentifier || identifiers.rawValueIdentifier] = value;
}
return values;
}, {});
};
class ObjectFieldIndexImpl {
fieldType = "object";
toIndex({
fieldRegistry,
model,
field,
value: initialValue,
rawValue: initialRawValue,
getFieldIndex
}) {
if (!initialValue) {
return {
value: null
};
}
const fields = field.settings?.fields || [];
if (field.list) {
const result = {
value: [],
rawValue: []
};
for (const key in initialValue) {
const {
value,
rawValue
} = processToIndex({
value: initialValue[key],
rawValue: initialRawValue[key],
getFieldIndex,
model,
fieldRegistry,
fields
});
result.value.push(value);
result.rawValue.push(rawValue);
}
return {
value: result.value.length > 0 ? result.value : undefined,
rawValue: result.rawValue.length > 0 ? result.rawValue : undefined
};
}
return processToIndex({
value: initialValue,
rawValue: initialRawValue,
getFieldIndex,
model,
fieldRegistry,
fields
});
}
fromIndex({
field,
value,
rawValue,
model,
getFieldIndex,
fieldRegistry
}) {
if (!value) {
return null;
}
const fields = field.settings?.fields || [];
if (field.list) {
const source = value || rawValue || [];
return source.map((_, index) => processFromIndex({
value: value ? value[index] || {} : {},
rawValue: rawValue ? rawValue[index] || {} : {},
getFieldIndex,
model,
fieldRegistry,
fields
}));
}
return processFromIndex({
value,
rawValue,
getFieldIndex,
model,
fieldRegistry,
fields
});
}
}
export const ObjectFieldIndex = CmsEntryOpenSearchFieldIndex.createImplementation({
implementation: ObjectFieldIndexImpl,
dependencies: []
});
//# sourceMappingURL=ObjectFieldIndex.js.map