@strapi/upload 5.29.0 → 5.30.1

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 (301) hide show
  1. package/dist/admin/ai/components/AIAssetCard.js +31 -9
  2. package/dist/admin/ai/components/AIAssetCard.js.map +1 -1
  3. package/dist/admin/ai/components/AIAssetCard.mjs +25 -3
  4. package/dist/admin/ai/components/AIAssetCard.mjs.map +1 -1
  5. package/dist/admin/ai/components/AIUploadModal.js +3 -2
  6. package/dist/admin/ai/components/AIUploadModal.js.map +1 -1
  7. package/dist/admin/ai/components/AIUploadModal.mjs +3 -2
  8. package/dist/admin/ai/components/AIUploadModal.mjs.map +1 -1
  9. package/dist/admin/components/AssetCard/AssetCard.js +5 -4
  10. package/dist/admin/components/AssetCard/AssetCard.js.map +1 -1
  11. package/dist/admin/components/AssetCard/AssetCard.mjs +2 -1
  12. package/dist/admin/components/AssetCard/AssetCard.mjs.map +1 -1
  13. package/dist/admin/components/AssetCard/AssetCardBase.js +1 -1
  14. package/dist/admin/components/AssetCard/AssetCardBase.mjs +1 -1
  15. package/dist/admin/components/AssetCard/DocAssetCard.js +3 -7
  16. package/dist/admin/components/AssetCard/DocAssetCard.js.map +1 -1
  17. package/dist/admin/components/AssetCard/DocAssetCard.mjs +3 -7
  18. package/dist/admin/components/AssetCard/DocAssetCard.mjs.map +1 -1
  19. package/dist/admin/components/AssetCard/ImageAssetCard.js +1 -1
  20. package/dist/admin/components/AssetCard/ImageAssetCard.js.map +1 -1
  21. package/dist/admin/components/AssetCard/ImageAssetCard.mjs +1 -1
  22. package/dist/admin/components/AssetCard/ImageAssetCard.mjs.map +1 -1
  23. package/dist/admin/components/AssetCard/UploadingAssetCard.js +5 -4
  24. package/dist/admin/components/AssetCard/UploadingAssetCard.js.map +1 -1
  25. package/dist/admin/components/AssetCard/UploadingAssetCard.mjs +2 -1
  26. package/dist/admin/components/AssetCard/UploadingAssetCard.mjs.map +1 -1
  27. package/dist/admin/components/AssetCard/VideoAssetCard.js +1 -1
  28. package/dist/admin/components/AssetCard/VideoAssetCard.mjs +1 -1
  29. package/dist/admin/components/AssetDialog/AssetDialog.js +1 -1
  30. package/dist/admin/components/AssetDialog/AssetDialog.mjs +1 -1
  31. package/dist/admin/components/AssetDialog/BrowseStep/BrowseStep.js +2 -0
  32. package/dist/admin/components/AssetDialog/BrowseStep/BrowseStep.js.map +1 -1
  33. package/dist/admin/components/AssetDialog/BrowseStep/BrowseStep.mjs +2 -0
  34. package/dist/admin/components/AssetDialog/BrowseStep/BrowseStep.mjs.map +1 -1
  35. package/dist/admin/components/AssetDialog/BrowseStep/Filters.js +1 -1
  36. package/dist/admin/components/AssetDialog/BrowseStep/Filters.mjs +1 -1
  37. package/dist/admin/components/AssetDialog/BrowseStep/SearchAsset/SearchAsset.js +3 -3
  38. package/dist/admin/components/AssetDialog/BrowseStep/SearchAsset/SearchAsset.js.map +1 -1
  39. package/dist/admin/components/AssetDialog/BrowseStep/SearchAsset/SearchAsset.mjs +2 -2
  40. package/dist/admin/components/AssetDialog/BrowseStep/SearchAsset/SearchAsset.mjs.map +1 -1
  41. package/dist/admin/components/AssetDialog/SelectedStep/SelectedStep.js +1 -1
  42. package/dist/admin/components/AssetDialog/SelectedStep/SelectedStep.mjs +1 -1
  43. package/dist/admin/components/Breadcrumbs/Breadcrumbs.js.map +1 -1
  44. package/dist/admin/components/Breadcrumbs/Breadcrumbs.mjs.map +1 -1
  45. package/dist/admin/components/Breadcrumbs/CrumbSimpleMenuAsync.js +1 -1
  46. package/dist/admin/components/Breadcrumbs/CrumbSimpleMenuAsync.mjs +1 -1
  47. package/dist/admin/components/BulkMoveDialog/BulkMoveDialog.js +1 -1
  48. package/dist/admin/components/BulkMoveDialog/BulkMoveDialog.mjs +1 -1
  49. package/dist/admin/components/CopyLinkButton/CopyLinkButton.js +1 -1
  50. package/dist/admin/components/CopyLinkButton/CopyLinkButton.mjs +1 -1
  51. package/dist/admin/components/EditAssetDialog/EditAssetContent.js +9 -6
  52. package/dist/admin/components/EditAssetDialog/EditAssetContent.js.map +1 -1
  53. package/dist/admin/components/EditAssetDialog/EditAssetContent.mjs +8 -5
  54. package/dist/admin/components/EditAssetDialog/EditAssetContent.mjs.map +1 -1
  55. package/dist/admin/components/EditAssetDialog/PreviewBox/AssetPreview.js +15 -34
  56. package/dist/admin/components/EditAssetDialog/PreviewBox/AssetPreview.js.map +1 -1
  57. package/dist/admin/components/EditAssetDialog/PreviewBox/AssetPreview.mjs +15 -34
  58. package/dist/admin/components/EditAssetDialog/PreviewBox/AssetPreview.mjs.map +1 -1
  59. package/dist/admin/components/EditAssetDialog/PreviewBox/CroppingActions.js +1 -1
  60. package/dist/admin/components/EditAssetDialog/PreviewBox/CroppingActions.mjs +1 -1
  61. package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.js +5 -4
  62. package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.js.map +1 -1
  63. package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.mjs +3 -2
  64. package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.mjs.map +1 -1
  65. package/dist/admin/components/EditAssetDialog/ReplaceMediaButton.js +3 -3
  66. package/dist/admin/components/EditAssetDialog/ReplaceMediaButton.js.map +1 -1
  67. package/dist/admin/components/EditAssetDialog/ReplaceMediaButton.mjs +2 -2
  68. package/dist/admin/components/EditAssetDialog/ReplaceMediaButton.mjs.map +1 -1
  69. package/dist/admin/components/EditFolderDialog/EditFolderDialog.js +3 -2
  70. package/dist/admin/components/EditFolderDialog/EditFolderDialog.js.map +1 -1
  71. package/dist/admin/components/EditFolderDialog/EditFolderDialog.mjs +3 -2
  72. package/dist/admin/components/EditFolderDialog/EditFolderDialog.mjs.map +1 -1
  73. package/dist/admin/components/EditFolderDialog/ModalHeader/ModalHeader.js +1 -1
  74. package/dist/admin/components/EditFolderDialog/ModalHeader/ModalHeader.mjs +1 -1
  75. package/dist/admin/components/EmptyAssets/EmptyAssetGrid.js.map +1 -1
  76. package/dist/admin/components/EmptyAssets/EmptyAssetGrid.mjs.map +1 -1
  77. package/dist/admin/components/FilterList/FilterList.js.map +1 -1
  78. package/dist/admin/components/FilterList/FilterList.mjs.map +1 -1
  79. package/dist/admin/components/FilterList/FilterTag.js.map +1 -1
  80. package/dist/admin/components/FilterList/FilterTag.mjs.map +1 -1
  81. package/dist/admin/components/FolderCard/FolderCardBody/FolderCardBody.js.map +1 -1
  82. package/dist/admin/components/FolderCard/FolderCardBody/FolderCardBody.mjs.map +1 -1
  83. package/dist/admin/components/FolderCard/FolderCardCheckbox/FolderCardCheckbox.js.map +1 -1
  84. package/dist/admin/components/FolderCard/FolderCardCheckbox/FolderCardCheckbox.mjs.map +1 -1
  85. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAsset.js +8 -10
  86. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAsset.js.map +1 -1
  87. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAsset.mjs +5 -7
  88. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAsset.mjs.map +1 -1
  89. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssetActions.js +1 -1
  90. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssetActions.mjs +1 -1
  91. package/dist/admin/components/MediaLibraryInput/Carousel/EmptyStateAsset.js +1 -0
  92. package/dist/admin/components/MediaLibraryInput/Carousel/EmptyStateAsset.js.map +1 -1
  93. package/dist/admin/components/MediaLibraryInput/Carousel/EmptyStateAsset.mjs +1 -0
  94. package/dist/admin/components/MediaLibraryInput/Carousel/EmptyStateAsset.mjs.map +1 -1
  95. package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.js +1 -1
  96. package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.js.map +1 -1
  97. package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.mjs +1 -1
  98. package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.mjs.map +1 -1
  99. package/dist/admin/components/SelectTree/Option.js.map +1 -1
  100. package/dist/admin/components/SelectTree/Option.mjs.map +1 -1
  101. package/dist/admin/components/SelectTree/SelectTree.js.map +1 -1
  102. package/dist/admin/components/SelectTree/SelectTree.mjs.map +1 -1
  103. package/dist/admin/components/SelectTree/utils/flattenTree.js.map +1 -1
  104. package/dist/admin/components/SelectTree/utils/flattenTree.mjs.map +1 -1
  105. package/dist/admin/components/SortPicker/SortPicker.js +1 -0
  106. package/dist/admin/components/SortPicker/SortPicker.js.map +1 -1
  107. package/dist/admin/components/SortPicker/SortPicker.mjs +1 -0
  108. package/dist/admin/components/SortPicker/SortPicker.mjs.map +1 -1
  109. package/dist/admin/components/TableList/CellContent.js +1 -1
  110. package/dist/admin/components/TableList/CellContent.mjs +1 -1
  111. package/dist/admin/components/TableList/PreviewCell.js +5 -4
  112. package/dist/admin/components/TableList/PreviewCell.js.map +1 -1
  113. package/dist/admin/components/TableList/PreviewCell.mjs +2 -1
  114. package/dist/admin/components/TableList/PreviewCell.mjs.map +1 -1
  115. package/dist/admin/components/TableList/TableList.js +1 -0
  116. package/dist/admin/components/TableList/TableList.js.map +1 -1
  117. package/dist/admin/components/TableList/TableList.mjs +1 -0
  118. package/dist/admin/components/TableList/TableList.mjs.map +1 -1
  119. package/dist/admin/components/TableList/TableRows.js +1 -0
  120. package/dist/admin/components/TableList/TableRows.js.map +1 -1
  121. package/dist/admin/components/TableList/TableRows.mjs +1 -0
  122. package/dist/admin/components/TableList/TableRows.mjs.map +1 -1
  123. package/dist/admin/components/UploadAssetDialog/AddAssetStep/AddAssetStep.js +1 -1
  124. package/dist/admin/components/UploadAssetDialog/AddAssetStep/AddAssetStep.mjs +1 -1
  125. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromComputerForm.js +3 -2
  126. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromComputerForm.js.map +1 -1
  127. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromComputerForm.mjs +2 -1
  128. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromComputerForm.mjs.map +1 -1
  129. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.js +3 -3
  130. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.js.map +1 -1
  131. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.mjs +2 -2
  132. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.mjs.map +1 -1
  133. package/dist/admin/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.js +3 -3
  134. package/dist/admin/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.js.map +1 -1
  135. package/dist/admin/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.mjs +2 -2
  136. package/dist/admin/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.mjs.map +1 -1
  137. package/dist/admin/components/UploadProgress/UploadProgress.js.map +1 -1
  138. package/dist/admin/components/UploadProgress/UploadProgress.mjs.map +1 -1
  139. package/dist/admin/constants.js +5 -10
  140. package/dist/admin/constants.js.map +1 -1
  141. package/dist/admin/constants.mjs +5 -11
  142. package/dist/admin/constants.mjs.map +1 -1
  143. package/dist/admin/enums.js +20 -0
  144. package/dist/admin/enums.js.map +1 -0
  145. package/dist/admin/enums.mjs +17 -0
  146. package/dist/admin/enums.mjs.map +1 -0
  147. package/dist/admin/hooks/useBulkEdit.js +1 -1
  148. package/dist/admin/hooks/useBulkEdit.mjs +1 -1
  149. package/dist/admin/hooks/useBulkMove.js +1 -1
  150. package/dist/admin/hooks/useBulkMove.mjs +1 -1
  151. package/dist/admin/hooks/useBulkRemove.js +1 -1
  152. package/dist/admin/hooks/useBulkRemove.mjs +1 -1
  153. package/dist/admin/hooks/useConfig.js +2 -1
  154. package/dist/admin/hooks/useConfig.js.map +1 -1
  155. package/dist/admin/hooks/useConfig.mjs +2 -1
  156. package/dist/admin/hooks/useConfig.mjs.map +1 -1
  157. package/dist/admin/hooks/useEditAsset.js +1 -1
  158. package/dist/admin/hooks/useEditAsset.js.map +1 -1
  159. package/dist/admin/hooks/useEditAsset.mjs +1 -1
  160. package/dist/admin/hooks/useEditAsset.mjs.map +1 -1
  161. package/dist/admin/hooks/useEditFolder.js.map +1 -1
  162. package/dist/admin/hooks/useEditFolder.mjs.map +1 -1
  163. package/dist/admin/hooks/useFolder.js +1 -1
  164. package/dist/admin/hooks/useFolder.js.map +1 -1
  165. package/dist/admin/hooks/useFolder.mjs +1 -1
  166. package/dist/admin/hooks/useFolder.mjs.map +1 -1
  167. package/dist/admin/hooks/useFolderStructure.js +1 -1
  168. package/dist/admin/hooks/useFolderStructure.mjs +1 -1
  169. package/dist/admin/hooks/useModalQueryParams.js +2 -2
  170. package/dist/admin/hooks/useModalQueryParams.js.map +1 -1
  171. package/dist/admin/hooks/useModalQueryParams.mjs +1 -1
  172. package/dist/admin/hooks/useModalQueryParams.mjs.map +1 -1
  173. package/dist/admin/hooks/useRemoveAsset.js.map +1 -1
  174. package/dist/admin/hooks/useRemoveAsset.mjs.map +1 -1
  175. package/dist/admin/hooks/useTracking.js +24 -0
  176. package/dist/admin/hooks/useTracking.js.map +1 -0
  177. package/dist/admin/hooks/useTracking.mjs +22 -0
  178. package/dist/admin/hooks/useTracking.mjs.map +1 -0
  179. package/dist/admin/hooks/useUpload.js.map +1 -1
  180. package/dist/admin/hooks/useUpload.mjs.map +1 -1
  181. package/dist/admin/index.js +1 -0
  182. package/dist/admin/index.js.map +1 -1
  183. package/dist/admin/index.mjs +1 -0
  184. package/dist/admin/index.mjs.map +1 -1
  185. package/dist/admin/package.json.js +5 -5
  186. package/dist/admin/package.json.mjs +5 -5
  187. package/dist/admin/pages/App/App.js +1 -1
  188. package/dist/admin/pages/App/App.mjs +1 -1
  189. package/dist/admin/pages/App/ConfigureTheView/ConfigureTheView.js +1 -1
  190. package/dist/admin/pages/App/ConfigureTheView/ConfigureTheView.js.map +1 -1
  191. package/dist/admin/pages/App/ConfigureTheView/ConfigureTheView.mjs +1 -1
  192. package/dist/admin/pages/App/ConfigureTheView/ConfigureTheView.mjs.map +1 -1
  193. package/dist/admin/pages/App/ConfigureTheView/components/Settings.js +1 -0
  194. package/dist/admin/pages/App/ConfigureTheView/components/Settings.js.map +1 -1
  195. package/dist/admin/pages/App/ConfigureTheView/components/Settings.mjs +1 -0
  196. package/dist/admin/pages/App/ConfigureTheView/components/Settings.mjs.map +1 -1
  197. package/dist/admin/pages/App/ConfigureTheView/state/actionTypes.js.map +1 -1
  198. package/dist/admin/pages/App/ConfigureTheView/state/actionTypes.mjs.map +1 -1
  199. package/dist/admin/pages/App/MediaLibrary/MediaLibrary.js +1 -0
  200. package/dist/admin/pages/App/MediaLibrary/MediaLibrary.js.map +1 -1
  201. package/dist/admin/pages/App/MediaLibrary/MediaLibrary.mjs +1 -0
  202. package/dist/admin/pages/App/MediaLibrary/MediaLibrary.mjs.map +1 -1
  203. package/dist/admin/pages/App/MediaLibrary/components/BulkActions.js +1 -1
  204. package/dist/admin/pages/App/MediaLibrary/components/BulkActions.mjs +1 -1
  205. package/dist/admin/pages/App/MediaLibrary/components/EmptyOrNoPermissions.js +1 -1
  206. package/dist/admin/pages/App/MediaLibrary/components/EmptyOrNoPermissions.mjs +1 -1
  207. package/dist/admin/pages/App/MediaLibrary/components/Filters.js +3 -2
  208. package/dist/admin/pages/App/MediaLibrary/components/Filters.js.map +1 -1
  209. package/dist/admin/pages/App/MediaLibrary/components/Filters.mjs +3 -2
  210. package/dist/admin/pages/App/MediaLibrary/components/Filters.mjs.map +1 -1
  211. package/dist/admin/pages/App/MediaLibrary/components/Header.js +1 -1
  212. package/dist/admin/pages/App/MediaLibrary/components/Header.js.map +1 -1
  213. package/dist/admin/pages/App/MediaLibrary/components/Header.mjs +1 -1
  214. package/dist/admin/pages/App/MediaLibrary/components/Header.mjs.map +1 -1
  215. package/dist/admin/pages/SettingsPage/SettingsPage.js +1 -0
  216. package/dist/admin/pages/SettingsPage/SettingsPage.js.map +1 -1
  217. package/dist/admin/pages/SettingsPage/SettingsPage.mjs +1 -0
  218. package/dist/admin/pages/SettingsPage/SettingsPage.mjs.map +1 -1
  219. package/dist/admin/src/components/AssetCard/UploadingAssetCard.d.ts +1 -1
  220. package/dist/admin/src/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.d.ts +1 -1
  221. package/dist/admin/src/constants.d.ts +0 -6
  222. package/dist/admin/src/enums.d.ts +12 -0
  223. package/dist/admin/src/hooks/useTracking.d.ts +4 -0
  224. package/dist/admin/src/utils/icons.d.ts +14 -0
  225. package/dist/admin/src/utils/rawFileToAsset.d.ts +1 -1
  226. package/dist/admin/src/utils/typeFromMime.d.ts +2 -2
  227. package/dist/admin/src/utils/urlsToAssets.d.ts +1 -1
  228. package/dist/admin/translations/pt-BR.json.js +75 -7
  229. package/dist/admin/translations/pt-BR.json.js.map +1 -1
  230. package/dist/admin/translations/pt-BR.json.mjs +75 -7
  231. package/dist/admin/translations/pt-BR.json.mjs.map +1 -1
  232. package/dist/admin/utils/formatBytes.js.map +1 -1
  233. package/dist/admin/utils/formatBytes.mjs.map +1 -1
  234. package/dist/admin/utils/formatDuration.js.map +1 -1
  235. package/dist/admin/utils/formatDuration.mjs.map +1 -1
  236. package/dist/admin/utils/getFolderURL.js.map +1 -1
  237. package/dist/admin/utils/getFolderURL.mjs.map +1 -1
  238. package/dist/admin/utils/getTrad.js.map +1 -1
  239. package/dist/admin/utils/getTrad.mjs.map +1 -1
  240. package/dist/admin/utils/icons.js +23 -0
  241. package/dist/admin/utils/icons.js.map +1 -0
  242. package/dist/admin/utils/icons.mjs +19 -0
  243. package/dist/admin/utils/icons.mjs.map +1 -0
  244. package/dist/admin/utils/normalizeAPIError.js.map +1 -1
  245. package/dist/admin/utils/normalizeAPIError.mjs.map +1 -1
  246. package/dist/admin/utils/prefixFileUrlWithBackendUrl.js.map +1 -1
  247. package/dist/admin/utils/prefixFileUrlWithBackendUrl.mjs.map +1 -1
  248. package/dist/admin/utils/prefixPluginTranslations.js.map +1 -1
  249. package/dist/admin/utils/prefixPluginTranslations.mjs.map +1 -1
  250. package/dist/admin/utils/typeFromMime.js +15 -11
  251. package/dist/admin/utils/typeFromMime.js.map +1 -1
  252. package/dist/admin/utils/typeFromMime.mjs +15 -11
  253. package/dist/admin/utils/typeFromMime.mjs.map +1 -1
  254. package/dist/server/controllers/admin-folder-file.js +2 -2
  255. package/dist/server/controllers/admin-folder-file.js.map +1 -1
  256. package/dist/server/controllers/admin-folder-file.mjs +2 -2
  257. package/dist/server/controllers/admin-folder-file.mjs.map +1 -1
  258. package/dist/server/controllers/admin-upload.js +1 -1
  259. package/dist/server/controllers/admin-upload.js.map +1 -1
  260. package/dist/server/controllers/admin-upload.mjs +1 -1
  261. package/dist/server/controllers/admin-upload.mjs.map +1 -1
  262. package/dist/server/controllers/utils/folders.js.map +1 -1
  263. package/dist/server/controllers/utils/folders.mjs.map +1 -1
  264. package/dist/server/controllers/validation/admin/folder-file.js.map +1 -1
  265. package/dist/server/controllers/validation/admin/folder-file.mjs.map +1 -1
  266. package/dist/server/controllers/validation/admin/folder.js +1 -1
  267. package/dist/server/controllers/validation/admin/folder.js.map +1 -1
  268. package/dist/server/controllers/validation/admin/folder.mjs +1 -1
  269. package/dist/server/controllers/validation/admin/folder.mjs.map +1 -1
  270. package/dist/server/register.js.map +1 -1
  271. package/dist/server/register.mjs.map +1 -1
  272. package/dist/server/services/ai-metadata.js.map +1 -1
  273. package/dist/server/services/ai-metadata.mjs.map +1 -1
  274. package/dist/server/services/api-upload-folder.js.map +1 -1
  275. package/dist/server/services/api-upload-folder.mjs.map +1 -1
  276. package/dist/server/services/folder.js.map +1 -1
  277. package/dist/server/services/folder.mjs.map +1 -1
  278. package/dist/server/services/image-manipulation.js.map +1 -1
  279. package/dist/server/services/image-manipulation.mjs.map +1 -1
  280. package/dist/server/services/metrics.js +14 -1
  281. package/dist/server/services/metrics.js.map +1 -1
  282. package/dist/server/services/metrics.mjs +14 -1
  283. package/dist/server/services/metrics.mjs.map +1 -1
  284. package/dist/server/services/upload.js +8 -8
  285. package/dist/server/services/upload.js.map +1 -1
  286. package/dist/server/services/upload.mjs +8 -8
  287. package/dist/server/services/upload.mjs.map +1 -1
  288. package/dist/server/services/weekly-metrics.js +3 -6
  289. package/dist/server/services/weekly-metrics.js.map +1 -1
  290. package/dist/server/services/weekly-metrics.mjs +3 -6
  291. package/dist/server/services/weekly-metrics.mjs.map +1 -1
  292. package/dist/server/src/index.d.ts +1 -1
  293. package/dist/server/src/services/index.d.ts +1 -1
  294. package/dist/server/src/services/metrics.d.ts +1 -0
  295. package/dist/server/src/services/metrics.d.ts.map +1 -1
  296. package/dist/server/src/services/upload.d.ts.map +1 -1
  297. package/dist/server/src/services/weekly-metrics.d.ts +0 -1
  298. package/dist/server/src/services/weekly-metrics.d.ts.map +1 -1
  299. package/dist/server/utils/cron.js.map +1 -1
  300. package/dist/server/utils/cron.mjs.map +1 -1
  301. package/package.json +5 -5
