feat: detaches localization from mongoose entirely
This commit is contained in:
@@ -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());
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user