@strapi/upload 5.56.0 → 5.58.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (230) hide show
  1. package/dist/admin/hooks/useTracking.js +2 -8
  2. package/dist/admin/hooks/useTracking.js.map +1 -1
  3. package/dist/admin/hooks/useTracking.mjs +3 -8
  4. package/dist/admin/hooks/useTracking.mjs.map +1 -1
  5. package/dist/admin/legacy/components/AssetCard/UploadingAssetCard.js +9 -1
  6. package/dist/admin/legacy/components/AssetCard/UploadingAssetCard.js.map +1 -1
  7. package/dist/admin/legacy/components/AssetCard/UploadingAssetCard.mjs +9 -1
  8. package/dist/admin/legacy/components/AssetCard/UploadingAssetCard.mjs.map +1 -1
  9. package/dist/admin/legacy/components/EditAssetDialog/PreviewBox/PreviewBox.js +20 -6
  10. package/dist/admin/legacy/components/EditAssetDialog/PreviewBox/PreviewBox.js.map +1 -1
  11. package/dist/admin/legacy/components/EditAssetDialog/PreviewBox/PreviewBox.mjs +20 -6
  12. package/dist/admin/legacy/components/EditAssetDialog/PreviewBox/PreviewBox.mjs.map +1 -1
  13. package/dist/admin/legacy/hooks/useEditAsset.js +11 -6
  14. package/dist/admin/legacy/hooks/useEditAsset.js.map +1 -1
  15. package/dist/admin/legacy/hooks/useEditAsset.mjs +12 -7
  16. package/dist/admin/legacy/hooks/useEditAsset.mjs.map +1 -1
  17. package/dist/admin/legacy/hooks/useTracking.js +3 -1
  18. package/dist/admin/legacy/hooks/useTracking.js.map +1 -1
  19. package/dist/admin/legacy/hooks/useTracking.mjs +3 -1
  20. package/dist/admin/legacy/hooks/useTracking.mjs.map +1 -1
  21. package/dist/admin/legacy/hooks/useUpload.js +6 -4
  22. package/dist/admin/legacy/hooks/useUpload.js.map +1 -1
  23. package/dist/admin/legacy/hooks/useUpload.mjs +6 -4
  24. package/dist/admin/legacy/hooks/useUpload.mjs.map +1 -1
  25. package/dist/admin/legacy/pages/App/ConfigureTheView/ConfigureTheView.js +2 -1
  26. package/dist/admin/legacy/pages/App/ConfigureTheView/ConfigureTheView.js.map +1 -1
  27. package/dist/admin/legacy/pages/App/ConfigureTheView/ConfigureTheView.mjs +2 -1
  28. package/dist/admin/legacy/pages/App/ConfigureTheView/ConfigureTheView.mjs.map +1 -1
  29. package/dist/admin/legacy/pages/App/MediaLibrary.js +2 -1
  30. package/dist/admin/legacy/pages/App/MediaLibrary.js.map +1 -1
  31. package/dist/admin/legacy/pages/App/MediaLibrary.mjs +2 -1
  32. package/dist/admin/legacy/pages/App/MediaLibrary.mjs.map +1 -1
  33. package/dist/admin/pages/Assets/AssetsPage.js +24 -12
  34. package/dist/admin/pages/Assets/AssetsPage.js.map +1 -1
  35. package/dist/admin/pages/Assets/AssetsPage.mjs +25 -13
  36. package/dist/admin/pages/Assets/AssetsPage.mjs.map +1 -1
  37. package/dist/admin/pages/Assets/components/AssetActions.js +326 -0
  38. package/dist/admin/pages/Assets/components/AssetActions.js.map +1 -0
  39. package/dist/admin/pages/Assets/components/AssetActions.mjs +324 -0
  40. package/dist/admin/pages/Assets/components/AssetActions.mjs.map +1 -0
  41. package/dist/admin/pages/Assets/components/AssetActionsMenu.js +28 -309
  42. package/dist/admin/pages/Assets/components/AssetActionsMenu.js.map +1 -1
  43. package/dist/admin/pages/Assets/components/AssetActionsMenu.mjs +31 -312
  44. package/dist/admin/pages/Assets/components/AssetActionsMenu.mjs.map +1 -1
  45. package/dist/admin/pages/Assets/components/AssetContextMenu.js +79 -0
  46. package/dist/admin/pages/Assets/components/AssetContextMenu.js.map +1 -0
  47. package/dist/admin/pages/Assets/components/AssetContextMenu.mjs +77 -0
  48. package/dist/admin/pages/Assets/components/AssetContextMenu.mjs.map +1 -0
  49. package/dist/admin/pages/Assets/components/AssetDetails/AssetCropEditor.js +87 -5
  50. package/dist/admin/pages/Assets/components/AssetDetails/AssetCropEditor.js.map +1 -1
  51. package/dist/admin/pages/Assets/components/AssetDetails/AssetCropEditor.mjs +89 -7
  52. package/dist/admin/pages/Assets/components/AssetDetails/AssetCropEditor.mjs.map +1 -1
  53. package/dist/admin/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js +3 -3
  54. package/dist/admin/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js.map +1 -1
  55. package/dist/admin/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs +3 -3
  56. package/dist/admin/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs.map +1 -1
  57. package/dist/admin/pages/Assets/components/AssetDetails/useCropImg.js +62 -5
  58. package/dist/admin/pages/Assets/components/AssetDetails/useCropImg.js.map +1 -1
  59. package/dist/admin/pages/Assets/components/AssetDetails/useCropImg.mjs +60 -6
  60. package/dist/admin/pages/Assets/components/AssetDetails/useCropImg.mjs.map +1 -1
  61. package/dist/admin/pages/Assets/components/AssetsGrid.js +27 -4
  62. package/dist/admin/pages/Assets/components/AssetsGrid.js.map +1 -1
  63. package/dist/admin/pages/Assets/components/AssetsGrid.mjs +27 -4
  64. package/dist/admin/pages/Assets/components/AssetsGrid.mjs.map +1 -1
  65. package/dist/admin/pages/Assets/components/AssetsTable.js +27 -4
  66. package/dist/admin/pages/Assets/components/AssetsTable.js.map +1 -1
  67. package/dist/admin/pages/Assets/components/AssetsTable.mjs +27 -4
  68. package/dist/admin/pages/Assets/components/AssetsTable.mjs.map +1 -1
  69. package/dist/admin/pages/Assets/components/CursorAnchoredMenu.js +77 -0
  70. package/dist/admin/pages/Assets/components/CursorAnchoredMenu.js.map +1 -0
  71. package/dist/admin/pages/Assets/components/CursorAnchoredMenu.mjs +75 -0
  72. package/dist/admin/pages/Assets/components/CursorAnchoredMenu.mjs.map +1 -0
  73. package/dist/admin/pages/Assets/components/FolderActions.js +139 -0
  74. package/dist/admin/pages/Assets/components/FolderActions.js.map +1 -0
  75. package/dist/admin/pages/Assets/components/FolderActions.mjs +137 -0
  76. package/dist/admin/pages/Assets/components/FolderActions.mjs.map +1 -0
  77. package/dist/admin/pages/Assets/components/FolderActionsMenu.js +25 -119
  78. package/dist/admin/pages/Assets/components/FolderActionsMenu.js.map +1 -1
  79. package/dist/admin/pages/Assets/components/FolderActionsMenu.mjs +27 -121
  80. package/dist/admin/pages/Assets/components/FolderActionsMenu.mjs.map +1 -1
  81. package/dist/admin/pages/Assets/components/FolderContextMenu.js +67 -0
  82. package/dist/admin/pages/Assets/components/FolderContextMenu.js.map +1 -0
  83. package/dist/admin/pages/Assets/components/FolderContextMenu.mjs +65 -0
  84. package/dist/admin/pages/Assets/components/FolderContextMenu.mjs.map +1 -0
  85. package/dist/admin/pages/Assets/components/FolderTree/FolderTree.js +139 -45
  86. package/dist/admin/pages/Assets/components/FolderTree/FolderTree.js.map +1 -1
  87. package/dist/admin/pages/Assets/components/FolderTree/FolderTree.mjs +140 -47
  88. package/dist/admin/pages/Assets/components/FolderTree/FolderTree.mjs.map +1 -1
  89. package/dist/admin/pages/Assets/components/FolderTree/FolderTreeRowMenu.js +115 -0
  90. package/dist/admin/pages/Assets/components/FolderTree/FolderTreeRowMenu.js.map +1 -0
  91. package/dist/admin/pages/Assets/components/FolderTree/FolderTreeRowMenu.mjs +113 -0
  92. package/dist/admin/pages/Assets/components/FolderTree/FolderTreeRowMenu.mjs.map +1 -0
  93. package/dist/admin/pages/Assets/components/ItemContextMenu.js +125 -0
  94. package/dist/admin/pages/Assets/components/ItemContextMenu.js.map +1 -0
  95. package/dist/admin/pages/Assets/components/ItemContextMenu.mjs +122 -0
  96. package/dist/admin/pages/Assets/components/ItemContextMenu.mjs.map +1 -0
  97. package/dist/admin/pages/Assets/components/MainAreaContextMenu.js +88 -63
  98. package/dist/admin/pages/Assets/components/MainAreaContextMenu.js.map +1 -1
  99. package/dist/admin/pages/Assets/components/MainAreaContextMenu.mjs +88 -63
  100. package/dist/admin/pages/Assets/components/MainAreaContextMenu.mjs.map +1 -1
  101. package/dist/admin/pages/Assets/components/SelectionActions.js +111 -0
  102. package/dist/admin/pages/Assets/components/SelectionActions.js.map +1 -0
  103. package/dist/admin/pages/Assets/components/SelectionActions.mjs +109 -0
  104. package/dist/admin/pages/Assets/components/SelectionActions.mjs.map +1 -0
  105. package/dist/admin/pages/Assets/components/SelectionContextMenu.js +82 -0
  106. package/dist/admin/pages/Assets/components/SelectionContextMenu.js.map +1 -0
  107. package/dist/admin/pages/Assets/components/SelectionContextMenu.mjs +80 -0
  108. package/dist/admin/pages/Assets/components/SelectionContextMenu.mjs.map +1 -0
  109. package/dist/admin/pages/Assets/hooks/useAssetSelection.js +10 -0
  110. package/dist/admin/pages/Assets/hooks/useAssetSelection.js.map +1 -1
  111. package/dist/admin/pages/Assets/hooks/useAssetSelection.mjs +10 -0
  112. package/dist/admin/pages/Assets/hooks/useAssetSelection.mjs.map +1 -1
  113. package/dist/admin/pages/SettingsPage/SettingsPage.js +8 -1
  114. package/dist/admin/pages/SettingsPage/SettingsPage.js.map +1 -1
  115. package/dist/admin/pages/SettingsPage/SettingsPage.mjs +8 -1
  116. package/dist/admin/pages/SettingsPage/SettingsPage.mjs.map +1 -1
  117. package/dist/admin/src/hooks/useTracking.d.ts +0 -7
  118. package/dist/admin/src/legacy/hooks/useEditAsset.d.ts +13 -22
  119. package/dist/admin/src/legacy/hooks/useUpload.d.ts +1 -1
  120. package/dist/admin/src/pages/Assets/components/AssetActions.d.ts +70 -0
  121. package/dist/admin/src/pages/Assets/components/AssetActionsMenu.d.ts +5 -14
  122. package/dist/admin/src/pages/Assets/components/AssetContextMenu.d.ts +27 -0
  123. package/dist/admin/src/pages/Assets/components/AssetDetails/useCropImg.d.ts +16 -0
  124. package/dist/admin/src/pages/Assets/components/CursorAnchoredMenu.d.ts +32 -0
  125. package/dist/admin/src/pages/Assets/components/FolderActions.d.ts +48 -0
  126. package/dist/admin/src/pages/Assets/components/FolderActionsMenu.d.ts +4 -8
  127. package/dist/admin/src/pages/Assets/components/FolderContextMenu.d.ts +21 -0
  128. package/dist/admin/src/pages/Assets/components/FolderTree/FolderTree.d.ts +5 -1
  129. package/dist/admin/src/pages/Assets/components/FolderTree/FolderTreeRowMenu.d.ts +25 -0
  130. package/dist/admin/src/pages/Assets/components/ItemContextMenu.d.ts +53 -0
  131. package/dist/admin/src/pages/Assets/components/MainAreaContextMenu.d.ts +15 -1
  132. package/dist/admin/src/pages/Assets/components/SelectionActions.d.ts +40 -0
  133. package/dist/admin/src/pages/Assets/components/SelectionContextMenu.d.ts +25 -0
  134. package/dist/admin/src/pages/Assets/hooks/useAssetSelection.d.ts +5 -0
  135. package/dist/admin/src/utils/mediaLibraryVersion.d.ts +18 -0
  136. package/dist/admin/translations/en.json.js +8 -3
  137. package/dist/admin/translations/en.json.js.map +1 -1
  138. package/dist/admin/translations/en.json.mjs +8 -3
  139. package/dist/admin/translations/en.json.mjs.map +1 -1
  140. package/dist/admin/utils/mediaLibraryVersion.js +24 -0
  141. package/dist/admin/utils/mediaLibraryVersion.js.map +1 -0
  142. package/dist/admin/utils/mediaLibraryVersion.mjs +20 -0
  143. package/dist/admin/utils/mediaLibraryVersion.mjs.map +1 -0
  144. package/dist/server/controllers/admin-file.js +2 -2
  145. package/dist/server/controllers/admin-file.js.map +1 -1
  146. package/dist/server/controllers/admin-file.mjs +2 -2
  147. package/dist/server/controllers/admin-file.mjs.map +1 -1
  148. package/dist/server/controllers/admin-folder.js +5 -5
  149. package/dist/server/controllers/admin-folder.js.map +1 -1
  150. package/dist/server/controllers/admin-folder.mjs +5 -5
  151. package/dist/server/controllers/admin-folder.mjs.map +1 -1
  152. package/dist/server/controllers/content-api.js +30 -7
  153. package/dist/server/controllers/content-api.js.map +1 -1
  154. package/dist/server/controllers/content-api.mjs +30 -7
  155. package/dist/server/controllers/content-api.mjs.map +1 -1
  156. package/dist/server/controllers/validation/admin/folder-file.js +4 -4
  157. package/dist/server/controllers/validation/admin/folder-file.js.map +1 -1
  158. package/dist/server/controllers/validation/admin/folder-file.mjs +2 -2
  159. package/dist/server/controllers/validation/admin/folder-file.mjs.map +1 -1
  160. package/dist/server/controllers/validation/admin/folder.js +3 -4
  161. package/dist/server/controllers/validation/admin/folder.js.map +1 -1
  162. package/dist/server/controllers/validation/admin/folder.mjs +3 -4
  163. package/dist/server/controllers/validation/admin/folder.mjs.map +1 -1
  164. package/dist/server/controllers/validation/admin/upload.js +1 -2
  165. package/dist/server/controllers/validation/admin/upload.js.map +1 -1
  166. package/dist/server/controllers/validation/admin/upload.mjs +1 -2
  167. package/dist/server/controllers/validation/admin/upload.mjs.map +1 -1
  168. package/dist/server/controllers/validation/admin/utils.js +1 -2
  169. package/dist/server/controllers/validation/admin/utils.js.map +1 -1
  170. package/dist/server/controllers/validation/admin/utils.mjs +1 -2
  171. package/dist/server/controllers/validation/admin/utils.mjs.map +1 -1
  172. package/dist/server/migrations/unsign-richtext-and-blocks-urls.js +2 -2
  173. package/dist/server/migrations/unsign-richtext-and-blocks-urls.js.map +1 -1
  174. package/dist/server/migrations/unsign-richtext-and-blocks-urls.mjs +1 -1
  175. package/dist/server/migrations/unsign-richtext-and-blocks-urls.mjs.map +1 -1
  176. package/dist/server/routes/content-api.js +3 -3
  177. package/dist/server/routes/content-api.js.map +1 -1
  178. package/dist/server/routes/content-api.mjs +3 -3
  179. package/dist/server/routes/content-api.mjs.map +1 -1
  180. package/dist/server/routes/validation/upload.js +8 -0
  181. package/dist/server/routes/validation/upload.js.map +1 -1
  182. package/dist/server/routes/validation/upload.mjs +8 -0
  183. package/dist/server/routes/validation/upload.mjs.map +1 -1
  184. package/dist/server/services/api-upload-folder.js +3 -3
  185. package/dist/server/services/api-upload-folder.js.map +1 -1
  186. package/dist/server/services/api-upload-folder.mjs +3 -3
  187. package/dist/server/services/api-upload-folder.mjs.map +1 -1
  188. package/dist/server/services/extensions/utils.js +20 -16
  189. package/dist/server/services/extensions/utils.js.map +1 -1
  190. package/dist/server/services/extensions/utils.mjs +20 -16
  191. package/dist/server/services/extensions/utils.mjs.map +1 -1
  192. package/dist/server/services/file.js +2 -2
  193. package/dist/server/services/file.js.map +1 -1
  194. package/dist/server/services/file.mjs +1 -1
  195. package/dist/server/services/file.mjs.map +1 -1
  196. package/dist/server/services/folder.js +5 -5
  197. package/dist/server/services/folder.js.map +1 -1
  198. package/dist/server/services/folder.mjs +5 -5
  199. package/dist/server/services/folder.mjs.map +1 -1
  200. package/dist/server/services/provider.js +3 -4
  201. package/dist/server/services/provider.js.map +1 -1
  202. package/dist/server/services/provider.mjs +3 -4
  203. package/dist/server/services/provider.mjs.map +1 -1
  204. package/dist/server/services/upload.js +5 -6
  205. package/dist/server/services/upload.js.map +1 -1
  206. package/dist/server/services/upload.mjs +4 -5
  207. package/dist/server/services/upload.mjs.map +1 -1
  208. package/dist/server/services/weekly-metrics.js +2 -2
  209. package/dist/server/services/weekly-metrics.js.map +1 -1
  210. package/dist/server/services/weekly-metrics.mjs +2 -2
  211. package/dist/server/services/weekly-metrics.mjs.map +1 -1
  212. package/dist/server/src/controllers/admin-folder.d.ts.map +1 -1
  213. package/dist/server/src/controllers/content-api.d.ts.map +1 -1
  214. package/dist/server/src/controllers/validation/admin/folder.d.ts.map +1 -1
  215. package/dist/server/src/controllers/validation/admin/upload.d.ts.map +1 -1
  216. package/dist/server/src/controllers/validation/admin/utils.d.ts.map +1 -1
  217. package/dist/server/src/index.d.ts.map +1 -1
  218. package/dist/server/src/mcp/ambient-instance.d.ts.map +1 -1
  219. package/dist/server/src/routes/validation/upload.d.ts +4 -0
  220. package/dist/server/src/routes/validation/upload.d.ts.map +1 -1
  221. package/dist/server/src/services/extensions/utils.d.ts +34 -2
  222. package/dist/server/src/services/extensions/utils.d.ts.map +1 -1
  223. package/dist/server/src/services/index.d.ts.map +1 -1
  224. package/dist/server/src/services/provider.d.ts.map +1 -1
  225. package/dist/server/src/services/upload.d.ts.map +1 -1
  226. package/dist/server/utils/mime-validation.js +1 -1
  227. package/dist/server/utils/mime-validation.js.map +1 -1
  228. package/dist/server/utils/mime-validation.mjs +1 -1
  229. package/dist/server/utils/mime-validation.mjs.map +1 -1
  230. package/package.json +7 -7