@@ -1,16 +1,20 @@
1
- import { AssetType } from '../constants.mjs';
1
+ import { AssetType, DocType } from '../enums.mjs';
2
2
 
3
+ const MIME_TYPE_MAP = {
4
+ image: AssetType.Image,
5
+ video: AssetType.Video,
6
+ audio: AssetType.Audio,
7
+ pdf: DocType.Pdf,
8
+ csv: DocType.Csv,
9
+ // For XLS files the mime is application/vnd.ms-excel so we need to check for 'excel' not 'xls'
10
+ excel: DocType.Xls,
11
+ zip: DocType.Zip
12
+ };
13
+ const MIME_TYPE_KEYS = Object.keys(MIME_TYPE_MAP);
3
14
  const typeFromMime = (mime)=>{
4
- if (mime.includes(AssetType.Image)) {
5
- return AssetType.Image;
6
- }
7
- if (mime.includes(AssetType.Video)) {
8
- return AssetType.Video;
9
- }
10
- if (mime.includes(AssetType.Audio)) {
11
- return AssetType.Audio;
12
- }
13
- return AssetType.Document;
15
+ const mimeTypeKey = MIME_TYPE_KEYS.find((m)=>mime.toLowerCase().includes(m));
16
+ if (mimeTypeKey === undefined) return AssetType.Document;
17
+ return MIME_TYPE_MAP[mimeTypeKey] ?? AssetType.Document;
14
18
  };
15
19
 
16
20
  export { typeFromMime };
