UNPKG

payload

Version:

Node, React and MongoDB Headless CMS and Application Framework

153 lines (152 loc) • 17.7 kB
/* eslint-disable no-underscore-dangle */ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "default", { enumerable: true, get: function() { return _default; } }); const _executeAccess = /*#__PURE__*/ _interop_require_default(require("../../auth/executeAccess")); const _combineQueries = require("../../database/combineQueries"); const _errors = require("../../errors"); const _afterRead = require("../../fields/hooks/afterRead"); const _commitTransaction = require("../../utilities/commitTransaction"); const _initTransaction = require("../../utilities/initTransaction"); const _killTransaction = require("../../utilities/killTransaction"); const _replaceWithDraftIfAvailable = /*#__PURE__*/ _interop_require_default(require("../../versions/drafts/replaceWithDraftIfAvailable")); const _utils = require("./utils"); function _interop_require_default(obj) { return obj && obj.__esModule ? obj : { default: obj }; } async function findByID(incomingArgs) { let args = incomingArgs; try { const shouldCommit = await (0, _initTransaction.initTransaction)(args.req); // ///////////////////////////////////// // beforeOperation - Collection // ///////////////////////////////////// await args.collection.config.hooks.beforeOperation.reduce(async (priorHook, hook)=>{ await priorHook; args = await hook({ args, collection: args.collection.config, context: args.req.context, operation: 'read', req: args.req }) || args; }, Promise.resolve()); const { id, collection: { config: collectionConfig }, currentDepth, depth, disableErrors, draft: draftEnabled = false, overrideAccess = false, req: { fallbackLocale, locale, t }, req, showHiddenFields } = args; // ///////////////////////////////////// // Access // ///////////////////////////////////// const accessResult = !overrideAccess ? await (0, _executeAccess.default)({ id, disableErrors, req }, collectionConfig.access.read) : true; // If errors are disabled, and access returns false, return null if (accessResult === false) return null; const findOneArgs = { collection: collectionConfig.slug, locale, req: { transactionID: req.transactionID }, where: (0, _combineQueries.combineQueries)({ id: { equals: id } }, accessResult) }; // ///////////////////////////////////// // Find by ID // ///////////////////////////////////// if (!findOneArgs.where.and[0].id) throw new _errors.NotFound(t); let result = await req.payload.db.findOne(findOneArgs); if (!result) { if (!disableErrors) { throw new _errors.NotFound(t); } return null; } // ///////////////////////////////////// // Replace document with draft if available // ///////////////////////////////////// if (collectionConfig.versions?.drafts && draftEnabled) { result = await (0, _replaceWithDraftIfAvailable.default)({ accessResult, doc: result, entity: collectionConfig, entityType: 'collection', overrideAccess, req }); } // ///////////////////////////////////// // beforeRead - Collection // ///////////////////////////////////// await collectionConfig.hooks.beforeRead.reduce(async (priorHook, hook)=>{ await priorHook; result = await hook({ collection: collectionConfig, context: req.context, doc: result, query: findOneArgs.where, req }) || result; }, Promise.resolve()); // ///////////////////////////////////// // afterRead - Fields // ///////////////////////////////////// result = await (0, _afterRead.afterRead)({ collection: collectionConfig, context: req.context, currentDepth, depth, doc: result, fallbackLocale, global: null, locale, overrideAccess, req, showHiddenFields }); // ///////////////////////////////////// // afterRead - Collection // ///////////////////////////////////// await collectionConfig.hooks.afterRead.reduce(async (priorHook, hook)=>{ await priorHook; result = await hook({ collection: collectionConfig, context: req.context, doc: result, query: findOneArgs.where, req }) || result; }, Promise.resolve()); // ///////////////////////////////////// // afterOperation - Collection // ///////////////////////////////////// result = await (0, _utils.buildAfterOperation)({ args, collection: collectionConfig, operation: 'findByID', result: result }) // TODO: fix this typing ; // ///////////////////////////////////// // Return results // ///////////////////////////////////// if (shouldCommit) await (0, _commitTransaction.commitTransaction)(req); return result; } catch (error) { await (0, _killTransaction.killTransaction)(args.req); throw error; } } const _default = findByID; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb2xsZWN0aW9ucy9vcGVyYXRpb25zL2ZpbmRCeUlELnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVyc2NvcmUtZGFuZ2xlICovXG5pbXBvcnQgdHlwZSB7IEZpbmRPbmVBcmdzIH0gZnJvbSAnLi4vLi4vZGF0YWJhc2UvdHlwZXMnXG5pbXBvcnQgdHlwZSB7IFBheWxvYWRSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vZXhwcmVzcy90eXBlcydcbmltcG9ydCB0eXBlIHsgQ29sbGVjdGlvbiwgVHlwZVdpdGhJRCB9IGZyb20gJy4uL2NvbmZpZy90eXBlcydcblxuaW1wb3J0IGV4ZWN1dGVBY2Nlc3MgZnJvbSAnLi4vLi4vYXV0aC9leGVjdXRlQWNjZXNzJ1xuaW1wb3J0IHsgY29tYmluZVF1ZXJpZXMgfSBmcm9tICcuLi8uLi9kYXRhYmFzZS9jb21iaW5lUXVlcmllcydcbmltcG9ydCB7IE5vdEZvdW5kIH0gZnJvbSAnLi4vLi4vZXJyb3JzJ1xuaW1wb3J0IHsgYWZ0ZXJSZWFkIH0gZnJvbSAnLi4vLi4vZmllbGRzL2hvb2tzL2FmdGVyUmVhZCdcbmltcG9ydCB7IGNvbW1pdFRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vLi4vdXRpbGl0aWVzL2NvbW1pdFRyYW5zYWN0aW9uJ1xuaW1wb3J0IHsgaW5pdFRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vLi4vdXRpbGl0aWVzL2luaXRUcmFuc2FjdGlvbidcbmltcG9ydCB7IGtpbGxUcmFuc2FjdGlvbiB9IGZyb20gJy4uLy4uL3V0aWxpdGllcy9raWxsVHJhbnNhY3Rpb24nXG5pbXBvcnQgcmVwbGFjZVdpdGhEcmFmdElmQXZhaWxhYmxlIGZyb20gJy4uLy4uL3ZlcnNpb25zL2RyYWZ0cy9yZXBsYWNlV2l0aERyYWZ0SWZBdmFpbGFibGUnXG5pbXBvcnQgeyBidWlsZEFmdGVyT3BlcmF0aW9uIH0gZnJvbSAnLi91dGlscydcblxuZXhwb3J0IHR5cGUgQXJndW1lbnRzID0ge1xuICBjb2xsZWN0aW9uOiBDb2xsZWN0aW9uXG4gIGN1cnJlbnREZXB0aD86IG51bWJlclxuICBkZXB0aD86IG51bWJlclxuICBkaXNhYmxlRXJyb3JzPzogYm9vbGVhblxuICBkcmFmdD86IGJvb2xlYW5cbiAgaWQ6IG51bWJlciB8IHN0cmluZ1xuICBvdmVycmlkZUFjY2Vzcz86IGJvb2xlYW5cbiAgcmVxOiBQYXlsb2FkUmVxdWVzdFxuICBzaG93SGlkZGVuRmllbGRzPzogYm9vbGVhblxufVxuXG5hc3luYyBmdW5jdGlvbiBmaW5kQnlJRDxUIGV4dGVuZHMgVHlwZVdpdGhJRD4oaW5jb21pbmdBcmdzOiBBcmd1bWVudHMpOiBQcm9taXNlPFQ+IHtcbiAgbGV0IGFyZ3MgPSBpbmNvbWluZ0FyZ3NcblxuICB0cnkge1xuICAgIGNvbnN0IHNob3VsZENvbW1pdCA9IGF3YWl0IGluaXRUcmFuc2FjdGlvbihhcmdzLnJlcSlcblxuICAgIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAvLyBiZWZvcmVPcGVyYXRpb24gLSBDb2xsZWN0aW9uXG4gICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgYXdhaXQgYXJncy5jb2xsZWN0aW9uLmNvbmZpZy5ob29rcy5iZWZvcmVPcGVyYXRpb24ucmVkdWNlKGFzeW5jIChwcmlvckhvb2ssIGhvb2spID0+IHtcbiAgICAgIGF3YWl0IHByaW9ySG9va1xuXG4gICAgICBhcmdzID1cbiAgICAgICAgKGF3YWl0IGhvb2soe1xuICAgICAgICAgIGFyZ3MsXG4gICAgICAgICAgY29sbGVjdGlvbjogYXJncy5jb2xsZWN0aW9uLmNvbmZpZyxcbiAgICAgICAgICBjb250ZXh0OiBhcmdzLnJlcS5jb250ZXh0LFxuICAgICAgICAgIG9wZXJhdGlvbjogJ3JlYWQnLFxuICAgICAgICAgIHJlcTogYXJncy5yZXEsXG4gICAgICAgIH0pKSB8fCBhcmdzXG4gICAgfSwgUHJvbWlzZS5yZXNvbHZlKCkpXG5cbiAgICBjb25zdCB7XG4gICAgICBpZCxcbiAgICAgIGNvbGxlY3Rpb246IHsgY29uZmlnOiBjb2xsZWN0aW9uQ29uZmlnIH0sXG4gICAgICBjdXJyZW50RGVwdGgsXG4gICAgICBkZXB0aCxcbiAgICAgIGRpc2FibGVFcnJvcnMsXG4gICAgICBkcmFmdDogZHJhZnRFbmFibGVkID0gZmFsc2UsXG4gICAgICBvdmVycmlkZUFjY2VzcyA9IGZhbHNlLFxuICAgICAgcmVxOiB7IGZhbGxiYWNrTG9jYWxlLCBsb2NhbGUsIHQgfSxcbiAgICAgIHJlcSxcbiAgICAgIHNob3dIaWRkZW5GaWVsZHMsXG4gICAgfSA9IGFyZ3NcblxuICAgIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAvLyBBY2Nlc3NcbiAgICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgICBjb25zdCBhY2Nlc3NSZXN1bHQgPSAhb3ZlcnJpZGVBY2Nlc3NcbiAgICAgID8gYXdhaXQgZXhlY3V0ZUFjY2Vzcyh7IGlkLCBkaXNhYmxlRXJyb3JzLCByZXEgfSwgY29sbGVjdGlvbkNvbmZpZy5hY2Nlc3MucmVhZClcbiAgICAgIDogdHJ1ZVxuXG4gICAgLy8gSWYgZXJyb3JzIGFyZSBkaXNhYmxlZCwgYW5kIGFjY2VzcyByZXR1cm5zIGZhbHNlLCByZXR1cm4gbnVsbFxuICAgIGlmIChhY2Nlc3NSZXN1bHQgPT09IGZhbHNlKSByZXR1cm4gbnVsbFxuXG4gICAgY29uc3QgZmluZE9uZUFyZ3M6IEZpbmRPbmVBcmdzID0ge1xuICAgICAgY29sbGVjdGlvbjogY29sbGVjdGlvbkNvbmZpZy5zbHVnLFxuICAgICAgbG9jYWxlLFxuICAgICAgcmVxOiB7XG4gICAgICAgIHRyYW5zYWN0aW9uSUQ6IHJlcS50cmFuc2FjdGlvbklELFxuICAgICAgfSBhcyBQYXlsb2FkUmVxdWVzdCxcbiAgICAgIHdoZXJlOiBjb21iaW5lUXVlcmllcyh7IGlkOiB7IGVxdWFsczogaWQgfSB9LCBhY2Nlc3NSZXN1bHQpLFxuICAgIH1cblxuICAgIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAvLyBGaW5kIGJ5IElEXG4gICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgaWYgKCFmaW5kT25lQXJncy53aGVyZS5hbmRbMF0uaWQpIHRocm93IG5ldyBOb3RGb3VuZCh0KVxuXG4gICAgbGV0IHJlc3VsdDogVCA9IGF3YWl0IHJlcS5wYXlsb2FkLmRiLmZpbmRPbmUoZmluZE9uZUFyZ3MpXG5cbiAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgaWYgKCFkaXNhYmxlRXJyb3JzKSB7XG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZCh0KVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAvLyBSZXBsYWNlIGRvY3VtZW50IHdpdGggZHJhZnQgaWYgYXZhaWxhYmxlXG4gICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgaWYgKGNvbGxlY3Rpb25Db25maWcudmVyc2lvbnM/LmRyYWZ0cyAmJiBkcmFmdEVuYWJsZWQpIHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHJlcGxhY2VXaXRoRHJhZnRJZkF2YWlsYWJsZSh7XG4gICAgICAgIGFjY2Vzc1Jlc3VsdCxcbiAgICAgICAgZG9jOiByZXN1bHQsXG4gICAgICAgIGVudGl0eTogY29sbGVjdGlvbkNvbmZpZyxcbiAgICAgICAgZW50aXR5VHlwZTogJ2NvbGxlY3Rpb24nLFxuICAgICAgICBvdmVycmlkZUFjY2VzcyxcbiAgICAgICAgcmVxLFxuICAgICAgfSlcbiAgICB9XG5cbiAgICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgLy8gYmVmb3JlUmVhZCAtIENvbGxlY3Rpb25cbiAgICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgICBhd2FpdCBjb2xsZWN0aW9uQ29uZmlnLmhvb2tzLmJlZm9yZVJlYWQucmVkdWNlKGFzeW5jIChwcmlvckhvb2ssIGhvb2spID0+IHtcbiAgICAgIGF3YWl0IHByaW9ySG9va1xuXG4gICAgICByZXN1bHQgPVxuICAgICAgICAoYXdhaXQgaG9vayh7XG4gICAgICAgICAgY29sbGVjdGlvbjogY29sbGVjdGlvbkNvbmZpZyxcbiAgICAgICAgICBjb250ZXh0OiByZXEuY29udGV4dCxcbiAgICAgICAgICBkb2M6IHJlc3VsdCxcbiAgICAgICAgICBxdWVyeTogZmluZE9uZUFyZ3Mud2hlcmUsXG4gICAgICAgICAgcmVxLFxuICAgICAgICB9KSkgfHwgcmVzdWx0XG4gICAgfSwgUHJvbWlzZS5yZXNvbHZlKCkpXG5cbiAgICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgLy8gYWZ0ZXJSZWFkIC0gRmllbGRzXG4gICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgcmVzdWx0ID0gYXdhaXQgYWZ0ZXJSZWFkKHtcbiAgICAgIGNvbGxlY3Rpb246IGNvbGxlY3Rpb25Db25maWcsXG4gICAgICBjb250ZXh0OiByZXEuY29udGV4dCxcbiAgICAgIGN1cnJlbnREZXB0aCxcbiAgICAgIGRlcHRoLFxuICAgICAgZG9jOiByZXN1bHQsXG4gICAgICBmYWxsYmFja0xvY2FsZSxcbiAgICAgIGdsb2JhbDogbnVsbCxcbiAgICAgIGxvY2FsZSxcbiAgICAgIG92ZXJyaWRlQWNjZXNzLFxuICAgICAgcmVxLFxuICAgICAgc2hvd0hpZGRlbkZpZWxkcyxcbiAgICB9KVxuXG4gICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgIC8vIGFmdGVyUmVhZCAtIENvbGxlY3Rpb25cbiAgICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgICBhd2FpdCBjb2xsZWN0aW9uQ29uZmlnLmhvb2tzLmFmdGVyUmVhZC5yZWR1Y2UoYXN5bmMgKHByaW9ySG9vaywgaG9vaykgPT4ge1xuICAgICAgYXdhaXQgcHJpb3JIb29rXG5cbiAgICAgIHJlc3VsdCA9XG4gICAgICAgIChhd2FpdCBob29rKHtcbiAgICAgICAgICBjb2xsZWN0aW9uOiBjb2xsZWN0aW9uQ29uZmlnLFxuICAgICAgICAgIGNvbnRleHQ6IHJlcS5jb250ZXh0LFxuICAgICAgICAgIGRvYzogcmVzdWx0LFxuICAgICAgICAgIHF1ZXJ5OiBmaW5kT25lQXJncy53aGVyZSxcbiAgICAgICAgICByZXEsXG4gICAgICAgIH0pKSB8fCByZXN1bHRcbiAgICB9LCBQcm9taXNlLnJlc29sdmUoKSlcblxuICAgIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAvLyBhZnRlck9wZXJhdGlvbiAtIENvbGxlY3Rpb25cbiAgICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgICByZXN1bHQgPSBhd2FpdCBidWlsZEFmdGVyT3BlcmF0aW9uPFQ+KHtcbiAgICAgIGFyZ3MsXG4gICAgICBjb2xsZWN0aW9uOiBjb2xsZWN0aW9uQ29uZmlnLFxuICAgICAgb3BlcmF0aW9uOiAnZmluZEJ5SUQnLFxuICAgICAgcmVzdWx0OiByZXN1bHQgYXMgYW55LFxuICAgIH0pIC8vIFRPRE86IGZpeCB0aGlzIHR5cGluZ1xuXG4gICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgIC8vIFJldHVybiByZXN1bHRzXG4gICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgaWYgKHNob3VsZENvbW1pdCkgYXdhaXQgY29tbWl0VHJhbnNhY3Rpb24ocmVxKVxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGF3YWl0IGtpbGxUcmFuc2FjdGlvbihhcmdzLnJlcSlcbiAgICB0aHJvdyBlcnJvclxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZpbmRCeUlEXG4iXSwibmFtZXMiOlsiZmluZEJ5SUQiLCJpbmNvbWluZ0FyZ3MiLCJhcmdzIiwic2hvdWxkQ29tbWl0IiwiaW5pdFRyYW5zYWN0aW9uIiwicmVxIiwiY29sbGVjdGlvbiIsImNvbmZpZyIsImhvb2tzIiwiYmVmb3JlT3BlcmF0aW9uIiwicmVkdWNlIiwicHJpb3JIb29rIiwiaG9vayIsImNvbnRleHQiLCJvcGVyYXRpb24iLCJQcm9taXNlIiwicmVzb2x2ZSIsImlkIiwiY29sbGVjdGlvbkNvbmZpZyIsImN1cnJlbnREZXB0aCIsImRlcHRoIiwiZGlzYWJsZUVycm9ycyIsImRyYWZ0IiwiZHJhZnRFbmFibGVkIiwib3ZlcnJpZGVBY2Nlc3MiLCJmYWxsYmFja0xvY2FsZSIsImxvY2FsZSIsInQiLCJzaG93SGlkZGVuRmllbGRzIiwiYWNjZXNzUmVzdWx0IiwiZXhlY3V0ZUFjY2VzcyIsImFjY2VzcyIsInJlYWQiLCJmaW5kT25lQXJncyIsInNsdWciLCJ0cmFuc2FjdGlvbklEIiwid2hlcmUiLCJjb21iaW5lUXVlcmllcyIsImVxdWFscyIsImFuZCIsIk5vdEZvdW5kIiwicmVzdWx0IiwicGF5bG9hZCIsImRiIiwiZmluZE9uZSIsInZlcnNpb25zIiwiZHJhZnRzIiwicmVwbGFjZVdpdGhEcmFmdElmQXZhaWxhYmxlIiwiZG9jIiwiZW50aXR5IiwiZW50aXR5VHlwZSIsImJlZm9yZVJlYWQiLCJxdWVyeSIsImFmdGVyUmVhZCIsImdsb2JhbCIsImJ1aWxkQWZ0ZXJPcGVyYXRpb24iLCJjb21taXRUcmFuc2FjdGlvbiIsImVycm9yIiwia2lsbFRyYW5zYWN0aW9uIl0sIm1hcHBpbmdzIjoiQUFBQSx1Q0FBdUM7Ozs7K0JBOEx2Qzs7O2VBQUE7OztzRUF6TDBCO2dDQUNLO3dCQUNOOzJCQUNDO21DQUNRO2lDQUNGO2lDQUNB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