@@ -1 +1 @@
1
- {"version":3,"file":"upload.js","sources":["../../../../../server/src/controllers/validation/admin/upload.ts"],"sourcesContent":["import { yup, validateYupSchema } from '@strapi/utils';\nimport { isNil } from 'lodash/fp';\nimport { getService } from '../../../utils';\n\nconst focalPointSchema = yup\n .object({\n x: yup.number().min(0).max(100).required(),\n y: yup.number().min(0).max(100).required(),\n })\n .nullable()\n .default(null);\n\nconst fileInfoSchema = yup.object({\n name: yup.string().nullable(),\n alternativeText: yup.string().nullable(),\n caption: yup.string().nullable(),\n focalPoint: focalPointSchema,\n folder: yup\n .strapiID()\n .nullable()\n .test('folder-exists', 'the folder does not exist', async (folderId) => {\n if (isNil(folderId)) {\n return true;\n }\n\n const exists = await getService('folder').exists({ id: folderId });\n\n return exists;\n }),\n});\n\nconst uploadSchema = yup.object({\n fileInfo: fileInfoSchema,\n});\n\nconst multiUploadSchema = yup.object({\n fileInfo: yup.array().of(fileInfoSchema),\n});\n\nconst validateUploadBody = (data = {}, isMulti = false) => {\n const schema = isMulti ? multiUploadSchema : uploadSchema;\n\n return validateYupSchema(schema, { strict: false })(data);\n};\n\nexport { validateUploadBody };\n\nexport type UploadBody =\n | yup.InferType<typeof uploadSchema>\n | yup.InferType<typeof multiUploadSchema>;\n\nconst bulkUpdatesSchema = yup.object({\n updates: yup\n .array()\n .of(\n yup.object({\n id: yup.number().required(),\n fileInfo: fileInfoSchema.required(),\n })\n )\n .min(1)\n .required(),\n});\n\nexport const validateBulkUpdateBody = validateYupSchema(bulkUpdatesSchema);\n"],"names":["focalPointSchema","yup","object","x","number","min","max","required","y","nullable","default","fileInfoSchema","name","string","alternativeText","caption","focalPoint","folder","strapiID","test","folderId","isNil","exists","getService","id","uploadSchema","fileInfo","multiUploadSchema","array","of","validateUploadBody","data","isMulti","schema","validateYupSchema","strict","bulkUpdatesSchema","updates","validateBulkUpdateBody"],"mappings":";;;;;;AAIA,MAAMA,gBAAAA,GAAmBC,SAAAA,CACtBC,MAAM,CAAC;IACNC,CAAAA,EAAGF,SAAAA,CAAIG,MAAM,EAAA,CAAGC,GAAG,CAAC,CAAA,CAAA,CAAGC,GAAG,CAAC,GAAA,CAAA,CAAKC,QAAQ,EAAA;IACxCC,CAAAA,EAAGP,SAAAA,CAAIG,MAAM,EAAA,CAAGC,GAAG,CAAC,CAAA,CAAA,CAAGC,GAAG,CAAC,GAAA,CAAA,CAAKC,QAAQ;AAC1C,CAAA,CAAA,CACCE,QAAQ,EAAA,CACRC,OAAO,CAAC,IAAA,CAAA;AAEX,MAAMC,cAAAA,GAAiBV,SAAAA,CAAIC,MAAM,CAAC;IAChCU,IAAAA,EAAMX,SAAAA,CAAIY,MAAM,EAAA,CAAGJ,QAAQ,EAAA;IAC3BK,eAAAA,EAAiBb,SAAAA,CAAIY,MAAM,EAAA,CAAGJ,QAAQ,EAAA;IACtCM,OAAAA,EAASd,SAAAA,CAAIY,MAAM,EAAA,CAAGJ,QAAQ,EAAA;IAC9BO,UAAAA,EAAYhB,gBAAAA;IACZiB,MAAAA,EAAQhB,SAAAA,CACLiB,QAAQ,EAAA,CACRT,QAAQ,GACRU,IAAI,CAAC,eAAA,EAAiB,2BAAA,EAA6B,OAAOC,QAAAA,GAAAA;AACzD,QAAA,IAAIC,SAAMD,QAAAA,CAAAA,EAAW;YACnB,OAAO,IAAA;AACT,QAAA;AAEA,QAAA,MAAME,MAAAA,GAAS,MAAMC,gBAAAA,CAAW,QAAA,CAAA,CAAUD,MAAM,CAAC;YAAEE,EAAAA,EAAIJ;AAAS,SAAA,CAAA;QAEhE,OAAOE,MAAAA;AACT,IAAA,CAAA;AACJ,CAAA,CAAA;AAEA,MAAMG,YAAAA,GAAexB,SAAAA,CAAIC,MAAM,CAAC;IAC9BwB,QAAAA,EAAUf;AACZ,CAAA,CAAA;AAEA,MAAMgB,iBAAAA,GAAoB1B,SAAAA,CAAIC,MAAM,CAAC;AACnCwB,IAAAA,QAAAA,EAAUzB,SAAAA,CAAI2B,KAAK,EAAA,CAAGC,EAAE,CAAClB,cAAAA;AAC3B,CAAA,CAAA;AAEA,MAAMmB,qBAAqB,CAACC,IAAAA,GAAO,EAAE,EAAEC,UAAU,KAAK,GAAA;IACpD,MAAMC,MAAAA,GAASD,UAAUL,iBAAAA,GAAoBF,YAAAA;AAE7C,IAAA,OAAOS,wBAAkBD,MAAAA,EAAQ;QAAEE,MAAAA,EAAQ;KAAM,CAAA,CAAGJ,IAAAA,CAAAA;AACtD;AAQA,MAAMK,iBAAAA,GAAoBnC,SAAAA,CAAIC,MAAM,CAAC;AACnCmC,IAAAA,OAAAA,EAASpC,UACN2B,KAAK,EAAA,CACLC,EAAE,CACD5B,SAAAA,CAAIC,MAAM,CAAC;QACTsB,EAAAA,EAAIvB,SAAAA,CAAIG,MAAM,EAAA,CAAGG,QAAQ,EAAA;AACzBmB,QAAAA,QAAAA,EAAUf,eAAeJ,QAAQ;KACnC,CAAA,CAAA,CAEDF,GAAG,CAAC,CAAA,CAAA,CACJE,QAAQ;AACb,CAAA,CAAA;AAEO,MAAM+B,sBAAAA,GAAyBJ,uBAAAA,CAAkBE,iBAAAA;;;;;"}
1
+ {"version":3,"file":"upload.js","sources":["../../../../../server/src/controllers/validation/admin/upload.ts"],"sourcesContent":["import { yup, validateYupSchema } from '@strapi/utils';\nimport { getService } from '../../../utils';\n\nconst focalPointSchema = yup\n .object({\n x: yup.number().min(0).max(100).required(),\n y: yup.number().min(0).max(100).required(),\n })\n .nullable()\n .default(null);\n\nconst fileInfoSchema = yup.object({\n name: yup.string().nullable(),\n alternativeText: yup.string().nullable(),\n caption: yup.string().nullable(),\n focalPoint: focalPointSchema,\n folder: yup\n .strapiID()\n .nullable()\n .test('folder-exists', 'the folder does not exist', async (folderId) => {\n if (folderId == null) {\n return true;\n }\n\n const exists = await getService('folder').exists({ id: folderId });\n\n return exists;\n }),\n});\n\nconst uploadSchema = yup.object({\n fileInfo: fileInfoSchema,\n});\n\nconst multiUploadSchema = yup.object({\n fileInfo: yup.array().of(fileInfoSchema),\n});\n\nconst validateUploadBody = (data = {}, isMulti = false) => {\n const schema = isMulti ? multiUploadSchema : uploadSchema;\n\n return validateYupSchema(schema, { strict: false })(data);\n};\n\nexport { validateUploadBody };\n\nexport type UploadBody =\n | yup.InferType<typeof uploadSchema>\n | yup.InferType<typeof multiUploadSchema>;\n\nconst bulkUpdatesSchema = yup.object({\n updates: yup\n .array()\n .of(\n yup.object({\n id: yup.number().required(),\n fileInfo: fileInfoSchema.required(),\n })\n )\n .min(1)\n .required(),\n});\n\nexport const validateBulkUpdateBody = validateYupSchema(bulkUpdatesSchema);\n"],"names":["focalPointSchema","yup","object","x","number","min","max","required","y","nullable","default","fileInfoSchema","name","string","alternativeText","caption","focalPoint","folder","strapiID","test","folderId","exists","getService","id","uploadSchema","fileInfo","multiUploadSchema","array","of","validateUploadBody","data","isMulti","schema","validateYupSchema","strict","bulkUpdatesSchema","updates","validateBulkUpdateBody"],"mappings":";;;;;AAGA,MAAMA,gBAAAA,GAAmBC,SAAAA,CACtBC,MAAM,CAAC;IACNC,CAAAA,EAAGF,SAAAA,CAAIG,MAAM,EAAA,CAAGC,GAAG,CAAC,CAAA,CAAA,CAAGC,GAAG,CAAC,GAAA,CAAA,CAAKC,QAAQ,EAAA;IACxCC,CAAAA,EAAGP,SAAAA,CAAIG,MAAM,EAAA,CAAGC,GAAG,CAAC,CAAA,CAAA,CAAGC,GAAG,CAAC,GAAA,CAAA,CAAKC,QAAQ;AAC1C,CAAA,CAAA,CACCE,QAAQ,EAAA,CACRC,OAAO,CAAC,IAAA,CAAA;AAEX,MAAMC,cAAAA,GAAiBV,SAAAA,CAAIC,MAAM,CAAC;IAChCU,IAAAA,EAAMX,SAAAA,CAAIY,MAAM,EAAA,CAAGJ,QAAQ,EAAA;IAC3BK,eAAAA,EAAiBb,SAAAA,CAAIY,MAAM,EAAA,CAAGJ,QAAQ,EAAA;IACtCM,OAAAA,EAASd,SAAAA,CAAIY,MAAM,EAAA,CAAGJ,QAAQ,EAAA;IAC9BO,UAAAA,EAAYhB,gBAAAA;IACZiB,MAAAA,EAAQhB,SAAAA,CACLiB,QAAQ,EAAA,CACRT,QAAQ,GACRU,IAAI,CAAC,eAAA,EAAiB,2BAAA,EAA6B,OAAOC,QAAAA,GAAAA;AACzD,QAAA,IAAIA,YAAY,IAAA,EAAM;YACpB,OAAO,IAAA;AACT,QAAA;AAEA,QAAA,MAAMC,MAAAA,GAAS,MAAMC,gBAAAA,CAAW,QAAA,CAAA,CAAUD,MAAM,CAAC;YAAEE,EAAAA,EAAIH;AAAS,SAAA,CAAA;QAEhE,OAAOC,MAAAA;AACT,IAAA,CAAA;AACJ,CAAA,CAAA;AAEA,MAAMG,YAAAA,GAAevB,SAAAA,CAAIC,MAAM,CAAC;IAC9BuB,QAAAA,EAAUd;AACZ,CAAA,CAAA;AAEA,MAAMe,iBAAAA,GAAoBzB,SAAAA,CAAIC,MAAM,CAAC;AACnCuB,IAAAA,QAAAA,EAAUxB,SAAAA,CAAI0B,KAAK,EAAA,CAAGC,EAAE,CAACjB,cAAAA;AAC3B,CAAA,CAAA;AAEA,MAAMkB,qBAAqB,CAACC,IAAAA,GAAO,EAAE,EAAEC,UAAU,KAAK,GAAA;IACpD,MAAMC,MAAAA,GAASD,UAAUL,iBAAAA,GAAoBF,YAAAA;AAE7C,IAAA,OAAOS,wBAAkBD,MAAAA,EAAQ;QAAEE,MAAAA,EAAQ;KAAM,CAAA,CAAGJ,IAAAA,CAAAA;AACtD;AAQA,MAAMK,iBAAAA,GAAoBlC,SAAAA,CAAIC,MAAM,CAAC;AACnCkC,IAAAA,OAAAA,EAASnC,UACN0B,KAAK,EAAA,CACLC,EAAE,CACD3B,SAAAA,CAAIC,MAAM,CAAC;QACTqB,EAAAA,EAAItB,SAAAA,CAAIG,MAAM,EAAA,CAAGG,QAAQ,EAAA;AACzBkB,QAAAA,QAAAA,EAAUd,eAAeJ,QAAQ;KACnC,CAAA,CAAA,CAEDF,GAAG,CAAC,CAAA,CAAA,CACJE,QAAQ;AACb,CAAA,CAAA;AAEO,MAAM8B,sBAAAA,GAAyBJ,uBAAAA,CAAkBE,iBAAAA;;;;;"}
@@ -1,5 +1,4 @@
1
1
  import { yup, validateYupSchema } from '@strapi/utils';
2
- import { isNil } from 'lodash/fp';
3
2
  import { getService } from '../../../utils/index.mjs';
4
3
 
