@strapi/upload 5.56.0 → 5.57.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 (208) 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/hooks/useTracking.js +3 -1
  6. package/dist/admin/legacy/hooks/useTracking.js.map +1 -1
  7. package/dist/admin/legacy/hooks/useTracking.mjs +3 -1
  8. package/dist/admin/legacy/hooks/useTracking.mjs.map +1 -1
  9. package/dist/admin/legacy/pages/App/ConfigureTheView/ConfigureTheView.js +2 -1
  10. package/dist/admin/legacy/pages/App/ConfigureTheView/ConfigureTheView.js.map +1 -1
  11. package/dist/admin/legacy/pages/App/ConfigureTheView/ConfigureTheView.mjs +2 -1
  12. package/dist/admin/legacy/pages/App/ConfigureTheView/ConfigureTheView.mjs.map +1 -1
  13. package/dist/admin/legacy/pages/App/MediaLibrary.js +2 -1
  14. package/dist/admin/legacy/pages/App/MediaLibrary.js.map +1 -1
  15. package/dist/admin/legacy/pages/App/MediaLibrary.mjs +2 -1
  16. package/dist/admin/legacy/pages/App/MediaLibrary.mjs.map +1 -1
  17. package/dist/admin/pages/Assets/AssetsPage.js +24 -12
  18. package/dist/admin/pages/Assets/AssetsPage.js.map +1 -1
  19. package/dist/admin/pages/Assets/AssetsPage.mjs +25 -13
  20. package/dist/admin/pages/Assets/AssetsPage.mjs.map +1 -1
  21. package/dist/admin/pages/Assets/components/AssetActions.js +326 -0
  22. package/dist/admin/pages/Assets/components/AssetActions.js.map +1 -0
  23. package/dist/admin/pages/Assets/components/AssetActions.mjs +324 -0
  24. package/dist/admin/pages/Assets/components/AssetActions.mjs.map +1 -0
  25. package/dist/admin/pages/Assets/components/AssetActionsMenu.js +28 -309
  26. package/dist/admin/pages/Assets/components/AssetActionsMenu.js.map +1 -1
  27. package/dist/admin/pages/Assets/components/AssetActionsMenu.mjs +31 -312
  28. package/dist/admin/pages/Assets/components/AssetActionsMenu.mjs.map +1 -1
  29. package/dist/admin/pages/Assets/components/AssetContextMenu.js +79 -0
  30. package/dist/admin/pages/Assets/components/AssetContextMenu.js.map +1 -0
  31. package/dist/admin/pages/Assets/components/AssetContextMenu.mjs +77 -0
  32. package/dist/admin/pages/Assets/components/AssetContextMenu.mjs.map +1 -0
  33. package/dist/admin/pages/Assets/components/AssetDetails/AssetCropEditor.js +87 -5
  34. package/dist/admin/pages/Assets/components/AssetDetails/AssetCropEditor.js.map +1 -1
  35. package/dist/admin/pages/Assets/components/AssetDetails/AssetCropEditor.mjs +89 -7
  36. package/dist/admin/pages/Assets/components/AssetDetails/AssetCropEditor.mjs.map +1 -1
  37. package/dist/admin/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js +3 -3
  38. package/dist/admin/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js.map +1 -1
  39. package/dist/admin/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs +3 -3
  40. package/dist/admin/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs.map +1 -1
  41. package/dist/admin/pages/Assets/components/AssetDetails/useCropImg.js +62 -5
  42. package/dist/admin/pages/Assets/components/AssetDetails/useCropImg.js.map +1 -1
  43. package/dist/admin/pages/Assets/components/AssetDetails/useCropImg.mjs +60 -6
  44. package/dist/admin/pages/Assets/components/AssetDetails/useCropImg.mjs.map +1 -1
  45. package/dist/admin/pages/Assets/components/AssetsGrid.js +27 -4
  46. package/dist/admin/pages/Assets/components/AssetsGrid.js.map +1 -1
  47. package/dist/admin/pages/Assets/components/AssetsGrid.mjs +27 -4
  48. package/dist/admin/pages/Assets/components/AssetsGrid.mjs.map +1 -1
  49. package/dist/admin/pages/Assets/components/AssetsTable.js +27 -4
  50. package/dist/admin/pages/Assets/components/AssetsTable.js.map +1 -1
  51. package/dist/admin/pages/Assets/components/AssetsTable.mjs +27 -4
  52. package/dist/admin/pages/Assets/components/AssetsTable.mjs.map +1 -1
  53. package/dist/admin/pages/Assets/components/CursorAnchoredMenu.js +77 -0
  54. package/dist/admin/pages/Assets/components/CursorAnchoredMenu.js.map +1 -0
  55. package/dist/admin/pages/Assets/components/CursorAnchoredMenu.mjs +75 -0
  56. package/dist/admin/pages/Assets/components/CursorAnchoredMenu.mjs.map +1 -0
  57. package/dist/admin/pages/Assets/components/FolderActions.js +139 -0
  58. package/dist/admin/pages/Assets/components/FolderActions.js.map +1 -0
  59. package/dist/admin/pages/Assets/components/FolderActions.mjs +137 -0
  60. package/dist/admin/pages/Assets/components/FolderActions.mjs.map +1 -0
  61. package/dist/admin/pages/Assets/components/FolderActionsMenu.js +25 -119
  62. package/dist/admin/pages/Assets/components/FolderActionsMenu.js.map +1 -1
  63. package/dist/admin/pages/Assets/components/FolderActionsMenu.mjs +27 -121
  64. package/dist/admin/pages/Assets/components/FolderActionsMenu.mjs.map +1 -1
  65. package/dist/admin/pages/Assets/components/FolderContextMenu.js +67 -0
  66. package/dist/admin/pages/Assets/components/FolderContextMenu.js.map +1 -0
  67. package/dist/admin/pages/Assets/components/FolderContextMenu.mjs +65 -0
  68. package/dist/admin/pages/Assets/components/FolderContextMenu.mjs.map +1 -0
  69. package/dist/admin/pages/Assets/components/FolderTree/FolderTree.js +139 -45
  70. package/dist/admin/pages/Assets/components/FolderTree/FolderTree.js.map +1 -1
  71. package/dist/admin/pages/Assets/components/FolderTree/FolderTree.mjs +140 -47
  72. package/dist/admin/pages/Assets/components/FolderTree/FolderTree.mjs.map +1 -1
  73. package/dist/admin/pages/Assets/components/FolderTree/FolderTreeRowMenu.js +115 -0
  74. package/dist/admin/pages/Assets/components/FolderTree/FolderTreeRowMenu.js.map +1 -0
  75. package/dist/admin/pages/Assets/components/FolderTree/FolderTreeRowMenu.mjs +113 -0
  76. package/dist/admin/pages/Assets/components/FolderTree/FolderTreeRowMenu.mjs.map +1 -0
  77. package/dist/admin/pages/Assets/components/ItemContextMenu.js +125 -0
  78. package/dist/admin/pages/Assets/components/ItemContextMenu.js.map +1 -0
  79. package/dist/admin/pages/Assets/components/ItemContextMenu.mjs +122 -0
  80. package/dist/admin/pages/Assets/components/ItemContextMenu.mjs.map +1 -0
  81. package/dist/admin/pages/Assets/components/MainAreaContextMenu.js +88 -63
  82. package/dist/admin/pages/Assets/components/MainAreaContextMenu.js.map +1 -1
  83. package/dist/admin/pages/Assets/components/MainAreaContextMenu.mjs +88 -63
  84. package/dist/admin/pages/Assets/components/MainAreaContextMenu.mjs.map +1 -1
  85. package/dist/admin/pages/Assets/components/SelectionActions.js +111 -0
  86. package/dist/admin/pages/Assets/components/SelectionActions.js.map +1 -0
  87. package/dist/admin/pages/Assets/components/SelectionActions.mjs +109 -0
  88. package/dist/admin/pages/Assets/components/SelectionActions.mjs.map +1 -0
  89. package/dist/admin/pages/Assets/components/SelectionContextMenu.js +82 -0
  90. package/dist/admin/pages/Assets/components/SelectionContextMenu.js.map +1 -0
  91. package/dist/admin/pages/Assets/components/SelectionContextMenu.mjs +80 -0
  92. package/dist/admin/pages/Assets/components/SelectionContextMenu.mjs.map +1 -0
  93. package/dist/admin/pages/Assets/hooks/useAssetSelection.js +10 -0
  94. package/dist/admin/pages/Assets/hooks/useAssetSelection.js.map +1 -1
  95. package/dist/admin/pages/Assets/hooks/useAssetSelection.mjs +10 -0
  96. package/dist/admin/pages/Assets/hooks/useAssetSelection.mjs.map +1 -1
  97. package/dist/admin/pages/SettingsPage/SettingsPage.js +8 -1
  98. package/dist/admin/pages/SettingsPage/SettingsPage.js.map +1 -1
  99. package/dist/admin/pages/SettingsPage/SettingsPage.mjs +8 -1
  100. package/dist/admin/pages/SettingsPage/SettingsPage.mjs.map +1 -1
  101. package/dist/admin/src/hooks/useTracking.d.ts +0 -7
  102. package/dist/admin/src/pages/Assets/components/AssetActions.d.ts +70 -0
  103. package/dist/admin/src/pages/Assets/components/AssetActionsMenu.d.ts +5 -14
  104. package/dist/admin/src/pages/Assets/components/AssetContextMenu.d.ts +27 -0
  105. package/dist/admin/src/pages/Assets/components/AssetDetails/useCropImg.d.ts +16 -0
  106. package/dist/admin/src/pages/Assets/components/CursorAnchoredMenu.d.ts +32 -0
  107. package/dist/admin/src/pages/Assets/components/FolderActions.d.ts +48 -0
  108. package/dist/admin/src/pages/Assets/components/FolderActionsMenu.d.ts +4 -8
  109. package/dist/admin/src/pages/Assets/components/FolderContextMenu.d.ts +21 -0
  110. package/dist/admin/src/pages/Assets/components/FolderTree/FolderTree.d.ts +5 -1
  111. package/dist/admin/src/pages/Assets/components/FolderTree/FolderTreeRowMenu.d.ts +25 -0
  112. package/dist/admin/src/pages/Assets/components/ItemContextMenu.d.ts +53 -0
  113. package/dist/admin/src/pages/Assets/components/MainAreaContextMenu.d.ts +15 -1
  114. package/dist/admin/src/pages/Assets/components/SelectionActions.d.ts +40 -0
  115. package/dist/admin/src/pages/Assets/components/SelectionContextMenu.d.ts +25 -0
  116. package/dist/admin/src/pages/Assets/hooks/useAssetSelection.d.ts +5 -0
  117. package/dist/admin/src/utils/mediaLibraryVersion.d.ts +18 -0
  118. package/dist/admin/translations/en.json.js +8 -3
  119. package/dist/admin/translations/en.json.js.map +1 -1
  120. package/dist/admin/translations/en.json.mjs +8 -3
  121. package/dist/admin/translations/en.json.mjs.map +1 -1
  122. package/dist/admin/utils/mediaLibraryVersion.js +24 -0
  123. package/dist/admin/utils/mediaLibraryVersion.js.map +1 -0
  124. package/dist/admin/utils/mediaLibraryVersion.mjs +20 -0
  125. package/dist/admin/utils/mediaLibraryVersion.mjs.map +1 -0
  126. package/dist/server/controllers/admin-file.js +2 -2
  127. package/dist/server/controllers/admin-file.js.map +1 -1
  128. package/dist/server/controllers/admin-file.mjs +2 -2
  129. package/dist/server/controllers/admin-file.mjs.map +1 -1
  130. package/dist/server/controllers/admin-folder.js +5 -5
  131. package/dist/server/controllers/admin-folder.js.map +1 -1
  132. package/dist/server/controllers/admin-folder.mjs +5 -5
  133. package/dist/server/controllers/admin-folder.mjs.map +1 -1
  134. package/dist/server/controllers/content-api.js +30 -7
  135. package/dist/server/controllers/content-api.js.map +1 -1
  136. package/dist/server/controllers/content-api.mjs +30 -7
  137. package/dist/server/controllers/content-api.mjs.map +1 -1
  138. package/dist/server/controllers/validation/admin/folder-file.js +4 -4
  139. package/dist/server/controllers/validation/admin/folder-file.js.map +1 -1
  140. package/dist/server/controllers/validation/admin/folder-file.mjs +2 -2
  141. package/dist/server/controllers/validation/admin/folder-file.mjs.map +1 -1
  142. package/dist/server/controllers/validation/admin/folder.js +3 -4
  143. package/dist/server/controllers/validation/admin/folder.js.map +1 -1
  144. package/dist/server/controllers/validation/admin/folder.mjs +3 -4
  145. package/dist/server/controllers/validation/admin/folder.mjs.map +1 -1
  146. package/dist/server/controllers/validation/admin/upload.js +1 -2
  147. package/dist/server/controllers/validation/admin/upload.js.map +1 -1
  148. package/dist/server/controllers/validation/admin/upload.mjs +1 -2
  149. package/dist/server/controllers/validation/admin/upload.mjs.map +1 -1
  150. package/dist/server/controllers/validation/admin/utils.js +1 -2
  151. package/dist/server/controllers/validation/admin/utils.js.map +1 -1
  152. package/dist/server/controllers/validation/admin/utils.mjs +1 -2
  153. package/dist/server/controllers/validation/admin/utils.mjs.map +1 -1
  154. package/dist/server/migrations/unsign-richtext-and-blocks-urls.js +2 -2
  155. package/dist/server/migrations/unsign-richtext-and-blocks-urls.js.map +1 -1
  156. package/dist/server/migrations/unsign-richtext-and-blocks-urls.mjs +1 -1
  157. package/dist/server/migrations/unsign-richtext-and-blocks-urls.mjs.map +1 -1
  158. package/dist/server/routes/content-api.js +3 -3
  159. package/dist/server/routes/content-api.js.map +1 -1
  160. package/dist/server/routes/content-api.mjs +3 -3
  161. package/dist/server/routes/content-api.mjs.map +1 -1
  162. package/dist/server/routes/validation/upload.js +8 -0
  163. package/dist/server/routes/validation/upload.js.map +1 -1
  164. package/dist/server/routes/validation/upload.mjs +8 -0
  165. package/dist/server/routes/validation/upload.mjs.map +1 -1
  166. package/dist/server/services/api-upload-folder.js +3 -3
  167. package/dist/server/services/api-upload-folder.js.map +1 -1
  168. package/dist/server/services/api-upload-folder.mjs +3 -3
  169. package/dist/server/services/api-upload-folder.mjs.map +1 -1
  170. package/dist/server/services/extensions/utils.js +19 -15
  171. package/dist/server/services/extensions/utils.js.map +1 -1
  172. package/dist/server/services/extensions/utils.mjs +19 -15
  173. package/dist/server/services/extensions/utils.mjs.map +1 -1
  174. package/dist/server/services/file.js +2 -2
  175. package/dist/server/services/file.js.map +1 -1
  176. package/dist/server/services/file.mjs +1 -1
  177. package/dist/server/services/file.mjs.map +1 -1
  178. package/dist/server/services/folder.js +5 -5
  179. package/dist/server/services/folder.js.map +1 -1
  180. package/dist/server/services/folder.mjs +5 -5
  181. package/dist/server/services/folder.mjs.map +1 -1
  182. package/dist/server/services/provider.js +3 -4
  183. package/dist/server/services/provider.js.map +1 -1
  184. package/dist/server/services/provider.mjs +3 -4
  185. package/dist/server/services/provider.mjs.map +1 -1
  186. package/dist/server/services/upload.js +5 -6
  187. package/dist/server/services/upload.js.map +1 -1
  188. package/dist/server/services/upload.mjs +4 -5
  189. package/dist/server/services/upload.mjs.map +1 -1
  190. package/dist/server/services/weekly-metrics.js +2 -2
  191. package/dist/server/services/weekly-metrics.js.map +1 -1
  192. package/dist/server/services/weekly-metrics.mjs +2 -2
  193. package/dist/server/services/weekly-metrics.mjs.map +1 -1
  194. package/dist/server/src/controllers/admin-folder.d.ts.map +1 -1
  195. package/dist/server/src/controllers/content-api.d.ts.map +1 -1
  196. package/dist/server/src/controllers/validation/admin/folder.d.ts.map +1 -1
  197. package/dist/server/src/controllers/validation/admin/upload.d.ts.map +1 -1
  198. package/dist/server/src/controllers/validation/admin/utils.d.ts.map +1 -1
  199. package/dist/server/src/index.d.ts.map +1 -1
  200. package/dist/server/src/mcp/ambient-instance.d.ts.map +1 -1
  201. package/dist/server/src/routes/validation/upload.d.ts +4 -0
  202. package/dist/server/src/routes/validation/upload.d.ts.map +1 -1
  203. package/dist/server/src/services/extensions/utils.d.ts +33 -1
  204. package/dist/server/src/services/extensions/utils.d.ts.map +1 -1
  205. package/dist/server/src/services/index.d.ts.map +1 -1
  206. package/dist/server/src/services/provider.d.ts.map +1 -1
  207. package/dist/server/src/services/upload.d.ts.map +1 -1
  208. package/package.json +6 -6
