@strapi/upload 5.37.1 → 5.38.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 (536) hide show
  1. package/dist/admin/ai/components/AIAssetCard.js.map +1 -1
  2. package/dist/admin/ai/components/AIAssetCard.mjs +1 -1
  3. package/dist/admin/ai/components/AIAssetCard.mjs.map +1 -1
  4. package/dist/admin/ai/components/AIUploadModal.js.map +1 -1
  5. package/dist/admin/ai/components/AIUploadModal.mjs +1 -1
  6. package/dist/admin/ai/components/AIUploadModal.mjs.map +1 -1
  7. package/dist/admin/components/AssetCard/AssetCard.js.map +1 -1
  8. package/dist/admin/components/AssetCard/AssetCard.mjs.map +1 -1
  9. package/dist/admin/components/AssetCard/AssetCardBase.js.map +1 -1
  10. package/dist/admin/components/AssetCard/AssetCardBase.mjs.map +1 -1
  11. package/dist/admin/components/AssetCard/AudioAssetCard.js.map +1 -1
  12. package/dist/admin/components/AssetCard/AudioAssetCard.mjs.map +1 -1
  13. package/dist/admin/components/AssetCard/AudioPreview.js.map +1 -1
  14. package/dist/admin/components/AssetCard/AudioPreview.mjs.map +1 -1
  15. package/dist/admin/components/AssetCard/DocAssetCard.js.map +1 -1
  16. package/dist/admin/components/AssetCard/DocAssetCard.mjs.map +1 -1
  17. package/dist/admin/components/AssetCard/ImageAssetCard.js.map +1 -1
  18. package/dist/admin/components/AssetCard/ImageAssetCard.mjs.map +1 -1
  19. package/dist/admin/components/AssetCard/UploadingAssetCard.js.map +1 -1
  20. package/dist/admin/components/AssetCard/UploadingAssetCard.mjs.map +1 -1
  21. package/dist/admin/components/AssetCard/VideoAssetCard.js.map +1 -1
  22. package/dist/admin/components/AssetCard/VideoAssetCard.mjs.map +1 -1
  23. package/dist/admin/components/AssetCard/VideoPreview.js.map +1 -1
  24. package/dist/admin/components/AssetCard/VideoPreview.mjs.map +1 -1
  25. package/dist/admin/components/AssetDialog/AssetDialog.js.map +1 -1
  26. package/dist/admin/components/AssetDialog/AssetDialog.mjs.map +1 -1
  27. package/dist/admin/components/AssetDialog/BrowseStep/BrowseStep.js +1 -1
  28. package/dist/admin/components/AssetDialog/BrowseStep/BrowseStep.js.map +1 -1
  29. package/dist/admin/components/AssetDialog/BrowseStep/BrowseStep.mjs +1 -1
  30. package/dist/admin/components/AssetDialog/BrowseStep/BrowseStep.mjs.map +1 -1
  31. package/dist/admin/components/AssetDialog/BrowseStep/Filters.js.map +1 -1
  32. package/dist/admin/components/AssetDialog/BrowseStep/Filters.mjs.map +1 -1
  33. package/dist/admin/components/AssetDialog/BrowseStep/PageSize.js.map +1 -1
  34. package/dist/admin/components/AssetDialog/BrowseStep/PageSize.mjs.map +1 -1
  35. package/dist/admin/components/AssetDialog/BrowseStep/PaginationFooter/Pagination.js.map +1 -1
  36. package/dist/admin/components/AssetDialog/BrowseStep/PaginationFooter/Pagination.mjs.map +1 -1
  37. package/dist/admin/components/AssetDialog/BrowseStep/PaginationFooter/PaginationFooter.js.map +1 -1
  38. package/dist/admin/components/AssetDialog/BrowseStep/PaginationFooter/PaginationFooter.mjs.map +1 -1
  39. package/dist/admin/components/AssetDialog/BrowseStep/SearchAsset/SearchAsset.js.map +1 -1
  40. package/dist/admin/components/AssetDialog/BrowseStep/SearchAsset/SearchAsset.mjs.map +1 -1
  41. package/dist/admin/components/AssetDialog/BrowseStep/utils/isSelectable.js.map +1 -1
  42. package/dist/admin/components/AssetDialog/BrowseStep/utils/isSelectable.mjs.map +1 -1
  43. package/dist/admin/components/AssetDialog/DialogFooter.js.map +1 -1
  44. package/dist/admin/components/AssetDialog/DialogFooter.mjs.map +1 -1
  45. package/dist/admin/components/AssetDialog/SelectedStep/SelectedStep.js.map +1 -1
  46. package/dist/admin/components/AssetDialog/SelectedStep/SelectedStep.mjs.map +1 -1
  47. package/dist/admin/components/AssetGridList/AssetGridList.js.map +1 -1
  48. package/dist/admin/components/AssetGridList/AssetGridList.mjs.map +1 -1
  49. package/dist/admin/components/AssetGridList/Draggable.js.map +1 -1
  50. package/dist/admin/components/AssetGridList/Draggable.mjs.map +1 -1
  51. package/dist/admin/components/Breadcrumbs/Breadcrumbs.js.map +1 -1
  52. package/dist/admin/components/Breadcrumbs/Breadcrumbs.mjs.map +1 -1
  53. package/dist/admin/components/Breadcrumbs/CrumbSimpleMenuAsync.js.map +1 -1
  54. package/dist/admin/components/Breadcrumbs/CrumbSimpleMenuAsync.mjs.map +1 -1
  55. package/dist/admin/components/BulkMoveDialog/BulkMoveDialog.js.map +1 -1
  56. package/dist/admin/components/BulkMoveDialog/BulkMoveDialog.mjs.map +1 -1
  57. package/dist/admin/components/ContextInfo/ContextInfo.js.map +1 -1
  58. package/dist/admin/components/ContextInfo/ContextInfo.mjs.map +1 -1
  59. package/dist/admin/components/CopyLinkButton/CopyLinkButton.js.map +1 -1
  60. package/dist/admin/components/CopyLinkButton/CopyLinkButton.mjs.map +1 -1
  61. package/dist/admin/components/EditAssetDialog/DialogHeader.js.map +1 -1
  62. package/dist/admin/components/EditAssetDialog/DialogHeader.mjs.map +1 -1
  63. package/dist/admin/components/EditAssetDialog/EditAssetContent.js.map +1 -1
  64. package/dist/admin/components/EditAssetDialog/EditAssetContent.mjs.map +1 -1
  65. package/dist/admin/components/EditAssetDialog/PreviewBox/AssetPreview.js +1 -0
  66. package/dist/admin/components/EditAssetDialog/PreviewBox/AssetPreview.js.map +1 -1
  67. package/dist/admin/components/EditAssetDialog/PreviewBox/AssetPreview.mjs +1 -0
  68. package/dist/admin/components/EditAssetDialog/PreviewBox/AssetPreview.mjs.map +1 -1
  69. package/dist/admin/components/EditAssetDialog/PreviewBox/CroppingActions.js.map +1 -1
  70. package/dist/admin/components/EditAssetDialog/PreviewBox/CroppingActions.mjs.map +1 -1
  71. package/dist/admin/components/EditAssetDialog/PreviewBox/FocalPointActions.js.map +1 -1
  72. package/dist/admin/components/EditAssetDialog/PreviewBox/FocalPointActions.mjs.map +1 -1
  73. package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.js +1 -4
  74. package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.js.map +1 -1
  75. package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.mjs +1 -4
  76. package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.mjs.map +1 -1
  77. package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewComponents.js.map +1 -1
  78. package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewComponents.mjs.map +1 -1
  79. package/dist/admin/components/EditAssetDialog/RemoveAssetDialog.js.map +1 -1
  80. package/dist/admin/components/EditAssetDialog/RemoveAssetDialog.mjs.map +1 -1
  81. package/dist/admin/components/EditAssetDialog/ReplaceMediaButton.js.map +1 -1
  82. package/dist/admin/components/EditAssetDialog/ReplaceMediaButton.mjs.map +1 -1
  83. package/dist/admin/components/EditFolderDialog/EditFolderDialog.js.map +1 -1
  84. package/dist/admin/components/EditFolderDialog/EditFolderDialog.mjs.map +1 -1
  85. package/dist/admin/components/EditFolderDialog/ModalHeader/ModalHeader.js.map +1 -1
  86. package/dist/admin/components/EditFolderDialog/ModalHeader/ModalHeader.mjs.map +1 -1
  87. package/dist/admin/components/EditFolderDialog/RemoveFolderDialog.js.map +1 -1
  88. package/dist/admin/components/EditFolderDialog/RemoveFolderDialog.mjs.map +1 -1
  89. package/dist/admin/components/EmptyAssets/EmptyAssetGrid.js.map +1 -1
  90. package/dist/admin/components/EmptyAssets/EmptyAssetGrid.mjs.map +1 -1
  91. package/dist/admin/components/EmptyAssets/EmptyAssets.js.map +1 -1
  92. package/dist/admin/components/EmptyAssets/EmptyAssets.mjs.map +1 -1
  93. package/dist/admin/components/FilterList/FilterList.js.map +1 -1
  94. package/dist/admin/components/FilterList/FilterList.mjs.map +1 -1
  95. package/dist/admin/components/FilterList/FilterTag.js.map +1 -1
  96. package/dist/admin/components/FilterList/FilterTag.mjs.map +1 -1
  97. package/dist/admin/components/FilterPopover/FilterPopover.js.map +1 -1
  98. package/dist/admin/components/FilterPopover/FilterPopover.mjs.map +1 -1
  99. package/dist/admin/components/FilterPopover/FilterValueInput.js.map +1 -1
  100. package/dist/admin/components/FilterPopover/FilterValueInput.mjs.map +1 -1
  101. package/dist/admin/components/FilterPopover/utils/getFilterList.js.map +1 -1
  102. package/dist/admin/components/FilterPopover/utils/getFilterList.mjs.map +1 -1
  103. package/dist/admin/components/FolderCard/FolderCard/FolderCard.js.map +1 -1
  104. package/dist/admin/components/FolderCard/FolderCard/FolderCard.mjs.map +1 -1
  105. package/dist/admin/components/FolderCard/FolderCardBody/FolderCardBody.js.map +1 -1
  106. package/dist/admin/components/FolderCard/FolderCardBody/FolderCardBody.mjs.map +1 -1
  107. package/dist/admin/components/FolderCard/FolderCardBodyAction/FolderCardBodyAction.js.map +1 -1
  108. package/dist/admin/components/FolderCard/FolderCardBodyAction/FolderCardBodyAction.mjs.map +1 -1
  109. package/dist/admin/components/FolderCard/FolderCardCheckbox/FolderCardCheckbox.js.map +1 -1
  110. package/dist/admin/components/FolderCard/FolderCardCheckbox/FolderCardCheckbox.mjs.map +1 -1
  111. package/dist/admin/components/FolderCard/contexts/FolderCard.js.map +1 -1
  112. package/dist/admin/components/FolderCard/contexts/FolderCard.mjs.map +1 -1
  113. package/dist/admin/components/FolderGridList/FolderGridList.js.map +1 -1
  114. package/dist/admin/components/FolderGridList/FolderGridList.mjs.map +1 -1
  115. package/dist/admin/components/MediaLibraryDialog/MediaLibraryDialog.js.map +1 -1
  116. package/dist/admin/components/MediaLibraryDialog/MediaLibraryDialog.mjs.map +1 -1
  117. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAsset.js.map +1 -1
  118. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAsset.mjs.map +1 -1
  119. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssetActions.js.map +1 -1
  120. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssetActions.mjs.map +1 -1
  121. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssets.js.map +1 -1
  122. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssets.mjs.map +1 -1
  123. package/dist/admin/components/MediaLibraryInput/Carousel/EmptyStateAsset.js.map +1 -1
  124. package/dist/admin/components/MediaLibraryInput/Carousel/EmptyStateAsset.mjs.map +1 -1
  125. package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.js.map +1 -1
  126. package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.mjs.map +1 -1
  127. package/dist/admin/components/SelectTree/Option.js.map +1 -1
  128. package/dist/admin/components/SelectTree/Option.mjs.map +1 -1
  129. package/dist/admin/components/SelectTree/SelectTree.js.map +1 -1
  130. package/dist/admin/components/SelectTree/SelectTree.mjs +1 -1
  131. package/dist/admin/components/SelectTree/SelectTree.mjs.map +1 -1
  132. package/dist/admin/components/SelectTree/utils/flattenTree.js.map +1 -1
  133. package/dist/admin/components/SelectTree/utils/flattenTree.mjs.map +1 -1
  134. package/dist/admin/components/SelectTree/utils/getOpenValues.js.map +1 -1
  135. package/dist/admin/components/SelectTree/utils/getOpenValues.mjs.map +1 -1
  136. package/dist/admin/components/SelectTree/utils/getValuesToClose.js.map +1 -1
  137. package/dist/admin/components/SelectTree/utils/getValuesToClose.mjs.map +1 -1
  138. package/dist/admin/components/SortPicker/SortPicker.js.map +1 -1
  139. package/dist/admin/components/SortPicker/SortPicker.mjs.map +1 -1
  140. package/dist/admin/components/TableList/CellContent.js.map +1 -1
  141. package/dist/admin/components/TableList/CellContent.mjs.map +1 -1
  142. package/dist/admin/components/TableList/PreviewCell.js.map +1 -1
  143. package/dist/admin/components/TableList/PreviewCell.mjs +1 -1
  144. package/dist/admin/components/TableList/PreviewCell.mjs.map +1 -1
  145. package/dist/admin/components/TableList/TableList.js.map +1 -1
  146. package/dist/admin/components/TableList/TableList.mjs +1 -1
  147. package/dist/admin/components/TableList/TableList.mjs.map +1 -1
  148. package/dist/admin/components/TableList/TableRows.js.map +1 -1
  149. package/dist/admin/components/TableList/TableRows.mjs.map +1 -1
  150. package/dist/admin/components/UploadAssetDialog/AddAssetStep/AddAssetStep.js.map +1 -1
  151. package/dist/admin/components/UploadAssetDialog/AddAssetStep/AddAssetStep.mjs.map +1 -1
  152. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromComputerForm.js.map +1 -1
  153. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromComputerForm.mjs.map +1 -1
  154. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.js.map +1 -1
  155. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.mjs.map +1 -1
  156. package/dist/admin/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.js.map +1 -1
  157. package/dist/admin/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.mjs.map +1 -1
  158. package/dist/admin/components/UploadAssetDialog/UploadAssetDialog.js.map +1 -1
  159. package/dist/admin/components/UploadAssetDialog/UploadAssetDialog.mjs.map +1 -1
  160. package/dist/admin/components/UploadProgress/UploadProgress.js.map +1 -1
  161. package/dist/admin/components/UploadProgress/UploadProgress.mjs.map +1 -1
  162. package/dist/admin/constants.js.map +1 -1
  163. package/dist/admin/constants.mjs.map +1 -1
  164. package/dist/admin/future/App.js.map +1 -1
  165. package/dist/admin/future/App.mjs.map +1 -1
  166. package/dist/admin/future/components/Drawer.js +189 -0
  167. package/dist/admin/future/components/Drawer.js.map +1 -0
  168. package/dist/admin/future/components/Drawer.mjs +166 -0
  169. package/dist/admin/future/components/Drawer.mjs.map +1 -0
  170. package/dist/admin/future/components/UploadProgressDialog.js +60 -101
  171. package/dist/admin/future/components/UploadProgressDialog.js.map +1 -1
  172. package/dist/admin/future/components/UploadProgressDialog.mjs +62 -84
  173. package/dist/admin/future/components/UploadProgressDialog.mjs.map +1 -1
  174. package/dist/admin/future/pages/Assets/AssetsPage.js +155 -100
  175. package/dist/admin/future/pages/Assets/AssetsPage.js.map +1 -1
  176. package/dist/admin/future/pages/Assets/AssetsPage.mjs +160 -105
  177. package/dist/admin/future/pages/Assets/AssetsPage.mjs.map +1 -1
  178. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js +406 -0
  179. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js.map +1 -0
  180. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs +384 -0
  181. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs.map +1 -0
  182. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetPreview.js +215 -0
  183. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetPreview.js.map +1 -0
  184. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetPreview.mjs +194 -0
  185. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetPreview.mjs.map +1 -0
  186. package/dist/admin/future/pages/Assets/components/AssetsGrid.js +37 -8
  187. package/dist/admin/future/pages/Assets/components/AssetsGrid.js.map +1 -1
  188. package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs +38 -9
  189. package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs.map +1 -1
  190. package/dist/admin/future/pages/Assets/components/AssetsTable.js +35 -5
  191. package/dist/admin/future/pages/Assets/components/AssetsTable.js.map +1 -1
  192. package/dist/admin/future/pages/Assets/components/AssetsTable.mjs +37 -7
  193. package/dist/admin/future/pages/Assets/components/AssetsTable.mjs.map +1 -1
  194. package/dist/admin/future/pages/Assets/components/CreateFolderDialog.js +143 -0
  195. package/dist/admin/future/pages/Assets/components/CreateFolderDialog.js.map +1 -0
  196. package/dist/admin/future/pages/Assets/components/CreateFolderDialog.mjs +141 -0
  197. package/dist/admin/future/pages/Assets/components/CreateFolderDialog.mjs.map +1 -0
  198. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZone.js.map +1 -1
  199. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZone.mjs.map +1 -1
  200. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.js.map +1 -1
  201. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.mjs.map +1 -1
  202. package/dist/admin/future/pages/Assets/components/ImportFromUrlDialog.js +127 -0
  203. package/dist/admin/future/pages/Assets/components/ImportFromUrlDialog.js.map +1 -0
  204. package/dist/admin/future/pages/Assets/components/ImportFromUrlDialog.mjs +106 -0
  205. package/dist/admin/future/pages/Assets/components/ImportFromUrlDialog.mjs.map +1 -0
  206. package/dist/admin/future/pages/Assets/constants.js.map +1 -1
  207. package/dist/admin/future/pages/Assets/constants.mjs.map +1 -1
  208. package/dist/admin/future/pages/Assets/hooks/useFolderInfo.js.map +1 -1
  209. package/dist/admin/future/pages/Assets/hooks/useFolderInfo.mjs.map +1 -1
  210. package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.js.map +1 -1
  211. package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.mjs.map +1 -1
  212. package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.js.map +1 -1
  213. package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.mjs.map +1 -1
  214. package/dist/admin/future/services/api.js +181 -97
  215. package/dist/admin/future/services/api.js.map +1 -1
  216. package/dist/admin/future/services/api.mjs +181 -98
  217. package/dist/admin/future/services/api.mjs.map +1 -1
  218. package/dist/admin/future/services/assets.js +14 -1
  219. package/dist/admin/future/services/assets.js.map +1 -1
  220. package/dist/admin/future/services/assets.mjs +14 -2
  221. package/dist/admin/future/services/assets.mjs.map +1 -1
  222. package/dist/admin/future/services/folders.js +16 -1
  223. package/dist/admin/future/services/folders.js.map +1 -1
  224. package/dist/admin/future/services/folders.mjs +16 -2
  225. package/dist/admin/future/services/folders.mjs.map +1 -1
  226. package/dist/admin/future/store/hooks.js.map +1 -1
  227. package/dist/admin/future/store/hooks.mjs.map +1 -1
  228. package/dist/admin/future/store/uploadProgress.js +7 -4
  229. package/dist/admin/future/store/uploadProgress.js.map +1 -1
  230. package/dist/admin/future/store/uploadProgress.mjs +7 -4
  231. package/dist/admin/future/store/uploadProgress.mjs.map +1 -1
  232. package/dist/admin/future/utils/files.js +105 -3
  233. package/dist/admin/future/utils/files.js.map +1 -1
  234. package/dist/admin/future/utils/files.mjs +104 -4
  235. package/dist/admin/future/utils/files.mjs.map +1 -1
  236. package/dist/admin/future/utils/getAssetIcon.js +3 -3
  237. package/dist/admin/future/utils/getAssetIcon.js.map +1 -1
  238. package/dist/admin/future/utils/getAssetIcon.mjs +4 -4
  239. package/dist/admin/future/utils/getAssetIcon.mjs.map +1 -1
  240. package/dist/admin/future/utils/translations.js.map +1 -1
  241. package/dist/admin/future/utils/translations.mjs.map +1 -1
  242. package/dist/admin/hooks/useAIMetadataJob.js.map +1 -1
  243. package/dist/admin/hooks/useAIMetadataJob.mjs.map +1 -1
  244. package/dist/admin/hooks/useAiAvailability.js.map +1 -1
  245. package/dist/admin/hooks/useAiAvailability.mjs.map +1 -1
  246. package/dist/admin/hooks/useAssets.js.map +1 -1
  247. package/dist/admin/hooks/useAssets.mjs.map +1 -1
  248. package/dist/admin/hooks/useBulkEdit.js.map +1 -1
  249. package/dist/admin/hooks/useBulkEdit.mjs.map +1 -1
  250. package/dist/admin/hooks/useBulkMove.js.map +1 -1
  251. package/dist/admin/hooks/useBulkMove.mjs.map +1 -1
  252. package/dist/admin/hooks/useBulkRemove.js.map +1 -1
  253. package/dist/admin/hooks/useBulkRemove.mjs.map +1 -1
  254. package/dist/admin/hooks/useConfig.js.map +1 -1
  255. package/dist/admin/hooks/useConfig.mjs.map +1 -1
  256. package/dist/admin/hooks/useCropImg.js.map +1 -1
  257. package/dist/admin/hooks/useCropImg.mjs.map +1 -1
  258. package/dist/admin/hooks/useEditAsset.js.map +1 -1
  259. package/dist/admin/hooks/useEditAsset.mjs.map +1 -1
  260. package/dist/admin/hooks/useEditFolder.js.map +1 -1
  261. package/dist/admin/hooks/useEditFolder.mjs.map +1 -1
  262. package/dist/admin/hooks/useFolder.js.map +1 -1
  263. package/dist/admin/hooks/useFolder.mjs.map +1 -1
  264. package/dist/admin/hooks/useFolderStructure.js.map +1 -1
  265. package/dist/admin/hooks/useFolderStructure.mjs.map +1 -1
  266. package/dist/admin/hooks/useFolders.js.map +1 -1
  267. package/dist/admin/hooks/useFolders.mjs.map +1 -1
  268. package/dist/admin/hooks/useMediaLibraryPermissions.js.map +1 -1
  269. package/dist/admin/hooks/useMediaLibraryPermissions.mjs.map +1 -1
  270. package/dist/admin/hooks/useModalQueryParams.js.map +1 -1
  271. package/dist/admin/hooks/useModalQueryParams.mjs.map +1 -1
  272. package/dist/admin/hooks/usePersistentState.js.map +1 -1
  273. package/dist/admin/hooks/usePersistentState.mjs.map +1 -1
  274. package/dist/admin/hooks/useRemoveAsset.js.map +1 -1
  275. package/dist/admin/hooks/useRemoveAsset.mjs.map +1 -1
  276. package/dist/admin/hooks/useSelectionState.js.map +1 -1
  277. package/dist/admin/hooks/useSelectionState.mjs.map +1 -1
  278. package/dist/admin/hooks/useSettings.js.map +1 -1
  279. package/dist/admin/hooks/useSettings.mjs.map +1 -1
  280. package/dist/admin/hooks/useTracking.js.map +1 -1
  281. package/dist/admin/hooks/useTracking.mjs.map +1 -1
  282. package/dist/admin/hooks/useUpload.js.map +1 -1
  283. package/dist/admin/hooks/useUpload.mjs.map +1 -1
  284. package/dist/admin/hooks/utils/renameKeys.js.map +1 -1
  285. package/dist/admin/hooks/utils/renameKeys.mjs.map +1 -1
  286. package/dist/admin/index.js.map +1 -1
  287. package/dist/admin/index.mjs.map +1 -1
  288. package/dist/admin/package.json.js +1 -152
  289. package/dist/admin/package.json.js.map +1 -1
  290. package/dist/admin/package.json.mjs +2 -141
  291. package/dist/admin/package.json.mjs.map +1 -1
  292. package/dist/admin/pages/App/App.js.map +1 -1
  293. package/dist/admin/pages/App/App.mjs.map +1 -1
  294. package/dist/admin/pages/App/ConfigureTheView/ConfigureTheView.js.map +1 -1
  295. package/dist/admin/pages/App/ConfigureTheView/ConfigureTheView.mjs +3 -3
  296. package/dist/admin/pages/App/ConfigureTheView/ConfigureTheView.mjs.map +1 -1
  297. package/dist/admin/pages/App/ConfigureTheView/components/Settings.js.map +1 -1
  298. package/dist/admin/pages/App/ConfigureTheView/components/Settings.mjs.map +1 -1
  299. package/dist/admin/pages/App/ConfigureTheView/state/actionTypes.js.map +1 -1
  300. package/dist/admin/pages/App/ConfigureTheView/state/actionTypes.mjs.map +1 -1
  301. package/dist/admin/pages/App/ConfigureTheView/state/actions.js.map +1 -1
  302. package/dist/admin/pages/App/ConfigureTheView/state/actions.mjs.map +1 -1
  303. package/dist/admin/pages/App/ConfigureTheView/state/init.js.map +1 -1
  304. package/dist/admin/pages/App/ConfigureTheView/state/init.mjs.map +1 -1
  305. package/dist/admin/pages/App/ConfigureTheView/state/reducer.js.map +1 -1
  306. package/dist/admin/pages/App/ConfigureTheView/state/reducer.mjs +1 -1
  307. package/dist/admin/pages/App/ConfigureTheView/state/reducer.mjs.map +1 -1
  308. package/dist/admin/pages/App/MediaLibrary.js +1 -1
  309. package/dist/admin/pages/App/MediaLibrary.js.map +1 -1
  310. package/dist/admin/pages/App/MediaLibrary.mjs +2 -2
  311. package/dist/admin/pages/App/MediaLibrary.mjs.map +1 -1
  312. package/dist/admin/pages/App/components/BulkActions.js.map +1 -1
  313. package/dist/admin/pages/App/components/BulkActions.mjs.map +1 -1
  314. package/dist/admin/pages/App/components/BulkDeleteButton.js.map +1 -1
  315. package/dist/admin/pages/App/components/BulkDeleteButton.mjs.map +1 -1
  316. package/dist/admin/pages/App/components/BulkMoveButton.js.map +1 -1
  317. package/dist/admin/pages/App/components/BulkMoveButton.mjs.map +1 -1
  318. package/dist/admin/pages/App/components/EmptyOrNoPermissions.js.map +1 -1
  319. package/dist/admin/pages/App/components/EmptyOrNoPermissions.mjs.map +1 -1
  320. package/dist/admin/pages/App/components/Filters.js.map +1 -1
  321. package/dist/admin/pages/App/components/Filters.mjs.map +1 -1
  322. package/dist/admin/pages/App/components/Header.js.map +1 -1
  323. package/dist/admin/pages/App/components/Header.mjs +2 -2
  324. package/dist/admin/pages/App/components/Header.mjs.map +1 -1
  325. package/dist/admin/pages/SettingsPage/SettingsPage.js.map +1 -1
  326. package/dist/admin/pages/SettingsPage/SettingsPage.mjs.map +1 -1
  327. package/dist/admin/pages/SettingsPage/reducer.js.map +1 -1
  328. package/dist/admin/pages/SettingsPage/reducer.mjs.map +1 -1
  329. package/dist/admin/pluginId.js.map +1 -1
  330. package/dist/admin/pluginId.mjs.map +1 -1
  331. package/dist/admin/src/future/components/Drawer.d.ts +32 -0
  332. package/dist/admin/src/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.d.ts +8 -0
  333. package/dist/admin/src/future/pages/Assets/components/AssetDetails/AssetPreview.d.ts +6 -0
  334. package/dist/admin/src/future/pages/Assets/components/AssetsGrid.d.ts +2 -1
  335. package/dist/admin/src/future/pages/Assets/components/AssetsTable.d.ts +2 -1
  336. package/dist/admin/src/future/pages/Assets/components/CreateFolderDialog.d.ts +8 -0
  337. package/dist/admin/src/future/pages/Assets/components/ImportFromUrlDialog.d.ts +7 -0
  338. package/dist/admin/src/future/services/api.d.ts +10 -1
  339. package/dist/admin/src/future/services/assets.d.ts +2 -2
  340. package/dist/admin/src/future/services/folders.d.ts +1 -1
  341. package/dist/admin/src/future/store/uploadProgress.d.ts +1 -1
  342. package/dist/admin/src/future/utils/files.d.ts +70 -0
  343. package/dist/admin/translations/en.json.js +35 -3
  344. package/dist/admin/translations/en.json.js.map +1 -1
  345. package/dist/admin/translations/en.json.mjs +35 -3
  346. package/dist/admin/translations/en.json.mjs.map +1 -1
  347. package/dist/admin/translations/es.json.js +26 -2
  348. package/dist/admin/translations/es.json.js.map +1 -1
  349. package/dist/admin/translations/es.json.mjs +26 -2
  350. package/dist/admin/translations/es.json.mjs.map +1 -1
  351. package/dist/admin/utils/appendSearchParamsToUrl.js.map +1 -1
  352. package/dist/admin/utils/appendSearchParamsToUrl.mjs.map +1 -1
  353. package/dist/admin/utils/containsAssetFilter.js.map +1 -1
  354. package/dist/admin/utils/containsAssetFilter.mjs.map +1 -1
  355. package/dist/admin/utils/createAssetUrl.js.map +1 -1
  356. package/dist/admin/utils/createAssetUrl.mjs.map +1 -1
  357. package/dist/admin/utils/displayedFilters.js.map +1 -1
  358. package/dist/admin/utils/displayedFilters.mjs.map +1 -1
  359. package/dist/admin/utils/downloadFile.js.map +1 -1
  360. package/dist/admin/utils/downloadFile.mjs.map +1 -1
  361. package/dist/admin/utils/findRecursiveFolderByValue.js.map +1 -1
  362. package/dist/admin/utils/findRecursiveFolderByValue.mjs.map +1 -1
  363. package/dist/admin/utils/formatBytes.js.map +1 -1
  364. package/dist/admin/utils/formatBytes.mjs.map +1 -1
  365. package/dist/admin/utils/formatDuration.js.map +1 -1
  366. package/dist/admin/utils/formatDuration.mjs.map +1 -1
  367. package/dist/admin/utils/getAPIInnerErrors.js.map +1 -1
  368. package/dist/admin/utils/getAPIInnerErrors.mjs.map +1 -1
  369. package/dist/admin/utils/getAllowedFiles.js.map +1 -1
  370. package/dist/admin/utils/getAllowedFiles.mjs.map +1 -1
  371. package/dist/admin/utils/getBreadcrumbDataCM.js.map +1 -1
  372. package/dist/admin/utils/getBreadcrumbDataCM.mjs.map +1 -1
  373. package/dist/admin/utils/getBreadcrumbDataML.js.map +1 -1
  374. package/dist/admin/utils/getBreadcrumbDataML.mjs.map +1 -1
  375. package/dist/admin/utils/getFileExtension.js.map +1 -1
  376. package/dist/admin/utils/getFileExtension.mjs.map +1 -1
  377. package/dist/admin/utils/getFolderParents.js.map +1 -1
  378. package/dist/admin/utils/getFolderParents.mjs.map +1 -1
  379. package/dist/admin/utils/getFolderURL.js.map +1 -1
  380. package/dist/admin/utils/getFolderURL.mjs.map +1 -1
  381. package/dist/admin/utils/getTrad.js.map +1 -1
  382. package/dist/admin/utils/getTrad.mjs.map +1 -1
  383. package/dist/admin/utils/icons.js.map +1 -1
  384. package/dist/admin/utils/icons.mjs +1 -1
  385. package/dist/admin/utils/icons.mjs.map +1 -1
  386. package/dist/admin/utils/moveElement.js.map +1 -1
  387. package/dist/admin/utils/moveElement.mjs.map +1 -1
  388. package/dist/admin/utils/normalizeAPIError.js.map +1 -1
  389. package/dist/admin/utils/normalizeAPIError.mjs.map +1 -1
  390. package/dist/admin/utils/prefixFileUrlWithBackendUrl.js.map +1 -1
  391. package/dist/admin/utils/prefixFileUrlWithBackendUrl.mjs.map +1 -1
  392. package/dist/admin/utils/prefixPluginTranslations.js.map +1 -1
  393. package/dist/admin/utils/prefixPluginTranslations.mjs.map +1 -1
  394. package/dist/admin/utils/rawFileToAsset.js.map +1 -1
  395. package/dist/admin/utils/rawFileToAsset.mjs.map +1 -1
  396. package/dist/admin/utils/toSingularTypes.js.map +1 -1
  397. package/dist/admin/utils/toSingularTypes.mjs.map +1 -1
  398. package/dist/admin/utils/typeFromMime.js.map +1 -1
  399. package/dist/admin/utils/typeFromMime.mjs.map +1 -1
  400. package/dist/admin/utils/urlYupSchema.js.map +1 -1
  401. package/dist/admin/utils/urlYupSchema.mjs.map +1 -1
  402. package/dist/admin/utils/urlsToAssets.js.map +1 -1
  403. package/dist/admin/utils/urlsToAssets.mjs.map +1 -1
  404. package/dist/server/bootstrap.js.map +1 -1
  405. package/dist/server/bootstrap.mjs.map +1 -1
  406. package/dist/server/config.js.map +1 -1
  407. package/dist/server/config.mjs.map +1 -1
  408. package/dist/server/constants.js.map +1 -1
  409. package/dist/server/constants.mjs.map +1 -1
  410. package/dist/server/content-types/file.js.map +1 -1
  411. package/dist/server/content-types/file.mjs.map +1 -1
  412. package/dist/server/content-types/folder.js.map +1 -1
  413. package/dist/server/content-types/folder.mjs +1 -1
  414. package/dist/server/content-types/folder.mjs.map +1 -1
  415. package/dist/server/content-types/index.js.map +1 -1
  416. package/dist/server/content-types/index.mjs.map +1 -1
  417. package/dist/server/controllers/admin-file.js.map +1 -1
  418. package/dist/server/controllers/admin-file.mjs +1 -1
  419. package/dist/server/controllers/admin-file.mjs.map +1 -1
  420. package/dist/server/controllers/admin-folder-file.js.map +1 -1
  421. package/dist/server/controllers/admin-folder-file.mjs +2 -2
  422. package/dist/server/controllers/admin-folder-file.mjs.map +1 -1
  423. package/dist/server/controllers/admin-folder.js.map +1 -1
  424. package/dist/server/controllers/admin-folder.mjs +1 -1
  425. package/dist/server/controllers/admin-folder.mjs.map +1 -1
  426. package/dist/server/controllers/admin-settings.js.map +1 -1
  427. package/dist/server/controllers/admin-settings.mjs.map +1 -1
  428. package/dist/server/controllers/admin-upload.js +144 -0
  429. package/dist/server/controllers/admin-upload.js.map +1 -1
  430. package/dist/server/controllers/admin-upload.mjs +147 -3
  431. package/dist/server/controllers/admin-upload.mjs.map +1 -1
  432. package/dist/server/controllers/content-api.js.map +1 -1
  433. package/dist/server/controllers/content-api.mjs.map +1 -1
  434. package/dist/server/controllers/index.js.map +1 -1
  435. package/dist/server/controllers/index.mjs.map +1 -1
  436. package/dist/server/controllers/utils/find-entity-and-check-permissions.js.map +1 -1
  437. package/dist/server/controllers/utils/find-entity-and-check-permissions.mjs.map +1 -1
  438. package/dist/server/controllers/utils/folders.js.map +1 -1
  439. package/dist/server/controllers/utils/folders.mjs.map +1 -1
  440. package/dist/server/controllers/validation/admin/configureView.js.map +1 -1
  441. package/dist/server/controllers/validation/admin/configureView.mjs.map +1 -1
  442. package/dist/server/controllers/validation/admin/folder-file.js.map +1 -1
  443. package/dist/server/controllers/validation/admin/folder-file.mjs.map +1 -1
  444. package/dist/server/controllers/validation/admin/folder.js.map +1 -1
  445. package/dist/server/controllers/validation/admin/folder.mjs.map +1 -1
  446. package/dist/server/controllers/validation/admin/settings.js.map +1 -1
  447. package/dist/server/controllers/validation/admin/settings.mjs.map +1 -1
  448. package/dist/server/controllers/validation/admin/upload.js.map +1 -1
  449. package/dist/server/controllers/validation/admin/upload.mjs.map +1 -1
  450. package/dist/server/controllers/validation/admin/utils.js.map +1 -1
  451. package/dist/server/controllers/validation/admin/utils.mjs.map +1 -1
  452. package/dist/server/controllers/validation/content-api/upload.js.map +1 -1
  453. package/dist/server/controllers/validation/content-api/upload.mjs.map +1 -1
  454. package/dist/server/controllers/view-configuration.js.map +1 -1
  455. package/dist/server/controllers/view-configuration.mjs.map +1 -1
  456. package/dist/server/graphql.js.map +1 -1
  457. package/dist/server/graphql.mjs.map +1 -1
  458. package/dist/server/index.js +8 -8
  459. package/dist/server/middlewares/upload.js.map +1 -1
  460. package/dist/server/middlewares/upload.mjs.map +1 -1
  461. package/dist/server/models/ai-metadata-job.js.map +1 -1
  462. package/dist/server/models/ai-metadata-job.mjs.map +1 -1
  463. package/dist/server/register.js.map +1 -1
  464. package/dist/server/register.mjs.map +1 -1
  465. package/dist/server/routes/admin.js +10 -0
  466. package/dist/server/routes/admin.js.map +1 -1
  467. package/dist/server/routes/admin.mjs +10 -0
  468. package/dist/server/routes/admin.mjs.map +1 -1
  469. package/dist/server/routes/content-api.js.map +1 -1
  470. package/dist/server/routes/content-api.mjs.map +1 -1
  471. package/dist/server/routes/index.js.map +1 -1
  472. package/dist/server/routes/index.mjs +4 -4
  473. package/dist/server/routes/index.mjs.map +1 -1
  474. package/dist/server/routes/validation/upload.js.map +1 -1
  475. package/dist/server/routes/validation/upload.mjs.map +1 -1
  476. package/dist/server/routes/view-configuration.js.map +1 -1
  477. package/dist/server/routes/view-configuration.mjs.map +1 -1
  478. package/dist/server/services/ai-metadata-jobs.js.map +1 -1
  479. package/dist/server/services/ai-metadata-jobs.mjs.map +1 -1
  480. package/dist/server/services/ai-metadata.js.map +1 -1
  481. package/dist/server/services/ai-metadata.mjs.map +1 -1
  482. package/dist/server/services/api-upload-folder.js.map +1 -1
  483. package/dist/server/services/api-upload-folder.mjs.map +1 -1
  484. package/dist/server/services/extensions/index.js.map +1 -1
  485. package/dist/server/services/extensions/index.mjs.map +1 -1
  486. package/dist/server/services/extensions/utils.js.map +1 -1
  487. package/dist/server/services/extensions/utils.mjs.map +1 -1
  488. package/dist/server/services/file.js +120 -1
  489. package/dist/server/services/file.js.map +1 -1
  490. package/dist/server/services/file.mjs +122 -3
  491. package/dist/server/services/file.mjs.map +1 -1
  492. package/dist/server/services/folder.js.map +1 -1
  493. package/dist/server/services/folder.mjs +1 -1
  494. package/dist/server/services/folder.mjs.map +1 -1
  495. package/dist/server/services/image-manipulation.js.map +1 -1
  496. package/dist/server/services/image-manipulation.mjs +1 -1
  497. package/dist/server/services/image-manipulation.mjs.map +1 -1
  498. package/dist/server/services/index.js.map +1 -1
  499. package/dist/server/services/index.mjs.map +1 -1
  500. package/dist/server/services/metrics.js.map +1 -1
  501. package/dist/server/services/metrics.mjs.map +1 -1
  502. package/dist/server/services/provider.js.map +1 -1
  503. package/dist/server/services/provider.mjs.map +1 -1
  504. package/dist/server/services/upload.js +6 -1
  505. package/dist/server/services/upload.js.map +1 -1
  506. package/dist/server/services/upload.mjs +7 -2
  507. package/dist/server/services/upload.mjs.map +1 -1
  508. package/dist/server/services/weekly-metrics.js.map +1 -1
  509. package/dist/server/services/weekly-metrics.mjs.map +1 -1
  510. package/dist/server/src/controllers/admin-upload.d.ts +13 -0
  511. package/dist/server/src/controllers/admin-upload.d.ts.map +1 -1
  512. package/dist/server/src/controllers/index.d.ts +1 -0
  513. package/dist/server/src/controllers/index.d.ts.map +1 -1
  514. package/dist/server/src/index.d.ts +2 -0
  515. package/dist/server/src/index.d.ts.map +1 -1
  516. package/dist/server/src/routes/admin.d.ts.map +1 -1
  517. package/dist/server/src/services/file.d.ts +15 -0
  518. package/dist/server/src/services/file.d.ts.map +1 -1
  519. package/dist/server/src/services/index.d.ts +1 -0
  520. package/dist/server/src/services/index.d.ts.map +1 -1
  521. package/dist/server/src/services/upload.d.ts.map +1 -1
  522. package/dist/server/src/utils/mime-validation.d.ts +1 -0
  523. package/dist/server/src/utils/mime-validation.d.ts.map +1 -1
  524. package/dist/server/utils/cron.js.map +1 -1
  525. package/dist/server/utils/cron.mjs.map +1 -1
  526. package/dist/server/utils/images.js.map +1 -1
  527. package/dist/server/utils/images.mjs.map +1 -1
  528. package/dist/server/utils/index.js.map +1 -1
  529. package/dist/server/utils/index.mjs.map +1 -1
  530. package/dist/server/utils/mime-validation.js +184 -47
  531. package/dist/server/utils/mime-validation.js.map +1 -1
  532. package/dist/server/utils/mime-validation.mjs +185 -47
  533. package/dist/server/utils/mime-validation.mjs.map +1 -1
  534. package/dist/shared/contracts/files.d.ts +11 -0
  535. package/dist/shared/contracts/files.d.ts.map +1 -1
  536. package/package.json +19 -10
