{"version":3,"file":"id-map.mjs","sources":["../../../../src/services/document-service/transform/id-map.ts"],"sourcesContent":["import type { Core, Data, UID } from '@strapi/types';\nimport { async, contentTypes } from '@strapi/utils';\n\nconst hasDraftAndPublish = (uid: UID.CollectionType) => {\n  const model = strapi.getModel(uid);\n  return contentTypes.hasDraftAndPublish(model);\n};\n\n/**\n * TODO: Find a better way to encode keys than this\n * This converts an object into a string by joining its keys and values,\n * so it can be used as a key in a Map.\n *\n * @example\n * const obj = { a: 1, b: 2 };\n * const key = encodeKey(obj);\n *      ^ \"a:::1&&b:::2\"\n */\nconst encodeKey = (obj: any) => {\n  // Ignore status field for models without draft and publish\n  if (!hasDraftAndPublish(obj.uid)) {\n    delete obj.status;\n  }\n\n  // Sort keys to always keep the same order when encoding\n  const keys = Object.keys(obj).sort();\n  return keys.map((key) => `${key}:::${obj[key]}`).join('&&');\n};\n\ninterface KeyFields {\n  uid: string;\n  documentId: Data.ID;\n  locale?: string | null;\n  status?: 'draft' | 'published';\n}\n\nexport interface IdMap {\n  loadedIds: Map<string, string>;\n  toLoadIds: Map<string, KeyFields>;\n  // Make the Keys type to be the params of add\n  add(keys: KeyFields): void;\n  load(): Promise<void>;\n  get(keys: KeyFields): string | undefined;\n  clear(): void;\n}\n\n/**\n * Holds a registry of document ids and their corresponding entity ids.\n */\nconst createIdMap = ({ strapi }: { strapi: Core.Strapi }): IdMap => {\n  const loadedIds = new Map();\n  const toLoadIds = new Map();\n\n  return {\n    loadedIds,\n    toLoadIds,\n    /**\n     * Register a new document id and its corresponding entity id.\n     */\n    add(keyFields: KeyFields) {\n      const key = encodeKey({ status: 'published', locale: null, ...keyFields });\n\n      // If the id is already loaded, do nothing\n      if (loadedIds.has(key)) return;\n      // If the id is already in the toLoadIds, do nothing\n      if (toLoadIds.has(key)) return;\n\n      // Add the id to the toLoadIds\n      toLoadIds.set(key, keyFields);\n    },\n\n    /**\n     * Load all ids from the registry.\n     */\n    async load() {\n      // Document Id to Entry Id queries are batched by its uid and locale\n      // TODO: Add publication state too\n      const loadIdValues = Array.from(toLoadIds.values());\n\n      // 1. Group ids to query together\n      const idsByUidAndLocale = loadIdValues.reduce((acc, { documentId, ...rest }) => {\n        const key = encodeKey(rest);\n        const ids = acc[key] || { ...rest, documentIds: [] };\n        ids.documentIds.push(documentId);\n        return { ...acc, [key]: ids };\n      }, {});\n\n      // 2. Query ids\n      await async.map(\n        Object.values(idsByUidAndLocale),\n        async ({ uid, locale, documentIds, status }: any) => {\n          const findParams = {\n            select: ['id', 'documentId', 'locale', 'publishedAt'],\n            where: {\n              documentId: { $in: documentIds },\n              locale: locale || null,\n            },\n          } as any;\n\n          if (hasDraftAndPublish(uid)) {\n            findParams.where.publishedAt = status === 'draft' ? null : { $ne: null };\n          }\n\n          const result = await strapi?.db?.query(uid).findMany(findParams);\n\n          // 3. Store result in loadedIds\n          result?.forEach(({ documentId, id, locale, publishedAt }: any) => {\n            const key = encodeKey({\n              documentId,\n              uid,\n              locale,\n              status: publishedAt ? 'published' : 'draft',\n            });\n            loadedIds.set(key, id);\n          });\n        }\n      );\n\n      // 4. Clear toLoadIds\n      toLoadIds.clear();\n    },\n\n    /**\n     * Get the entity id for a given document id.\n     */\n    get(keys: KeyFields) {\n      const key = encodeKey({ status: 'published', locale: null, ...keys });\n      return loadedIds.get(key);\n    },\n\n    /**\n     * Clear the registry.\n     */\n    clear() {\n      loadedIds.clear();\n      toLoadIds.clear();\n    },\n  };\n};\n\nexport { createIdMap };\n"],"names":["hasDraftAndPublish","uid","model","strapi","getModel","contentTypes","encodeKey","obj","status","keys","Object","sort","map","key","join","createIdMap","loadedIds","Map","toLoadIds","add","keyFields","locale","has","set","load","loadIdValues","Array","from","values","idsByUidAndLocale","reduce","acc","documentId","rest","ids","documentIds","push","async","findParams","select","where","$in","publishedAt","$ne","result","db","query","findMany","forEach","id","clear","get"],"mappings":"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"}