@@ -1 +1 @@
1
- {"version":3,"file":"content-api.mjs","sources":["../../../server/src/controllers/content-api.ts"],"sourcesContent":["import _ from 'lodash';\nimport { async, errors } from '@strapi/utils';\n\nimport type { Context } from 'koa';\nimport type { Core } from '@strapi/types';\n\nimport { getService } from '../utils';\nimport { FILE_MODEL_UID } from '../constants';\nimport { validateUploadBody } from './validation/content-api/upload';\nimport { FileInfo } from '../types';\nimport { prepareUploadRequest } from '../utils/mime-validation';\n\nconst { ValidationError } = errors;\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n const sanitizeOutput = async (data: unknown | unknown[], ctx: Context) => {\n const schema = strapi.getModel(FILE_MODEL_UID);\n const { auth } = ctx.state;\n\n return strapi.contentAPI.sanitize.output(data, schema, { auth });\n };\n\n const validateQuery = async (data: Record<string, unknown>, ctx: Context) => {\n const schema = strapi.getModel(FILE_MODEL_UID);\n const { auth, route } = ctx.state;\n\n return strapi.contentAPI.validate.query(data, schema, { auth, route });\n };\n\n const sanitizeQuery = async (data: Record<string, unknown>, ctx: Context) => {\n const schema = strapi.getModel(FILE_MODEL_UID);\n const { auth, route } = ctx.state;\n\n return strapi.contentAPI.sanitize.query(data, schema, { auth, route });\n };\n\n return {\n async find(ctx: Context) {\n await validateQuery(ctx.query, ctx);\n const sanitizedQuery = await sanitizeQuery(ctx.query, ctx);\n\n const files = await getService('upload').findMany(sanitizedQuery);\n\n const signedFiles = await async.map(files, getService('file').signFileUrls);\n\n ctx.body = await sanitizeOutput(signedFiles, ctx);\n },\n\n async findPage(ctx: Context) {\n await validateQuery(ctx.query, ctx);\n const sanitizedQuery = await sanitizeQuery(ctx.query, ctx);\n\n const { results, pagination } = await getService('upload').findAndCountPage(sanitizedQuery);\n\n const data = await sanitizeOutput(results, ctx);\n\n ctx.body = { data, meta: { pagination } };\n },\n\n async findOne(ctx: Context) {\n const {\n params: { id },\n } = ctx;\n\n await validateQuery(ctx.query, ctx);\n const sanitizedQuery = await sanitizeQuery(ctx.query, ctx);\n\n const file = await getService('upload').findOne(id, sanitizedQuery.populate!);\n\n if (!file) {\n return ctx.notFound('file.notFound');\n }\n\n const signedFile = await getService('file').signFileUrls(file);\n\n ctx.body = await sanitizeOutput(signedFile, ctx);\n },\n\n async destroy(ctx: Context) {\n const {\n params: { id },\n } = ctx;\n\n const file = await getService('upload').findOne(id);\n\n if (!file) {\n return ctx.notFound('file.notFound');\n }\n\n await getService('upload').remove(file);\n\n const signedFile = await getService('file').signFileUrls(file);\n\n ctx.body = await sanitizeOutput(signedFile, ctx);\n },\n\n async updateFileInfo(ctx: Context) {\n const {\n query: { id },\n request: { body },\n } = ctx;\n const data = await validateUploadBody(body);\n\n if (!id || (typeof id !== 'string' && typeof id !== 'number')) {\n throw new ValidationError('File id is required and must be a single value');\n }\n\n const result = await getService('upload').updateFileInfo(id, data.fileInfo as any);\n\n const signedResult = await getService('file').signFileUrls(result);\n\n ctx.body = await sanitizeOutput(signedResult, ctx);\n },\n\n async replaceFile(ctx: Context) {\n const {\n query: { id },\n request: { body, files: { files: filesInput } = {} },\n } = ctx;\n\n // cannot replace with more than one file\n if (Array.isArray(filesInput) && filesInput.length > 1) {\n throw new ValidationError('Cannot replace a file with multiple ones');\n }\n\n const files = Array.isArray(filesInput) ? filesInput[0] : filesInput;\n\n const {\n validFiles,\n filteredBody,\n errors: validationErrors,\n } = await prepareUploadRequest(files, body, strapi);\n if (validFiles.length === 0) {\n throw new errors.ValidationError(validationErrors[0].message);\n }\n\n if (!id || (typeof id !== 'string' && typeof id !== 'number')) {\n throw new ValidationError('File id is required and must be a single value');\n }\n\n const data = (await validateUploadBody(filteredBody)) as { fileInfo: FileInfo };\n\n const replacedFiles = await getService('upload').replace(id, { data, file: validFiles[0] });\n\n const signedFiles = await getService('file').signFileUrls(replacedFiles);\n\n ctx.body = await sanitizeOutput(signedFiles, ctx);\n },\n\n async uploadFiles(ctx: Context) {\n const {\n request: { body, files: { files: filesInput } = {} },\n } = ctx;\n\n const {\n validFiles,\n filteredBody,\n errors: validationErrors,\n } = await prepareUploadRequest(filesInput, body, strapi);\n if (validFiles.length === 0) {\n throw new errors.ValidationError(validationErrors[0].message);\n }\n\n const isMultipleFiles = validFiles.length > 1;\n const data: any = await validateUploadBody(filteredBody, isMultipleFiles);\n\n const apiUploadFolderService = getService('api-upload-folder');\n\n const apiUploadFolder = await apiUploadFolderService.getAPIUploadFolder();\n\n if (isMultipleFiles) {\n data.fileInfo = data.fileInfo || [];\n data.fileInfo = validFiles.map((_f, i) => ({\n ...data.fileInfo[i],\n folder: apiUploadFolder.id,\n }));\n } else {\n data.fileInfo = { ...data.fileInfo, folder: apiUploadFolder.id };\n }\n\n const uploadedFiles = await getService('upload').upload({\n data,\n files: validFiles,\n });\n\n const signedFiles = await async.map(uploadedFiles as any[], getService('file').signFileUrls);\n\n ctx.body = await sanitizeOutput(signedFiles, ctx);\n ctx.status = 201;\n },\n\n // TODO: split into multiple endpoints\n async upload(ctx: Context) {\n const {\n query: { id },\n request: { files: { files } = {} },\n } = ctx;\n\n if (_.isEmpty(files) || (!Array.isArray(files) && files.size === 0)) {\n if (id) {\n return this.updateFileInfo(ctx);\n }\n\n throw new ValidationError('Files are empty');\n }\n\n await (id ? this.replaceFile : this.uploadFiles)(ctx);\n },\n };\n};\n"],"names":["ValidationError","errors","strapi","sanitizeOutput","data","ctx","schema","getModel","FILE_MODEL_UID","auth","state","contentAPI","sanitize","output","validateQuery","route","validate","query","sanitizeQuery","find","sanitizedQuery","files","getService","findMany","signedFiles","async","map","signFileUrls","body","findPage","results","pagination","findAndCountPage","meta","findOne","params","id","file","populate","notFound","signedFile","destroy","remove","updateFileInfo","request","validateUploadBody","result","fileInfo","signedResult","replaceFile","filesInput","Array","isArray","length","validFiles","filteredBody","validationErrors","prepareUploadRequest","message","replacedFiles","replace","uploadFiles","isMultipleFiles","apiUploadFolderService","apiUploadFolder","getAPIUploadFolder","_f","i","folder","uploadedFiles","upload","status","_","isEmpty","size"],"mappings":"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"}
1
+ {"version":3,"file":"content-api.mjs","sources":["../../../server/src/controllers/content-api.ts"],"sourcesContent":["import _ from 'lodash';\nimport { async, errors } from '@strapi/utils';\n\nimport type { Context } from 'koa';\nimport type { Core } from '@strapi/types';\n\nimport { getService } from '../utils';\nimport { FILE_MODEL_UID } from '../constants';\nimport { validateUploadBody } from './validation/content-api/upload';\nimport { FileInfo } from '../types';\nimport { prepareUploadRequest } from '../utils/mime-validation';\n\nconst { ValidationError, NotFoundError } = errors;\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n const sanitizeOutput = async (data: unknown | unknown[], ctx: Context) => {\n const schema = strapi.getModel(FILE_MODEL_UID);\n const { auth } = ctx.state;\n\n return strapi.contentAPI.sanitize.output(data, schema, { auth });\n };\n\n const validateQuery = async (data: Record<string, unknown>, ctx: Context) => {\n const schema = strapi.getModel(FILE_MODEL_UID);\n const { auth, route } = ctx.state;\n\n return strapi.contentAPI.validate.query(data, schema, { auth, route });\n };\n\n const sanitizeQuery = async (data: Record<string, unknown>, ctx: Context) => {\n const schema = strapi.getModel(FILE_MODEL_UID);\n const { auth, route } = ctx.state;\n\n return strapi.contentAPI.sanitize.query(data, schema, { auth, route });\n };\n\n // Files can be addressed by numeric id or documentId (1:1, files have no draft & publish)\n const resolveFileId = async (id: string | number) => {\n if (/^\\d+$/.test(String(id))) {\n return id;\n }\n\n const file = await strapi.db\n .query(FILE_MODEL_UID)\n .findOne({ where: { documentId: id }, select: ['id'] });\n\n return file?.id;\n };\n\n return {\n async find(ctx: Context) {\n await validateQuery(ctx.query, ctx);\n const sanitizedQuery = await sanitizeQuery(ctx.query, ctx);\n\n const files = await getService('upload').findMany(sanitizedQuery);\n\n const signedFiles = await async.map(files, getService('file').signFileUrls);\n\n ctx.body = await sanitizeOutput(signedFiles, ctx);\n },\n\n async findPage(ctx: Context) {\n await validateQuery(ctx.query, ctx);\n const sanitizedQuery = await sanitizeQuery(ctx.query, ctx);\n\n const { results, pagination } = await getService('upload').findAndCountPage(sanitizedQuery);\n\n const data = await sanitizeOutput(results, ctx);\n\n ctx.body = { data, meta: { pagination } };\n },\n\n async findOne(ctx: Context) {\n await validateQuery(ctx.query, ctx);\n const sanitizedQuery = await sanitizeQuery(ctx.query, ctx);\n\n const id = await resolveFileId(ctx.params.id);\n const file = id ? await getService('upload').findOne(id, sanitizedQuery.populate!) : null;\n\n if (!file) {\n return ctx.notFound('file.notFound');\n }\n\n const signedFile = await getService('file').signFileUrls(file);\n\n ctx.body = await sanitizeOutput(signedFile, ctx);\n },\n\n async destroy(ctx: Context) {\n const id = await resolveFileId(ctx.params.id);\n const file = id ? await getService('upload').findOne(id) : null;\n\n if (!file) {\n return ctx.notFound('file.notFound');\n }\n\n await getService('upload').remove(file);\n\n const signedFile = await getService('file').signFileUrls(file);\n\n ctx.body = await sanitizeOutput(signedFile, ctx);\n },\n\n async updateFileInfo(ctx: Context) {\n const {\n query: { id },\n request: { body },\n } = ctx;\n const data = await validateUploadBody(body);\n\n if (!id || (typeof id !== 'string' && typeof id !== 'number')) {\n throw new ValidationError('File id is required and must be a single value');\n }\n\n const fileId = await resolveFileId(id);\n\n if (!fileId) {\n throw new NotFoundError();\n }\n\n const result = await getService('upload').updateFileInfo(fileId, data.fileInfo as any);\n\n const signedResult = await getService('file').signFileUrls(result);\n\n ctx.body = await sanitizeOutput(signedResult, ctx);\n },\n\n async replaceFile(ctx: Context) {\n const {\n query: { id },\n request: { body, files: { files: filesInput } = {} },\n } = ctx;\n\n // cannot replace with more than one file\n if (Array.isArray(filesInput) && filesInput.length > 1) {\n throw new ValidationError('Cannot replace a file with multiple ones');\n }\n\n const files = Array.isArray(filesInput) ? filesInput[0] : filesInput;\n\n const {\n validFiles,\n filteredBody,\n errors: validationErrors,\n } = await prepareUploadRequest(files, body, strapi);\n if (validFiles.length === 0) {\n throw new errors.ValidationError(validationErrors[0].message);\n }\n\n if (!id || (typeof id !== 'string' && typeof id !== 'number')) {\n throw new ValidationError('File id is required and must be a single value');\n }\n\n const fileId = await resolveFileId(id);\n\n if (!fileId) {\n throw new NotFoundError();\n }\n\n const data = (await validateUploadBody(filteredBody)) as { fileInfo: FileInfo };\n\n const replacedFiles = await getService('upload').replace(fileId, {\n data,\n file: validFiles[0],\n });\n\n const signedFiles = await getService('file').signFileUrls(replacedFiles);\n\n ctx.body = await sanitizeOutput(signedFiles, ctx);\n },\n\n async uploadFiles(ctx: Context) {\n const {\n request: { body, files: { files: filesInput } = {} },\n } = ctx;\n\n const {\n validFiles,\n filteredBody,\n errors: validationErrors,\n } = await prepareUploadRequest(filesInput, body, strapi);\n if (validFiles.length === 0) {\n throw new errors.ValidationError(validationErrors[0].message);\n }\n\n const isMultipleFiles = validFiles.length > 1;\n const data: any = await validateUploadBody(filteredBody, isMultipleFiles);\n\n const apiUploadFolderService = getService('api-upload-folder');\n\n const apiUploadFolder = await apiUploadFolderService.getAPIUploadFolder();\n\n if (isMultipleFiles) {\n data.fileInfo = data.fileInfo || [];\n data.fileInfo = validFiles.map((_f, i) => ({\n ...data.fileInfo[i],\n folder: apiUploadFolder.id,\n }));\n } else {\n data.fileInfo = { ...data.fileInfo, folder: apiUploadFolder.id };\n }\n\n const uploadedFiles = await getService('upload').upload({\n data,\n files: validFiles,\n });\n\n const signedFiles = await async.map(uploadedFiles as any[], getService('file').signFileUrls);\n\n ctx.body = await sanitizeOutput(signedFiles, ctx);\n ctx.status = 201;\n },\n\n // TODO: split into multiple endpoints\n async upload(ctx: Context) {\n const {\n query: { id },\n request: { files: { files } = {} },\n } = ctx;\n\n if (_.isEmpty(files) || (!Array.isArray(files) && files.size === 0)) {\n if (id) {\n return this.updateFileInfo(ctx);\n }\n\n throw new ValidationError('Files are empty');\n }\n\n await (id ? this.replaceFile : this.uploadFiles)(ctx);\n },\n };\n};\n"],"names":["ValidationError","NotFoundError","errors","strapi","sanitizeOutput","data","ctx","schema","getModel","FILE_MODEL_UID","auth","state","contentAPI","sanitize","output","validateQuery","route","validate","query","sanitizeQuery","resolveFileId","id","test","String","file","db","findOne","where","documentId","select","find","sanitizedQuery","files","getService","findMany","signedFiles","async","map","signFileUrls","body","findPage","results","pagination","findAndCountPage","meta","params","populate","notFound","signedFile","destroy","remove","updateFileInfo","request","validateUploadBody","fileId","result","fileInfo","signedResult","replaceFile","filesInput","Array","isArray","length","validFiles","filteredBody","validationErrors","prepareUploadRequest","message","replacedFiles","replace","uploadFiles","isMultipleFiles","apiUploadFolderService","apiUploadFolder","getAPIUploadFolder","_f","i","folder","uploadedFiles","upload","status","_","isEmpty","size"],"mappings":"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"}
@@ -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('@strapi/utils');
5
5
  var constants = require('../../../constants.js');
