@strapi/upload 5.55.1 → 5.57.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/hooks/useAIMetadataAvailability.js +14 -0
- package/dist/admin/hooks/useAIMetadataAvailability.js.map +1 -0
- package/dist/admin/hooks/useAIMetadataAvailability.mjs +12 -0
- package/dist/admin/hooks/useAIMetadataAvailability.mjs.map +1 -0
- package/dist/admin/hooks/useAIMetadataEnabled.js +7 -5
- package/dist/admin/hooks/useAIMetadataEnabled.js.map +1 -1
- package/dist/admin/hooks/useAIMetadataEnabled.mjs +7 -5
- package/dist/admin/hooks/useAIMetadataEnabled.mjs.map +1 -1
- package/dist/admin/hooks/useTracking.js +4 -10
- package/dist/admin/hooks/useTracking.js.map +1 -1
- package/dist/admin/hooks/useTracking.mjs +5 -10
- package/dist/admin/hooks/useTracking.mjs.map +1 -1
- package/dist/admin/legacy/hooks/useAIMetadataAvailability.js +14 -0
- package/dist/admin/legacy/hooks/useAIMetadataAvailability.js.map +1 -0
- package/dist/admin/legacy/hooks/useAIMetadataAvailability.mjs +12 -0
- package/dist/admin/legacy/hooks/useAIMetadataAvailability.mjs.map +1 -0
- package/dist/admin/legacy/hooks/useAIMetadataEnabled.js +23 -0
- package/dist/admin/legacy/hooks/useAIMetadataEnabled.js.map +1 -0
- package/dist/admin/legacy/hooks/useAIMetadataEnabled.mjs +21 -0
- package/dist/admin/legacy/hooks/useAIMetadataEnabled.mjs.map +1 -0
- package/dist/admin/legacy/hooks/useTracking.js +5 -3
- package/dist/admin/legacy/hooks/useTracking.js.map +1 -1
- package/dist/admin/legacy/hooks/useTracking.mjs +5 -3
- package/dist/admin/legacy/hooks/useTracking.mjs.map +1 -1
- package/dist/admin/legacy/pages/App/ConfigureTheView/ConfigureTheView.js +2 -1
- package/dist/admin/legacy/pages/App/ConfigureTheView/ConfigureTheView.js.map +1 -1
- package/dist/admin/legacy/pages/App/ConfigureTheView/ConfigureTheView.mjs +2 -1
- package/dist/admin/legacy/pages/App/ConfigureTheView/ConfigureTheView.mjs.map +1 -1
- package/dist/admin/legacy/pages/App/MediaLibrary.js +6 -5
- package/dist/admin/legacy/pages/App/MediaLibrary.js.map +1 -1
- package/dist/admin/legacy/pages/App/MediaLibrary.mjs +6 -5
- package/dist/admin/legacy/pages/App/MediaLibrary.mjs.map +1 -1
- package/dist/admin/pages/Assets/AssetsPage.js +24 -12
- package/dist/admin/pages/Assets/AssetsPage.js.map +1 -1
- package/dist/admin/pages/Assets/AssetsPage.mjs +25 -13
- package/dist/admin/pages/Assets/AssetsPage.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/AssetActions.js +326 -0
- package/dist/admin/pages/Assets/components/AssetActions.js.map +1 -0
- package/dist/admin/pages/Assets/components/AssetActions.mjs +324 -0
- package/dist/admin/pages/Assets/components/AssetActions.mjs.map +1 -0
- package/dist/admin/pages/Assets/components/AssetActionsMenu.js +28 -309
- package/dist/admin/pages/Assets/components/AssetActionsMenu.js.map +1 -1
- package/dist/admin/pages/Assets/components/AssetActionsMenu.mjs +31 -312
- package/dist/admin/pages/Assets/components/AssetActionsMenu.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/AssetContextMenu.js +79 -0
- package/dist/admin/pages/Assets/components/AssetContextMenu.js.map +1 -0
- package/dist/admin/pages/Assets/components/AssetContextMenu.mjs +77 -0
- package/dist/admin/pages/Assets/components/AssetContextMenu.mjs.map +1 -0
- package/dist/admin/pages/Assets/components/AssetDetails/AssetCropEditor.js +87 -5
- package/dist/admin/pages/Assets/components/AssetDetails/AssetCropEditor.js.map +1 -1
- package/dist/admin/pages/Assets/components/AssetDetails/AssetCropEditor.mjs +89 -7
- package/dist/admin/pages/Assets/components/AssetDetails/AssetCropEditor.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js +3 -3
- package/dist/admin/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js.map +1 -1
- package/dist/admin/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs +3 -3
- package/dist/admin/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/AssetDetails/useCropImg.js +62 -5
- package/dist/admin/pages/Assets/components/AssetDetails/useCropImg.js.map +1 -1
- package/dist/admin/pages/Assets/components/AssetDetails/useCropImg.mjs +60 -6
- package/dist/admin/pages/Assets/components/AssetDetails/useCropImg.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/AssetsGrid.js +27 -4
- package/dist/admin/pages/Assets/components/AssetsGrid.js.map +1 -1
- package/dist/admin/pages/Assets/components/AssetsGrid.mjs +27 -4
- package/dist/admin/pages/Assets/components/AssetsGrid.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/AssetsTable.js +27 -4
- package/dist/admin/pages/Assets/components/AssetsTable.js.map +1 -1
- package/dist/admin/pages/Assets/components/AssetsTable.mjs +27 -4
- package/dist/admin/pages/Assets/components/AssetsTable.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/CursorAnchoredMenu.js +77 -0
- package/dist/admin/pages/Assets/components/CursorAnchoredMenu.js.map +1 -0
- package/dist/admin/pages/Assets/components/CursorAnchoredMenu.mjs +75 -0
- package/dist/admin/pages/Assets/components/CursorAnchoredMenu.mjs.map +1 -0
- package/dist/admin/pages/Assets/components/DeleteItemsDialog.js +4 -2
- package/dist/admin/pages/Assets/components/DeleteItemsDialog.js.map +1 -1
- package/dist/admin/pages/Assets/components/DeleteItemsDialog.mjs +4 -2
- package/dist/admin/pages/Assets/components/DeleteItemsDialog.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/FolderActions.js +139 -0
- package/dist/admin/pages/Assets/components/FolderActions.js.map +1 -0
- package/dist/admin/pages/Assets/components/FolderActions.mjs +137 -0
- package/dist/admin/pages/Assets/components/FolderActions.mjs.map +1 -0
- package/dist/admin/pages/Assets/components/FolderActionsMenu.js +25 -119
- package/dist/admin/pages/Assets/components/FolderActionsMenu.js.map +1 -1
- package/dist/admin/pages/Assets/components/FolderActionsMenu.mjs +27 -121
- package/dist/admin/pages/Assets/components/FolderActionsMenu.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/FolderContextMenu.js +67 -0
- package/dist/admin/pages/Assets/components/FolderContextMenu.js.map +1 -0
- package/dist/admin/pages/Assets/components/FolderContextMenu.mjs +65 -0
- package/dist/admin/pages/Assets/components/FolderContextMenu.mjs.map +1 -0
- package/dist/admin/pages/Assets/components/FolderTree/FolderTree.js +139 -45
- package/dist/admin/pages/Assets/components/FolderTree/FolderTree.js.map +1 -1
- package/dist/admin/pages/Assets/components/FolderTree/FolderTree.mjs +140 -47
- package/dist/admin/pages/Assets/components/FolderTree/FolderTree.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/FolderTree/FolderTreeRowMenu.js +115 -0
- package/dist/admin/pages/Assets/components/FolderTree/FolderTreeRowMenu.js.map +1 -0
- package/dist/admin/pages/Assets/components/FolderTree/FolderTreeRowMenu.mjs +113 -0
- package/dist/admin/pages/Assets/components/FolderTree/FolderTreeRowMenu.mjs.map +1 -0
- package/dist/admin/pages/Assets/components/ItemContextMenu.js +125 -0
- package/dist/admin/pages/Assets/components/ItemContextMenu.js.map +1 -0
- package/dist/admin/pages/Assets/components/ItemContextMenu.mjs +122 -0
- package/dist/admin/pages/Assets/components/ItemContextMenu.mjs.map +1 -0
- package/dist/admin/pages/Assets/components/MainAreaContextMenu.js +88 -63
- package/dist/admin/pages/Assets/components/MainAreaContextMenu.js.map +1 -1
- package/dist/admin/pages/Assets/components/MainAreaContextMenu.mjs +88 -63
- package/dist/admin/pages/Assets/components/MainAreaContextMenu.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/SelectionActions.js +111 -0
- package/dist/admin/pages/Assets/components/SelectionActions.js.map +1 -0
- package/dist/admin/pages/Assets/components/SelectionActions.mjs +109 -0
- package/dist/admin/pages/Assets/components/SelectionActions.mjs.map +1 -0
- package/dist/admin/pages/Assets/components/SelectionContextMenu.js +82 -0
- package/dist/admin/pages/Assets/components/SelectionContextMenu.js.map +1 -0
- package/dist/admin/pages/Assets/components/SelectionContextMenu.mjs +80 -0
- package/dist/admin/pages/Assets/components/SelectionContextMenu.mjs.map +1 -0
- package/dist/admin/pages/Assets/hooks/useAssetSelection.js +10 -0
- package/dist/admin/pages/Assets/hooks/useAssetSelection.js.map +1 -1
- package/dist/admin/pages/Assets/hooks/useAssetSelection.mjs +10 -0
- package/dist/admin/pages/Assets/hooks/useAssetSelection.mjs.map +1 -1
- package/dist/admin/pages/SettingsPage/SettingsPage.js +10 -3
- package/dist/admin/pages/SettingsPage/SettingsPage.js.map +1 -1
- package/dist/admin/pages/SettingsPage/SettingsPage.mjs +10 -3
- package/dist/admin/pages/SettingsPage/SettingsPage.mjs.map +1 -1
- package/dist/admin/services/api.js.map +1 -1
- package/dist/admin/services/api.mjs.map +1 -1
- package/dist/admin/src/hooks/useAIMetadataAvailability.d.ts +5 -0
- package/dist/admin/src/hooks/useAIMetadataEnabled.d.ts +5 -3
- package/dist/admin/src/hooks/useTracking.d.ts +0 -7
- package/dist/admin/src/legacy/components/EditAssetDialog/PreviewBox/PreviewComponents.d.ts +2 -2
- package/dist/admin/src/legacy/hooks/useAIMetadataAvailability.d.ts +5 -0
- package/dist/admin/src/legacy/hooks/useAIMetadataEnabled.d.ts +12 -0
- package/dist/admin/src/legacy/hooks/useSettings.d.ts +1 -0
- package/dist/admin/src/pages/Assets/components/ActionsMenuContent.d.ts +2 -2
- package/dist/admin/src/pages/Assets/components/AssetActions.d.ts +70 -0
- package/dist/admin/src/pages/Assets/components/AssetActionsMenu.d.ts +5 -14
- package/dist/admin/src/pages/Assets/components/AssetContextMenu.d.ts +27 -0
- package/dist/admin/src/pages/Assets/components/AssetDetails/useCropImg.d.ts +16 -0
- package/dist/admin/src/pages/Assets/components/CursorAnchoredMenu.d.ts +32 -0
- package/dist/admin/src/pages/Assets/components/FolderActions.d.ts +48 -0
- package/dist/admin/src/pages/Assets/components/FolderActionsMenu.d.ts +4 -8
- package/dist/admin/src/pages/Assets/components/FolderContextMenu.d.ts +21 -0
- package/dist/admin/src/pages/Assets/components/FolderTree/FolderTree.d.ts +5 -1
- package/dist/admin/src/pages/Assets/components/FolderTree/FolderTreeRowMenu.d.ts +25 -0
- package/dist/admin/src/pages/Assets/components/ItemContextMenu.d.ts +53 -0
- package/dist/admin/src/pages/Assets/components/MainAreaContextMenu.d.ts +15 -1
- package/dist/admin/src/pages/Assets/components/SelectionActions.d.ts +40 -0
- package/dist/admin/src/pages/Assets/components/SelectionContextMenu.d.ts +25 -0
- package/dist/admin/src/pages/Assets/hooks/useAssetSelection.d.ts +5 -0
- package/dist/admin/src/utils/mediaLibraryVersion.d.ts +18 -0
- package/dist/admin/translations/en.json.js +9 -3
- package/dist/admin/translations/en.json.js.map +1 -1
- package/dist/admin/translations/en.json.mjs +9 -3
- package/dist/admin/translations/en.json.mjs.map +1 -1
- package/dist/admin/utils/mediaLibraryVersion.js +24 -0
- package/dist/admin/utils/mediaLibraryVersion.js.map +1 -0
- package/dist/admin/utils/mediaLibraryVersion.mjs +20 -0
- package/dist/admin/utils/mediaLibraryVersion.mjs.map +1 -0
- package/dist/server/bootstrap.js +7 -0
- package/dist/server/bootstrap.js.map +1 -1
- package/dist/server/bootstrap.mjs +7 -0
- package/dist/server/bootstrap.mjs.map +1 -1
- package/dist/server/controllers/admin-file.js +2 -2
- package/dist/server/controllers/admin-file.js.map +1 -1
- package/dist/server/controllers/admin-file.mjs +2 -2
- package/dist/server/controllers/admin-file.mjs.map +1 -1
- package/dist/server/controllers/admin-folder-file.js +51 -4
- package/dist/server/controllers/admin-folder-file.js.map +1 -1
- package/dist/server/controllers/admin-folder-file.mjs +52 -5
- package/dist/server/controllers/admin-folder-file.mjs.map +1 -1
- package/dist/server/controllers/admin-folder.js +5 -5
- package/dist/server/controllers/admin-folder.js.map +1 -1
- package/dist/server/controllers/admin-folder.mjs +5 -5
- package/dist/server/controllers/admin-folder.mjs.map +1 -1
- package/dist/server/controllers/admin-settings.js +2 -1
- package/dist/server/controllers/admin-settings.js.map +1 -1
- package/dist/server/controllers/admin-settings.mjs +2 -1
- package/dist/server/controllers/admin-settings.mjs.map +1 -1
- package/dist/server/controllers/content-api.js +30 -7
- package/dist/server/controllers/content-api.js.map +1 -1
- package/dist/server/controllers/content-api.mjs +30 -7
- package/dist/server/controllers/content-api.mjs.map +1 -1
- package/dist/server/controllers/validation/admin/folder-file.js +4 -4
- package/dist/server/controllers/validation/admin/folder-file.js.map +1 -1
- package/dist/server/controllers/validation/admin/folder-file.mjs +2 -2
- package/dist/server/controllers/validation/admin/folder-file.mjs.map +1 -1
- package/dist/server/controllers/validation/admin/folder.js +3 -4
- package/dist/server/controllers/validation/admin/folder.js.map +1 -1
- package/dist/server/controllers/validation/admin/folder.mjs +3 -4
- package/dist/server/controllers/validation/admin/folder.mjs.map +1 -1
- package/dist/server/controllers/validation/admin/upload.js +1 -2
- package/dist/server/controllers/validation/admin/upload.js.map +1 -1
- package/dist/server/controllers/validation/admin/upload.mjs +1 -2
- package/dist/server/controllers/validation/admin/upload.mjs.map +1 -1
- package/dist/server/controllers/validation/admin/utils.js +1 -2
- package/dist/server/controllers/validation/admin/utils.js.map +1 -1
- package/dist/server/controllers/validation/admin/utils.mjs +1 -2
- package/dist/server/controllers/validation/admin/utils.mjs.map +1 -1
- package/dist/server/errors.js +12 -0
- package/dist/server/errors.js.map +1 -0
- package/dist/server/errors.mjs +10 -0
- package/dist/server/errors.mjs.map +1 -0
- package/dist/server/migrations/unsign-richtext-and-blocks-urls.js +2 -2
- package/dist/server/migrations/unsign-richtext-and-blocks-urls.js.map +1 -1
- package/dist/server/migrations/unsign-richtext-and-blocks-urls.mjs +1 -1
- package/dist/server/migrations/unsign-richtext-and-blocks-urls.mjs.map +1 -1
- package/dist/server/routes/content-api.js +3 -3
- package/dist/server/routes/content-api.js.map +1 -1
- package/dist/server/routes/content-api.mjs +3 -3
- package/dist/server/routes/content-api.mjs.map +1 -1
- package/dist/server/routes/validation/upload.js +8 -0
- package/dist/server/routes/validation/upload.js.map +1 -1
- package/dist/server/routes/validation/upload.mjs +8 -0
- package/dist/server/routes/validation/upload.mjs.map +1 -1
- package/dist/server/services/ai-metadata-provider.js +83 -0
- package/dist/server/services/ai-metadata-provider.js.map +1 -0
- package/dist/server/services/ai-metadata-provider.mjs +61 -0
- package/dist/server/services/ai-metadata-provider.mjs.map +1 -0
- package/dist/server/services/ai-metadata-strapi-managed.js +48 -0
- package/dist/server/services/ai-metadata-strapi-managed.js.map +1 -0
- package/dist/server/services/ai-metadata-strapi-managed.mjs +46 -0
- package/dist/server/services/ai-metadata-strapi-managed.mjs.map +1 -0
- package/dist/server/services/ai-metadata.js +5 -58
- package/dist/server/services/ai-metadata.js.map +1 -1
- package/dist/server/services/ai-metadata.mjs +6 -39
- package/dist/server/services/ai-metadata.mjs.map +1 -1
- package/dist/server/services/api-upload-folder.js +3 -3
- package/dist/server/services/api-upload-folder.js.map +1 -1
- package/dist/server/services/api-upload-folder.mjs +3 -3
- package/dist/server/services/api-upload-folder.mjs.map +1 -1
- package/dist/server/services/extensions/utils.js +19 -15
- package/dist/server/services/extensions/utils.js.map +1 -1
- package/dist/server/services/extensions/utils.mjs +19 -15
- package/dist/server/services/extensions/utils.mjs.map +1 -1
- package/dist/server/services/file.js +2 -2
- package/dist/server/services/file.js.map +1 -1
- package/dist/server/services/file.mjs +1 -1
- package/dist/server/services/file.mjs.map +1 -1
- package/dist/server/services/folder.js +9 -6
- package/dist/server/services/folder.js.map +1 -1
- package/dist/server/services/folder.mjs +9 -6
- package/dist/server/services/folder.mjs.map +1 -1
- package/dist/server/services/index.js +3 -1
- package/dist/server/services/index.js.map +1 -1
- package/dist/server/services/index.mjs +3 -1
- package/dist/server/services/index.mjs.map +1 -1
- package/dist/server/services/metrics.js +1 -1
- package/dist/server/services/metrics.js.map +1 -1
- package/dist/server/services/metrics.mjs +1 -1
- package/dist/server/services/metrics.mjs.map +1 -1
- package/dist/server/services/provider.js +3 -4
- package/dist/server/services/provider.js.map +1 -1
- package/dist/server/services/provider.mjs +3 -4
- package/dist/server/services/provider.mjs.map +1 -1
- package/dist/server/services/upload.js +5 -6
- package/dist/server/services/upload.js.map +1 -1
- package/dist/server/services/upload.mjs +4 -5
- package/dist/server/services/upload.mjs.map +1 -1
- package/dist/server/services/weekly-metrics.js +2 -2
- package/dist/server/services/weekly-metrics.js.map +1 -1
- package/dist/server/services/weekly-metrics.mjs +2 -2
- package/dist/server/services/weekly-metrics.mjs.map +1 -1
- package/dist/server/src/bootstrap.d.ts.map +1 -1
- package/dist/server/src/controllers/admin-folder-file.d.ts.map +1 -1
- package/dist/server/src/controllers/admin-folder.d.ts.map +1 -1
- package/dist/server/src/controllers/admin-settings.d.ts.map +1 -1
- package/dist/server/src/controllers/content-api.d.ts.map +1 -1
- package/dist/server/src/controllers/validation/admin/folder.d.ts.map +1 -1
- package/dist/server/src/controllers/validation/admin/upload.d.ts.map +1 -1
- package/dist/server/src/controllers/validation/admin/utils.d.ts.map +1 -1
- package/dist/server/src/errors.d.ts +6 -0
- package/dist/server/src/errors.d.ts.map +1 -0
- package/dist/server/src/index.d.ts +6 -1
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/mcp/ambient-instance.d.ts +3 -1
- package/dist/server/src/mcp/ambient-instance.d.ts.map +1 -1
- package/dist/server/src/routes/validation/upload.d.ts +4 -0
- package/dist/server/src/routes/validation/upload.d.ts.map +1 -1
- package/dist/server/src/services/ai-metadata-provider.d.ts +26 -0
- package/dist/server/src/services/ai-metadata-provider.d.ts.map +1 -0
- package/dist/server/src/services/ai-metadata-strapi-managed.d.ts +7 -0
- package/dist/server/src/services/ai-metadata-strapi-managed.d.ts.map +1 -0
- package/dist/server/src/services/ai-metadata.d.ts.map +1 -1
- package/dist/server/src/services/extensions/utils.d.ts +33 -1
- package/dist/server/src/services/extensions/utils.d.ts.map +1 -1
- package/dist/server/src/services/folder.d.ts +5 -2
- package/dist/server/src/services/folder.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +6 -1
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/services/provider.d.ts.map +1 -1
- package/dist/server/src/services/upload.d.ts.map +1 -1
- package/dist/server/src/utils/images.d.ts +2 -2
- package/dist/server/src/utils/images.d.ts.map +1 -1
- package/dist/server/src/utils/index.d.ts +2 -0
- package/dist/server/src/utils/index.d.ts.map +1 -1
- package/dist/server/utils/images.js +6 -7
- package/dist/server/utils/images.js.map +1 -1
- package/dist/server/utils/images.mjs +6 -7
- package/dist/server/utils/images.mjs.map +1 -1
- package/dist/server/utils/index.js.map +1 -1
- package/dist/server/utils/index.mjs.map +1 -1
- package/dist/shared/contracts/settings.d.ts +6 -0
- package/package.json +11 -11
- package/dist/admin/legacy/hooks/useAiAvailability.js +0 -22
- package/dist/admin/legacy/hooks/useAiAvailability.js.map +0 -1
- package/dist/admin/legacy/hooks/useAiAvailability.mjs +0 -20
- package/dist/admin/legacy/hooks/useAiAvailability.mjs.map +0 -1
- package/dist/admin/src/legacy/hooks/useAiAvailability.d.ts +0 -4
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _ = require('lodash');
|
|
4
4
|
var index = require('../utils/index.js');
|
|
5
5
|
var constants = require('../constants.js');
|
|
6
6
|
var folder = require('./validation/admin/folder.js');
|
|
@@ -14,7 +14,7 @@ var adminFolder = {
|
|
|
14
14
|
});
|
|
15
15
|
await permissionsManager.validateQuery(ctx.query);
|
|
16
16
|
const query = await permissionsManager.sanitizeQuery(ctx.query);
|
|
17
|
-
const { results } = await strapi.db.query(constants.FOLDER_MODEL_UID).findPage(strapi.get('query-params').transform(constants.FOLDER_MODEL_UID,
|
|
17
|
+
const { results } = await strapi.db.query(constants.FOLDER_MODEL_UID).findPage(strapi.get('query-params').transform(constants.FOLDER_MODEL_UID, _.defaultsDeep({}, query, {
|
|
18
18
|
filters: {
|
|
19
19
|
id
|
|
20
20
|
},
|
|
@@ -26,7 +26,7 @@ var adminFolder = {
|
|
|
26
26
|
count: true
|
|
27
27
|
}
|
|
28
28
|
}
|
|
29
|
-
}
|
|
29
|
+
})));
|
|
30
30
|
if (results.length === 0) {
|
|
31
31
|
return ctx.notFound('folder not found');
|
|
32
32
|
}
|
|
@@ -41,7 +41,7 @@ var adminFolder = {
|
|
|
41
41
|
});
|
|
42
42
|
await permissionsManager.validateQuery(ctx.query);
|
|
43
43
|
const query = await permissionsManager.sanitizeQuery(ctx.query);
|
|
44
|
-
const results = await strapi.db.query(constants.FOLDER_MODEL_UID).findMany(strapi.get('query-params').transform(constants.FOLDER_MODEL_UID,
|
|
44
|
+
const results = await strapi.db.query(constants.FOLDER_MODEL_UID).findMany(strapi.get('query-params').transform(constants.FOLDER_MODEL_UID, _.defaultsDeep({}, query, {
|
|
45
45
|
populate: {
|
|
46
46
|
children: {
|
|
47
47
|
count: true
|
|
@@ -50,7 +50,7 @@ var adminFolder = {
|
|
|
50
50
|
count: true
|
|
51
51
|
}
|
|
52
52
|
}
|
|
53
|
-
}
|
|
53
|
+
})));
|
|
54
54
|
ctx.body = {
|
|
55
55
|
data: await permissionsManager.sanitizeOutput(results)
|
|
56
56
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin-folder.js","sources":["../../../server/src/controllers/admin-folder.ts"],"sourcesContent":["import { defaultsDeep } from 'lodash
|
|
1
|
+
{"version":3,"file":"admin-folder.js","sources":["../../../server/src/controllers/admin-folder.ts"],"sourcesContent":["import { defaultsDeep } from 'lodash';\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({}, query, {\n filters: { id },\n populate: {\n children: {\n count: true,\n },\n files: {\n count: true,\n },\n },\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({}, query, {\n populate: {\n children: {\n count: true,\n },\n files: {\n count: true,\n },\n },\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,4 +1,4 @@
|
|
|
1
|
-
import { defaultsDeep } from 'lodash
|
|
1
|
+
import { defaultsDeep } from 'lodash';
|
|
2
2
|
import { getService } from '../utils/index.mjs';
|
|
3
3
|
import { FOLDER_MODEL_UID } from '../constants.mjs';
|
|
4
4
|
import { validateUpdateFolder, validateCreateFolder } from './validation/admin/folder.mjs';
|
|
@@ -12,7 +12,7 @@ var adminFolder = {
|
|
|
12
12
|
});
|
|
13
13
|
await permissionsManager.validateQuery(ctx.query);
|
|
14
14
|
const query = await permissionsManager.sanitizeQuery(ctx.query);
|
|
15
|
-
const { results } = await strapi.db.query(FOLDER_MODEL_UID).findPage(strapi.get('query-params').transform(FOLDER_MODEL_UID, defaultsDeep({
|
|
15
|
+
const { results } = await strapi.db.query(FOLDER_MODEL_UID).findPage(strapi.get('query-params').transform(FOLDER_MODEL_UID, defaultsDeep({}, query, {
|
|
16
16
|
filters: {
|
|
17
17
|
id
|
|
18
18
|
},
|
|
@@ -24,7 +24,7 @@ var adminFolder = {
|
|
|
24
24
|
count: true
|
|
25
25
|
}
|
|
26
26
|
}
|
|
27
|
-
}
|
|
27
|
+
})));
|
|
28
28
|
if (results.length === 0) {
|
|
29
29
|
return ctx.notFound('folder not found');
|
|
30
30
|
}
|
|
@@ -39,7 +39,7 @@ var adminFolder = {
|
|
|
39
39
|
});
|
|
40
40
|
await permissionsManager.validateQuery(ctx.query);
|
|
41
41
|
const query = await permissionsManager.sanitizeQuery(ctx.query);
|
|
42
|
-
const results = await strapi.db.query(FOLDER_MODEL_UID).findMany(strapi.get('query-params').transform(FOLDER_MODEL_UID, defaultsDeep({
|
|
42
|
+
const results = await strapi.db.query(FOLDER_MODEL_UID).findMany(strapi.get('query-params').transform(FOLDER_MODEL_UID, defaultsDeep({}, query, {
|
|
43
43
|
populate: {
|
|
44
44
|
children: {
|
|
45
45
|
count: true
|
|
@@ -48,7 +48,7 @@ var adminFolder = {
|
|
|
48
48
|
count: true
|
|
49
49
|
}
|
|
50
50
|
}
|
|
51
|
-
}
|
|
51
|
+
})));
|
|
52
52
|
ctx.body = {
|
|
53
53
|
data: await permissionsManager.sanitizeOutput(results)
|
|
54
54
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin-folder.mjs","sources":["../../../server/src/controllers/admin-folder.ts"],"sourcesContent":["import { defaultsDeep } from 'lodash
|
|
1
|
+
{"version":3,"file":"admin-folder.mjs","sources":["../../../server/src/controllers/admin-folder.ts"],"sourcesContent":["import { defaultsDeep } from 'lodash';\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({}, query, {\n filters: { id },\n populate: {\n children: {\n count: true,\n },\n files: {\n count: true,\n },\n },\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({}, query, {\n populate: {\n children: {\n count: true,\n },\n files: {\n count: true,\n },\n },\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';\n\nimport type { Config } from '../types';\nimport validateSettings, { settingsSchema } from './validation/admin/settings';\n\n// The stored settings' known keys. `GET /upload/settings` echoes read-only\n// config (e.g. `concurrentUploadRequests`) alongside them, and the legacy\n// Settings page PUTs the whole payload back — narrowing to these keys keeps\n// those echoes out of the store. Derived from the schema so it can't drift.\nconst SETTINGS_KEYS = Object.keys(settingsSchema.fields);\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 validated = await validateSettings(body);\n const source = validated as Record<string, unknown>;\n const data = Object.fromEntries(\n SETTINGS_KEYS.filter((key) => key in source).map((key) => [key, source[key]])\n ) as typeof validated;\n\n await getService('upload').setSettings(data);\n\n ctx.body = { data };\n },\n\n async getSettings(ctx: Context) {\n // Gated on `plugin::upload.read` by the route policy.\n const data = await getService('upload').getSettings();\n\n // Read-only echo of the app config so the admin knows how many upload\n // requests it may fire in parallel. Distinct from `concurrentUploadSize`,\n // which is the server-side per-request processing ceiling. Deployments that\n // need to bound this override the config.\n const { concurrentUploadRequests = 1 } = strapi.config.get<Config>('plugin::upload');\n\n ctx.body = {
|
|
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';\n\nimport type { Config } from '../types';\nimport validateSettings, { settingsSchema } from './validation/admin/settings';\n\n// The stored settings' known keys. `GET /upload/settings` echoes read-only\n// config (e.g. `concurrentUploadRequests`) alongside them, and the legacy\n// Settings page PUTs the whole payload back — narrowing to these keys keeps\n// those echoes out of the store. Derived from the schema so it can't drift.\nconst SETTINGS_KEYS = Object.keys(settingsSchema.fields);\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 validated = await validateSettings(body);\n const source = validated as Record<string, unknown>;\n const data = Object.fromEntries(\n SETTINGS_KEYS.filter((key) => key in source).map((key) => [key, source[key]])\n ) as typeof validated;\n\n await getService('upload').setSettings(data);\n\n ctx.body = { data };\n },\n\n async getSettings(ctx: Context) {\n // Gated on `plugin::upload.read` by the route policy.\n const data = await getService('upload').getSettings();\n\n // Read-only echo of the app config so the admin knows how many upload\n // requests it may fire in parallel. Distinct from `concurrentUploadSize`,\n // which is the server-side per-request processing ceiling. Deployments that\n // need to bound this override the config.\n const { concurrentUploadRequests = 1 } = strapi.config.get<Config>('plugin::upload');\n\n ctx.body = {\n data: {\n ...data,\n concurrentUploadRequests,\n aiMetadataAvailable: getService('aiMetadataProvider').hasProvider(),\n },\n };\n },\n};\n"],"names":["SETTINGS_KEYS","Object","keys","settingsSchema","fields","updateSettings","ctx","request","body","state","userAbility","cannot","ACTIONS","readSettings","FILE_MODEL_UID","forbidden","validated","validateSettings","source","data","fromEntries","filter","key","map","getService","setSettings","getSettings","concurrentUploadRequests","strapi","config","get","aiMetadataAvailable","hasProvider"],"mappings":";;;;;;AAQA;AACA;AACA;AACA;AACA,MAAMA,aAAAA,GAAgBC,MAAAA,CAAOC,IAAI,CAACC,wBAAeC,MAAM,CAAA;AAEvD,oBAAe;AACb,IAAA,MAAMC,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,SAAAA,GAAY,MAAMC,gBAAAA,CAAiBT,IAAAA,CAAAA;AACzC,QAAA,MAAMU,MAAAA,GAASF,SAAAA;AACf,QAAA,MAAMG,IAAAA,GAAOlB,MAAAA,CAAOmB,WAAW,CAC7BpB,cAAcqB,MAAM,CAAC,CAACC,GAAAA,GAAQA,GAAAA,IAAOJ,MAAAA,CAAAA,CAAQK,GAAG,CAAC,CAACD,GAAAA,GAAQ;AAACA,gBAAAA,GAAAA;AAAKJ,gBAAAA,MAAM,CAACI,GAAAA;AAAK,aAAA,CAAA,CAAA;QAG9E,MAAME,gBAAAA,CAAW,QAAA,CAAA,CAAUC,WAAW,CAACN,IAAAA,CAAAA;AAEvCb,QAAAA,GAAAA,CAAIE,IAAI,GAAG;AAAEW,YAAAA;AAAK,SAAA;AACpB,IAAA,CAAA;AAEA,IAAA,MAAMO,aAAYpB,GAAY,EAAA;;AAE5B,QAAA,MAAMa,IAAAA,GAAO,MAAMK,gBAAAA,CAAW,QAAA,CAAA,CAAUE,WAAW,EAAA;;;;;QAMnD,MAAM,EAAEC,2BAA2B,CAAC,EAAE,GAAGC,MAAAA,CAAOC,MAAM,CAACC,GAAG,CAAS,gBAAA,CAAA;AAEnExB,QAAAA,GAAAA,CAAIE,IAAI,GAAG;YACTW,IAAAA,EAAM;AACJ,gBAAA,GAAGA,IAAI;AACPQ,gBAAAA,wBAAAA;gBACAI,mBAAAA,EAAqBP,gBAAAA,CAAW,sBAAsBQ,WAAW;AACnE;AACF,SAAA;AACF,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';\n\nimport type { Config } from '../types';\nimport validateSettings, { settingsSchema } from './validation/admin/settings';\n\n// The stored settings' known keys. `GET /upload/settings` echoes read-only\n// config (e.g. `concurrentUploadRequests`) alongside them, and the legacy\n// Settings page PUTs the whole payload back — narrowing to these keys keeps\n// those echoes out of the store. Derived from the schema so it can't drift.\nconst SETTINGS_KEYS = Object.keys(settingsSchema.fields);\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 validated = await validateSettings(body);\n const source = validated as Record<string, unknown>;\n const data = Object.fromEntries(\n SETTINGS_KEYS.filter((key) => key in source).map((key) => [key, source[key]])\n ) as typeof validated;\n\n await getService('upload').setSettings(data);\n\n ctx.body = { data };\n },\n\n async getSettings(ctx: Context) {\n // Gated on `plugin::upload.read` by the route policy.\n const data = await getService('upload').getSettings();\n\n // Read-only echo of the app config so the admin knows how many upload\n // requests it may fire in parallel. Distinct from `concurrentUploadSize`,\n // which is the server-side per-request processing ceiling. Deployments that\n // need to bound this override the config.\n const { concurrentUploadRequests = 1 } = strapi.config.get<Config>('plugin::upload');\n\n ctx.body = {
|
|
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';\n\nimport type { Config } from '../types';\nimport validateSettings, { settingsSchema } from './validation/admin/settings';\n\n// The stored settings' known keys. `GET /upload/settings` echoes read-only\n// config (e.g. `concurrentUploadRequests`) alongside them, and the legacy\n// Settings page PUTs the whole payload back — narrowing to these keys keeps\n// those echoes out of the store. Derived from the schema so it can't drift.\nconst SETTINGS_KEYS = Object.keys(settingsSchema.fields);\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 validated = await validateSettings(body);\n const source = validated as Record<string, unknown>;\n const data = Object.fromEntries(\n SETTINGS_KEYS.filter((key) => key in source).map((key) => [key, source[key]])\n ) as typeof validated;\n\n await getService('upload').setSettings(data);\n\n ctx.body = { data };\n },\n\n async getSettings(ctx: Context) {\n // Gated on `plugin::upload.read` by the route policy.\n const data = await getService('upload').getSettings();\n\n // Read-only echo of the app config so the admin knows how many upload\n // requests it may fire in parallel. Distinct from `concurrentUploadSize`,\n // which is the server-side per-request processing ceiling. Deployments that\n // need to bound this override the config.\n const { concurrentUploadRequests = 1 } = strapi.config.get<Config>('plugin::upload');\n\n ctx.body = {\n data: {\n ...data,\n concurrentUploadRequests,\n aiMetadataAvailable: getService('aiMetadataProvider').hasProvider(),\n },\n };\n },\n};\n"],"names":["SETTINGS_KEYS","Object","keys","settingsSchema","fields","updateSettings","ctx","request","body","state","userAbility","cannot","ACTIONS","readSettings","FILE_MODEL_UID","forbidden","validated","validateSettings","source","data","fromEntries","filter","key","map","getService","setSettings","getSettings","concurrentUploadRequests","strapi","config","get","aiMetadataAvailable","hasProvider"],"mappings":";;;;AAQA;AACA;AACA;AACA;AACA,MAAMA,aAAAA,GAAgBC,MAAAA,CAAOC,IAAI,CAACC,eAAeC,MAAM,CAAA;AAEvD,oBAAe;AACb,IAAA,MAAMC,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,SAAAA,GAAY,MAAMC,gBAAAA,CAAiBT,IAAAA,CAAAA;AACzC,QAAA,MAAMU,MAAAA,GAASF,SAAAA;AACf,QAAA,MAAMG,IAAAA,GAAOlB,MAAAA,CAAOmB,WAAW,CAC7BpB,cAAcqB,MAAM,CAAC,CAACC,GAAAA,GAAQA,GAAAA,IAAOJ,MAAAA,CAAAA,CAAQK,GAAG,CAAC,CAACD,GAAAA,GAAQ;AAACA,gBAAAA,GAAAA;AAAKJ,gBAAAA,MAAM,CAACI,GAAAA;AAAK,aAAA,CAAA,CAAA;QAG9E,MAAME,UAAAA,CAAW,QAAA,CAAA,CAAUC,WAAW,CAACN,IAAAA,CAAAA;AAEvCb,QAAAA,GAAAA,CAAIE,IAAI,GAAG;AAAEW,YAAAA;AAAK,SAAA;AACpB,IAAA,CAAA;AAEA,IAAA,MAAMO,aAAYpB,GAAY,EAAA;;AAE5B,QAAA,MAAMa,IAAAA,GAAO,MAAMK,UAAAA,CAAW,QAAA,CAAA,CAAUE,WAAW,EAAA;;;;;QAMnD,MAAM,EAAEC,2BAA2B,CAAC,EAAE,GAAGC,MAAAA,CAAOC,MAAM,CAACC,GAAG,CAAS,gBAAA,CAAA;AAEnExB,QAAAA,GAAAA,CAAIE,IAAI,GAAG;YACTW,IAAAA,EAAM;AACJ,gBAAA,GAAGA,IAAI;AACPQ,gBAAAA,wBAAAA;gBACAI,mBAAAA,EAAqBP,UAAAA,CAAW,sBAAsBQ,WAAW;AACnE;AACF,SAAA;AACF,IAAA;AACF,CAAA;;;;"}
|
|
@@ -11,7 +11,7 @@ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
|
11
11
|
|
|
12
12
|
var ___default = /*#__PURE__*/_interopDefault(_);
|
|
13
13
|
|
|
14
|
-
const { ValidationError } = utils.errors;
|
|
14
|
+
const { ValidationError, NotFoundError } = utils.errors;
|
|
15
15
|
var contentApi = (({ strapi })=>{
|
|
16
16
|
const sanitizeOutput = async (data, ctx)=>{
|
|
17
17
|
const schema = strapi.getModel(constants.FILE_MODEL_UID);
|
|
@@ -36,6 +36,21 @@ var contentApi = (({ strapi })=>{
|
|
|
36
36
|
route
|
|
37
37
|
});
|
|
38
38
|
};
|
|
39
|
+
// Files can be addressed by numeric id or documentId (1:1, files have no draft & publish)
|
|
40
|
+
const resolveFileId = async (id)=>{
|
|
41
|
+
if (/^\d+$/.test(String(id))) {
|
|
42
|
+
return id;
|
|
43
|
+
}
|
|
44
|
+
const file = await strapi.db.query(constants.FILE_MODEL_UID).findOne({
|
|
45
|
+
where: {
|
|
46
|
+
documentId: id
|
|
47
|
+
},
|
|
48
|
+
select: [
|
|
49
|
+
'id'
|
|
50
|
+
]
|
|
51
|
+
});
|
|
52
|
+
return file?.id;
|
|
53
|
+
};
|
|
39
54
|
return {
|
|
40
55
|
async find (ctx) {
|
|
41
56
|
await validateQuery(ctx.query, ctx);
|
|
@@ -57,10 +72,10 @@ var contentApi = (({ strapi })=>{
|
|
|
57
72
|
};
|
|
58
73
|
},
|
|
59
74
|
async findOne (ctx) {
|
|
60
|
-
const { params: { id } } = ctx;
|
|
61
75
|
await validateQuery(ctx.query, ctx);
|
|
62
76
|
const sanitizedQuery = await sanitizeQuery(ctx.query, ctx);
|
|
63
|
-
const
|
|
77
|
+
const id = await resolveFileId(ctx.params.id);
|
|
78
|
+
const file = id ? await index.getService('upload').findOne(id, sanitizedQuery.populate) : null;
|
|
64
79
|
if (!file) {
|
|
65
80
|
return ctx.notFound('file.notFound');
|
|
66
81
|
}
|
|
@@ -68,8 +83,8 @@ var contentApi = (({ strapi })=>{
|
|
|
68
83
|
ctx.body = await sanitizeOutput(signedFile, ctx);
|
|
69
84
|
},
|
|
70
85
|
async destroy (ctx) {
|
|
71
|
-
const
|
|
72
|
-
const file = await index.getService('upload').findOne(id);
|
|
86
|
+
const id = await resolveFileId(ctx.params.id);
|
|
87
|
+
const file = id ? await index.getService('upload').findOne(id) : null;
|
|
73
88
|
if (!file) {
|
|
74
89
|
return ctx.notFound('file.notFound');
|
|
75
90
|
}
|
|
@@ -83,7 +98,11 @@ var contentApi = (({ strapi })=>{
|
|
|
83
98
|
if (!id || typeof id !== 'string' && typeof id !== 'number') {
|
|
84
99
|
throw new ValidationError('File id is required and must be a single value');
|
|
85
100
|
}
|
|
86
|
-
const
|
|
101
|
+
const fileId = await resolveFileId(id);
|
|
102
|
+
if (!fileId) {
|
|
103
|
+
throw new NotFoundError();
|
|
104
|
+
}
|
|
105
|
+
const result = await index.getService('upload').updateFileInfo(fileId, data.fileInfo);
|
|
87
106
|
const signedResult = await index.getService('file').signFileUrls(result);
|
|
88
107
|
ctx.body = await sanitizeOutput(signedResult, ctx);
|
|
89
108
|
},
|
|
@@ -101,8 +120,12 @@ var contentApi = (({ strapi })=>{
|
|
|
101
120
|
if (!id || typeof id !== 'string' && typeof id !== 'number') {
|
|
102
121
|
throw new ValidationError('File id is required and must be a single value');
|
|
103
122
|
}
|
|
123
|
+
const fileId = await resolveFileId(id);
|
|
124
|
+
if (!fileId) {
|
|
125
|
+
throw new NotFoundError();
|
|
126
|
+
}
|
|
104
127
|
const data = await upload.validateUploadBody(filteredBody);
|
|
105
|
-
const replacedFiles = await index.getService('upload').replace(
|
|
128
|
+
const replacedFiles = await index.getService('upload').replace(fileId, {
|
|
106
129
|
data,
|
|
107
130
|
file: validFiles[0]
|
|
108
131
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content-api.js","sources":["../../../server/src/controllers/content-api.ts"],"sourcesContent":["import _ from 'lodash';\nimport { async, errors } from '@strapi/utils';\n\nimport type { Context } from 'koa';\nimport type { Core } from '@strapi/types';\n\nimport { getService } from '../utils';\nimport { FILE_MODEL_UID } from '../constants';\nimport { validateUploadBody } from './validation/content-api/upload';\nimport { FileInfo } from '../types';\nimport { prepareUploadRequest } from '../utils/mime-validation';\n\nconst { ValidationError } = errors;\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n const sanitizeOutput = async (data: unknown | unknown[], ctx: Context) => {\n const schema = strapi.getModel(FILE_MODEL_UID);\n const { auth } = ctx.state;\n\n return strapi.contentAPI.sanitize.output(data, schema, { auth });\n };\n\n const validateQuery = async (data: Record<string, unknown>, ctx: Context) => {\n const schema = strapi.getModel(FILE_MODEL_UID);\n const { auth, route } = ctx.state;\n\n return strapi.contentAPI.validate.query(data, schema, { auth, route });\n };\n\n const sanitizeQuery = async (data: Record<string, unknown>, ctx: Context) => {\n const schema = strapi.getModel(FILE_MODEL_UID);\n const { auth, route } = ctx.state;\n\n return strapi.contentAPI.sanitize.query(data, schema, { auth, route });\n };\n\n return {\n async find(ctx: Context) {\n await validateQuery(ctx.query, ctx);\n const sanitizedQuery = await sanitizeQuery(ctx.query, ctx);\n\n const files = await getService('upload').findMany(sanitizedQuery);\n\n const signedFiles = await async.map(files, getService('file').signFileUrls);\n\n ctx.body = await sanitizeOutput(signedFiles, ctx);\n },\n\n async findPage(ctx: Context) {\n await validateQuery(ctx.query, ctx);\n const sanitizedQuery = await sanitizeQuery(ctx.query, ctx);\n\n const { results, pagination } = await getService('upload').findAndCountPage(sanitizedQuery);\n\n const data = await sanitizeOutput(results, ctx);\n\n ctx.body = { data, meta: { pagination } };\n },\n\n async findOne(ctx: Context) {\n const {\n params: { id },\n } = ctx;\n\n await validateQuery(ctx.query, ctx);\n const sanitizedQuery = await sanitizeQuery(ctx.query, ctx);\n\n const file = await getService('upload').findOne(id, sanitizedQuery.populate!);\n\n if (!file) {\n return ctx.notFound('file.notFound');\n }\n\n const signedFile = await getService('file').signFileUrls(file);\n\n ctx.body = await sanitizeOutput(signedFile, ctx);\n },\n\n async destroy(ctx: Context) {\n const {\n params: { id },\n } = ctx;\n\n const file = await getService('upload').findOne(id);\n\n if (!file) {\n return ctx.notFound('file.notFound');\n }\n\n await getService('upload').remove(file);\n\n const signedFile = await getService('file').signFileUrls(file);\n\n ctx.body = await sanitizeOutput(signedFile, ctx);\n },\n\n async updateFileInfo(ctx: Context) {\n const {\n query: { id },\n request: { body },\n } = ctx;\n const data = await validateUploadBody(body);\n\n if (!id || (typeof id !== 'string' && typeof id !== 'number')) {\n throw new ValidationError('File id is required and must be a single value');\n }\n\n const result = await getService('upload').updateFileInfo(id, data.fileInfo as any);\n\n const signedResult = await getService('file').signFileUrls(result);\n\n ctx.body = await sanitizeOutput(signedResult, ctx);\n },\n\n async replaceFile(ctx: Context) {\n const {\n query: { id },\n request: { body, files: { files: filesInput } = {} },\n } = ctx;\n\n // cannot replace with more than one file\n if (Array.isArray(filesInput) && filesInput.length > 1) {\n throw new ValidationError('Cannot replace a file with multiple ones');\n }\n\n const files = Array.isArray(filesInput) ? filesInput[0] : filesInput;\n\n const {\n validFiles,\n filteredBody,\n errors: validationErrors,\n } = await prepareUploadRequest(files, body, strapi);\n if (validFiles.length === 0) {\n throw new errors.ValidationError(validationErrors[0].message);\n }\n\n if (!id || (typeof id !== 'string' && typeof id !== 'number')) {\n throw new ValidationError('File id is required and must be a single value');\n }\n\n const data = (await validateUploadBody(filteredBody)) as { fileInfo: FileInfo };\n\n const replacedFiles = await getService('upload').replace(id, { data, file: validFiles[0] });\n\n const signedFiles = await getService('file').signFileUrls(replacedFiles);\n\n ctx.body = await sanitizeOutput(signedFiles, ctx);\n },\n\n async uploadFiles(ctx: Context) {\n const {\n request: { body, files: { files: filesInput } = {} },\n } = ctx;\n\n const {\n validFiles,\n filteredBody,\n errors: validationErrors,\n } = await prepareUploadRequest(filesInput, body, strapi);\n if (validFiles.length === 0) {\n throw new errors.ValidationError(validationErrors[0].message);\n }\n\n const isMultipleFiles = validFiles.length > 1;\n const data: any = await validateUploadBody(filteredBody, isMultipleFiles);\n\n const apiUploadFolderService = getService('api-upload-folder');\n\n const apiUploadFolder = await apiUploadFolderService.getAPIUploadFolder();\n\n if (isMultipleFiles) {\n data.fileInfo = data.fileInfo || [];\n data.fileInfo = validFiles.map((_f, i) => ({\n ...data.fileInfo[i],\n folder: apiUploadFolder.id,\n }));\n } else {\n data.fileInfo = { ...data.fileInfo, folder: apiUploadFolder.id };\n }\n\n const uploadedFiles = await getService('upload').upload({\n data,\n files: validFiles,\n });\n\n const signedFiles = await async.map(uploadedFiles as any[], getService('file').signFileUrls);\n\n ctx.body = await sanitizeOutput(signedFiles, ctx);\n ctx.status = 201;\n },\n\n // TODO: split into multiple endpoints\n async upload(ctx: Context) {\n const {\n query: { id },\n request: { files: { files } = {} },\n } = ctx;\n\n if (_.isEmpty(files) || (!Array.isArray(files) && files.size === 0)) {\n if (id) {\n return this.updateFileInfo(ctx);\n }\n\n throw new ValidationError('Files are empty');\n }\n\n await (id ? this.replaceFile : this.uploadFiles)(ctx);\n },\n };\n};\n"],"names":["ValidationError","errors","strapi","sanitizeOutput","data","ctx","schema","getModel","FILE_MODEL_UID","auth","state","contentAPI","sanitize","output","validateQuery","route","validate","query","sanitizeQuery","find","sanitizedQuery","files","getService","findMany","signedFiles","async","map","signFileUrls","body","findPage","results","pagination","findAndCountPage","meta","findOne","params","id","file","populate","notFound","signedFile","destroy","remove","updateFileInfo","request","validateUploadBody","result","fileInfo","signedResult","replaceFile","filesInput","Array","isArray","length","validFiles","filteredBody","validationErrors","prepareUploadRequest","message","replacedFiles","replace","uploadFiles","isMultipleFiles","apiUploadFolderService","apiUploadFolder","getAPIUploadFolder","_f","i","folder","uploadedFiles","upload","status","_","isEmpty","size"],"mappings":";;;;;;;;;;;;;AAYA,MAAM,EAAEA,eAAe,EAAE,GAAGC,YAAAA;AAE5B,iBAAe,CAAA,CAAC,EAAEC,MAAM,EAA2B,GAAA;IACjD,MAAMC,cAAAA,GAAiB,OAAOC,IAAAA,EAA2BC,GAAAA,GAAAA;QACvD,MAAMC,MAAAA,GAASJ,MAAAA,CAAOK,QAAQ,CAACC,wBAAAA,CAAAA;AAC/B,QAAA,MAAM,EAAEC,IAAI,EAAE,GAAGJ,IAAIK,KAAK;QAE1B,OAAOR,MAAAA,CAAOS,UAAU,CAACC,QAAQ,CAACC,MAAM,CAACT,MAAME,MAAAA,EAAQ;AAAEG,YAAAA;AAAK,SAAA,CAAA;AAChE,IAAA,CAAA;IAEA,MAAMK,aAAAA,GAAgB,OAAOV,IAAAA,EAA+BC,GAAAA,GAAAA;QAC1D,MAAMC,MAAAA,GAASJ,MAAAA,CAAOK,QAAQ,CAACC,wBAAAA,CAAAA;AAC/B,QAAA,MAAM,EAAEC,IAAI,EAAEM,KAAK,EAAE,GAAGV,IAAIK,KAAK;QAEjC,OAAOR,MAAAA,CAAOS,UAAU,CAACK,QAAQ,CAACC,KAAK,CAACb,MAAME,MAAAA,EAAQ;AAAEG,YAAAA,IAAAA;AAAMM,YAAAA;AAAM,SAAA,CAAA;AACtE,IAAA,CAAA;IAEA,MAAMG,aAAAA,GAAgB,OAAOd,IAAAA,EAA+BC,GAAAA,GAAAA;QAC1D,MAAMC,MAAAA,GAASJ,MAAAA,CAAOK,QAAQ,CAACC,wBAAAA,CAAAA;AAC/B,QAAA,MAAM,EAAEC,IAAI,EAAEM,KAAK,EAAE,GAAGV,IAAIK,KAAK;QAEjC,OAAOR,MAAAA,CAAOS,UAAU,CAACC,QAAQ,CAACK,KAAK,CAACb,MAAME,MAAAA,EAAQ;AAAEG,YAAAA,IAAAA;AAAMM,YAAAA;AAAM,SAAA,CAAA;AACtE,IAAA,CAAA;IAEA,OAAO;AACL,QAAA,MAAMI,MAAKd,GAAY,EAAA;YACrB,MAAMS,aAAAA,CAAcT,GAAAA,CAAIY,KAAK,EAAEZ,GAAAA,CAAAA;AAC/B,YAAA,MAAMe,cAAAA,GAAiB,MAAMF,aAAAA,CAAcb,GAAAA,CAAIY,KAAK,EAAEZ,GAAAA,CAAAA;AAEtD,YAAA,MAAMgB,KAAAA,GAAQ,MAAMC,gBAAAA,CAAW,QAAA,CAAA,CAAUC,QAAQ,CAACH,cAAAA,CAAAA;YAElD,MAAMI,WAAAA,GAAc,MAAMC,WAAAA,CAAMC,GAAG,CAACL,KAAAA,EAAOC,gBAAAA,CAAW,QAAQK,YAAY,CAAA;AAE1EtB,YAAAA,GAAAA,CAAIuB,IAAI,GAAG,MAAMzB,cAAAA,CAAeqB,WAAAA,EAAanB,GAAAA,CAAAA;AAC/C,QAAA,CAAA;AAEA,QAAA,MAAMwB,UAASxB,GAAY,EAAA;YACzB,MAAMS,aAAAA,CAAcT,GAAAA,CAAIY,KAAK,EAAEZ,GAAAA,CAAAA;AAC/B,YAAA,MAAMe,cAAAA,GAAiB,MAAMF,aAAAA,CAAcb,GAAAA,CAAIY,KAAK,EAAEZ,GAAAA,CAAAA;YAEtD,MAAM,EAAEyB,OAAO,EAAEC,UAAU,EAAE,GAAG,MAAMT,gBAAAA,CAAW,QAAA,CAAA,CAAUU,gBAAgB,CAACZ,cAAAA,CAAAA;YAE5E,MAAMhB,IAAAA,GAAO,MAAMD,cAAAA,CAAe2B,OAAAA,EAASzB,GAAAA,CAAAA;AAE3CA,YAAAA,GAAAA,CAAIuB,IAAI,GAAG;AAAExB,gBAAAA,IAAAA;gBAAM6B,IAAAA,EAAM;AAAEF,oBAAAA;AAAW;AAAE,aAAA;AAC1C,QAAA,CAAA;AAEA,QAAA,MAAMG,SAAQ7B,GAAY,EAAA;AACxB,YAAA,MAAM,EACJ8B,MAAAA,EAAQ,EAAEC,EAAE,EAAE,EACf,GAAG/B,GAAAA;YAEJ,MAAMS,aAAAA,CAAcT,GAAAA,CAAIY,KAAK,EAAEZ,GAAAA,CAAAA;AAC/B,YAAA,MAAMe,cAAAA,GAAiB,MAAMF,aAAAA,CAAcb,GAAAA,CAAIY,KAAK,EAAEZ,GAAAA,CAAAA;YAEtD,MAAMgC,IAAAA,GAAO,MAAMf,gBAAAA,CAAW,QAAA,CAAA,CAAUY,OAAO,CAACE,EAAAA,EAAIhB,eAAekB,QAAQ,CAAA;AAE3E,YAAA,IAAI,CAACD,IAAAA,EAAM;gBACT,OAAOhC,GAAAA,CAAIkC,QAAQ,CAAC,eAAA,CAAA;AACtB,YAAA;AAEA,YAAA,MAAMC,UAAAA,GAAa,MAAMlB,gBAAAA,CAAW,MAAA,CAAA,CAAQK,YAAY,CAACU,IAAAA,CAAAA;AAEzDhC,YAAAA,GAAAA,CAAIuB,IAAI,GAAG,MAAMzB,cAAAA,CAAeqC,UAAAA,EAAYnC,GAAAA,CAAAA;AAC9C,QAAA,CAAA;AAEA,QAAA,MAAMoC,SAAQpC,GAAY,EAAA;AACxB,YAAA,MAAM,EACJ8B,MAAAA,EAAQ,EAAEC,EAAE,EAAE,EACf,GAAG/B,GAAAA;AAEJ,YAAA,MAAMgC,IAAAA,GAAO,MAAMf,gBAAAA,CAAW,QAAA,CAAA,CAAUY,OAAO,CAACE,EAAAA,CAAAA;AAEhD,YAAA,IAAI,CAACC,IAAAA,EAAM;gBACT,OAAOhC,GAAAA,CAAIkC,QAAQ,CAAC,eAAA,CAAA;AACtB,YAAA;YAEA,MAAMjB,gBAAAA,CAAW,QAAA,CAAA,CAAUoB,MAAM,CAACL,IAAAA,CAAAA;AAElC,YAAA,MAAMG,UAAAA,GAAa,MAAMlB,gBAAAA,CAAW,MAAA,CAAA,CAAQK,YAAY,CAACU,IAAAA,CAAAA;AAEzDhC,YAAAA,GAAAA,CAAIuB,IAAI,GAAG,MAAMzB,cAAAA,CAAeqC,UAAAA,EAAYnC,GAAAA,CAAAA;AAC9C,QAAA,CAAA;AAEA,QAAA,MAAMsC,gBAAetC,GAAY,EAAA;YAC/B,MAAM,EACJY,KAAAA,EAAO,EAAEmB,EAAE,EAAE,EACbQ,OAAAA,EAAS,EAAEhB,IAAI,EAAE,EAClB,GAAGvB,GAAAA;YACJ,MAAMD,IAAAA,GAAO,MAAMyC,yBAAAA,CAAmBjB,IAAAA,CAAAA;AAEtC,YAAA,IAAI,CAACQ,EAAAA,IAAO,OAAOA,OAAO,QAAA,IAAY,OAAOA,OAAO,QAAA,EAAW;AAC7D,gBAAA,MAAM,IAAIpC,eAAAA,CAAgB,gDAAA,CAAA;AAC5B,YAAA;YAEA,MAAM8C,MAAAA,GAAS,MAAMxB,gBAAAA,CAAW,QAAA,CAAA,CAAUqB,cAAc,CAACP,EAAAA,EAAIhC,KAAK2C,QAAQ,CAAA;AAE1E,YAAA,MAAMC,YAAAA,GAAe,MAAM1B,gBAAAA,CAAW,MAAA,CAAA,CAAQK,YAAY,CAACmB,MAAAA,CAAAA;AAE3DzC,YAAAA,GAAAA,CAAIuB,IAAI,GAAG,MAAMzB,cAAAA,CAAe6C,YAAAA,EAAc3C,GAAAA,CAAAA;AAChD,QAAA,CAAA;AAEA,QAAA,MAAM4C,aAAY5C,GAAY,EAAA;YAC5B,MAAM,EACJY,OAAO,EAAEmB,EAAE,EAAE,EACbQ,OAAAA,EAAS,EAAEhB,IAAI,EAAEP,OAAO,EAAEA,KAAAA,EAAO6B,UAAU,EAAE,GAAG,EAAE,EAAE,EACrD,GAAG7C,GAAAA;;AAGJ,YAAA,IAAI8C,MAAMC,OAAO,CAACF,eAAeA,UAAAA,CAAWG,MAAM,GAAG,CAAA,EAAG;AACtD,gBAAA,MAAM,IAAIrD,eAAAA,CAAgB,0CAAA,CAAA;AAC5B,YAAA;YAEA,MAAMqB,KAAAA,GAAQ8B,MAAMC,OAAO,CAACF,cAAcA,UAAU,CAAC,EAAE,GAAGA,UAAAA;AAE1D,YAAA,MAAM,EACJI,UAAU,EACVC,YAAY,EACZtD,MAAAA,EAAQuD,gBAAgB,EACzB,GAAG,MAAMC,mCAAAA,CAAqBpC,KAAAA,EAAOO,IAAAA,EAAM1B,MAAAA,CAAAA;YAC5C,IAAIoD,UAAAA,CAAWD,MAAM,KAAK,CAAA,EAAG;gBAC3B,MAAM,IAAIpD,aAAOD,eAAe,CAACwD,gBAAgB,CAAC,CAAA,CAAE,CAACE,OAAO,CAAA;AAC9D,YAAA;AAEA,YAAA,IAAI,CAACtB,EAAAA,IAAO,OAAOA,OAAO,QAAA,IAAY,OAAOA,OAAO,QAAA,EAAW;AAC7D,gBAAA,MAAM,IAAIpC,eAAAA,CAAgB,gDAAA,CAAA;AAC5B,YAAA;YAEA,MAAMI,IAAAA,GAAQ,MAAMyC,yBAAAA,CAAmBU,YAAAA,CAAAA;AAEvC,YAAA,MAAMI,gBAAgB,MAAMrC,gBAAAA,CAAW,QAAA,CAAA,CAAUsC,OAAO,CAACxB,EAAAA,EAAI;AAAEhC,gBAAAA,IAAAA;gBAAMiC,IAAAA,EAAMiB,UAAU,CAAC,CAAA;AAAG,aAAA,CAAA;AAEzF,YAAA,MAAM9B,WAAAA,GAAc,MAAMF,gBAAAA,CAAW,MAAA,CAAA,CAAQK,YAAY,CAACgC,aAAAA,CAAAA;AAE1DtD,YAAAA,GAAAA,CAAIuB,IAAI,GAAG,MAAMzB,cAAAA,CAAeqB,WAAAA,EAAanB,GAAAA,CAAAA;AAC/C,QAAA,CAAA;AAEA,QAAA,MAAMwD,aAAYxD,GAAY,EAAA;AAC5B,YAAA,MAAM,EACJuC,OAAAA,EAAS,EAAEhB,IAAI,EAAEP,KAAAA,EAAO,EAAEA,KAAAA,EAAO6B,UAAU,EAAE,GAAG,EAAE,EAAE,EACrD,GAAG7C,GAAAA;AAEJ,YAAA,MAAM,EACJiD,UAAU,EACVC,YAAY,EACZtD,MAAAA,EAAQuD,gBAAgB,EACzB,GAAG,MAAMC,mCAAAA,CAAqBP,UAAAA,EAAYtB,IAAAA,EAAM1B,MAAAA,CAAAA;YACjD,IAAIoD,UAAAA,CAAWD,MAAM,KAAK,CAAA,EAAG;gBAC3B,MAAM,IAAIpD,aAAOD,eAAe,CAACwD,gBAAgB,CAAC,CAAA,CAAE,CAACE,OAAO,CAAA;AAC9D,YAAA;YAEA,MAAMI,eAAAA,GAAkBR,UAAAA,CAAWD,MAAM,GAAG,CAAA;YAC5C,MAAMjD,IAAAA,GAAY,MAAMyC,yBAAAA,CAAmBU,YAAAA,EAAcO,eAAAA,CAAAA;AAEzD,YAAA,MAAMC,yBAAyBzC,gBAAAA,CAAW,mBAAA,CAAA;YAE1C,MAAM0C,eAAAA,GAAkB,MAAMD,sBAAAA,CAAuBE,kBAAkB,EAAA;AAEvE,YAAA,IAAIH,eAAAA,EAAiB;AACnB1D,gBAAAA,IAAAA,CAAK2C,QAAQ,GAAG3C,IAAAA,CAAK2C,QAAQ,IAAI,EAAE;gBACnC3C,IAAAA,CAAK2C,QAAQ,GAAGO,UAAAA,CAAW5B,GAAG,CAAC,CAACwC,EAAAA,EAAIC,KAAO;wBACzC,GAAG/D,IAAAA,CAAK2C,QAAQ,CAACoB,CAAAA,CAAE;AACnBC,wBAAAA,MAAAA,EAAQJ,gBAAgB5B;qBAC1B,CAAA,CAAA;YACF,CAAA,MAAO;AACLhC,gBAAAA,IAAAA,CAAK2C,QAAQ,GAAG;AAAE,oBAAA,GAAG3C,KAAK2C,QAAQ;AAAEqB,oBAAAA,MAAAA,EAAQJ,gBAAgB5B;AAAG,iBAAA;AACjE,YAAA;AAEA,YAAA,MAAMiC,aAAAA,GAAgB,MAAM/C,gBAAAA,CAAW,QAAA,CAAA,CAAUgD,MAAM,CAAC;AACtDlE,gBAAAA,IAAAA;gBACAiB,KAAAA,EAAOiC;AACT,aAAA,CAAA;YAEA,MAAM9B,WAAAA,GAAc,MAAMC,WAAAA,CAAMC,GAAG,CAAC2C,aAAAA,EAAwB/C,gBAAAA,CAAW,QAAQK,YAAY,CAAA;AAE3FtB,YAAAA,GAAAA,CAAIuB,IAAI,GAAG,MAAMzB,cAAAA,CAAeqB,WAAAA,EAAanB,GAAAA,CAAAA;AAC7CA,YAAAA,GAAAA,CAAIkE,MAAM,GAAG,GAAA;AACf,QAAA,CAAA;;AAGA,QAAA,MAAMD,QAAOjE,GAAY,EAAA;AACvB,YAAA,MAAM,EACJY,KAAAA,EAAO,EAAEmB,EAAE,EAAE,EACbQ,OAAAA,EAAS,EAAEvB,KAAAA,EAAO,EAAEA,KAAK,EAAE,GAAG,EAAE,EAAE,EACnC,GAAGhB,GAAAA;AAEJ,YAAA,IAAImE,kBAAAA,CAAEC,OAAO,CAACpD,KAAAA,CAAAA,IAAW,CAAC8B,KAAAA,CAAMC,OAAO,CAAC/B,KAAAA,CAAAA,IAAUA,KAAAA,CAAMqD,IAAI,KAAK,CAAA,EAAI;AACnE,gBAAA,IAAItC,EAAAA,EAAI;oBACN,OAAO,IAAI,CAACO,cAAc,CAACtC,GAAAA,CAAAA;AAC7B,gBAAA;AAEA,gBAAA,MAAM,IAAIL,eAAAA,CAAgB,iBAAA,CAAA;AAC5B,YAAA;YAEA,MAAOoC,CAAAA,EAAAA,GAAK,IAAI,CAACa,WAAW,GAAG,IAAI,CAACY,WAAU,EAAGxD,GAAAA,CAAAA;AACnD,QAAA;AACF,KAAA;AACF,CAAA;;;;"}
|
|
1
|
+
{"version":3,"file":"content-api.js","sources":["../../../server/src/controllers/content-api.ts"],"sourcesContent":["import _ from 'lodash';\nimport { async, errors } from '@strapi/utils';\n\nimport type { Context } from 'koa';\nimport type { Core } from '@strapi/types';\n\nimport { getService } from '../utils';\nimport { FILE_MODEL_UID } from '../constants';\nimport { validateUploadBody } from './validation/content-api/upload';\nimport { FileInfo } from '../types';\nimport { prepareUploadRequest } from '../utils/mime-validation';\n\nconst { ValidationError, NotFoundError } = errors;\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n const sanitizeOutput = async (data: unknown | unknown[], ctx: Context) => {\n const schema = strapi.getModel(FILE_MODEL_UID);\n const { auth } = ctx.state;\n\n return strapi.contentAPI.sanitize.output(data, schema, { auth });\n };\n\n const validateQuery = async (data: Record<string, unknown>, ctx: Context) => {\n const schema = strapi.getModel(FILE_MODEL_UID);\n const { auth, route } = ctx.state;\n\n return strapi.contentAPI.validate.query(data, schema, { auth, route });\n };\n\n const sanitizeQuery = async (data: Record<string, unknown>, ctx: Context) => {\n const schema = strapi.getModel(FILE_MODEL_UID);\n const { auth, route } = ctx.state;\n\n return strapi.contentAPI.sanitize.query(data, schema, { auth, route });\n };\n\n // Files can be addressed by numeric id or documentId (1:1, files have no draft & publish)\n const resolveFileId = async (id: string | number) => {\n if (/^\\d+$/.test(String(id))) {\n return id;\n }\n\n const file = await strapi.db\n .query(FILE_MODEL_UID)\n .findOne({ where: { documentId: id }, select: ['id'] });\n\n return file?.id;\n };\n\n return {\n async find(ctx: Context) {\n await validateQuery(ctx.query, ctx);\n const sanitizedQuery = await sanitizeQuery(ctx.query, ctx);\n\n const files = await getService('upload').findMany(sanitizedQuery);\n\n const signedFiles = await async.map(files, getService('file').signFileUrls);\n\n ctx.body = await sanitizeOutput(signedFiles, ctx);\n },\n\n async findPage(ctx: Context) {\n await validateQuery(ctx.query, ctx);\n const sanitizedQuery = await sanitizeQuery(ctx.query, ctx);\n\n const { results, pagination } = await getService('upload').findAndCountPage(sanitizedQuery);\n\n const data = await sanitizeOutput(results, ctx);\n\n ctx.body = { data, meta: { pagination } };\n },\n\n async findOne(ctx: Context) {\n await validateQuery(ctx.query, ctx);\n const sanitizedQuery = await sanitizeQuery(ctx.query, ctx);\n\n const id = await resolveFileId(ctx.params.id);\n const file = id ? await getService('upload').findOne(id, sanitizedQuery.populate!) : null;\n\n if (!file) {\n return ctx.notFound('file.notFound');\n }\n\n const signedFile = await getService('file').signFileUrls(file);\n\n ctx.body = await sanitizeOutput(signedFile, ctx);\n },\n\n async destroy(ctx: Context) {\n const id = await resolveFileId(ctx.params.id);\n const file = id ? await getService('upload').findOne(id) : null;\n\n if (!file) {\n return ctx.notFound('file.notFound');\n }\n\n await getService('upload').remove(file);\n\n const signedFile = await getService('file').signFileUrls(file);\n\n ctx.body = await sanitizeOutput(signedFile, ctx);\n },\n\n async updateFileInfo(ctx: Context) {\n const {\n query: { id },\n request: { body },\n } = ctx;\n const data = await validateUploadBody(body);\n\n if (!id || (typeof id !== 'string' && typeof id !== 'number')) {\n throw new ValidationError('File id is required and must be a single value');\n }\n\n const fileId = await resolveFileId(id);\n\n if (!fileId) {\n throw new NotFoundError();\n }\n\n const result = await getService('upload').updateFileInfo(fileId, data.fileInfo as any);\n\n const signedResult = await getService('file').signFileUrls(result);\n\n ctx.body = await sanitizeOutput(signedResult, ctx);\n },\n\n async replaceFile(ctx: Context) {\n const {\n query: { id },\n request: { body, files: { files: filesInput } = {} },\n } = ctx;\n\n // cannot replace with more than one file\n if (Array.isArray(filesInput) && filesInput.length > 1) {\n throw new ValidationError('Cannot replace a file with multiple ones');\n }\n\n const files = Array.isArray(filesInput) ? filesInput[0] : filesInput;\n\n const {\n validFiles,\n filteredBody,\n errors: validationErrors,\n } = await prepareUploadRequest(files, body, strapi);\n if (validFiles.length === 0) {\n throw new errors.ValidationError(validationErrors[0].message);\n }\n\n if (!id || (typeof id !== 'string' && typeof id !== 'number')) {\n throw new ValidationError('File id is required and must be a single value');\n }\n\n const fileId = await resolveFileId(id);\n\n if (!fileId) {\n throw new NotFoundError();\n }\n\n const data = (await validateUploadBody(filteredBody)) as { fileInfo: FileInfo };\n\n const replacedFiles = await getService('upload').replace(fileId, {\n data,\n file: validFiles[0],\n });\n\n const signedFiles = await getService('file').signFileUrls(replacedFiles);\n\n ctx.body = await sanitizeOutput(signedFiles, ctx);\n },\n\n async uploadFiles(ctx: Context) {\n const {\n request: { body, files: { files: filesInput } = {} },\n } = ctx;\n\n const {\n validFiles,\n filteredBody,\n errors: validationErrors,\n } = await prepareUploadRequest(filesInput, body, strapi);\n if (validFiles.length === 0) {\n throw new errors.ValidationError(validationErrors[0].message);\n }\n\n const isMultipleFiles = validFiles.length > 1;\n const data: any = await validateUploadBody(filteredBody, isMultipleFiles);\n\n const apiUploadFolderService = getService('api-upload-folder');\n\n const apiUploadFolder = await apiUploadFolderService.getAPIUploadFolder();\n\n if (isMultipleFiles) {\n data.fileInfo = data.fileInfo || [];\n data.fileInfo = validFiles.map((_f, i) => ({\n ...data.fileInfo[i],\n folder: apiUploadFolder.id,\n }));\n } else {\n data.fileInfo = { ...data.fileInfo, folder: apiUploadFolder.id };\n }\n\n const uploadedFiles = await getService('upload').upload({\n data,\n files: validFiles,\n });\n\n const signedFiles = await async.map(uploadedFiles as any[], getService('file').signFileUrls);\n\n ctx.body = await sanitizeOutput(signedFiles, ctx);\n ctx.status = 201;\n },\n\n // TODO: split into multiple endpoints\n async upload(ctx: Context) {\n const {\n query: { id },\n request: { files: { files } = {} },\n } = ctx;\n\n if (_.isEmpty(files) || (!Array.isArray(files) && files.size === 0)) {\n if (id) {\n return this.updateFileInfo(ctx);\n }\n\n throw new ValidationError('Files are empty');\n }\n\n await (id ? this.replaceFile : this.uploadFiles)(ctx);\n },\n };\n};\n"],"names":["ValidationError","NotFoundError","errors","strapi","sanitizeOutput","data","ctx","schema","getModel","FILE_MODEL_UID","auth","state","contentAPI","sanitize","output","validateQuery","route","validate","query","sanitizeQuery","resolveFileId","id","test","String","file","db","findOne","where","documentId","select","find","sanitizedQuery","files","getService","findMany","signedFiles","async","map","signFileUrls","body","findPage","results","pagination","findAndCountPage","meta","params","populate","notFound","signedFile","destroy","remove","updateFileInfo","request","validateUploadBody","fileId","result","fileInfo","signedResult","replaceFile","filesInput","Array","isArray","length","validFiles","filteredBody","validationErrors","prepareUploadRequest","message","replacedFiles","replace","uploadFiles","isMultipleFiles","apiUploadFolderService","apiUploadFolder","getAPIUploadFolder","_f","i","folder","uploadedFiles","upload","status","_","isEmpty","size"],"mappings":"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"}
|
|
@@ -5,7 +5,7 @@ import { FILE_MODEL_UID } from '../constants.mjs';
|
|
|
5
5
|
import { validateUploadBody } from './validation/content-api/upload.mjs';
|
|
6
6
|
import { prepareUploadRequest } from '../utils/mime-validation.mjs';
|
|
7
7
|
|
|
8
|
-
const { ValidationError } = errors;
|
|
8
|
+
const { ValidationError, NotFoundError } = errors;
|
|
9
9
|
var contentApi = (({ strapi })=>{
|
|
10
10
|
const sanitizeOutput = async (data, ctx)=>{
|
|
11
11
|
const schema = strapi.getModel(FILE_MODEL_UID);
|
|
@@ -30,6 +30,21 @@ var contentApi = (({ strapi })=>{
|
|
|
30
30
|
route
|
|
31
31
|
});
|
|
32
32
|
};
|
|
33
|
+
// Files can be addressed by numeric id or documentId (1:1, files have no draft & publish)
|
|
34
|
+
const resolveFileId = async (id)=>{
|
|
35
|
+
if (/^\d+$/.test(String(id))) {
|
|
36
|
+
return id;
|
|
37
|
+
}
|
|
38
|
+
const file = await strapi.db.query(FILE_MODEL_UID).findOne({
|
|
39
|
+
where: {
|
|
40
|
+
documentId: id
|
|
41
|
+
},
|
|
42
|
+
select: [
|
|
43
|
+
'id'
|
|
44
|
+
]
|
|
45
|
+
});
|
|
46
|
+
return file?.id;
|
|
47
|
+
};
|
|
33
48
|
return {
|
|
34
49
|
async find (ctx) {
|
|
35
50
|
await validateQuery(ctx.query, ctx);
|
|
@@ -51,10 +66,10 @@ var contentApi = (({ strapi })=>{
|
|
|
51
66
|
};
|
|
52
67
|
},
|
|
53
68
|
async findOne (ctx) {
|
|
54
|
-
const { params: { id } } = ctx;
|
|
55
69
|
await validateQuery(ctx.query, ctx);
|
|
56
70
|
const sanitizedQuery = await sanitizeQuery(ctx.query, ctx);
|
|
57
|
-
const
|
|
71
|
+
const id = await resolveFileId(ctx.params.id);
|
|
72
|
+
const file = id ? await getService('upload').findOne(id, sanitizedQuery.populate) : null;
|
|
58
73
|
if (!file) {
|
|
59
74
|
return ctx.notFound('file.notFound');
|
|
60
75
|
}
|
|
@@ -62,8 +77,8 @@ var contentApi = (({ strapi })=>{
|
|
|
62
77
|
ctx.body = await sanitizeOutput(signedFile, ctx);
|
|
63
78
|
},
|
|
64
79
|
async destroy (ctx) {
|
|
65
|
-
const
|
|
66
|
-
const file = await getService('upload').findOne(id);
|
|
80
|
+
const id = await resolveFileId(ctx.params.id);
|
|
81
|
+
const file = id ? await getService('upload').findOne(id) : null;
|
|
67
82
|
if (!file) {
|
|
68
83
|
return ctx.notFound('file.notFound');
|
|
69
84
|
}
|
|
@@ -77,7 +92,11 @@ var contentApi = (({ strapi })=>{
|
|
|
77
92
|
if (!id || typeof id !== 'string' && typeof id !== 'number') {
|
|
78
93
|
throw new ValidationError('File id is required and must be a single value');
|
|
79
94
|
}
|
|
80
|
-
const
|
|
95
|
+
const fileId = await resolveFileId(id);
|
|
96
|
+
if (!fileId) {
|
|
97
|
+
throw new NotFoundError();
|
|
98
|
+
}
|
|
99
|
+
const result = await getService('upload').updateFileInfo(fileId, data.fileInfo);
|
|
81
100
|
const signedResult = await getService('file').signFileUrls(result);
|
|
82
101
|
ctx.body = await sanitizeOutput(signedResult, ctx);
|
|
83
102
|
},
|
|
@@ -95,8 +114,12 @@ var contentApi = (({ strapi })=>{
|
|
|
95
114
|
if (!id || typeof id !== 'string' && typeof id !== 'number') {
|
|
96
115
|
throw new ValidationError('File id is required and must be a single value');
|
|
97
116
|
}
|
|
117
|
+
const fileId = await resolveFileId(id);
|
|
118
|
+
if (!fileId) {
|
|
119
|
+
throw new NotFoundError();
|
|
120
|
+
}
|
|
98
121
|
const data = await validateUploadBody(filteredBody);
|
|
99
|
-
const replacedFiles = await getService('upload').replace(
|
|
122
|
+
const replacedFiles = await getService('upload').replace(fileId, {
|
|
100
123
|
data,
|
|
101
124
|
file: validFiles[0]
|
|
102
125
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content-api.mjs","sources":["../../../server/src/controllers/content-api.ts"],"sourcesContent":["import _ from 'lodash';\nimport { async, errors } from '@strapi/utils';\n\nimport type { Context } from 'koa';\nimport type { Core } from '@strapi/types';\n\nimport { getService } from '../utils';\nimport { FILE_MODEL_UID } from '../constants';\nimport { validateUploadBody } from './validation/content-api/upload';\nimport { FileInfo } from '../types';\nimport { prepareUploadRequest } from '../utils/mime-validation';\n\nconst { ValidationError } = errors;\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n const sanitizeOutput = async (data: unknown | unknown[], ctx: Context) => {\n const schema = strapi.getModel(FILE_MODEL_UID);\n const { auth } = ctx.state;\n\n return strapi.contentAPI.sanitize.output(data, schema, { auth });\n };\n\n const validateQuery = async (data: Record<string, unknown>, ctx: Context) => {\n const schema = strapi.getModel(FILE_MODEL_UID);\n const { auth, route } = ctx.state;\n\n return strapi.contentAPI.validate.query(data, schema, { auth, route });\n };\n\n const sanitizeQuery = async (data: Record<string, unknown>, ctx: Context) => {\n const schema = strapi.getModel(FILE_MODEL_UID);\n const { auth, route } = ctx.state;\n\n return strapi.contentAPI.sanitize.query(data, schema, { auth, route });\n };\n\n return {\n async find(ctx: Context) {\n await validateQuery(ctx.query, ctx);\n const sanitizedQuery = await sanitizeQuery(ctx.query, ctx);\n\n const files = await getService('upload').findMany(sanitizedQuery);\n\n const signedFiles = await async.map(files, getService('file').signFileUrls);\n\n ctx.body = await sanitizeOutput(signedFiles, ctx);\n },\n\n async findPage(ctx: Context) {\n await validateQuery(ctx.query, ctx);\n const sanitizedQuery = await sanitizeQuery(ctx.query, ctx);\n\n const { results, pagination } = await getService('upload').findAndCountPage(sanitizedQuery);\n\n const data = await sanitizeOutput(results, ctx);\n\n ctx.body = { data, meta: { pagination } };\n },\n\n async findOne(ctx: Context) {\n const {\n params: { id },\n } = ctx;\n\n await validateQuery(ctx.query, ctx);\n const sanitizedQuery = await sanitizeQuery(ctx.query, ctx);\n\n const file = await getService('upload').findOne(id, sanitizedQuery.populate!);\n\n if (!file) {\n return ctx.notFound('file.notFound');\n }\n\n const signedFile = await getService('file').signFileUrls(file);\n\n ctx.body = await sanitizeOutput(signedFile, ctx);\n },\n\n async destroy(ctx: Context) {\n const {\n params: { id },\n } = ctx;\n\n const file = await getService('upload').findOne(id);\n\n if (!file) {\n return ctx.notFound('file.notFound');\n }\n\n await getService('upload').remove(file);\n\n const signedFile = await getService('file').signFileUrls(file);\n\n ctx.body = await sanitizeOutput(signedFile, ctx);\n },\n\n async updateFileInfo(ctx: Context) {\n const {\n query: { id },\n request: { body },\n } = ctx;\n const data = await validateUploadBody(body);\n\n if (!id || (typeof id !== 'string' && typeof id !== 'number')) {\n throw new ValidationError('File id is required and must be a single value');\n }\n\n const result = await getService('upload').updateFileInfo(id, data.fileInfo as any);\n\n const signedResult = await getService('file').signFileUrls(result);\n\n ctx.body = await sanitizeOutput(signedResult, ctx);\n },\n\n async replaceFile(ctx: Context) {\n const {\n query: { id },\n request: { body, files: { files: filesInput } = {} },\n } = ctx;\n\n // cannot replace with more than one file\n if (Array.isArray(filesInput) && filesInput.length > 1) {\n throw new ValidationError('Cannot replace a file with multiple ones');\n }\n\n const files = Array.isArray(filesInput) ? filesInput[0] : filesInput;\n\n const {\n validFiles,\n filteredBody,\n errors: validationErrors,\n } = await prepareUploadRequest(files, body, strapi);\n if (validFiles.length === 0) {\n throw new errors.ValidationError(validationErrors[0].message);\n }\n\n if (!id || (typeof id !== 'string' && typeof id !== 'number')) {\n throw new ValidationError('File id is required and must be a single value');\n }\n\n const data = (await validateUploadBody(filteredBody)) as { fileInfo: FileInfo };\n\n const replacedFiles = await getService('upload').replace(id, { data, file: validFiles[0] });\n\n const signedFiles = await getService('file').signFileUrls(replacedFiles);\n\n ctx.body = await sanitizeOutput(signedFiles, ctx);\n },\n\n async uploadFiles(ctx: Context) {\n const {\n request: { body, files: { files: filesInput } = {} },\n } = ctx;\n\n const {\n validFiles,\n filteredBody,\n errors: validationErrors,\n } = await prepareUploadRequest(filesInput, body, strapi);\n if (validFiles.length === 0) {\n throw new errors.ValidationError(validationErrors[0].message);\n }\n\n const isMultipleFiles = validFiles.length > 1;\n const data: any = await validateUploadBody(filteredBody, isMultipleFiles);\n\n const apiUploadFolderService = getService('api-upload-folder');\n\n const apiUploadFolder = await apiUploadFolderService.getAPIUploadFolder();\n\n if (isMultipleFiles) {\n data.fileInfo = data.fileInfo || [];\n data.fileInfo = validFiles.map((_f, i) => ({\n ...data.fileInfo[i],\n folder: apiUploadFolder.id,\n }));\n } else {\n data.fileInfo = { ...data.fileInfo, folder: apiUploadFolder.id };\n }\n\n const uploadedFiles = await getService('upload').upload({\n data,\n files: validFiles,\n });\n\n const signedFiles = await async.map(uploadedFiles as any[], getService('file').signFileUrls);\n\n ctx.body = await sanitizeOutput(signedFiles, ctx);\n ctx.status = 201;\n },\n\n // TODO: split into multiple endpoints\n async upload(ctx: Context) {\n const {\n query: { id },\n request: { files: { files } = {} },\n } = ctx;\n\n if (_.isEmpty(files) || (!Array.isArray(files) && files.size === 0)) {\n if (id) {\n return this.updateFileInfo(ctx);\n }\n\n throw new ValidationError('Files are empty');\n }\n\n await (id ? this.replaceFile : this.uploadFiles)(ctx);\n },\n };\n};\n"],"names":["ValidationError","errors","strapi","sanitizeOutput","data","ctx","schema","getModel","FILE_MODEL_UID","auth","state","contentAPI","sanitize","output","validateQuery","route","validate","query","sanitizeQuery","find","sanitizedQuery","files","getService","findMany","signedFiles","async","map","signFileUrls","body","findPage","results","pagination","findAndCountPage","meta","findOne","params","id","file","populate","notFound","signedFile","destroy","remove","updateFileInfo","request","validateUploadBody","result","fileInfo","signedResult","replaceFile","filesInput","Array","isArray","length","validFiles","filteredBody","validationErrors","prepareUploadRequest","message","replacedFiles","replace","uploadFiles","isMultipleFiles","apiUploadFolderService","apiUploadFolder","getAPIUploadFolder","_f","i","folder","uploadedFiles","upload","status","_","isEmpty","size"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"content-api.mjs","sources":["../../../server/src/controllers/content-api.ts"],"sourcesContent":["import _ from 'lodash';\nimport { async, errors } from '@strapi/utils';\n\nimport type { Context } from 'koa';\nimport type { Core } from '@strapi/types';\n\nimport { getService } from '../utils';\nimport { FILE_MODEL_UID } from '../constants';\nimport { validateUploadBody } from './validation/content-api/upload';\nimport { FileInfo } from '../types';\nimport { prepareUploadRequest } from '../utils/mime-validation';\n\nconst { ValidationError, NotFoundError } = errors;\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n const sanitizeOutput = async (data: unknown | unknown[], ctx: Context) => {\n const schema = strapi.getModel(FILE_MODEL_UID);\n const { auth } = ctx.state;\n\n return strapi.contentAPI.sanitize.output(data, schema, { auth });\n };\n\n const validateQuery = async (data: Record<string, unknown>, ctx: Context) => {\n const schema = strapi.getModel(FILE_MODEL_UID);\n const { auth, route } = ctx.state;\n\n return strapi.contentAPI.validate.query(data, schema, { auth, route });\n };\n\n const sanitizeQuery = async (data: Record<string, unknown>, ctx: Context) => {\n const schema = strapi.getModel(FILE_MODEL_UID);\n const { auth, route } = ctx.state;\n\n return strapi.contentAPI.sanitize.query(data, schema, { auth, route });\n };\n\n // Files can be addressed by numeric id or documentId (1:1, files have no draft & publish)\n const resolveFileId = async (id: string | number) => {\n if (/^\\d+$/.test(String(id))) {\n return id;\n }\n\n const file = await strapi.db\n .query(FILE_MODEL_UID)\n .findOne({ where: { documentId: id }, select: ['id'] });\n\n return file?.id;\n };\n\n return {\n async find(ctx: Context) {\n await validateQuery(ctx.query, ctx);\n const sanitizedQuery = await sanitizeQuery(ctx.query, ctx);\n\n const files = await getService('upload').findMany(sanitizedQuery);\n\n const signedFiles = await async.map(files, getService('file').signFileUrls);\n\n ctx.body = await sanitizeOutput(signedFiles, ctx);\n },\n\n async findPage(ctx: Context) {\n await validateQuery(ctx.query, ctx);\n const sanitizedQuery = await sanitizeQuery(ctx.query, ctx);\n\n const { results, pagination } = await getService('upload').findAndCountPage(sanitizedQuery);\n\n const data = await sanitizeOutput(results, ctx);\n\n ctx.body = { data, meta: { pagination } };\n },\n\n async findOne(ctx: Context) {\n await validateQuery(ctx.query, ctx);\n const sanitizedQuery = await sanitizeQuery(ctx.query, ctx);\n\n const id = await resolveFileId(ctx.params.id);\n const file = id ? await getService('upload').findOne(id, sanitizedQuery.populate!) : null;\n\n if (!file) {\n return ctx.notFound('file.notFound');\n }\n\n const signedFile = await getService('file').signFileUrls(file);\n\n ctx.body = await sanitizeOutput(signedFile, ctx);\n },\n\n async destroy(ctx: Context) {\n const id = await resolveFileId(ctx.params.id);\n const file = id ? await getService('upload').findOne(id) : null;\n\n if (!file) {\n return ctx.notFound('file.notFound');\n }\n\n await getService('upload').remove(file);\n\n const signedFile = await getService('file').signFileUrls(file);\n\n ctx.body = await sanitizeOutput(signedFile, ctx);\n },\n\n async updateFileInfo(ctx: Context) {\n const {\n query: { id },\n request: { body },\n } = ctx;\n const data = await validateUploadBody(body);\n\n if (!id || (typeof id !== 'string' && typeof id !== 'number')) {\n throw new ValidationError('File id is required and must be a single value');\n }\n\n const fileId = await resolveFileId(id);\n\n if (!fileId) {\n throw new NotFoundError();\n }\n\n const result = await getService('upload').updateFileInfo(fileId, data.fileInfo as any);\n\n const signedResult = await getService('file').signFileUrls(result);\n\n ctx.body = await sanitizeOutput(signedResult, ctx);\n },\n\n async replaceFile(ctx: Context) {\n const {\n query: { id },\n request: { body, files: { files: filesInput } = {} },\n } = ctx;\n\n // cannot replace with more than one file\n if (Array.isArray(filesInput) && filesInput.length > 1) {\n throw new ValidationError('Cannot replace a file with multiple ones');\n }\n\n const files = Array.isArray(filesInput) ? filesInput[0] : filesInput;\n\n const {\n validFiles,\n filteredBody,\n errors: validationErrors,\n } = await prepareUploadRequest(files, body, strapi);\n if (validFiles.length === 0) {\n throw new errors.ValidationError(validationErrors[0].message);\n }\n\n if (!id || (typeof id !== 'string' && typeof id !== 'number')) {\n throw new ValidationError('File id is required and must be a single value');\n }\n\n const fileId = await resolveFileId(id);\n\n if (!fileId) {\n throw new NotFoundError();\n }\n\n const data = (await validateUploadBody(filteredBody)) as { fileInfo: FileInfo };\n\n const replacedFiles = await getService('upload').replace(fileId, {\n data,\n file: validFiles[0],\n });\n\n const signedFiles = await getService('file').signFileUrls(replacedFiles);\n\n ctx.body = await sanitizeOutput(signedFiles, ctx);\n },\n\n async uploadFiles(ctx: Context) {\n const {\n request: { body, files: { files: filesInput } = {} },\n } = ctx;\n\n const {\n validFiles,\n filteredBody,\n errors: validationErrors,\n } = await prepareUploadRequest(filesInput, body, strapi);\n if (validFiles.length === 0) {\n throw new errors.ValidationError(validationErrors[0].message);\n }\n\n const isMultipleFiles = validFiles.length > 1;\n const data: any = await validateUploadBody(filteredBody, isMultipleFiles);\n\n const apiUploadFolderService = getService('api-upload-folder');\n\n const apiUploadFolder = await apiUploadFolderService.getAPIUploadFolder();\n\n if (isMultipleFiles) {\n data.fileInfo = data.fileInfo || [];\n data.fileInfo = validFiles.map((_f, i) => ({\n ...data.fileInfo[i],\n folder: apiUploadFolder.id,\n }));\n } else {\n data.fileInfo = { ...data.fileInfo, folder: apiUploadFolder.id };\n }\n\n const uploadedFiles = await getService('upload').upload({\n data,\n files: validFiles,\n });\n\n const signedFiles = await async.map(uploadedFiles as any[], getService('file').signFileUrls);\n\n ctx.body = await sanitizeOutput(signedFiles, ctx);\n ctx.status = 201;\n },\n\n // TODO: split into multiple endpoints\n async upload(ctx: Context) {\n const {\n query: { id },\n request: { files: { files } = {} },\n } = ctx;\n\n if (_.isEmpty(files) || (!Array.isArray(files) && files.size === 0)) {\n if (id) {\n return this.updateFileInfo(ctx);\n }\n\n throw new ValidationError('Files are empty');\n }\n\n await (id ? this.replaceFile : this.uploadFiles)(ctx);\n },\n };\n};\n"],"names":["ValidationError","NotFoundError","errors","strapi","sanitizeOutput","data","ctx","schema","getModel","FILE_MODEL_UID","auth","state","contentAPI","sanitize","output","validateQuery","route","validate","query","sanitizeQuery","resolveFileId","id","test","String","file","db","findOne","where","documentId","select","find","sanitizedQuery","files","getService","findMany","signedFiles","async","map","signFileUrls","body","findPage","results","pagination","findAndCountPage","meta","params","populate","notFound","signedFile","destroy","remove","updateFileInfo","request","validateUploadBody","fileId","result","fileInfo","signedResult","replaceFile","filesInput","Array","isArray","length","validFiles","filteredBody","validationErrors","prepareUploadRequest","message","replacedFiles","replace","uploadFiles","isMultipleFiles","apiUploadFolderService","apiUploadFolder","getAPIUploadFolder","_f","i","folder","uploadedFiles","upload","status","_","isEmpty","size"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _ = require('lodash');
|
|
4
4
|
var utils = require('@strapi/utils');
|
|
5
5
|
var constants = require('../../../constants.js');
|
|
6
6
|
var utils$1 = require('./utils.js');
|
|
@@ -17,7 +17,7 @@ const validateStructureMoveManyFoldersFilesSchema = utils.yup.object().shape({
|
|
|
17
17
|
}).noUnknown().required();
|
|
18
18
|
const validateDuplicatesMoveManyFoldersFilesSchema = utils.yup.object().test('are-folders-unique', 'some folders already exist', async function areFoldersUnique(value) {
|
|
19
19
|
const { folderIds, destinationFolderId } = value;
|
|
20
|
-
if (
|
|
20
|
+
if (_.isEmpty(folderIds)) return true;
|
|
21
21
|
const folders = await strapi.db.query(constants.FOLDER_MODEL_UID).findMany({
|
|
22
22
|
select: [
|
|
23
23
|
'name'
|
|
@@ -38,7 +38,7 @@ const validateDuplicatesMoveManyFoldersFilesSchema = utils.yup.object().test('ar
|
|
|
38
38
|
}
|
|
39
39
|
}
|
|
40
40
|
});
|
|
41
|
-
const duplicatedNames =
|
|
41
|
+
const duplicatedNames = _.intersection(_.map(existingFolders, 'name'), _.map(folders, 'name'));
|
|
42
42
|
if (duplicatedNames.length > 0) {
|
|
43
43
|
return this.createError({
|
|
44
44
|
message: `some folders already exists: ${duplicatedNames.join(', ')}`
|
|
@@ -48,7 +48,7 @@ const validateDuplicatesMoveManyFoldersFilesSchema = utils.yup.object().test('ar
|
|
|
48
48
|
});
|
|
49
49
|
const validateMoveFoldersNotInsideThemselvesSchema = utils.yup.object().test('dont-move-inside-self', 'folders cannot be moved inside themselves or one of its children', async function validateMoveFoldersNotInsideThemselves(value) {
|
|
50
50
|
const { folderIds, destinationFolderId } = value;
|
|
51
|
-
if (destinationFolderId === null ||
|
|
51
|
+
if (destinationFolderId === null || _.isEmpty(folderIds)) return true;
|
|
52
52
|
const destinationFolder = await strapi.db.query(constants.FOLDER_MODEL_UID).findOne({
|
|
53
53
|
select: [
|
|
54
54
|
'path'
|