5
4
  const focalPointSchema = yup.object({
@@ -12,7 +11,7 @@ const fileInfoSchema = yup.object({
12
11
  caption: yup.string().nullable(),
13
12
  focalPoint: focalPointSchema,
14
13
  folder: yup.strapiID().nullable().test('folder-exists', 'the folder does not exist', async (folderId)=>{
15
- if (isNil(folderId)) {
14
+ if (folderId == null) {
16
15
  return true;
17
16
  }
18
17
  const exists = await getService('folder').exists({
@@ -1 +1 @@
1
- {"version":3,"file":"upload.mjs","sources":["../../../../../server/src/controllers/validation/admin/upload.ts"],"sourcesContent":["import { yup, validateYupSchema } from '@strapi/utils';\nimport { isNil } from 'lodash/fp';\nimport { getService } from '../../../utils';\n\nconst focalPointSchema = yup\n .object({\n x: yup.number().min(0).max(100).required(),\n y: yup.number().min(0).max(100).required(),\n })\n .nullable()\n .default(null);\n\nconst fileInfoSchema = yup.object({\n name: yup.string().nullable(),\n alternativeText: yup.string().nullable(),\n caption: yup.string().nullable(),\n focalPoint: focalPointSchema,\n folder: yup\n .strapiID()\n .nullable()\n .test('folder-exists', 'the folder does not exist', async (folderId) => {\n if (isNil(folderId)) {\n return true;\n }\n\n const exists = await getService('folder').exists({ id: folderId });\n\n return exists;\n }),\n});\n\nconst uploadSchema = yup.object({\n fileInfo: fileInfoSchema,\n});\n\nconst multiUploadSchema = yup.object({\n fileInfo: yup.array().of(fileInfoSchema),\n});\n\nconst validateUploadBody = (data = {}, isMulti = false) => {\n const schema = isMulti ? multiUploadSchema : uploadSchema;\n\n return validateYupSchema(schema, { strict: false })(data);\n};\n\nexport { validateUploadBody };\n\nexport type UploadBody =\n | yup.InferType<typeof uploadSchema>\n | yup.InferType<typeof multiUploadSchema>;\n\nconst bulkUpdatesSchema = yup.object({\n updates: yup\n .array()\n .of(\n yup.object({\n id: yup.number().required(),\n fileInfo: fileInfoSchema.required(),\n })\n )\n .min(1)\n .required(),\n});\n\nexport const validateBulkUpdateBody = validateYupSchema(bulkUpdatesSchema);\n"],"names":["focalPointSchema","yup","object","x","number","min","max","required","y","nullable","default","fileInfoSchema","name","string","alternativeText","caption","focalPoint","folder","strapiID","test","folderId","isNil","exists","getService","id","uploadSchema","fileInfo","multiUploadSchema","array","of","validateUploadBody","data","isMulti","schema","validateYupSchema","strict","bulkUpdatesSchema","updates","validateBulkUpdateBody"],"mappings":";;;;AAIA,MAAMA,gBAAAA,GAAmBC,GAAAA,CACtBC,MAAM,CAAC;IACNC,CAAAA,EAAGF,GAAAA,CAAIG,MAAM,EAAA,CAAGC,GAAG,CAAC,CAAA,CAAA,CAAGC,GAAG,CAAC,GAAA,CAAA,CAAKC,QAAQ,EAAA;IACxCC,CAAAA,EAAGP,GAAAA,CAAIG,MAAM,EAAA,CAAGC,GAAG,CAAC,CAAA,CAAA,CAAGC,GAAG,CAAC,GAAA,CAAA,CAAKC,QAAQ;AAC1C,CAAA,CAAA,CACCE,QAAQ,EAAA,CACRC,OAAO,CAAC,IAAA,CAAA;AAEX,MAAMC,cAAAA,GAAiBV,GAAAA,CAAIC,MAAM,CAAC;IAChCU,IAAAA,EAAMX,GAAAA,CAAIY,MAAM,EAAA,CAAGJ,QAAQ,EAAA;IAC3BK,eAAAA,EAAiBb,GAAAA,CAAIY,MAAM,EAAA,CAAGJ,QAAQ,EAAA;IACtCM,OAAAA,EAASd,GAAAA,CAAIY,MAAM,EAAA,CAAGJ,QAAQ,EAAA;IAC9BO,UAAAA,EAAYhB,gBAAAA;IACZiB,MAAAA,EAAQhB,GAAAA,CACLiB,QAAQ,EAAA,CACRT,QAAQ,GACRU,IAAI,CAAC,eAAA,EAAiB,2BAAA,EAA6B,OAAOC,QAAAA,GAAAA;AACzD,QAAA,IAAIC,MAAMD,QAAAA,CAAAA,EAAW;YACnB,OAAO,IAAA;AACT,QAAA;AAEA,QAAA,MAAME,MAAAA,GAAS,MAAMC,UAAAA,CAAW,QAAA,CAAA,CAAUD,MAAM,CAAC;YAAEE,EAAAA,EAAIJ;AAAS,SAAA,CAAA;QAEhE,OAAOE,MAAAA;AACT,IAAA,CAAA;AACJ,CAAA,CAAA;AAEA,MAAMG,YAAAA,GAAexB,GAAAA,CAAIC,MAAM,CAAC;IAC9BwB,QAAAA,EAAUf;AACZ,CAAA,CAAA;AAEA,MAAMgB,iBAAAA,GAAoB1B,GAAAA,CAAIC,MAAM,CAAC;AACnCwB,IAAAA,QAAAA,EAAUzB,GAAAA,CAAI2B,KAAK,EAAA,CAAGC,EAAE,CAAClB,cAAAA;AAC3B,CAAA,CAAA;AAEA,MAAMmB,qBAAqB,CAACC,IAAAA,GAAO,EAAE,EAAEC,UAAU,KAAK,GAAA;IACpD,MAAMC,MAAAA,GAASD,UAAUL,iBAAAA,GAAoBF,YAAAA;AAE7C,IAAA,OAAOS,kBAAkBD,MAAAA,EAAQ;QAAEE,MAAAA,EAAQ;KAAM,CAAA,CAAGJ,IAAAA,CAAAA;AACtD;AAQA,MAAMK,iBAAAA,GAAoBnC,GAAAA,CAAIC,MAAM,CAAC;AACnCmC,IAAAA,OAAAA,EAASpC,IACN2B,KAAK,EAAA,CACLC,EAAE,CACD5B,GAAAA,CAAIC,MAAM,CAAC;QACTsB,EAAAA,EAAIvB,GAAAA,CAAIG,MAAM,EAAA,CAAGG,QAAQ,EAAA;AACzBmB,QAAAA,QAAAA,EAAUf,eAAeJ,QAAQ;KACnC,CAAA,CAAA,CAEDF,GAAG,CAAC,CAAA,CAAA,CACJE,QAAQ;AACb,CAAA,CAAA;AAEO,MAAM+B,sBAAAA,GAAyBJ,iBAAAA,CAAkBE,iBAAAA;;;;"}
1
+ {"version":3,"file":"upload.mjs","sources":["../../../../../server/src/controllers/validation/admin/upload.ts"],"sourcesContent":["import { yup, validateYupSchema } from '@strapi/utils';\nimport { getService } from '../../../utils';\n\nconst focalPointSchema = yup\n .object({\n x: yup.number().min(0).max(100).required(),\n y: yup.number().min(0).max(100).required(),\n })\n .nullable()\n .default(null);\n\nconst fileInfoSchema = yup.object({\n name: yup.string().nullable(),\n alternativeText: yup.string().nullable(),\n caption: yup.string().nullable(),\n focalPoint: focalPointSchema,\n folder: yup\n .strapiID()\n .nullable()\n .test('folder-exists', 'the folder does not exist', async (folderId) => {\n if (folderId == null) {\n return true;\n }\n\n const exists = await getService('folder').exists({ id: folderId });\n\n return exists;\n }),\n});\n\nconst uploadSchema = yup.object({\n fileInfo: fileInfoSchema,\n});\n\nconst multiUploadSchema = yup.object({\n fileInfo: yup.array().of(fileInfoSchema),\n});\n\nconst validateUploadBody = (data = {}, isMulti = false) => {\n const schema = isMulti ? multiUploadSchema : uploadSchema;\n\n return validateYupSchema(schema, { strict: false })(data);\n};\n\nexport { validateUploadBody };\n\nexport type UploadBody =\n | yup.InferType<typeof uploadSchema>\n | yup.InferType<typeof multiUploadSchema>;\n\nconst bulkUpdatesSchema = yup.object({\n updates: yup\n .array()\n .of(\n yup.object({\n id: yup.number().required(),\n fileInfo: fileInfoSchema.required(),\n })\n )\n .min(1)\n .required(),\n});\n\nexport const validateBulkUpdateBody = validateYupSchema(bulkUpdatesSchema);\n"],"names":["focalPointSchema","yup","object","x","number","min","max","required","y","nullable","default","fileInfoSchema","name","string","alternativeText","caption","focalPoint","folder","strapiID","test","folderId","exists","getService","id","uploadSchema","fileInfo","multiUploadSchema","array","of","validateUploadBody","data","isMulti","schema","validateYupSchema","strict","bulkUpdatesSchema","updates","validateBulkUpdateBody"],"mappings":";;;AAGA,MAAMA,gBAAAA,GAAmBC,GAAAA,CACtBC,MAAM,CAAC;IACNC,CAAAA,EAAGF,GAAAA,CAAIG,MAAM,EAAA,CAAGC,GAAG,CAAC,CAAA,CAAA,CAAGC,GAAG,CAAC,GAAA,CAAA,CAAKC,QAAQ,EAAA;IACxCC,CAAAA,EAAGP,GAAAA,CAAIG,MAAM,EAAA,CAAGC,GAAG,CAAC,CAAA,CAAA,CAAGC,GAAG,CAAC,GAAA,CAAA,CAAKC,QAAQ;AAC1C,CAAA,CAAA,CACCE,QAAQ,EAAA,CACRC,OAAO,CAAC,IAAA,CAAA;AAEX,MAAMC,cAAAA,GAAiBV,GAAAA,CAAIC,MAAM,CAAC;IAChCU,IAAAA,EAAMX,GAAAA,CAAIY,MAAM,EAAA,CAAGJ,QAAQ,EAAA;IAC3BK,eAAAA,EAAiBb,GAAAA,CAAIY,MAAM,EAAA,CAAGJ,QAAQ,EAAA;IACtCM,OAAAA,EAASd,GAAAA,CAAIY,MAAM,EAAA,CAAGJ,QAAQ,EAAA;IAC9BO,UAAAA,EAAYhB,gBAAAA;IACZiB,MAAAA,EAAQhB,GAAAA,CACLiB,QAAQ,EAAA,CACRT,QAAQ,GACRU,IAAI,CAAC,eAAA,EAAiB,2BAAA,EAA6B,OAAOC,QAAAA,GAAAA;AACzD,QAAA,IAAIA,YAAY,IAAA,EAAM;YACpB,OAAO,IAAA;AACT,QAAA;AAEA,QAAA,MAAMC,MAAAA,GAAS,MAAMC,UAAAA,CAAW,QAAA,CAAA,CAAUD,MAAM,CAAC;YAAEE,EAAAA,EAAIH;AAAS,SAAA,CAAA;QAEhE,OAAOC,MAAAA;AACT,IAAA,CAAA;AACJ,CAAA,CAAA;AAEA,MAAMG,YAAAA,GAAevB,GAAAA,CAAIC,MAAM,CAAC;IAC9BuB,QAAAA,EAAUd;AACZ,CAAA,CAAA;AAEA,MAAMe,iBAAAA,GAAoBzB,GAAAA,CAAIC,MAAM,CAAC;AACnCuB,IAAAA,QAAAA,EAAUxB,GAAAA,CAAI0B,KAAK,EAAA,CAAGC,EAAE,CAACjB,cAAAA;AAC3B,CAAA,CAAA;AAEA,MAAMkB,qBAAqB,CAACC,IAAAA,GAAO,EAAE,EAAEC,UAAU,KAAK,GAAA;IACpD,MAAMC,MAAAA,GAASD,UAAUL,iBAAAA,GAAoBF,YAAAA;AAE7C,IAAA,OAAOS,kBAAkBD,MAAAA,EAAQ;QAAEE,MAAAA,EAAQ;KAAM,CAAA,CAAGJ,IAAAA,CAAAA;AACtD;AAQA,MAAMK,iBAAAA,GAAoBlC,GAAAA,CAAIC,MAAM,CAAC;AACnCkC,IAAAA,OAAAA,EAASnC,IACN0B,KAAK,EAAA,CACLC,EAAE,CACD3B,GAAAA,CAAIC,MAAM,CAAC;QACTqB,EAAAA,EAAItB,GAAAA,CAAIG,MAAM,EAAA,CAAGG,QAAQ,EAAA;AACzBkB,QAAAA,QAAAA,EAAUd,eAAeJ,QAAQ;KACnC,CAAA,CAAA,CAEDF,GAAG,CAAC,CAAA,CAAA,CACJE,QAAQ;AACb,CAAA,CAAA;AAEO,MAAM8B,sBAAAA,GAAyBJ,iBAAAA,CAAkBE,iBAAAA;;;;"}
@@ -1,10 +1,9 @@
1
1
  'use strict';
2
2
 
3
- var fp = require('lodash/fp');
4
3
  var index = require('../../../utils/index.js');
5
4
 
6
5
  const folderExists = async (folderId)=>{
7
- if (fp.isNil(folderId)) {
6
+ if (folderId == null) {
8
7
  return true;
9
8
  }
10
9
  const exists = await index.getService('folder').exists({
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sources":["../../../../../server/src/controllers/validation/admin/utils.ts"],"sourcesContent":["import { isNil } from 'lodash/fp';\nimport { getService } from '../../../utils';\n\nconst folderExists = async (folderId: number) => {\n if (isNil(folderId)) {\n return true;\n }\n\n const exists = await getService('folder').exists({ id: folderId });\n\n return exists;\n};\n\nexport { folderExists };\n"],"names":["folderExists","folderId","isNil","exists","getService","id"],"mappings":";;;;;AAGA,MAAMA,eAAe,OAAOC,QAAAA,GAAAA;AAC1B,IAAA,IAAIC,SAAMD,QAAAA,CAAAA,EAAW;QACnB,OAAO,IAAA;AACT,IAAA;AAEA,IAAA,MAAME,MAAAA,GAAS,MAAMC,gBAAAA,CAAW,QAAA,CAAA,CAAUD,MAAM,CAAC;QAAEE,EAAAA,EAAIJ;AAAS,KAAA,CAAA;IAEhE,OAAOE,MAAAA;AACT;;;;"}
1
+ {"version":3,"file":"utils.js","sources":["../../../../../server/src/controllers/validation/admin/utils.ts"],"sourcesContent":["import { getService } from '../../../utils';\n\nconst folderExists = async (folderId: number) => {\n if (folderId == null) {\n return true;\n }\n\n const exists = await getService('folder').exists({ id: folderId });\n\n return exists;\n};\n\nexport { folderExists };\n"],"names":["folderExists","folderId","exists","getService","id"],"mappings":";;;;AAEA,MAAMA,eAAe,OAAOC,QAAAA,GAAAA;AAC1B,IAAA,IAAIA,YAAY,IAAA,EAAM;QACpB,OAAO,IAAA;AACT,IAAA;AAEA,IAAA,MAAMC,MAAAA,GAAS,MAAMC,gBAAAA,CAAW,QAAA,CAAA,CAAUD,MAAM,CAAC;QAAEE,EAAAA,EAAIH;AAAS,KAAA,CAAA;IAEhE,OAAOC,MAAAA;AACT;;;;"}
@@ -1,8 +1,7 @@
1
- import { isNil } from 'lodash/fp';
2
1
  import { getService } from '../../../utils/index.mjs';
3
2
 
4
3
  const folderExists = async (folderId)=>{
5
- if (isNil(folderId)) {
4
+ if (folderId == null) {
6
5
  return true;
7
6
  }
8
7
  const exists = await getService('folder').exists({
@@ -1 +1 @@
1
- {"version":3,"file":"utils.mjs","sources":["../../../../../server/src/controllers/validation/admin/utils.ts"],"sourcesContent":["import { isNil } from 'lodash/fp';\nimport { getService } from '../../../utils';\n\nconst folderExists = async (folderId: number) => {\n if (isNil(folderId)) {\n return true;\n }\n\n const exists = await getService('folder').exists({ id: folderId });\n\n return exists;\n};\n\nexport { folderExists };\n"],"names":["folderExists","folderId","isNil","exists","getService","id"],"mappings":";;;AAGA,MAAMA,eAAe,OAAOC,QAAAA,GAAAA;AAC1B,IAAA,IAAIC,MAAMD,QAAAA,CAAAA,EAAW;QACnB,OAAO,IAAA;AACT,IAAA;AAEA,IAAA,MAAME,MAAAA,GAAS,MAAMC,UAAAA,CAAW,QAAA,CAAA,CAAUD,MAAM,CAAC;QAAEE,EAAAA,EAAIJ;AAAS,KAAA,CAAA;IAEhE,OAAOE,MAAAA;AACT;;;;"}
1
+ {"version":3,"file":"utils.mjs","sources":["../../../../../server/src/controllers/validation/admin/utils.ts"],"sourcesContent":["import { getService } from '../../../utils';\n\nconst folderExists = async (folderId: number) => {\n if (folderId == null) {\n return true;\n }\n\n const exists = await getService('folder').exists({ id: folderId });\n\n return exists;\n};\n\nexport { folderExists };\n"],"names":["folderExists","folderId","exists","getService","id"],"mappings":";;AAEA,MAAMA,eAAe,OAAOC,QAAAA,GAAAA;AAC1B,IAAA,IAAIA,YAAY,IAAA,EAAM;QACpB,OAAO,IAAA;AACT,IAAA;AAEA,IAAA,MAAMC,MAAAA,GAAS,MAAMC,UAAAA,CAAW,QAAA,CAAA,CAAUD,MAAM,CAAC;QAAEE,EAAAA,EAAIH;AAAS,KAAA,CAAA;IAEhE,OAAOC,MAAAA;AACT;;;;"}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var fp = require('lodash/fp');
3
+ var _ = require('lodash');
4
4
  var utils = require('../services/extensions/utils.js');
5
5
 
6
6
  const BATCH_SIZE = 100;
@@ -73,7 +73,7 @@ const migrateSchema = async (trx, db, schema, cache)=>{
73
73
  // the provider), so the surrounding transaction is not poisoned.
74
74
  try {
75
75
  const unsigned = await unsignValue(row[name], type, cache);
76
- if (!fp.isEqual(unsigned, row[name])) {
76
+ if (!_.isEqual(unsigned, row[name])) {
77
77
  data[name] = unsigned;
78
78
  }
79
79
  } catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"unsign-richtext-and-blocks-urls.js","sources":["../../../server/src/migrations/unsign-richtext-and-blocks-urls.ts"],"sourcesContent":["import { isEqual } from 'lodash/fp';\n\nimport type { Database, Migration } from '@strapi/database';\nimport type { Struct } from '@strapi/types';\n\nimport {\n createSignCache,\n mapBlocksImages,\n mapRichtextUrls,\n stripSignedUrl,\n unsignImage,\n} from '../services/extensions/utils';\nimport type { SignCache } from '../services/extensions/utils';\n\nconst BATCH_SIZE = 100;\nconst LOG_PREFIX = '[unsign-richtext-and-blocks-urls]';\n\ntype MigrationTrx = Parameters<Migration['up']>[0];\n\ntype TargetAttribute = { name: string; type: 'richtext' | 'blocks' };\n\ntype Progress = { scanned: number; updated: number };\n\nconst getTargetAttributes = (schema: Struct.Schema): TargetAttribute[] =>\n Object.entries(schema.attributes ?? {})\n .filter(([, attribute]) => attribute.type === 'richtext' || attribute.type === 'blocks')\n .map(([name, attribute]) => ({ name, type: attribute.type as TargetAttribute['type'] }));\n\nconst unsignValue = async (value: unknown, type: TargetAttribute['type'], cache: SignCache) => {\n return type === 'blocks'\n ? mapBlocksImages(value, (image) => unsignImage(image, cache))\n : mapRichtextUrls(value, (url) => stripSignedUrl(url, cache));\n};\n\nconst migrateSchema = async (\n trx: MigrationTrx,\n db: Database,\n schema: Struct.Schema,\n cache: SignCache\n): Promise<Progress> => {\n const progress: Progress = { scanned: 0, updated: 0 };\n const attributes = getTargetAttributes(schema);\n\n if (attributes.length === 0) {\n return progress;\n }\n\n const { uid } = schema;\n\n if (!db.metadata.has(uid)) {\n return progress;\n }\n\n const meta = db.metadata.get(uid);\n const { tableName } = meta;\n // The schema checks must run on the migration transaction: on SQLite the pool\n // has a single connection, so a root-connection query would wait on it forever\n const knex = db.getSchemaConnection(trx);\n\n // On a fresh project the migrations run before the tables exist\n if (!(await knex.hasTable(tableName))) {\n return progress;\n }\n\n // Internal migrations run before the schema sync: an attribute added in the\n // same deploy as this version has no column yet, so only select what exists\n const existing: TargetAttribute[] = [];\n\n for (const attribute of attributes) {\n const attributeMeta = meta.attributes[attribute.name];\n const columnName =\n attributeMeta && 'columnName' in attributeMeta && attributeMeta.columnName\n ? attributeMeta.columnName\n : attribute.name;\n\n if (await knex.hasColumn(tableName, columnName)) {\n existing.push(attribute);\n }\n }\n\n if (existing.length === 0) {\n return progress;\n }\n\n const select = ['id', ...existing.map(({ name }) => name)];\n\n let offset = 0;\n let hasMore = true;\n\n while (hasMore) {\n const rows: Record<string, any>[] = await strapi.db.query(uid).findMany({\n select,\n limit: BATCH_SIZE,\n offset,\n orderBy: { id: 'asc' },\n });\n\n hasMore = rows.length === BATCH_SIZE;\n offset += rows.length;\n progress.scanned += rows.length;\n\n for (const row of rows) {\n const data: Record<string, unknown> = {};\n\n for (const { name, type } of existing) {\n // A value the mapper cannot process is logged and skipped. This is safe\n // to catch: the mapper does no database work (presigning is local to\n // the provider), so the surrounding transaction is not poisoned.\n try {\n const unsigned = await unsignValue(row[name], type, cache);\n\n if (!isEqual(unsigned, row[name])) {\n data[name] = unsigned;\n }\n } catch (error) {\n strapi.log.warn(\n `${LOG_PREFIX} Skipped ${uid}.${name} on row ${row.id}: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n }\n\n if (Object.keys(data).length > 0) {\n await strapi.db.query(uid).update({ where: { id: row.id }, data });\n progress.updated += 1;\n }\n }\n }\n\n if (progress.scanned > 0) {\n strapi.log.info(\n `${LOG_PREFIX} ${uid}: ${progress.scanned} rows scanned, ${progress.updated} updated`\n );\n }\n\n return progress;\n};\n\nconst migrateUp = async (trx: MigrationTrx, db: Database) => {\n const { provider } = strapi.plugins.upload;\n\n // Nothing is signed on a public provider, so there is nothing to strip\n if (!provider || !(await provider.isPrivate())) {\n return;\n }\n\n const schemas = [\n ...Object.values(strapi.contentTypes),\n ...Object.values(strapi.components),\n ] as Struct.Schema[];\n\n // One presign per distinct URL for the whole run, however many rows it appears in\n const cache = createSignCache();\n const total: Progress = { scanned: 0, updated: 0 };\n\n for (const schema of schemas) {\n const progress = await migrateSchema(trx, db, schema, cache);\n\n total.scanned += progress.scanned;\n total.updated += progress.updated;\n }\n\n strapi.log.info(`${LOG_PREFIX} Done: ${total.scanned} rows scanned, ${total.updated} updated`);\n};\n\n/**\n * Richtext and blocks attributes embed the file URL in their own value, so a\n * signed URL written by the admin used to be frozen in the row and broke as\n * soon as the signature expired. New writes are normalised by the upload\n * document service middleware, and the read path re-signs a stored URL that\n * still carries a stale signature, so this migration is a cleanup of the rows\n * written before the fix rather than a prerequisite for it.\n *\n * Idempotent: re-running it finds nothing left to change.\n *\n * Runs inside the internal migration transaction like every other internal\n * migration: a database error fails the boot. A single value the mapper cannot\n * process is logged with a warning and skipped; it is normalised by the\n * middleware on its next save and re-signed on read until then.\n */\nexport const unsignRichtextAndBlocksUrls: Migration = {\n name: 'upload::unsign-richtext-and-blocks-urls',\n async up(trx, db) {\n await migrateUp(trx, db);\n },\n async down() {\n throw new Error('not implemented');\n },\n};\n"],"names":["BATCH_SIZE","LOG_PREFIX","getTargetAttributes","schema","Object","entries","attributes","filter","attribute","type","map","name","unsignValue","value","cache","mapBlocksImages","image","unsignImage","mapRichtextUrls","url","stripSignedUrl","migrateSchema","trx","db","progress","scanned","updated","length","uid","metadata","has","meta","get","tableName","knex","getSchemaConnection","hasTable","existing","attributeMeta","columnName","hasColumn","push","select","offset","hasMore","rows","strapi","query","findMany","limit","orderBy","id","row","data","unsigned","isEqual","error","log","warn","Error","message","String","keys","update","where","info","migrateUp","provider","plugins","upload","isPrivate","schemas","values","contentTypes","components","createSignCache","total","unsignRichtextAndBlocksUrls","up","down"],"mappings":"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"}
1
+ {"version":3,"file":"unsign-richtext-and-blocks-urls.js","sources":["../../../server/src/migrations/unsign-richtext-and-blocks-urls.ts"],"sourcesContent":["import { isEqual } from 'lodash';\n\nimport type { Database, Migration } from '@strapi/database';\nimport type { Struct } from '@strapi/types';\n\nimport {\n createSignCache,\n mapBlocksImages,\n mapRichtextUrls,\n stripSignedUrl,\n unsignImage,\n} from '../services/extensions/utils';\nimport type { SignCache } from '../services/extensions/utils';\n\nconst BATCH_SIZE = 100;\nconst LOG_PREFIX = '[unsign-richtext-and-blocks-urls]';\n\ntype MigrationTrx = Parameters<Migration['up']>[0];\n\ntype TargetAttribute = { name: string; type: 'richtext' | 'blocks' };\n\ntype Progress = { scanned: number; updated: number };\n\nconst getTargetAttributes = (schema: Struct.Schema): TargetAttribute[] =>\n Object.entries(schema.attributes ?? {})\n .filter(([, attribute]) => attribute.type === 'richtext' || attribute.type === 'blocks')\n .map(([name, attribute]) => ({ name, type: attribute.type as TargetAttribute['type'] }));\n\nconst unsignValue = async (value: unknown, type: TargetAttribute['type'], cache: SignCache) => {\n return type === 'blocks'\n ? mapBlocksImages(value, (image) => unsignImage(image, cache))\n : mapRichtextUrls(value, (url) => stripSignedUrl(url, cache));\n};\n\nconst migrateSchema = async (\n trx: MigrationTrx,\n db: Database,\n schema: Struct.Schema,\n cache: SignCache\n): Promise<Progress> => {\n const progress: Progress = { scanned: 0, updated: 0 };\n const attributes = getTargetAttributes(schema);\n\n if (attributes.length === 0) {\n return progress;\n }\n\n const { uid } = schema;\n\n if (!db.metadata.has(uid)) {\n return progress;\n }\n\n const meta = db.metadata.get(uid);\n const { tableName } = meta;\n // The schema checks must run on the migration transaction: on SQLite the pool\n // has a single connection, so a root-connection query would wait on it forever\n const knex = db.getSchemaConnection(trx);\n\n // On a fresh project the migrations run before the tables exist\n if (!(await knex.hasTable(tableName))) {\n return progress;\n }\n\n // Internal migrations run before the schema sync: an attribute added in the\n // same deploy as this version has no column yet, so only select what exists\n const existing: TargetAttribute[] = [];\n\n for (const attribute of attributes) {\n const attributeMeta = meta.attributes[attribute.name];\n const columnName =\n attributeMeta && 'columnName' in attributeMeta && attributeMeta.columnName\n ? attributeMeta.columnName\n : attribute.name;\n\n if (await knex.hasColumn(tableName, columnName)) {\n existing.push(attribute);\n }\n }\n\n if (existing.length === 0) {\n return progress;\n }\n\n const select = ['id', ...existing.map(({ name }) => name)];\n\n let offset = 0;\n let hasMore = true;\n\n while (hasMore) {\n const rows: Record<string, any>[] = await strapi.db.query(uid).findMany({\n select,\n limit: BATCH_SIZE,\n offset,\n orderBy: { id: 'asc' },\n });\n\n hasMore = rows.length === BATCH_SIZE;\n offset += rows.length;\n progress.scanned += rows.length;\n\n for (const row of rows) {\n const data: Record<string, unknown> = {};\n\n for (const { name, type } of existing) {\n // A value the mapper cannot process is logged and skipped. This is safe\n // to catch: the mapper does no database work (presigning is local to\n // the provider), so the surrounding transaction is not poisoned.\n try {\n const unsigned = await unsignValue(row[name], type, cache);\n\n if (!isEqual(unsigned, row[name])) {\n data[name] = unsigned;\n }\n } catch (error) {\n strapi.log.warn(\n `${LOG_PREFIX} Skipped ${uid}.${name} on row ${row.id}: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n }\n\n if (Object.keys(data).length > 0) {\n await strapi.db.query(uid).update({ where: { id: row.id }, data });\n progress.updated += 1;\n }\n }\n }\n\n if (progress.scanned > 0) {\n strapi.log.info(\n `${LOG_PREFIX} ${uid}: ${progress.scanned} rows scanned, ${progress.updated} updated`\n );\n }\n\n return progress;\n};\n\nconst migrateUp = async (trx: MigrationTrx, db: Database) => {\n const { provider } = strapi.plugins.upload;\n\n // Nothing is signed on a public provider, so there is nothing to strip\n if (!provider || !(await provider.isPrivate())) {\n return;\n }\n\n const schemas = [\n ...Object.values(strapi.contentTypes),\n ...Object.values(strapi.components),\n ] as Struct.Schema[];\n\n // One presign per distinct URL for the whole run, however many rows it appears in\n const cache = createSignCache();\n const total: Progress = { scanned: 0, updated: 0 };\n\n for (const schema of schemas) {\n const progress = await migrateSchema(trx, db, schema, cache);\n\n total.scanned += progress.scanned;\n total.updated += progress.updated;\n }\n\n strapi.log.info(`${LOG_PREFIX} Done: ${total.scanned} rows scanned, ${total.updated} updated`);\n};\n\n/**\n * Richtext and blocks attributes embed the file URL in their own value, so a\n * signed URL written by the admin used to be frozen in the row and broke as\n * soon as the signature expired. New writes are normalised by the upload\n * document service middleware, and the read path re-signs a stored URL that\n * still carries a stale signature, so this migration is a cleanup of the rows\n * written before the fix rather than a prerequisite for it.\n *\n * Idempotent: re-running it finds nothing left to change.\n *\n * Runs inside the internal migration transaction like every other internal\n * migration: a database error fails the boot. A single value the mapper cannot\n * process is logged with a warning and skipped; it is normalised by the\n * middleware on its next save and re-signed on read until then.\n */\nexport const unsignRichtextAndBlocksUrls: Migration = {\n name: 'upload::unsign-richtext-and-blocks-urls',\n async up(trx, db) {\n await migrateUp(trx, db);\n },\n async down() {\n throw new Error('not implemented');\n },\n};\n"],"names":["BATCH_SIZE","LOG_PREFIX","getTargetAttributes","schema","Object","entries","attributes","filter","attribute","type","map","name","unsignValue","value","cache","mapBlocksImages","image","unsignImage","mapRichtextUrls","url","stripSignedUrl","migrateSchema","trx","db","progress","scanned","updated","length","uid","metadata","has","meta","get","tableName","knex","getSchemaConnection","hasTable","existing","attributeMeta","columnName","hasColumn","push","select","offset","hasMore","rows","strapi","query","findMany","limit","orderBy","id","row","data","unsigned","isEqual","error","log","warn","Error","message","String","keys","update","where","info","migrateUp","provider","plugins","upload","isPrivate","schemas","values","contentTypes","components","createSignCache","total","unsignRichtextAndBlocksUrls","up","down"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { isEqual } from 'lodash/fp';
1
+ import { isEqual } from 'lodash';
2
2
  import { mapBlocksImages, unsignImage, mapRichtextUrls, stripSignedUrl, createSignCache } from '../services/extensions/utils.mjs';
3
3
 
4
4
  const BATCH_SIZE = 100;
@@ -1 +1 @@
1
- {"version":3,"file":"unsign-richtext-and-blocks-urls.mjs","sources":["../../../server/src/migrations/unsign-richtext-and-blocks-urls.ts"],"sourcesContent":["import { isEqual } from 'lodash/fp';\n\nimport type { Database, Migration } from '@strapi/database';\nimport type { Struct } from '@strapi/types';\n\nimport {\n createSignCache,\n mapBlocksImages,\n mapRichtextUrls,\n stripSignedUrl,\n unsignImage,\n} from '../services/extensions/utils';\nimport type { SignCache } from '../services/extensions/utils';\n\nconst BATCH_SIZE = 100;\nconst LOG_PREFIX = '[unsign-richtext-and-blocks-urls]';\n\ntype MigrationTrx = Parameters<Migration['up']>[0];\n\ntype TargetAttribute = { name: string; type: 'richtext' | 'blocks' };\n\ntype Progress = { scanned: number; updated: number };\n\nconst getTargetAttributes = (schema: Struct.Schema): TargetAttribute[] =>\n Object.entries(schema.attributes ?? {})\n .filter(([, attribute]) => attribute.type === 'richtext' || attribute.type === 'blocks')\n .map(([name, attribute]) => ({ name, type: attribute.type as TargetAttribute['type'] }));\n\nconst unsignValue = async (value: unknown, type: TargetAttribute['type'], cache: SignCache) => {\n return type === 'blocks'\n ? mapBlocksImages(value, (image) => unsignImage(image, cache))\n : mapRichtextUrls(value, (url) => stripSignedUrl(url, cache));\n};\n\nconst migrateSchema = async (\n trx: MigrationTrx,\n db: Database,\n schema: Struct.Schema,\n cache: SignCache\n): Promise<Progress> => {\n const progress: Progress = { scanned: 0, updated: 0 };\n const attributes = getTargetAttributes(schema);\n\n if (attributes.length === 0) {\n return progress;\n }\n\n const { uid } = schema;\n\n if (!db.metadata.has(uid)) {\n return progress;\n }\n\n const meta = db.metadata.get(uid);\n const { tableName } = meta;\n // The schema checks must run on the migration transaction: on SQLite the pool\n // has a single connection, so a root-connection query would wait on it forever\n const knex = db.getSchemaConnection(trx);\n\n // On a fresh project the migrations run before the tables exist\n if (!(await knex.hasTable(tableName))) {\n return progress;\n }\n\n // Internal migrations run before the schema sync: an attribute added in the\n // same deploy as this version has no column yet, so only select what exists\n const existing: TargetAttribute[] = [];\n\n for (const attribute of attributes) {\n const attributeMeta = meta.attributes[attribute.name];\n const columnName =\n attributeMeta && 'columnName' in attributeMeta && attributeMeta.columnName\n ? attributeMeta.columnName\n : attribute.name;\n\n if (await knex.hasColumn(tableName, columnName)) {\n existing.push(attribute);\n }\n }\n\n if (existing.length === 0) {\n return progress;\n }\n\n const select = ['id', ...existing.map(({ name }) => name)];\n\n let offset = 0;\n let hasMore = true;\n\n while (hasMore) {\n const rows: Record<string, any>[] = await strapi.db.query(uid).findMany({\n select,\n limit: BATCH_SIZE,\n offset,\n orderBy: { id: 'asc' },\n });\n\n hasMore = rows.length === BATCH_SIZE;\n offset += rows.length;\n progress.scanned += rows.length;\n\n for (const row of rows) {\n const data: Record<string, unknown> = {};\n\n for (const { name, type } of existing) {\n // A value the mapper cannot process is logged and skipped. This is safe\n // to catch: the mapper does no database work (presigning is local to\n // the provider), so the surrounding transaction is not poisoned.\n try {\n const unsigned = await unsignValue(row[name], type, cache);\n\n if (!isEqual(unsigned, row[name])) {\n data[name] = unsigned;\n }\n } catch (error) {\n strapi.log.warn(\n `${LOG_PREFIX} Skipped ${uid}.${name} on row ${row.id}: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n }\n\n if (Object.keys(data).length > 0) {\n await strapi.db.query(uid).update({ where: { id: row.id }, data });\n progress.updated += 1;\n }\n }\n }\n\n if (progress.scanned > 0) {\n strapi.log.info(\n `${LOG_PREFIX} ${uid}: ${progress.scanned} rows scanned, ${progress.updated} updated`\n );\n }\n\n return progress;\n};\n\nconst migrateUp = async (trx: MigrationTrx, db: Database) => {\n const { provider } = strapi.plugins.upload;\n\n // Nothing is signed on a public provider, so there is nothing to strip\n if (!provider || !(await provider.isPrivate())) {\n return;\n }\n\n const schemas = [\n ...Object.values(strapi.contentTypes),\n ...Object.values(strapi.components),\n ] as Struct.Schema[];\n\n // One presign per distinct URL for the whole run, however many rows it appears in\n const cache = createSignCache();\n const total: Progress = { scanned: 0, updated: 0 };\n\n for (const schema of schemas) {\n const progress = await migrateSchema(trx, db, schema, cache);\n\n total.scanned += progress.scanned;\n total.updated += progress.updated;\n }\n\n strapi.log.info(`${LOG_PREFIX} Done: ${total.scanned} rows scanned, ${total.updated} updated`);\n};\n\n/**\n * Richtext and blocks attributes embed the file URL in their own value, so a\n * signed URL written by the admin used to be frozen in the row and broke as\n * soon as the signature expired. New writes are normalised by the upload\n * document service middleware, and the read path re-signs a stored URL that\n * still carries a stale signature, so this migration is a cleanup of the rows\n * written before the fix rather than a prerequisite for it.\n *\n * Idempotent: re-running it finds nothing left to change.\n *\n * Runs inside the internal migration transaction like every other internal\n * migration: a database error fails the boot. A single value the mapper cannot\n * process is logged with a warning and skipped; it is normalised by the\n * middleware on its next save and re-signed on read until then.\n */\nexport const unsignRichtextAndBlocksUrls: Migration = {\n name: 'upload::unsign-richtext-and-blocks-urls',\n async up(trx, db) {\n await migrateUp(trx, db);\n },\n async down() {\n throw new Error('not implemented');\n },\n};\n"],"names":["BATCH_SIZE","LOG_PREFIX","getTargetAttributes","schema","Object","entries","attributes","filter","attribute","type","map","name","unsignValue","value","cache","mapBlocksImages","image","unsignImage","mapRichtextUrls","url","stripSignedUrl","migrateSchema","trx","db","progress","scanned","updated","length","uid","metadata","has","meta","get","tableName","knex","getSchemaConnection","hasTable","existing","attributeMeta","columnName","hasColumn","push","select","offset","hasMore","rows","strapi","query","findMany","limit","orderBy","id","row","data","unsigned","isEqual","error","log","warn","Error","message","String","keys","update","where","info","migrateUp","provider","plugins","upload","isPrivate","schemas","values","contentTypes","components","createSignCache","total","unsignRichtextAndBlocksUrls","up","down"],"mappings":"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"}
1
+ {"version":3,"file":"unsign-richtext-and-blocks-urls.mjs","sources":["../../../server/src/migrations/unsign-richtext-and-blocks-urls.ts"],"sourcesContent":["import { isEqual } from 'lodash';\n\nimport type { Database, Migration } from '@strapi/database';\nimport type { Struct } from '@strapi/types';\n\nimport {\n createSignCache,\n mapBlocksImages,\n mapRichtextUrls,\n stripSignedUrl,\n unsignImage,\n} from '../services/extensions/utils';\nimport type { SignCache } from '../services/extensions/utils';\n\nconst BATCH_SIZE = 100;\nconst LOG_PREFIX = '[unsign-richtext-and-blocks-urls]';\n\ntype MigrationTrx = Parameters<Migration['up']>[0];\n\ntype TargetAttribute = { name: string; type: 'richtext' | 'blocks' };\n\ntype Progress = { scanned: number; updated: number };\n\nconst getTargetAttributes = (schema: Struct.Schema): TargetAttribute[] =>\n Object.entries(schema.attributes ?? {})\n .filter(([, attribute]) => attribute.type === 'richtext' || attribute.type === 'blocks')\n .map(([name, attribute]) => ({ name, type: attribute.type as TargetAttribute['type'] }));\n\nconst unsignValue = async (value: unknown, type: TargetAttribute['type'], cache: SignCache) => {\n return type === 'blocks'\n ? mapBlocksImages(value, (image) => unsignImage(image, cache))\n : mapRichtextUrls(value, (url) => stripSignedUrl(url, cache));\n};\n\nconst migrateSchema = async (\n trx: MigrationTrx,\n db: Database,\n schema: Struct.Schema,\n cache: SignCache\n): Promise<Progress> => {\n const progress: Progress = { scanned: 0, updated: 0 };\n const attributes = getTargetAttributes(schema);\n\n if (attributes.length === 0) {\n return progress;\n }\n\n const { uid } = schema;\n\n if (!db.metadata.has(uid)) {\n return progress;\n }\n\n const meta = db.metadata.get(uid);\n const { tableName } = meta;\n // The schema checks must run on the migration transaction: on SQLite the pool\n // has a single connection, so a root-connection query would wait on it forever\n const knex = db.getSchemaConnection(trx);\n\n // On a fresh project the migrations run before the tables exist\n if (!(await knex.hasTable(tableName))) {\n return progress;\n }\n\n // Internal migrations run before the schema sync: an attribute added in the\n // same deploy as this version has no column yet, so only select what exists\n const existing: TargetAttribute[] = [];\n\n for (const attribute of attributes) {\n const attributeMeta = meta.attributes[attribute.name];\n const columnName =\n attributeMeta && 'columnName' in attributeMeta && attributeMeta.columnName\n ? attributeMeta.columnName\n : attribute.name;\n\n if (await knex.hasColumn(tableName, columnName)) {\n existing.push(attribute);\n }\n }\n\n if (existing.length === 0) {\n return progress;\n }\n\n const select = ['id', ...existing.map(({ name }) => name)];\n\n let offset = 0;\n let hasMore = true;\n\n while (hasMore) {\n const rows: Record<string, any>[] = await strapi.db.query(uid).findMany({\n select,\n limit: BATCH_SIZE,\n offset,\n orderBy: { id: 'asc' },\n });\n\n hasMore = rows.length === BATCH_SIZE;\n offset += rows.length;\n progress.scanned += rows.length;\n\n for (const row of rows) {\n const data: Record<string, unknown> = {};\n\n for (const { name, type } of existing) {\n // A value the mapper cannot process is logged and skipped. This is safe\n // to catch: the mapper does no database work (presigning is local to\n // the provider), so the surrounding transaction is not poisoned.\n try {\n const unsigned = await unsignValue(row[name], type, cache);\n\n if (!isEqual(unsigned, row[name])) {\n data[name] = unsigned;\n }\n } catch (error) {\n strapi.log.warn(\n `${LOG_PREFIX} Skipped ${uid}.${name} on row ${row.id}: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n }\n\n if (Object.keys(data).length > 0) {\n await strapi.db.query(uid).update({ where: { id: row.id }, data });\n progress.updated += 1;\n }\n }\n }\n\n if (progress.scanned > 0) {\n strapi.log.info(\n `${LOG_PREFIX} ${uid}: ${progress.scanned} rows scanned, ${progress.updated} updated`\n );\n }\n\n return progress;\n};\n\nconst migrateUp = async (trx: MigrationTrx, db: Database) => {\n const { provider } = strapi.plugins.upload;\n\n // Nothing is signed on a public provider, so there is nothing to strip\n if (!provider || !(await provider.isPrivate())) {\n return;\n }\n\n const schemas = [\n ...Object.values(strapi.contentTypes),\n ...Object.values(strapi.components),\n ] as Struct.Schema[];\n\n // One presign per distinct URL for the whole run, however many rows it appears in\n const cache = createSignCache();\n const total: Progress = { scanned: 0, updated: 0 };\n\n for (const schema of schemas) {\n const progress = await migrateSchema(trx, db, schema, cache);\n\n total.scanned += progress.scanned;\n total.updated += progress.updated;\n }\n\n strapi.log.info(`${LOG_PREFIX} Done: ${total.scanned} rows scanned, ${total.updated} updated`);\n};\n\n/**\n * Richtext and blocks attributes embed the file URL in their own value, so a\n * signed URL written by the admin used to be frozen in the row and broke as\n * soon as the signature expired. New writes are normalised by the upload\n * document service middleware, and the read path re-signs a stored URL that\n * still carries a stale signature, so this migration is a cleanup of the rows\n * written before the fix rather than a prerequisite for it.\n *\n * Idempotent: re-running it finds nothing left to change.\n *\n * Runs inside the internal migration transaction like every other internal\n * migration: a database error fails the boot. A single value the mapper cannot\n * process is logged with a warning and skipped; it is normalised by the\n * middleware on its next save and re-signed on read until then.\n */\nexport const unsignRichtextAndBlocksUrls: Migration = {\n name: 'upload::unsign-richtext-and-blocks-urls',\n async up(trx, db) {\n await migrateUp(trx, db);\n },\n async down() {\n throw new Error('not implemented');\n },\n};\n"],"names":["BATCH_SIZE","LOG_PREFIX","getTargetAttributes","schema","Object","entries","attributes","filter","attribute","type","map","name","unsignValue","value","cache","mapBlocksImages","image","unsignImage","mapRichtextUrls","url","stripSignedUrl","migrateSchema","trx","db","progress","scanned","updated","length","uid","metadata","has","meta","get","tableName","knex","getSchemaConnection","hasTable","existing","attributeMeta","columnName","hasColumn","push","select","offset","hasMore","rows","strapi","query","findMany","limit","orderBy","id","row","data","unsigned","isEqual","error","log","warn","Error","message","String","keys","update","where","info","migrateUp","provider","plugins","upload","isPrivate","schemas","values","contentTypes","components","createSignCache","total","unsignRichtextAndBlocksUrls","up","down"],"mappings":"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"}
@@ -33,7 +33,7 @@ const createRoutes = utils.createContentApiRoutesFactory(()=>{
33
33
  handler: 'content-api.upload',
34
34
  request: {
35
35
  query: {
36
- id: validator.fileId.optional()
36
+ id: validator.fileIdOrDocumentId.optional()
37
37
  }
38
38
  },
39
39
  response: z__namespace.union([
@@ -77,7 +77,7 @@ const createRoutes = utils.createContentApiRoutesFactory(()=>{
77
77
  handler: 'content-api.findOne',
78
78
  request: {
79
79
  params: {
80
- id: validator.fileId
80
+ id: validator.fileIdOrDocumentId
81
81
  },
82
82
  query: {
83
83
  fields: validator.queryFields.optional(),
@@ -92,7 +92,7 @@ const createRoutes = utils.createContentApiRoutesFactory(()=>{
92
92
  handler: 'content-api.destroy',
93
93
  request: {
94
94
  params: {
95
- id: validator.fileId
95
+ id: validator.fileIdOrDocumentId
96
96
  }
97
97
  },
98
98
  response: validator.file
@@ -1 +1 @@
1
- {"version":3,"file":"content-api.js","sources":["../../../server/src/routes/content-api.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport * as z from 'zod/v4';\nimport { createContentApiRoutesFactory } from '@strapi/utils';\nimport { UploadRouteValidator } from './validation';\n\nconst createRoutes = createContentApiRoutesFactory((): Core.RouterInput['routes'] => {\n const validator = new UploadRouteValidator(strapi);\n\n return [\n {\n method: 'POST',\n path: '/',\n handler: 'content-api.upload',\n request: {\n query: { id: validator.fileId.optional() },\n // Note: multipart/form-data is handled by Koa middleware, not Zod\n },\n response: z.union([validator.file, validator.files]),\n },\n {\n method: 'GET',\n path: '/files',\n handler: 'content-api.find',\n request: {\n query: {\n fields: validator.queryFields.optional(),\n populate: validator.queryPopulate.optional(),\n sort: validator.querySort.optional(),\n pagination: validator.pagination.optional(),\n filters: validator.filters.optional(),\n },\n },\n response: validator.files,\n },\n {\n method: 'GET',\n path: '/files/page',\n handler: 'content-api.findPage',\n request: {\n query: {\n fields: validator.queryFields.optional(),\n populate: validator.queryPopulate.optional(),\n sort: validator.querySort.optional(),\n pagination: validator.pagination.optional(),\n filters: validator.filters.optional(),\n },\n },\n response: validator.paginatedFiles,\n },\n {\n method: 'GET',\n path: '/files/:id',\n handler: 'content-api.findOne',\n request: {\n params: { id: validator.fileId },\n query: {\n fields: validator.queryFields.optional(),\n populate: validator.queryPopulate.optional(),\n },\n },\n response: validator.file,\n },\n {\n method: 'DELETE',\n path: '/files/:id',\n handler: 'content-api.destroy',\n request: {\n params: { id: validator.fileId },\n },\n response: validator.file,\n },\n ];\n});\n\nexport const routes = createRoutes;\n"],"names":["createRoutes","createContentApiRoutesFactory","validator","UploadRouteValidator","strapi","method","path","handler","request","query","id","fileId","optional","response","z","union","file","files","fields","queryFields","populate","queryPopulate","sort","querySort","pagination","filters","paginatedFiles","params","routes"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAKA,MAAMA,eAAeC,mCAAAA,CAA8B,IAAA;IACjD,MAAMC,SAAAA,GAAY,IAAIC,2BAAAA,CAAqBC,MAAAA,CAAAA;IAE3C,OAAO;AACL,QAAA;YACEC,MAAAA,EAAQ,MAAA;YACRC,IAAAA,EAAM,GAAA;YACNC,OAAAA,EAAS,oBAAA;YACTC,OAAAA,EAAS;gBACPC,KAAAA,EAAO;oBAAEC,EAAAA,EAAIR,SAAAA,CAAUS,MAAM,CAACC,QAAQ;AAAG;AAE3C,aAAA;YACAC,QAAAA,EAAUC,YAAAA,CAAEC,KAAK,CAAC;AAACb,gBAAAA,SAAAA,CAAUc,IAAI;AAAEd,gBAAAA,SAAAA,CAAUe;AAAM,aAAA;AACrD,SAAA;AACA,QAAA;YACEZ,MAAAA,EAAQ,KAAA;YACRC,IAAAA,EAAM,QAAA;YACNC,OAAAA,EAAS,kBAAA;YACTC,OAAAA,EAAS;gBACPC,KAAAA,EAAO;oBACLS,MAAAA,EAAQhB,SAAAA,CAAUiB,WAAW,CAACP,QAAQ,EAAA;oBACtCQ,QAAAA,EAAUlB,SAAAA,CAAUmB,aAAa,CAACT,QAAQ,EAAA;oBAC1CU,IAAAA,EAAMpB,SAAAA,CAAUqB,SAAS,CAACX,QAAQ,EAAA;oBAClCY,UAAAA,EAAYtB,SAAAA,CAAUsB,UAAU,CAACZ,QAAQ,EAAA;oBACzCa,OAAAA,EAASvB,SAAAA,CAAUuB,OAAO,CAACb,QAAQ;AACrC;AACF,aAAA;AACAC,YAAAA,QAAAA,EAAUX,UAAUe;AACtB,SAAA;AACA,QAAA;YACEZ,MAAAA,EAAQ,KAAA;YACRC,IAAAA,EAAM,aAAA;YACNC,OAAAA,EAAS,sBAAA;YACTC,OAAAA,EAAS;gBACPC,KAAAA,EAAO;oBACLS,MAAAA,EAAQhB,SAAAA,CAAUiB,WAAW,CAACP,QAAQ,EAAA;oBACtCQ,QAAAA,EAAUlB,SAAAA,CAAUmB,aAAa,CAACT,QAAQ,EAAA;oBAC1CU,IAAAA,EAAMpB,SAAAA,CAAUqB,SAAS,CAACX,QAAQ,EAAA;oBAClCY,UAAAA,EAAYtB,SAAAA,CAAUsB,UAAU,CAACZ,QAAQ,EAAA;oBACzCa,OAAAA,EAASvB,SAAAA,CAAUuB,OAAO,CAACb,QAAQ;AACrC;AACF,aAAA;AACAC,YAAAA,QAAAA,EAAUX,UAAUwB;AACtB,SAAA;AACA,QAAA;YACErB,MAAAA,EAAQ,KAAA;YACRC,IAAAA,EAAM,YAAA;YACNC,OAAAA,EAAS,qBAAA;YACTC,OAAAA,EAAS;gBACPmB,MAAAA,EAAQ;AAAEjB,oBAAAA,EAAAA,EAAIR,UAAUS;AAAO,iBAAA;gBAC/BF,KAAAA,EAAO;oBACLS,MAAAA,EAAQhB,SAAAA,CAAUiB,WAAW,CAACP,QAAQ,EAAA;oBACtCQ,QAAAA,EAAUlB,SAAAA,CAAUmB,aAAa,CAACT,QAAQ;AAC5C;AACF,aAAA;AACAC,YAAAA,QAAAA,EAAUX,UAAUc;AACtB,SAAA;AACA,QAAA;YACEX,MAAAA,EAAQ,QAAA;YACRC,IAAAA,EAAM,YAAA;YACNC,OAAAA,EAAS,qBAAA;YACTC,OAAAA,EAAS;gBACPmB,MAAAA,EAAQ;AAAEjB,oBAAAA,EAAAA,EAAIR,UAAUS;AAAO;AACjC,aAAA;AACAE,YAAAA,QAAAA,EAAUX,UAAUc;AACtB;AACD,KAAA;AACH,CAAA,CAAA;AAEO,MAAMY,SAAS5B;;;;"}
1
+ {"version":3,"file":"content-api.js","sources":["../../../server/src/routes/content-api.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport * as z from 'zod/v4';\nimport { createContentApiRoutesFactory } from '@strapi/utils';\nimport { UploadRouteValidator } from './validation';\n\nconst createRoutes = createContentApiRoutesFactory((): Core.RouterInput['routes'] => {\n const validator = new UploadRouteValidator(strapi);\n\n return [\n {\n method: 'POST',\n path: '/',\n handler: 'content-api.upload',\n request: {\n query: { id: validator.fileIdOrDocumentId.optional() },\n // Note: multipart/form-data is handled by Koa middleware, not Zod\n },\n response: z.union([validator.file, validator.files]),\n },\n {\n method: 'GET',\n path: '/files',\n handler: 'content-api.find',\n request: {\n query: {\n fields: validator.queryFields.optional(),\n populate: validator.queryPopulate.optional(),\n sort: validator.querySort.optional(),\n pagination: validator.pagination.optional(),\n filters: validator.filters.optional(),\n },\n },\n response: validator.files,\n },\n {\n method: 'GET',\n path: '/files/page',\n handler: 'content-api.findPage',\n request: {\n query: {\n fields: validator.queryFields.optional(),\n populate: validator.queryPopulate.optional(),\n sort: validator.querySort.optional(),\n pagination: validator.pagination.optional(),\n filters: validator.filters.optional(),\n },\n },\n response: validator.paginatedFiles,\n },\n {\n method: 'GET',\n path: '/files/:id',\n handler: 'content-api.findOne',\n request: {\n params: { id: validator.fileIdOrDocumentId },\n query: {\n fields: validator.queryFields.optional(),\n populate: validator.queryPopulate.optional(),\n },\n },\n response: validator.file,\n },\n {\n method: 'DELETE',\n path: '/files/:id',\n handler: 'content-api.destroy',\n request: {\n params: { id: validator.fileIdOrDocumentId },\n },\n response: validator.file,\n },\n ];\n});\n\nexport const routes = createRoutes;\n"],"names":["createRoutes","createContentApiRoutesFactory","validator","UploadRouteValidator","strapi","method","path","handler","request","query","id","fileIdOrDocumentId","optional","response","z","union","file","files","fields","queryFields","populate","queryPopulate","sort","querySort","pagination","filters","paginatedFiles","params","routes"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAKA,MAAMA,eAAeC,mCAAAA,CAA8B,IAAA;IACjD,MAAMC,SAAAA,GAAY,IAAIC,2BAAAA,CAAqBC,MAAAA,CAAAA;IAE3C,OAAO;AACL,QAAA;YACEC,MAAAA,EAAQ,MAAA;YACRC,IAAAA,EAAM,GAAA;YACNC,OAAAA,EAAS,oBAAA;YACTC,OAAAA,EAAS;gBACPC,KAAAA,EAAO;oBAAEC,EAAAA,EAAIR,SAAAA,CAAUS,kBAAkB,CAACC,QAAQ;AAAG;AAEvD,aAAA;YACAC,QAAAA,EAAUC,YAAAA,CAAEC,KAAK,CAAC;AAACb,gBAAAA,SAAAA,CAAUc,IAAI;AAAEd,gBAAAA,SAAAA,CAAUe;AAAM,aAAA;AACrD,SAAA;AACA,QAAA;YACEZ,MAAAA,EAAQ,KAAA;YACRC,IAAAA,EAAM,QAAA;YACNC,OAAAA,EAAS,kBAAA;YACTC,OAAAA,EAAS;gBACPC,KAAAA,EAAO;oBACLS,MAAAA,EAAQhB,SAAAA,CAAUiB,WAAW,CAACP,QAAQ,EAAA;oBACtCQ,QAAAA,EAAUlB,SAAAA,CAAUmB,aAAa,CAACT,QAAQ,EAAA;oBAC1CU,IAAAA,EAAMpB,SAAAA,CAAUqB,SAAS,CAACX,QAAQ,EAAA;oBAClCY,UAAAA,EAAYtB,SAAAA,CAAUsB,UAAU,CAACZ,QAAQ,EAAA;oBACzCa,OAAAA,EAASvB,SAAAA,CAAUuB,OAAO,CAACb,QAAQ;AACrC;AACF,aAAA;AACAC,YAAAA,QAAAA,EAAUX,UAAUe;AACtB,SAAA;AACA,QAAA;YACEZ,MAAAA,EAAQ,KAAA;YACRC,IAAAA,EAAM,aAAA;YACNC,OAAAA,EAAS,sBAAA;YACTC,OAAAA,EAAS;gBACPC,KAAAA,EAAO;oBACLS,MAAAA,EAAQhB,SAAAA,CAAUiB,WAAW,CAACP,QAAQ,EAAA;oBACtCQ,QAAAA,EAAUlB,SAAAA,CAAUmB,aAAa,CAACT,QAAQ,EAAA;oBAC1CU,IAAAA,EAAMpB,SAAAA,CAAUqB,SAAS,CAACX,QAAQ,EAAA;oBAClCY,UAAAA,EAAYtB,SAAAA,CAAUsB,UAAU,CAACZ,QAAQ,EAAA;oBACzCa,OAAAA,EAASvB,SAAAA,CAAUuB,OAAO,CAACb,QAAQ;AACrC;AACF,aAAA;AACAC,YAAAA,QAAAA,EAAUX,UAAUwB;AACtB,SAAA;AACA,QAAA;YACErB,MAAAA,EAAQ,KAAA;YACRC,IAAAA,EAAM,YAAA;YACNC,OAAAA,EAAS,qBAAA;YACTC,OAAAA,EAAS;gBACPmB,MAAAA,EAAQ;AAAEjB,oBAAAA,EAAAA,EAAIR,UAAUS;AAAmB,iBAAA;gBAC3CF,KAAAA,EAAO;oBACLS,MAAAA,EAAQhB,SAAAA,CAAUiB,WAAW,CAACP,QAAQ,EAAA;oBACtCQ,QAAAA,EAAUlB,SAAAA,CAAUmB,aAAa,CAACT,QAAQ;AAC5C;AACF,aAAA;AACAC,YAAAA,QAAAA,EAAUX,UAAUc;AACtB,SAAA;AACA,QAAA;YACEX,MAAAA,EAAQ,QAAA;YACRC,IAAAA,EAAM,YAAA;YACNC,OAAAA,EAAS,qBAAA;YACTC,OAAAA,EAAS;gBACPmB,MAAAA,EAAQ;AAAEjB,oBAAAA,EAAAA,EAAIR,UAAUS;AAAmB;AAC7C,aAAA;AACAE,YAAAA,QAAAA,EAAUX,UAAUc;AACtB;AACD,KAAA;AACH,CAAA,CAAA;AAEO,MAAMY,SAAS5B;;;;"}
@@ -11,7 +11,7 @@ const createRoutes = createContentApiRoutesFactory(()=>{
11
11
  handler: 'content-api.upload',
12
12
  request: {
13
13
  query: {
14
- id: validator.fileId.optional()
14
+ id: validator.fileIdOrDocumentId.optional()
15
15
  }
16
16
  },
17
17
  response: z.union([
@@ -55,7 +55,7 @@ const createRoutes = createContentApiRoutesFactory(()=>{
55
55
  handler: 'content-api.findOne',
56
56
  request: {
57
57
  params: {
58
- id: validator.fileId
58
+ id: validator.fileIdOrDocumentId
59
59
  },
60
60
  query: {
61
61
  fields: validator.queryFields.optional(),
@@ -70,7 +70,7 @@ const createRoutes = createContentApiRoutesFactory(()=>{
70
70
  handler: 'content-api.destroy',
71
71
  request: {
72
72
  params: {
73
- id: validator.fileId
73
+ id: validator.fileIdOrDocumentId
74
74
  }
75
75
  },
76
76
  response: validator.file
@@ -1 +1 @@
1
- {"version":3,"file":"content-api.mjs","sources":["../../../server/src/routes/content-api.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport * as z from 'zod/v4';\nimport { createContentApiRoutesFactory } from '@strapi/utils';\nimport { UploadRouteValidator } from './validation';\n\nconst createRoutes = createContentApiRoutesFactory((): Core.RouterInput['routes'] => {\n const validator = new UploadRouteValidator(strapi);\n\n return [\n {\n method: 'POST',\n path: '/',\n handler: 'content-api.upload',\n request: {\n query: { id: validator.fileId.optional() },\n // Note: multipart/form-data is handled by Koa middleware, not Zod\n },\n response: z.union([validator.file, validator.files]),\n },\n {\n method: 'GET',\n path: '/files',\n handler: 'content-api.find',\n request: {\n query: {\n fields: validator.queryFields.optional(),\n populate: validator.queryPopulate.optional(),\n sort: validator.querySort.optional(),\n pagination: validator.pagination.optional(),\n filters: validator.filters.optional(),\n },\n },\n response: validator.files,\n },\n {\n method: 'GET',\n path: '/files/page',\n handler: 'content-api.findPage',\n request: {\n query: {\n fields: validator.queryFields.optional(),\n populate: validator.queryPopulate.optional(),\n sort: validator.querySort.optional(),\n pagination: validator.pagination.optional(),\n filters: validator.filters.optional(),\n },\n },\n response: validator.paginatedFiles,\n },\n {\n method: 'GET',\n path: '/files/:id',\n handler: 'content-api.findOne',\n request: {\n params: { id: validator.fileId },\n query: {\n fields: validator.queryFields.optional(),\n populate: validator.queryPopulate.optional(),\n },\n },\n response: validator.file,\n },\n {\n method: 'DELETE',\n path: '/files/:id',\n handler: 'content-api.destroy',\n request: {\n params: { id: validator.fileId },\n },\n response: validator.file,\n },\n ];\n});\n\nexport const routes = createRoutes;\n"],"names":["createRoutes","createContentApiRoutesFactory","validator","UploadRouteValidator","strapi","method","path","handler","request","query","id","fileId","optional","response","z","union","file","files","fields","queryFields","populate","queryPopulate","sort","querySort","pagination","filters","paginatedFiles","params","routes"],"mappings":";;;;AAKA,MAAMA,eAAeC,6BAAAA,CAA8B,IAAA;IACjD,MAAMC,SAAAA,GAAY,IAAIC,oBAAAA,CAAqBC,MAAAA,CAAAA;IAE3C,OAAO;AACL,QAAA;YACEC,MAAAA,EAAQ,MAAA;YACRC,IAAAA,EAAM,GAAA;YACNC,OAAAA,EAAS,oBAAA;YACTC,OAAAA,EAAS;gBACPC,KAAAA,EAAO;oBAAEC,EAAAA,EAAIR,SAAAA,CAAUS,MAAM,CAACC,QAAQ;AAAG;AAE3C,aAAA;YACAC,QAAAA,EAAUC,CAAAA,CAAEC,KAAK,CAAC;AAACb,gBAAAA,SAAAA,CAAUc,IAAI;AAAEd,gBAAAA,SAAAA,CAAUe;AAAM,aAAA;AACrD,SAAA;AACA,QAAA;YACEZ,MAAAA,EAAQ,KAAA;YACRC,IAAAA,EAAM,QAAA;YACNC,OAAAA,EAAS,kBAAA;YACTC,OAAAA,EAAS;gBACPC,KAAAA,EAAO;oBACLS,MAAAA,EAAQhB,SAAAA,CAAUiB,WAAW,CAACP,QAAQ,EAAA;oBACtCQ,QAAAA,EAAUlB,SAAAA,CAAUmB,aAAa,CAACT,QAAQ,EAAA;oBAC1CU,IAAAA,EAAMpB,SAAAA,CAAUqB,SAAS,CAACX,QAAQ,EAAA;oBAClCY,UAAAA,EAAYtB,SAAAA,CAAUsB,UAAU,CAACZ,QAAQ,EAAA;oBACzCa,OAAAA,EAASvB,SAAAA,CAAUuB,OAAO,CAACb,QAAQ;AACrC;AACF,aAAA;AACAC,YAAAA,QAAAA,EAAUX,UAAUe;AACtB,SAAA;AACA,QAAA;YACEZ,MAAAA,EAAQ,KAAA;YACRC,IAAAA,EAAM,aAAA;YACNC,OAAAA,EAAS,sBAAA;YACTC,OAAAA,EAAS;gBACPC,KAAAA,EAAO;oBACLS,MAAAA,EAAQhB,SAAAA,CAAUiB,WAAW,CAACP,QAAQ,EAAA;oBACtCQ,QAAAA,EAAUlB,SAAAA,CAAUmB,aAAa,CAACT,QAAQ,EAAA;oBAC1CU,IAAAA,EAAMpB,SAAAA,CAAUqB,SAAS,CAACX,QAAQ,EAAA;oBAClCY,UAAAA,EAAYtB,SAAAA,CAAUsB,UAAU,CAACZ,QAAQ,EAAA;oBACzCa,OAAAA,EAASvB,SAAAA,CAAUuB,OAAO,CAACb,QAAQ;AACrC;AACF,aAAA;AACAC,YAAAA,QAAAA,EAAUX,UAAUwB;AACtB,SAAA;AACA,QAAA;YACErB,MAAAA,EAAQ,KAAA;YACRC,IAAAA,EAAM,YAAA;YACNC,OAAAA,EAAS,qBAAA;YACTC,OAAAA,EAAS;gBACPmB,MAAAA,EAAQ;AAAEjB,oBAAAA,EAAAA,EAAIR,UAAUS;AAAO,iBAAA;gBAC/BF,KAAAA,EAAO;oBACLS,MAAAA,EAAQhB,SAAAA,CAAUiB,WAAW,CAACP,QAAQ,EAAA;oBACtCQ,QAAAA,EAAUlB,SAAAA,CAAUmB,aAAa,CAACT,QAAQ;AAC5C;AACF,aAAA;AACAC,YAAAA,QAAAA,EAAUX,UAAUc;AACtB,SAAA;AACA,QAAA;YACEX,MAAAA,EAAQ,QAAA;YACRC,IAAAA,EAAM,YAAA;YACNC,OAAAA,EAAS,qBAAA;YACTC,OAAAA,EAAS;gBACPmB,MAAAA,EAAQ;AAAEjB,oBAAAA,EAAAA,EAAIR,UAAUS;AAAO;AACjC,aAAA;AACAE,YAAAA,QAAAA,EAAUX,UAAUc;AACtB;AACD,KAAA;AACH,CAAA,CAAA;AAEO,MAAMY,SAAS5B;;;;"}
1
+ {"version":3,"file":"content-api.mjs","sources":["../../../server/src/routes/content-api.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport * as z from 'zod/v4';\nimport { createContentApiRoutesFactory } from '@strapi/utils';\nimport { UploadRouteValidator } from './validation';\n\nconst createRoutes = createContentApiRoutesFactory((): Core.RouterInput['routes'] => {\n const validator = new UploadRouteValidator(strapi);\n\n return [\n {\n method: 'POST',\n path: '/',\n handler: 'content-api.upload',\n request: {\n query: { id: validator.fileIdOrDocumentId.optional() },\n // Note: multipart/form-data is handled by Koa middleware, not Zod\n },\n response: z.union([validator.file, validator.files]),\n },\n {\n method: 'GET',\n path: '/files',\n handler: 'content-api.find',\n request: {\n query: {\n fields: validator.queryFields.optional(),\n populate: validator.queryPopulate.optional(),\n sort: validator.querySort.optional(),\n pagination: validator.pagination.optional(),\n filters: validator.filters.optional(),\n },\n },\n response: validator.files,\n },\n {\n method: 'GET',\n path: '/files/page',\n handler: 'content-api.findPage',\n request: {\n query: {\n fields: validator.queryFields.optional(),\n populate: validator.queryPopulate.optional(),\n sort: validator.querySort.optional(),\n pagination: validator.pagination.optional(),\n filters: validator.filters.optional(),\n },\n },\n response: validator.paginatedFiles,\n },\n {\n method: 'GET',\n path: '/files/:id',\n handler: 'content-api.findOne',\n request: {\n params: { id: validator.fileIdOrDocumentId },\n query: {\n fields: validator.queryFields.optional(),\n populate: validator.queryPopulate.optional(),\n },\n },\n response: validator.file,\n },\n {\n method: 'DELETE',\n path: '/files/:id',\n handler: 'content-api.destroy',\n request: {\n params: { id: validator.fileIdOrDocumentId },\n },\n response: validator.file,\n },\n ];\n});\n\nexport const routes = createRoutes;\n"],"names":["createRoutes","createContentApiRoutesFactory","validator","UploadRouteValidator","strapi","method","path","handler","request","query","id","fileIdOrDocumentId","optional","response","z","union","file","files","fields","queryFields","populate","queryPopulate","sort","querySort","pagination","filters","paginatedFiles","params","routes"],"mappings":";;;;AAKA,MAAMA,eAAeC,6BAAAA,CAA8B,IAAA;IACjD,MAAMC,SAAAA,GAAY,IAAIC,oBAAAA,CAAqBC,MAAAA,CAAAA;IAE3C,OAAO;AACL,QAAA;YACEC,MAAAA,EAAQ,MAAA;YACRC,IAAAA,EAAM,GAAA;YACNC,OAAAA,EAAS,oBAAA;YACTC,OAAAA,EAAS;gBACPC,KAAAA,EAAO;oBAAEC,EAAAA,EAAIR,SAAAA,CAAUS,kBAAkB,CAACC,QAAQ;AAAG;AAEvD,aAAA;YACAC,QAAAA,EAAUC,CAAAA,CAAEC,KAAK,CAAC;AAACb,gBAAAA,SAAAA,CAAUc,IAAI;AAAEd,gBAAAA,SAAAA,CAAUe;AAAM,aAAA;AACrD,SAAA;AACA,QAAA;YACEZ,MAAAA,EAAQ,KAAA;YACRC,IAAAA,EAAM,QAAA;YACNC,OAAAA,EAAS,kBAAA;YACTC,OAAAA,EAAS;gBACPC,KAAAA,EAAO;oBACLS,MAAAA,EAAQhB,SAAAA,CAAUiB,WAAW,CAACP,QAAQ,EAAA;oBACtCQ,QAAAA,EAAUlB,SAAAA,CAAUmB,aAAa,CAACT,QAAQ,EAAA;oBAC1CU,IAAAA,EAAMpB,SAAAA,CAAUqB,SAAS,CAACX,QAAQ,EAAA;oBAClCY,UAAAA,EAAYtB,SAAAA,CAAUsB,UAAU,CAACZ,QAAQ,EAAA;oBACzCa,OAAAA,EAASvB,SAAAA,CAAUuB,OAAO,CAACb,QAAQ;AACrC;AACF,aAAA;AACAC,YAAAA,QAAAA,EAAUX,UAAUe;AACtB,SAAA;AACA,QAAA;YACEZ,MAAAA,EAAQ,KAAA;YACRC,IAAAA,EAAM,aAAA;YACNC,OAAAA,EAAS,sBAAA;YACTC,OAAAA,EAAS;gBACPC,KAAAA,EAAO;oBACLS,MAAAA,EAAQhB,SAAAA,CAAUiB,WAAW,CAACP,QAAQ,EAAA;oBACtCQ,QAAAA,EAAUlB,SAAAA,CAAUmB,aAAa,CAACT,QAAQ,EAAA;oBAC1CU,IAAAA,EAAMpB,SAAAA,CAAUqB,SAAS,CAACX,QAAQ,EAAA;oBAClCY,UAAAA,EAAYtB,SAAAA,CAAUsB,UAAU,CAACZ,QAAQ,EAAA;oBACzCa,OAAAA,EAASvB,SAAAA,CAAUuB,OAAO,CAACb,QAAQ;AACrC;AACF,aAAA;AACAC,YAAAA,QAAAA,EAAUX,UAAUwB;AACtB,SAAA;AACA,QAAA;YACErB,MAAAA,EAAQ,KAAA;YACRC,IAAAA,EAAM,YAAA;YACNC,OAAAA,EAAS,qBAAA;YACTC,OAAAA,EAAS;gBACPmB,MAAAA,EAAQ;AAAEjB,oBAAAA,EAAAA,EAAIR,UAAUS;AAAmB,iBAAA;gBAC3CF,KAAAA,EAAO;oBACLS,MAAAA,EAAQhB,SAAAA,CAAUiB,WAAW,CAACP,QAAQ,EAAA;oBACtCQ,QAAAA,EAAUlB,SAAAA,CAAUmB,aAAa,CAACT,QAAQ;AAC5C;AACF,aAAA;AACAC,YAAAA,QAAAA,EAAUX,UAAUc;AACtB,SAAA;AACA,QAAA;YACEX,MAAAA,EAAQ,QAAA;YACRC,IAAAA,EAAM,YAAA;YACNC,OAAAA,EAAS,qBAAA;YACTC,OAAAA,EAAS;gBACPmB,MAAAA,EAAQ;AAAEjB,oBAAAA,EAAAA,EAAIR,UAAUS;AAAmB;AAC7C,aAAA;AACAE,YAAAA,QAAAA,EAAUX,UAAUc;AACtB;AACD,KAAA;AACH,CAAA,CAAA;AAEO,MAAMY,SAAS5B;;;;"}
@@ -97,6 +97,14 @@ var z__namespace = /*#__PURE__*/_interopNamespace(z);
97
97
  return z__namespace.number().int().positive();
98
98
  }
99
99
  /**
100
+ * Content API file lookup parameter: a numeric id or a documentId
101
+ */ get fileIdOrDocumentId() {
102
+ return z__namespace.union([
103
+ this.fileId,
104
+ z__namespace.string()
105
+ ]);
106
+ }
107
+ /**
100
108
  * Upload request body schema for single file uploads
101
109
  */ get uploadBody() {
102
110
  return z__namespace.object({
@@ -1 +1 @@
1
- {"version":3,"file":"upload.js","sources":["../../../../server/src/routes/validation/upload.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport { AbstractRouteValidator, type QueryParam } from '@strapi/utils';\nimport * as z from 'zod/v4';\n\nexport type FileQueryParam = QueryParam;\n\n/**\n * UploadRouteValidator provides validation for upload/file routes.\n *\n * Extends the AbstractRouteValidator to inherit common query parameter validation\n * while adding file-specific validation schemas.\n */\nexport class UploadRouteValidator extends AbstractRouteValidator {\n protected readonly _strapi: Core.Strapi;\n\n public constructor(strapi: Core.Strapi) {\n super();\n this._strapi = strapi;\n }\n\n /**\n * File schema for upload responses\n * Defines the structure of a file object returned by the upload API\n */\n get file() {\n return z.object({\n id: this.fileId,\n documentId: z.uuid(),\n name: z.string(),\n alternativeText: z.string().nullable().optional(),\n caption: z.string().nullable().optional(),\n width: z.number().int().optional(),\n height: z.number().int().optional(),\n formats: z.record(z.string(), z.unknown()).optional(),\n hash: z.string(),\n ext: z.string().optional(),\n mime: z.string(),\n size: z.number(),\n url: z.string(),\n previewUrl: z.string().nullable().optional(),\n folder: z.number().optional(),\n folderPath: z.string(),\n provider: z.string(),\n provider_metadata: z.record(z.string(), z.unknown()).nullable().optional(),\n createdAt: z.string(),\n updatedAt: z.string(),\n createdBy: z.number().optional(),\n updatedBy: z.number().optional(),\n });\n }\n\n /**\n * Array of files schema\n */\n get files() {\n return z.array(this.file);\n }\n\n /**\n * Paginated files response schema: `{ data, meta: { pagination } }`.\n *\n * Pagination meta is either page-based (`page`/`pageSize`) or offset-based\n * (`start`/`limit`), and `total`/`pageCount` are omitted when\n * `pagination[withCount]=false`.\n */\n get paginatedFiles() {\n const pagedPagination = z.object({\n page: z.number().int(),\n pageSize: z.number().int(),\n pageCount: z.number().int().optional(),\n total: z.number().int().optional(),\n });\n\n const offsetPagination = z.object({\n start: z.number().int(),\n limit: z.number().int(),\n total: z.number().int().optional(),\n });\n\n return z.object({\n data: this.files,\n meta: z.object({\n pagination: z.union([pagedPagination, offsetPagination]),\n }),\n });\n }\n\n /**\n * File ID parameter validation\n */\n get fileId() {\n return z.number().int().positive();\n }\n\n /**\n * Upload request body schema for single file uploads\n */\n get uploadBody() {\n return z.object({\n fileInfo: z\n .object({\n name: z.string().optional(),\n alternativeText: z.string().optional(),\n caption: z.string().optional(),\n })\n .optional(),\n });\n }\n\n /**\n * Upload request body schema for multiple file uploads\n */\n get multiUploadBody() {\n return z.object({\n fileInfo: z\n .array(\n z.object({\n name: z.string().optional(),\n alternativeText: z.string().optional(),\n caption: z.string().optional(),\n })\n )\n .optional(),\n });\n }\n\n // Note: queryParams() method is inherited from AbstractRouteValidator\n // and provides validation for ['fields', 'populate', 'sort', 'pagination', 'filters']\n}\n"],"names":["UploadRouteValidator","AbstractRouteValidator","file","z","object","id","fileId","documentId","uuid","name","string","alternativeText","nullable","optional","caption","width","number","int","height","formats","record","unknown","hash","ext","mime","size","url","previewUrl","folder","folderPath","provider","provider_metadata","createdAt","updatedAt","createdBy","updatedBy","files","array","paginatedFiles","pagedPagination","page","pageSize","pageCount","total","offsetPagination","start","limit","data","meta","pagination","union","positive","uploadBody","fileInfo","multiUploadBody","strapi","_strapi"],"mappings":"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"}
1
+ {"version":3,"file":"upload.js","sources":["../../../../server/src/routes/validation/upload.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport { AbstractRouteValidator, type QueryParam } from '@strapi/utils';\nimport * as z from 'zod/v4';\n\nexport type FileQueryParam = QueryParam;\n\n/**\n * UploadRouteValidator provides validation for upload/file routes.\n *\n * Extends the AbstractRouteValidator to inherit common query parameter validation\n * while adding file-specific validation schemas.\n */\nexport class UploadRouteValidator extends AbstractRouteValidator {\n protected readonly _strapi: Core.Strapi;\n\n public constructor(strapi: Core.Strapi) {\n super();\n this._strapi = strapi;\n }\n\n /**\n * File schema for upload responses\n * Defines the structure of a file object returned by the upload API\n */\n get file() {\n return z.object({\n id: this.fileId,\n documentId: z.uuid(),\n name: z.string(),\n alternativeText: z.string().nullable().optional(),\n caption: z.string().nullable().optional(),\n width: z.number().int().optional(),\n height: z.number().int().optional(),\n formats: z.record(z.string(), z.unknown()).optional(),\n hash: z.string(),\n ext: z.string().optional(),\n mime: z.string(),\n size: z.number(),\n url: z.string(),\n previewUrl: z.string().nullable().optional(),\n folder: z.number().optional(),\n folderPath: z.string(),\n provider: z.string(),\n provider_metadata: z.record(z.string(), z.unknown()).nullable().optional(),\n createdAt: z.string(),\n updatedAt: z.string(),\n createdBy: z.number().optional(),\n updatedBy: z.number().optional(),\n });\n }\n\n /**\n * Array of files schema\n */\n get files() {\n return z.array(this.file);\n }\n\n /**\n * Paginated files response schema: `{ data, meta: { pagination } }`.\n *\n * Pagination meta is either page-based (`page`/`pageSize`) or offset-based\n * (`start`/`limit`), and `total`/`pageCount` are omitted when\n * `pagination[withCount]=false`.\n */\n get paginatedFiles() {\n const pagedPagination = z.object({\n page: z.number().int(),\n pageSize: z.number().int(),\n pageCount: z.number().int().optional(),\n total: z.number().int().optional(),\n });\n\n const offsetPagination = z.object({\n start: z.number().int(),\n limit: z.number().int(),\n total: z.number().int().optional(),\n });\n\n return z.object({\n data: this.files,\n meta: z.object({\n pagination: z.union([pagedPagination, offsetPagination]),\n }),\n });\n }\n\n /**\n * File ID parameter validation\n */\n get fileId() {\n return z.number().int().positive();\n }\n\n /**\n * Content API file lookup parameter: a numeric id or a documentId\n */\n get fileIdOrDocumentId() {\n return z.union([this.fileId, z.string()]);\n }\n\n /**\n * Upload request body schema for single file uploads\n */\n get uploadBody() {\n return z.object({\n fileInfo: z\n .object({\n name: z.string().optional(),\n alternativeText: z.string().optional(),\n caption: z.string().optional(),\n })\n .optional(),\n });\n }\n\n /**\n * Upload request body schema for multiple file uploads\n */\n get multiUploadBody() {\n return z.object({\n fileInfo: z\n .array(\n z.object({\n name: z.string().optional(),\n alternativeText: z.string().optional(),\n caption: z.string().optional(),\n })\n )\n .optional(),\n });\n }\n\n // Note: queryParams() method is inherited from AbstractRouteValidator\n // and provides validation for ['fields', 'populate', 'sort', 'pagination', 'filters']\n}\n"],"names":["UploadRouteValidator","AbstractRouteValidator","file","z","object","id","fileId","documentId","uuid","name","string","alternativeText","nullable","optional","caption","width","number","int","height","formats","record","unknown","hash","ext","mime","size","url","previewUrl","folder","folderPath","provider","provider_metadata","createdAt","updatedAt","createdBy","updatedBy","files","array","paginatedFiles","pagedPagination","page","pageSize","pageCount","total","offsetPagination","start","limit","data","meta","pagination","union","positive","fileIdOrDocumentId","uploadBody","fileInfo","multiUploadBody","strapi","_strapi"],"mappings":"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"}
@@ -75,6 +75,14 @@ import * as z from 'zod/v4';
75
75
  return z.number().int().positive();
76
76
  }
77
77
  /**
78
+ * Content API file lookup parameter: a numeric id or a documentId
79
+ */ get fileIdOrDocumentId() {
80
+ return z.union([
81
+ this.fileId,
82
+ z.string()
83
+ ]);
84
+ }
85
+ /**
78
86
  * Upload request body schema for single file uploads
79
87
  */ get uploadBody() {
80
88
  return z.object({
@@ -1 +1 @@
1
- {"version":3,"file":"upload.mjs","sources":["../../../../server/src/routes/validation/upload.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport { AbstractRouteValidator, type QueryParam } from '@strapi/utils';\nimport * as z from 'zod/v4';\n\nexport type FileQueryParam = QueryParam;\n\n/**\n * UploadRouteValidator provides validation for upload/file routes.\n *\n * Extends the AbstractRouteValidator to inherit common query parameter validation\n * while adding file-specific validation schemas.\n */\nexport class UploadRouteValidator extends AbstractRouteValidator {\n protected readonly _strapi: Core.Strapi;\n\n public constructor(strapi: Core.Strapi) {\n super();\n this._strapi = strapi;\n }\n\n /**\n * File schema for upload responses\n * Defines the structure of a file object returned by the upload API\n */\n get file() {\n return z.object({\n id: this.fileId,\n documentId: z.uuid(),\n name: z.string(),\n alternativeText: z.string().nullable().optional(),\n caption: z.string().nullable().optional(),\n width: z.number().int().optional(),\n height: z.number().int().optional(),\n formats: z.record(z.string(), z.unknown()).optional(),\n hash: z.string(),\n ext: z.string().optional(),\n mime: z.string(),\n size: z.number(),\n url: z.string(),\n previewUrl: z.string().nullable().optional(),\n folder: z.number().optional(),\n folderPath: z.string(),\n provider: z.string(),\n provider_metadata: z.record(z.string(), z.unknown()).nullable().optional(),\n createdAt: z.string(),\n updatedAt: z.string(),\n createdBy: z.number().optional(),\n updatedBy: z.number().optional(),\n });\n }\n\n /**\n * Array of files schema\n */\n get files() {\n return z.array(this.file);\n }\n\n /**\n * Paginated files response schema: `{ data, meta: { pagination } }`.\n *\n * Pagination meta is either page-based (`page`/`pageSize`) or offset-based\n * (`start`/`limit`), and `total`/`pageCount` are omitted when\n * `pagination[withCount]=false`.\n */\n get paginatedFiles() {\n const pagedPagination = z.object({\n page: z.number().int(),\n pageSize: z.number().int(),\n pageCount: z.number().int().optional(),\n total: z.number().int().optional(),\n });\n\n const offsetPagination = z.object({\n start: z.number().int(),\n limit: z.number().int(),\n total: z.number().int().optional(),\n });\n\n return z.object({\n data: this.files,\n meta: z.object({\n pagination: z.union([pagedPagination, offsetPagination]),\n }),\n });\n }\n\n /**\n * File ID parameter validation\n */\n get fileId() {\n return z.number().int().positive();\n }\n\n /**\n * Upload request body schema for single file uploads\n */\n get uploadBody() {\n return z.object({\n fileInfo: z\n .object({\n name: z.string().optional(),\n alternativeText: z.string().optional(),\n caption: z.string().optional(),\n })\n .optional(),\n });\n }\n\n /**\n * Upload request body schema for multiple file uploads\n */\n get multiUploadBody() {\n return z.object({\n fileInfo: z\n .array(\n z.object({\n name: z.string().optional(),\n alternativeText: z.string().optional(),\n caption: z.string().optional(),\n })\n )\n .optional(),\n });\n }\n\n // Note: queryParams() method is inherited from AbstractRouteValidator\n // and provides validation for ['fields', 'populate', 'sort', 'pagination', 'filters']\n}\n"],"names":["UploadRouteValidator","AbstractRouteValidator","file","z","object","id","fileId","documentId","uuid","name","string","alternativeText","nullable","optional","caption","width","number","int","height","formats","record","unknown","hash","ext","mime","size","url","previewUrl","folder","folderPath","provider","provider_metadata","createdAt","updatedAt","createdBy","updatedBy","files","array","paginatedFiles","pagedPagination","page","pageSize","pageCount","total","offsetPagination","start","limit","data","meta","pagination","union","positive","uploadBody","fileInfo","multiUploadBody","strapi","_strapi"],"mappings":"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"}
1
+ {"version":3,"file":"upload.mjs","sources":["../../../../server/src/routes/validation/upload.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport { AbstractRouteValidator, type QueryParam } from '@strapi/utils';\nimport * as z from 'zod/v4';\n\nexport type FileQueryParam = QueryParam;\n\n/**\n * UploadRouteValidator provides validation for upload/file routes.\n *\n * Extends the AbstractRouteValidator to inherit common query parameter validation\n * while adding file-specific validation schemas.\n */\nexport class UploadRouteValidator extends AbstractRouteValidator {\n protected readonly _strapi: Core.Strapi;\n\n public constructor(strapi: Core.Strapi) {\n super();\n this._strapi = strapi;\n }\n\n /**\n * File schema for upload responses\n * Defines the structure of a file object returned by the upload API\n */\n get file() {\n return z.object({\n id: this.fileId,\n documentId: z.uuid(),\n name: z.string(),\n alternativeText: z.string().nullable().optional(),\n caption: z.string().nullable().optional(),\n width: z.number().int().optional(),\n height: z.number().int().optional(),\n formats: z.record(z.string(), z.unknown()).optional(),\n hash: z.string(),\n ext: z.string().optional(),\n mime: z.string(),\n size: z.number(),\n url: z.string(),\n previewUrl: z.string().nullable().optional(),\n folder: z.number().optional(),\n folderPath: z.string(),\n provider: z.string(),\n provider_metadata: z.record(z.string(), z.unknown()).nullable().optional(),\n createdAt: z.string(),\n updatedAt: z.string(),\n createdBy: z.number().optional(),\n updatedBy: z.number().optional(),\n });\n }\n\n /**\n * Array of files schema\n */\n get files() {\n return z.array(this.file);\n }\n\n /**\n * Paginated files response schema: `{ data, meta: { pagination } }`.\n *\n * Pagination meta is either page-based (`page`/`pageSize`) or offset-based\n * (`start`/`limit`), and `total`/`pageCount` are omitted when\n * `pagination[withCount]=false`.\n */\n get paginatedFiles() {\n const pagedPagination = z.object({\n page: z.number().int(),\n pageSize: z.number().int(),\n pageCount: z.number().int().optional(),\n total: z.number().int().optional(),\n });\n\n const offsetPagination = z.object({\n start: z.number().int(),\n limit: z.number().int(),\n total: z.number().int().optional(),\n });\n\n return z.object({\n data: this.files,\n meta: z.object({\n pagination: z.union([pagedPagination, offsetPagination]),\n }),\n });\n }\n\n /**\n * File ID parameter validation\n */\n get fileId() {\n return z.number().int().positive();\n }\n\n /**\n * Content API file lookup parameter: a numeric id or a documentId\n */\n get fileIdOrDocumentId() {\n return z.union([this.fileId, z.string()]);\n }\n\n /**\n * Upload request body schema for single file uploads\n */\n get uploadBody() {\n return z.object({\n fileInfo: z\n .object({\n name: z.string().optional(),\n alternativeText: z.string().optional(),\n caption: z.string().optional(),\n })\n .optional(),\n });\n }\n\n /**\n * Upload request body schema for multiple file uploads\n */\n get multiUploadBody() {\n return z.object({\n fileInfo: z\n .array(\n z.object({\n name: z.string().optional(),\n alternativeText: z.string().optional(),\n caption: z.string().optional(),\n })\n )\n .optional(),\n });\n }\n\n // Note: queryParams() method is inherited from AbstractRouteValidator\n // and provides validation for ['fields', 'populate', 'sort', 'pagination', 'filters']\n}\n"],"names":["UploadRouteValidator","AbstractRouteValidator","file","z","object","id","fileId","documentId","uuid","name","string","alternativeText","nullable","optional","caption","width","number","int","height","formats","record","unknown","hash","ext","mime","size","url","previewUrl","folder","folderPath","provider","provider_metadata","createdAt","updatedAt","createdBy","updatedBy","files","array","paginatedFiles","pagedPagination","page","pageSize","pageCount","total","offsetPagination","start","limit","data","meta","pagination","union","positive","fileIdOrDocumentId","uploadBody","fileInfo","multiUploadBody","strapi","_strapi"],"mappings":";;;AAMA;;;;;IAMO,MAAMA,oBAAAA,SAA6BC,sBAAAA,CAAAA;AAQxC;;;AAGC,MACD,IAAIC,IAAAA,GAAO;QACT,OAAOC,CAAAA,CAAEC,MAAM,CAAC;YACdC,EAAAA,EAAI,IAAI,CAACC,MAAM;AACfC,YAAAA,UAAAA,EAAYJ,EAAEK,IAAI,EAAA;AAClBC,YAAAA,IAAAA,EAAMN,EAAEO,MAAM,EAAA;AACdC,YAAAA,eAAAA,EAAiBR,CAAAA,CAAEO,MAAM,EAAA,CAAGE,QAAQ,GAAGC,QAAQ,EAAA;AAC/CC,YAAAA,OAAAA,EAASX,CAAAA,CAAEO,MAAM,EAAA,CAAGE,QAAQ,GAAGC,QAAQ,EAAA;AACvCE,YAAAA,KAAAA,EAAOZ,CAAAA,CAAEa,MAAM,EAAA,CAAGC,GAAG,GAAGJ,QAAQ,EAAA;AAChCK,YAAAA,MAAAA,EAAQf,CAAAA,CAAEa,MAAM,EAAA,CAAGC,GAAG,GAAGJ,QAAQ,EAAA;YACjCM,OAAAA,EAAShB,CAAAA,CAAEiB,MAAM,CAACjB,CAAAA,CAAEO,MAAM,EAAA,EAAIP,CAAAA,CAAEkB,OAAO,EAAA,CAAA,CAAIR,QAAQ,EAAA;AACnDS,YAAAA,IAAAA,EAAMnB,EAAEO,MAAM,EAAA;YACda,GAAAA,EAAKpB,CAAAA,CAAEO,MAAM,EAAA,CAAGG,QAAQ,EAAA;AACxBW,YAAAA,IAAAA,EAAMrB,EAAEO,MAAM,EAAA;AACde,YAAAA,IAAAA,EAAMtB,EAAEa,MAAM,EAAA;AACdU,YAAAA,GAAAA,EAAKvB,EAAEO,MAAM,EAAA;AACbiB,YAAAA,UAAAA,EAAYxB,CAAAA,CAAEO,MAAM,EAAA,CAAGE,QAAQ,GAAGC,QAAQ,EAAA;YAC1Ce,MAAAA,EAAQzB,CAAAA,CAAEa,MAAM,EAAA,CAAGH,QAAQ,EAAA;AAC3BgB,YAAAA,UAAAA,EAAY1B,EAAEO,MAAM,EAAA;AACpBoB,YAAAA,QAAAA,EAAU3B,EAAEO,MAAM,EAAA;YAClBqB,iBAAAA,EAAmB5B,CAAAA,CAAEiB,MAAM,CAACjB,CAAAA,CAAEO,MAAM,EAAA,EAAIP,CAAAA,CAAEkB,OAAO,EAAA,CAAA,CAAIT,QAAQ,EAAA,CAAGC,QAAQ,EAAA;AACxEmB,YAAAA,SAAAA,EAAW7B,EAAEO,MAAM,EAAA;AACnBuB,YAAAA,SAAAA,EAAW9B,EAAEO,MAAM,EAAA;YACnBwB,SAAAA,EAAW/B,CAAAA,CAAEa,MAAM,EAAA,CAAGH,QAAQ,EAAA;YAC9BsB,SAAAA,EAAWhC,CAAAA,CAAEa,MAAM,EAAA,CAAGH,QAAQ;AAChC,SAAA,CAAA;AACF,IAAA;AAEA;;AAEC,MACD,IAAIuB,KAAAA,GAAQ;AACV,QAAA,OAAOjC,CAAAA,CAAEkC,KAAK,CAAC,IAAI,CAACnC,IAAI,CAAA;AAC1B,IAAA;AAEA;;;;;;AAMC,MACD,IAAIoC,cAAAA,GAAiB;QACnB,MAAMC,eAAAA,GAAkBpC,CAAAA,CAAEC,MAAM,CAAC;YAC/BoC,IAAAA,EAAMrC,CAAAA,CAAEa,MAAM,EAAA,CAAGC,GAAG,EAAA;YACpBwB,QAAAA,EAAUtC,CAAAA,CAAEa,MAAM,EAAA,CAAGC,GAAG,EAAA;AACxByB,YAAAA,SAAAA,EAAWvC,CAAAA,CAAEa,MAAM,EAAA,CAAGC,GAAG,GAAGJ,QAAQ,EAAA;AACpC8B,YAAAA,KAAAA,EAAOxC,CAAAA,CAAEa,MAAM,EAAA,CAAGC,GAAG,GAAGJ,QAAQ;AAClC,SAAA,CAAA;QAEA,MAAM+B,gBAAAA,GAAmBzC,CAAAA,CAAEC,MAAM,CAAC;YAChCyC,KAAAA,EAAO1C,CAAAA,CAAEa,MAAM,EAAA,CAAGC,GAAG,EAAA;YACrB6B,KAAAA,EAAO3C,CAAAA,CAAEa,MAAM,EAAA,CAAGC,GAAG,EAAA;AACrB0B,YAAAA,KAAAA,EAAOxC,CAAAA,CAAEa,MAAM,EAAA,CAAGC,GAAG,GAAGJ,QAAQ;AAClC,SAAA,CAAA;QAEA,OAAOV,CAAAA,CAAEC,MAAM,CAAC;YACd2C,IAAAA,EAAM,IAAI,CAACX,KAAK;YAChBY,IAAAA,EAAM7C,CAAAA,CAAEC,MAAM,CAAC;gBACb6C,UAAAA,EAAY9C,CAAAA,CAAE+C,KAAK,CAAC;AAACX,oBAAAA,eAAAA;AAAiBK,oBAAAA;AAAiB,iBAAA;AACzD,aAAA;AACF,SAAA,CAAA;AACF,IAAA;AAEA;;AAEC,MACD,IAAItC,MAAAA,GAAS;AACX,QAAA,OAAOH,CAAAA,CAAEa,MAAM,EAAA,CAAGC,GAAG,GAAGkC,QAAQ,EAAA;AAClC,IAAA;AAEA;;AAEC,MACD,IAAIC,kBAAAA,GAAqB;QACvB,OAAOjD,CAAAA,CAAE+C,KAAK,CAAC;AAAC,YAAA,IAAI,CAAC5C,MAAM;AAAEH,YAAAA,CAAAA,CAAEO,MAAM;AAAG,SAAA,CAAA;AAC1C,IAAA;AAEA;;AAEC,MACD,IAAI2C,UAAAA,GAAa;QACf,OAAOlD,CAAAA,CAAEC,MAAM,CAAC;YACdkD,QAAAA,EAAUnD,CAAAA,CACPC,MAAM,CAAC;gBACNK,IAAAA,EAAMN,CAAAA,CAAEO,MAAM,EAAA,CAAGG,QAAQ,EAAA;gBACzBF,eAAAA,EAAiBR,CAAAA,CAAEO,MAAM,EAAA,CAAGG,QAAQ,EAAA;gBACpCC,OAAAA,EAASX,CAAAA,CAAEO,MAAM,EAAA,CAAGG,QAAQ;AAC9B,aAAA,CAAA,CACCA,QAAQ;AACb,SAAA,CAAA;AACF,IAAA;AAEA;;AAEC,MACD,IAAI0C,eAAAA,GAAkB;QACpB,OAAOpD,CAAAA,CAAEC,MAAM,CAAC;AACdkD,YAAAA,QAAAA,EAAUnD,CAAAA,CACPkC,KAAK,CACJlC,CAAAA,CAAEC,MAAM,CAAC;gBACPK,IAAAA,EAAMN,CAAAA,CAAEO,MAAM,EAAA,CAAGG,QAAQ,EAAA;gBACzBF,eAAAA,EAAiBR,CAAAA,CAAEO,MAAM,EAAA,CAAGG,QAAQ,EAAA;gBACpCC,OAAAA,EAASX,CAAAA,CAAEO,MAAM,EAAA,CAAGG,QAAQ;AAC9B,aAAA,CAAA,CAAA,CAEDA,QAAQ;AACb,SAAA,CAAA;AACF,IAAA;AApHA,IAAA,WAAA,CAAmB2C,MAAmB,CAAE;QACtC,KAAK,EAAA;QACL,IAAI,CAACC,OAAO,GAAGD,MAAAA;AACjB,IAAA;AAqHF;;;;"}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var fp = require('lodash/fp');
3
+ var _ = require('lodash');
4
4
  var index = require('../utils/index.js');
5
5
  var constants = require('../constants.js');
6
6
 
@@ -36,13 +36,13 @@ const createApiUploadFolder = async ()=>{
36
36
  };
37
37
  const getAPIUploadFolder = async ()=>{
38
38
  const storeValue = await getStore().get({});
39
- const folderId = fp.get('id', storeValue);
39
+ const folderId = _.get(storeValue, 'id');
40
40
  const folder = folderId ? await strapi.db.query(constants.FOLDER_MODEL_UID).findOne({
41
41
  where: {
42
42
  id: folderId
43
43
  }
44
44
  }) : null;
45
- return fp.isNil(folder) ? createApiUploadFolder() : folder;
45
+ return folder == null ? createApiUploadFolder() : folder;
46
46
  };
47
47
  var apiUploadFolder = {
48
48
  getAPIUploadFolder
@@ -1 +1 @@
1
- {"version":3,"file":"api-upload-folder.js","sources":["../../../server/src/services/api-upload-folder.ts"],"sourcesContent":["import { isNil, get } from 'lodash/fp';\nimport { getService } from '../utils';\nimport { FOLDER_MODEL_UID, API_UPLOAD_FOLDER_BASE_NAME } from '../constants';\n\nconst getStore = () => strapi.store({ type: 'plugin', name: 'upload', key: 'api-folder' });\n\nconst createApiUploadFolder = async () => {\n let name = API_UPLOAD_FOLDER_BASE_NAME;\n const folderService = getService('folder');\n\n let exists = true;\n let index = 1;\n while (exists) {\n exists = await folderService.exists({ name, parent: null });\n if (exists) {\n name = `${API_UPLOAD_FOLDER_BASE_NAME} (${index})`;\n index += 1;\n }\n }\n\n const folder = await folderService.create({ name });\n\n await getStore().set({ value: { id: folder.id } });\n\n return folder;\n};\n\nconst getAPIUploadFolder = async () => {\n const storeValue = await getStore().get({});\n const folderId = get('id', storeValue);\n\n const folder = folderId\n ? await strapi.db.query(FOLDER_MODEL_UID).findOne({ where: { id: folderId } })\n : null;\n\n return isNil(folder) ? createApiUploadFolder() : folder;\n};\n\nexport default {\n getAPIUploadFolder,\n};\n"],"names":["getStore","strapi","store","type","name","key","createApiUploadFolder","API_UPLOAD_FOLDER_BASE_NAME","folderService","getService","exists","index","parent","folder","create","set","value","id","getAPIUploadFolder","storeValue","get","folderId","db","query","FOLDER_MODEL_UID","findOne","where","isNil"],"mappings":";;;;;;AAIA,MAAMA,QAAAA,GAAW,IAAMC,MAAAA,CAAOC,KAAK,CAAC;QAAEC,IAAAA,EAAM,QAAA;QAAUC,IAAAA,EAAM,QAAA;QAAUC,GAAAA,EAAK;AAAa,KAAA,CAAA;AAExF,MAAMC,qBAAAA,GAAwB,UAAA;AAC5B,IAAA,IAAIF,IAAAA,GAAOG,qCAAAA;AACX,IAAA,MAAMC,gBAAgBC,gBAAAA,CAAW,QAAA,CAAA;AAEjC,IAAA,IAAIC,MAAAA,GAAS,IAAA;AACb,IAAA,IAAIC,OAAAA,GAAQ,CAAA;AACZ,IAAA,MAAOD,MAAAA,CAAQ;QACbA,MAAAA,GAAS,MAAMF,aAAAA,CAAcE,MAAM,CAAC;AAAEN,YAAAA,IAAAA;YAAMQ,MAAAA,EAAQ;AAAK,SAAA,CAAA;AACzD,QAAA,IAAIF,MAAAA,EAAQ;AACVN,YAAAA,IAAAA,GAAO,GAAGG,qCAAAA,CAA4B,EAAE,EAAEI,OAAAA,CAAM,CAAC,CAAC;YAClDA,OAAAA,IAAS,CAAA;AACX,QAAA;AACF,IAAA;AAEA,IAAA,MAAME,MAAAA,GAAS,MAAML,aAAAA,CAAcM,MAAM,CAAC;AAAEV,QAAAA;AAAK,KAAA,CAAA;IAEjD,MAAMJ,QAAAA,EAAAA,CAAWe,GAAG,CAAC;QAAEC,KAAAA,EAAO;AAAEC,YAAAA,EAAAA,EAAIJ,OAAOI;AAAG;AAAE,KAAA,CAAA;IAEhD,OAAOJ,MAAAA;AACT,CAAA;AAEA,MAAMK,kBAAAA,GAAqB,UAAA;AACzB,IAAA,MAAMC,UAAAA,GAAa,MAAMnB,QAAAA,EAAAA,CAAWoB,GAAG,CAAC,EAAC,CAAA;IACzC,MAAMC,QAAAA,GAAWD,OAAI,IAAA,EAAMD,UAAAA,CAAAA;IAE3B,MAAMN,MAAAA,GAASQ,QAAAA,GACX,MAAMpB,MAAAA,CAAOqB,EAAE,CAACC,KAAK,CAACC,0BAAAA,CAAAA,CAAkBC,OAAO,CAAC;QAAEC,KAAAA,EAAO;YAAET,EAAAA,EAAII;AAAS;KAAE,CAAA,GAC1E,IAAA;IAEJ,OAAOM,QAAAA,CAAMd,UAAUP,qBAAAA,EAAAA,GAA0BO,MAAAA;AACnD,CAAA;AAEA,sBAAe;AACbK,IAAAA;AACF,CAAA;;;;"}
1
+ {"version":3,"file":"api-upload-folder.js","sources":["../../../server/src/services/api-upload-folder.ts"],"sourcesContent":["import { get } from 'lodash';\nimport { getService } from '../utils';\nimport { FOLDER_MODEL_UID, API_UPLOAD_FOLDER_BASE_NAME } from '../constants';\n\nconst getStore = () => strapi.store({ type: 'plugin', name: 'upload', key: 'api-folder' });\n\nconst createApiUploadFolder = async () => {\n let name = API_UPLOAD_FOLDER_BASE_NAME;\n const folderService = getService('folder');\n\n let exists = true;\n let index = 1;\n while (exists) {\n exists = await folderService.exists({ name, parent: null });\n if (exists) {\n name = `${API_UPLOAD_FOLDER_BASE_NAME} (${index})`;\n index += 1;\n }\n }\n\n const folder = await folderService.create({ name });\n\n await getStore().set({ value: { id: folder.id } });\n\n return folder;\n};\n\nconst getAPIUploadFolder = async () => {\n const storeValue = await getStore().get({});\n const folderId = get(storeValue, 'id');\n\n const folder = folderId\n ? await strapi.db.query(FOLDER_MODEL_UID).findOne({ where: { id: folderId } })\n : null;\n\n return folder == null ? createApiUploadFolder() : folder;\n};\n\nexport default {\n getAPIUploadFolder,\n};\n"],"names":["getStore","strapi","store","type","name","key","createApiUploadFolder","API_UPLOAD_FOLDER_BASE_NAME","folderService","getService","exists","index","parent","folder","create","set","value","id","getAPIUploadFolder","storeValue","get","folderId","db","query","FOLDER_MODEL_UID","findOne","where"],"mappings":";;;;;;AAIA,MAAMA,QAAAA,GAAW,IAAMC,MAAAA,CAAOC,KAAK,CAAC;QAAEC,IAAAA,EAAM,QAAA;QAAUC,IAAAA,EAAM,QAAA;QAAUC,GAAAA,EAAK;AAAa,KAAA,CAAA;AAExF,MAAMC,qBAAAA,GAAwB,UAAA;AAC5B,IAAA,IAAIF,IAAAA,GAAOG,qCAAAA;AACX,IAAA,MAAMC,gBAAgBC,gBAAAA,CAAW,QAAA,CAAA;AAEjC,IAAA,IAAIC,MAAAA,GAAS,IAAA;AACb,IAAA,IAAIC,OAAAA,GAAQ,CAAA;AACZ,IAAA,MAAOD,MAAAA,CAAQ;QACbA,MAAAA,GAAS,MAAMF,aAAAA,CAAcE,MAAM,CAAC;AAAEN,YAAAA,IAAAA;YAAMQ,MAAAA,EAAQ;AAAK,SAAA,CAAA;AACzD,QAAA,IAAIF,MAAAA,EAAQ;AACVN,YAAAA,IAAAA,GAAO,GAAGG,qCAAAA,CAA4B,EAAE,EAAEI,OAAAA,CAAM,CAAC,CAAC;YAClDA,OAAAA,IAAS,CAAA;AACX,QAAA;AACF,IAAA;AAEA,IAAA,MAAME,MAAAA,GAAS,MAAML,aAAAA,CAAcM,MAAM,CAAC;AAAEV,QAAAA;AAAK,KAAA,CAAA;IAEjD,MAAMJ,QAAAA,EAAAA,CAAWe,GAAG,CAAC;QAAEC,KAAAA,EAAO;AAAEC,YAAAA,EAAAA,EAAIJ,OAAOI;AAAG;AAAE,KAAA,CAAA;IAEhD,OAAOJ,MAAAA;AACT,CAAA;AAEA,MAAMK,kBAAAA,GAAqB,UAAA;AACzB,IAAA,MAAMC,UAAAA,GAAa,MAAMnB,QAAAA,EAAAA,CAAWoB,GAAG,CAAC,EAAC,CAAA;IACzC,MAAMC,QAAAA,GAAWD,MAAID,UAAAA,EAAY,IAAA,CAAA;IAEjC,MAAMN,MAAAA,GAASQ,QAAAA,GACX,MAAMpB,MAAAA,CAAOqB,EAAE,CAACC,KAAK,CAACC,0BAAAA,CAAAA,CAAkBC,OAAO,CAAC;QAAEC,KAAAA,EAAO;YAAET,EAAAA,EAAII;AAAS;KAAE,CAAA,GAC1E,IAAA;IAEJ,OAAOR,MAAAA,IAAU,OAAOP,qBAAAA,EAAAA,GAA0BO,MAAAA;AACpD,CAAA;AAEA,sBAAe;AACbK,IAAAA;AACF,CAAA;;;;"}
@@ -1,4 +1,4 @@
1
- import { get, isNil } from 'lodash/fp';
1
+ import { get } from 'lodash';
2
2
  import { getService } from '../utils/index.mjs';
3
3
  import { FOLDER_MODEL_UID, API_UPLOAD_FOLDER_BASE_NAME } from '../constants.mjs';
4
4
 
@@ -34,13 +34,13 @@ const createApiUploadFolder = async ()=>{
34
34
  };
35
35
  const getAPIUploadFolder = async ()=>{
36
36
  const storeValue = await getStore().get({});
37
- const folderId = get('id', storeValue);
37
+ const folderId = get(storeValue, 'id');
38
38
  const folder = folderId ? await strapi.db.query(FOLDER_MODEL_UID).findOne({
39
39
  where: {
40
40
  id: folderId
41
41
  }
42
42
  }) : null;
43
- return isNil(folder) ? createApiUploadFolder() : folder;
43
+ return folder == null ? createApiUploadFolder() : folder;
44
44
  };
45
45
  var apiUploadFolder = {
46
46
  getAPIUploadFolder
@@ -1 +1 @@
1
- {"version":3,"file":"api-upload-folder.mjs","sources":["../../../server/src/services/api-upload-folder.ts"],"sourcesContent":["import { isNil, get } from 'lodash/fp';\nimport { getService } from '../utils';\nimport { FOLDER_MODEL_UID, API_UPLOAD_FOLDER_BASE_NAME } from '../constants';\n\nconst getStore = () => strapi.store({ type: 'plugin', name: 'upload', key: 'api-folder' });\n\nconst createApiUploadFolder = async () => {\n let name = API_UPLOAD_FOLDER_BASE_NAME;\n const folderService = getService('folder');\n\n let exists = true;\n let index = 1;\n while (exists) {\n exists = await folderService.exists({ name, parent: null });\n if (exists) {\n name = `${API_UPLOAD_FOLDER_BASE_NAME} (${index})`;\n index += 1;\n }\n }\n\n const folder = await folderService.create({ name });\n\n await getStore().set({ value: { id: folder.id } });\n\n return folder;\n};\n\nconst getAPIUploadFolder = async () => {\n const storeValue = await getStore().get({});\n const folderId = get('id', storeValue);\n\n const folder = folderId\n ? await strapi.db.query(FOLDER_MODEL_UID).findOne({ where: { id: folderId } })\n : null;\n\n return isNil(folder) ? createApiUploadFolder() : folder;\n};\n\nexport default {\n getAPIUploadFolder,\n};\n"],"names":["getStore","strapi","store","type","name","key","createApiUploadFolder","API_UPLOAD_FOLDER_BASE_NAME","folderService","getService","exists","index","parent","folder","create","set","value","id","getAPIUploadFolder","storeValue","get","folderId","db","query","FOLDER_MODEL_UID","findOne","where","isNil"],"mappings":";;;;AAIA,MAAMA,QAAAA,GAAW,IAAMC,MAAAA,CAAOC,KAAK,CAAC;QAAEC,IAAAA,EAAM,QAAA;QAAUC,IAAAA,EAAM,QAAA;QAAUC,GAAAA,EAAK;AAAa,KAAA,CAAA;AAExF,MAAMC,qBAAAA,GAAwB,UAAA;AAC5B,IAAA,IAAIF,IAAAA,GAAOG,2BAAAA;AACX,IAAA,MAAMC,gBAAgBC,UAAAA,CAAW,QAAA,CAAA;AAEjC,IAAA,IAAIC,MAAAA,GAAS,IAAA;AACb,IAAA,IAAIC,KAAAA,GAAQ,CAAA;AACZ,IAAA,MAAOD,MAAAA,CAAQ;QACbA,MAAAA,GAAS,MAAMF,aAAAA,CAAcE,MAAM,CAAC;AAAEN,YAAAA,IAAAA;YAAMQ,MAAAA,EAAQ;AAAK,SAAA,CAAA;AACzD,QAAA,IAAIF,MAAAA,EAAQ;AACVN,YAAAA,IAAAA,GAAO,GAAGG,2BAAAA,CAA4B,EAAE,EAAEI,KAAAA,CAAM,CAAC,CAAC;YAClDA,KAAAA,IAAS,CAAA;AACX,QAAA;AACF,IAAA;AAEA,IAAA,MAAME,MAAAA,GAAS,MAAML,aAAAA,CAAcM,MAAM,CAAC;AAAEV,QAAAA;AAAK,KAAA,CAAA;IAEjD,MAAMJ,QAAAA,EAAAA,CAAWe,GAAG,CAAC;QAAEC,KAAAA,EAAO;AAAEC,YAAAA,EAAAA,EAAIJ,OAAOI;AAAG;AAAE,KAAA,CAAA;IAEhD,OAAOJ,MAAAA;AACT,CAAA;AAEA,MAAMK,kBAAAA,GAAqB,UAAA;AACzB,IAAA,MAAMC,UAAAA,GAAa,MAAMnB,QAAAA,EAAAA,CAAWoB,GAAG,CAAC,EAAC,CAAA;IACzC,MAAMC,QAAAA,GAAWD,IAAI,IAAA,EAAMD,UAAAA,CAAAA;IAE3B,MAAMN,MAAAA,GAASQ,QAAAA,GACX,MAAMpB,MAAAA,CAAOqB,EAAE,CAACC,KAAK,CAACC,gBAAAA,CAAAA,CAAkBC,OAAO,CAAC;QAAEC,KAAAA,EAAO;YAAET,EAAAA,EAAII;AAAS;KAAE,CAAA,GAC1E,IAAA;IAEJ,OAAOM,KAAAA,CAAMd,UAAUP,qBAAAA,EAAAA,GAA0BO,MAAAA;AACnD,CAAA;AAEA,sBAAe;AACbK,IAAAA;AACF,CAAA;;;;"}
1
+ {"version":3,"file":"api-upload-folder.mjs","sources":["../../../server/src/services/api-upload-folder.ts"],"sourcesContent":["import { get } from 'lodash';\nimport { getService } from '../utils';\nimport { FOLDER_MODEL_UID, API_UPLOAD_FOLDER_BASE_NAME } from '../constants';\n\nconst getStore = () => strapi.store({ type: 'plugin', name: 'upload', key: 'api-folder' });\n\nconst createApiUploadFolder = async () => {\n let name = API_UPLOAD_FOLDER_BASE_NAME;\n const folderService = getService('folder');\n\n let exists = true;\n let index = 1;\n while (exists) {\n exists = await folderService.exists({ name, parent: null });\n if (exists) {\n name = `${API_UPLOAD_FOLDER_BASE_NAME} (${index})`;\n index += 1;\n }\n }\n\n const folder = await folderService.create({ name });\n\n await getStore().set({ value: { id: folder.id } });\n\n return folder;\n};\n\nconst getAPIUploadFolder = async () => {\n const storeValue = await getStore().get({});\n const folderId = get(storeValue, 'id');\n\n const folder = folderId\n ? await strapi.db.query(FOLDER_MODEL_UID).findOne({ where: { id: folderId } })\n : null;\n\n return folder == null ? createApiUploadFolder() : folder;\n};\n\nexport default {\n getAPIUploadFolder,\n};\n"],"names":["getStore","strapi","store","type","name","key","createApiUploadFolder","API_UPLOAD_FOLDER_BASE_NAME","folderService","getService","exists","index","parent","folder","create","set","value","id","getAPIUploadFolder","storeValue","get","folderId","db","query","FOLDER_MODEL_UID","findOne","where"],"mappings":";;;;AAIA,MAAMA,QAAAA,GAAW,IAAMC,MAAAA,CAAOC,KAAK,CAAC;QAAEC,IAAAA,EAAM,QAAA;QAAUC,IAAAA,EAAM,QAAA;QAAUC,GAAAA,EAAK;AAAa,KAAA,CAAA;AAExF,MAAMC,qBAAAA,GAAwB,UAAA;AAC5B,IAAA,IAAIF,IAAAA,GAAOG,2BAAAA;AACX,IAAA,MAAMC,gBAAgBC,UAAAA,CAAW,QAAA,CAAA;AAEjC,IAAA,IAAIC,MAAAA,GAAS,IAAA;AACb,IAAA,IAAIC,KAAAA,GAAQ,CAAA;AACZ,IAAA,MAAOD,MAAAA,CAAQ;QACbA,MAAAA,GAAS,MAAMF,aAAAA,CAAcE,MAAM,CAAC;AAAEN,YAAAA,IAAAA;YAAMQ,MAAAA,EAAQ;AAAK,SAAA,CAAA;AACzD,QAAA,IAAIF,MAAAA,EAAQ;AACVN,YAAAA,IAAAA,GAAO,GAAGG,2BAAAA,CAA4B,EAAE,EAAEI,KAAAA,CAAM,CAAC,CAAC;YAClDA,KAAAA,IAAS,CAAA;AACX,QAAA;AACF,IAAA;AAEA,IAAA,MAAME,MAAAA,GAAS,MAAML,aAAAA,CAAcM,MAAM,CAAC;AAAEV,QAAAA;AAAK,KAAA,CAAA;IAEjD,MAAMJ,QAAAA,EAAAA,CAAWe,GAAG,CAAC;QAAEC,KAAAA,EAAO;AAAEC,YAAAA,EAAAA,EAAIJ,OAAOI;AAAG;AAAE,KAAA,CAAA;IAEhD,OAAOJ,MAAAA;AACT,CAAA;AAEA,MAAMK,kBAAAA,GAAqB,UAAA;AACzB,IAAA,MAAMC,UAAAA,GAAa,MAAMnB,QAAAA,EAAAA,CAAWoB,GAAG,CAAC,EAAC,CAAA;IACzC,MAAMC,QAAAA,GAAWD,IAAID,UAAAA,EAAY,IAAA,CAAA;IAEjC,MAAMN,MAAAA,GAASQ,QAAAA,GACX,MAAMpB,MAAAA,CAAOqB,EAAE,CAACC,KAAK,CAACC,gBAAAA,CAAAA,CAAkBC,OAAO,CAAC;QAAEC,KAAAA,EAAO;YAAET,EAAAA,EAAII;AAAS;KAAE,CAAA,GAC1E,IAAA;IAEJ,OAAOR,MAAAA,IAAU,OAAOP,qBAAAA,EAAAA,GAA0BO,MAAAA;AACpD,CAAA;AAEA,sBAAe;AACbK,IAAAA;AACF,CAAA;;;;"}