6
6
  var utils$1 = require('./utils.js');
@@ -17,7 +17,7 @@ const validateStructureMoveManyFoldersFilesSchema = utils.yup.object().shape({
17
17
  }).noUnknown().required();
18
18
  const validateDuplicatesMoveManyFoldersFilesSchema = utils.yup.object().test('are-folders-unique', 'some folders already exist', async function areFoldersUnique(value) {
19
19
  const { folderIds, destinationFolderId } = value;
20
- if (fp.isEmpty(folderIds)) return true;
20
+ if (_.isEmpty(folderIds)) return true;
21
21
  const folders = await strapi.db.query(constants.FOLDER_MODEL_UID).findMany({
22
22
  select: [
23
23
  'name'
@@ -38,7 +38,7 @@ const validateDuplicatesMoveManyFoldersFilesSchema = utils.yup.object().test('ar
38
38
  }
39
39
  }
40
40
  });
41
- const duplicatedNames = fp.intersection(fp.map('name', folders), fp.map('name', existingFolders));
41
+ const duplicatedNames = _.intersection(_.map(existingFolders, 'name'), _.map(folders, 'name'));
42
42
  if (duplicatedNames.length > 0) {
43
43
  return this.createError({
44
44
  message: `some folders already exists: ${duplicatedNames.join(', ')}`
@@ -48,7 +48,7 @@ const validateDuplicatesMoveManyFoldersFilesSchema = utils.yup.object().test('ar
48
48
  });
49
49
  const validateMoveFoldersNotInsideThemselvesSchema = utils.yup.object().test('dont-move-inside-self', 'folders cannot be moved inside themselves or one of its children', async function validateMoveFoldersNotInsideThemselves(value) {
50
50
  const { folderIds, destinationFolderId } = value;
51
- if (destinationFolderId === null || fp.isEmpty(folderIds)) return true;
51
+ if (destinationFolderId === null || _.isEmpty(folderIds)) return true;
52
52
  const destinationFolder = await strapi.db.query(constants.FOLDER_MODEL_UID).findOne({
53
53
  select: [
54
54
  'path'
@@ -1 +1 @@
1
- {"version":3,"file":"folder-file.js","sources":["../../../../../server/src/controllers/validation/admin/folder-file.ts"],"sourcesContent":["import { intersection, map, isEmpty } from 'lodash/fp';\nimport { yup, validateYupSchema } from '@strapi/utils';\nimport { FOLDER_MODEL_UID } from '../../../constants';\nimport { folderExists } from './utils';\nimport { isFolderOrChild } from '../../utils/folders';\n\nimport type { Folder } from '../../../types';\n\nconst validateDeleteManyFoldersFilesSchema = yup\n .object()\n .shape({\n fileIds: yup.array().of(yup.strapiID().required()),\n folderIds: yup.array().of(yup.strapiID().required()),\n })\n .noUnknown()\n .required();\n\nconst validateStructureMoveManyFoldersFilesSchema = yup\n .object()\n .shape({\n destinationFolderId: yup\n .strapiID()\n .nullable()\n .defined()\n .test('folder-exists', 'destination folder does not exist', folderExists),\n fileIds: yup.array().of(yup.strapiID().required()),\n folderIds: yup.array().of(yup.strapiID().required()),\n })\n .noUnknown()\n .required();\n\nconst validateDuplicatesMoveManyFoldersFilesSchema = yup\n .object()\n .test('are-folders-unique', 'some folders already exist', async function areFoldersUnique(value) {\n const { folderIds, destinationFolderId } = value;\n if (isEmpty(folderIds)) return true;\n\n const folders = await strapi.db.query(FOLDER_MODEL_UID).findMany({\n select: ['name'],\n where: { id: { $in: folderIds } },\n });\n\n const existingFolders = await strapi.db.query(FOLDER_MODEL_UID).findMany({\n select: ['name'],\n where: { parent: { id: destinationFolderId } },\n });\n\n const duplicatedNames = intersection(map('name', folders), map('name', existingFolders));\n if (duplicatedNames.length > 0) {\n return this.createError({\n message: `some folders already exists: ${duplicatedNames.join(', ')}`,\n });\n }\n\n return true;\n });\n\nconst validateMoveFoldersNotInsideThemselvesSchema = yup\n .object()\n .test(\n 'dont-move-inside-self',\n 'folders cannot be moved inside themselves or one of its children',\n async function validateMoveFoldersNotInsideThemselves(value) {\n const { folderIds, destinationFolderId } = value;\n if (destinationFolderId === null || isEmpty(folderIds)) return true;\n\n const destinationFolder = await strapi.db.query(FOLDER_MODEL_UID).findOne({\n select: ['path'],\n where: { id: destinationFolderId },\n });\n\n const folders: Folder[] = await strapi.db.query(FOLDER_MODEL_UID).findMany({\n select: ['name', 'path'],\n where: { id: { $in: folderIds } },\n });\n\n const unmovableFoldersNames = folders\n .filter((folder) => isFolderOrChild(destinationFolder, folder))\n .map((f) => f.name);\n\n if (unmovableFoldersNames.length > 0) {\n return this.createError({\n message: `folders cannot be moved inside themselves or one of its children: ${unmovableFoldersNames.join(\n ', '\n )}`,\n });\n }\n\n return true;\n }\n );\n\nexport const validateDeleteManyFoldersFiles = validateYupSchema(\n validateDeleteManyFoldersFilesSchema\n);\n\nexport async function validateMoveManyFoldersFiles(body: unknown) {\n await validateYupSchema(validateStructureMoveManyFoldersFilesSchema)(body);\n await validateYupSchema(validateDuplicatesMoveManyFoldersFilesSchema)(body);\n await validateYupSchema(validateMoveFoldersNotInsideThemselvesSchema)(body);\n}\n"],"names":["validateDeleteManyFoldersFilesSchema","yup","object","shape","fileIds","array","of","strapiID","required","folderIds","noUnknown","validateStructureMoveManyFoldersFilesSchema","destinationFolderId","nullable","defined","test","folderExists","validateDuplicatesMoveManyFoldersFilesSchema","areFoldersUnique","value","isEmpty","folders","strapi","db","query","FOLDER_MODEL_UID","findMany","select","where","id","$in","existingFolders","parent","duplicatedNames","intersection","map","length","createError","message","join","validateMoveFoldersNotInsideThemselvesSchema","validateMoveFoldersNotInsideThemselves","destinationFolder","findOne","unmovableFoldersNames","filter","folder","isFolderOrChild","f","name","validateDeleteManyFoldersFiles","validateYupSchema","validateMoveManyFoldersFiles","body"],"mappings":"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"}
1
+ {"version":3,"file":"folder-file.js","sources":["../../../../../server/src/controllers/validation/admin/folder-file.ts"],"sourcesContent":["import { isEmpty, map, intersection } from 'lodash';\nimport { yup, validateYupSchema } from '@strapi/utils';\nimport { FOLDER_MODEL_UID } from '../../../constants';\nimport { folderExists } from './utils';\nimport { isFolderOrChild } from '../../utils/folders';\n\nimport type { Folder } from '../../../types';\n\nconst validateDeleteManyFoldersFilesSchema = yup\n .object()\n .shape({\n fileIds: yup.array().of(yup.strapiID().required()),\n folderIds: yup.array().of(yup.strapiID().required()),\n })\n .noUnknown()\n .required();\n\nconst validateStructureMoveManyFoldersFilesSchema = yup\n .object()\n .shape({\n destinationFolderId: yup\n .strapiID()\n .nullable()\n .defined()\n .test('folder-exists', 'destination folder does not exist', folderExists),\n fileIds: yup.array().of(yup.strapiID().required()),\n folderIds: yup.array().of(yup.strapiID().required()),\n })\n .noUnknown()\n .required();\n\nconst validateDuplicatesMoveManyFoldersFilesSchema = yup\n .object()\n .test('are-folders-unique', 'some folders already exist', async function areFoldersUnique(value) {\n const { folderIds, destinationFolderId } = value;\n if (isEmpty(folderIds)) return true;\n\n const folders = await strapi.db.query(FOLDER_MODEL_UID).findMany({\n select: ['name'],\n where: { id: { $in: folderIds } },\n });\n\n const existingFolders = await strapi.db.query(FOLDER_MODEL_UID).findMany({\n select: ['name'],\n where: { parent: { id: destinationFolderId } },\n });\n\n const duplicatedNames = intersection(map(existingFolders, 'name'), map(folders, 'name'));\n if (duplicatedNames.length > 0) {\n return this.createError({\n message: `some folders already exists: ${duplicatedNames.join(', ')}`,\n });\n }\n\n return true;\n });\n\nconst validateMoveFoldersNotInsideThemselvesSchema = yup\n .object()\n .test(\n 'dont-move-inside-self',\n 'folders cannot be moved inside themselves or one of its children',\n async function validateMoveFoldersNotInsideThemselves(value) {\n const { folderIds, destinationFolderId } = value;\n if (destinationFolderId === null || isEmpty(folderIds)) return true;\n\n const destinationFolder = await strapi.db.query(FOLDER_MODEL_UID).findOne({\n select: ['path'],\n where: { id: destinationFolderId },\n });\n\n const folders: Folder[] = await strapi.db.query(FOLDER_MODEL_UID).findMany({\n select: ['name', 'path'],\n where: { id: { $in: folderIds } },\n });\n\n const unmovableFoldersNames = folders\n .filter((folder) => isFolderOrChild(destinationFolder, folder))\n .map((f) => f.name);\n\n if (unmovableFoldersNames.length > 0) {\n return this.createError({\n message: `folders cannot be moved inside themselves or one of its children: ${unmovableFoldersNames.join(\n ', '\n )}`,\n });\n }\n\n return true;\n }\n );\n\nexport const validateDeleteManyFoldersFiles = validateYupSchema(\n validateDeleteManyFoldersFilesSchema\n);\n\nexport async function validateMoveManyFoldersFiles(body: unknown) {\n await validateYupSchema(validateStructureMoveManyFoldersFilesSchema)(body);\n await validateYupSchema(validateDuplicatesMoveManyFoldersFilesSchema)(body);\n await validateYupSchema(validateMoveFoldersNotInsideThemselvesSchema)(body);\n}\n"],"names":["validateDeleteManyFoldersFilesSchema","yup","object","shape","fileIds","array","of","strapiID","required","folderIds","noUnknown","validateStructureMoveManyFoldersFilesSchema","destinationFolderId","nullable","defined","test","folderExists","validateDuplicatesMoveManyFoldersFilesSchema","areFoldersUnique","value","isEmpty","folders","strapi","db","query","FOLDER_MODEL_UID","findMany","select","where","id","$in","existingFolders","parent","duplicatedNames","intersection","map","length","createError","message","join","validateMoveFoldersNotInsideThemselvesSchema","validateMoveFoldersNotInsideThemselves","destinationFolder","findOne","unmovableFoldersNames","filter","folder","isFolderOrChild","f","name","validateDeleteManyFoldersFiles","validateYupSchema","validateMoveManyFoldersFiles","body"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { isEmpty, intersection, map } from 'lodash/fp';
1
+ import { isEmpty, intersection, map } from 'lodash';
2
2
  import { yup, validateYupSchema } from '@strapi/utils';
3
3
  import { FOLDER_MODEL_UID } from '../../../constants.mjs';
4
4
  import { folderExists } from './utils.mjs';
@@ -36,7 +36,7 @@ const validateDuplicatesMoveManyFoldersFilesSchema = yup.object().test('are-fold
36
36
  }
37
37
  }
38
38
  });
39
- const duplicatedNames = intersection(map('name', folders), map('name', existingFolders));
39
+ const duplicatedNames = intersection(map(existingFolders, 'name'), map(folders, 'name'));
40
40
  if (duplicatedNames.length > 0) {
41
41
  return this.createError({
42
42
  message: `some folders already exists: ${duplicatedNames.join(', ')}`
@@ -1 +1 @@
1
- {"version":3,"file":"folder-file.mjs","sources":["../../../../../server/src/controllers/validation/admin/folder-file.ts"],"sourcesContent":["import { intersection, map, isEmpty } from 'lodash/fp';\nimport { yup, validateYupSchema } from '@strapi/utils';\nimport { FOLDER_MODEL_UID } from '../../../constants';\nimport { folderExists } from './utils';\nimport { isFolderOrChild } from '../../utils/folders';\n\nimport type { Folder } from '../../../types';\n\nconst validateDeleteManyFoldersFilesSchema = yup\n .object()\n .shape({\n fileIds: yup.array().of(yup.strapiID().required()),\n folderIds: yup.array().of(yup.strapiID().required()),\n })\n .noUnknown()\n .required();\n\nconst validateStructureMoveManyFoldersFilesSchema = yup\n .object()\n .shape({\n destinationFolderId: yup\n .strapiID()\n .nullable()\n .defined()\n .test('folder-exists', 'destination folder does not exist', folderExists),\n fileIds: yup.array().of(yup.strapiID().required()),\n folderIds: yup.array().of(yup.strapiID().required()),\n })\n .noUnknown()\n .required();\n\nconst validateDuplicatesMoveManyFoldersFilesSchema = yup\n .object()\n .test('are-folders-unique', 'some folders already exist', async function areFoldersUnique(value) {\n const { folderIds, destinationFolderId } = value;\n if (isEmpty(folderIds)) return true;\n\n const folders = await strapi.db.query(FOLDER_MODEL_UID).findMany({\n select: ['name'],\n where: { id: { $in: folderIds } },\n });\n\n const existingFolders = await strapi.db.query(FOLDER_MODEL_UID).findMany({\n select: ['name'],\n where: { parent: { id: destinationFolderId } },\n });\n\n const duplicatedNames = intersection(map('name', folders), map('name', existingFolders));\n if (duplicatedNames.length > 0) {\n return this.createError({\n message: `some folders already exists: ${duplicatedNames.join(', ')}`,\n });\n }\n\n return true;\n });\n\nconst validateMoveFoldersNotInsideThemselvesSchema = yup\n .object()\n .test(\n 'dont-move-inside-self',\n 'folders cannot be moved inside themselves or one of its children',\n async function validateMoveFoldersNotInsideThemselves(value) {\n const { folderIds, destinationFolderId } = value;\n if (destinationFolderId === null || isEmpty(folderIds)) return true;\n\n const destinationFolder = await strapi.db.query(FOLDER_MODEL_UID).findOne({\n select: ['path'],\n where: { id: destinationFolderId },\n });\n\n const folders: Folder[] = await strapi.db.query(FOLDER_MODEL_UID).findMany({\n select: ['name', 'path'],\n where: { id: { $in: folderIds } },\n });\n\n const unmovableFoldersNames = folders\n .filter((folder) => isFolderOrChild(destinationFolder, folder))\n .map((f) => f.name);\n\n if (unmovableFoldersNames.length > 0) {\n return this.createError({\n message: `folders cannot be moved inside themselves or one of its children: ${unmovableFoldersNames.join(\n ', '\n )}`,\n });\n }\n\n return true;\n }\n );\n\nexport const validateDeleteManyFoldersFiles = validateYupSchema(\n validateDeleteManyFoldersFilesSchema\n);\n\nexport async function validateMoveManyFoldersFiles(body: unknown) {\n await validateYupSchema(validateStructureMoveManyFoldersFilesSchema)(body);\n await validateYupSchema(validateDuplicatesMoveManyFoldersFilesSchema)(body);\n await validateYupSchema(validateMoveFoldersNotInsideThemselvesSchema)(body);\n}\n"],"names":["validateDeleteManyFoldersFilesSchema","yup","object","shape","fileIds","array","of","strapiID","required","folderIds","noUnknown","validateStructureMoveManyFoldersFilesSchema","destinationFolderId","nullable","defined","test","folderExists","validateDuplicatesMoveManyFoldersFilesSchema","areFoldersUnique","value","isEmpty","folders","strapi","db","query","FOLDER_MODEL_UID","findMany","select","where","id","$in","existingFolders","parent","duplicatedNames","intersection","map","length","createError","message","join","validateMoveFoldersNotInsideThemselvesSchema","validateMoveFoldersNotInsideThemselves","destinationFolder","findOne","unmovableFoldersNames","filter","folder","isFolderOrChild","f","name","validateDeleteManyFoldersFiles","validateYupSchema","validateMoveManyFoldersFiles","body"],"mappings":"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"}
1
+ {"version":3,"file":"folder-file.mjs","sources":["../../../../../server/src/controllers/validation/admin/folder-file.ts"],"sourcesContent":["import { isEmpty, map, intersection } from 'lodash';\nimport { yup, validateYupSchema } from '@strapi/utils';\nimport { FOLDER_MODEL_UID } from '../../../constants';\nimport { folderExists } from './utils';\nimport { isFolderOrChild } from '../../utils/folders';\n\nimport type { Folder } from '../../../types';\n\nconst validateDeleteManyFoldersFilesSchema = yup\n .object()\n .shape({\n fileIds: yup.array().of(yup.strapiID().required()),\n folderIds: yup.array().of(yup.strapiID().required()),\n })\n .noUnknown()\n .required();\n\nconst validateStructureMoveManyFoldersFilesSchema = yup\n .object()\n .shape({\n destinationFolderId: yup\n .strapiID()\n .nullable()\n .defined()\n .test('folder-exists', 'destination folder does not exist', folderExists),\n fileIds: yup.array().of(yup.strapiID().required()),\n folderIds: yup.array().of(yup.strapiID().required()),\n })\n .noUnknown()\n .required();\n\nconst validateDuplicatesMoveManyFoldersFilesSchema = yup\n .object()\n .test('are-folders-unique', 'some folders already exist', async function areFoldersUnique(value) {\n const { folderIds, destinationFolderId } = value;\n if (isEmpty(folderIds)) return true;\n\n const folders = await strapi.db.query(FOLDER_MODEL_UID).findMany({\n select: ['name'],\n where: { id: { $in: folderIds } },\n });\n\n const existingFolders = await strapi.db.query(FOLDER_MODEL_UID).findMany({\n select: ['name'],\n where: { parent: { id: destinationFolderId } },\n });\n\n const duplicatedNames = intersection(map(existingFolders, 'name'), map(folders, 'name'));\n if (duplicatedNames.length > 0) {\n return this.createError({\n message: `some folders already exists: ${duplicatedNames.join(', ')}`,\n });\n }\n\n return true;\n });\n\nconst validateMoveFoldersNotInsideThemselvesSchema = yup\n .object()\n .test(\n 'dont-move-inside-self',\n 'folders cannot be moved inside themselves or one of its children',\n async function validateMoveFoldersNotInsideThemselves(value) {\n const { folderIds, destinationFolderId } = value;\n if (destinationFolderId === null || isEmpty(folderIds)) return true;\n\n const destinationFolder = await strapi.db.query(FOLDER_MODEL_UID).findOne({\n select: ['path'],\n where: { id: destinationFolderId },\n });\n\n const folders: Folder[] = await strapi.db.query(FOLDER_MODEL_UID).findMany({\n select: ['name', 'path'],\n where: { id: { $in: folderIds } },\n });\n\n const unmovableFoldersNames = folders\n .filter((folder) => isFolderOrChild(destinationFolder, folder))\n .map((f) => f.name);\n\n if (unmovableFoldersNames.length > 0) {\n return this.createError({\n message: `folders cannot be moved inside themselves or one of its children: ${unmovableFoldersNames.join(\n ', '\n )}`,\n });\n }\n\n return true;\n }\n );\n\nexport const validateDeleteManyFoldersFiles = validateYupSchema(\n validateDeleteManyFoldersFilesSchema\n);\n\nexport async function validateMoveManyFoldersFiles(body: unknown) {\n await validateYupSchema(validateStructureMoveManyFoldersFilesSchema)(body);\n await validateYupSchema(validateDuplicatesMoveManyFoldersFilesSchema)(body);\n await validateYupSchema(validateMoveFoldersNotInsideThemselvesSchema)(body);\n}\n"],"names":["validateDeleteManyFoldersFilesSchema","yup","object","shape","fileIds","array","of","strapiID","required","folderIds","noUnknown","validateStructureMoveManyFoldersFilesSchema","destinationFolderId","nullable","defined","test","folderExists","validateDuplicatesMoveManyFoldersFilesSchema","areFoldersUnique","value","isEmpty","folders","strapi","db","query","FOLDER_MODEL_UID","findMany","select","where","id","$in","existingFolders","parent","duplicatedNames","intersection","map","length","createError","message","join","validateMoveFoldersNotInsideThemselvesSchema","validateMoveFoldersNotInsideThemselves","destinationFolder","findOne","unmovableFoldersNames","filter","folder","isFolderOrChild","f","name","validateDeleteManyFoldersFiles","validateYupSchema","validateMoveManyFoldersFiles","body"],"mappings":";;;;;;AAQA,MAAMA,oCAAAA,GAAuCC,GAAAA,CAC1CC,MAAM,EAAA,CACNC,KAAK,CAAC;IACLC,OAAAA,EAASH,GAAAA,CAAII,KAAK,EAAA,CAAGC,EAAE,CAACL,GAAAA,CAAIM,QAAQ,GAAGC,QAAQ,EAAA,CAAA;IAC/CC,SAAAA,EAAWR,GAAAA,CAAII,KAAK,EAAA,CAAGC,EAAE,CAACL,GAAAA,CAAIM,QAAQ,GAAGC,QAAQ,EAAA;AACnD,CAAA,CAAA,CACCE,SAAS,GACTF,QAAQ,EAAA;AAEX,MAAMG,2CAAAA,GAA8CV,GAAAA,CACjDC,MAAM,EAAA,CACNC,KAAK,CAAC;IACLS,mBAAAA,EAAqBX,GAAAA,CAClBM,QAAQ,EAAA,CACRM,QAAQ,EAAA,CACRC,OAAO,EAAA,CACPC,IAAI,CAAC,eAAA,EAAiB,mCAAA,EAAqCC,YAAAA,CAAAA;IAC9DZ,OAAAA,EAASH,GAAAA,CAAII,KAAK,EAAA,CAAGC,EAAE,CAACL,GAAAA,CAAIM,QAAQ,GAAGC,QAAQ,EAAA,CAAA;IAC/CC,SAAAA,EAAWR,GAAAA,CAAII,KAAK,EAAA,CAAGC,EAAE,CAACL,GAAAA,CAAIM,QAAQ,GAAGC,QAAQ,EAAA;AACnD,CAAA,CAAA,CACCE,SAAS,GACTF,QAAQ,EAAA;AAEX,MAAMS,4CAAAA,GAA+ChB,GAAAA,CAClDC,MAAM,EAAA,CACNa,IAAI,CAAC,oBAAA,EAAsB,4BAAA,EAA8B,eAAeG,gBAAAA,CAAiBC,KAAK,EAAA;AAC7F,IAAA,MAAM,EAAEV,SAAS,EAAEG,mBAAmB,EAAE,GAAGO,KAAAA;IAC3C,IAAIC,OAAAA,CAAQX,YAAY,OAAO,IAAA;IAE/B,MAAMY,OAAAA,GAAU,MAAMC,MAAAA,CAAOC,EAAE,CAACC,KAAK,CAACC,gBAAAA,CAAAA,CAAkBC,QAAQ,CAAC;QAC/DC,MAAAA,EAAQ;AAAC,YAAA;AAAO,SAAA;QAChBC,KAAAA,EAAO;YAAEC,EAAAA,EAAI;gBAAEC,GAAAA,EAAKrB;AAAU;AAAE;AAClC,KAAA,CAAA;IAEA,MAAMsB,eAAAA,GAAkB,MAAMT,MAAAA,CAAOC,EAAE,CAACC,KAAK,CAACC,gBAAAA,CAAAA,CAAkBC,QAAQ,CAAC;QACvEC,MAAAA,EAAQ;AAAC,YAAA;AAAO,SAAA;QAChBC,KAAAA,EAAO;YAAEI,MAAAA,EAAQ;gBAAEH,EAAAA,EAAIjB;AAAoB;AAAE;AAC/C,KAAA,CAAA;AAEA,IAAA,MAAMqB,kBAAkBC,YAAAA,CAAaC,GAAAA,CAAIJ,eAAAA,EAAiB,MAAA,CAAA,EAASI,IAAId,OAAAA,EAAS,MAAA,CAAA,CAAA;IAChF,IAAIY,eAAAA,CAAgBG,MAAM,GAAG,CAAA,EAAG;QAC9B,OAAO,IAAI,CAACC,WAAW,CAAC;AACtBC,YAAAA,OAAAA,EAAS,CAAC,6BAA6B,EAAEL,eAAAA,CAAgBM,IAAI,CAAC,IAAA,CAAA,CAAA;AAChE,SAAA,CAAA;AACF,IAAA;IAEA,OAAO,IAAA;AACT,CAAA,CAAA;AAEF,MAAMC,4CAAAA,GAA+CvC,GAAAA,CAClDC,MAAM,EAAA,CACNa,IAAI,CACH,uBAAA,EACA,kEAAA,EACA,eAAe0B,sCAAAA,CAAuCtB,KAAK,EAAA;AACzD,IAAA,MAAM,EAAEV,SAAS,EAAEG,mBAAmB,EAAE,GAAGO,KAAAA;AAC3C,IAAA,IAAIP,mBAAAA,KAAwB,IAAA,IAAQQ,OAAAA,CAAQX,SAAAA,CAAAA,EAAY,OAAO,IAAA;IAE/D,MAAMiC,iBAAAA,GAAoB,MAAMpB,MAAAA,CAAOC,EAAE,CAACC,KAAK,CAACC,gBAAAA,CAAAA,CAAkBkB,OAAO,CAAC;QACxEhB,MAAAA,EAAQ;AAAC,YAAA;AAAO,SAAA;QAChBC,KAAAA,EAAO;YAAEC,EAAAA,EAAIjB;AAAoB;AACnC,KAAA,CAAA;IAEA,MAAMS,OAAAA,GAAoB,MAAMC,MAAAA,CAAOC,EAAE,CAACC,KAAK,CAACC,gBAAAA,CAAAA,CAAkBC,QAAQ,CAAC;QACzEC,MAAAA,EAAQ;AAAC,YAAA,MAAA;AAAQ,YAAA;AAAO,SAAA;QACxBC,KAAAA,EAAO;YAAEC,EAAAA,EAAI;gBAAEC,GAAAA,EAAKrB;AAAU;AAAE;AAClC,KAAA,CAAA;AAEA,IAAA,MAAMmC,qBAAAA,GAAwBvB,OAAAA,CAC3BwB,MAAM,CAAC,CAACC,MAAAA,GAAWC,eAAAA,CAAgBL,iBAAAA,EAAmBI,MAAAA,CAAAA,CAAAA,CACtDX,GAAG,CAAC,CAACa,CAAAA,GAAMA,EAAEC,IAAI,CAAA;IAEpB,IAAIL,qBAAAA,CAAsBR,MAAM,GAAG,CAAA,EAAG;QACpC,OAAO,IAAI,CAACC,WAAW,CAAC;AACtBC,YAAAA,OAAAA,EAAS,CAAC,kEAAkE,EAAEM,qBAAAA,CAAsBL,IAAI,CACtG,IAAA,CAAA,CAAA;AAEJ,SAAA,CAAA;AACF,IAAA;IAEA,OAAO,IAAA;AACT,CAAA,CAAA;AAGG,MAAMW,8BAAAA,GAAiCC,iBAAAA,CAC5CnD,oCAAAA;AAGK,eAAeoD,6BAA6BC,IAAa,EAAA;AAC9D,IAAA,MAAMF,kBAAkBxC,2CAAAA,CAAAA,CAA6C0C,IAAAA,CAAAA;AACrE,IAAA,MAAMF,kBAAkBlC,4CAAAA,CAAAA,CAA8CoC,IAAAA,CAAAA;AACtE,IAAA,MAAMF,kBAAkBX,4CAAAA,CAAAA,CAA8Ca,IAAAA,CAAAA;AACxE;;;;"}
@@ -1,6 +1,5 @@
1
1
  'use strict';
2
2
 
3
- var fp = require('lodash/fp');
4
3
  var utils = require('@strapi/utils');
5
4
  var index = require('../../../utils/index.js');
6
5
  var constants = require('../../../constants.js');
@@ -20,13 +19,13 @@ const isNameUniqueInFolder = (id)=>{
20
19
  filters.id = {
21
20
  $ne: id
22
21
  };
23
- if (fp.isUndefined(name)) {
22
+ if (name === undefined) {
24
23
  const existingFolder = await strapi.db.query(constants.FOLDER_MODEL_UID).findOne({
25
24
  where: {
26
25
  id
27
26
  }
28
27
  });
29
- filters.name = fp.get('name', existingFolder);
28
+ filters.name = existingFolder?.name;
30
29
  }
31
30
  }
32
31
  const doesExist = await exists(filters);
@@ -40,7 +39,7 @@ const validateCreateFolderSchema = utils.yup.object().shape({
40
39
  const validateUpdateFolderSchema = (id)=>utils.yup.object().shape({
41
40
  name: utils.yup.string().min(1).matches(NO_SLASH_REGEX, 'name cannot contain slashes').matches(NO_SPACES_AROUND, 'name cannot start or end with a whitespace').test('is-folder-unique', 'A folder with this name already exists', isNameUniqueInFolder(id)),
42
41
  parent: utils.yup.strapiID().nullable().test('folder-exists', 'parent folder does not exist', utils$1.folderExists).test('dont-move-inside-self', 'folder cannot be moved inside itself', async function test(parent) {
43
- if (fp.isNil(parent)) return true;
42
+ if (parent == null) return true;
44
43
  const destinationFolder = await strapi.db.query(constants.FOLDER_MODEL_UID).findOne({
45
44
  select: [
46
45
  'path'
@@ -1 +1 @@
1
- {"version":3,"file":"folder.js","sources":["../../../../../server/src/controllers/validation/admin/folder.ts"],"sourcesContent":["import { isUndefined, get, isNil } from 'lodash/fp';\nimport { yup, validateYupSchema } from '@strapi/utils';\nimport { getService } from '../../../utils';\nimport { FOLDER_MODEL_UID } from '../../../constants';\nimport { folderExists } from './utils';\nimport { isFolderOrChild } from '../../utils/folders';\n\nconst NO_SLASH_REGEX = /^[^/]+$/;\nconst NO_SPACES_AROUND = /^(?! ).+(?<! )$/;\n\nconst isNameUniqueInFolder = (id?: number): yup.TestFunction<string | undefined> => {\n return async function test(name?: string) {\n const { exists } = getService('folder');\n const filters: Record<string, unknown> = { name, parent: this.parent.parent || null };\n if (id) {\n filters.id = { $ne: id };\n\n if (isUndefined(name)) {\n const existingFolder = await strapi.db.query(FOLDER_MODEL_UID).findOne({ where: { id } });\n filters.name = get('name', existingFolder);\n }\n }\n\n const doesExist = await exists(filters);\n return !doesExist;\n };\n};\n\nconst validateCreateFolderSchema = yup\n .object()\n .shape({\n name: yup\n .string()\n .min(1)\n .matches(NO_SLASH_REGEX, 'name cannot contain slashes')\n .matches(NO_SPACES_AROUND, 'name cannot start or end with a whitespace')\n .required()\n .test('is-folder-unique', 'A folder with this name already exists', isNameUniqueInFolder()),\n parent: yup\n .strapiID()\n .nullable()\n .test('folder-exists', 'parent folder does not exist', folderExists),\n })\n .noUnknown()\n .required();\n\nconst validateUpdateFolderSchema = (id: number) =>\n yup\n .object()\n .shape({\n name: yup\n .string()\n .min(1)\n .matches(NO_SLASH_REGEX, 'name cannot contain slashes')\n .matches(NO_SPACES_AROUND, 'name cannot start or end with a whitespace')\n .test(\n 'is-folder-unique',\n 'A folder with this name already exists',\n isNameUniqueInFolder(id)\n ),\n parent: yup\n .strapiID()\n .nullable()\n .test('folder-exists', 'parent folder does not exist', folderExists)\n .test(\n 'dont-move-inside-self',\n 'folder cannot be moved inside itself',\n async function test(parent) {\n if (isNil(parent)) return true;\n\n const destinationFolder = await strapi.db.query(FOLDER_MODEL_UID).findOne({\n select: ['path'],\n where: { id: parent },\n });\n\n const currentFolder = await strapi.db.query(FOLDER_MODEL_UID).findOne({\n select: ['path'],\n where: { id },\n });\n\n if (!destinationFolder || !currentFolder) return true;\n\n return !isFolderOrChild(destinationFolder, currentFolder);\n }\n ),\n })\n .noUnknown()\n .required();\n\nexport const validateCreateFolder = validateYupSchema(validateCreateFolderSchema);\nexport const validateUpdateFolder = (id: number) =>\n validateYupSchema(validateUpdateFolderSchema(id));\n"],"names":["NO_SLASH_REGEX","NO_SPACES_AROUND","isNameUniqueInFolder","id","test","name","exists","getService","filters","parent","$ne","isUndefined","existingFolder","strapi","db","query","FOLDER_MODEL_UID","findOne","where","get","doesExist","validateCreateFolderSchema","yup","object","shape","string","min","matches","required","strapiID","nullable","folderExists","noUnknown","validateUpdateFolderSchema","isNil","destinationFolder","select","currentFolder","isFolderOrChild","validateCreateFolder","validateYupSchema","validateUpdateFolder"],"mappings":"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"}
1
+ {"version":3,"file":"folder.js","sources":["../../../../../server/src/controllers/validation/admin/folder.ts"],"sourcesContent":["import { yup, validateYupSchema } from '@strapi/utils';\nimport { getService } from '../../../utils';\nimport { FOLDER_MODEL_UID } from '../../../constants';\nimport { folderExists } from './utils';\nimport { isFolderOrChild } from '../../utils/folders';\n\nconst NO_SLASH_REGEX = /^[^/]+$/;\nconst NO_SPACES_AROUND = /^(?! ).+(?<! )$/;\n\nconst isNameUniqueInFolder = (id?: number): yup.TestFunction<string | undefined> => {\n return async function test(name?: string) {\n const { exists } = getService('folder');\n const filters: Record<string, unknown> = { name, parent: this.parent.parent || null };\n if (id) {\n filters.id = { $ne: id };\n\n if (name === undefined) {\n const existingFolder = await strapi.db.query(FOLDER_MODEL_UID).findOne({ where: { id } });\n filters.name = existingFolder?.name;\n }\n }\n\n const doesExist = await exists(filters);\n return !doesExist;\n };\n};\n\nconst validateCreateFolderSchema = yup\n .object()\n .shape({\n name: yup\n .string()\n .min(1)\n .matches(NO_SLASH_REGEX, 'name cannot contain slashes')\n .matches(NO_SPACES_AROUND, 'name cannot start or end with a whitespace')\n .required()\n .test('is-folder-unique', 'A folder with this name already exists', isNameUniqueInFolder()),\n parent: yup\n .strapiID()\n .nullable()\n .test('folder-exists', 'parent folder does not exist', folderExists),\n })\n .noUnknown()\n .required();\n\nconst validateUpdateFolderSchema = (id: number) =>\n yup\n .object()\n .shape({\n name: yup\n .string()\n .min(1)\n .matches(NO_SLASH_REGEX, 'name cannot contain slashes')\n .matches(NO_SPACES_AROUND, 'name cannot start or end with a whitespace')\n .test(\n 'is-folder-unique',\n 'A folder with this name already exists',\n isNameUniqueInFolder(id)\n ),\n parent: yup\n .strapiID()\n .nullable()\n .test('folder-exists', 'parent folder does not exist', folderExists)\n .test(\n 'dont-move-inside-self',\n 'folder cannot be moved inside itself',\n async function test(parent) {\n if (parent == null) return true;\n\n const destinationFolder = await strapi.db.query(FOLDER_MODEL_UID).findOne({\n select: ['path'],\n where: { id: parent },\n });\n\n const currentFolder = await strapi.db.query(FOLDER_MODEL_UID).findOne({\n select: ['path'],\n where: { id },\n });\n\n if (!destinationFolder || !currentFolder) return true;\n\n return !isFolderOrChild(destinationFolder, currentFolder);\n }\n ),\n })\n .noUnknown()\n .required();\n\nexport const validateCreateFolder = validateYupSchema(validateCreateFolderSchema);\nexport const validateUpdateFolder = (id: number) =>\n validateYupSchema(validateUpdateFolderSchema(id));\n"],"names":["NO_SLASH_REGEX","NO_SPACES_AROUND","isNameUniqueInFolder","id","test","name","exists","getService","filters","parent","$ne","undefined","existingFolder","strapi","db","query","FOLDER_MODEL_UID","findOne","where","doesExist","validateCreateFolderSchema","yup","object","shape","string","min","matches","required","strapiID","nullable","folderExists","noUnknown","validateUpdateFolderSchema","destinationFolder","select","currentFolder","isFolderOrChild","validateCreateFolder","validateYupSchema","validateUpdateFolder"],"mappings":"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"}
@@ -1,4 +1,3 @@
1
- import { isNil, isUndefined, get } from 'lodash/fp';
2
1
  import { yup, validateYupSchema } from '@strapi/utils';
3
2
  import { getService } from '../../../utils/index.mjs';
4
3
  import { FOLDER_MODEL_UID } from '../../../constants.mjs';
@@ -18,13 +17,13 @@ const isNameUniqueInFolder = (id)=>{
18
17
  filters.id = {
19
18
  $ne: id
20
19
  };
21
- if (isUndefined(name)) {
20
+ if (name === undefined) {
22
21
  const existingFolder = await strapi.db.query(FOLDER_MODEL_UID).findOne({
23
22
  where: {
24
23
  id
25
24
  }
26
25
  });
27
- filters.name = get('name', existingFolder);
26
+ filters.name = existingFolder?.name;
28
27
  }
29
28
  }
30
29
  const doesExist = await exists(filters);
@@ -38,7 +37,7 @@ const validateCreateFolderSchema = yup.object().shape({
38
37
  const validateUpdateFolderSchema = (id)=>yup.object().shape({
39
38
  name: yup.string().min(1).matches(NO_SLASH_REGEX, 'name cannot contain slashes').matches(NO_SPACES_AROUND, 'name cannot start or end with a whitespace').test('is-folder-unique', 'A folder with this name already exists', isNameUniqueInFolder(id)),
40
39
  parent: yup.strapiID().nullable().test('folder-exists', 'parent folder does not exist', folderExists).test('dont-move-inside-self', 'folder cannot be moved inside itself', async function test(parent) {
41
- if (isNil(parent)) return true;
40
+ if (parent == null) return true;
42
41
  const destinationFolder = await strapi.db.query(FOLDER_MODEL_UID).findOne({
43
42
  select: [
44
43
  'path'
@@ -1 +1 @@
1
- {"version":3,"file":"folder.mjs","sources":["../../../../../server/src/controllers/validation/admin/folder.ts"],"sourcesContent":["import { isUndefined, get, isNil } from 'lodash/fp';\nimport { yup, validateYupSchema } from '@strapi/utils';\nimport { getService } from '../../../utils';\nimport { FOLDER_MODEL_UID } from '../../../constants';\nimport { folderExists } from './utils';\nimport { isFolderOrChild } from '../../utils/folders';\n\nconst NO_SLASH_REGEX = /^[^/]+$/;\nconst NO_SPACES_AROUND = /^(?! ).+(?<! )$/;\n\nconst isNameUniqueInFolder = (id?: number): yup.TestFunction<string | undefined> => {\n return async function test(name?: string) {\n const { exists } = getService('folder');\n const filters: Record<string, unknown> = { name, parent: this.parent.parent || null };\n if (id) {\n filters.id = { $ne: id };\n\n if (isUndefined(name)) {\n const existingFolder = await strapi.db.query(FOLDER_MODEL_UID).findOne({ where: { id } });\n filters.name = get('name', existingFolder);\n }\n }\n\n const doesExist = await exists(filters);\n return !doesExist;\n };\n};\n\nconst validateCreateFolderSchema = yup\n .object()\n .shape({\n name: yup\n .string()\n .min(1)\n .matches(NO_SLASH_REGEX, 'name cannot contain slashes')\n .matches(NO_SPACES_AROUND, 'name cannot start or end with a whitespace')\n .required()\n .test('is-folder-unique', 'A folder with this name already exists', isNameUniqueInFolder()),\n parent: yup\n .strapiID()\n .nullable()\n .test('folder-exists', 'parent folder does not exist', folderExists),\n })\n .noUnknown()\n .required();\n\nconst validateUpdateFolderSchema = (id: number) =>\n yup\n .object()\n .shape({\n name: yup\n .string()\n .min(1)\n .matches(NO_SLASH_REGEX, 'name cannot contain slashes')\n .matches(NO_SPACES_AROUND, 'name cannot start or end with a whitespace')\n .test(\n 'is-folder-unique',\n 'A folder with this name already exists',\n isNameUniqueInFolder(id)\n ),\n parent: yup\n .strapiID()\n .nullable()\n .test('folder-exists', 'parent folder does not exist', folderExists)\n .test(\n 'dont-move-inside-self',\n 'folder cannot be moved inside itself',\n async function test(parent) {\n if (isNil(parent)) return true;\n\n const destinationFolder = await strapi.db.query(FOLDER_MODEL_UID).findOne({\n select: ['path'],\n where: { id: parent },\n });\n\n const currentFolder = await strapi.db.query(FOLDER_MODEL_UID).findOne({\n select: ['path'],\n where: { id },\n });\n\n if (!destinationFolder || !currentFolder) return true;\n\n return !isFolderOrChild(destinationFolder, currentFolder);\n }\n ),\n })\n .noUnknown()\n .required();\n\nexport const validateCreateFolder = validateYupSchema(validateCreateFolderSchema);\nexport const validateUpdateFolder = (id: number) =>\n validateYupSchema(validateUpdateFolderSchema(id));\n"],"names":["NO_SLASH_REGEX","NO_SPACES_AROUND","isNameUniqueInFolder","id","test","name","exists","getService","filters","parent","$ne","isUndefined","existingFolder","strapi","db","query","FOLDER_MODEL_UID","findOne","where","get","doesExist","validateCreateFolderSchema","yup","object","shape","string","min","matches","required","strapiID","nullable","folderExists","noUnknown","validateUpdateFolderSchema","isNil","destinationFolder","select","currentFolder","isFolderOrChild","validateCreateFolder","validateYupSchema","validateUpdateFolder"],"mappings":"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"}
1
+ {"version":3,"file":"folder.mjs","sources":["../../../../../server/src/controllers/validation/admin/folder.ts"],"sourcesContent":["import { yup, validateYupSchema } from '@strapi/utils';\nimport { getService } from '../../../utils';\nimport { FOLDER_MODEL_UID } from '../../../constants';\nimport { folderExists } from './utils';\nimport { isFolderOrChild } from '../../utils/folders';\n\nconst NO_SLASH_REGEX = /^[^/]+$/;\nconst NO_SPACES_AROUND = /^(?! ).+(?<! )$/;\n\nconst isNameUniqueInFolder = (id?: number): yup.TestFunction<string | undefined> => {\n return async function test(name?: string) {\n const { exists } = getService('folder');\n const filters: Record<string, unknown> = { name, parent: this.parent.parent || null };\n if (id) {\n filters.id = { $ne: id };\n\n if (name === undefined) {\n const existingFolder = await strapi.db.query(FOLDER_MODEL_UID).findOne({ where: { id } });\n filters.name = existingFolder?.name;\n }\n }\n\n const doesExist = await exists(filters);\n return !doesExist;\n };\n};\n\nconst validateCreateFolderSchema = yup\n .object()\n .shape({\n name: yup\n .string()\n .min(1)\n .matches(NO_SLASH_REGEX, 'name cannot contain slashes')\n .matches(NO_SPACES_AROUND, 'name cannot start or end with a whitespace')\n .required()\n .test('is-folder-unique', 'A folder with this name already exists', isNameUniqueInFolder()),\n parent: yup\n .strapiID()\n .nullable()\n .test('folder-exists', 'parent folder does not exist', folderExists),\n })\n .noUnknown()\n .required();\n\nconst validateUpdateFolderSchema = (id: number) =>\n yup\n .object()\n .shape({\n name: yup\n .string()\n .min(1)\n .matches(NO_SLASH_REGEX, 'name cannot contain slashes')\n .matches(NO_SPACES_AROUND, 'name cannot start or end with a whitespace')\n .test(\n 'is-folder-unique',\n 'A folder with this name already exists',\n isNameUniqueInFolder(id)\n ),\n parent: yup\n .strapiID()\n .nullable()\n .test('folder-exists', 'parent folder does not exist', folderExists)\n .test(\n 'dont-move-inside-self',\n 'folder cannot be moved inside itself',\n async function test(parent) {\n if (parent == null) return true;\n\n const destinationFolder = await strapi.db.query(FOLDER_MODEL_UID).findOne({\n select: ['path'],\n where: { id: parent },\n });\n\n const currentFolder = await strapi.db.query(FOLDER_MODEL_UID).findOne({\n select: ['path'],\n where: { id },\n });\n\n if (!destinationFolder || !currentFolder) return true;\n\n return !isFolderOrChild(destinationFolder, currentFolder);\n }\n ),\n })\n .noUnknown()\n .required();\n\nexport const validateCreateFolder = validateYupSchema(validateCreateFolderSchema);\nexport const validateUpdateFolder = (id: number) =>\n validateYupSchema(validateUpdateFolderSchema(id));\n"],"names":["NO_SLASH_REGEX","NO_SPACES_AROUND","isNameUniqueInFolder","id","test","name","exists","getService","filters","parent","$ne","undefined","existingFolder","strapi","db","query","FOLDER_MODEL_UID","findOne","where","doesExist","validateCreateFolderSchema","yup","object","shape","string","min","matches","required","strapiID","nullable","folderExists","noUnknown","validateUpdateFolderSchema","destinationFolder","select","currentFolder","isFolderOrChild","validateCreateFolder","validateYupSchema","validateUpdateFolder"],"mappings":"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"}
@@ -1,7 +1,6 @@
1
1
  'use strict';
2
2
 
3
3
  var utils = require('@strapi/utils');
4
- var fp = require('lodash/fp');
5
4
  var index = require('../../../utils/index.js');
6
5
 
7
6
  const focalPointSchema = utils.yup.object({
@@ -14,7 +13,7 @@ const fileInfoSchema = utils.yup.object({
14
13
  caption: utils.yup.string().nullable(),
15
14
  focalPoint: focalPointSchema,
16
15
  folder: utils.yup.strapiID().nullable().test('folder-exists', 'the folder does not exist', async (folderId)=>{
17
- if (fp.isNil(folderId)) {
16
+ if (folderId == null) {
18
17
  return true;
19
18
  }
20
19
  const exists = await index.getService('folder').exists({
@@ -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;