@@ -1 +1 @@
1
- {"version":3,"file":"typeFromMime.mjs","sources":["../../../admin/src/utils/typeFromMime.ts"],"sourcesContent":["import { AssetType } from '../constants';\n\nexport const typeFromMime = (mime: string) => {\n if (mime.includes(AssetType.Image)) {\n return AssetType.Image;\n }\n if (mime.includes(AssetType.Video)) {\n return AssetType.Video;\n }\n if (mime.includes(AssetType.Audio)) {\n return AssetType.Audio;\n }\n\n return AssetType.Document;\n};\n"],"names":["typeFromMime","mime","includes","AssetType","Image","Video","Audio","Document"],"mappings":";;AAEO,MAAMA,eAAe,CAACC,IAAAA,GAAAA;AAC3B,IAAA,IAAIA,IAAKC,CAAAA,QAAQ,CAACC,SAAAA,CAAUC,KAAK,CAAG,EAAA;AAClC,QAAA,OAAOD,UAAUC,KAAK;AACxB;AACA,IAAA,IAAIH,IAAKC,CAAAA,QAAQ,CAACC,SAAAA,CAAUE,KAAK,CAAG,EAAA;AAClC,QAAA,OAAOF,UAAUE,KAAK;AACxB;AACA,IAAA,IAAIJ,IAAKC,CAAAA,QAAQ,CAACC,SAAAA,CAAUG,KAAK,CAAG,EAAA;AAClC,QAAA,OAAOH,UAAUG,KAAK;AACxB;AAEA,IAAA,OAAOH,UAAUI,QAAQ;AAC3B;;;;"}
1
+ {"version":3,"file":"typeFromMime.mjs","sources":["../../../admin/src/utils/typeFromMime.ts"],"sourcesContent":["import { AssetType, DocType } from '../enums';\n\nconst MIME_TYPE_MAP: Record<string, AssetType | DocType> = {\n image: AssetType.Image,\n video: AssetType.Video,\n audio: AssetType.Audio,\n pdf: DocType.Pdf,\n csv: DocType.Csv,\n // For XLS files the mime is application/vnd.ms-excel so we need to check for 'excel' not 'xls'\n excel: DocType.Xls,\n zip: DocType.Zip,\n};\n\nconst MIME_TYPE_KEYS = Object.keys(MIME_TYPE_MAP) as Array<keyof typeof MIME_TYPE_MAP>;\n\nexport const typeFromMime = (mime: string): AssetType | DocType => {\n const mimeTypeKey = MIME_TYPE_KEYS.find((m) => mime.toLowerCase().includes(m));\n\n if (mimeTypeKey === undefined) return AssetType.Document;\n\n return MIME_TYPE_MAP[mimeTypeKey] ?? AssetType.Document;\n};\n"],"names":["MIME_TYPE_MAP","image","AssetType","Image","video","Video","audio","Audio","pdf","DocType","Pdf","csv","Csv","excel","Xls","zip","Zip","MIME_TYPE_KEYS","Object","keys","typeFromMime","mime","mimeTypeKey","find","m","toLowerCase","includes","undefined","Document"],"mappings":";;AAEA,MAAMA,aAAqD,GAAA;AACzDC,IAAAA,KAAAA,EAAOC,UAAUC,KAAK;AACtBC,IAAAA,KAAAA,EAAOF,UAAUG,KAAK;AACtBC,IAAAA,KAAAA,EAAOJ,UAAUK,KAAK;AACtBC,IAAAA,GAAAA,EAAKC,QAAQC,GAAG;AAChBC,IAAAA,GAAAA,EAAKF,QAAQG,GAAG;;AAEhBC,IAAAA,KAAAA,EAAOJ,QAAQK,GAAG;AAClBC,IAAAA,GAAAA,EAAKN,QAAQO;AACf,CAAA;AAEA,MAAMC,cAAAA,GAAiBC,MAAOC,CAAAA,IAAI,CAACnB,aAAAA,CAAAA;AAE5B,MAAMoB,eAAe,CAACC,IAAAA,GAAAA;IAC3B,MAAMC,WAAAA,GAAcL,cAAeM,CAAAA,IAAI,CAAC,CAACC,IAAMH,IAAKI,CAAAA,WAAW,EAAGC,CAAAA,QAAQ,CAACF,CAAAA,CAAAA,CAAAA;AAE3E,IAAA,IAAIF,WAAgBK,KAAAA,SAAAA,EAAW,OAAOzB,SAAAA,CAAU0B,QAAQ;AAExD,IAAA,OAAO5B,aAAa,CAACsB,WAAY,CAAA,IAAIpB,UAAU0B,QAAQ;AACzD;;;;"}
@@ -24,7 +24,7 @@ var adminFolderFile = {
24
24
  const deletedFiles = await fileService.deleteByIds(body.fileIds);
25
25
  const { folders: deletedFolders, totalFolderNumber, totalFileNumber } = await folderService.deleteByIds(body.folderIds);
26
26
  if (deletedFiles.length + deletedFolders.length > 1) {
27
- strapi.telemetry.send('didBulkDeleteMediaLibraryElements', {
27
+ await index.getService('metrics').trackUsage('didBulkDeleteMediaLibraryElements', {
28
28
  eventProperties: {
29
29
  rootFolderNumber: deletedFolders.length,
30
30
  rootAssetNumber: deletedFiles.length,
@@ -168,7 +168,7 @@ var adminFolderFile = {
168
168
  }
169
169
  }
170
170
  });
171
- strapi.telemetry.send('didBulkMoveMediaLibraryElements', {
171
+ await index.getService('metrics').trackUsage('didBulkMoveMediaLibraryElements', {
172
172
  eventProperties: {
173
173
  rootFolderNumber: updatedFolders.length,
174
174
  rootAssetNumber: updatedFiles.length,
@@ -1 +1 @@
1
- {"version":3,"file":"admin-folder-file.js","sources":["../../../server/src/controllers/admin-folder-file.ts"],"sourcesContent":["import { strings } from '@strapi/utils';\n\nimport type { Context } from 'koa';\n\nimport { getService } from '../utils';\nimport { ACTIONS, FOLDER_MODEL_UID, FILE_MODEL_UID } from '../constants';\nimport {\n validateDeleteManyFoldersFiles,\n validateMoveManyFoldersFiles,\n} from './validation/admin/folder-file';\n\nimport type { File, Folder } from '../types';\n\nexport default {\n async deleteMany(ctx: Context) {\n const { body } = ctx.request;\n const {\n state: { userAbility },\n } = ctx;\n\n const pmFolder = strapi.service('admin::permission').createPermissionsManager({\n ability: ctx.state.userAbility,\n model: FOLDER_MODEL_UID,\n });\n\n const pmFile = strapi.service('admin::permission').createPermissionsManager({\n ability: userAbility,\n action: ACTIONS.read,\n model: FILE_MODEL_UID,\n });\n\n await validateDeleteManyFoldersFiles(body);\n\n const fileService = getService('file');\n const folderService = getService('folder');\n\n const deletedFiles = await fileService.deleteByIds(body.fileIds);\n const {\n folders: deletedFolders,\n totalFolderNumber,\n totalFileNumber,\n } = await folderService.deleteByIds(body.folderIds);\n\n if (deletedFiles.length + deletedFolders.length > 1) {\n strapi.telemetry.send('didBulkDeleteMediaLibraryElements', {\n eventProperties: {\n rootFolderNumber: deletedFolders.length,\n rootAssetNumber: deletedFiles.length,\n totalFolderNumber,\n totalAssetNumber: totalFileNumber + deletedFiles.length,\n },\n });\n }\n\n ctx.body = {\n data: {\n files: await pmFile.sanitizeOutput(deletedFiles),\n folders: await pmFolder.sanitizeOutput(deletedFolders),\n },\n };\n },\n async moveMany(ctx: Context) {\n const { body } = ctx.request;\n const {\n state: { userAbility },\n } = ctx;\n\n const pmFolder = strapi.service('admin::permission').createPermissionsManager({\n ability: ctx.state.userAbility,\n model: FOLDER_MODEL_UID,\n });\n\n const pmFile = strapi.service('admin::permission').createPermissionsManager({\n ability: userAbility,\n action: ACTIONS.read,\n model: FILE_MODEL_UID,\n });\n\n await validateMoveManyFoldersFiles(body);\n const { folderIds = [], fileIds = [], destinationFolderId } = body;\n\n let totalFolderNumber = 0;\n let totalFileNumber = 0;\n\n const trx = await strapi.db.transaction();\n try {\n // fetch folders\n const existingFolders = await strapi.db\n .queryBuilder(FOLDER_MODEL_UID)\n .select(['id', 'pathId', 'path'])\n .where({ id: { $in: folderIds } })\n .transacting(trx.get())\n .forUpdate()\n .execute<Folder[]>();\n\n // fetch files\n const existingFiles = await strapi.db\n .queryBuilder(FILE_MODEL_UID)\n .select(['id'])\n .where({ id: { $in: fileIds } })\n .transacting(trx.get())\n .forUpdate()\n .execute<File[]>();\n\n // fetch destinationFolder path\n let destinationFolderPath = '/';\n if (destinationFolderId !== null) {\n const destinationFolder = await strapi.db\n .queryBuilder(FOLDER_MODEL_UID)\n .select('path')\n .where({ id: destinationFolderId })\n .transacting(trx.get())\n .first()\n .execute<Folder>();\n destinationFolderPath = destinationFolder.path;\n }\n\n const fileTable = strapi.getModel(FILE_MODEL_UID).collectionName;\n const folderTable = strapi.getModel(FOLDER_MODEL_UID).collectionName;\n const folderPathColName =\n // @ts-expect-error - no dynamic typings for the models\n strapi.db.metadata.get(FILE_MODEL_UID).attributes.folderPath.columnName;\n // @ts-expect-error - no dynamic typings for the models\n const pathColName = strapi.db.metadata.get(FOLDER_MODEL_UID).attributes.path.columnName;\n\n if (existingFolders.length > 0) {\n // update folders' parent relation\n // @ts-expect-error - no dynamic typings for the models\n const { joinTable } = strapi.db.metadata.get(FOLDER_MODEL_UID).attributes.parent;\n await strapi.db\n .queryBuilder(joinTable.name)\n .transacting(trx.get())\n .delete()\n .where({ [joinTable.joinColumn.name]: { $in: folderIds } })\n .execute();\n\n if (destinationFolderId !== null) {\n await strapi.db\n .queryBuilder(joinTable.name)\n .transacting(trx.get())\n .insert(\n existingFolders.map((folder) => ({\n [joinTable.inverseJoinColumn.name]: destinationFolderId,\n [joinTable.joinColumn.name]: folder.id,\n }))\n )\n .execute();\n }\n\n for (const existingFolder of existingFolders) {\n let replaceQuery;\n switch (strapi.db.dialect.client) {\n case 'sqlite':\n replaceQuery = '? || SUBSTRING(??, ?)';\n break;\n case 'postgres':\n replaceQuery = 'CONCAT(?::TEXT, SUBSTRING(??, ?::INTEGER))';\n break;\n default:\n replaceQuery = 'CONCAT(?, SUBSTRING(??, ?))';\n }\n\n // update path for folders themselves & folders below\n totalFolderNumber = await strapi.db\n .getConnection(folderTable)\n .transacting(trx.get())\n .where(pathColName, existingFolder.path)\n .orWhere(pathColName, 'like', `${existingFolder.path}/%`)\n .update(\n pathColName,\n strapi.db.connection.raw(replaceQuery, [\n strings.joinBy('/', destinationFolderPath, `${existingFolder.pathId}`),\n pathColName,\n existingFolder.path.length + 1,\n ])\n );\n\n // update path of files below\n totalFileNumber = await strapi.db\n .getConnection(fileTable)\n .transacting(trx.get())\n .where(folderPathColName, existingFolder.path)\n .orWhere(folderPathColName, 'like', `${existingFolder.path}/%`)\n .update(\n folderPathColName,\n strapi.db.connection.raw(replaceQuery, [\n strings.joinBy('/', destinationFolderPath, `${existingFolder.pathId}`),\n folderPathColName,\n existingFolder.path.length + 1,\n ])\n );\n }\n }\n\n if (existingFiles.length > 0) {\n // update files' folder relation (delete + insert; upsert not possible)\n // @ts-expect-error - no dynamic typings for the models\n const fileJoinTable = strapi.db.metadata.get(FILE_MODEL_UID).attributes.folder.joinTable;\n await strapi.db\n .queryBuilder(fileJoinTable.name)\n .transacting(trx.get())\n .delete()\n .where({ [fileJoinTable.joinColumn.name]: { $in: fileIds } })\n .execute();\n\n if (destinationFolderId !== null) {\n await strapi.db\n .queryBuilder(fileJoinTable.name)\n .transacting(trx.get())\n .insert(\n existingFiles.map((file) => ({\n [fileJoinTable.inverseJoinColumn.name]: destinationFolderId,\n [fileJoinTable.joinColumn.name]: file.id,\n }))\n )\n .execute();\n }\n\n // update files main fields (path + updatedBy)\n await strapi.db\n .getConnection(fileTable)\n .transacting(trx.get())\n .whereIn('id', fileIds)\n .update(folderPathColName, destinationFolderPath);\n }\n\n await trx.commit();\n } catch (e) {\n await trx.rollback();\n throw e;\n }\n\n const updatedFolders = await strapi.db.query(FOLDER_MODEL_UID).findMany({\n where: { id: { $in: folderIds } },\n });\n\n const updatedFiles = await strapi.db.query(FILE_MODEL_UID).findMany({\n where: { id: { $in: fileIds } },\n });\n\n strapi.telemetry.send('didBulkMoveMediaLibraryElements', {\n eventProperties: {\n rootFolderNumber: updatedFolders.length,\n rootAssetNumber: updatedFiles.length,\n totalFolderNumber,\n totalAssetNumber: totalFileNumber + updatedFiles.length,\n },\n });\n\n ctx.body = {\n data: {\n files: await pmFile.sanitizeOutput(updatedFiles),\n folders: await pmFolder.sanitizeOutput(updatedFolders),\n },\n };\n },\n};\n"],"names":["deleteMany","ctx","body","request","state","userAbility","pmFolder","strapi","service","createPermissionsManager","ability","model","FOLDER_MODEL_UID","pmFile","action","ACTIONS","read","FILE_MODEL_UID","validateDeleteManyFoldersFiles","fileService","getService","folderService","deletedFiles","deleteByIds","fileIds","folders","deletedFolders","totalFolderNumber","totalFileNumber","folderIds","length","telemetry","send","eventProperties","rootFolderNumber","rootAssetNumber","totalAssetNumber","data","files","sanitizeOutput","moveMany","validateMoveManyFoldersFiles","destinationFolderId","trx","db","transaction","existingFolders","queryBuilder","select","where","id","$in","transacting","get","forUpdate","execute","existingFiles","destinationFolderPath","destinationFolder","first","path","fileTable","getModel","collectionName","folderTable","folderPathColName","metadata","attributes","folderPath","columnName","pathColName","joinTable","parent","name","delete","joinColumn","insert","map","folder","inverseJoinColumn","existingFolder","replaceQuery","dialect","client","getConnection","orWhere","update","connection","raw","strings","joinBy","pathId","fileJoinTable","file","whereIn","commit","e","rollback","updatedFolders","query","findMany","updatedFiles"],"mappings":"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"}
1
+ {"version":3,"file":"admin-folder-file.js","sources":["../../../server/src/controllers/admin-folder-file.ts"],"sourcesContent":["import { strings } from '@strapi/utils';\n\nimport type { Context } from 'koa';\n\nimport { getService } from '../utils';\nimport { ACTIONS, FOLDER_MODEL_UID, FILE_MODEL_UID } from '../constants';\nimport {\n validateDeleteManyFoldersFiles,\n validateMoveManyFoldersFiles,\n} from './validation/admin/folder-file';\n\nimport type { File, Folder } from '../types';\n\nexport default {\n async deleteMany(ctx: Context) {\n const { body } = ctx.request;\n const {\n state: { userAbility },\n } = ctx;\n\n const pmFolder = strapi.service('admin::permission').createPermissionsManager({\n ability: ctx.state.userAbility,\n model: FOLDER_MODEL_UID,\n });\n\n const pmFile = strapi.service('admin::permission').createPermissionsManager({\n ability: userAbility,\n action: ACTIONS.read,\n model: FILE_MODEL_UID,\n });\n\n await validateDeleteManyFoldersFiles(body);\n\n const fileService = getService('file');\n const folderService = getService('folder');\n\n const deletedFiles = await fileService.deleteByIds(body.fileIds);\n const {\n folders: deletedFolders,\n totalFolderNumber,\n totalFileNumber,\n } = await folderService.deleteByIds(body.folderIds);\n\n if (deletedFiles.length + deletedFolders.length > 1) {\n await getService('metrics').trackUsage('didBulkDeleteMediaLibraryElements', {\n eventProperties: {\n rootFolderNumber: deletedFolders.length,\n rootAssetNumber: deletedFiles.length,\n totalFolderNumber,\n totalAssetNumber: totalFileNumber + deletedFiles.length,\n },\n });\n }\n\n ctx.body = {\n data: {\n files: await pmFile.sanitizeOutput(deletedFiles),\n folders: await pmFolder.sanitizeOutput(deletedFolders),\n },\n };\n },\n async moveMany(ctx: Context) {\n const { body } = ctx.request;\n const {\n state: { userAbility },\n } = ctx;\n\n const pmFolder = strapi.service('admin::permission').createPermissionsManager({\n ability: ctx.state.userAbility,\n model: FOLDER_MODEL_UID,\n });\n\n const pmFile = strapi.service('admin::permission').createPermissionsManager({\n ability: userAbility,\n action: ACTIONS.read,\n model: FILE_MODEL_UID,\n });\n\n await validateMoveManyFoldersFiles(body);\n const { folderIds = [], fileIds = [], destinationFolderId } = body;\n\n let totalFolderNumber = 0;\n let totalFileNumber = 0;\n\n const trx = await strapi.db.transaction();\n try {\n // fetch folders\n const existingFolders = await strapi.db\n .queryBuilder(FOLDER_MODEL_UID)\n .select(['id', 'pathId', 'path'])\n .where({ id: { $in: folderIds } })\n .transacting(trx.get())\n .forUpdate()\n .execute<Folder[]>();\n\n // fetch files\n const existingFiles = await strapi.db\n .queryBuilder(FILE_MODEL_UID)\n .select(['id'])\n .where({ id: { $in: fileIds } })\n .transacting(trx.get())\n .forUpdate()\n .execute<File[]>();\n\n // fetch destinationFolder path\n let destinationFolderPath = '/';\n if (destinationFolderId !== null) {\n const destinationFolder = await strapi.db\n .queryBuilder(FOLDER_MODEL_UID)\n .select('path')\n .where({ id: destinationFolderId })\n .transacting(trx.get())\n .first()\n .execute<Folder>();\n destinationFolderPath = destinationFolder.path;\n }\n\n const fileTable = strapi.getModel(FILE_MODEL_UID).collectionName;\n const folderTable = strapi.getModel(FOLDER_MODEL_UID).collectionName;\n const folderPathColName =\n // @ts-expect-error - no dynamic typings for the models\n strapi.db.metadata.get(FILE_MODEL_UID).attributes.folderPath.columnName;\n // @ts-expect-error - no dynamic typings for the models\n const pathColName = strapi.db.metadata.get(FOLDER_MODEL_UID).attributes.path.columnName;\n\n if (existingFolders.length > 0) {\n // update folders' parent relation\n // @ts-expect-error - no dynamic typings for the models\n const { joinTable } = strapi.db.metadata.get(FOLDER_MODEL_UID).attributes.parent;\n await strapi.db\n .queryBuilder(joinTable.name)\n .transacting(trx.get())\n .delete()\n .where({ [joinTable.joinColumn.name]: { $in: folderIds } })\n .execute();\n\n if (destinationFolderId !== null) {\n await strapi.db\n .queryBuilder(joinTable.name)\n .transacting(trx.get())\n .insert(\n existingFolders.map((folder) => ({\n [joinTable.inverseJoinColumn.name]: destinationFolderId,\n [joinTable.joinColumn.name]: folder.id,\n }))\n )\n .execute();\n }\n\n for (const existingFolder of existingFolders) {\n let replaceQuery;\n switch (strapi.db.dialect.client) {\n case 'sqlite':\n replaceQuery = '? || SUBSTRING(??, ?)';\n break;\n case 'postgres':\n replaceQuery = 'CONCAT(?::TEXT, SUBSTRING(??, ?::INTEGER))';\n break;\n default:\n replaceQuery = 'CONCAT(?, SUBSTRING(??, ?))';\n }\n\n // update path for folders themselves & folders below\n totalFolderNumber = await strapi.db\n .getConnection(folderTable)\n .transacting(trx.get())\n .where(pathColName, existingFolder.path)\n .orWhere(pathColName, 'like', `${existingFolder.path}/%`)\n .update(\n pathColName,\n strapi.db.connection.raw(replaceQuery, [\n strings.joinBy('/', destinationFolderPath, `${existingFolder.pathId}`),\n pathColName,\n existingFolder.path.length + 1,\n ])\n );\n\n // update path of files below\n totalFileNumber = await strapi.db\n .getConnection(fileTable)\n .transacting(trx.get())\n .where(folderPathColName, existingFolder.path)\n .orWhere(folderPathColName, 'like', `${existingFolder.path}/%`)\n .update(\n folderPathColName,\n strapi.db.connection.raw(replaceQuery, [\n strings.joinBy('/', destinationFolderPath, `${existingFolder.pathId}`),\n folderPathColName,\n existingFolder.path.length + 1,\n ])\n );\n }\n }\n\n if (existingFiles.length > 0) {\n // update files' folder relation (delete + insert; upsert not possible)\n // @ts-expect-error - no dynamic typings for the models\n const fileJoinTable = strapi.db.metadata.get(FILE_MODEL_UID).attributes.folder.joinTable;\n await strapi.db\n .queryBuilder(fileJoinTable.name)\n .transacting(trx.get())\n .delete()\n .where({ [fileJoinTable.joinColumn.name]: { $in: fileIds } })\n .execute();\n\n if (destinationFolderId !== null) {\n await strapi.db\n .queryBuilder(fileJoinTable.name)\n .transacting(trx.get())\n .insert(\n existingFiles.map((file) => ({\n [fileJoinTable.inverseJoinColumn.name]: destinationFolderId,\n [fileJoinTable.joinColumn.name]: file.id,\n }))\n )\n .execute();\n }\n\n // update files main fields (path + updatedBy)\n await strapi.db\n .getConnection(fileTable)\n .transacting(trx.get())\n .whereIn('id', fileIds)\n .update(folderPathColName, destinationFolderPath);\n }\n\n await trx.commit();\n } catch (e) {\n await trx.rollback();\n throw e;\n }\n\n const updatedFolders = await strapi.db.query(FOLDER_MODEL_UID).findMany({\n where: { id: { $in: folderIds } },\n });\n\n const updatedFiles = await strapi.db.query(FILE_MODEL_UID).findMany({\n where: { id: { $in: fileIds } },\n });\n\n await getService('metrics').trackUsage('didBulkMoveMediaLibraryElements', {\n eventProperties: {\n rootFolderNumber: updatedFolders.length,\n rootAssetNumber: updatedFiles.length,\n totalFolderNumber,\n totalAssetNumber: totalFileNumber + updatedFiles.length,\n },\n });\n\n ctx.body = {\n data: {\n files: await pmFile.sanitizeOutput(updatedFiles),\n folders: await pmFolder.sanitizeOutput(updatedFolders),\n },\n };\n },\n};\n"],"names":["deleteMany","ctx","body","request","state","userAbility","pmFolder","strapi","service","createPermissionsManager","ability","model","FOLDER_MODEL_UID","pmFile","action","ACTIONS","read","FILE_MODEL_UID","validateDeleteManyFoldersFiles","fileService","getService","folderService","deletedFiles","deleteByIds","fileIds","folders","deletedFolders","totalFolderNumber","totalFileNumber","folderIds","length","trackUsage","eventProperties","rootFolderNumber","rootAssetNumber","totalAssetNumber","data","files","sanitizeOutput","moveMany","validateMoveManyFoldersFiles","destinationFolderId","trx","db","transaction","existingFolders","queryBuilder","select","where","id","$in","transacting","get","forUpdate","execute","existingFiles","destinationFolderPath","destinationFolder","first","path","fileTable","getModel","collectionName","folderTable","folderPathColName","metadata","attributes","folderPath","columnName","pathColName","joinTable","parent","name","delete","joinColumn","insert","map","folder","inverseJoinColumn","existingFolder","replaceQuery","dialect","client","getConnection","orWhere","update","connection","raw","strings","joinBy","pathId","fileJoinTable","file","whereIn","commit","e","rollback","updatedFolders","query","findMany","updatedFiles"],"mappings":"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"}
@@ -22,7 +22,7 @@ var adminFolderFile = {
22
22
  const deletedFiles = await fileService.deleteByIds(body.fileIds);
23
23
  const { folders: deletedFolders, totalFolderNumber, totalFileNumber } = await folderService.deleteByIds(body.folderIds);
24
24
  if (deletedFiles.length + deletedFolders.length > 1) {
25
- strapi.telemetry.send('didBulkDeleteMediaLibraryElements', {
25
+ await getService('metrics').trackUsage('didBulkDeleteMediaLibraryElements', {
26
26
  eventProperties: {
27
27
  rootFolderNumber: deletedFolders.length,
28
28
  rootAssetNumber: deletedFiles.length,
@@ -166,7 +166,7 @@ var adminFolderFile = {
166
166
  }
167
167
  }
168
168
  });
169
- strapi.telemetry.send('didBulkMoveMediaLibraryElements', {
169
+ await getService('metrics').trackUsage('didBulkMoveMediaLibraryElements', {
170
170
  eventProperties: {
171
171
  rootFolderNumber: updatedFolders.length,
172
172
  rootAssetNumber: updatedFiles.length,
@@ -1 +1 @@
1
- {"version":3,"file":"admin-folder-file.mjs","sources":["../../../server/src/controllers/admin-folder-file.ts"],"sourcesContent":["import { strings } from '@strapi/utils';\n\nimport type { Context } from 'koa';\n\nimport { getService } from '../utils';\nimport { ACTIONS, FOLDER_MODEL_UID, FILE_MODEL_UID } from '../constants';\nimport {\n validateDeleteManyFoldersFiles,\n validateMoveManyFoldersFiles,\n} from './validation/admin/folder-file';\n\nimport type { File, Folder } from '../types';\n\nexport default {\n async deleteMany(ctx: Context) {\n const { body } = ctx.request;\n const {\n state: { userAbility },\n } = ctx;\n\n const pmFolder = strapi.service('admin::permission').createPermissionsManager({\n ability: ctx.state.userAbility,\n model: FOLDER_MODEL_UID,\n });\n\n const pmFile = strapi.service('admin::permission').createPermissionsManager({\n ability: userAbility,\n action: ACTIONS.read,\n model: FILE_MODEL_UID,\n });\n\n await validateDeleteManyFoldersFiles(body);\n\n const fileService = getService('file');\n const folderService = getService('folder');\n\n const deletedFiles = await fileService.deleteByIds(body.fileIds);\n const {\n folders: deletedFolders,\n totalFolderNumber,\n totalFileNumber,\n } = await folderService.deleteByIds(body.folderIds);\n\n if (deletedFiles.length + deletedFolders.length > 1) {\n strapi.telemetry.send('didBulkDeleteMediaLibraryElements', {\n eventProperties: {\n rootFolderNumber: deletedFolders.length,\n rootAssetNumber: deletedFiles.length,\n totalFolderNumber,\n totalAssetNumber: totalFileNumber + deletedFiles.length,\n },\n });\n }\n\n ctx.body = {\n data: {\n files: await pmFile.sanitizeOutput(deletedFiles),\n folders: await pmFolder.sanitizeOutput(deletedFolders),\n },\n };\n },\n async moveMany(ctx: Context) {\n const { body } = ctx.request;\n const {\n state: { userAbility },\n } = ctx;\n\n const pmFolder = strapi.service('admin::permission').createPermissionsManager({\n ability: ctx.state.userAbility,\n model: FOLDER_MODEL_UID,\n });\n\n const pmFile = strapi.service('admin::permission').createPermissionsManager({\n ability: userAbility,\n action: ACTIONS.read,\n model: FILE_MODEL_UID,\n });\n\n await validateMoveManyFoldersFiles(body);\n const { folderIds = [], fileIds = [], destinationFolderId } = body;\n\n let totalFolderNumber = 0;\n let totalFileNumber = 0;\n\n const trx = await strapi.db.transaction();\n try {\n // fetch folders\n const existingFolders = await strapi.db\n .queryBuilder(FOLDER_MODEL_UID)\n .select(['id', 'pathId', 'path'])\n .where({ id: { $in: folderIds } })\n .transacting(trx.get())\n .forUpdate()\n .execute<Folder[]>();\n\n // fetch files\n const existingFiles = await strapi.db\n .queryBuilder(FILE_MODEL_UID)\n .select(['id'])\n .where({ id: { $in: fileIds } })\n .transacting(trx.get())\n .forUpdate()\n .execute<File[]>();\n\n // fetch destinationFolder path\n let destinationFolderPath = '/';\n if (destinationFolderId !== null) {\n const destinationFolder = await strapi.db\n .queryBuilder(FOLDER_MODEL_UID)\n .select('path')\n .where({ id: destinationFolderId })\n .transacting(trx.get())\n .first()\n .execute<Folder>();\n destinationFolderPath = destinationFolder.path;\n }\n\n const fileTable = strapi.getModel(FILE_MODEL_UID).collectionName;\n const folderTable = strapi.getModel(FOLDER_MODEL_UID).collectionName;\n const folderPathColName =\n // @ts-expect-error - no dynamic typings for the models\n strapi.db.metadata.get(FILE_MODEL_UID).attributes.folderPath.columnName;\n // @ts-expect-error - no dynamic typings for the models\n const pathColName = strapi.db.metadata.get(FOLDER_MODEL_UID).attributes.path.columnName;\n\n if (existingFolders.length > 0) {\n // update folders' parent relation\n // @ts-expect-error - no dynamic typings for the models\n const { joinTable } = strapi.db.metadata.get(FOLDER_MODEL_UID).attributes.parent;\n await strapi.db\n .queryBuilder(joinTable.name)\n .transacting(trx.get())\n .delete()\n .where({ [joinTable.joinColumn.name]: { $in: folderIds } })\n .execute();\n\n if (destinationFolderId !== null) {\n await strapi.db\n .queryBuilder(joinTable.name)\n .transacting(trx.get())\n .insert(\n existingFolders.map((folder) => ({\n [joinTable.inverseJoinColumn.name]: destinationFolderId,\n [joinTable.joinColumn.name]: folder.id,\n }))\n )\n .execute();\n }\n\n for (const existingFolder of existingFolders) {\n let replaceQuery;\n switch (strapi.db.dialect.client) {\n case 'sqlite':\n replaceQuery = '? || SUBSTRING(??, ?)';\n break;\n case 'postgres':\n replaceQuery = 'CONCAT(?::TEXT, SUBSTRING(??, ?::INTEGER))';\n break;\n default:\n replaceQuery = 'CONCAT(?, SUBSTRING(??, ?))';\n }\n\n // update path for folders themselves & folders below\n totalFolderNumber = await strapi.db\n .getConnection(folderTable)\n .transacting(trx.get())\n .where(pathColName, existingFolder.path)\n .orWhere(pathColName, 'like', `${existingFolder.path}/%`)\n .update(\n pathColName,\n strapi.db.connection.raw(replaceQuery, [\n strings.joinBy('/', destinationFolderPath, `${existingFolder.pathId}`),\n pathColName,\n existingFolder.path.length + 1,\n ])\n );\n\n // update path of files below\n totalFileNumber = await strapi.db\n .getConnection(fileTable)\n .transacting(trx.get())\n .where(folderPathColName, existingFolder.path)\n .orWhere(folderPathColName, 'like', `${existingFolder.path}/%`)\n .update(\n folderPathColName,\n strapi.db.connection.raw(replaceQuery, [\n strings.joinBy('/', destinationFolderPath, `${existingFolder.pathId}`),\n folderPathColName,\n existingFolder.path.length + 1,\n ])\n );\n }\n }\n\n if (existingFiles.length > 0) {\n // update files' folder relation (delete + insert; upsert not possible)\n // @ts-expect-error - no dynamic typings for the models\n const fileJoinTable = strapi.db.metadata.get(FILE_MODEL_UID).attributes.folder.joinTable;\n await strapi.db\n .queryBuilder(fileJoinTable.name)\n .transacting(trx.get())\n .delete()\n .where({ [fileJoinTable.joinColumn.name]: { $in: fileIds } })\n .execute();\n\n if (destinationFolderId !== null) {\n await strapi.db\n .queryBuilder(fileJoinTable.name)\n .transacting(trx.get())\n .insert(\n existingFiles.map((file) => ({\n [fileJoinTable.inverseJoinColumn.name]: destinationFolderId,\n [fileJoinTable.joinColumn.name]: file.id,\n }))\n )\n .execute();\n }\n\n // update files main fields (path + updatedBy)\n await strapi.db\n .getConnection(fileTable)\n .transacting(trx.get())\n .whereIn('id', fileIds)\n .update(folderPathColName, destinationFolderPath);\n }\n\n await trx.commit();\n } catch (e) {\n await trx.rollback();\n throw e;\n }\n\n const updatedFolders = await strapi.db.query(FOLDER_MODEL_UID).findMany({\n where: { id: { $in: folderIds } },\n });\n\n const updatedFiles = await strapi.db.query(FILE_MODEL_UID).findMany({\n where: { id: { $in: fileIds } },\n });\n\n strapi.telemetry.send('didBulkMoveMediaLibraryElements', {\n eventProperties: {\n rootFolderNumber: updatedFolders.length,\n rootAssetNumber: updatedFiles.length,\n totalFolderNumber,\n totalAssetNumber: totalFileNumber + updatedFiles.length,\n },\n });\n\n ctx.body = {\n data: {\n files: await pmFile.sanitizeOutput(updatedFiles),\n folders: await pmFolder.sanitizeOutput(updatedFolders),\n },\n };\n },\n};\n"],"names":["deleteMany","ctx","body","request","state","userAbility","pmFolder","strapi","service","createPermissionsManager","ability","model","FOLDER_MODEL_UID","pmFile","action","ACTIONS","read","FILE_MODEL_UID","validateDeleteManyFoldersFiles","fileService","getService","folderService","deletedFiles","deleteByIds","fileIds","folders","deletedFolders","totalFolderNumber","totalFileNumber","folderIds","length","telemetry","send","eventProperties","rootFolderNumber","rootAssetNumber","totalAssetNumber","data","files","sanitizeOutput","moveMany","validateMoveManyFoldersFiles","destinationFolderId","trx","db","transaction","existingFolders","queryBuilder","select","where","id","$in","transacting","get","forUpdate","execute","existingFiles","destinationFolderPath","destinationFolder","first","path","fileTable","getModel","collectionName","folderTable","folderPathColName","metadata","attributes","folderPath","columnName","pathColName","joinTable","parent","name","delete","joinColumn","insert","map","folder","inverseJoinColumn","existingFolder","replaceQuery","dialect","client","getConnection","orWhere","update","connection","raw","strings","joinBy","pathId","fileJoinTable","file","whereIn","commit","e","rollback","updatedFolders","query","findMany","updatedFiles"],"mappings":"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"}
1
+ {"version":3,"file":"admin-folder-file.mjs","sources":["../../../server/src/controllers/admin-folder-file.ts"],"sourcesContent":["import { strings } from '@strapi/utils';\n\nimport type { Context } from 'koa';\n\nimport { getService } from '../utils';\nimport { ACTIONS, FOLDER_MODEL_UID, FILE_MODEL_UID } from '../constants';\nimport {\n validateDeleteManyFoldersFiles,\n validateMoveManyFoldersFiles,\n} from './validation/admin/folder-file';\n\nimport type { File, Folder } from '../types';\n\nexport default {\n async deleteMany(ctx: Context) {\n const { body } = ctx.request;\n const {\n state: { userAbility },\n } = ctx;\n\n const pmFolder = strapi.service('admin::permission').createPermissionsManager({\n ability: ctx.state.userAbility,\n model: FOLDER_MODEL_UID,\n });\n\n const pmFile = strapi.service('admin::permission').createPermissionsManager({\n ability: userAbility,\n action: ACTIONS.read,\n model: FILE_MODEL_UID,\n });\n\n await validateDeleteManyFoldersFiles(body);\n\n const fileService = getService('file');\n const folderService = getService('folder');\n\n const deletedFiles = await fileService.deleteByIds(body.fileIds);\n const {\n folders: deletedFolders,\n totalFolderNumber,\n totalFileNumber,\n } = await folderService.deleteByIds(body.folderIds);\n\n if (deletedFiles.length + deletedFolders.length > 1) {\n await getService('metrics').trackUsage('didBulkDeleteMediaLibraryElements', {\n eventProperties: {\n rootFolderNumber: deletedFolders.length,\n rootAssetNumber: deletedFiles.length,\n totalFolderNumber,\n totalAssetNumber: totalFileNumber + deletedFiles.length,\n },\n });\n }\n\n ctx.body = {\n data: {\n files: await pmFile.sanitizeOutput(deletedFiles),\n folders: await pmFolder.sanitizeOutput(deletedFolders),\n },\n };\n },\n async moveMany(ctx: Context) {\n const { body } = ctx.request;\n const {\n state: { userAbility },\n } = ctx;\n\n const pmFolder = strapi.service('admin::permission').createPermissionsManager({\n ability: ctx.state.userAbility,\n model: FOLDER_MODEL_UID,\n });\n\n const pmFile = strapi.service('admin::permission').createPermissionsManager({\n ability: userAbility,\n action: ACTIONS.read,\n model: FILE_MODEL_UID,\n });\n\n await validateMoveManyFoldersFiles(body);\n const { folderIds = [], fileIds = [], destinationFolderId } = body;\n\n let totalFolderNumber = 0;\n let totalFileNumber = 0;\n\n const trx = await strapi.db.transaction();\n try {\n // fetch folders\n const existingFolders = await strapi.db\n .queryBuilder(FOLDER_MODEL_UID)\n .select(['id', 'pathId', 'path'])\n .where({ id: { $in: folderIds } })\n .transacting(trx.get())\n .forUpdate()\n .execute<Folder[]>();\n\n // fetch files\n const existingFiles = await strapi.db\n .queryBuilder(FILE_MODEL_UID)\n .select(['id'])\n .where({ id: { $in: fileIds } })\n .transacting(trx.get())\n .forUpdate()\n .execute<File[]>();\n\n // fetch destinationFolder path\n let destinationFolderPath = '/';\n if (destinationFolderId !== null) {\n const destinationFolder = await strapi.db\n .queryBuilder(FOLDER_MODEL_UID)\n .select('path')\n .where({ id: destinationFolderId })\n .transacting(trx.get())\n .first()\n .execute<Folder>();\n destinationFolderPath = destinationFolder.path;\n }\n\n const fileTable = strapi.getModel(FILE_MODEL_UID).collectionName;\n const folderTable = strapi.getModel(FOLDER_MODEL_UID).collectionName;\n const folderPathColName =\n // @ts-expect-error - no dynamic typings for the models\n strapi.db.metadata.get(FILE_MODEL_UID).attributes.folderPath.columnName;\n // @ts-expect-error - no dynamic typings for the models\n const pathColName = strapi.db.metadata.get(FOLDER_MODEL_UID).attributes.path.columnName;\n\n if (existingFolders.length > 0) {\n // update folders' parent relation\n // @ts-expect-error - no dynamic typings for the models\n const { joinTable } = strapi.db.metadata.get(FOLDER_MODEL_UID).attributes.parent;\n await strapi.db\n .queryBuilder(joinTable.name)\n .transacting(trx.get())\n .delete()\n .where({ [joinTable.joinColumn.name]: { $in: folderIds } })\n .execute();\n\n if (destinationFolderId !== null) {\n await strapi.db\n .queryBuilder(joinTable.name)\n .transacting(trx.get())\n .insert(\n existingFolders.map((folder) => ({\n [joinTable.inverseJoinColumn.name]: destinationFolderId,\n [joinTable.joinColumn.name]: folder.id,\n }))\n )\n .execute();\n }\n\n for (const existingFolder of existingFolders) {\n let replaceQuery;\n switch (strapi.db.dialect.client) {\n case 'sqlite':\n replaceQuery = '? || SUBSTRING(??, ?)';\n break;\n case 'postgres':\n replaceQuery = 'CONCAT(?::TEXT, SUBSTRING(??, ?::INTEGER))';\n break;\n default:\n replaceQuery = 'CONCAT(?, SUBSTRING(??, ?))';\n }\n\n // update path for folders themselves & folders below\n totalFolderNumber = await strapi.db\n .getConnection(folderTable)\n .transacting(trx.get())\n .where(pathColName, existingFolder.path)\n .orWhere(pathColName, 'like', `${existingFolder.path}/%`)\n .update(\n pathColName,\n strapi.db.connection.raw(replaceQuery, [\n strings.joinBy('/', destinationFolderPath, `${existingFolder.pathId}`),\n pathColName,\n existingFolder.path.length + 1,\n ])\n );\n\n // update path of files below\n totalFileNumber = await strapi.db\n .getConnection(fileTable)\n .transacting(trx.get())\n .where(folderPathColName, existingFolder.path)\n .orWhere(folderPathColName, 'like', `${existingFolder.path}/%`)\n .update(\n folderPathColName,\n strapi.db.connection.raw(replaceQuery, [\n strings.joinBy('/', destinationFolderPath, `${existingFolder.pathId}`),\n folderPathColName,\n existingFolder.path.length + 1,\n ])\n );\n }\n }\n\n if (existingFiles.length > 0) {\n // update files' folder relation (delete + insert; upsert not possible)\n // @ts-expect-error - no dynamic typings for the models\n const fileJoinTable = strapi.db.metadata.get(FILE_MODEL_UID).attributes.folder.joinTable;\n await strapi.db\n .queryBuilder(fileJoinTable.name)\n .transacting(trx.get())\n .delete()\n .where({ [fileJoinTable.joinColumn.name]: { $in: fileIds } })\n .execute();\n\n if (destinationFolderId !== null) {\n await strapi.db\n .queryBuilder(fileJoinTable.name)\n .transacting(trx.get())\n .insert(\n existingFiles.map((file) => ({\n [fileJoinTable.inverseJoinColumn.name]: destinationFolderId,\n [fileJoinTable.joinColumn.name]: file.id,\n }))\n )\n .execute();\n }\n\n // update files main fields (path + updatedBy)\n await strapi.db\n .getConnection(fileTable)\n .transacting(trx.get())\n .whereIn('id', fileIds)\n .update(folderPathColName, destinationFolderPath);\n }\n\n await trx.commit();\n } catch (e) {\n await trx.rollback();\n throw e;\n }\n\n const updatedFolders = await strapi.db.query(FOLDER_MODEL_UID).findMany({\n where: { id: { $in: folderIds } },\n });\n\n const updatedFiles = await strapi.db.query(FILE_MODEL_UID).findMany({\n where: { id: { $in: fileIds } },\n });\n\n await getService('metrics').trackUsage('didBulkMoveMediaLibraryElements', {\n eventProperties: {\n rootFolderNumber: updatedFolders.length,\n rootAssetNumber: updatedFiles.length,\n totalFolderNumber,\n totalAssetNumber: totalFileNumber + updatedFiles.length,\n },\n });\n\n ctx.body = {\n data: {\n files: await pmFile.sanitizeOutput(updatedFiles),\n folders: await pmFolder.sanitizeOutput(updatedFolders),\n },\n };\n },\n};\n"],"names":["deleteMany","ctx","body","request","state","userAbility","pmFolder","strapi","service","createPermissionsManager","ability","model","FOLDER_MODEL_UID","pmFile","action","ACTIONS","read","FILE_MODEL_UID","validateDeleteManyFoldersFiles","fileService","getService","folderService","deletedFiles","deleteByIds","fileIds","folders","deletedFolders","totalFolderNumber","totalFileNumber","folderIds","length","trackUsage","eventProperties","rootFolderNumber","rootAssetNumber","totalAssetNumber","data","files","sanitizeOutput","moveMany","validateMoveManyFoldersFiles","destinationFolderId","trx","db","transaction","existingFolders","queryBuilder","select","where","id","$in","transacting","get","forUpdate","execute","existingFiles","destinationFolderPath","destinationFolder","first","path","fileTable","getModel","collectionName","folderTable","folderPathColName","metadata","attributes","folderPath","columnName","pathColName","joinTable","parent","name","delete","joinColumn","insert","map","folder","inverseJoinColumn","existingFolder","replaceQuery","dialect","client","getConnection","orWhere","update","connection","raw","strings","joinBy","pathId","fileJoinTable","file","whereIn","commit","e","rollback","updatedFolders","query","findMany","updatedFiles"],"mappings":"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"}
@@ -91,7 +91,7 @@ var adminUpload = {
91
91
  user
92
92
  });
93
93
  if (uploadedFiles.some((file)=>file.mime?.startsWith('image/'))) {
94
- strapi.telemetry.send('didUploadImage');
94
+ await index.getService('metrics').trackUsage('didUploadImage');
95
95
  }
96
96
  const aiMetadataService = index.getService('aiMetadata');
97
97
  // AFTER upload - use thumbnail versions for AI processing
@@ -1 +1 @@
1
- {"version":3,"file":"admin-upload.js","sources":["../../../server/src/controllers/admin-upload.ts"],"sourcesContent":["import _ from 'lodash';\nimport { errors, async } from '@strapi/utils';\n\nimport type { Context } from 'koa';\n\nimport { getService } from '../utils';\nimport { ACTIONS, FILE_MODEL_UID } from '../constants';\nimport { validateBulkUpdateBody, validateUploadBody } from './validation/admin/upload';\nimport { findEntityAndCheckPermissions } from './utils/find-entity-and-check-permissions';\nimport { FileInfo } from '../types';\n\nexport default {\n async bulkUpdateFileInfo(ctx: Context) {\n const {\n state: { userAbility, user },\n request: { body },\n } = ctx;\n\n const { updates } = await validateBulkUpdateBody(body);\n const uploadService = getService('upload');\n\n const results = await async.map(\n updates,\n async ({ id, fileInfo }: { id: number; fileInfo: FileInfo }) => {\n const { pm } = await findEntityAndCheckPermissions(\n userAbility,\n ACTIONS.update,\n FILE_MODEL_UID,\n id\n );\n\n const updated = await uploadService.updateFileInfo(id, fileInfo as any, { user });\n return pm.sanitizeOutput(updated, { action: ACTIONS.read });\n }\n );\n\n ctx.body = results;\n },\n\n async updateFileInfo(ctx: Context) {\n const {\n state: { userAbility, user },\n query: { id },\n request: { body },\n } = ctx;\n\n if (typeof id !== 'string') {\n throw new errors.ValidationError('File id is required');\n }\n\n const uploadService = getService('upload');\n const { pm } = await findEntityAndCheckPermissions(\n userAbility,\n ACTIONS.update,\n FILE_MODEL_UID,\n id\n );\n\n const data = await validateUploadBody(body);\n\n const file = await uploadService.updateFileInfo(id, data.fileInfo as any, { user });\n\n ctx.body = await pm.sanitizeOutput(file, { action: ACTIONS.read });\n },\n\n async replaceFile(ctx: Context) {\n const {\n state: { userAbility, user },\n query: { id },\n request: { body, files: { files } = {} },\n } = ctx;\n\n if (typeof id !== 'string') {\n throw new errors.ValidationError('File id is required');\n }\n\n const uploadService = getService('upload');\n const { pm } = await findEntityAndCheckPermissions(\n userAbility,\n ACTIONS.update,\n FILE_MODEL_UID,\n id\n );\n\n if (Array.isArray(files)) {\n throw new errors.ApplicationError('Cannot replace a file with multiple ones');\n }\n\n const data = (await validateUploadBody(body)) as { fileInfo: FileInfo };\n const replacedFile = await uploadService.replace(id, { data, file: files }, { user });\n\n // Sign file urls for private providers\n const signedFile = await getService('file').signFileUrls(replacedFile);\n\n ctx.body = await pm.sanitizeOutput(signedFile, { action: ACTIONS.read });\n },\n\n async uploadFiles(ctx: Context) {\n const {\n state: { userAbility, user },\n request: { body, files: { files } = {} },\n } = ctx;\n\n const uploadService = getService('upload');\n const pm = strapi.service('admin::permission').createPermissionsManager({\n ability: userAbility,\n action: ACTIONS.create,\n model: FILE_MODEL_UID,\n });\n\n if (!pm.isAllowed) {\n return ctx.forbidden();\n }\n\n const data = await validateUploadBody(body, Array.isArray(files));\n\n let filesArray = Array.isArray(files) ? files : [files];\n\n if (\n data.fileInfo &&\n Array.isArray(data.fileInfo) &&\n filesArray.length === data.fileInfo.length\n ) {\n // Reorder filesArray to match data.fileInfo order\n const alignedFilesArray = data.fileInfo\n .map((info) => {\n return filesArray.find((file) => file.originalFilename === info.name);\n })\n .filter(Boolean) as any[];\n\n filesArray = alignedFilesArray;\n }\n\n // Upload files first to get thumbnails\n const uploadedFiles = await uploadService.upload({ data, files: filesArray }, { user });\n if (uploadedFiles.some((file) => file.mime?.startsWith('image/'))) {\n strapi.telemetry.send('didUploadImage');\n }\n\n const aiMetadataService = getService('aiMetadata');\n\n // AFTER upload - use thumbnail versions for AI processing\n if (await aiMetadataService.isEnabled()) {\n try {\n // Use thumbnail URLs instead of original files\n const thumbnailFiles = uploadedFiles.map(\n (file) =>\n ({\n filepath: file.formats?.thumbnail?.url || file.url, // Use thumbnail if available\n mimetype: file.mime,\n originalFilename: file.name,\n size: file.formats?.thumbnail?.size || file.size,\n provider: file.provider,\n }) as unknown as any\n );\n\n const metadataResults = await aiMetadataService.processFiles(thumbnailFiles);\n\n // Update the uploaded files with AI metadata\n await Promise.all(\n uploadedFiles.map(async (uploadedFile, index) => {\n const aiMetadata = metadataResults[index];\n if (aiMetadata) {\n await uploadService.updateFileInfo(\n uploadedFile.id,\n {\n alternativeText: aiMetadata.altText,\n caption: aiMetadata.caption,\n },\n { user }\n );\n\n uploadedFiles[index].alternativeText = aiMetadata.altText;\n uploadedFiles[index].caption = aiMetadata.caption;\n }\n })\n );\n } catch (error) {\n strapi.log.warn('AI metadata generation failed, proceeding without AI enhancements', {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n // Sign file urls for private providers\n const signedFiles = await async.map(uploadedFiles, getService('file').signFileUrls);\n\n ctx.body = await pm.sanitizeOutput(signedFiles, { action: ACTIONS.read });\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 errors.ApplicationError('Files are empty');\n }\n\n await (id ? this.replaceFile : this.uploadFiles)(ctx);\n },\n};\n"],"names":["bulkUpdateFileInfo","ctx","state","userAbility","user","request","body","updates","validateBulkUpdateBody","uploadService","getService","results","async","map","id","fileInfo","pm","findEntityAndCheckPermissions","ACTIONS","update","FILE_MODEL_UID","updated","updateFileInfo","sanitizeOutput","action","read","query","errors","ValidationError","data","validateUploadBody","file","replaceFile","files","Array","isArray","ApplicationError","replacedFile","replace","signedFile","signFileUrls","uploadFiles","strapi","service","createPermissionsManager","ability","create","model","isAllowed","forbidden","filesArray","length","alignedFilesArray","info","find","originalFilename","name","filter","Boolean","uploadedFiles","upload","some","mime","startsWith","telemetry","send","aiMetadataService","isEnabled","thumbnailFiles","filepath","formats","thumbnail","url","mimetype","size","provider","metadataResults","processFiles","Promise","all","uploadedFile","index","aiMetadata","alternativeText","altText","caption","error","log","warn","Error","message","String","signedFiles","status","_","isEmpty"],"mappings":"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"}
1
+ {"version":3,"file":"admin-upload.js","sources":["../../../server/src/controllers/admin-upload.ts"],"sourcesContent":["import _ from 'lodash';\nimport { errors, async } from '@strapi/utils';\n\nimport type { Context } from 'koa';\n\nimport { getService } from '../utils';\nimport { ACTIONS, FILE_MODEL_UID } from '../constants';\nimport { validateBulkUpdateBody, validateUploadBody } from './validation/admin/upload';\nimport { findEntityAndCheckPermissions } from './utils/find-entity-and-check-permissions';\nimport { FileInfo } from '../types';\n\nexport default {\n async bulkUpdateFileInfo(ctx: Context) {\n const {\n state: { userAbility, user },\n request: { body },\n } = ctx;\n\n const { updates } = await validateBulkUpdateBody(body);\n const uploadService = getService('upload');\n\n const results = await async.map(\n updates,\n async ({ id, fileInfo }: { id: number; fileInfo: FileInfo }) => {\n const { pm } = await findEntityAndCheckPermissions(\n userAbility,\n ACTIONS.update,\n FILE_MODEL_UID,\n id\n );\n\n const updated = await uploadService.updateFileInfo(id, fileInfo as any, { user });\n return pm.sanitizeOutput(updated, { action: ACTIONS.read });\n }\n );\n\n ctx.body = results;\n },\n\n async updateFileInfo(ctx: Context) {\n const {\n state: { userAbility, user },\n query: { id },\n request: { body },\n } = ctx;\n\n if (typeof id !== 'string') {\n throw new errors.ValidationError('File id is required');\n }\n\n const uploadService = getService('upload');\n const { pm } = await findEntityAndCheckPermissions(\n userAbility,\n ACTIONS.update,\n FILE_MODEL_UID,\n id\n );\n\n const data = await validateUploadBody(body);\n\n const file = await uploadService.updateFileInfo(id, data.fileInfo as any, { user });\n\n ctx.body = await pm.sanitizeOutput(file, { action: ACTIONS.read });\n },\n\n async replaceFile(ctx: Context) {\n const {\n state: { userAbility, user },\n query: { id },\n request: { body, files: { files } = {} },\n } = ctx;\n\n if (typeof id !== 'string') {\n throw new errors.ValidationError('File id is required');\n }\n\n const uploadService = getService('upload');\n const { pm } = await findEntityAndCheckPermissions(\n userAbility,\n ACTIONS.update,\n FILE_MODEL_UID,\n id\n );\n\n if (Array.isArray(files)) {\n throw new errors.ApplicationError('Cannot replace a file with multiple ones');\n }\n\n const data = (await validateUploadBody(body)) as { fileInfo: FileInfo };\n const replacedFile = await uploadService.replace(id, { data, file: files }, { user });\n\n // Sign file urls for private providers\n const signedFile = await getService('file').signFileUrls(replacedFile);\n\n ctx.body = await pm.sanitizeOutput(signedFile, { action: ACTIONS.read });\n },\n\n async uploadFiles(ctx: Context) {\n const {\n state: { userAbility, user },\n request: { body, files: { files } = {} },\n } = ctx;\n\n const uploadService = getService('upload');\n const pm = strapi.service('admin::permission').createPermissionsManager({\n ability: userAbility,\n action: ACTIONS.create,\n model: FILE_MODEL_UID,\n });\n\n if (!pm.isAllowed) {\n return ctx.forbidden();\n }\n\n const data = await validateUploadBody(body, Array.isArray(files));\n\n let filesArray = Array.isArray(files) ? files : [files];\n\n if (\n data.fileInfo &&\n Array.isArray(data.fileInfo) &&\n filesArray.length === data.fileInfo.length\n ) {\n // Reorder filesArray to match data.fileInfo order\n const alignedFilesArray = data.fileInfo\n .map((info) => {\n return filesArray.find((file) => file.originalFilename === info.name);\n })\n .filter(Boolean) as any[];\n\n filesArray = alignedFilesArray;\n }\n\n // Upload files first to get thumbnails\n const uploadedFiles = await uploadService.upload({ data, files: filesArray }, { user });\n if (uploadedFiles.some((file) => file.mime?.startsWith('image/'))) {\n await getService('metrics').trackUsage('didUploadImage');\n }\n\n const aiMetadataService = getService('aiMetadata');\n\n // AFTER upload - use thumbnail versions for AI processing\n if (await aiMetadataService.isEnabled()) {\n try {\n // Use thumbnail URLs instead of original files\n const thumbnailFiles = uploadedFiles.map(\n (file) =>\n ({\n filepath: file.formats?.thumbnail?.url || file.url, // Use thumbnail if available\n mimetype: file.mime,\n originalFilename: file.name,\n size: file.formats?.thumbnail?.size || file.size,\n provider: file.provider,\n }) as unknown as any\n );\n\n const metadataResults = await aiMetadataService.processFiles(thumbnailFiles);\n\n // Update the uploaded files with AI metadata\n await Promise.all(\n uploadedFiles.map(async (uploadedFile, index) => {\n const aiMetadata = metadataResults[index];\n if (aiMetadata) {\n await uploadService.updateFileInfo(\n uploadedFile.id,\n {\n alternativeText: aiMetadata.altText,\n caption: aiMetadata.caption,\n },\n { user }\n );\n\n uploadedFiles[index].alternativeText = aiMetadata.altText;\n uploadedFiles[index].caption = aiMetadata.caption;\n }\n })\n );\n } catch (error) {\n strapi.log.warn('AI metadata generation failed, proceeding without AI enhancements', {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n // Sign file urls for private providers\n const signedFiles = await async.map(uploadedFiles, getService('file').signFileUrls);\n\n ctx.body = await pm.sanitizeOutput(signedFiles, { action: ACTIONS.read });\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 errors.ApplicationError('Files are empty');\n }\n\n await (id ? this.replaceFile : this.uploadFiles)(ctx);\n },\n};\n"],"names":["bulkUpdateFileInfo","ctx","state","userAbility","user","request","body","updates","validateBulkUpdateBody","uploadService","getService","results","async","map","id","fileInfo","pm","findEntityAndCheckPermissions","ACTIONS","update","FILE_MODEL_UID","updated","updateFileInfo","sanitizeOutput","action","read","query","errors","ValidationError","data","validateUploadBody","file","replaceFile","files","Array","isArray","ApplicationError","replacedFile","replace","signedFile","signFileUrls","uploadFiles","strapi","service","createPermissionsManager","ability","create","model","isAllowed","forbidden","filesArray","length","alignedFilesArray","info","find","originalFilename","name","filter","Boolean","uploadedFiles","upload","some","mime","startsWith","trackUsage","aiMetadataService","isEnabled","thumbnailFiles","filepath","formats","thumbnail","url","mimetype","size","provider","metadataResults","processFiles","Promise","all","uploadedFile","index","aiMetadata","alternativeText","altText","caption","error","log","warn","Error","message","String","signedFiles","status","_","isEmpty"],"mappings":"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"}
@@ -89,7 +89,7 @@ var adminUpload = {
89
89
  user
90
90
  });
91
91
  if (uploadedFiles.some((file)=>file.mime?.startsWith('image/'))) {
92
- strapi.telemetry.send('didUploadImage');
92
+ await getService('metrics').trackUsage('didUploadImage');
93
93
  }
94
94
  const aiMetadataService = getService('aiMetadata');
95
95
  // AFTER upload - use thumbnail versions for AI processing
@@ -1 +1 @@
1
- {"version":3,"file":"admin-upload.mjs","sources":["../../../server/src/controllers/admin-upload.ts"],"sourcesContent":["import _ from 'lodash';\nimport { errors, async } from '@strapi/utils';\n\nimport type { Context } from 'koa';\n\nimport { getService } from '../utils';\nimport { ACTIONS, FILE_MODEL_UID } from '../constants';\nimport { validateBulkUpdateBody, validateUploadBody } from './validation/admin/upload';\nimport { findEntityAndCheckPermissions } from './utils/find-entity-and-check-permissions';\nimport { FileInfo } from '../types';\n\nexport default {\n async bulkUpdateFileInfo(ctx: Context) {\n const {\n state: { userAbility, user },\n request: { body },\n } = ctx;\n\n const { updates } = await validateBulkUpdateBody(body);\n const uploadService = getService('upload');\n\n const results = await async.map(\n updates,\n async ({ id, fileInfo }: { id: number; fileInfo: FileInfo }) => {\n const { pm } = await findEntityAndCheckPermissions(\n userAbility,\n ACTIONS.update,\n FILE_MODEL_UID,\n id\n );\n\n const updated = await uploadService.updateFileInfo(id, fileInfo as any, { user });\n return pm.sanitizeOutput(updated, { action: ACTIONS.read });\n }\n );\n\n ctx.body = results;\n },\n\n async updateFileInfo(ctx: Context) {\n const {\n state: { userAbility, user },\n query: { id },\n request: { body },\n } = ctx;\n\n if (typeof id !== 'string') {\n throw new errors.ValidationError('File id is required');\n }\n\n const uploadService = getService('upload');\n const { pm } = await findEntityAndCheckPermissions(\n userAbility,\n ACTIONS.update,\n FILE_MODEL_UID,\n id\n );\n\n const data = await validateUploadBody(body);\n\n const file = await uploadService.updateFileInfo(id, data.fileInfo as any, { user });\n\n ctx.body = await pm.sanitizeOutput(file, { action: ACTIONS.read });\n },\n\n async replaceFile(ctx: Context) {\n const {\n state: { userAbility, user },\n query: { id },\n request: { body, files: { files } = {} },\n } = ctx;\n\n if (typeof id !== 'string') {\n throw new errors.ValidationError('File id is required');\n }\n\n const uploadService = getService('upload');\n const { pm } = await findEntityAndCheckPermissions(\n userAbility,\n ACTIONS.update,\n FILE_MODEL_UID,\n id\n );\n\n if (Array.isArray(files)) {\n throw new errors.ApplicationError('Cannot replace a file with multiple ones');\n }\n\n const data = (await validateUploadBody(body)) as { fileInfo: FileInfo };\n const replacedFile = await uploadService.replace(id, { data, file: files }, { user });\n\n // Sign file urls for private providers\n const signedFile = await getService('file').signFileUrls(replacedFile);\n\n ctx.body = await pm.sanitizeOutput(signedFile, { action: ACTIONS.read });\n },\n\n async uploadFiles(ctx: Context) {\n const {\n state: { userAbility, user },\n request: { body, files: { files } = {} },\n } = ctx;\n\n const uploadService = getService('upload');\n const pm = strapi.service('admin::permission').createPermissionsManager({\n ability: userAbility,\n action: ACTIONS.create,\n model: FILE_MODEL_UID,\n });\n\n if (!pm.isAllowed) {\n return ctx.forbidden();\n }\n\n const data = await validateUploadBody(body, Array.isArray(files));\n\n let filesArray = Array.isArray(files) ? files : [files];\n\n if (\n data.fileInfo &&\n Array.isArray(data.fileInfo) &&\n filesArray.length === data.fileInfo.length\n ) {\n // Reorder filesArray to match data.fileInfo order\n const alignedFilesArray = data.fileInfo\n .map((info) => {\n return filesArray.find((file) => file.originalFilename === info.name);\n })\n .filter(Boolean) as any[];\n\n filesArray = alignedFilesArray;\n }\n\n // Upload files first to get thumbnails\n const uploadedFiles = await uploadService.upload({ data, files: filesArray }, { user });\n if (uploadedFiles.some((file) => file.mime?.startsWith('image/'))) {\n strapi.telemetry.send('didUploadImage');\n }\n\n const aiMetadataService = getService('aiMetadata');\n\n // AFTER upload - use thumbnail versions for AI processing\n if (await aiMetadataService.isEnabled()) {\n try {\n // Use thumbnail URLs instead of original files\n const thumbnailFiles = uploadedFiles.map(\n (file) =>\n ({\n filepath: file.formats?.thumbnail?.url || file.url, // Use thumbnail if available\n mimetype: file.mime,\n originalFilename: file.name,\n size: file.formats?.thumbnail?.size || file.size,\n provider: file.provider,\n }) as unknown as any\n );\n\n const metadataResults = await aiMetadataService.processFiles(thumbnailFiles);\n\n // Update the uploaded files with AI metadata\n await Promise.all(\n uploadedFiles.map(async (uploadedFile, index) => {\n const aiMetadata = metadataResults[index];\n if (aiMetadata) {\n await uploadService.updateFileInfo(\n uploadedFile.id,\n {\n alternativeText: aiMetadata.altText,\n caption: aiMetadata.caption,\n },\n { user }\n );\n\n uploadedFiles[index].alternativeText = aiMetadata.altText;\n uploadedFiles[index].caption = aiMetadata.caption;\n }\n })\n );\n } catch (error) {\n strapi.log.warn('AI metadata generation failed, proceeding without AI enhancements', {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n // Sign file urls for private providers\n const signedFiles = await async.map(uploadedFiles, getService('file').signFileUrls);\n\n ctx.body = await pm.sanitizeOutput(signedFiles, { action: ACTIONS.read });\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 errors.ApplicationError('Files are empty');\n }\n\n await (id ? this.replaceFile : this.uploadFiles)(ctx);\n },\n};\n"],"names":["bulkUpdateFileInfo","ctx","state","userAbility","user","request","body","updates","validateBulkUpdateBody","uploadService","getService","results","async","map","id","fileInfo","pm","findEntityAndCheckPermissions","ACTIONS","update","FILE_MODEL_UID","updated","updateFileInfo","sanitizeOutput","action","read","query","errors","ValidationError","data","validateUploadBody","file","replaceFile","files","Array","isArray","ApplicationError","replacedFile","replace","signedFile","signFileUrls","uploadFiles","strapi","service","createPermissionsManager","ability","create","model","isAllowed","forbidden","filesArray","length","alignedFilesArray","info","find","originalFilename","name","filter","Boolean","uploadedFiles","upload","some","mime","startsWith","telemetry","send","aiMetadataService","isEnabled","thumbnailFiles","filepath","formats","thumbnail","url","mimetype","size","provider","metadataResults","processFiles","Promise","all","uploadedFile","index","aiMetadata","alternativeText","altText","caption","error","log","warn","Error","message","String","signedFiles","status","_","isEmpty"],"mappings":"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"}
1
+ {"version":3,"file":"admin-upload.mjs","sources":["../../../server/src/controllers/admin-upload.ts"],"sourcesContent":["import _ from 'lodash';\nimport { errors, async } from '@strapi/utils';\n\nimport type { Context } from 'koa';\n\nimport { getService } from '../utils';\nimport { ACTIONS, FILE_MODEL_UID } from '../constants';\nimport { validateBulkUpdateBody, validateUploadBody } from './validation/admin/upload';\nimport { findEntityAndCheckPermissions } from './utils/find-entity-and-check-permissions';\nimport { FileInfo } from '../types';\n\nexport default {\n async bulkUpdateFileInfo(ctx: Context) {\n const {\n state: { userAbility, user },\n request: { body },\n } = ctx;\n\n const { updates } = await validateBulkUpdateBody(body);\n const uploadService = getService('upload');\n\n const results = await async.map(\n updates,\n async ({ id, fileInfo }: { id: number; fileInfo: FileInfo }) => {\n const { pm } = await findEntityAndCheckPermissions(\n userAbility,\n ACTIONS.update,\n FILE_MODEL_UID,\n id\n );\n\n const updated = await uploadService.updateFileInfo(id, fileInfo as any, { user });\n return pm.sanitizeOutput(updated, { action: ACTIONS.read });\n }\n );\n\n ctx.body = results;\n },\n\n async updateFileInfo(ctx: Context) {\n const {\n state: { userAbility, user },\n query: { id },\n request: { body },\n } = ctx;\n\n if (typeof id !== 'string') {\n throw new errors.ValidationError('File id is required');\n }\n\n const uploadService = getService('upload');\n const { pm } = await findEntityAndCheckPermissions(\n userAbility,\n ACTIONS.update,\n FILE_MODEL_UID,\n id\n );\n\n const data = await validateUploadBody(body);\n\n const file = await uploadService.updateFileInfo(id, data.fileInfo as any, { user });\n\n ctx.body = await pm.sanitizeOutput(file, { action: ACTIONS.read });\n },\n\n async replaceFile(ctx: Context) {\n const {\n state: { userAbility, user },\n query: { id },\n request: { body, files: { files } = {} },\n } = ctx;\n\n if (typeof id !== 'string') {\n throw new errors.ValidationError('File id is required');\n }\n\n const uploadService = getService('upload');\n const { pm } = await findEntityAndCheckPermissions(\n userAbility,\n ACTIONS.update,\n FILE_MODEL_UID,\n id\n );\n\n if (Array.isArray(files)) {\n throw new errors.ApplicationError('Cannot replace a file with multiple ones');\n }\n\n const data = (await validateUploadBody(body)) as { fileInfo: FileInfo };\n const replacedFile = await uploadService.replace(id, { data, file: files }, { user });\n\n // Sign file urls for private providers\n const signedFile = await getService('file').signFileUrls(replacedFile);\n\n ctx.body = await pm.sanitizeOutput(signedFile, { action: ACTIONS.read });\n },\n\n async uploadFiles(ctx: Context) {\n const {\n state: { userAbility, user },\n request: { body, files: { files } = {} },\n } = ctx;\n\n const uploadService = getService('upload');\n const pm = strapi.service('admin::permission').createPermissionsManager({\n ability: userAbility,\n action: ACTIONS.create,\n model: FILE_MODEL_UID,\n });\n\n if (!pm.isAllowed) {\n return ctx.forbidden();\n }\n\n const data = await validateUploadBody(body, Array.isArray(files));\n\n let filesArray = Array.isArray(files) ? files : [files];\n\n if (\n data.fileInfo &&\n Array.isArray(data.fileInfo) &&\n filesArray.length === data.fileInfo.length\n ) {\n // Reorder filesArray to match data.fileInfo order\n const alignedFilesArray = data.fileInfo\n .map((info) => {\n return filesArray.find((file) => file.originalFilename === info.name);\n })\n .filter(Boolean) as any[];\n\n filesArray = alignedFilesArray;\n }\n\n // Upload files first to get thumbnails\n const uploadedFiles = await uploadService.upload({ data, files: filesArray }, { user });\n if (uploadedFiles.some((file) => file.mime?.startsWith('image/'))) {\n await getService('metrics').trackUsage('didUploadImage');\n }\n\n const aiMetadataService = getService('aiMetadata');\n\n // AFTER upload - use thumbnail versions for AI processing\n if (await aiMetadataService.isEnabled()) {\n try {\n // Use thumbnail URLs instead of original files\n const thumbnailFiles = uploadedFiles.map(\n (file) =>\n ({\n filepath: file.formats?.thumbnail?.url || file.url, // Use thumbnail if available\n mimetype: file.mime,\n originalFilename: file.name,\n size: file.formats?.thumbnail?.size || file.size,\n provider: file.provider,\n }) as unknown as any\n );\n\n const metadataResults = await aiMetadataService.processFiles(thumbnailFiles);\n\n // Update the uploaded files with AI metadata\n await Promise.all(\n uploadedFiles.map(async (uploadedFile, index) => {\n const aiMetadata = metadataResults[index];\n if (aiMetadata) {\n await uploadService.updateFileInfo(\n uploadedFile.id,\n {\n alternativeText: aiMetadata.altText,\n caption: aiMetadata.caption,\n },\n { user }\n );\n\n uploadedFiles[index].alternativeText = aiMetadata.altText;\n uploadedFiles[index].caption = aiMetadata.caption;\n }\n })\n );\n } catch (error) {\n strapi.log.warn('AI metadata generation failed, proceeding without AI enhancements', {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n // Sign file urls for private providers\n const signedFiles = await async.map(uploadedFiles, getService('file').signFileUrls);\n\n ctx.body = await pm.sanitizeOutput(signedFiles, { action: ACTIONS.read });\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 errors.ApplicationError('Files are empty');\n }\n\n await (id ? this.replaceFile : this.uploadFiles)(ctx);\n },\n};\n"],"names":["bulkUpdateFileInfo","ctx","state","userAbility","user","request","body","updates","validateBulkUpdateBody","uploadService","getService","results","async","map","id","fileInfo","pm","findEntityAndCheckPermissions","ACTIONS","update","FILE_MODEL_UID","updated","updateFileInfo","sanitizeOutput","action","read","query","errors","ValidationError","data","validateUploadBody","file","replaceFile","files","Array","isArray","ApplicationError","replacedFile","replace","signedFile","signFileUrls","uploadFiles","strapi","service","createPermissionsManager","ability","create","model","isAllowed","forbidden","filesArray","length","alignedFilesArray","info","find","originalFilename","name","filter","Boolean","uploadedFiles","upload","some","mime","startsWith","trackUsage","aiMetadataService","isEnabled","thumbnailFiles","filepath","formats","thumbnail","url","mimetype","size","provider","metadataResults","processFiles","Promise","all","uploadedFile","index","aiMetadata","alternativeText","altText","caption","error","log","warn","Error","message","String","signedFiles","status","_","isEmpty"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"folders.js","sources":["../../../../server/src/controllers/utils/folders.ts"],"sourcesContent":["import { Folder } from '../../types';\n\nconst isFolderOrChild = (folderOrChild: Folder, folder: Folder) =>\n folderOrChild.path === folder.path || folderOrChild.path.startsWith(`${folder.path}/`);\n\nexport { isFolderOrChild };\n"],"names":["isFolderOrChild","folderOrChild","folder","path","startsWith"],"mappings":";;AAEMA,MAAAA,eAAAA,GAAkB,CAACC,aAAuBC,EAAAA,MAAAA,GAC9CD,cAAcE,IAAI,KAAKD,OAAOC,IAAI,IAAIF,cAAcE,IAAI,CAACC,UAAU,CAAC,CAAC,EAAEF,MAAOC,CAAAA,IAAI,CAAC,CAAC,CAAC;;;;"}
1
+ {"version":3,"file":"folders.js","sources":["../../../../server/src/controllers/utils/folders.ts"],"sourcesContent":["import { Folder } from '../../types';\n\nconst isFolderOrChild = (folderOrChild: Folder, folder: Folder) =>\n folderOrChild.path === folder.path || folderOrChild.path.startsWith(`${folder.path}/`);\n\nexport { isFolderOrChild };\n"],"names":["isFolderOrChild","folderOrChild","folder","path","startsWith"],"mappings":";;AAEMA,MAAAA,eAAAA,GAAkB,CAACC,aAAuBC,EAAAA,MAAAA,GAC9CD,cAAcE,IAAI,KAAKD,OAAOC,IAAI,IAAIF,cAAcE,IAAI,CAACC,UAAU,CAAC,CAAA,EAAGF,OAAOC,IAAI,CAAC,CAAC,CAAC;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"folders.mjs","sources":["../../../../server/src/controllers/utils/folders.ts"],"sourcesContent":["import { Folder } from '../../types';\n\nconst isFolderOrChild = (folderOrChild: Folder, folder: Folder) =>\n folderOrChild.path === folder.path || folderOrChild.path.startsWith(`${folder.path}/`);\n\nexport { isFolderOrChild };\n"],"names":["isFolderOrChild","folderOrChild","folder","path","startsWith"],"mappings":"AAEMA,MAAAA,eAAAA,GAAkB,CAACC,aAAuBC,EAAAA,MAAAA,GAC9CD,cAAcE,IAAI,KAAKD,OAAOC,IAAI,IAAIF,cAAcE,IAAI,CAACC,UAAU,CAAC,CAAC,EAAEF,MAAOC,CAAAA,IAAI,CAAC,CAAC,CAAC;;;;"}
1
+ {"version":3,"file":"folders.mjs","sources":["../../../../server/src/controllers/utils/folders.ts"],"sourcesContent":["import { Folder } from '../../types';\n\nconst isFolderOrChild = (folderOrChild: Folder, folder: Folder) =>\n folderOrChild.path === folder.path || folderOrChild.path.startsWith(`${folder.path}/`);\n\nexport { isFolderOrChild };\n"],"names":["isFolderOrChild","folderOrChild","folder","path","startsWith"],"mappings":"AAEMA,MAAAA,eAAAA,GAAkB,CAACC,aAAuBC,EAAAA,MAAAA,GAC9CD,cAAcE,IAAI,KAAKD,OAAOC,IAAI,IAAIF,cAAcE,IAAI,CAACC,UAAU,CAAC,CAAA,EAAGF,OAAOC,IAAI,CAAC,CAAC,CAAC;;;;"}
@@ -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":";;;;;;;;AAQA,MAAMA,oCAAuCC,GAAAA,SAAAA,CAC1CC,MAAM,EAAA,CACNC,KAAK,CAAC;IACLC,OAASH,EAAAA,SAAAA,CAAII,KAAK,EAAGC,CAAAA,EAAE,CAACL,SAAIM,CAAAA,QAAQ,GAAGC,QAAQ,EAAA,CAAA;IAC/CC,SAAWR,EAAAA,SAAAA,CAAII,KAAK,EAAGC,CAAAA,EAAE,CAACL,SAAIM,CAAAA,QAAQ,GAAGC,QAAQ,EAAA;AACnD,CACCE,CAAAA,CAAAA,SAAS,GACTF,QAAQ,EAAA;AAEX,MAAMG,2CAA8CV,GAAAA,SAAAA,CACjDC,MAAM,EAAA,CACNC,KAAK,CAAC;IACLS,mBAAqBX,EAAAA,SAAAA,CAClBM,QAAQ,EAAA,CACRM,QAAQ,EAAA,CACRC,OAAO,EACPC,CAAAA,IAAI,CAAC,eAAA,EAAiB,mCAAqCC,EAAAA,oBAAAA,CAAAA;IAC9DZ,OAASH,EAAAA,SAAAA,CAAII,KAAK,EAAGC,CAAAA,EAAE,CAACL,SAAIM,CAAAA,QAAQ,GAAGC,QAAQ,EAAA,CAAA;IAC/CC,SAAWR,EAAAA,SAAAA,CAAII,KAAK,EAAGC,CAAAA,EAAE,CAACL,SAAIM,CAAAA,QAAQ,GAAGC,QAAQ,EAAA;AACnD,CACCE,CAAAA,CAAAA,SAAS,GACTF,QAAQ,EAAA;AAEX,MAAMS,4CAAAA,GAA+ChB,SAClDC,CAAAA,MAAM,EACNa,CAAAA,IAAI,CAAC,oBAAsB,EAAA,4BAAA,EAA8B,eAAeG,gBAAAA,CAAiBC,KAAK,EAAA;AAC7F,IAAA,MAAM,EAAEV,SAAS,EAAEG,mBAAmB,EAAE,GAAGO,KAAAA;IAC3C,IAAIC,UAAAA,CAAQX,YAAY,OAAO,IAAA;IAE/B,MAAMY,OAAAA,GAAU,MAAMC,MAAOC,CAAAA,EAAE,CAACC,KAAK,CAACC,0BAAkBC,CAAAA,CAAAA,QAAQ,CAAC;QAC/DC,MAAQ,EAAA;AAAC,YAAA;AAAO,SAAA;QAChBC,KAAO,EAAA;YAAEC,EAAI,EAAA;gBAAEC,GAAKrB,EAAAA;AAAU;AAAE;AAClC,KAAA,CAAA;IAEA,MAAMsB,eAAAA,GAAkB,MAAMT,MAAOC,CAAAA,EAAE,CAACC,KAAK,CAACC,0BAAkBC,CAAAA,CAAAA,QAAQ,CAAC;QACvEC,MAAQ,EAAA;AAAC,YAAA;AAAO,SAAA;QAChBC,KAAO,EAAA;YAAEI,MAAQ,EAAA;gBAAEH,EAAIjB,EAAAA;AAAoB;AAAE;AAC/C,KAAA,CAAA;AAEA,IAAA,MAAMqB,kBAAkBC,eAAaC,CAAAA,MAAAA,CAAI,MAAQd,EAAAA,OAAAA,CAAAA,EAAUc,OAAI,MAAQJ,EAAAA,eAAAA,CAAAA,CAAAA;IACvE,IAAIE,eAAAA,CAAgBG,MAAM,GAAG,CAAG,EAAA;QAC9B,OAAO,IAAI,CAACC,WAAW,CAAC;AACtBC,YAAAA,OAAAA,EAAS,CAAC,6BAA6B,EAAEL,gBAAgBM,IAAI,CAAC,MAAM;AACtE,SAAA,CAAA;AACF;IAEA,OAAO,IAAA;AACT,CAAA,CAAA;AAEF,MAAMC,4CAAAA,GAA+CvC,SAClDC,CAAAA,MAAM,EACNa,CAAAA,IAAI,CACH,uBACA,EAAA,kEAAA,EACA,eAAe0B,sCAAAA,CAAuCtB,KAAK,EAAA;AACzD,IAAA,MAAM,EAAEV,SAAS,EAAEG,mBAAmB,EAAE,GAAGO,KAAAA;AAC3C,IAAA,IAAIP,mBAAwB,KAAA,IAAA,IAAQQ,UAAQX,CAAAA,SAAAA,CAAAA,EAAY,OAAO,IAAA;IAE/D,MAAMiC,iBAAAA,GAAoB,MAAMpB,MAAOC,CAAAA,EAAE,CAACC,KAAK,CAACC,0BAAkBkB,CAAAA,CAAAA,OAAO,CAAC;QACxEhB,MAAQ,EAAA;AAAC,YAAA;AAAO,SAAA;QAChBC,KAAO,EAAA;YAAEC,EAAIjB,EAAAA;AAAoB;AACnC,KAAA,CAAA;IAEA,MAAMS,SAAAA,GAAoB,MAAMC,MAAOC,CAAAA,EAAE,CAACC,KAAK,CAACC,0BAAkBC,CAAAA,CAAAA,QAAQ,CAAC;QACzEC,MAAQ,EAAA;AAAC,YAAA,MAAA;AAAQ,YAAA;AAAO,SAAA;QACxBC,KAAO,EAAA;YAAEC,EAAI,EAAA;gBAAEC,GAAKrB,EAAAA;AAAU;AAAE;AAClC,KAAA,CAAA;AAEA,IAAA,MAAMmC,qBAAwBvB,GAAAA,SAAAA,CAC3BwB,MAAM,CAAC,CAACC,MAAWC,GAAAA,uBAAAA,CAAgBL,iBAAmBI,EAAAA,MAAAA,CAAAA,CAAAA,CACtDX,GAAG,CAAC,CAACa,CAAAA,GAAMA,EAAEC,IAAI,CAAA;IAEpB,IAAIL,qBAAAA,CAAsBR,MAAM,GAAG,CAAG,EAAA;QACpC,OAAO,IAAI,CAACC,WAAW,CAAC;AACtBC,YAAAA,OAAAA,EAAS,CAAC,kEAAkE,EAAEM,sBAAsBL,IAAI,CACtG,MACA;AACJ,SAAA,CAAA;AACF;IAEA,OAAO,IAAA;AACT,CAAA,CAAA;AAGG,MAAMW,8BAAiCC,GAAAA,uBAAAA,CAC5CnD,oCACA;AAEK,eAAeoD,6BAA6BC,IAAa,EAAA;AAC9D,IAAA,MAAMF,wBAAkBxC,2CAA6C0C,CAAAA,CAAAA,IAAAA,CAAAA;AACrE,IAAA,MAAMF,wBAAkBlC,4CAA8CoC,CAAAA,CAAAA,IAAAA,CAAAA;AACtE,IAAA,MAAMF,wBAAkBX,4CAA8Ca,CAAAA,CAAAA,IAAAA,CAAAA;AACxE;;;;;"}
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":";;;;;;;;AAQA,MAAMA,oCAAuCC,GAAAA,SAAAA,CAC1CC,MAAM,EAAA,CACNC,KAAK,CAAC;IACLC,OAASH,EAAAA,SAAAA,CAAII,KAAK,EAAGC,CAAAA,EAAE,CAACL,SAAIM,CAAAA,QAAQ,GAAGC,QAAQ,EAAA,CAAA;IAC/CC,SAAWR,EAAAA,SAAAA,CAAII,KAAK,EAAGC,CAAAA,EAAE,CAACL,SAAIM,CAAAA,QAAQ,GAAGC,QAAQ,EAAA;AACnD,CACCE,CAAAA,CAAAA,SAAS,GACTF,QAAQ,EAAA;AAEX,MAAMG,2CAA8CV,GAAAA,SAAAA,CACjDC,MAAM,EAAA,CACNC,KAAK,CAAC;IACLS,mBAAqBX,EAAAA,SAAAA,CAClBM,QAAQ,EAAA,CACRM,QAAQ,EAAA,CACRC,OAAO,EACPC,CAAAA,IAAI,CAAC,eAAA,EAAiB,mCAAqCC,EAAAA,oBAAAA,CAAAA;IAC9DZ,OAASH,EAAAA,SAAAA,CAAII,KAAK,EAAGC,CAAAA,EAAE,CAACL,SAAIM,CAAAA,QAAQ,GAAGC,QAAQ,EAAA,CAAA;IAC/CC,SAAWR,EAAAA,SAAAA,CAAII,KAAK,EAAGC,CAAAA,EAAE,CAACL,SAAIM,CAAAA,QAAQ,GAAGC,QAAQ,EAAA;AACnD,CACCE,CAAAA,CAAAA,SAAS,GACTF,QAAQ,EAAA;AAEX,MAAMS,4CAAAA,GAA+ChB,SAClDC,CAAAA,MAAM,EACNa,CAAAA,IAAI,CAAC,oBAAsB,EAAA,4BAAA,EAA8B,eAAeG,gBAAAA,CAAiBC,KAAK,EAAA;AAC7F,IAAA,MAAM,EAAEV,SAAS,EAAEG,mBAAmB,EAAE,GAAGO,KAAAA;IAC3C,IAAIC,UAAAA,CAAQX,YAAY,OAAO,IAAA;IAE/B,MAAMY,OAAAA,GAAU,MAAMC,MAAOC,CAAAA,EAAE,CAACC,KAAK,CAACC,0BAAkBC,CAAAA,CAAAA,QAAQ,CAAC;QAC/DC,MAAQ,EAAA;AAAC,YAAA;AAAO,SAAA;QAChBC,KAAO,EAAA;YAAEC,EAAI,EAAA;gBAAEC,GAAKrB,EAAAA;AAAU;AAAE;AAClC,KAAA,CAAA;IAEA,MAAMsB,eAAAA,GAAkB,MAAMT,MAAOC,CAAAA,EAAE,CAACC,KAAK,CAACC,0BAAkBC,CAAAA,CAAAA,QAAQ,CAAC;QACvEC,MAAQ,EAAA;AAAC,YAAA;AAAO,SAAA;QAChBC,KAAO,EAAA;YAAEI,MAAQ,EAAA;gBAAEH,EAAIjB,EAAAA;AAAoB;AAAE;AAC/C,KAAA,CAAA;AAEA,IAAA,MAAMqB,kBAAkBC,eAAaC,CAAAA,MAAAA,CAAI,MAAQd,EAAAA,OAAAA,CAAAA,EAAUc,OAAI,MAAQJ,EAAAA,eAAAA,CAAAA,CAAAA;IACvE,IAAIE,eAAAA,CAAgBG,MAAM,GAAG,CAAG,EAAA;QAC9B,OAAO,IAAI,CAACC,WAAW,CAAC;AACtBC,YAAAA,OAAAA,EAAS,CAAC,6BAA6B,EAAEL,eAAgBM,CAAAA,IAAI,CAAC,IAAO,CAAA,CAAA;AACvE,SAAA,CAAA;AACF;IAEA,OAAO,IAAA;AACT,CAAA,CAAA;AAEF,MAAMC,4CAAAA,GAA+CvC,SAClDC,CAAAA,MAAM,EACNa,CAAAA,IAAI,CACH,uBACA,EAAA,kEAAA,EACA,eAAe0B,sCAAAA,CAAuCtB,KAAK,EAAA;AACzD,IAAA,MAAM,EAAEV,SAAS,EAAEG,mBAAmB,EAAE,GAAGO,KAAAA;AAC3C,IAAA,IAAIP,mBAAwB,KAAA,IAAA,IAAQQ,UAAQX,CAAAA,SAAAA,CAAAA,EAAY,OAAO,IAAA;IAE/D,MAAMiC,iBAAAA,GAAoB,MAAMpB,MAAOC,CAAAA,EAAE,CAACC,KAAK,CAACC,0BAAkBkB,CAAAA,CAAAA,OAAO,CAAC;QACxEhB,MAAQ,EAAA;AAAC,YAAA;AAAO,SAAA;QAChBC,KAAO,EAAA;YAAEC,EAAIjB,EAAAA;AAAoB;AACnC,KAAA,CAAA;IAEA,MAAMS,SAAAA,GAAoB,MAAMC,MAAOC,CAAAA,EAAE,CAACC,KAAK,CAACC,0BAAkBC,CAAAA,CAAAA,QAAQ,CAAC;QACzEC,MAAQ,EAAA;AAAC,YAAA,MAAA;AAAQ,YAAA;AAAO,SAAA;QACxBC,KAAO,EAAA;YAAEC,EAAI,EAAA;gBAAEC,GAAKrB,EAAAA;AAAU;AAAE;AAClC,KAAA,CAAA;AAEA,IAAA,MAAMmC,qBAAwBvB,GAAAA,SAAAA,CAC3BwB,MAAM,CAAC,CAACC,MAAWC,GAAAA,uBAAAA,CAAgBL,iBAAmBI,EAAAA,MAAAA,CAAAA,CAAAA,CACtDX,GAAG,CAAC,CAACa,CAAAA,GAAMA,EAAEC,IAAI,CAAA;IAEpB,IAAIL,qBAAAA,CAAsBR,MAAM,GAAG,CAAG,EAAA;QACpC,OAAO,IAAI,CAACC,WAAW,CAAC;AACtBC,YAAAA,OAAAA,EAAS,CAAC,kEAAkE,EAAEM,qBAAsBL,CAAAA,IAAI,CACtG,IACC,CAAA,CAAA;AACL,SAAA,CAAA;AACF;IAEA,OAAO,IAAA;AACT,CAAA,CAAA;AAGG,MAAMW,8BAAiCC,GAAAA,uBAAAA,CAC5CnD,oCACA;AAEK,eAAeoD,6BAA6BC,IAAa,EAAA;AAC9D,IAAA,MAAMF,wBAAkBxC,2CAA6C0C,CAAAA,CAAAA,IAAAA,CAAAA;AACrE,IAAA,MAAMF,wBAAkBlC,4CAA8CoC,CAAAA,CAAAA,IAAAA,CAAAA;AACtE,IAAA,MAAMF,wBAAkBX,4CAA8Ca,CAAAA,CAAAA,IAAAA,CAAAA;AACxE;;;;;"}
@@ -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 { 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":";;;;;;AAQA,MAAMA,oCAAuCC,GAAAA,GAAAA,CAC1CC,MAAM,EAAA,CACNC,KAAK,CAAC;IACLC,OAASH,EAAAA,GAAAA,CAAII,KAAK,EAAGC,CAAAA,EAAE,CAACL,GAAIM,CAAAA,QAAQ,GAAGC,QAAQ,EAAA,CAAA;IAC/CC,SAAWR,EAAAA,GAAAA,CAAII,KAAK,EAAGC,CAAAA,EAAE,CAACL,GAAIM,CAAAA,QAAQ,GAAGC,QAAQ,EAAA;AACnD,CACCE,CAAAA,CAAAA,SAAS,GACTF,QAAQ,EAAA;AAEX,MAAMG,2CAA8CV,GAAAA,GAAAA,CACjDC,MAAM,EAAA,CACNC,KAAK,CAAC;IACLS,mBAAqBX,EAAAA,GAAAA,CAClBM,QAAQ,EAAA,CACRM,QAAQ,EAAA,CACRC,OAAO,EACPC,CAAAA,IAAI,CAAC,eAAA,EAAiB,mCAAqCC,EAAAA,YAAAA,CAAAA;IAC9DZ,OAASH,EAAAA,GAAAA,CAAII,KAAK,EAAGC,CAAAA,EAAE,CAACL,GAAIM,CAAAA,QAAQ,GAAGC,QAAQ,EAAA,CAAA;IAC/CC,SAAWR,EAAAA,GAAAA,CAAII,KAAK,EAAGC,CAAAA,EAAE,CAACL,GAAIM,CAAAA,QAAQ,GAAGC,QAAQ,EAAA;AACnD,CACCE,CAAAA,CAAAA,SAAS,GACTF,QAAQ,EAAA;AAEX,MAAMS,4CAAAA,GAA+ChB,GAClDC,CAAAA,MAAM,EACNa,CAAAA,IAAI,CAAC,oBAAsB,EAAA,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,MAAOC,CAAAA,EAAE,CAACC,KAAK,CAACC,gBAAkBC,CAAAA,CAAAA,QAAQ,CAAC;QAC/DC,MAAQ,EAAA;AAAC,YAAA;AAAO,SAAA;QAChBC,KAAO,EAAA;YAAEC,EAAI,EAAA;gBAAEC,GAAKrB,EAAAA;AAAU;AAAE;AAClC,KAAA,CAAA;IAEA,MAAMsB,eAAAA,GAAkB,MAAMT,MAAOC,CAAAA,EAAE,CAACC,KAAK,CAACC,gBAAkBC,CAAAA,CAAAA,QAAQ,CAAC;QACvEC,MAAQ,EAAA;AAAC,YAAA;AAAO,SAAA;QAChBC,KAAO,EAAA;YAAEI,MAAQ,EAAA;gBAAEH,EAAIjB,EAAAA;AAAoB;AAAE;AAC/C,KAAA,CAAA;AAEA,IAAA,MAAMqB,kBAAkBC,YAAaC,CAAAA,GAAAA,CAAI,MAAQd,EAAAA,OAAAA,CAAAA,EAAUc,IAAI,MAAQJ,EAAAA,eAAAA,CAAAA,CAAAA;IACvE,IAAIE,eAAAA,CAAgBG,MAAM,GAAG,CAAG,EAAA;QAC9B,OAAO,IAAI,CAACC,WAAW,CAAC;AACtBC,YAAAA,OAAAA,EAAS,CAAC,6BAA6B,EAAEL,eAAgBM,CAAAA,IAAI,CAAC,IAAO,CAAA,CAAA;AACvE,SAAA,CAAA;AACF;IAEA,OAAO,IAAA;AACT,CAAA,CAAA;AAEF,MAAMC,4CAAAA,GAA+CvC,GAClDC,CAAAA,MAAM,EACNa,CAAAA,IAAI,CACH,uBACA,EAAA,kEAAA,EACA,eAAe0B,sCAAAA,CAAuCtB,KAAK,EAAA;AACzD,IAAA,MAAM,EAAEV,SAAS,EAAEG,mBAAmB,EAAE,GAAGO,KAAAA;AAC3C,IAAA,IAAIP,mBAAwB,KAAA,IAAA,IAAQQ,OAAQX,CAAAA,SAAAA,CAAAA,EAAY,OAAO,IAAA;IAE/D,MAAMiC,iBAAAA,GAAoB,MAAMpB,MAAOC,CAAAA,EAAE,CAACC,KAAK,CAACC,gBAAkBkB,CAAAA,CAAAA,OAAO,CAAC;QACxEhB,MAAQ,EAAA;AAAC,YAAA;AAAO,SAAA;QAChBC,KAAO,EAAA;YAAEC,EAAIjB,EAAAA;AAAoB;AACnC,KAAA,CAAA;IAEA,MAAMS,OAAAA,GAAoB,MAAMC,MAAOC,CAAAA,EAAE,CAACC,KAAK,CAACC,gBAAkBC,CAAAA,CAAAA,QAAQ,CAAC;QACzEC,MAAQ,EAAA;AAAC,YAAA,MAAA;AAAQ,YAAA;AAAO,SAAA;QACxBC,KAAO,EAAA;YAAEC,EAAI,EAAA;gBAAEC,GAAKrB,EAAAA;AAAU;AAAE;AAClC,KAAA,CAAA;AAEA,IAAA,MAAMmC,qBAAwBvB,GAAAA,OAAAA,CAC3BwB,MAAM,CAAC,CAACC,MAAWC,GAAAA,eAAAA,CAAgBL,iBAAmBI,EAAAA,MAAAA,CAAAA,CAAAA,CACtDX,GAAG,CAAC,CAACa,CAAAA,GAAMA,EAAEC,IAAI,CAAA;IAEpB,IAAIL,qBAAAA,CAAsBR,MAAM,GAAG,CAAG,EAAA;QACpC,OAAO,IAAI,CAACC,WAAW,CAAC;AACtBC,YAAAA,OAAAA,EAAS,CAAC,kEAAkE,EAAEM,qBAAsBL,CAAAA,IAAI,CACtG,IACC,CAAA,CAAA;AACL,SAAA,CAAA;AACF;IAEA,OAAO,IAAA;AACT,CAAA,CAAA;AAGG,MAAMW,8BAAiCC,GAAAA,iBAAAA,CAC5CnD,oCACA;AAEK,eAAeoD,6BAA6BC,IAAa,EAAA;AAC9D,IAAA,MAAMF,kBAAkBxC,2CAA6C0C,CAAAA,CAAAA,IAAAA,CAAAA;AACrE,IAAA,MAAMF,kBAAkBlC,4CAA8CoC,CAAAA,CAAAA,IAAAA,CAAAA;AACtE,IAAA,MAAMF,kBAAkBX,4CAA8Ca,CAAAA,CAAAA,IAAAA,CAAAA;AACxE;;;;"}
@@ -8,7 +8,7 @@ var utils$1 = require('./utils.js');
8
8
  var folders = require('../../utils/folders.js');
9
9
 
10
10
  const NO_SLASH_REGEX = /^[^/]+$/;
11
- const NO_SPACES_AROUND = RegExp("^(?! ).+(?<! )$");
11
+ const NO_SPACES_AROUND = /^(?! ).+(?<! )$/;
12
12
  const isNameUniqueInFolder = (id)=>{
13
13
  return async function test(name) {
14
14
  const { exists } = index.getService('folder');
@@ -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 { 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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"}
@@ -6,7 +6,7 @@ import { folderExists } from './utils.mjs';
6
6
  import { isFolderOrChild } from '../../utils/folders.mjs';
7
7
 
8
8
  const NO_SLASH_REGEX = /^[^/]+$/;
9
- const NO_SPACES_AROUND = RegExp("^(?! ).+(?<! )$");
9
+ const NO_SPACES_AROUND = /^(?! ).+(?<! )$/;
10
10
  const isNameUniqueInFolder = (id)=>{
11
11
  return async function test(name) {
12
12
  const { exists } = getService('folder');