{"version":3,"sources":["../../../src/globals/operations/findOne.ts"],"sourcesContent":["import { ar } from '@payloadcms/translations/languages/ar'\n\nimport type { FindOptions } from '../../collections/operations/local/find.js'\nimport type { AccessResult } from '../../config/types.js'\nimport type {\n  JsonObject,\n  PayloadRequest,\n  PopulateType,\n  SelectType,\n  Where,\n} from '../../types/index.js'\nimport type { SanitizedGlobalConfig } from '../config/types.js'\n\nimport { executeAccess } from '../../auth/executeAccess.js'\nimport { NotFound } from '../../errors/NotFound.js'\nimport { afterRead, type AfterReadArgs } from '../../fields/hooks/afterRead/index.js'\nimport { lockedDocumentsCollectionSlug } from '../../locked-documents/config.js'\nimport { getSelectMode } from '../../utilities/getSelectMode.js'\nimport { hasDraftsEnabled } from '../../utilities/getVersionsConfig.js'\nimport { killTransaction } from '../../utilities/killTransaction.js'\nimport { sanitizeSelect } from '../../utilities/sanitizeSelect.js'\nimport { replaceWithDraftIfAvailable } from '../../versions/drafts/replaceWithDraftIfAvailable.js'\n\nexport type GlobalFindOneArgs = {\n  /**\n   * You may pass the document data directly which will skip the `db.findOne` database query.\n   * This is useful if you want to use this endpoint solely for running hooks and populating data.\n   */\n  data?: Record<string, unknown>\n  depth?: number\n  disableErrors?: boolean\n  draft?: boolean\n  globalConfig: SanitizedGlobalConfig\n  includeLockStatus?: boolean\n  overrideAccess?: boolean\n  populate?: PopulateType\n  req: PayloadRequest\n  showHiddenFields?: boolean\n  slug: string\n} & Pick<AfterReadArgs<JsonObject>, 'flattenLocales'> &\n  Pick<FindOptions<string, SelectType>, 'select'>\n\nexport const findOneOperation = async <T extends Record<string, unknown>>(\n  args: GlobalFindOneArgs,\n): Promise<T> => {\n  const {\n    slug,\n    depth,\n    disableErrors,\n    draft: replaceWithVersion = false,\n    flattenLocales,\n    globalConfig,\n    includeLockStatus: includeLockStatusFromArgs,\n    overrideAccess = false,\n    populate,\n    req: { fallbackLocale, locale },\n    req,\n    select: incomingSelect,\n    showHiddenFields,\n  } = args\n\n  const includeLockStatus =\n    includeLockStatusFromArgs && req.payload.collections?.[lockedDocumentsCollectionSlug]\n\n  try {\n    // /////////////////////////////////////\n    // beforeOperation - Global\n    // /////////////////////////////////////\n\n    if (globalConfig.hooks?.beforeOperation?.length) {\n      for (const hook of globalConfig.hooks.beforeOperation) {\n        args =\n          (await hook({\n            args,\n            context: args.req.context,\n            global: globalConfig,\n            operation: 'read',\n            overrideAccess,\n            req: args.req,\n          })) || args\n      }\n    }\n\n    // /////////////////////////////////////\n    // Retrieve and execute access\n    // /////////////////////////////////////\n\n    let accessResult!: AccessResult\n\n    if (!overrideAccess) {\n      accessResult = await executeAccess({ disableErrors, req }, globalConfig.access.read)\n    }\n\n    if (accessResult === false) {\n      if (!disableErrors) {\n        throw new NotFound(req.t)\n      }\n      return null!\n    }\n\n    const select = sanitizeSelect({\n      fields: globalConfig.flattenedFields,\n      forceSelect: globalConfig.forceSelect,\n      select: incomingSelect,\n    })\n\n    // /////////////////////////////////////\n    // Perform database operation\n    // /////////////////////////////////////\n\n    let dbSelect = select\n\n    if (\n      globalConfig.versions?.drafts &&\n      replaceWithVersion &&\n      select &&\n      getSelectMode(select) === 'include'\n    ) {\n      dbSelect = { ...select, createdAt: true, updatedAt: true }\n    }\n    const docFromDB = await req.payload.db.findGlobal({\n      slug,\n      locale: locale!,\n      req,\n      select: dbSelect,\n      where: overrideAccess ? undefined : (accessResult as Where),\n    })\n\n    // Check if no document was returned (Postgres returns {} instead of null)\n    const hasDoc = docFromDB && Object.keys(docFromDB).length > 0\n\n    if (!hasDoc && !args.data && !overrideAccess && accessResult !== true) {\n      if (!disableErrors) {\n        return {} as any\n      }\n      return null!\n    }\n\n    let doc = (args.data as any) ?? (hasDoc ? docFromDB : null) ?? {}\n\n    // /////////////////////////////////////\n    // Include Lock Status if required\n    // /////////////////////////////////////\n    if (includeLockStatus && slug) {\n      let lockStatus: JsonObject | null = null\n\n      try {\n        const lockDocumentsProp = globalConfig?.lockDocuments\n\n        const lockDurationDefault = 300 // Default 5 minutes in seconds\n        const lockDuration =\n          typeof lockDocumentsProp === 'object' ? lockDocumentsProp.duration : lockDurationDefault\n        const lockDurationInMilliseconds = lockDuration * 1000\n\n        const lockedDocument = await req.payload.find({\n          collection: lockedDocumentsCollectionSlug,\n          depth: 1,\n          limit: 1,\n          overrideAccess: false,\n          pagination: false,\n          req,\n          where: {\n            and: [\n              {\n                globalSlug: {\n                  equals: slug,\n                },\n              },\n              {\n                updatedAt: {\n                  greater_than: new Date(new Date().getTime() - lockDurationInMilliseconds),\n                },\n              },\n            ],\n          },\n        })\n\n        if (lockedDocument && lockedDocument.docs.length > 0) {\n          lockStatus = lockedDocument.docs[0]!\n        }\n      } catch {\n        // swallow error\n      }\n\n      doc._isLocked = !!lockStatus\n      doc._userEditing = lockStatus?.user?.value ?? null\n    }\n\n    // /////////////////////////////////////\n    // Replace document with draft if available\n    // /////////////////////////////////////\n\n    if (replaceWithVersion && hasDraftsEnabled(globalConfig)) {\n      doc = await replaceWithDraftIfAvailable({\n        accessResult,\n        doc,\n        entity: globalConfig,\n        entityType: 'global',\n        overrideAccess,\n        req,\n        select,\n      })\n    }\n\n    // /////////////////////////////////////\n    // Execute before global hook\n    // /////////////////////////////////////\n\n    if (globalConfig.hooks?.beforeRead?.length) {\n      for (const hook of globalConfig.hooks.beforeRead) {\n        doc =\n          (await hook({\n            context: req.context,\n            doc,\n            global: globalConfig,\n            overrideAccess,\n            req,\n          })) || doc\n      }\n    }\n\n    // /////////////////////////////////////\n    // Execute globalType field if not selected\n    // /////////////////////////////////////\n    if (select && doc.globalType) {\n      const selectMode = getSelectMode(select)\n      if (\n        (selectMode === 'include' && !select['globalType']) ||\n        (selectMode === 'exclude' && select['globalType'] === false)\n      ) {\n        delete doc['globalType']\n      }\n    }\n\n    // /////////////////////////////////////\n    // Execute field-level hooks and access\n    // /////////////////////////////////////\n\n    doc = await afterRead({\n      collection: null,\n      context: req.context,\n      depth: depth!,\n      doc,\n      draft: replaceWithVersion,\n      fallbackLocale: fallbackLocale!,\n      flattenLocales,\n      global: globalConfig,\n      locale: locale!,\n      overrideAccess,\n      populate,\n      req,\n      select,\n      showHiddenFields: showHiddenFields!,\n    })\n\n    // /////////////////////////////////////\n    // Execute after global hook\n    // /////////////////////////////////////\n\n    if (globalConfig.hooks?.afterRead?.length) {\n      for (const hook of globalConfig.hooks.afterRead) {\n        doc =\n          (await hook({\n            context: req.context,\n            doc,\n            global: globalConfig,\n            overrideAccess,\n            req,\n          })) || doc\n      }\n    }\n\n    // /////////////////////////////////////\n    // Return results\n    // /////////////////////////////////////\n\n    return doc\n  } catch (error: unknown) {\n    await killTransaction(req)\n    throw error\n  }\n}\n"],"names":["executeAccess","NotFound","afterRead","lockedDocumentsCollectionSlug","getSelectMode","hasDraftsEnabled","killTransaction","sanitizeSelect","replaceWithDraftIfAvailable","findOneOperation","args","slug","depth","disableErrors","draft","replaceWithVersion","flattenLocales","globalConfig","includeLockStatus","includeLockStatusFromArgs","overrideAccess","populate","req","fallbackLocale","locale","select","incomingSelect","showHiddenFields","payload","collections","hooks","beforeOperation","length","hook","context","global","operation","accessResult","access","read","t","fields","flattenedFields","forceSelect","dbSelect","versions","drafts","createdAt","updatedAt","docFromDB","db","findGlobal","where","undefined","hasDoc","Object","keys","data","doc","lockStatus","lockDocumentsProp","lockDocuments","lockDurationDefault","lockDuration","duration","lockDurationInMilliseconds","lockedDocument","find","collection","limit","pagination","and","globalSlug","equals","greater_than","Date","getTime","docs","_isLocked","_userEditing","user","value","entity","entityType","beforeRead","globalType","selectMode","error"],"mappings":"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"}