{"version":3,"file":"data-ids.mjs","sources":["../../../../../../src/services/document-service/transform/relations/extract/data-ids.ts"],"sourcesContent":["import { curry } from 'lodash/fp';\n\nimport type { UID } from '@strapi/types';\nimport { relations } from '@strapi/utils';\nimport { IdMap } from '../../id-map';\nimport { getRelationTargetLocale } from '../utils/i18n';\nimport { getRelationTargetStatus } from '../utils/dp';\nimport { mapRelation, traverseEntityRelations } from '../utils/map-relation';\nimport { LongHandDocument } from '../utils/types';\n\nconst { isPolymorphic } = relations;\n\ninterface Options {\n  uid: UID.Schema;\n  locale?: string | null;\n  status?: 'draft' | 'published';\n}\n\n/**\n * Load a relation documentId into the idMap.\n */\nconst addRelationDocId = curry(\n  (idMap: IdMap, source: Options, targetUid: UID.Schema, relation: LongHandDocument) => {\n    const targetLocale = getRelationTargetLocale(relation, {\n      targetUid,\n      sourceUid: source.uid,\n      sourceLocale: source.locale,\n    });\n\n    const targetStatus = getRelationTargetStatus(relation, {\n      targetUid,\n      sourceUid: source.uid,\n      sourceStatus: source.status,\n    });\n\n    targetStatus.forEach((status) => {\n      idMap.add({\n        uid: targetUid,\n        documentId: relation.documentId,\n        locale: targetLocale,\n        status,\n      });\n    });\n  }\n);\n\n/**\n * Iterate over all relations of a data object and extract all relational document ids.\n * Those will later be transformed to entity ids.\n */\nconst extractDataIds = (idMap: IdMap, data: Record<string, any>, source: Options) => {\n  return traverseEntityRelations(\n    async ({ attribute, value }) => {\n      if (!attribute) {\n        return;\n      }\n      const isPolymorphicRelation = isPolymorphic(attribute);\n      const addDocId = addRelationDocId(idMap, source);\n\n      return mapRelation((relation) => {\n        if (!relation || !relation.documentId) {\n          return relation;\n        }\n\n        // Regular relations will always target the same target\n        // if its a polymorphic relation we need to get it from the data itself\n        const targetUid = isPolymorphicRelation ? relation.__type : attribute.target;\n\n        addDocId(targetUid, relation);\n\n        // Handle positional arguments\n        const position = relation.position;\n\n        // The positional relation target uid can be different for polymorphic relations\n        let positionTargetUid = targetUid;\n        if (isPolymorphicRelation && position?.__type) {\n          positionTargetUid = position.__type;\n        }\n\n        if (position?.before) {\n          addDocId(positionTargetUid, { ...relation, ...position, documentId: position.before });\n        }\n\n        if (position?.after) {\n          addDocId(positionTargetUid, { ...relation, ...position, documentId: position.after });\n        }\n\n        return relation;\n      }, value as any);\n    },\n    { schema: strapi.getModel(source.uid), getModel: strapi.getModel.bind(strapi) },\n    data\n  );\n};\n\nexport { extractDataIds };\n"],"names":["isPolymorphic","relations","addRelationDocId","curry","idMap","source","targetUid","relation","targetLocale","getRelationTargetLocale","sourceUid","uid","sourceLocale","locale","targetStatus","getRelationTargetStatus","sourceStatus","status","forEach","add","documentId","extractDataIds","data","traverseEntityRelations","attribute","value","isPolymorphicRelation","addDocId","mapRelation","__type","target","position","positionTargetUid","before","after","schema","strapi","getModel","bind"],"mappings":";;;;;;AAUA,MAAM,EAAEA,aAAa,EAAE,GAAGC,SAAAA;AAQ1B;;AAEC,IACD,MAAMC,gBAAAA,GAAmBC,KAAAA,CACvB,CAACC,KAAAA,EAAcC,QAAiBC,SAAAA,EAAuBC,QAAAA,GAAAA;IACrD,MAAMC,YAAAA,GAAeC,wBAAwBF,QAAAA,EAAU;AACrDD,QAAAA,SAAAA;AACAI,QAAAA,SAAAA,EAAWL,OAAOM,GAAG;AACrBC,QAAAA,YAAAA,EAAcP,OAAOQ;AACvB,KAAA,CAAA;IAEA,MAAMC,YAAAA,GAAeC,wBAAwBR,QAAAA,EAAU;AACrDD,QAAAA,SAAAA;AACAI,QAAAA,SAAAA,EAAWL,OAAOM,GAAG;AACrBK,QAAAA,YAAAA,EAAcX,OAAOY;AACvB,KAAA,CAAA;IAEAH,YAAAA,CAAaI,OAAO,CAAC,CAACD,MAAAA,GAAAA;AACpBb,QAAAA,KAAAA,CAAMe,GAAG,CAAC;YACRR,GAAAA,EAAKL,SAAAA;AACLc,YAAAA,UAAAA,EAAYb,SAASa,UAAU;YAC/BP,MAAAA,EAAQL,YAAAA;AACRS,YAAAA;AACF,SAAA,CAAA;AACF,IAAA,CAAA,CAAA;AACF,CAAA,CAAA;AAGF;;;AAGC,IACD,MAAMI,cAAAA,GAAiB,CAACjB,KAAAA,EAAckB,IAAAA,EAA2BjB,MAAAA,GAAAA;AAC/D,IAAA,OAAOkB,+BACL,OAAO,EAAEC,SAAS,EAAEC,KAAK,EAAE,GAAA;AACzB,QAAA,IAAI,CAACD,SAAAA,EAAW;AACd,YAAA;AACF,QAAA;AACA,QAAA,MAAME,wBAAwB1B,aAAAA,CAAcwB,SAAAA,CAAAA;QAC5C,MAAMG,QAAAA,GAAWzB,iBAAiBE,KAAAA,EAAOC,MAAAA,CAAAA;AAEzC,QAAA,OAAOuB,mBAAY,CAACrB,QAAAA,GAAAA;AAClB,YAAA,IAAI,CAACA,QAAAA,IAAY,CAACA,QAAAA,CAASa,UAAU,EAAE;gBACrC,OAAOb,QAAAA;AACT,YAAA;;;AAIA,YAAA,MAAMD,YAAYoB,qBAAAA,GAAwBnB,QAAAA,CAASsB,MAAM,GAAGL,UAAUM,MAAM;AAE5EH,YAAAA,QAAAA,CAASrB,SAAAA,EAAWC,QAAAA,CAAAA;;YAGpB,MAAMwB,QAAAA,GAAWxB,SAASwB,QAAQ;;AAGlC,YAAA,IAAIC,iBAAAA,GAAoB1B,SAAAA;YACxB,IAAIoB,qBAAAA,IAAyBK,UAAUF,MAAAA,EAAQ;AAC7CG,gBAAAA,iBAAAA,GAAoBD,SAASF,MAAM;AACrC,YAAA;AAEA,YAAA,IAAIE,UAAUE,MAAAA,EAAQ;AACpBN,gBAAAA,QAAAA,CAASK,iBAAAA,EAAmB;AAAE,oBAAA,GAAGzB,QAAQ;AAAE,oBAAA,GAAGwB,QAAQ;AAAEX,oBAAAA,UAAAA,EAAYW,SAASE;AAAO,iBAAA,CAAA;AACtF,YAAA;AAEA,YAAA,IAAIF,UAAUG,KAAAA,EAAO;AACnBP,gBAAAA,QAAAA,CAASK,iBAAAA,EAAmB;AAAE,oBAAA,GAAGzB,QAAQ;AAAE,oBAAA,GAAGwB,QAAQ;AAAEX,oBAAAA,UAAAA,EAAYW,SAASG;AAAM,iBAAA,CAAA;AACrF,YAAA;YAEA,OAAO3B,QAAAA;QACT,CAAA,EAAGkB,KAAAA,CAAAA;IACL,CAAA,EACA;AAAEU,QAAAA,MAAAA,EAAQC,MAAAA,CAAOC,QAAQ,CAAChC,MAAAA,CAAOM,GAAG,CAAA;AAAG0B,QAAAA,QAAAA,EAAUD,MAAAA,CAAOC,QAAQ,CAACC,IAAI,CAACF,MAAAA;KAAQ,EAC9Ed,IAAAA,CAAAA;AAEJ;;;;"}