@@ -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 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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"}
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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"}
@@ -1,7 +1,7 @@
1
1
  import { strings } from '@strapi/utils';
2
2
  import { getService } from '../utils/index.mjs';
3
- import { FOLDER_MODEL_UID, ACTIONS, FILE_MODEL_UID } from '../constants.mjs';
4
- import { validateDeleteManyFoldersFiles, validateMoveManyFoldersFiles } from './validation/admin/folder-file.mjs';
3
+ import { FOLDER_MODEL_UID, FILE_MODEL_UID, ACTIONS } from '../constants.mjs';
4
+ import { validateMoveManyFoldersFiles, validateDeleteManyFoldersFiles } from './validation/admin/folder-file.mjs';
5
5
 
6
6
  var adminFolderFile = {
7
7
  async deleteMany (ctx) {
@@ -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 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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"}
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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"}
@@ -1 +1 @@
1
- {"version":3,"file":"admin-folder.js","sources":["../../../server/src/controllers/admin-folder.ts"],"sourcesContent":["import { defaultsDeep } from 'lodash/fp';\n\nimport type { Context } from 'koa';\n\nimport { getService } from '../utils';\nimport { FOLDER_MODEL_UID } from '../constants';\nimport { validateCreateFolder, validateUpdateFolder } from './validation/admin/folder';\n\nexport default {\n async findOne(ctx: Context) {\n const { id } = ctx.params;\n\n const permissionsManager = strapi.service('admin::permission').createPermissionsManager({\n ability: ctx.state.userAbility,\n model: FOLDER_MODEL_UID,\n });\n\n await permissionsManager.validateQuery(ctx.query);\n const query = await permissionsManager.sanitizeQuery(ctx.query);\n\n const { results } = await strapi.db.query(FOLDER_MODEL_UID).findPage(\n strapi.get('query-params').transform(\n FOLDER_MODEL_UID,\n defaultsDeep(\n {\n filters: { id },\n populate: {\n children: {\n count: true,\n },\n files: {\n count: true,\n },\n },\n },\n query\n )\n )\n );\n\n if (results.length === 0) {\n return ctx.notFound('folder not found');\n }\n\n ctx.body = {\n data: await permissionsManager.sanitizeOutput(results[0]),\n };\n },\n\n async find(ctx: Context) {\n const permissionsManager = strapi.service('admin::permission').createPermissionsManager({\n ability: ctx.state.userAbility,\n model: FOLDER_MODEL_UID,\n });\n\n await permissionsManager.validateQuery(ctx.query);\n const query = await permissionsManager.sanitizeQuery(ctx.query);\n\n const results = await strapi.db.query(FOLDER_MODEL_UID).findMany(\n strapi.get('query-params').transform(\n FOLDER_MODEL_UID,\n defaultsDeep(\n {\n populate: {\n children: {\n count: true,\n },\n files: {\n count: true,\n },\n },\n },\n query\n )\n )\n );\n\n ctx.body = {\n data: await permissionsManager.sanitizeOutput(results),\n };\n },\n async create(ctx: Context) {\n const { user } = ctx.state;\n const { body } = ctx.request;\n\n await validateCreateFolder(body);\n\n const folderService = getService('folder');\n\n const folder = await folderService.create(body, { user });\n\n const permissionsManager = strapi.service('admin::permission').createPermissionsManager({\n ability: ctx.state.userAbility,\n model: FOLDER_MODEL_UID,\n });\n\n ctx.created({\n data: await permissionsManager.sanitizeOutput(folder),\n });\n },\n\n async update(ctx: Context) {\n const { id } = ctx.params;\n const { user } = ctx.state;\n const { body } = ctx.request;\n\n const permissionsManager = strapi.service('admin::permission').createPermissionsManager({\n ability: ctx.state.userAbility,\n model: FOLDER_MODEL_UID,\n });\n\n await validateUpdateFolder(id)(body);\n\n const folderService = getService('folder');\n\n const updatedFolder = await folderService.update(id, body, { user });\n\n if (!updatedFolder) {\n return ctx.notFound('folder not found');\n }\n\n ctx.body = {\n data: await permissionsManager.sanitizeOutput(updatedFolder),\n };\n },\n\n async getStructure(ctx: Context) {\n const { getStructure } = getService('folder');\n\n const structure = await getStructure();\n\n ctx.body = {\n data: structure,\n };\n },\n};\n"],"names":["findOne","ctx","id","params","permissionsManager","strapi","service","createPermissionsManager","ability","state","userAbility","model","FOLDER_MODEL_UID","validateQuery","query","sanitizeQuery","results","db","findPage","get","transform","defaultsDeep","filters","populate","children","count","files","length","notFound","body","data","sanitizeOutput","find","findMany","create","user","request","validateCreateFolder","folderService","getService","folder","created","update","validateUpdateFolder","updatedFolder","getStructure","structure"],"mappings":"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"}
1
+ {"version":3,"file":"admin-folder.js","sources":["../../../server/src/controllers/admin-folder.ts"],"sourcesContent":["import { defaultsDeep } from 'lodash/fp';\n\nimport type { Context } from 'koa';\n\nimport { getService } from '../utils';\nimport { FOLDER_MODEL_UID } from '../constants';\nimport { validateCreateFolder, validateUpdateFolder } from './validation/admin/folder';\n\nexport default {\n async findOne(ctx: Context) {\n const { id } = ctx.params;\n\n const permissionsManager = strapi.service('admin::permission').createPermissionsManager({\n ability: ctx.state.userAbility,\n model: FOLDER_MODEL_UID,\n });\n\n await permissionsManager.validateQuery(ctx.query);\n const query = await permissionsManager.sanitizeQuery(ctx.query);\n\n const { results } = await strapi.db.query(FOLDER_MODEL_UID).findPage(\n strapi.get('query-params').transform(\n FOLDER_MODEL_UID,\n defaultsDeep(\n {\n filters: { id },\n populate: {\n children: {\n count: true,\n },\n files: {\n count: true,\n },\n },\n },\n query\n )\n )\n );\n\n if (results.length === 0) {\n return ctx.notFound('folder not found');\n }\n\n ctx.body = {\n data: await permissionsManager.sanitizeOutput(results[0]),\n };\n },\n\n async find(ctx: Context) {\n const permissionsManager = strapi.service('admin::permission').createPermissionsManager({\n ability: ctx.state.userAbility,\n model: FOLDER_MODEL_UID,\n });\n\n await permissionsManager.validateQuery(ctx.query);\n const query = await permissionsManager.sanitizeQuery(ctx.query);\n\n const results = await strapi.db.query(FOLDER_MODEL_UID).findMany(\n strapi.get('query-params').transform(\n FOLDER_MODEL_UID,\n defaultsDeep(\n {\n populate: {\n children: {\n count: true,\n },\n files: {\n count: true,\n },\n },\n },\n query\n )\n )\n );\n\n ctx.body = {\n data: await permissionsManager.sanitizeOutput(results),\n };\n },\n async create(ctx: Context) {\n const { user } = ctx.state;\n const { body } = ctx.request;\n\n await validateCreateFolder(body);\n\n const folderService = getService('folder');\n\n const folder = await folderService.create(body, { user });\n\n const permissionsManager = strapi.service('admin::permission').createPermissionsManager({\n ability: ctx.state.userAbility,\n model: FOLDER_MODEL_UID,\n });\n\n ctx.created({\n data: await permissionsManager.sanitizeOutput(folder),\n });\n },\n\n async update(ctx: Context) {\n const { id } = ctx.params;\n const { user } = ctx.state;\n const { body } = ctx.request;\n\n const permissionsManager = strapi.service('admin::permission').createPermissionsManager({\n ability: ctx.state.userAbility,\n model: FOLDER_MODEL_UID,\n });\n\n await validateUpdateFolder(id)(body);\n\n const folderService = getService('folder');\n\n const updatedFolder = await folderService.update(id, body, { user });\n\n if (!updatedFolder) {\n return ctx.notFound('folder not found');\n }\n\n ctx.body = {\n data: await permissionsManager.sanitizeOutput(updatedFolder),\n };\n },\n\n async getStructure(ctx: Context) {\n const { getStructure } = getService('folder');\n\n const structure = await getStructure();\n\n ctx.body = {\n data: structure,\n };\n },\n};\n"],"names":["findOne","ctx","id","params","permissionsManager","strapi","service","createPermissionsManager","ability","state","userAbility","model","FOLDER_MODEL_UID","validateQuery","query","sanitizeQuery","results","db","findPage","get","transform","defaultsDeep","filters","populate","children","count","files","length","notFound","body","data","sanitizeOutput","find","findMany","create","user","request","validateCreateFolder","folderService","getService","folder","created","update","validateUpdateFolder","updatedFolder","getStructure","structure"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { defaultsDeep } from 'lodash/fp';
2
2
  import { getService } from '../utils/index.mjs';
3
3
  import { FOLDER_MODEL_UID } from '../constants.mjs';
4
- import { validateCreateFolder, validateUpdateFolder } from './validation/admin/folder.mjs';
4
+ import { validateUpdateFolder, validateCreateFolder } from './validation/admin/folder.mjs';
5
5
 
6
6
  var adminFolder = {
7
7
  async findOne (ctx) {
@@ -1 +1 @@
1
- {"version":3,"file":"admin-folder.mjs","sources":["../../../server/src/controllers/admin-folder.ts"],"sourcesContent":["import { defaultsDeep } from 'lodash/fp';\n\nimport type { Context } from 'koa';\n\nimport { getService } from '../utils';\nimport { FOLDER_MODEL_UID } from '../constants';\nimport { validateCreateFolder, validateUpdateFolder } from './validation/admin/folder';\n\nexport default {\n async findOne(ctx: Context) {\n const { id } = ctx.params;\n\n const permissionsManager = strapi.service('admin::permission').createPermissionsManager({\n ability: ctx.state.userAbility,\n model: FOLDER_MODEL_UID,\n });\n\n await permissionsManager.validateQuery(ctx.query);\n const query = await permissionsManager.sanitizeQuery(ctx.query);\n\n const { results } = await strapi.db.query(FOLDER_MODEL_UID).findPage(\n strapi.get('query-params').transform(\n FOLDER_MODEL_UID,\n defaultsDeep(\n {\n filters: { id },\n populate: {\n children: {\n count: true,\n },\n files: {\n count: true,\n },\n },\n },\n query\n )\n )\n );\n\n if (results.length === 0) {\n return ctx.notFound('folder not found');\n }\n\n ctx.body = {\n data: await permissionsManager.sanitizeOutput(results[0]),\n };\n },\n\n async find(ctx: Context) {\n const permissionsManager = strapi.service('admin::permission').createPermissionsManager({\n ability: ctx.state.userAbility,\n model: FOLDER_MODEL_UID,\n });\n\n await permissionsManager.validateQuery(ctx.query);\n const query = await permissionsManager.sanitizeQuery(ctx.query);\n\n const results = await strapi.db.query(FOLDER_MODEL_UID).findMany(\n strapi.get('query-params').transform(\n FOLDER_MODEL_UID,\n defaultsDeep(\n {\n populate: {\n children: {\n count: true,\n },\n files: {\n count: true,\n },\n },\n },\n query\n )\n )\n );\n\n ctx.body = {\n data: await permissionsManager.sanitizeOutput(results),\n };\n },\n async create(ctx: Context) {\n const { user } = ctx.state;\n const { body } = ctx.request;\n\n await validateCreateFolder(body);\n\n const folderService = getService('folder');\n\n const folder = await folderService.create(body, { user });\n\n const permissionsManager = strapi.service('admin::permission').createPermissionsManager({\n ability: ctx.state.userAbility,\n model: FOLDER_MODEL_UID,\n });\n\n ctx.created({\n data: await permissionsManager.sanitizeOutput(folder),\n });\n },\n\n async update(ctx: Context) {\n const { id } = ctx.params;\n const { user } = ctx.state;\n const { body } = ctx.request;\n\n const permissionsManager = strapi.service('admin::permission').createPermissionsManager({\n ability: ctx.state.userAbility,\n model: FOLDER_MODEL_UID,\n });\n\n await validateUpdateFolder(id)(body);\n\n const folderService = getService('folder');\n\n const updatedFolder = await folderService.update(id, body, { user });\n\n if (!updatedFolder) {\n return ctx.notFound('folder not found');\n }\n\n ctx.body = {\n data: await permissionsManager.sanitizeOutput(updatedFolder),\n };\n },\n\n async getStructure(ctx: Context) {\n const { getStructure } = getService('folder');\n\n const structure = await getStructure();\n\n ctx.body = {\n data: structure,\n };\n },\n};\n"],"names":["findOne","ctx","id","params","permissionsManager","strapi","service","createPermissionsManager","ability","state","userAbility","model","FOLDER_MODEL_UID","validateQuery","query","sanitizeQuery","results","db","findPage","get","transform","defaultsDeep","filters","populate","children","count","files","length","notFound","body","data","sanitizeOutput","find","findMany","create","user","request","validateCreateFolder","folderService","getService","folder","created","update","validateUpdateFolder","updatedFolder","getStructure","structure"],"mappings":"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"}
1
+ {"version":3,"file":"admin-folder.mjs","sources":["../../../server/src/controllers/admin-folder.ts"],"sourcesContent":["import { defaultsDeep } from 'lodash/fp';\n\nimport type { Context } from 'koa';\n\nimport { getService } from '../utils';\nimport { FOLDER_MODEL_UID } from '../constants';\nimport { validateCreateFolder, validateUpdateFolder } from './validation/admin/folder';\n\nexport default {\n async findOne(ctx: Context) {\n const { id } = ctx.params;\n\n const permissionsManager = strapi.service('admin::permission').createPermissionsManager({\n ability: ctx.state.userAbility,\n model: FOLDER_MODEL_UID,\n });\n\n await permissionsManager.validateQuery(ctx.query);\n const query = await permissionsManager.sanitizeQuery(ctx.query);\n\n const { results } = await strapi.db.query(FOLDER_MODEL_UID).findPage(\n strapi.get('query-params').transform(\n FOLDER_MODEL_UID,\n defaultsDeep(\n {\n filters: { id },\n populate: {\n children: {\n count: true,\n },\n files: {\n count: true,\n },\n },\n },\n query\n )\n )\n );\n\n if (results.length === 0) {\n return ctx.notFound('folder not found');\n }\n\n ctx.body = {\n data: await permissionsManager.sanitizeOutput(results[0]),\n };\n },\n\n async find(ctx: Context) {\n const permissionsManager = strapi.service('admin::permission').createPermissionsManager({\n ability: ctx.state.userAbility,\n model: FOLDER_MODEL_UID,\n });\n\n await permissionsManager.validateQuery(ctx.query);\n const query = await permissionsManager.sanitizeQuery(ctx.query);\n\n const results = await strapi.db.query(FOLDER_MODEL_UID).findMany(\n strapi.get('query-params').transform(\n FOLDER_MODEL_UID,\n defaultsDeep(\n {\n populate: {\n children: {\n count: true,\n },\n files: {\n count: true,\n },\n },\n },\n query\n )\n )\n );\n\n ctx.body = {\n data: await permissionsManager.sanitizeOutput(results),\n };\n },\n async create(ctx: Context) {\n const { user } = ctx.state;\n const { body } = ctx.request;\n\n await validateCreateFolder(body);\n\n const folderService = getService('folder');\n\n const folder = await folderService.create(body, { user });\n\n const permissionsManager = strapi.service('admin::permission').createPermissionsManager({\n ability: ctx.state.userAbility,\n model: FOLDER_MODEL_UID,\n });\n\n ctx.created({\n data: await permissionsManager.sanitizeOutput(folder),\n });\n },\n\n async update(ctx: Context) {\n const { id } = ctx.params;\n const { user } = ctx.state;\n const { body } = ctx.request;\n\n const permissionsManager = strapi.service('admin::permission').createPermissionsManager({\n ability: ctx.state.userAbility,\n model: FOLDER_MODEL_UID,\n });\n\n await validateUpdateFolder(id)(body);\n\n const folderService = getService('folder');\n\n const updatedFolder = await folderService.update(id, body, { user });\n\n if (!updatedFolder) {\n return ctx.notFound('folder not found');\n }\n\n ctx.body = {\n data: await permissionsManager.sanitizeOutput(updatedFolder),\n };\n },\n\n async getStructure(ctx: Context) {\n const { getStructure } = getService('folder');\n\n const structure = await getStructure();\n\n ctx.body = {\n data: structure,\n };\n },\n};\n"],"names":["findOne","ctx","id","params","permissionsManager","strapi","service","createPermissionsManager","ability","state","userAbility","model","FOLDER_MODEL_UID","validateQuery","query","sanitizeQuery","results","db","findPage","get","transform","defaultsDeep","filters","populate","children","count","files","length","notFound","body","data","sanitizeOutput","find","findMany","create","user","request","validateCreateFolder","folderService","getService","folder","created","update","validateUpdateFolder","updatedFolder","getStructure","structure"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"admin-settings.js","sources":["../../../server/src/controllers/admin-settings.ts"],"sourcesContent":["import type { Context } from 'koa';\n\nimport { getService } from '../utils';\nimport { ACTIONS, FILE_MODEL_UID } from '../constants';\nimport validateSettings from './validation/admin/settings';\n\nexport default {\n async updateSettings(ctx: Context) {\n const {\n request: { body },\n state: { userAbility },\n } = ctx;\n\n if (userAbility.cannot(ACTIONS.readSettings, FILE_MODEL_UID)) {\n return ctx.forbidden();\n }\n\n const data = await validateSettings(body);\n\n await getService('upload').setSettings(data);\n\n ctx.body = { data };\n },\n\n async getSettings(ctx: Context) {\n const {\n state: { userAbility },\n } = ctx;\n\n if (userAbility.cannot(ACTIONS.readSettings, FILE_MODEL_UID)) {\n return ctx.forbidden();\n }\n\n const data = await getService('upload').getSettings();\n\n ctx.body = { data };\n },\n};\n"],"names":["updateSettings","ctx","request","body","state","userAbility","cannot","ACTIONS","readSettings","FILE_MODEL_UID","forbidden","data","validateSettings","getService","setSettings","getSettings"],"mappings":";;;;;;AAMA,oBAAe;AACb,IAAA,MAAMA,gBAAeC,GAAY,EAAA;QAC/B,MAAM,EACJC,OAAS,EAAA,EAAEC,IAAI,EAAE,EACjBC,KAAAA,EAAO,EAAEC,WAAW,EAAE,EACvB,GAAGJ,GAAAA;AAEJ,QAAA,IAAII,YAAYC,MAAM,CAACC,iBAAQC,CAAAA,YAAY,EAAEC,wBAAiB,CAAA,EAAA;AAC5D,YAAA,OAAOR,IAAIS,SAAS,EAAA;AACtB;QAEA,MAAMC,IAAAA,GAAO,MAAMC,QAAiBT,CAAAA,IAAAA,CAAAA;QAEpC,MAAMU,gBAAAA,CAAW,QAAUC,CAAAA,CAAAA,WAAW,CAACH,IAAAA,CAAAA;AAEvCV,QAAAA,GAAAA,CAAIE,IAAI,GAAG;AAAEQ,YAAAA;AAAK,SAAA;AACpB,KAAA;AAEA,IAAA,MAAMI,aAAYd,GAAY,EAAA;AAC5B,QAAA,MAAM,EACJG,KAAO,EAAA,EAAEC,WAAW,EAAE,EACvB,GAAGJ,GAAAA;AAEJ,QAAA,IAAII,YAAYC,MAAM,CAACC,iBAAQC,CAAAA,YAAY,EAAEC,wBAAiB,CAAA,EAAA;AAC5D,YAAA,OAAOR,IAAIS,SAAS,EAAA;AACtB;AAEA,QAAA,MAAMC,IAAO,GAAA,MAAME,gBAAW,CAAA,QAAA,CAAA,CAAUE,WAAW,EAAA;AAEnDd,QAAAA,GAAAA,CAAIE,IAAI,GAAG;AAAEQ,YAAAA;AAAK,SAAA;AACpB;AACF,CAAE;;;;"}
1
+ {"version":3,"file":"admin-settings.js","sources":["../../../server/src/controllers/admin-settings.ts"],"sourcesContent":["import type { Context } from 'koa';\n\nimport { getService } from '../utils';\nimport { ACTIONS, FILE_MODEL_UID } from '../constants';\nimport validateSettings from './validation/admin/settings';\n\nexport default {\n async updateSettings(ctx: Context) {\n const {\n request: { body },\n state: { userAbility },\n } = ctx;\n\n if (userAbility.cannot(ACTIONS.readSettings, FILE_MODEL_UID)) {\n return ctx.forbidden();\n }\n\n const data = await validateSettings(body);\n\n await getService('upload').setSettings(data);\n\n ctx.body = { data };\n },\n\n async getSettings(ctx: Context) {\n const {\n state: { userAbility },\n } = ctx;\n\n if (userAbility.cannot(ACTIONS.readSettings, FILE_MODEL_UID)) {\n return ctx.forbidden();\n }\n\n const data = await getService('upload').getSettings();\n\n ctx.body = { data };\n },\n};\n"],"names":["updateSettings","ctx","request","body","state","userAbility","cannot","ACTIONS","readSettings","FILE_MODEL_UID","forbidden","data","validateSettings","getService","setSettings","getSettings"],"mappings":";;;;;;AAMA,oBAAe;AACb,IAAA,MAAMA,gBAAeC,GAAY,EAAA;QAC/B,MAAM,EACJC,OAAAA,EAAS,EAAEC,IAAI,EAAE,EACjBC,KAAAA,EAAO,EAAEC,WAAW,EAAE,EACvB,GAAGJ,GAAAA;AAEJ,QAAA,IAAII,YAAYC,MAAM,CAACC,iBAAAA,CAAQC,YAAY,EAAEC,wBAAAA,CAAAA,EAAiB;AAC5D,YAAA,OAAOR,IAAIS,SAAS,EAAA;AACtB,QAAA;QAEA,MAAMC,IAAAA,GAAO,MAAMC,QAAAA,CAAiBT,IAAAA,CAAAA;QAEpC,MAAMU,gBAAAA,CAAW,QAAA,CAAA,CAAUC,WAAW,CAACH,IAAAA,CAAAA;AAEvCV,QAAAA,GAAAA,CAAIE,IAAI,GAAG;AAAEQ,YAAAA;AAAK,SAAA;AACpB,IAAA,CAAA;AAEA,IAAA,MAAMI,aAAYd,GAAY,EAAA;AAC5B,QAAA,MAAM,EACJG,KAAAA,EAAO,EAAEC,WAAW,EAAE,EACvB,GAAGJ,GAAAA;AAEJ,QAAA,IAAII,YAAYC,MAAM,CAACC,iBAAAA,CAAQC,YAAY,EAAEC,wBAAAA,CAAAA,EAAiB;AAC5D,YAAA,OAAOR,IAAIS,SAAS,EAAA;AACtB,QAAA;AAEA,QAAA,MAAMC,IAAAA,GAAO,MAAME,gBAAAA,CAAW,QAAA,CAAA,CAAUE,WAAW,EAAA;AAEnDd,QAAAA,GAAAA,CAAIE,IAAI,GAAG;AAAEQ,YAAAA;AAAK,SAAA;AACpB,IAAA;AACF,CAAA;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"admin-settings.mjs","sources":["../../../server/src/controllers/admin-settings.ts"],"sourcesContent":["import type { Context } from 'koa';\n\nimport { getService } from '../utils';\nimport { ACTIONS, FILE_MODEL_UID } from '../constants';\nimport validateSettings from './validation/admin/settings';\n\nexport default {\n async updateSettings(ctx: Context) {\n const {\n request: { body },\n state: { userAbility },\n } = ctx;\n\n if (userAbility.cannot(ACTIONS.readSettings, FILE_MODEL_UID)) {\n return ctx.forbidden();\n }\n\n const data = await validateSettings(body);\n\n await getService('upload').setSettings(data);\n\n ctx.body = { data };\n },\n\n async getSettings(ctx: Context) {\n const {\n state: { userAbility },\n } = ctx;\n\n if (userAbility.cannot(ACTIONS.readSettings, FILE_MODEL_UID)) {\n return ctx.forbidden();\n }\n\n const data = await getService('upload').getSettings();\n\n ctx.body = { data };\n },\n};\n"],"names":["updateSettings","ctx","request","body","state","userAbility","cannot","ACTIONS","readSettings","FILE_MODEL_UID","forbidden","data","validateSettings","getService","setSettings","getSettings"],"mappings":";;;;AAMA,oBAAe;AACb,IAAA,MAAMA,gBAAeC,GAAY,EAAA;QAC/B,MAAM,EACJC,OAAS,EAAA,EAAEC,IAAI,EAAE,EACjBC,KAAAA,EAAO,EAAEC,WAAW,EAAE,EACvB,GAAGJ,GAAAA;AAEJ,QAAA,IAAII,YAAYC,MAAM,CAACC,OAAQC,CAAAA,YAAY,EAAEC,cAAiB,CAAA,EAAA;AAC5D,YAAA,OAAOR,IAAIS,SAAS,EAAA;AACtB;QAEA,MAAMC,IAAAA,GAAO,MAAMC,gBAAiBT,CAAAA,IAAAA,CAAAA;QAEpC,MAAMU,UAAAA,CAAW,QAAUC,CAAAA,CAAAA,WAAW,CAACH,IAAAA,CAAAA;AAEvCV,QAAAA,GAAAA,CAAIE,IAAI,GAAG;AAAEQ,YAAAA;AAAK,SAAA;AACpB,KAAA;AAEA,IAAA,MAAMI,aAAYd,GAAY,EAAA;AAC5B,QAAA,MAAM,EACJG,KAAO,EAAA,EAAEC,WAAW,EAAE,EACvB,GAAGJ,GAAAA;AAEJ,QAAA,IAAII,YAAYC,MAAM,CAACC,OAAQC,CAAAA,YAAY,EAAEC,cAAiB,CAAA,EAAA;AAC5D,YAAA,OAAOR,IAAIS,SAAS,EAAA;AACtB;AAEA,QAAA,MAAMC,IAAO,GAAA,MAAME,UAAW,CAAA,QAAA,CAAA,CAAUE,WAAW,EAAA;AAEnDd,QAAAA,GAAAA,CAAIE,IAAI,GAAG;AAAEQ,YAAAA;AAAK,SAAA;AACpB;AACF,CAAE;;;;"}
1
+ {"version":3,"file":"admin-settings.mjs","sources":["../../../server/src/controllers/admin-settings.ts"],"sourcesContent":["import type { Context } from 'koa';\n\nimport { getService } from '../utils';\nimport { ACTIONS, FILE_MODEL_UID } from '../constants';\nimport validateSettings from './validation/admin/settings';\n\nexport default {\n async updateSettings(ctx: Context) {\n const {\n request: { body },\n state: { userAbility },\n } = ctx;\n\n if (userAbility.cannot(ACTIONS.readSettings, FILE_MODEL_UID)) {\n return ctx.forbidden();\n }\n\n const data = await validateSettings(body);\n\n await getService('upload').setSettings(data);\n\n ctx.body = { data };\n },\n\n async getSettings(ctx: Context) {\n const {\n state: { userAbility },\n } = ctx;\n\n if (userAbility.cannot(ACTIONS.readSettings, FILE_MODEL_UID)) {\n return ctx.forbidden();\n }\n\n const data = await getService('upload').getSettings();\n\n ctx.body = { data };\n },\n};\n"],"names":["updateSettings","ctx","request","body","state","userAbility","cannot","ACTIONS","readSettings","FILE_MODEL_UID","forbidden","data","validateSettings","getService","setSettings","getSettings"],"mappings":";;;;AAMA,oBAAe;AACb,IAAA,MAAMA,gBAAeC,GAAY,EAAA;QAC/B,MAAM,EACJC,OAAAA,EAAS,EAAEC,IAAI,EAAE,EACjBC,KAAAA,EAAO,EAAEC,WAAW,EAAE,EACvB,GAAGJ,GAAAA;AAEJ,QAAA,IAAII,YAAYC,MAAM,CAACC,OAAAA,CAAQC,YAAY,EAAEC,cAAAA,CAAAA,EAAiB;AAC5D,YAAA,OAAOR,IAAIS,SAAS,EAAA;AACtB,QAAA;QAEA,MAAMC,IAAAA,GAAO,MAAMC,gBAAAA,CAAiBT,IAAAA,CAAAA;QAEpC,MAAMU,UAAAA,CAAW,QAAA,CAAA,CAAUC,WAAW,CAACH,IAAAA,CAAAA;AAEvCV,QAAAA,GAAAA,CAAIE,IAAI,GAAG;AAAEQ,YAAAA;AAAK,SAAA;AACpB,IAAA,CAAA;AAEA,IAAA,MAAMI,aAAYd,GAAY,EAAA;AAC5B,QAAA,MAAM,EACJG,KAAAA,EAAO,EAAEC,WAAW,EAAE,EACvB,GAAGJ,GAAAA;AAEJ,QAAA,IAAII,YAAYC,MAAM,CAACC,OAAAA,CAAQC,YAAY,EAAEC,cAAAA,CAAAA,EAAiB;AAC5D,YAAA,OAAOR,IAAIS,SAAS,EAAA;AACtB,QAAA;AAEA,QAAA,MAAMC,IAAAA,GAAO,MAAME,UAAAA,CAAW,QAAA,CAAA,CAAUE,WAAW,EAAA;AAEnDd,QAAAA,GAAAA,CAAIE,IAAI,GAAG;AAAEQ,YAAAA;AAAK,SAAA;AACpB,IAAA;AACF,CAAA;;;;"}
@@ -1,5 +1,8 @@
1
1
  'use strict';
2
2
 
3
+ var os = require('os');
4
+ var path = require('path');
5
+ var fse = require('fs-extra');
3
6
  var _ = require('lodash');
4
7
  var utils = require('@strapi/utils');
5
8
  var index = require('../utils/index.js');
@@ -264,6 +267,147 @@ var adminUpload = {
264
267
  });
265
268
  res.end();
266
269
  },
270
+ /**
271
+ * @experimental
272
+ * Upload files from URLs with SSE streaming for per-file progress
273
+ *
274
+ * Accepts JSON body with URLs and fetches them server-side.
275
+ * Streams Server-Sent Events as each URL is fetched and uploaded:
276
+ * - file:fetching — when starting to fetch a URL
277
+ * - file:uploading — when upload starts for a fetched file
278
+ * - file:complete — when a file is successfully uploaded
279
+ * - file:error — when a URL fetch or upload fails
280
+ * - stream:complete — final summary with all results
281
+ */ async unstable_uploadFromUrls (ctx) {
282
+ const { state: { userAbility, user }, request: { body } } = ctx;
283
+ const uploadService = index.getService('upload');
284
+ const fileService = index.getService('file');
285
+ const pm = strapi.service('admin::permission').createPermissionsManager({
286
+ ability: userAbility,
287
+ action: constants.ACTIONS.create,
288
+ model: constants.FILE_MODEL_UID
289
+ });
290
+ if (!pm.isAllowed) {
291
+ return ctx.forbidden();
292
+ }
293
+ // Parse and validate request body
294
+ const { urls, folderId } = body;
295
+ if (!urls || !Array.isArray(urls) || urls.length === 0) {
296
+ throw new utils.errors.ApplicationError('URLs are required');
297
+ }
298
+ if (urls.length > 20) {
299
+ throw new utils.errors.ApplicationError('Maximum 20 URLs allowed per request');
300
+ }
301
+ // Take manual control of the response for SSE streaming
302
+ ctx.respond = false;
303
+ const res = ctx.res;
304
+ res.writeHead(200, {
305
+ 'Content-Type': 'text/event-stream',
306
+ 'Cache-Control': 'no-cache',
307
+ Connection: 'keep-alive'
308
+ });
309
+ const writeSSE = (event, data)=>{
310
+ res.write(`event: ${event}\ndata: ${JSON.stringify(data)}\n\n`);
311
+ };
312
+ const total = urls.length;
313
+ const uploadErrors = [];
314
+ const successfulFiles = [];
315
+ // Create temp directory for fetched files
316
+ const tmpWorkingDirectory = await fse.mkdtemp(path.join(os.tmpdir(), 'strapi-url-upload-'));
317
+ const { sizeLimit } = strapi.config.get('plugin::upload');
318
+ try {
319
+ // Process each URL sequentially
320
+ for(let i = 0; i < urls.length; i += 1){
321
+ const url = urls[i];
322
+ writeSSE('file:fetching', {
323
+ url,
324
+ index: i,
325
+ total
326
+ });
327
+ try {
328
+ // Fetch URL to temp file
329
+ const { file } = await fileService.fetchUrlToInputFile(url, tmpWorkingDirectory, sizeLimit);
330
+ const fileName = file.originalFilename;
331
+ writeSSE('file:uploading', {
332
+ name: fileName,
333
+ index: i,
334
+ total,
335
+ size: file.size
336
+ });
337
+ // Validate using security checks
338
+ const fileInfo = {
339
+ name: fileName,
340
+ caption: null,
341
+ alternativeText: null,
342
+ folder: folderId ?? null
343
+ };
344
+ const { validFiles, errors: validationErrors } = await mimeValidation.prepareUploadRequest(file, {
345
+ fileInfo: JSON.stringify(fileInfo)
346
+ }, strapi);
347
+ if (validFiles.length === 0) {
348
+ const errorMessage = validationErrors[0]?.message || 'Validation failed';
349
+ uploadErrors.push({
350
+ name: fileName,
351
+ message: errorMessage
352
+ });
353
+ writeSSE('file:error', {
354
+ name: fileName,
355
+ url,
356
+ index: i,
357
+ message: errorMessage
358
+ });
359
+ } else {
360
+ // Upload the file
361
+ const data = await upload.validateUploadBody({
362
+ fileInfo
363
+ }, false);
364
+ const [uploadedFile] = await uploadService.upload({
365
+ data,
366
+ files: [
367
+ validFiles[0]
368
+ ]
369
+ }, {
370
+ user
371
+ });
372
+ // Sign file url
373
+ const signedFile = await fileService.signFileUrls(uploadedFile);
374
+ successfulFiles.push(signedFile);
375
+ writeSSE('file:complete', {
376
+ name: fileName,
377
+ index: i,
378
+ file: signedFile
379
+ });
380
+ }
381
+ } catch (error) {
382
+ const errorMessage = error instanceof Error ? error.message : String(error);
383
+ uploadErrors.push({
384
+ name: url,
385
+ message: errorMessage
386
+ });
387
+ writeSSE('file:error', {
388
+ url,
389
+ index: i,
390
+ message: errorMessage
391
+ });
392
+ }
393
+ }
394
+ // Track image upload metric once if any images were uploaded
395
+ if (successfulFiles.some((file)=>file.mime?.startsWith('image/'))) {
396
+ await index.getService('metrics').trackUsage('didUploadImage');
397
+ }
398
+ // Send final stream summary
399
+ writeSSE('stream:complete', {
400
+ data: await pm.sanitizeOutput(successfulFiles, {
401
+ action: constants.ACTIONS.read
402
+ }),
403
+ errors: uploadErrors
404
+ });
405
+ } finally{
406
+ // Clean up temp directory
407
+ await fse.remove(tmpWorkingDirectory);
408
+ }
409
+ res.end();
410
+ },
267
411
  // TODO: split into multiple endpoints
268
412
  async upload (ctx) {
269
413
  const { query: { id }, request: { files: { files } = {} } } = ctx;