{"version":3,"file":"utils.mjs","sources":["../../../../server/src/services/extensions/utils.ts"],"sourcesContent":["import { async, traverseEntity } from '@strapi/utils';\n\nimport type { Schema, UID } from '@strapi/types';\n\nimport { getService } from '../../utils';\nimport { FILE_MODEL_UID } from '../../constants';\n\nimport type { File } from '../../types';\n\ntype SignEntityMediaVisitor = (\n  args: {\n    key: string;\n    value: unknown;\n    attribute: Schema.Attribute.AnyAttribute;\n  },\n  utils: {\n    set: (key: string, value: unknown) => void;\n  }\n) => Promise<void>;\n\nfunction isFile(value: unknown, attribute: Schema.Attribute.AnyAttribute): value is File {\n  if (!value || attribute.type !== 'media') {\n    return false;\n  }\n\n  return true;\n}\n\n/**\n * Visitor function to sign media URLs\n */\nconst signEntityMediaVisitor: SignEntityMediaVisitor = async (\n  { key, value, attribute },\n  { set }\n) => {\n  const { signFileUrls } = getService('file');\n\n  if (!attribute) {\n    return;\n  }\n\n  if (attribute.type !== 'media') {\n    return;\n  }\n\n  if (isFile(value, attribute)) {\n    // If the attribute is repeatable sign each file\n    if (attribute.multiple) {\n      const signedFiles = await async.map(value, signFileUrls);\n      set(key, signedFiles);\n      return;\n    }\n\n    // If the attribute is not repeatable only sign a single file\n    const signedFile = await signFileUrls(value);\n    set(key, signedFile);\n  }\n};\n\n/**\n *\n * Iterate through an entity manager result\n * Check which modelAttributes are media and pre sign the image URLs\n * if they are from the current upload provider\n *\n * @param {Object} entity\n * @param {Object} modelAttributes\n * @returns\n */\nconst signEntityMedia = async (entity: any, uid: UID.Schema) => {\n  if (!entity) {\n    return entity;\n  }\n\n  // If the entity itself is a file, sign it directly\n  if (uid === FILE_MODEL_UID) {\n    const { signFileUrls } = getService('file');\n    return signFileUrls(entity);\n  }\n\n  // If the entity is a regular content type, look for media attributes\n  const model = strapi.getModel(uid);\n  return traverseEntity(\n    // @ts-expect-error - FIXME: fix traverseEntity using wrong types\n    signEntityMediaVisitor,\n    { schema: model, getModel: strapi.getModel.bind(strapi) },\n    entity\n  );\n};\n\nexport { signEntityMedia };\n"],"names":["isFile","value","attribute","type","signEntityMediaVisitor","key","set","signFileUrls","getService","multiple","signedFiles","async","map","signedFile","signEntityMedia","entity","uid","FILE_MODEL_UID","model","strapi","getModel","traverseEntity","schema","bind"],"mappings":";;;;AAoBA,SAASA,MAAAA,CAAOC,KAAc,EAAEC,SAAwC,EAAA;AACtE,IAAA,IAAI,CAACD,KAAAA,IAASC,SAAAA,CAAUC,IAAI,KAAK,OAAA,EAAS;QACxC,OAAO,KAAA;AACT,IAAA;IAEA,OAAO,IAAA;AACT;AAEA;;AAEC,IACD,MAAMC,sBAAAA,GAAiD,OACrD,EAAEC,GAAG,EAAEJ,KAAK,EAAEC,SAAS,EAAE,EACzB,EAAEI,GAAG,EAAE,GAAA;AAEP,IAAA,MAAM,EAAEC,YAAY,EAAE,GAAGC,UAAAA,CAAW,MAAA,CAAA;AAEpC,IAAA,IAAI,CAACN,SAAAA,EAAW;AACd,QAAA;AACF,IAAA;IAEA,IAAIA,SAAAA,CAAUC,IAAI,KAAK,OAAA,EAAS;AAC9B,QAAA;AACF,IAAA;IAEA,IAAIH,MAAAA,CAAOC,OAAOC,SAAAA,CAAAA,EAAY;;QAE5B,IAAIA,SAAAA,CAAUO,QAAQ,EAAE;AACtB,YAAA,MAAMC,WAAAA,GAAc,MAAMC,KAAAA,CAAMC,GAAG,CAACX,KAAAA,EAAOM,YAAAA,CAAAA;AAC3CD,YAAAA,GAAAA,CAAID,GAAAA,EAAKK,WAAAA,CAAAA;AACT,YAAA;AACF,QAAA;;QAGA,MAAMG,UAAAA,GAAa,MAAMN,YAAAA,CAAaN,KAAAA,CAAAA;AACtCK,QAAAA,GAAAA,CAAID,GAAAA,EAAKQ,UAAAA,CAAAA;AACX,IAAA;AACF,CAAA;AAEA;;;;;;;;;IAUA,MAAMC,eAAAA,GAAkB,OAAOC,MAAAA,EAAaC,GAAAA,GAAAA;AAC1C,IAAA,IAAI,CAACD,MAAAA,EAAQ;QACX,OAAOA,MAAAA;AACT,IAAA;;AAGA,IAAA,IAAIC,QAAQC,cAAAA,EAAgB;AAC1B,QAAA,MAAM,EAAEV,YAAY,EAAE,GAAGC,UAAAA,CAAW,MAAA,CAAA;AACpC,QAAA,OAAOD,YAAAA,CAAaQ,MAAAA,CAAAA;AACtB,IAAA;;IAGA,MAAMG,KAAAA,GAAQC,MAAAA,CAAOC,QAAQ,CAACJ,GAAAA,CAAAA;AAC9B,IAAA,OAAOK;IAELjB,sBAAAA,EACA;QAAEkB,MAAAA,EAAQJ,KAAAA;AAAOE,QAAAA,QAAAA,EAAUD,MAAAA,CAAOC,QAAQ,CAACG,IAAI,CAACJ,MAAAA;KAAQ,EACxDJ,MAAAA,CAAAA;AAEJ;;;;"}