UNPKG

@r1tsu/payload

Version:

212 lines (211 loc) 7.6 kB
import executeAccess from '../../auth/executeAccess.js'; import { afterChange } from '../../fields/hooks/afterChange/index.js'; import { afterRead } from '../../fields/hooks/afterRead/index.js'; import { beforeChange } from '../../fields/hooks/beforeChange/index.js'; import { beforeValidate } from '../../fields/hooks/beforeValidate/index.js'; import { commitTransaction } from '../../utilities/commitTransaction.js'; import { initTransaction } from '../../utilities/initTransaction.js'; import { killTransaction } from '../../utilities/killTransaction.js'; import { getLatestGlobalVersion } from '../../versions/getLatestGlobalVersion.js'; import { saveVersion } from '../../versions/saveVersion.js'; export const updateOperation = async (args)=>{ const { slug, autosave, depth, draft: draftArg, globalConfig, overrideAccess, req: { fallbackLocale, locale, payload }, req, showHiddenFields } = args; try { const shouldCommit = await initTransaction(req); let { data } = args; const shouldSaveDraft = Boolean(draftArg && globalConfig.versions?.drafts); // ///////////////////////////////////// // 1. Retrieve and execute access // ///////////////////////////////////// const accessResults = !overrideAccess ? await executeAccess({ data, req }, globalConfig.access.update) : true; // ///////////////////////////////////// // Retrieve document // ///////////////////////////////////// const query = overrideAccess ? undefined : accessResults; // ///////////////////////////////////// // 2. Retrieve document // ///////////////////////////////////// const { global, globalExists } = await getLatestGlobalVersion({ slug, config: globalConfig, locale, payload, req, where: query }); let globalJSON = {}; if (global) { globalJSON = JSON.parse(JSON.stringify(global)); if (globalJSON._id) { delete globalJSON._id; } } const originalDoc = await afterRead({ collection: null, context: req.context, depth: 0, doc: globalJSON, fallbackLocale, global: globalConfig, locale, overrideAccess: true, req, showHiddenFields }); // ///////////////////////////////////// // beforeValidate - Fields // ///////////////////////////////////// data = await beforeValidate({ collection: null, context: req.context, data, doc: originalDoc, global: globalConfig, operation: 'update', overrideAccess, req }); // ///////////////////////////////////// // beforeValidate - Global // ///////////////////////////////////// await globalConfig.hooks.beforeValidate.reduce(async (priorHook, hook)=>{ await priorHook; data = await hook({ context: req.context, data, global: globalConfig, originalDoc, req }) || data; }, Promise.resolve()); // ///////////////////////////////////// // beforeChange - Global // ///////////////////////////////////// await globalConfig.hooks.beforeChange.reduce(async (priorHook, hook)=>{ await priorHook; data = await hook({ context: req.context, data, global: globalConfig, originalDoc, req }) || data; }, Promise.resolve()); // ///////////////////////////////////// // beforeChange - Fields // ///////////////////////////////////// let result = await beforeChange({ collection: null, context: req.context, data, doc: originalDoc, docWithLocales: globalJSON, global: globalConfig, operation: 'update', req, skipValidation: shouldSaveDraft }); // ///////////////////////////////////// // Update // ///////////////////////////////////// if (!shouldSaveDraft) { if (globalExists) { result = await payload.db.updateGlobal({ slug, data: result, req }); } else { result = await payload.db.createGlobal({ slug, data: result, req }); } } // ///////////////////////////////////// // Create version // ///////////////////////////////////// if (globalConfig.versions) { const { globalType } = result; result = await saveVersion({ autosave, docWithLocales: { ...result, createdAt: result.createdAt, updatedAt: result.updatedAt }, draft: shouldSaveDraft, global: globalConfig, payload, req }); result.globalType = globalType; } // ///////////////////////////////////// // afterRead - Fields // ///////////////////////////////////// result = await afterRead({ collection: null, context: req.context, depth, doc: result, fallbackLocale: null, global: globalConfig, locale, overrideAccess, req, showHiddenFields }); // ///////////////////////////////////// // afterRead - Global // ///////////////////////////////////// await globalConfig.hooks.afterRead.reduce(async (priorHook, hook)=>{ await priorHook; result = await hook({ context: req.context, doc: result, global: globalConfig, req }) || result; }, Promise.resolve()); // ///////////////////////////////////// // afterChange - Fields // ///////////////////////////////////// result = await afterChange({ collection: null, context: req.context, data, doc: result, global: globalConfig, operation: 'update', previousDoc: originalDoc, req }); // ///////////////////////////////////// // afterChange - Global // ///////////////////////////////////// await globalConfig.hooks.afterChange.reduce(async (priorHook, hook)=>{ await priorHook; result = await hook({ context: req.context, doc: result, global: globalConfig, previousDoc: originalDoc, req }) || result; }, Promise.resolve()); // ///////////////////////////////////// // Return results // ///////////////////////////////////// if (shouldCommit) await commitTransaction(req); return result; } catch (error) { await killTransaction(req); throw error; } }; //# sourceMappingURL=update.js.map