feat: detaches localization from mongoose entirely

This commit is contained in:
James
2021-02-17 22:31:53 -05:00
parent 8e022cd48c
commit 162ec74445
29 changed files with 603 additions and 539 deletions

View File

@@ -1,3 +1,4 @@
import { Payload } from '..';
import { ValidationError } from '../errors';
import sanitizeFallbackLocale from '../localization/sanitizeFallbackLocale';
import traverseFields from './traverseFields';
@@ -6,25 +7,29 @@ import { GlobalConfig } from '../globals/config/types';
import { Operation } from '../types';
import { PayloadRequest } from '../express/types';
import { HookName } from './config/types';
import deepCopyObject from '../utilities/deepCopyObject';
type Arguments = {
data: Record<string, unknown>
operation: Operation
hook: HookName
hook?: HookName
req: PayloadRequest
overrideAccess: boolean
reduceLocales?: boolean
flattenLocales?: boolean
unflattenLocales?: boolean
originalDoc?: Record<string, unknown>
docWithLocales?: Record<string, unknown>
id?: string
showHiddenFields?: boolean
depth?: number
currentDepth?: number
}
export default async function performFieldOperations(entityConfig: CollectionConfig | GlobalConfig, args: Arguments): Promise<{ [key: string]: unknown }> {
export default async function performFieldOperations(this: Payload, entityConfig: CollectionConfig | GlobalConfig, args: Arguments): Promise<{ [key: string]: unknown }> {
const {
data: fullData,
data,
originalDoc: fullOriginalDoc,
docWithLocales,
operation,
hook,
req,
@@ -34,10 +39,13 @@ export default async function performFieldOperations(entityConfig: CollectionCon
locale,
},
overrideAccess,
reduceLocales,
flattenLocales,
unflattenLocales = false,
showHiddenFields = false,
} = args;
const fullData = deepCopyObject(data);
const fallbackLocale = sanitizeFallbackLocale(req.fallbackLocale);
let depth = 0;
@@ -57,6 +65,7 @@ export default async function performFieldOperations(entityConfig: CollectionCon
const accessPromises = [];
const relationshipPopulations = [];
const hookPromises = [];
const unflattenLocaleActions = [];
const errors: { message: string, field: string }[] = [];
// //////////////////////////////////////////
@@ -64,11 +73,11 @@ export default async function performFieldOperations(entityConfig: CollectionCon
// //////////////////////////////////////////
traverseFields({
fields: entityConfig.fields, // TODO: Bad typing, this exists
fields: entityConfig.fields,
data: fullData,
originalDoc: fullOriginalDoc,
path: '',
reduceLocales,
flattenLocales,
locale,
fallbackLocale,
accessPromises,
@@ -87,6 +96,9 @@ export default async function performFieldOperations(entityConfig: CollectionCon
errors,
payload: this,
showHiddenFields,
unflattenLocales,
unflattenLocaleActions,
docWithLocales,
});
await Promise.all(hookPromises);
@@ -99,6 +111,8 @@ export default async function performFieldOperations(entityConfig: CollectionCon
throw new ValidationError(errors);
}
unflattenLocaleActions.forEach((action) => action());
await Promise.all(accessPromises);
const relationshipPopulationPromises = relationshipPopulations.map((population) => population());

View File

@@ -11,7 +11,7 @@ type Arguments = {
data: Record<string, any>
originalDoc: Record<string, any>
path: string
reduceLocales: boolean
flattenLocales: boolean
locale: string
fallbackLocale: string
accessPromises: Promise<void>[]
@@ -30,6 +30,9 @@ type Arguments = {
errors: {message: string, field: string}[]
payload: Payload
showHiddenFields: boolean
unflattenLocales: boolean
unflattenLocaleActions: (() => void)[]
docWithLocales?: Record<string, any>
}
const traverseFields = (args: Arguments): void => {
@@ -38,7 +41,7 @@ const traverseFields = (args: Arguments): void => {
data = {},
originalDoc = {},
path,
reduceLocales,
flattenLocales,
locale,
fallbackLocale,
accessPromises,
@@ -57,6 +60,9 @@ const traverseFields = (args: Arguments): void => {
errors,
payload,
showHiddenFields,
unflattenLocaleActions,
unflattenLocales,
docWithLocales = {},
} = args;
fields.forEach((field) => {
@@ -85,7 +91,7 @@ const traverseFields = (args: Arguments): void => {
&& field.name
&& field.localized
&& locale !== 'all'
&& reduceLocales;
&& flattenLocales;
if (hasLocalizedValue) {
let localizedValue = data[field.name][locale];
@@ -94,6 +100,15 @@ const traverseFields = (args: Arguments): void => {
dataCopy[field.name] = localizedValue;
}
if (field.localized && unflattenLocales) {
unflattenLocaleActions.push(() => {
data[field.name] = payload.config.localization.locales.reduce((locales, localeID) => ({
...locales,
[localeID]: localeID === locale ? data[field.name] : docWithLocales?.[field.name]?.[localeID],
}), {});
});
}
accessPromises.push(accessPromise({
data,
originalDoc,
@@ -128,12 +143,12 @@ const traverseFields = (args: Arguments): void => {
} else if (fieldIsArrayType(field)) {
if (Array.isArray(data[field.name])) {
(data[field.name] as Record<string, unknown>[]).forEach((rowData, i) => {
const originalDocRow = originalDoc && originalDoc[field.name] && originalDoc[field.name][i];
traverseFields({
...args,
fields: field.fields,
data: rowData,
originalDoc: originalDocRow || undefined,
originalDoc: originalDoc?.[field.name]?.[i],
docWithLocales: docWithLocales?.[field.name]?.[i],
path: `${path}${field.name}.${i}.`,
});
});
@@ -144,6 +159,7 @@ const traverseFields = (args: Arguments): void => {
fields: field.fields,
data: data[field.name] as Record<string, unknown>,
originalDoc: originalDoc[field.name],
docWithLocales: docWithLocales?.[field.name],
path: `${path}${field.name}.`,
});
}
@@ -153,14 +169,14 @@ const traverseFields = (args: Arguments): void => {
if (Array.isArray(data[field.name])) {
(data[field.name] as Record<string, unknown>[]).forEach((rowData, i) => {
const block = field.blocks.find((blockType) => blockType.slug === rowData.blockType);
const originalDocRow = originalDoc && originalDoc[field.name] && originalDoc[field.name][i];
if (block) {
traverseFields({
...args,
fields: block.fields,
data: rowData,
originalDoc: originalDocRow || undefined,
originalDoc: originalDoc?.[field.name]?.[i],
docWithLocales: docWithLocales?.[field.name]?.[i],
path: `${path}${field.name}.${i}.`,
});
}
@@ -168,7 +184,7 @@ const traverseFields = (args: Arguments): void => {
}
}
if ((operation === 'create' || operation === 'update') && field.name) {
if (hook === 'beforeChange' && field.name) {
const updatedData = data;
if (data?.[field.name] === undefined && originalDoc?.[field.name] === undefined && field.defaultValue) {