@strapi/upload 5.30.0 → 5.31.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/ai/components/AIAssetCard.js +27 -7
- package/dist/admin/ai/components/AIAssetCard.js.map +1 -1
- package/dist/admin/ai/components/AIAssetCard.mjs +21 -1
- package/dist/admin/ai/components/AIAssetCard.mjs.map +1 -1
- package/dist/admin/ai/components/AIUploadModal.js +1 -1
- package/dist/admin/ai/components/AIUploadModal.js.map +1 -1
- package/dist/admin/ai/components/AIUploadModal.mjs +1 -1
- package/dist/admin/ai/components/AIUploadModal.mjs.map +1 -1
- package/dist/admin/components/AssetCard/AssetCard.js +5 -4
- package/dist/admin/components/AssetCard/AssetCard.js.map +1 -1
- package/dist/admin/components/AssetCard/AssetCard.mjs +2 -1
- package/dist/admin/components/AssetCard/AssetCard.mjs.map +1 -1
- package/dist/admin/components/AssetCard/AssetCardBase.js +1 -1
- package/dist/admin/components/AssetCard/AssetCardBase.mjs +1 -1
- package/dist/admin/components/AssetCard/DocAssetCard.js +3 -7
- package/dist/admin/components/AssetCard/DocAssetCard.js.map +1 -1
- package/dist/admin/components/AssetCard/DocAssetCard.mjs +3 -7
- package/dist/admin/components/AssetCard/DocAssetCard.mjs.map +1 -1
- package/dist/admin/components/AssetCard/ImageAssetCard.js +1 -1
- package/dist/admin/components/AssetCard/ImageAssetCard.js.map +1 -1
- package/dist/admin/components/AssetCard/ImageAssetCard.mjs +1 -1
- package/dist/admin/components/AssetCard/ImageAssetCard.mjs.map +1 -1
- package/dist/admin/components/AssetCard/UploadingAssetCard.js +5 -4
- package/dist/admin/components/AssetCard/UploadingAssetCard.js.map +1 -1
- package/dist/admin/components/AssetCard/UploadingAssetCard.mjs +2 -1
- package/dist/admin/components/AssetCard/UploadingAssetCard.mjs.map +1 -1
- package/dist/admin/components/AssetCard/VideoAssetCard.js +1 -1
- package/dist/admin/components/AssetCard/VideoAssetCard.mjs +1 -1
- package/dist/admin/components/AssetDialog/AssetDialog.js +1 -1
- package/dist/admin/components/AssetDialog/AssetDialog.mjs +1 -1
- package/dist/admin/components/AssetDialog/BrowseStep/BrowseStep.js +2 -0
- package/dist/admin/components/AssetDialog/BrowseStep/BrowseStep.js.map +1 -1
- package/dist/admin/components/AssetDialog/BrowseStep/BrowseStep.mjs +2 -0
- package/dist/admin/components/AssetDialog/BrowseStep/BrowseStep.mjs.map +1 -1
- package/dist/admin/components/AssetDialog/BrowseStep/Filters.js +1 -1
- package/dist/admin/components/AssetDialog/BrowseStep/Filters.mjs +1 -1
- package/dist/admin/components/AssetDialog/BrowseStep/SearchAsset/SearchAsset.js +1 -1
- package/dist/admin/components/AssetDialog/BrowseStep/SearchAsset/SearchAsset.mjs +1 -1
- package/dist/admin/components/AssetDialog/SelectedStep/SelectedStep.js +1 -1
- package/dist/admin/components/AssetDialog/SelectedStep/SelectedStep.mjs +1 -1
- package/dist/admin/components/Breadcrumbs/Breadcrumbs.js.map +1 -1
- package/dist/admin/components/Breadcrumbs/Breadcrumbs.mjs.map +1 -1
- package/dist/admin/components/Breadcrumbs/CrumbSimpleMenuAsync.js +1 -1
- package/dist/admin/components/Breadcrumbs/CrumbSimpleMenuAsync.mjs +1 -1
- package/dist/admin/components/BulkMoveDialog/BulkMoveDialog.js +1 -1
- package/dist/admin/components/BulkMoveDialog/BulkMoveDialog.mjs +1 -1
- package/dist/admin/components/CopyLinkButton/CopyLinkButton.js +1 -1
- package/dist/admin/components/CopyLinkButton/CopyLinkButton.mjs +1 -1
- package/dist/admin/components/EditAssetDialog/EditAssetContent.js +1 -1
- package/dist/admin/components/EditAssetDialog/EditAssetContent.js.map +1 -1
- package/dist/admin/components/EditAssetDialog/EditAssetContent.mjs +1 -1
- package/dist/admin/components/EditAssetDialog/EditAssetContent.mjs.map +1 -1
- package/dist/admin/components/EditAssetDialog/PreviewBox/AssetPreview.js +15 -34
- package/dist/admin/components/EditAssetDialog/PreviewBox/AssetPreview.js.map +1 -1
- package/dist/admin/components/EditAssetDialog/PreviewBox/AssetPreview.mjs +15 -34
- package/dist/admin/components/EditAssetDialog/PreviewBox/AssetPreview.mjs.map +1 -1
- package/dist/admin/components/EditAssetDialog/PreviewBox/CroppingActions.js +1 -1
- package/dist/admin/components/EditAssetDialog/PreviewBox/CroppingActions.mjs +1 -1
- package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.js +3 -2
- package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.js.map +1 -1
- package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.mjs +2 -1
- package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.mjs.map +1 -1
- package/dist/admin/components/EditAssetDialog/ReplaceMediaButton.js +1 -1
- package/dist/admin/components/EditAssetDialog/ReplaceMediaButton.mjs +1 -1
- package/dist/admin/components/EditFolderDialog/EditFolderDialog.js +1 -1
- package/dist/admin/components/EditFolderDialog/EditFolderDialog.mjs +1 -1
- package/dist/admin/components/EditFolderDialog/ModalHeader/ModalHeader.js +1 -1
- package/dist/admin/components/EditFolderDialog/ModalHeader/ModalHeader.mjs +1 -1
- package/dist/admin/components/EmptyAssets/EmptyAssetGrid.js.map +1 -1
- package/dist/admin/components/EmptyAssets/EmptyAssetGrid.mjs.map +1 -1
- package/dist/admin/components/FilterList/FilterList.js.map +1 -1
- package/dist/admin/components/FilterList/FilterList.mjs.map +1 -1
- package/dist/admin/components/FilterList/FilterTag.js.map +1 -1
- package/dist/admin/components/FilterList/FilterTag.mjs.map +1 -1
- package/dist/admin/components/FolderCard/FolderCardBody/FolderCardBody.js.map +1 -1
- package/dist/admin/components/FolderCard/FolderCardBody/FolderCardBody.mjs.map +1 -1
- package/dist/admin/components/FolderCard/FolderCardCheckbox/FolderCardCheckbox.js.map +1 -1
- package/dist/admin/components/FolderCard/FolderCardCheckbox/FolderCardCheckbox.mjs.map +1 -1
- package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAsset.js +8 -10
- package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAsset.js.map +1 -1
- package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAsset.mjs +5 -7
- package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAsset.mjs.map +1 -1
- package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssetActions.js +1 -1
- package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssetActions.mjs +1 -1
- package/dist/admin/components/MediaLibraryInput/Carousel/EmptyStateAsset.js +1 -0
- package/dist/admin/components/MediaLibraryInput/Carousel/EmptyStateAsset.js.map +1 -1
- package/dist/admin/components/MediaLibraryInput/Carousel/EmptyStateAsset.mjs +1 -0
- package/dist/admin/components/MediaLibraryInput/Carousel/EmptyStateAsset.mjs.map +1 -1
- package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.js +1 -1
- package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.js.map +1 -1
- package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.mjs +1 -1
- package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.mjs.map +1 -1
- package/dist/admin/components/SelectTree/Option.js.map +1 -1
- package/dist/admin/components/SelectTree/Option.mjs.map +1 -1
- package/dist/admin/components/SelectTree/SelectTree.js.map +1 -1
- package/dist/admin/components/SelectTree/SelectTree.mjs.map +1 -1
- package/dist/admin/components/SelectTree/utils/flattenTree.js.map +1 -1
- package/dist/admin/components/SelectTree/utils/flattenTree.mjs.map +1 -1
- package/dist/admin/components/SortPicker/SortPicker.js +1 -0
- package/dist/admin/components/SortPicker/SortPicker.js.map +1 -1
- package/dist/admin/components/SortPicker/SortPicker.mjs +1 -0
- package/dist/admin/components/SortPicker/SortPicker.mjs.map +1 -1
- package/dist/admin/components/TableList/CellContent.js +1 -1
- package/dist/admin/components/TableList/CellContent.mjs +1 -1
- package/dist/admin/components/TableList/PreviewCell.js +5 -4
- package/dist/admin/components/TableList/PreviewCell.js.map +1 -1
- package/dist/admin/components/TableList/PreviewCell.mjs +2 -1
- package/dist/admin/components/TableList/PreviewCell.mjs.map +1 -1
- package/dist/admin/components/TableList/TableList.js +1 -0
- package/dist/admin/components/TableList/TableList.js.map +1 -1
- package/dist/admin/components/TableList/TableList.mjs +1 -0
- package/dist/admin/components/TableList/TableList.mjs.map +1 -1
- package/dist/admin/components/TableList/TableRows.js +1 -0
- package/dist/admin/components/TableList/TableRows.js.map +1 -1
- package/dist/admin/components/TableList/TableRows.mjs +1 -0
- package/dist/admin/components/TableList/TableRows.mjs.map +1 -1
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/AddAssetStep.js +1 -1
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/AddAssetStep.mjs +1 -1
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromComputerForm.js +1 -0
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromComputerForm.js.map +1 -1
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromComputerForm.mjs +1 -0
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromComputerForm.mjs.map +1 -1
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.js +1 -1
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.mjs +1 -1
- package/dist/admin/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.js +1 -1
- package/dist/admin/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.js.map +1 -1
- package/dist/admin/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.mjs +1 -1
- package/dist/admin/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.mjs.map +1 -1
- package/dist/admin/components/UploadProgress/UploadProgress.js.map +1 -1
- package/dist/admin/components/UploadProgress/UploadProgress.mjs.map +1 -1
- package/dist/admin/constants.js +5 -10
- package/dist/admin/constants.js.map +1 -1
- package/dist/admin/constants.mjs +5 -11
- package/dist/admin/constants.mjs.map +1 -1
- package/dist/admin/enums.js +20 -0
- package/dist/admin/enums.js.map +1 -0
- package/dist/admin/enums.mjs +17 -0
- package/dist/admin/enums.mjs.map +1 -0
- package/dist/admin/hooks/useBulkEdit.js +1 -1
- package/dist/admin/hooks/useBulkEdit.mjs +1 -1
- package/dist/admin/hooks/useBulkMove.js +1 -1
- package/dist/admin/hooks/useBulkMove.mjs +1 -1
- package/dist/admin/hooks/useBulkRemove.js +1 -1
- package/dist/admin/hooks/useBulkRemove.mjs +1 -1
- package/dist/admin/hooks/useEditAsset.js +1 -1
- package/dist/admin/hooks/useEditAsset.js.map +1 -1
- package/dist/admin/hooks/useEditAsset.mjs +1 -1
- package/dist/admin/hooks/useEditAsset.mjs.map +1 -1
- package/dist/admin/hooks/useEditFolder.js.map +1 -1
- package/dist/admin/hooks/useEditFolder.mjs.map +1 -1
- package/dist/admin/hooks/useFolder.js +1 -1
- package/dist/admin/hooks/useFolder.js.map +1 -1
- package/dist/admin/hooks/useFolder.mjs +1 -1
- package/dist/admin/hooks/useFolder.mjs.map +1 -1
- package/dist/admin/hooks/useFolderStructure.js +1 -1
- package/dist/admin/hooks/useFolderStructure.mjs +1 -1
- package/dist/admin/hooks/useRemoveAsset.js.map +1 -1
- package/dist/admin/hooks/useRemoveAsset.mjs.map +1 -1
- package/dist/admin/hooks/useTracking.js +4 -1
- package/dist/admin/hooks/useTracking.js.map +1 -1
- package/dist/admin/hooks/useTracking.mjs +5 -2
- package/dist/admin/hooks/useTracking.mjs.map +1 -1
- package/dist/admin/hooks/useUpload.js.map +1 -1
- package/dist/admin/hooks/useUpload.mjs.map +1 -1
- package/dist/admin/index.js +1 -0
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +1 -0
- package/dist/admin/index.mjs.map +1 -1
- package/dist/admin/package.json.js +7 -6
- package/dist/admin/package.json.js.map +1 -1
- package/dist/admin/package.json.mjs +7 -6
- package/dist/admin/package.json.mjs.map +1 -1
- package/dist/admin/pages/App/App.js +1 -1
- package/dist/admin/pages/App/App.mjs +1 -1
- package/dist/admin/pages/App/ConfigureTheView/ConfigureTheView.js +1 -1
- package/dist/admin/pages/App/ConfigureTheView/ConfigureTheView.js.map +1 -1
- package/dist/admin/pages/App/ConfigureTheView/ConfigureTheView.mjs +1 -1
- package/dist/admin/pages/App/ConfigureTheView/ConfigureTheView.mjs.map +1 -1
- package/dist/admin/pages/App/ConfigureTheView/components/Settings.js +1 -0
- package/dist/admin/pages/App/ConfigureTheView/components/Settings.js.map +1 -1
- package/dist/admin/pages/App/ConfigureTheView/components/Settings.mjs +1 -0
- package/dist/admin/pages/App/ConfigureTheView/components/Settings.mjs.map +1 -1
- package/dist/admin/pages/App/ConfigureTheView/state/actionTypes.js.map +1 -1
- package/dist/admin/pages/App/ConfigureTheView/state/actionTypes.mjs.map +1 -1
- package/dist/admin/pages/App/MediaLibrary/MediaLibrary.js +1 -0
- package/dist/admin/pages/App/MediaLibrary/MediaLibrary.js.map +1 -1
- package/dist/admin/pages/App/MediaLibrary/MediaLibrary.mjs +1 -0
- package/dist/admin/pages/App/MediaLibrary/MediaLibrary.mjs.map +1 -1
- package/dist/admin/pages/App/MediaLibrary/components/BulkActions.js +1 -1
- package/dist/admin/pages/App/MediaLibrary/components/BulkActions.mjs +1 -1
- package/dist/admin/pages/App/MediaLibrary/components/EmptyOrNoPermissions.js +1 -1
- package/dist/admin/pages/App/MediaLibrary/components/EmptyOrNoPermissions.mjs +1 -1
- package/dist/admin/pages/App/MediaLibrary/components/Filters.js +1 -1
- package/dist/admin/pages/App/MediaLibrary/components/Filters.mjs +1 -1
- package/dist/admin/pages/App/MediaLibrary/components/Header.js +1 -1
- package/dist/admin/pages/App/MediaLibrary/components/Header.js.map +1 -1
- package/dist/admin/pages/App/MediaLibrary/components/Header.mjs +1 -1
- package/dist/admin/pages/App/MediaLibrary/components/Header.mjs.map +1 -1
- package/dist/admin/pages/SettingsPage/SettingsPage.js +1 -0
- package/dist/admin/pages/SettingsPage/SettingsPage.js.map +1 -1
- package/dist/admin/pages/SettingsPage/SettingsPage.mjs +1 -0
- package/dist/admin/pages/SettingsPage/SettingsPage.mjs.map +1 -1
- package/dist/admin/src/components/AssetCard/UploadingAssetCard.d.ts +1 -1
- package/dist/admin/src/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.d.ts +1 -1
- package/dist/admin/src/constants.d.ts +0 -6
- package/dist/admin/src/enums.d.ts +12 -0
- package/dist/admin/src/utils/icons.d.ts +14 -0
- package/dist/admin/src/utils/rawFileToAsset.d.ts +1 -1
- package/dist/admin/src/utils/typeFromMime.d.ts +2 -2
- package/dist/admin/src/utils/urlsToAssets.d.ts +1 -1
- package/dist/admin/translations/pt-BR.json.js +75 -7
- package/dist/admin/translations/pt-BR.json.js.map +1 -1
- package/dist/admin/translations/pt-BR.json.mjs +75 -7
- package/dist/admin/translations/pt-BR.json.mjs.map +1 -1
- package/dist/admin/utils/formatBytes.js.map +1 -1
- package/dist/admin/utils/formatBytes.mjs.map +1 -1
- package/dist/admin/utils/formatDuration.js.map +1 -1
- package/dist/admin/utils/formatDuration.mjs.map +1 -1
- package/dist/admin/utils/getFolderURL.js.map +1 -1
- package/dist/admin/utils/getFolderURL.mjs.map +1 -1
- package/dist/admin/utils/getTrad.js.map +1 -1
- package/dist/admin/utils/getTrad.mjs.map +1 -1
- package/dist/admin/utils/icons.js +23 -0
- package/dist/admin/utils/icons.js.map +1 -0
- package/dist/admin/utils/icons.mjs +19 -0
- package/dist/admin/utils/icons.mjs.map +1 -0
- package/dist/admin/utils/normalizeAPIError.js.map +1 -1
- package/dist/admin/utils/normalizeAPIError.mjs.map +1 -1
- package/dist/admin/utils/prefixFileUrlWithBackendUrl.js.map +1 -1
- package/dist/admin/utils/prefixFileUrlWithBackendUrl.mjs.map +1 -1
- package/dist/admin/utils/prefixPluginTranslations.js.map +1 -1
- package/dist/admin/utils/prefixPluginTranslations.mjs.map +1 -1
- package/dist/admin/utils/typeFromMime.js +15 -11
- package/dist/admin/utils/typeFromMime.js.map +1 -1
- package/dist/admin/utils/typeFromMime.mjs +15 -11
- package/dist/admin/utils/typeFromMime.mjs.map +1 -1
- package/dist/server/controllers/admin-folder-file.js.map +1 -1
- package/dist/server/controllers/admin-folder-file.mjs.map +1 -1
- package/dist/server/controllers/admin-upload.js +37 -5
- package/dist/server/controllers/admin-upload.js.map +1 -1
- package/dist/server/controllers/admin-upload.mjs +37 -5
- package/dist/server/controllers/admin-upload.mjs.map +1 -1
- package/dist/server/controllers/utils/folders.js.map +1 -1
- package/dist/server/controllers/utils/folders.mjs.map +1 -1
- package/dist/server/controllers/validation/admin/folder-file.js.map +1 -1
- package/dist/server/controllers/validation/admin/folder-file.mjs.map +1 -1
- package/dist/server/controllers/validation/admin/folder.js +1 -1
- package/dist/server/controllers/validation/admin/folder.js.map +1 -1
- package/dist/server/controllers/validation/admin/folder.mjs +1 -1
- package/dist/server/controllers/validation/admin/folder.mjs.map +1 -1
- package/dist/server/register.js.map +1 -1
- package/dist/server/register.mjs.map +1 -1
- package/dist/server/services/ai-metadata.js.map +1 -1
- package/dist/server/services/ai-metadata.mjs.map +1 -1
- package/dist/server/services/api-upload-folder.js.map +1 -1
- package/dist/server/services/api-upload-folder.mjs.map +1 -1
- package/dist/server/services/folder.js.map +1 -1
- package/dist/server/services/folder.mjs.map +1 -1
- package/dist/server/services/image-manipulation.js +1 -1
- package/dist/server/services/image-manipulation.js.map +1 -1
- package/dist/server/services/image-manipulation.mjs +1 -1
- package/dist/server/services/image-manipulation.mjs.map +1 -1
- package/dist/server/services/metrics.js +4 -1
- package/dist/server/services/metrics.js.map +1 -1
- package/dist/server/services/metrics.mjs +4 -1
- package/dist/server/services/metrics.mjs.map +1 -1
- package/dist/server/services/upload.js.map +1 -1
- package/dist/server/services/upload.mjs.map +1 -1
- package/dist/server/src/controllers/admin-upload.d.ts.map +1 -1
- package/dist/server/src/services/metrics.d.ts.map +1 -1
- package/dist/server/src/types.d.ts +1 -0
- package/dist/server/src/types.d.ts.map +1 -1
- package/dist/server/src/utils/mime-validation.d.ts +34 -0
- package/dist/server/src/utils/mime-validation.d.ts.map +1 -0
- package/dist/server/utils/cron.js.map +1 -1
- package/dist/server/utils/cron.mjs.map +1 -1
- package/dist/server/utils/mime-validation.js +218 -0
- package/dist/server/utils/mime-validation.js.map +1 -0
- package/dist/server/utils/mime-validation.mjs +211 -0
- package/dist/server/utils/mime-validation.mjs.map +1 -0
- package/package.json +7 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"folder-file.mjs","sources":["../../../../../server/src/controllers/validation/admin/folder-file.ts"],"sourcesContent":["import { intersection, map, isEmpty } from 'lodash/fp';\nimport { yup, validateYupSchema } from '@strapi/utils';\nimport { FOLDER_MODEL_UID } from '../../../constants';\nimport { folderExists } from './utils';\nimport { isFolderOrChild } from '../../utils/folders';\n\nimport type { Folder } from '../../../types';\n\nconst validateDeleteManyFoldersFilesSchema = yup\n .object()\n .shape({\n fileIds: yup.array().of(yup.strapiID().required()),\n folderIds: yup.array().of(yup.strapiID().required()),\n })\n .noUnknown()\n .required();\n\nconst validateStructureMoveManyFoldersFilesSchema = yup\n .object()\n .shape({\n destinationFolderId: yup\n .strapiID()\n .nullable()\n .defined()\n .test('folder-exists', 'destination folder does not exist', folderExists),\n fileIds: yup.array().of(yup.strapiID().required()),\n folderIds: yup.array().of(yup.strapiID().required()),\n })\n .noUnknown()\n .required();\n\nconst validateDuplicatesMoveManyFoldersFilesSchema = yup\n .object()\n .test('are-folders-unique', 'some folders already exist', async function areFoldersUnique(value) {\n const { folderIds, destinationFolderId } = value;\n if (isEmpty(folderIds)) return true;\n\n const folders = await strapi.db.query(FOLDER_MODEL_UID).findMany({\n select: ['name'],\n where: { id: { $in: folderIds } },\n });\n\n const existingFolders = await strapi.db.query(FOLDER_MODEL_UID).findMany({\n select: ['name'],\n where: { parent: { id: destinationFolderId } },\n });\n\n const duplicatedNames = intersection(map('name', folders), map('name', existingFolders));\n if (duplicatedNames.length > 0) {\n return this.createError({\n message: `some folders already exists: ${duplicatedNames.join(', ')}`,\n });\n }\n\n return true;\n });\n\nconst validateMoveFoldersNotInsideThemselvesSchema = yup\n .object()\n .test(\n 'dont-move-inside-self',\n 'folders cannot be moved inside themselves or one of its children',\n async function validateMoveFoldersNotInsideThemselves(value) {\n const { folderIds, destinationFolderId } = value;\n if (destinationFolderId === null || isEmpty(folderIds)) return true;\n\n const destinationFolder = await strapi.db.query(FOLDER_MODEL_UID).findOne({\n select: ['path'],\n where: { id: destinationFolderId },\n });\n\n const folders: Folder[] = await strapi.db.query(FOLDER_MODEL_UID).findMany({\n select: ['name', 'path'],\n where: { id: { $in: folderIds } },\n });\n\n const unmovableFoldersNames = folders\n .filter((folder) => isFolderOrChild(destinationFolder, folder))\n .map((f) => f.name);\n\n if (unmovableFoldersNames.length > 0) {\n return this.createError({\n message: `folders cannot be moved inside themselves or one of its children: ${unmovableFoldersNames.join(\n ', '\n )}`,\n });\n }\n\n return true;\n }\n );\n\nexport const validateDeleteManyFoldersFiles = validateYupSchema(\n validateDeleteManyFoldersFilesSchema\n);\n\nexport async function validateMoveManyFoldersFiles(body: unknown) {\n await validateYupSchema(validateStructureMoveManyFoldersFilesSchema)(body);\n await validateYupSchema(validateDuplicatesMoveManyFoldersFilesSchema)(body);\n await validateYupSchema(validateMoveFoldersNotInsideThemselvesSchema)(body);\n}\n"],"names":["validateDeleteManyFoldersFilesSchema","yup","object","shape","fileIds","array","of","strapiID","required","folderIds","noUnknown","validateStructureMoveManyFoldersFilesSchema","destinationFolderId","nullable","defined","test","folderExists","validateDuplicatesMoveManyFoldersFilesSchema","areFoldersUnique","value","isEmpty","folders","strapi","db","query","FOLDER_MODEL_UID","findMany","select","where","id","$in","existingFolders","parent","duplicatedNames","intersection","map","length","createError","message","join","validateMoveFoldersNotInsideThemselvesSchema","validateMoveFoldersNotInsideThemselves","destinationFolder","findOne","unmovableFoldersNames","filter","folder","isFolderOrChild","f","name","validateDeleteManyFoldersFiles","validateYupSchema","validateMoveManyFoldersFiles","body"],"mappings":";;;;;;AAQA,MAAMA,oCAAuCC,GAAAA,GAAAA,CAC1CC,MAAM,EAAA,CACNC,KAAK,CAAC;IACLC,OAASH,EAAAA,GAAAA,CAAII,KAAK,EAAGC,CAAAA,EAAE,CAACL,GAAIM,CAAAA,QAAQ,GAAGC,QAAQ,EAAA,CAAA;IAC/CC,SAAWR,EAAAA,GAAAA,CAAII,KAAK,EAAGC,CAAAA,EAAE,CAACL,GAAIM,CAAAA,QAAQ,GAAGC,QAAQ,EAAA;AACnD,CACCE,CAAAA,CAAAA,SAAS,GACTF,QAAQ,EAAA;AAEX,MAAMG,2CAA8CV,GAAAA,GAAAA,CACjDC,MAAM,EAAA,CACNC,KAAK,CAAC;IACLS,mBAAqBX,EAAAA,GAAAA,CAClBM,QAAQ,EAAA,CACRM,QAAQ,EAAA,CACRC,OAAO,EACPC,CAAAA,IAAI,CAAC,eAAA,EAAiB,mCAAqCC,EAAAA,YAAAA,CAAAA;IAC9DZ,OAASH,EAAAA,GAAAA,CAAII,KAAK,EAAGC,CAAAA,EAAE,CAACL,GAAIM,CAAAA,QAAQ,GAAGC,QAAQ,EAAA,CAAA;IAC/CC,SAAWR,EAAAA,GAAAA,CAAII,KAAK,EAAGC,CAAAA,EAAE,CAACL,GAAIM,CAAAA,QAAQ,GAAGC,QAAQ,EAAA;AACnD,CACCE,CAAAA,CAAAA,SAAS,GACTF,QAAQ,EAAA;AAEX,MAAMS,4CAAAA,GAA+ChB,GAClDC,CAAAA,MAAM,EACNa,CAAAA,IAAI,CAAC,oBAAsB,EAAA,4BAAA,EAA8B,eAAeG,gBAAAA,CAAiBC,KAAK,EAAA;AAC7F,IAAA,MAAM,EAAEV,SAAS,EAAEG,mBAAmB,EAAE,GAAGO,KAAAA;IAC3C,IAAIC,OAAAA,CAAQX,YAAY,OAAO,IAAA;IAE/B,MAAMY,OAAAA,GAAU,MAAMC,MAAOC,CAAAA,EAAE,CAACC,KAAK,CAACC,gBAAkBC,CAAAA,CAAAA,QAAQ,CAAC;QAC/DC,MAAQ,EAAA;AAAC,YAAA;AAAO,SAAA;QAChBC,KAAO,EAAA;YAAEC,EAAI,EAAA;gBAAEC,GAAKrB,EAAAA;AAAU;AAAE;AAClC,KAAA,CAAA;IAEA,MAAMsB,eAAAA,GAAkB,MAAMT,MAAOC,CAAAA,EAAE,CAACC,KAAK,CAACC,gBAAkBC,CAAAA,CAAAA,QAAQ,CAAC;QACvEC,MAAQ,EAAA;AAAC,YAAA;AAAO,SAAA;QAChBC,KAAO,EAAA;YAAEI,MAAQ,EAAA;gBAAEH,EAAIjB,EAAAA;AAAoB;AAAE;AAC/C,KAAA,CAAA;AAEA,IAAA,MAAMqB,kBAAkBC,YAAaC,CAAAA,GAAAA,CAAI,MAAQd,EAAAA,OAAAA,CAAAA,EAAUc,IAAI,MAAQJ,EAAAA,eAAAA,CAAAA,CAAAA;IACvE,IAAIE,eAAAA,CAAgBG,MAAM,GAAG,CAAG,EAAA;QAC9B,OAAO,IAAI,CAACC,WAAW,CAAC;AACtBC,YAAAA,OAAAA,EAAS,CAAC,6BAA6B,EAAEL,
|
|
1
|
+
{"version":3,"file":"folder-file.mjs","sources":["../../../../../server/src/controllers/validation/admin/folder-file.ts"],"sourcesContent":["import { intersection, map, isEmpty } from 'lodash/fp';\nimport { yup, validateYupSchema } from '@strapi/utils';\nimport { FOLDER_MODEL_UID } from '../../../constants';\nimport { folderExists } from './utils';\nimport { isFolderOrChild } from '../../utils/folders';\n\nimport type { Folder } from '../../../types';\n\nconst validateDeleteManyFoldersFilesSchema = yup\n .object()\n .shape({\n fileIds: yup.array().of(yup.strapiID().required()),\n folderIds: yup.array().of(yup.strapiID().required()),\n })\n .noUnknown()\n .required();\n\nconst validateStructureMoveManyFoldersFilesSchema = yup\n .object()\n .shape({\n destinationFolderId: yup\n .strapiID()\n .nullable()\n .defined()\n .test('folder-exists', 'destination folder does not exist', folderExists),\n fileIds: yup.array().of(yup.strapiID().required()),\n folderIds: yup.array().of(yup.strapiID().required()),\n })\n .noUnknown()\n .required();\n\nconst validateDuplicatesMoveManyFoldersFilesSchema = yup\n .object()\n .test('are-folders-unique', 'some folders already exist', async function areFoldersUnique(value) {\n const { folderIds, destinationFolderId } = value;\n if (isEmpty(folderIds)) return true;\n\n const folders = await strapi.db.query(FOLDER_MODEL_UID).findMany({\n select: ['name'],\n where: { id: { $in: folderIds } },\n });\n\n const existingFolders = await strapi.db.query(FOLDER_MODEL_UID).findMany({\n select: ['name'],\n where: { parent: { id: destinationFolderId } },\n });\n\n const duplicatedNames = intersection(map('name', folders), map('name', existingFolders));\n if (duplicatedNames.length > 0) {\n return this.createError({\n message: `some folders already exists: ${duplicatedNames.join(', ')}`,\n });\n }\n\n return true;\n });\n\nconst validateMoveFoldersNotInsideThemselvesSchema = yup\n .object()\n .test(\n 'dont-move-inside-self',\n 'folders cannot be moved inside themselves or one of its children',\n async function validateMoveFoldersNotInsideThemselves(value) {\n const { folderIds, destinationFolderId } = value;\n if (destinationFolderId === null || isEmpty(folderIds)) return true;\n\n const destinationFolder = await strapi.db.query(FOLDER_MODEL_UID).findOne({\n select: ['path'],\n where: { id: destinationFolderId },\n });\n\n const folders: Folder[] = await strapi.db.query(FOLDER_MODEL_UID).findMany({\n select: ['name', 'path'],\n where: { id: { $in: folderIds } },\n });\n\n const unmovableFoldersNames = folders\n .filter((folder) => isFolderOrChild(destinationFolder, folder))\n .map((f) => f.name);\n\n if (unmovableFoldersNames.length > 0) {\n return this.createError({\n message: `folders cannot be moved inside themselves or one of its children: ${unmovableFoldersNames.join(\n ', '\n )}`,\n });\n }\n\n return true;\n }\n );\n\nexport const validateDeleteManyFoldersFiles = validateYupSchema(\n validateDeleteManyFoldersFilesSchema\n);\n\nexport async function validateMoveManyFoldersFiles(body: unknown) {\n await validateYupSchema(validateStructureMoveManyFoldersFilesSchema)(body);\n await validateYupSchema(validateDuplicatesMoveManyFoldersFilesSchema)(body);\n await validateYupSchema(validateMoveFoldersNotInsideThemselvesSchema)(body);\n}\n"],"names":["validateDeleteManyFoldersFilesSchema","yup","object","shape","fileIds","array","of","strapiID","required","folderIds","noUnknown","validateStructureMoveManyFoldersFilesSchema","destinationFolderId","nullable","defined","test","folderExists","validateDuplicatesMoveManyFoldersFilesSchema","areFoldersUnique","value","isEmpty","folders","strapi","db","query","FOLDER_MODEL_UID","findMany","select","where","id","$in","existingFolders","parent","duplicatedNames","intersection","map","length","createError","message","join","validateMoveFoldersNotInsideThemselvesSchema","validateMoveFoldersNotInsideThemselves","destinationFolder","findOne","unmovableFoldersNames","filter","folder","isFolderOrChild","f","name","validateDeleteManyFoldersFiles","validateYupSchema","validateMoveManyFoldersFiles","body"],"mappings":"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"}
|
|
@@ -8,7 +8,7 @@ var utils$1 = require('./utils.js');
|
|
|
8
8
|
var folders = require('../../utils/folders.js');
|
|
9
9
|
|
|
10
10
|
const NO_SLASH_REGEX = /^[^/]+$/;
|
|
11
|
-
const NO_SPACES_AROUND =
|
|
11
|
+
const NO_SPACES_AROUND = /^(?! ).+(?<! )$/;
|
|
12
12
|
const isNameUniqueInFolder = (id)=>{
|
|
13
13
|
return async function test(name) {
|
|
14
14
|
const { exists } = index.getService('folder');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"folder.js","sources":["../../../../../server/src/controllers/validation/admin/folder.ts"],"sourcesContent":["import { isUndefined, get, isNil } from 'lodash/fp';\nimport { yup, validateYupSchema } from '@strapi/utils';\nimport { getService } from '../../../utils';\nimport { FOLDER_MODEL_UID } from '../../../constants';\nimport { folderExists } from './utils';\nimport { isFolderOrChild } from '../../utils/folders';\n\nconst NO_SLASH_REGEX = /^[^/]+$/;\nconst NO_SPACES_AROUND = /^(?! ).+(?<! )$/;\n\nconst isNameUniqueInFolder = (id?: number): yup.TestFunction<string | undefined> => {\n return async function test(name?: string) {\n const { exists } = getService('folder');\n const filters: Record<string, unknown> = { name, parent: this.parent.parent || null };\n if (id) {\n filters.id = { $ne: id };\n\n if (isUndefined(name)) {\n const existingFolder = await strapi.db.query(FOLDER_MODEL_UID).findOne({ where: { id } });\n filters.name = get('name', existingFolder);\n }\n }\n\n const doesExist = await exists(filters);\n return !doesExist;\n };\n};\n\nconst validateCreateFolderSchema = yup\n .object()\n .shape({\n name: yup\n .string()\n .min(1)\n .matches(NO_SLASH_REGEX, 'name cannot contain slashes')\n .matches(NO_SPACES_AROUND, 'name cannot start or end with a whitespace')\n .required()\n .test('is-folder-unique', 'A folder with this name already exists', isNameUniqueInFolder()),\n parent: yup\n .strapiID()\n .nullable()\n .test('folder-exists', 'parent folder does not exist', folderExists),\n })\n .noUnknown()\n .required();\n\nconst validateUpdateFolderSchema = (id: number) =>\n yup\n .object()\n .shape({\n name: yup\n .string()\n .min(1)\n .matches(NO_SLASH_REGEX, 'name cannot contain slashes')\n .matches(NO_SPACES_AROUND, 'name cannot start or end with a whitespace')\n .test(\n 'is-folder-unique',\n 'A folder with this name already exists',\n isNameUniqueInFolder(id)\n ),\n parent: yup\n .strapiID()\n .nullable()\n .test('folder-exists', 'parent folder does not exist', folderExists)\n .test(\n 'dont-move-inside-self',\n 'folder cannot be moved inside itself',\n async function test(parent) {\n if (isNil(parent)) return true;\n\n const destinationFolder = await strapi.db.query(FOLDER_MODEL_UID).findOne({\n select: ['path'],\n where: { id: parent },\n });\n\n const currentFolder = await strapi.db.query(FOLDER_MODEL_UID).findOne({\n select: ['path'],\n where: { id },\n });\n\n if (!destinationFolder || !currentFolder) return true;\n\n return !isFolderOrChild(destinationFolder, currentFolder);\n }\n ),\n })\n .noUnknown()\n .required();\n\nexport const validateCreateFolder = validateYupSchema(validateCreateFolderSchema);\nexport const validateUpdateFolder = (id: number) =>\n validateYupSchema(validateUpdateFolderSchema(id));\n"],"names":["NO_SLASH_REGEX","NO_SPACES_AROUND","isNameUniqueInFolder","id","test","name","exists","getService","filters","parent","$ne","isUndefined","existingFolder","strapi","db","query","FOLDER_MODEL_UID","findOne","where","get","doesExist","validateCreateFolderSchema","yup","object","shape","string","min","matches","required","strapiID","nullable","folderExists","noUnknown","validateUpdateFolderSchema","isNil","destinationFolder","select","currentFolder","isFolderOrChild","validateCreateFolder","validateYupSchema","validateUpdateFolder"],"mappings":";;;;;;;;;AAOA,MAAMA,cAAiB,GAAA,SAAA;AACvB,MAAMC,gBAAmB,GAAA,
|
|
1
|
+
{"version":3,"file":"folder.js","sources":["../../../../../server/src/controllers/validation/admin/folder.ts"],"sourcesContent":["import { isUndefined, get, isNil } from 'lodash/fp';\nimport { yup, validateYupSchema } from '@strapi/utils';\nimport { getService } from '../../../utils';\nimport { FOLDER_MODEL_UID } from '../../../constants';\nimport { folderExists } from './utils';\nimport { isFolderOrChild } from '../../utils/folders';\n\nconst NO_SLASH_REGEX = /^[^/]+$/;\nconst NO_SPACES_AROUND = /^(?! ).+(?<! )$/;\n\nconst isNameUniqueInFolder = (id?: number): yup.TestFunction<string | undefined> => {\n return async function test(name?: string) {\n const { exists } = getService('folder');\n const filters: Record<string, unknown> = { name, parent: this.parent.parent || null };\n if (id) {\n filters.id = { $ne: id };\n\n if (isUndefined(name)) {\n const existingFolder = await strapi.db.query(FOLDER_MODEL_UID).findOne({ where: { id } });\n filters.name = get('name', existingFolder);\n }\n }\n\n const doesExist = await exists(filters);\n return !doesExist;\n };\n};\n\nconst validateCreateFolderSchema = yup\n .object()\n .shape({\n name: yup\n .string()\n .min(1)\n .matches(NO_SLASH_REGEX, 'name cannot contain slashes')\n .matches(NO_SPACES_AROUND, 'name cannot start or end with a whitespace')\n .required()\n .test('is-folder-unique', 'A folder with this name already exists', isNameUniqueInFolder()),\n parent: yup\n .strapiID()\n .nullable()\n .test('folder-exists', 'parent folder does not exist', folderExists),\n })\n .noUnknown()\n .required();\n\nconst validateUpdateFolderSchema = (id: number) =>\n yup\n .object()\n .shape({\n name: yup\n .string()\n .min(1)\n .matches(NO_SLASH_REGEX, 'name cannot contain slashes')\n .matches(NO_SPACES_AROUND, 'name cannot start or end with a whitespace')\n .test(\n 'is-folder-unique',\n 'A folder with this name already exists',\n isNameUniqueInFolder(id)\n ),\n parent: yup\n .strapiID()\n .nullable()\n .test('folder-exists', 'parent folder does not exist', folderExists)\n .test(\n 'dont-move-inside-self',\n 'folder cannot be moved inside itself',\n async function test(parent) {\n if (isNil(parent)) return true;\n\n const destinationFolder = await strapi.db.query(FOLDER_MODEL_UID).findOne({\n select: ['path'],\n where: { id: parent },\n });\n\n const currentFolder = await strapi.db.query(FOLDER_MODEL_UID).findOne({\n select: ['path'],\n where: { id },\n });\n\n if (!destinationFolder || !currentFolder) return true;\n\n return !isFolderOrChild(destinationFolder, currentFolder);\n }\n ),\n })\n .noUnknown()\n .required();\n\nexport const validateCreateFolder = validateYupSchema(validateCreateFolderSchema);\nexport const validateUpdateFolder = (id: number) =>\n validateYupSchema(validateUpdateFolderSchema(id));\n"],"names":["NO_SLASH_REGEX","NO_SPACES_AROUND","isNameUniqueInFolder","id","test","name","exists","getService","filters","parent","$ne","isUndefined","existingFolder","strapi","db","query","FOLDER_MODEL_UID","findOne","where","get","doesExist","validateCreateFolderSchema","yup","object","shape","string","min","matches","required","strapiID","nullable","folderExists","noUnknown","validateUpdateFolderSchema","isNil","destinationFolder","select","currentFolder","isFolderOrChild","validateCreateFolder","validateYupSchema","validateUpdateFolder"],"mappings":"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"}
|
|
@@ -6,7 +6,7 @@ import { folderExists } from './utils.mjs';
|
|
|
6
6
|
import { isFolderOrChild } from '../../utils/folders.mjs';
|
|
7
7
|
|
|
8
8
|
const NO_SLASH_REGEX = /^[^/]+$/;
|
|
9
|
-
const NO_SPACES_AROUND =
|
|
9
|
+
const NO_SPACES_AROUND = /^(?! ).+(?<! )$/;
|
|
10
10
|
const isNameUniqueInFolder = (id)=>{
|
|
11
11
|
return async function test(name) {
|
|
12
12
|
const { exists } = getService('folder');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"folder.mjs","sources":["../../../../../server/src/controllers/validation/admin/folder.ts"],"sourcesContent":["import { isUndefined, get, isNil } from 'lodash/fp';\nimport { yup, validateYupSchema } from '@strapi/utils';\nimport { getService } from '../../../utils';\nimport { FOLDER_MODEL_UID } from '../../../constants';\nimport { folderExists } from './utils';\nimport { isFolderOrChild } from '../../utils/folders';\n\nconst NO_SLASH_REGEX = /^[^/]+$/;\nconst NO_SPACES_AROUND = /^(?! ).+(?<! )$/;\n\nconst isNameUniqueInFolder = (id?: number): yup.TestFunction<string | undefined> => {\n return async function test(name?: string) {\n const { exists } = getService('folder');\n const filters: Record<string, unknown> = { name, parent: this.parent.parent || null };\n if (id) {\n filters.id = { $ne: id };\n\n if (isUndefined(name)) {\n const existingFolder = await strapi.db.query(FOLDER_MODEL_UID).findOne({ where: { id } });\n filters.name = get('name', existingFolder);\n }\n }\n\n const doesExist = await exists(filters);\n return !doesExist;\n };\n};\n\nconst validateCreateFolderSchema = yup\n .object()\n .shape({\n name: yup\n .string()\n .min(1)\n .matches(NO_SLASH_REGEX, 'name cannot contain slashes')\n .matches(NO_SPACES_AROUND, 'name cannot start or end with a whitespace')\n .required()\n .test('is-folder-unique', 'A folder with this name already exists', isNameUniqueInFolder()),\n parent: yup\n .strapiID()\n .nullable()\n .test('folder-exists', 'parent folder does not exist', folderExists),\n })\n .noUnknown()\n .required();\n\nconst validateUpdateFolderSchema = (id: number) =>\n yup\n .object()\n .shape({\n name: yup\n .string()\n .min(1)\n .matches(NO_SLASH_REGEX, 'name cannot contain slashes')\n .matches(NO_SPACES_AROUND, 'name cannot start or end with a whitespace')\n .test(\n 'is-folder-unique',\n 'A folder with this name already exists',\n isNameUniqueInFolder(id)\n ),\n parent: yup\n .strapiID()\n .nullable()\n .test('folder-exists', 'parent folder does not exist', folderExists)\n .test(\n 'dont-move-inside-self',\n 'folder cannot be moved inside itself',\n async function test(parent) {\n if (isNil(parent)) return true;\n\n const destinationFolder = await strapi.db.query(FOLDER_MODEL_UID).findOne({\n select: ['path'],\n where: { id: parent },\n });\n\n const currentFolder = await strapi.db.query(FOLDER_MODEL_UID).findOne({\n select: ['path'],\n where: { id },\n });\n\n if (!destinationFolder || !currentFolder) return true;\n\n return !isFolderOrChild(destinationFolder, currentFolder);\n }\n ),\n })\n .noUnknown()\n .required();\n\nexport const validateCreateFolder = validateYupSchema(validateCreateFolderSchema);\nexport const validateUpdateFolder = (id: number) =>\n validateYupSchema(validateUpdateFolderSchema(id));\n"],"names":["NO_SLASH_REGEX","NO_SPACES_AROUND","isNameUniqueInFolder","id","test","name","exists","getService","filters","parent","$ne","isUndefined","existingFolder","strapi","db","query","FOLDER_MODEL_UID","findOne","where","get","doesExist","validateCreateFolderSchema","yup","object","shape","string","min","matches","required","strapiID","nullable","folderExists","noUnknown","validateUpdateFolderSchema","isNil","destinationFolder","select","currentFolder","isFolderOrChild","validateCreateFolder","validateYupSchema","validateUpdateFolder"],"mappings":";;;;;;;AAOA,MAAMA,cAAiB,GAAA,SAAA;AACvB,MAAMC,gBAAmB,GAAA,
|
|
1
|
+
{"version":3,"file":"folder.mjs","sources":["../../../../../server/src/controllers/validation/admin/folder.ts"],"sourcesContent":["import { isUndefined, get, isNil } from 'lodash/fp';\nimport { yup, validateYupSchema } from '@strapi/utils';\nimport { getService } from '../../../utils';\nimport { FOLDER_MODEL_UID } from '../../../constants';\nimport { folderExists } from './utils';\nimport { isFolderOrChild } from '../../utils/folders';\n\nconst NO_SLASH_REGEX = /^[^/]+$/;\nconst NO_SPACES_AROUND = /^(?! ).+(?<! )$/;\n\nconst isNameUniqueInFolder = (id?: number): yup.TestFunction<string | undefined> => {\n return async function test(name?: string) {\n const { exists } = getService('folder');\n const filters: Record<string, unknown> = { name, parent: this.parent.parent || null };\n if (id) {\n filters.id = { $ne: id };\n\n if (isUndefined(name)) {\n const existingFolder = await strapi.db.query(FOLDER_MODEL_UID).findOne({ where: { id } });\n filters.name = get('name', existingFolder);\n }\n }\n\n const doesExist = await exists(filters);\n return !doesExist;\n };\n};\n\nconst validateCreateFolderSchema = yup\n .object()\n .shape({\n name: yup\n .string()\n .min(1)\n .matches(NO_SLASH_REGEX, 'name cannot contain slashes')\n .matches(NO_SPACES_AROUND, 'name cannot start or end with a whitespace')\n .required()\n .test('is-folder-unique', 'A folder with this name already exists', isNameUniqueInFolder()),\n parent: yup\n .strapiID()\n .nullable()\n .test('folder-exists', 'parent folder does not exist', folderExists),\n })\n .noUnknown()\n .required();\n\nconst validateUpdateFolderSchema = (id: number) =>\n yup\n .object()\n .shape({\n name: yup\n .string()\n .min(1)\n .matches(NO_SLASH_REGEX, 'name cannot contain slashes')\n .matches(NO_SPACES_AROUND, 'name cannot start or end with a whitespace')\n .test(\n 'is-folder-unique',\n 'A folder with this name already exists',\n isNameUniqueInFolder(id)\n ),\n parent: yup\n .strapiID()\n .nullable()\n .test('folder-exists', 'parent folder does not exist', folderExists)\n .test(\n 'dont-move-inside-self',\n 'folder cannot be moved inside itself',\n async function test(parent) {\n if (isNil(parent)) return true;\n\n const destinationFolder = await strapi.db.query(FOLDER_MODEL_UID).findOne({\n select: ['path'],\n where: { id: parent },\n });\n\n const currentFolder = await strapi.db.query(FOLDER_MODEL_UID).findOne({\n select: ['path'],\n where: { id },\n });\n\n if (!destinationFolder || !currentFolder) return true;\n\n return !isFolderOrChild(destinationFolder, currentFolder);\n }\n ),\n })\n .noUnknown()\n .required();\n\nexport const validateCreateFolder = validateYupSchema(validateCreateFolderSchema);\nexport const validateUpdateFolder = (id: number) =>\n validateYupSchema(validateUpdateFolderSchema(id));\n"],"names":["NO_SLASH_REGEX","NO_SPACES_AROUND","isNameUniqueInFolder","id","test","name","exists","getService","filters","parent","$ne","isUndefined","existingFolder","strapi","db","query","FOLDER_MODEL_UID","findOne","where","get","doesExist","validateCreateFolderSchema","yup","object","shape","string","min","matches","required","strapiID","nullable","folderExists","noUnknown","validateUpdateFolderSchema","isNil","destinationFolder","select","currentFolder","isFolderOrChild","validateCreateFolder","validateYupSchema","validateUpdateFolder"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register.js","sources":["../../server/src/register.ts"],"sourcesContent":["import _ from 'lodash';\n\nimport { errors, file } from '@strapi/utils';\nimport type { Core } from '@strapi/types';\n\nimport registerUploadMiddleware from './middlewares/upload';\nimport spec from '../../documentation/content-api.json';\nimport type { Config, File, InputFile } from './types';\n\nconst { PayloadTooLargeError } = errors;\nconst { bytesToHumanReadable, kbytesToBytes } = file;\n\n/**\n * Register upload plugin\n */\nexport async function register({ strapi }: { strapi: Core.Strapi }) {\n strapi.plugin('upload').provider = createProvider(strapi.config.get<Config>('plugin::upload'));\n\n await registerUploadMiddleware({ strapi });\n\n if (strapi.plugin('graphql')) {\n const { installGraphqlExtension } = await import('./graphql.js');\n installGraphqlExtension({ strapi });\n }\n\n if (strapi.plugin('documentation')) {\n strapi\n .plugin('documentation')\n .service('override')\n .registerOverride(spec, {\n pluginOrigin: 'upload',\n excludeFromGeneration: ['upload'],\n });\n }\n}\n\nconst createProvider = (config: Config) => {\n const { providerOptions, actionOptions = {} } = config;\n\n const providerName = _.toLower(config.provider);\n let provider;\n\n let modulePath;\n try {\n modulePath = require.resolve(`@strapi/provider-upload-${providerName}`);\n } catch (error) {\n if (\n typeof error === 'object' &&\n error !== null &&\n 'code' in error &&\n error.code === 'MODULE_NOT_FOUND'\n ) {\n modulePath = providerName;\n } else {\n throw error;\n }\n }\n\n try {\n provider = require(modulePath);\n } catch (err) {\n const newError = new Error(`Could not load upload provider \"${providerName}\".`);\n\n if (err instanceof Error) {\n newError.stack = err.stack;\n }\n\n throw newError;\n }\n\n const providerInstance = provider.init(providerOptions);\n\n if (!providerInstance.delete) {\n throw new Error(`The upload provider \"${providerName}\" doesn't implement the delete method.`);\n }\n\n if (!providerInstance.upload && !providerInstance.uploadStream) {\n throw new Error(\n `The upload provider \"${providerName}\" doesn't implement the uploadStream nor the upload method.`\n );\n }\n\n if (!providerInstance.uploadStream) {\n process.emitWarning(\n `The upload provider \"${providerName}\" doesn't implement the uploadStream function. Strapi will fallback on the upload method. Some performance issues may occur.`\n );\n }\n\n const wrappedProvider = _.mapValues(providerInstance, (method, methodName) => {\n return async (file: File, options = actionOptions[methodName]) =>\n providerInstance[methodName](file, options);\n });\n\n return Object.assign(Object.create(baseProvider), wrappedProvider);\n};\n\nconst baseProvider = {\n extend(obj: unknown) {\n Object.assign(this, obj);\n },\n checkFileSize(file: InputFile, { sizeLimit }: { sizeLimit: number }) {\n if (sizeLimit && kbytesToBytes(file.size) > sizeLimit) {\n throw new PayloadTooLargeError(\n `${file.originalFilename} exceeds size limit of ${bytesToHumanReadable(sizeLimit)}.`\n );\n }\n },\n getSignedUrl(file: File) {\n return file;\n },\n isPrivate() {\n return false;\n },\n};\n"],"names":["PayloadTooLargeError","errors","bytesToHumanReadable","kbytesToBytes","file","register","strapi","plugin","provider","createProvider","config","get","registerUploadMiddleware","installGraphqlExtension","service","registerOverride","spec","pluginOrigin","excludeFromGeneration","providerOptions","actionOptions","providerName","_","toLower","modulePath","require","resolve","error","code","err","newError","Error","stack","providerInstance","init","delete","upload","uploadStream","process","emitWarning","wrappedProvider","mapValues","method","methodName","options","Object","assign","create","baseProvider","extend","obj","checkFileSize","sizeLimit","size","originalFilename","getSignedUrl","isPrivate"],"mappings":";;;;;;;AASA,MAAM,EAAEA,oBAAoB,EAAE,GAAGC,YAAAA;AACjC,MAAM,EAAEC,oBAAoB,EAAEC,aAAa,EAAE,GAAGC,UAAAA;AAEhD;;AAEC,IACM,eAAeC,QAAS,CAAA,EAAEC,MAAM,EAA2B,EAAA;IAChEA,MAAOC,CAAAA,MAAM,CAAC,QAAA,CAAA,CAAUC,QAAQ,GAAGC,eAAeH,MAAOI,CAAAA,MAAM,CAACC,GAAG,CAAS,gBAAA,CAAA,CAAA;AAE5E,IAAA,MAAMC,MAAyB,CAAA;AAAEN,QAAAA;AAAO,KAAA,CAAA;IAExC,IAAIA,MAAAA,CAAOC,MAAM,CAAC,SAAY,CAAA,EAAA;AAC5B,QAAA,MAAM,EAAEM,uBAAuB,EAAE,GAAG,MAAM,oDAAO,cAAA,KAAA;QACjDA,uBAAwB,CAAA;AAAEP,YAAAA;AAAO,SAAA,CAAA;AACnC;IAEA,IAAIA,MAAAA,CAAOC,MAAM,CAAC,eAAkB,CAAA,EAAA;QAClCD,MACGC,CAAAA,MAAM,CAAC,eACPO,CAAAA,CAAAA,OAAO,CAAC,UACRC,CAAAA,CAAAA,gBAAgB,CAACC,kBAAM,EAAA;YACtBC,YAAc,EAAA,QAAA;YACdC,qBAAuB,EAAA;AAAC,gBAAA;AAAS;AACnC,SAAA,CAAA;AACJ;AACF;AAEA,MAAMT,iBAAiB,CAACC,MAAAA,GAAAA;AACtB,IAAA,MAAM,EAAES,eAAe,EAAEC,gBAAgB,EAAE,EAAE,GAAGV,MAAAA;AAEhD,IAAA,MAAMW,YAAeC,GAAAA,CAAAA,CAAEC,OAAO,CAACb,OAAOF,QAAQ,CAAA;IAC9C,IAAIA,QAAAA;IAEJ,IAAIgB,UAAAA;IACJ,IAAI;AACFA,QAAAA,UAAAA,GAAaC,QAAQC,OAAO,CAAC,CAAC,wBAAwB,EAAEL,
|
|
1
|
+
{"version":3,"file":"register.js","sources":["../../server/src/register.ts"],"sourcesContent":["import _ from 'lodash';\n\nimport { errors, file } from '@strapi/utils';\nimport type { Core } from '@strapi/types';\n\nimport registerUploadMiddleware from './middlewares/upload';\nimport spec from '../../documentation/content-api.json';\nimport type { Config, File, InputFile } from './types';\n\nconst { PayloadTooLargeError } = errors;\nconst { bytesToHumanReadable, kbytesToBytes } = file;\n\n/**\n * Register upload plugin\n */\nexport async function register({ strapi }: { strapi: Core.Strapi }) {\n strapi.plugin('upload').provider = createProvider(strapi.config.get<Config>('plugin::upload'));\n\n await registerUploadMiddleware({ strapi });\n\n if (strapi.plugin('graphql')) {\n const { installGraphqlExtension } = await import('./graphql.js');\n installGraphqlExtension({ strapi });\n }\n\n if (strapi.plugin('documentation')) {\n strapi\n .plugin('documentation')\n .service('override')\n .registerOverride(spec, {\n pluginOrigin: 'upload',\n excludeFromGeneration: ['upload'],\n });\n }\n}\n\nconst createProvider = (config: Config) => {\n const { providerOptions, actionOptions = {} } = config;\n\n const providerName = _.toLower(config.provider);\n let provider;\n\n let modulePath;\n try {\n modulePath = require.resolve(`@strapi/provider-upload-${providerName}`);\n } catch (error) {\n if (\n typeof error === 'object' &&\n error !== null &&\n 'code' in error &&\n error.code === 'MODULE_NOT_FOUND'\n ) {\n modulePath = providerName;\n } else {\n throw error;\n }\n }\n\n try {\n provider = require(modulePath);\n } catch (err) {\n const newError = new Error(`Could not load upload provider \"${providerName}\".`);\n\n if (err instanceof Error) {\n newError.stack = err.stack;\n }\n\n throw newError;\n }\n\n const providerInstance = provider.init(providerOptions);\n\n if (!providerInstance.delete) {\n throw new Error(`The upload provider \"${providerName}\" doesn't implement the delete method.`);\n }\n\n if (!providerInstance.upload && !providerInstance.uploadStream) {\n throw new Error(\n `The upload provider \"${providerName}\" doesn't implement the uploadStream nor the upload method.`\n );\n }\n\n if (!providerInstance.uploadStream) {\n process.emitWarning(\n `The upload provider \"${providerName}\" doesn't implement the uploadStream function. Strapi will fallback on the upload method. Some performance issues may occur.`\n );\n }\n\n const wrappedProvider = _.mapValues(providerInstance, (method, methodName) => {\n return async (file: File, options = actionOptions[methodName]) =>\n providerInstance[methodName](file, options);\n });\n\n return Object.assign(Object.create(baseProvider), wrappedProvider);\n};\n\nconst baseProvider = {\n extend(obj: unknown) {\n Object.assign(this, obj);\n },\n checkFileSize(file: InputFile, { sizeLimit }: { sizeLimit: number }) {\n if (sizeLimit && kbytesToBytes(file.size) > sizeLimit) {\n throw new PayloadTooLargeError(\n `${file.originalFilename} exceeds size limit of ${bytesToHumanReadable(sizeLimit)}.`\n );\n }\n },\n getSignedUrl(file: File) {\n return file;\n },\n isPrivate() {\n return false;\n },\n};\n"],"names":["PayloadTooLargeError","errors","bytesToHumanReadable","kbytesToBytes","file","register","strapi","plugin","provider","createProvider","config","get","registerUploadMiddleware","installGraphqlExtension","service","registerOverride","spec","pluginOrigin","excludeFromGeneration","providerOptions","actionOptions","providerName","_","toLower","modulePath","require","resolve","error","code","err","newError","Error","stack","providerInstance","init","delete","upload","uploadStream","process","emitWarning","wrappedProvider","mapValues","method","methodName","options","Object","assign","create","baseProvider","extend","obj","checkFileSize","sizeLimit","size","originalFilename","getSignedUrl","isPrivate"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register.mjs","sources":["../../server/src/register.ts"],"sourcesContent":["import _ from 'lodash';\n\nimport { errors, file } from '@strapi/utils';\nimport type { Core } from '@strapi/types';\n\nimport registerUploadMiddleware from './middlewares/upload';\nimport spec from '../../documentation/content-api.json';\nimport type { Config, File, InputFile } from './types';\n\nconst { PayloadTooLargeError } = errors;\nconst { bytesToHumanReadable, kbytesToBytes } = file;\n\n/**\n * Register upload plugin\n */\nexport async function register({ strapi }: { strapi: Core.Strapi }) {\n strapi.plugin('upload').provider = createProvider(strapi.config.get<Config>('plugin::upload'));\n\n await registerUploadMiddleware({ strapi });\n\n if (strapi.plugin('graphql')) {\n const { installGraphqlExtension } = await import('./graphql.js');\n installGraphqlExtension({ strapi });\n }\n\n if (strapi.plugin('documentation')) {\n strapi\n .plugin('documentation')\n .service('override')\n .registerOverride(spec, {\n pluginOrigin: 'upload',\n excludeFromGeneration: ['upload'],\n });\n }\n}\n\nconst createProvider = (config: Config) => {\n const { providerOptions, actionOptions = {} } = config;\n\n const providerName = _.toLower(config.provider);\n let provider;\n\n let modulePath;\n try {\n modulePath = require.resolve(`@strapi/provider-upload-${providerName}`);\n } catch (error) {\n if (\n typeof error === 'object' &&\n error !== null &&\n 'code' in error &&\n error.code === 'MODULE_NOT_FOUND'\n ) {\n modulePath = providerName;\n } else {\n throw error;\n }\n }\n\n try {\n provider = require(modulePath);\n } catch (err) {\n const newError = new Error(`Could not load upload provider \"${providerName}\".`);\n\n if (err instanceof Error) {\n newError.stack = err.stack;\n }\n\n throw newError;\n }\n\n const providerInstance = provider.init(providerOptions);\n\n if (!providerInstance.delete) {\n throw new Error(`The upload provider \"${providerName}\" doesn't implement the delete method.`);\n }\n\n if (!providerInstance.upload && !providerInstance.uploadStream) {\n throw new Error(\n `The upload provider \"${providerName}\" doesn't implement the uploadStream nor the upload method.`\n );\n }\n\n if (!providerInstance.uploadStream) {\n process.emitWarning(\n `The upload provider \"${providerName}\" doesn't implement the uploadStream function. Strapi will fallback on the upload method. Some performance issues may occur.`\n );\n }\n\n const wrappedProvider = _.mapValues(providerInstance, (method, methodName) => {\n return async (file: File, options = actionOptions[methodName]) =>\n providerInstance[methodName](file, options);\n });\n\n return Object.assign(Object.create(baseProvider), wrappedProvider);\n};\n\nconst baseProvider = {\n extend(obj: unknown) {\n Object.assign(this, obj);\n },\n checkFileSize(file: InputFile, { sizeLimit }: { sizeLimit: number }) {\n if (sizeLimit && kbytesToBytes(file.size) > sizeLimit) {\n throw new PayloadTooLargeError(\n `${file.originalFilename} exceeds size limit of ${bytesToHumanReadable(sizeLimit)}.`\n );\n }\n },\n getSignedUrl(file: File) {\n return file;\n },\n isPrivate() {\n return false;\n },\n};\n"],"names":["PayloadTooLargeError","errors","bytesToHumanReadable","kbytesToBytes","file","register","strapi","plugin","provider","createProvider","config","get","registerUploadMiddleware","installGraphqlExtension","service","registerOverride","spec","pluginOrigin","excludeFromGeneration","providerOptions","actionOptions","providerName","_","toLower","modulePath","require","resolve","error","code","err","newError","Error","stack","providerInstance","init","delete","upload","uploadStream","process","emitWarning","wrappedProvider","mapValues","method","methodName","options","Object","assign","create","baseProvider","extend","obj","checkFileSize","sizeLimit","size","originalFilename","getSignedUrl","isPrivate"],"mappings":";;;;;AASA,MAAM,EAAEA,oBAAoB,EAAE,GAAGC,MAAAA;AACjC,MAAM,EAAEC,oBAAoB,EAAEC,aAAa,EAAE,GAAGC,IAAAA;AAEhD;;AAEC,IACM,eAAeC,QAAS,CAAA,EAAEC,MAAM,EAA2B,EAAA;IAChEA,MAAOC,CAAAA,MAAM,CAAC,QAAA,CAAA,CAAUC,QAAQ,GAAGC,eAAeH,MAAOI,CAAAA,MAAM,CAACC,GAAG,CAAS,gBAAA,CAAA,CAAA;AAE5E,IAAA,MAAMC,wBAAyB,CAAA;AAAEN,QAAAA;AAAO,KAAA,CAAA;IAExC,IAAIA,MAAAA,CAAOC,MAAM,CAAC,SAAY,CAAA,EAAA;AAC5B,QAAA,MAAM,EAAEM,uBAAuB,EAAE,GAAG,MAAM,OAAO,eAAA,CAAA;QACjDA,uBAAwB,CAAA;AAAEP,YAAAA;AAAO,SAAA,CAAA;AACnC;IAEA,IAAIA,MAAAA,CAAOC,MAAM,CAAC,eAAkB,CAAA,EAAA;QAClCD,MACGC,CAAAA,MAAM,CAAC,eACPO,CAAAA,CAAAA,OAAO,CAAC,UACRC,CAAAA,CAAAA,gBAAgB,CAACC,IAAM,EAAA;YACtBC,YAAc,EAAA,QAAA;YACdC,qBAAuB,EAAA;AAAC,gBAAA;AAAS;AACnC,SAAA,CAAA;AACJ;AACF;AAEA,MAAMT,iBAAiB,CAACC,MAAAA,GAAAA;AACtB,IAAA,MAAM,EAAES,eAAe,EAAEC,gBAAgB,EAAE,EAAE,GAAGV,MAAAA;AAEhD,IAAA,MAAMW,YAAeC,GAAAA,CAAAA,CAAEC,OAAO,CAACb,OAAOF,QAAQ,CAAA;IAC9C,IAAIA,QAAAA;IAEJ,IAAIgB,UAAAA;IACJ,IAAI;AACFA,QAAAA,UAAAA,GAAaC,QAAQC,OAAO,CAAC,CAAC,wBAAwB,EAAEL,
|
|
1
|
+
{"version":3,"file":"register.mjs","sources":["../../server/src/register.ts"],"sourcesContent":["import _ from 'lodash';\n\nimport { errors, file } from '@strapi/utils';\nimport type { Core } from '@strapi/types';\n\nimport registerUploadMiddleware from './middlewares/upload';\nimport spec from '../../documentation/content-api.json';\nimport type { Config, File, InputFile } from './types';\n\nconst { PayloadTooLargeError } = errors;\nconst { bytesToHumanReadable, kbytesToBytes } = file;\n\n/**\n * Register upload plugin\n */\nexport async function register({ strapi }: { strapi: Core.Strapi }) {\n strapi.plugin('upload').provider = createProvider(strapi.config.get<Config>('plugin::upload'));\n\n await registerUploadMiddleware({ strapi });\n\n if (strapi.plugin('graphql')) {\n const { installGraphqlExtension } = await import('./graphql.js');\n installGraphqlExtension({ strapi });\n }\n\n if (strapi.plugin('documentation')) {\n strapi\n .plugin('documentation')\n .service('override')\n .registerOverride(spec, {\n pluginOrigin: 'upload',\n excludeFromGeneration: ['upload'],\n });\n }\n}\n\nconst createProvider = (config: Config) => {\n const { providerOptions, actionOptions = {} } = config;\n\n const providerName = _.toLower(config.provider);\n let provider;\n\n let modulePath;\n try {\n modulePath = require.resolve(`@strapi/provider-upload-${providerName}`);\n } catch (error) {\n if (\n typeof error === 'object' &&\n error !== null &&\n 'code' in error &&\n error.code === 'MODULE_NOT_FOUND'\n ) {\n modulePath = providerName;\n } else {\n throw error;\n }\n }\n\n try {\n provider = require(modulePath);\n } catch (err) {\n const newError = new Error(`Could not load upload provider \"${providerName}\".`);\n\n if (err instanceof Error) {\n newError.stack = err.stack;\n }\n\n throw newError;\n }\n\n const providerInstance = provider.init(providerOptions);\n\n if (!providerInstance.delete) {\n throw new Error(`The upload provider \"${providerName}\" doesn't implement the delete method.`);\n }\n\n if (!providerInstance.upload && !providerInstance.uploadStream) {\n throw new Error(\n `The upload provider \"${providerName}\" doesn't implement the uploadStream nor the upload method.`\n );\n }\n\n if (!providerInstance.uploadStream) {\n process.emitWarning(\n `The upload provider \"${providerName}\" doesn't implement the uploadStream function. Strapi will fallback on the upload method. Some performance issues may occur.`\n );\n }\n\n const wrappedProvider = _.mapValues(providerInstance, (method, methodName) => {\n return async (file: File, options = actionOptions[methodName]) =>\n providerInstance[methodName](file, options);\n });\n\n return Object.assign(Object.create(baseProvider), wrappedProvider);\n};\n\nconst baseProvider = {\n extend(obj: unknown) {\n Object.assign(this, obj);\n },\n checkFileSize(file: InputFile, { sizeLimit }: { sizeLimit: number }) {\n if (sizeLimit && kbytesToBytes(file.size) > sizeLimit) {\n throw new PayloadTooLargeError(\n `${file.originalFilename} exceeds size limit of ${bytesToHumanReadable(sizeLimit)}.`\n );\n }\n },\n getSignedUrl(file: File) {\n return file;\n },\n isPrivate() {\n return false;\n },\n};\n"],"names":["PayloadTooLargeError","errors","bytesToHumanReadable","kbytesToBytes","file","register","strapi","plugin","provider","createProvider","config","get","registerUploadMiddleware","installGraphqlExtension","service","registerOverride","spec","pluginOrigin","excludeFromGeneration","providerOptions","actionOptions","providerName","_","toLower","modulePath","require","resolve","error","code","err","newError","Error","stack","providerInstance","init","delete","upload","uploadStream","process","emitWarning","wrappedProvider","mapValues","method","methodName","options","Object","assign","create","baseProvider","extend","obj","checkFileSize","sizeLimit","size","originalFilename","getSignedUrl","isPrivate"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-metadata.js","sources":["../../../server/src/services/ai-metadata.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport { z } from 'zod';\nimport { InputFile } from '../types';\nimport { Settings } from '../controllers/validation/admin/settings';\n\nconst createAIMetadataService = ({ strapi }: { strapi: Core.Strapi }) => {\n const aiServerUrl = process.env.STRAPI_AI_URL || 'https://strapi-ai.apps.strapi.io';\n\n return {\n async isEnabled() {\n // Check if user disabled AI features globally\n const isAIEnabled = strapi.config.get('admin.ai.enabled', true);\n if (!isAIEnabled) {\n return false;\n }\n\n // Check if the user's license grants access to AI features\n const hasAccess = strapi.ee.features.isEnabled('cms-ai');\n if (!hasAccess) {\n return false;\n }\n\n // Check if feature is specifically enabled, defaulting to true\n const settings: Settings = await strapi.plugin('upload').service('upload').getSettings();\n const aiMetadata: boolean = settings.aiMetadata ?? true;\n\n return aiMetadata;\n },\n\n async processFiles(\n files: InputFile[]\n ): Promise<Array<{ altText: string; caption: string } | null>> {\n if (!(await this.isEnabled()) || !aiServerUrl) {\n throw new Error('AI Metadata service is not enabled');\n }\n\n // Filter for image files only and track their original positions\n // We need to maintain the original indices so we can map AI results back correctly\n const imageFiles = files\n .map((file, index) => ({ file, originalIndex: index }))\n .filter(({ file }) => file.mimetype?.startsWith('image/'));\n\n // If no image files, return sparse array with all nulls to avoid calling the AI server\n // This maintains the same array length as input files for proper index alignment\n if (imageFiles.length === 0) {\n return new Array(files.length).fill(null);\n }\n\n const formData = new FormData();\n\n for (const { file } of imageFiles) {\n const fullUrl =\n file.provider === 'local'\n ? strapi.config.get('server.absoluteUrl') + file.filepath\n : file.filepath;\n\n const resp = await fetch(fullUrl);\n if (!resp.ok) {\n throw new Error(`Failed to fetch image from URL: ${fullUrl} (${resp.status})`);\n }\n const ab = await resp.arrayBuffer();\n const blob: Blob = new Blob([ab], { type: file.mimetype || undefined });\n formData.append('files', blob);\n }\n\n let token: string;\n try {\n const tokenData = await strapi.service('admin::user').getAiToken();\n token = tokenData.token;\n } catch (error) {\n throw new Error('Failed to retrieve AI token', {\n cause: error instanceof Error ? error : undefined,\n });\n }\n\n strapi.log.http('Contacting AI Server for media metadata generation');\n const res = await fetch(`${aiServerUrl}/media-library/generate-metadata`, {\n method: 'POST',\n body: formData,\n headers: {\n Authorization: `Bearer ${token}`,\n },\n });\n\n if (!res.ok) {\n throw Error(`AI metadata generation failed`, { cause: await res.text() });\n }\n\n const responseSchema = z.object({\n results: z.array(\n z.object({\n altText: z.string(),\n caption: z.string(),\n })\n ),\n });\n\n const { results } = responseSchema.parse(await res.json());\n strapi.log.http(`Media metadata generated successfully for ${results.length} files`);\n\n // Create sparse array with results at original indices\n // Example: files=[img1, pdf, img2] -> imageFiles=[{img1, index:0}, {img2, index:2}]\n // AI results=[meta1, meta2] -> sparse=[meta1, null, meta2]\n // This ensures metadata[i] corresponds to files[i], with null for non-images\n return imageFiles.reduce((sparseResults, { originalIndex }, resultIndex) => {\n sparseResults[originalIndex] = results[resultIndex];\n return sparseResults;\n }, new Array(files.length).fill(null));\n },\n };\n};\n\nexport { createAIMetadataService };\n"],"names":["createAIMetadataService","strapi","aiServerUrl","process","env","STRAPI_AI_URL","isEnabled","isAIEnabled","config","get","hasAccess","ee","features","settings","plugin","service","getSettings","aiMetadata","processFiles","files","Error","imageFiles","map","file","index","originalIndex","filter","mimetype","startsWith","length","Array","fill","formData","FormData","fullUrl","provider","filepath","resp","fetch","ok","status","ab","arrayBuffer","blob","Blob","type","undefined","append","token","tokenData","getAiToken","error","cause","log","http","res","method","body","headers","Authorization","text","responseSchema","z","object","results","array","altText","string","caption","parse","json","reduce","sparseResults","resultIndex"],"mappings":"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
|
|
1
|
+
{"version":3,"file":"ai-metadata.js","sources":["../../../server/src/services/ai-metadata.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport { z } from 'zod';\nimport { InputFile } from '../types';\nimport { Settings } from '../controllers/validation/admin/settings';\n\nconst createAIMetadataService = ({ strapi }: { strapi: Core.Strapi }) => {\n const aiServerUrl = process.env.STRAPI_AI_URL || 'https://strapi-ai.apps.strapi.io';\n\n return {\n async isEnabled() {\n // Check if user disabled AI features globally\n const isAIEnabled = strapi.config.get('admin.ai.enabled', true);\n if (!isAIEnabled) {\n return false;\n }\n\n // Check if the user's license grants access to AI features\n const hasAccess = strapi.ee.features.isEnabled('cms-ai');\n if (!hasAccess) {\n return false;\n }\n\n // Check if feature is specifically enabled, defaulting to true\n const settings: Settings = await strapi.plugin('upload').service('upload').getSettings();\n const aiMetadata: boolean = settings.aiMetadata ?? true;\n\n return aiMetadata;\n },\n\n async processFiles(\n files: InputFile[]\n ): Promise<Array<{ altText: string; caption: string } | null>> {\n if (!(await this.isEnabled()) || !aiServerUrl) {\n throw new Error('AI Metadata service is not enabled');\n }\n\n // Filter for image files only and track their original positions\n // We need to maintain the original indices so we can map AI results back correctly\n const imageFiles = files\n .map((file, index) => ({ file, originalIndex: index }))\n .filter(({ file }) => file.mimetype?.startsWith('image/'));\n\n // If no image files, return sparse array with all nulls to avoid calling the AI server\n // This maintains the same array length as input files for proper index alignment\n if (imageFiles.length === 0) {\n return new Array(files.length).fill(null);\n }\n\n const formData = new FormData();\n\n for (const { file } of imageFiles) {\n const fullUrl =\n file.provider === 'local'\n ? strapi.config.get('server.absoluteUrl') + file.filepath\n : file.filepath;\n\n const resp = await fetch(fullUrl);\n if (!resp.ok) {\n throw new Error(`Failed to fetch image from URL: ${fullUrl} (${resp.status})`);\n }\n const ab = await resp.arrayBuffer();\n const blob: Blob = new Blob([ab], { type: file.mimetype || undefined });\n formData.append('files', blob);\n }\n\n let token: string;\n try {\n const tokenData = await strapi.service('admin::user').getAiToken();\n token = tokenData.token;\n } catch (error) {\n throw new Error('Failed to retrieve AI token', {\n cause: error instanceof Error ? error : undefined,\n });\n }\n\n strapi.log.http('Contacting AI Server for media metadata generation');\n const res = await fetch(`${aiServerUrl}/media-library/generate-metadata`, {\n method: 'POST',\n body: formData,\n headers: {\n Authorization: `Bearer ${token}`,\n },\n });\n\n if (!res.ok) {\n throw Error(`AI metadata generation failed`, { cause: await res.text() });\n }\n\n const responseSchema = z.object({\n results: z.array(\n z.object({\n altText: z.string(),\n caption: z.string(),\n })\n ),\n });\n\n const { results } = responseSchema.parse(await res.json());\n strapi.log.http(`Media metadata generated successfully for ${results.length} files`);\n\n // Create sparse array with results at original indices\n // Example: files=[img1, pdf, img2] -> imageFiles=[{img1, index:0}, {img2, index:2}]\n // AI results=[meta1, meta2] -> sparse=[meta1, null, meta2]\n // This ensures metadata[i] corresponds to files[i], with null for non-images\n return imageFiles.reduce((sparseResults, { originalIndex }, resultIndex) => {\n sparseResults[originalIndex] = results[resultIndex];\n return sparseResults;\n }, new Array(files.length).fill(null));\n },\n };\n};\n\nexport { createAIMetadataService };\n"],"names":["createAIMetadataService","strapi","aiServerUrl","process","env","STRAPI_AI_URL","isEnabled","isAIEnabled","config","get","hasAccess","ee","features","settings","plugin","service","getSettings","aiMetadata","processFiles","files","Error","imageFiles","map","file","index","originalIndex","filter","mimetype","startsWith","length","Array","fill","formData","FormData","fullUrl","provider","filepath","resp","fetch","ok","status","ab","arrayBuffer","blob","Blob","type","undefined","append","token","tokenData","getAiToken","error","cause","log","http","res","method","body","headers","Authorization","text","responseSchema","z","object","results","array","altText","string","caption","parse","json","reduce","sparseResults","resultIndex"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-metadata.mjs","sources":["../../../server/src/services/ai-metadata.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport { z } from 'zod';\nimport { InputFile } from '../types';\nimport { Settings } from '../controllers/validation/admin/settings';\n\nconst createAIMetadataService = ({ strapi }: { strapi: Core.Strapi }) => {\n const aiServerUrl = process.env.STRAPI_AI_URL || 'https://strapi-ai.apps.strapi.io';\n\n return {\n async isEnabled() {\n // Check if user disabled AI features globally\n const isAIEnabled = strapi.config.get('admin.ai.enabled', true);\n if (!isAIEnabled) {\n return false;\n }\n\n // Check if the user's license grants access to AI features\n const hasAccess = strapi.ee.features.isEnabled('cms-ai');\n if (!hasAccess) {\n return false;\n }\n\n // Check if feature is specifically enabled, defaulting to true\n const settings: Settings = await strapi.plugin('upload').service('upload').getSettings();\n const aiMetadata: boolean = settings.aiMetadata ?? true;\n\n return aiMetadata;\n },\n\n async processFiles(\n files: InputFile[]\n ): Promise<Array<{ altText: string; caption: string } | null>> {\n if (!(await this.isEnabled()) || !aiServerUrl) {\n throw new Error('AI Metadata service is not enabled');\n }\n\n // Filter for image files only and track their original positions\n // We need to maintain the original indices so we can map AI results back correctly\n const imageFiles = files\n .map((file, index) => ({ file, originalIndex: index }))\n .filter(({ file }) => file.mimetype?.startsWith('image/'));\n\n // If no image files, return sparse array with all nulls to avoid calling the AI server\n // This maintains the same array length as input files for proper index alignment\n if (imageFiles.length === 0) {\n return new Array(files.length).fill(null);\n }\n\n const formData = new FormData();\n\n for (const { file } of imageFiles) {\n const fullUrl =\n file.provider === 'local'\n ? strapi.config.get('server.absoluteUrl') + file.filepath\n : file.filepath;\n\n const resp = await fetch(fullUrl);\n if (!resp.ok) {\n throw new Error(`Failed to fetch image from URL: ${fullUrl} (${resp.status})`);\n }\n const ab = await resp.arrayBuffer();\n const blob: Blob = new Blob([ab], { type: file.mimetype || undefined });\n formData.append('files', blob);\n }\n\n let token: string;\n try {\n const tokenData = await strapi.service('admin::user').getAiToken();\n token = tokenData.token;\n } catch (error) {\n throw new Error('Failed to retrieve AI token', {\n cause: error instanceof Error ? error : undefined,\n });\n }\n\n strapi.log.http('Contacting AI Server for media metadata generation');\n const res = await fetch(`${aiServerUrl}/media-library/generate-metadata`, {\n method: 'POST',\n body: formData,\n headers: {\n Authorization: `Bearer ${token}`,\n },\n });\n\n if (!res.ok) {\n throw Error(`AI metadata generation failed`, { cause: await res.text() });\n }\n\n const responseSchema = z.object({\n results: z.array(\n z.object({\n altText: z.string(),\n caption: z.string(),\n })\n ),\n });\n\n const { results } = responseSchema.parse(await res.json());\n strapi.log.http(`Media metadata generated successfully for ${results.length} files`);\n\n // Create sparse array with results at original indices\n // Example: files=[img1, pdf, img2] -> imageFiles=[{img1, index:0}, {img2, index:2}]\n // AI results=[meta1, meta2] -> sparse=[meta1, null, meta2]\n // This ensures metadata[i] corresponds to files[i], with null for non-images\n return imageFiles.reduce((sparseResults, { originalIndex }, resultIndex) => {\n sparseResults[originalIndex] = results[resultIndex];\n return sparseResults;\n }, new Array(files.length).fill(null));\n },\n };\n};\n\nexport { createAIMetadataService };\n"],"names":["createAIMetadataService","strapi","aiServerUrl","process","env","STRAPI_AI_URL","isEnabled","isAIEnabled","config","get","hasAccess","ee","features","settings","plugin","service","getSettings","aiMetadata","processFiles","files","Error","imageFiles","map","file","index","originalIndex","filter","mimetype","startsWith","length","Array","fill","formData","FormData","fullUrl","provider","filepath","resp","fetch","ok","status","ab","arrayBuffer","blob","Blob","type","undefined","append","token","tokenData","getAiToken","error","cause","log","http","res","method","body","headers","Authorization","text","responseSchema","z","object","results","array","altText","string","caption","parse","json","reduce","sparseResults","resultIndex"],"mappings":"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
|
|
1
|
+
{"version":3,"file":"ai-metadata.mjs","sources":["../../../server/src/services/ai-metadata.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport { z } from 'zod';\nimport { InputFile } from '../types';\nimport { Settings } from '../controllers/validation/admin/settings';\n\nconst createAIMetadataService = ({ strapi }: { strapi: Core.Strapi }) => {\n const aiServerUrl = process.env.STRAPI_AI_URL || 'https://strapi-ai.apps.strapi.io';\n\n return {\n async isEnabled() {\n // Check if user disabled AI features globally\n const isAIEnabled = strapi.config.get('admin.ai.enabled', true);\n if (!isAIEnabled) {\n return false;\n }\n\n // Check if the user's license grants access to AI features\n const hasAccess = strapi.ee.features.isEnabled('cms-ai');\n if (!hasAccess) {\n return false;\n }\n\n // Check if feature is specifically enabled, defaulting to true\n const settings: Settings = await strapi.plugin('upload').service('upload').getSettings();\n const aiMetadata: boolean = settings.aiMetadata ?? true;\n\n return aiMetadata;\n },\n\n async processFiles(\n files: InputFile[]\n ): Promise<Array<{ altText: string; caption: string } | null>> {\n if (!(await this.isEnabled()) || !aiServerUrl) {\n throw new Error('AI Metadata service is not enabled');\n }\n\n // Filter for image files only and track their original positions\n // We need to maintain the original indices so we can map AI results back correctly\n const imageFiles = files\n .map((file, index) => ({ file, originalIndex: index }))\n .filter(({ file }) => file.mimetype?.startsWith('image/'));\n\n // If no image files, return sparse array with all nulls to avoid calling the AI server\n // This maintains the same array length as input files for proper index alignment\n if (imageFiles.length === 0) {\n return new Array(files.length).fill(null);\n }\n\n const formData = new FormData();\n\n for (const { file } of imageFiles) {\n const fullUrl =\n file.provider === 'local'\n ? strapi.config.get('server.absoluteUrl') + file.filepath\n : file.filepath;\n\n const resp = await fetch(fullUrl);\n if (!resp.ok) {\n throw new Error(`Failed to fetch image from URL: ${fullUrl} (${resp.status})`);\n }\n const ab = await resp.arrayBuffer();\n const blob: Blob = new Blob([ab], { type: file.mimetype || undefined });\n formData.append('files', blob);\n }\n\n let token: string;\n try {\n const tokenData = await strapi.service('admin::user').getAiToken();\n token = tokenData.token;\n } catch (error) {\n throw new Error('Failed to retrieve AI token', {\n cause: error instanceof Error ? error : undefined,\n });\n }\n\n strapi.log.http('Contacting AI Server for media metadata generation');\n const res = await fetch(`${aiServerUrl}/media-library/generate-metadata`, {\n method: 'POST',\n body: formData,\n headers: {\n Authorization: `Bearer ${token}`,\n },\n });\n\n if (!res.ok) {\n throw Error(`AI metadata generation failed`, { cause: await res.text() });\n }\n\n const responseSchema = z.object({\n results: z.array(\n z.object({\n altText: z.string(),\n caption: z.string(),\n })\n ),\n });\n\n const { results } = responseSchema.parse(await res.json());\n strapi.log.http(`Media metadata generated successfully for ${results.length} files`);\n\n // Create sparse array with results at original indices\n // Example: files=[img1, pdf, img2] -> imageFiles=[{img1, index:0}, {img2, index:2}]\n // AI results=[meta1, meta2] -> sparse=[meta1, null, meta2]\n // This ensures metadata[i] corresponds to files[i], with null for non-images\n return imageFiles.reduce((sparseResults, { originalIndex }, resultIndex) => {\n sparseResults[originalIndex] = results[resultIndex];\n return sparseResults;\n }, new Array(files.length).fill(null));\n },\n };\n};\n\nexport { createAIMetadataService };\n"],"names":["createAIMetadataService","strapi","aiServerUrl","process","env","STRAPI_AI_URL","isEnabled","isAIEnabled","config","get","hasAccess","ee","features","settings","plugin","service","getSettings","aiMetadata","processFiles","files","Error","imageFiles","map","file","index","originalIndex","filter","mimetype","startsWith","length","Array","fill","formData","FormData","fullUrl","provider","filepath","resp","fetch","ok","status","ab","arrayBuffer","blob","Blob","type","undefined","append","token","tokenData","getAiToken","error","cause","log","http","res","method","body","headers","Authorization","text","responseSchema","z","object","results","array","altText","string","caption","parse","json","reduce","sparseResults","resultIndex"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-upload-folder.js","sources":["../../../server/src/services/api-upload-folder.ts"],"sourcesContent":["import { isNil, get } from 'lodash/fp';\nimport { getService } from '../utils';\nimport { FOLDER_MODEL_UID, API_UPLOAD_FOLDER_BASE_NAME } from '../constants';\n\nconst getStore = () => strapi.store({ type: 'plugin', name: 'upload', key: 'api-folder' });\n\nconst createApiUploadFolder = async () => {\n let name = API_UPLOAD_FOLDER_BASE_NAME;\n const folderService = getService('folder');\n\n let exists = true;\n let index = 1;\n while (exists) {\n exists = await folderService.exists({ name, parent: null });\n if (exists) {\n name = `${API_UPLOAD_FOLDER_BASE_NAME} (${index})`;\n index += 1;\n }\n }\n\n const folder = await folderService.create({ name });\n\n await getStore().set({ value: { id: folder.id } });\n\n return folder;\n};\n\nconst getAPIUploadFolder = async () => {\n const storeValue = await getStore().get({});\n const folderId = get('id', storeValue);\n\n const folder = folderId\n ? await strapi.db.query(FOLDER_MODEL_UID).findOne({ where: { id: folderId } })\n : null;\n\n return isNil(folder) ? createApiUploadFolder() : folder;\n};\n\nexport default {\n getAPIUploadFolder,\n};\n"],"names":["getStore","strapi","store","type","name","key","createApiUploadFolder","API_UPLOAD_FOLDER_BASE_NAME","folderService","getService","exists","index","parent","folder","create","set","value","id","getAPIUploadFolder","storeValue","get","folderId","db","query","FOLDER_MODEL_UID","findOne","where","isNil"],"mappings":";;;;;;AAIA,MAAMA,QAAW,GAAA,IAAMC,MAAOC,CAAAA,KAAK,CAAC;QAAEC,IAAM,EAAA,QAAA;QAAUC,IAAM,EAAA,QAAA;QAAUC,GAAK,EAAA;AAAa,KAAA,CAAA;AAExF,MAAMC,qBAAwB,GAAA,UAAA;AAC5B,IAAA,IAAIF,IAAOG,GAAAA,qCAAAA;AACX,IAAA,MAAMC,gBAAgBC,gBAAW,CAAA,QAAA,CAAA;AAEjC,IAAA,IAAIC,MAAS,GAAA,IAAA;AACb,IAAA,IAAIC,OAAQ,GAAA,CAAA;AACZ,IAAA,MAAOD,MAAQ,CAAA;QACbA,MAAS,GAAA,MAAMF,aAAcE,CAAAA,MAAM,CAAC;AAAEN,YAAAA,IAAAA;YAAMQ,MAAQ,EAAA;AAAK,SAAA,CAAA;AACzD,QAAA,IAAIF,MAAQ,EAAA;AACVN,YAAAA,IAAAA,GAAO,
|
|
1
|
+
{"version":3,"file":"api-upload-folder.js","sources":["../../../server/src/services/api-upload-folder.ts"],"sourcesContent":["import { isNil, get } from 'lodash/fp';\nimport { getService } from '../utils';\nimport { FOLDER_MODEL_UID, API_UPLOAD_FOLDER_BASE_NAME } from '../constants';\n\nconst getStore = () => strapi.store({ type: 'plugin', name: 'upload', key: 'api-folder' });\n\nconst createApiUploadFolder = async () => {\n let name = API_UPLOAD_FOLDER_BASE_NAME;\n const folderService = getService('folder');\n\n let exists = true;\n let index = 1;\n while (exists) {\n exists = await folderService.exists({ name, parent: null });\n if (exists) {\n name = `${API_UPLOAD_FOLDER_BASE_NAME} (${index})`;\n index += 1;\n }\n }\n\n const folder = await folderService.create({ name });\n\n await getStore().set({ value: { id: folder.id } });\n\n return folder;\n};\n\nconst getAPIUploadFolder = async () => {\n const storeValue = await getStore().get({});\n const folderId = get('id', storeValue);\n\n const folder = folderId\n ? await strapi.db.query(FOLDER_MODEL_UID).findOne({ where: { id: folderId } })\n : null;\n\n return isNil(folder) ? createApiUploadFolder() : folder;\n};\n\nexport default {\n getAPIUploadFolder,\n};\n"],"names":["getStore","strapi","store","type","name","key","createApiUploadFolder","API_UPLOAD_FOLDER_BASE_NAME","folderService","getService","exists","index","parent","folder","create","set","value","id","getAPIUploadFolder","storeValue","get","folderId","db","query","FOLDER_MODEL_UID","findOne","where","isNil"],"mappings":";;;;;;AAIA,MAAMA,QAAW,GAAA,IAAMC,MAAOC,CAAAA,KAAK,CAAC;QAAEC,IAAM,EAAA,QAAA;QAAUC,IAAM,EAAA,QAAA;QAAUC,GAAK,EAAA;AAAa,KAAA,CAAA;AAExF,MAAMC,qBAAwB,GAAA,UAAA;AAC5B,IAAA,IAAIF,IAAOG,GAAAA,qCAAAA;AACX,IAAA,MAAMC,gBAAgBC,gBAAW,CAAA,QAAA,CAAA;AAEjC,IAAA,IAAIC,MAAS,GAAA,IAAA;AACb,IAAA,IAAIC,OAAQ,GAAA,CAAA;AACZ,IAAA,MAAOD,MAAQ,CAAA;QACbA,MAAS,GAAA,MAAMF,aAAcE,CAAAA,MAAM,CAAC;AAAEN,YAAAA,IAAAA;YAAMQ,MAAQ,EAAA;AAAK,SAAA,CAAA;AACzD,QAAA,IAAIF,MAAQ,EAAA;AACVN,YAAAA,IAAAA,GAAO,GAAGG,qCAA4B,CAAA,EAAE,EAAEI,OAAAA,CAAM,CAAC,CAAC;YAClDA,OAAS,IAAA,CAAA;AACX;AACF;AAEA,IAAA,MAAME,MAAS,GAAA,MAAML,aAAcM,CAAAA,MAAM,CAAC;AAAEV,QAAAA;AAAK,KAAA,CAAA;IAEjD,MAAMJ,QAAAA,EAAAA,CAAWe,GAAG,CAAC;QAAEC,KAAO,EAAA;AAAEC,YAAAA,EAAAA,EAAIJ,OAAOI;AAAG;AAAE,KAAA,CAAA;IAEhD,OAAOJ,MAAAA;AACT,CAAA;AAEA,MAAMK,kBAAqB,GAAA,UAAA;AACzB,IAAA,MAAMC,UAAa,GAAA,MAAMnB,QAAWoB,EAAAA,CAAAA,GAAG,CAAC,EAAC,CAAA;IACzC,MAAMC,QAAAA,GAAWD,OAAI,IAAMD,EAAAA,UAAAA,CAAAA;IAE3B,MAAMN,MAAAA,GAASQ,QACX,GAAA,MAAMpB,MAAOqB,CAAAA,EAAE,CAACC,KAAK,CAACC,0BAAkBC,CAAAA,CAAAA,OAAO,CAAC;QAAEC,KAAO,EAAA;YAAET,EAAII,EAAAA;AAAS;KACxE,CAAA,GAAA,IAAA;IAEJ,OAAOM,QAAAA,CAAMd,UAAUP,qBAA0BO,EAAAA,GAAAA,MAAAA;AACnD,CAAA;AAEA,sBAAe;AACbK,IAAAA;AACF,CAAE;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-upload-folder.mjs","sources":["../../../server/src/services/api-upload-folder.ts"],"sourcesContent":["import { isNil, get } from 'lodash/fp';\nimport { getService } from '../utils';\nimport { FOLDER_MODEL_UID, API_UPLOAD_FOLDER_BASE_NAME } from '../constants';\n\nconst getStore = () => strapi.store({ type: 'plugin', name: 'upload', key: 'api-folder' });\n\nconst createApiUploadFolder = async () => {\n let name = API_UPLOAD_FOLDER_BASE_NAME;\n const folderService = getService('folder');\n\n let exists = true;\n let index = 1;\n while (exists) {\n exists = await folderService.exists({ name, parent: null });\n if (exists) {\n name = `${API_UPLOAD_FOLDER_BASE_NAME} (${index})`;\n index += 1;\n }\n }\n\n const folder = await folderService.create({ name });\n\n await getStore().set({ value: { id: folder.id } });\n\n return folder;\n};\n\nconst getAPIUploadFolder = async () => {\n const storeValue = await getStore().get({});\n const folderId = get('id', storeValue);\n\n const folder = folderId\n ? await strapi.db.query(FOLDER_MODEL_UID).findOne({ where: { id: folderId } })\n : null;\n\n return isNil(folder) ? createApiUploadFolder() : folder;\n};\n\nexport default {\n getAPIUploadFolder,\n};\n"],"names":["getStore","strapi","store","type","name","key","createApiUploadFolder","API_UPLOAD_FOLDER_BASE_NAME","folderService","getService","exists","index","parent","folder","create","set","value","id","getAPIUploadFolder","storeValue","get","folderId","db","query","FOLDER_MODEL_UID","findOne","where","isNil"],"mappings":";;;;AAIA,MAAMA,QAAW,GAAA,IAAMC,MAAOC,CAAAA,KAAK,CAAC;QAAEC,IAAM,EAAA,QAAA;QAAUC,IAAM,EAAA,QAAA;QAAUC,GAAK,EAAA;AAAa,KAAA,CAAA;AAExF,MAAMC,qBAAwB,GAAA,UAAA;AAC5B,IAAA,IAAIF,IAAOG,GAAAA,2BAAAA;AACX,IAAA,MAAMC,gBAAgBC,UAAW,CAAA,QAAA,CAAA;AAEjC,IAAA,IAAIC,MAAS,GAAA,IAAA;AACb,IAAA,IAAIC,KAAQ,GAAA,CAAA;AACZ,IAAA,MAAOD,MAAQ,CAAA;QACbA,MAAS,GAAA,MAAMF,aAAcE,CAAAA,MAAM,CAAC;AAAEN,YAAAA,IAAAA;YAAMQ,MAAQ,EAAA;AAAK,SAAA,CAAA;AACzD,QAAA,IAAIF,MAAQ,EAAA;AACVN,YAAAA,IAAAA,GAAO,
|
|
1
|
+
{"version":3,"file":"api-upload-folder.mjs","sources":["../../../server/src/services/api-upload-folder.ts"],"sourcesContent":["import { isNil, get } from 'lodash/fp';\nimport { getService } from '../utils';\nimport { FOLDER_MODEL_UID, API_UPLOAD_FOLDER_BASE_NAME } from '../constants';\n\nconst getStore = () => strapi.store({ type: 'plugin', name: 'upload', key: 'api-folder' });\n\nconst createApiUploadFolder = async () => {\n let name = API_UPLOAD_FOLDER_BASE_NAME;\n const folderService = getService('folder');\n\n let exists = true;\n let index = 1;\n while (exists) {\n exists = await folderService.exists({ name, parent: null });\n if (exists) {\n name = `${API_UPLOAD_FOLDER_BASE_NAME} (${index})`;\n index += 1;\n }\n }\n\n const folder = await folderService.create({ name });\n\n await getStore().set({ value: { id: folder.id } });\n\n return folder;\n};\n\nconst getAPIUploadFolder = async () => {\n const storeValue = await getStore().get({});\n const folderId = get('id', storeValue);\n\n const folder = folderId\n ? await strapi.db.query(FOLDER_MODEL_UID).findOne({ where: { id: folderId } })\n : null;\n\n return isNil(folder) ? createApiUploadFolder() : folder;\n};\n\nexport default {\n getAPIUploadFolder,\n};\n"],"names":["getStore","strapi","store","type","name","key","createApiUploadFolder","API_UPLOAD_FOLDER_BASE_NAME","folderService","getService","exists","index","parent","folder","create","set","value","id","getAPIUploadFolder","storeValue","get","folderId","db","query","FOLDER_MODEL_UID","findOne","where","isNil"],"mappings":";;;;AAIA,MAAMA,QAAW,GAAA,IAAMC,MAAOC,CAAAA,KAAK,CAAC;QAAEC,IAAM,EAAA,QAAA;QAAUC,IAAM,EAAA,QAAA;QAAUC,GAAK,EAAA;AAAa,KAAA,CAAA;AAExF,MAAMC,qBAAwB,GAAA,UAAA;AAC5B,IAAA,IAAIF,IAAOG,GAAAA,2BAAAA;AACX,IAAA,MAAMC,gBAAgBC,UAAW,CAAA,QAAA,CAAA;AAEjC,IAAA,IAAIC,MAAS,GAAA,IAAA;AACb,IAAA,IAAIC,KAAQ,GAAA,CAAA;AACZ,IAAA,MAAOD,MAAQ,CAAA;QACbA,MAAS,GAAA,MAAMF,aAAcE,CAAAA,MAAM,CAAC;AAAEN,YAAAA,IAAAA;YAAMQ,MAAQ,EAAA;AAAK,SAAA,CAAA;AACzD,QAAA,IAAIF,MAAQ,EAAA;AACVN,YAAAA,IAAAA,GAAO,GAAGG,2BAA4B,CAAA,EAAE,EAAEI,KAAAA,CAAM,CAAC,CAAC;YAClDA,KAAS,IAAA,CAAA;AACX;AACF;AAEA,IAAA,MAAME,MAAS,GAAA,MAAML,aAAcM,CAAAA,MAAM,CAAC;AAAEV,QAAAA;AAAK,KAAA,CAAA;IAEjD,MAAMJ,QAAAA,EAAAA,CAAWe,GAAG,CAAC;QAAEC,KAAO,EAAA;AAAEC,YAAAA,EAAAA,EAAIJ,OAAOI;AAAG;AAAE,KAAA,CAAA;IAEhD,OAAOJ,MAAAA;AACT,CAAA;AAEA,MAAMK,kBAAqB,GAAA,UAAA;AACzB,IAAA,MAAMC,UAAa,GAAA,MAAMnB,QAAWoB,EAAAA,CAAAA,GAAG,CAAC,EAAC,CAAA;IACzC,MAAMC,QAAAA,GAAWD,IAAI,IAAMD,EAAAA,UAAAA,CAAAA;IAE3B,MAAMN,MAAAA,GAASQ,QACX,GAAA,MAAMpB,MAAOqB,CAAAA,EAAE,CAACC,KAAK,CAACC,gBAAkBC,CAAAA,CAAAA,OAAO,CAAC;QAAEC,KAAO,EAAA;YAAET,EAAII,EAAAA;AAAS;KACxE,CAAA,GAAA,IAAA;IAEJ,OAAOM,KAAAA,CAAMd,UAAUP,qBAA0BO,EAAAA,GAAAA,MAAAA;AACnD,CAAA;AAEA,sBAAe;AACbK,IAAAA;AACF,CAAE;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"folder.js","sources":["../../../server/src/services/folder.ts"],"sourcesContent":["import { sortBy, map, isUndefined } from 'lodash/fp';\nimport { strings, setCreatorFields } from '@strapi/utils';\nimport { FOLDER_MODEL_UID, FILE_MODEL_UID } from '../constants';\nimport { getService } from '../utils';\n\nimport type { File, Folder } from '../types';\n\ntype FolderMap = {\n [key: string]: Partial<Folder> & {\n children: FolderNode[];\n };\n};\n\ntype FolderNode = Partial<Folder> & {\n children: FolderNode[];\n};\n\nconst setPathIdAndPath = async (folder: Pick<Folder, 'parent'>) => {\n const { max } = await strapi.db\n .queryBuilder(FOLDER_MODEL_UID)\n .max('pathId')\n .first()\n .execute<{ max: number }>();\n\n const pathId = max + 1;\n let parentPath = '/';\n if (folder.parent) {\n const parentFolder = await strapi.db\n .query(FOLDER_MODEL_UID)\n .findOne({ where: { id: folder.parent } });\n\n parentPath = parentFolder.path;\n }\n\n return Object.assign(folder, {\n pathId,\n path: strings.joinBy('/', parentPath, `${pathId}`),\n });\n};\n\nconst create = async (\n folderData: Pick<Folder, 'name' | 'parent'>,\n opts?: { user: { id: string | number } }\n) => {\n const folderService = getService('folder');\n\n const { user } = opts || {};\n\n let enrichedFolder = await folderService.setPathIdAndPath(folderData);\n if (user) {\n enrichedFolder = await setCreatorFields({ user })(enrichedFolder);\n }\n\n const folder = await strapi.db.query(FOLDER_MODEL_UID).create({ data: enrichedFolder });\n\n strapi.eventHub.emit('media-folder.create', { folder });\n\n return folder;\n};\n\n/**\n * Recursively delete folders and included files\n * @param ids ids of the folders to delete\n * @returns {Promise<Object[]>}\n */\nconst deleteByIds = async (ids = []) => {\n const folders = await strapi.db.query(FOLDER_MODEL_UID).findMany({ where: { id: { $in: ids } } });\n if (folders.length === 0) {\n return {\n folders: [],\n totalFolderNumber: 0,\n totalFileNumber: 0,\n };\n }\n\n const pathsToDelete = map('path', folders);\n\n // delete files\n const filesToDelete = await strapi.db.query(FILE_MODEL_UID).findMany({\n where: {\n $or: pathsToDelete.flatMap((path) => [\n { folderPath: { $eq: path } },\n { folderPath: { $startsWith: `${path}/` } },\n ]),\n },\n });\n\n await Promise.all(filesToDelete.map((file: File) => getService('upload').remove(file)));\n\n // delete folders and subfolders\n const { count: totalFolderNumber } = await strapi.db.query(FOLDER_MODEL_UID).deleteMany({\n where: {\n $or: pathsToDelete.flatMap((path) => [\n { path: { $eq: path } },\n { path: { $startsWith: `${path}/` } },\n ]),\n },\n });\n\n strapi.eventHub.emit('media-folder.delete', { folders });\n\n return {\n folders,\n totalFolderNumber,\n totalFileNumber: filesToDelete.length,\n };\n};\n\n/**\n * Update name and location of a folder and its belonging folders and files\n */\nconst update = async (\n id: number,\n {\n name,\n parent,\n }: {\n name: string;\n parent: number | null;\n },\n { user }: { user: { id: string | number } }\n) => {\n // only name is updated\n if (isUndefined(parent)) {\n const existingFolder = await strapi.db.query(FOLDER_MODEL_UID).findOne({ where: { id } });\n\n if (!existingFolder) {\n return undefined;\n }\n\n const newFolder = setCreatorFields({ user, isEdition: true })({ name, parent });\n\n if (isUndefined(parent)) {\n const folder = await strapi.db\n .query(FOLDER_MODEL_UID)\n .update({ where: { id }, data: newFolder });\n\n return folder;\n }\n // location is updated => using transaction\n } else {\n const trx = await strapi.db.transaction();\n try {\n // fetch existing folder\n const existingFolder = await strapi.db\n .queryBuilder(FOLDER_MODEL_UID)\n .select(['pathId', 'path'])\n .where({ id })\n .transacting(trx.get())\n .forUpdate()\n .first()\n .execute<Folder>();\n\n // update parent folder (delete + insert; upsert not possible)\n // @ts-expect-error - no dynamic types\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]: id })\n .execute();\n\n if (parent !== null) {\n await strapi.db\n .queryBuilder(joinTable.name)\n .transacting(trx.get())\n .insert({ [joinTable.inverseJoinColumn.name]: parent, [joinTable.joinColumn.name]: id })\n .where({ [joinTable.joinColumn.name]: id })\n .execute();\n }\n\n // fetch destinationFolder path\n let destinationFolderPath = '/';\n if (parent !== null) {\n const destinationFolder = await strapi.db\n .queryBuilder(FOLDER_MODEL_UID)\n .select('path')\n .where({ id: parent })\n .transacting(trx.get())\n .first()\n .execute<Folder>();\n destinationFolderPath = destinationFolder.path;\n }\n\n const folderTable = strapi.getModel(FOLDER_MODEL_UID).collectionName;\n const fileTable = strapi.getModel(FILE_MODEL_UID).collectionName;\n const folderPathColumnName =\n // @ts-expect-error - no dynamic types\n strapi.db.metadata.get(FILE_MODEL_UID).attributes.folderPath.columnName;\n // @ts-expect-error - no dynamic types\n const pathColumnName = strapi.db.metadata.get(FOLDER_MODEL_UID).attributes.path.columnName;\n\n // update folders below\n await strapi.db\n .getConnection(folderTable)\n .transacting(trx.get())\n .where(pathColumnName, existingFolder.path)\n .orWhere(pathColumnName, 'like', `${existingFolder.path}/%`)\n .update(\n pathColumnName,\n strapi.db.connection.raw('REPLACE(??, ?, ?)', [\n pathColumnName,\n existingFolder.path,\n strings.joinBy('/', destinationFolderPath, `${existingFolder.pathId}`),\n ])\n );\n\n // update files below\n await strapi.db\n .getConnection(fileTable)\n .transacting(trx.get())\n .where(folderPathColumnName, existingFolder.path)\n .orWhere(folderPathColumnName, 'like', `${existingFolder.path}/%`)\n .update(\n folderPathColumnName,\n strapi.db.connection.raw('REPLACE(??, ?, ?)', [\n folderPathColumnName,\n existingFolder.path,\n strings.joinBy('/', destinationFolderPath, `${existingFolder.pathId}`),\n ])\n );\n\n await trx.commit();\n } catch (e) {\n await trx.rollback();\n throw e;\n }\n\n // update less critical information (name + updatedBy)\n const newFolder = setCreatorFields({ user, isEdition: true })({ name });\n\n const folder = await strapi.db\n .query(FOLDER_MODEL_UID)\n .update({ where: { id }, data: newFolder });\n\n strapi.eventHub.emit('media-folder.update', { folder });\n return folder;\n }\n};\n\n/**\n * Check if a folder exists in database\n * @param params query params to find the folder\n * @returns {Promise<boolean>}\n */\nconst exists = async (params = {}) => {\n const count = await strapi.db.query(FOLDER_MODEL_UID).count({ where: params });\n return count > 0;\n};\n\n/**\n * Returns the nested structure of folders\n * @returns {Promise<array>}\n */\nconst getStructure = async () => {\n // @ts-expect-error - no dynamic types\n const { joinTable } = strapi.db.metadata.get(FOLDER_MODEL_UID).attributes.parent;\n const qb = strapi.db.queryBuilder(FOLDER_MODEL_UID);\n const alias = qb.getAlias();\n const folders = (await qb\n .select(['id', 'name', `${alias}.${joinTable.inverseJoinColumn.name} as parent`])\n .join({\n alias,\n referencedTable: joinTable.name,\n referencedColumn: joinTable.joinColumn.name,\n rootColumn: joinTable.joinColumn.referencedColumn,\n rootTable: qb.alias,\n })\n .execute({ mapResults: false })) as Folder[];\n\n const folderMap: FolderMap = {\n null: { children: [] },\n };\n\n folders.forEach((f) => {\n folderMap[f.id] = { ...f, children: [] };\n });\n\n folders.forEach((f) => {\n const parentId = f.parent || 'null';\n\n if (!folderMap[parentId]) {\n folderMap[parentId] = { children: [] };\n }\n\n folderMap[parentId].children.push(folderMap[f.id]);\n folderMap[parentId].children = sortBy('name', folderMap[parentId].children);\n delete folderMap[f.id].parent;\n });\n\n return folderMap.null.children;\n};\n\nexport default {\n create,\n exists,\n deleteByIds,\n update,\n setPathIdAndPath,\n getStructure,\n};\n"],"names":["setPathIdAndPath","folder","max","strapi","db","queryBuilder","FOLDER_MODEL_UID","first","execute","pathId","parentPath","parent","parentFolder","query","findOne","where","id","path","Object","assign","strings","joinBy","create","folderData","opts","folderService","getService","user","enrichedFolder","setCreatorFields","data","eventHub","emit","deleteByIds","ids","folders","findMany","$in","length","totalFolderNumber","totalFileNumber","pathsToDelete","map","filesToDelete","FILE_MODEL_UID","$or","flatMap","folderPath","$eq","$startsWith","Promise","all","file","remove","count","deleteMany","update","name","isUndefined","existingFolder","undefined","newFolder","isEdition","trx","transaction","select","transacting","get","forUpdate","joinTable","metadata","attributes","delete","joinColumn","insert","inverseJoinColumn","destinationFolderPath","destinationFolder","folderTable","getModel","collectionName","fileTable","folderPathColumnName","columnName","pathColumnName","getConnection","orWhere","connection","raw","commit","e","rollback","exists","params","getStructure","qb","alias","getAlias","join","referencedTable","referencedColumn","rootColumn","rootTable","mapResults","folderMap","null","children","forEach","f","parentId","push","sortBy"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"folder.js","sources":["../../../server/src/services/folder.ts"],"sourcesContent":["import { sortBy, map, isUndefined } from 'lodash/fp';\nimport { strings, setCreatorFields } from '@strapi/utils';\nimport { FOLDER_MODEL_UID, FILE_MODEL_UID } from '../constants';\nimport { getService } from '../utils';\n\nimport type { File, Folder } from '../types';\n\ntype FolderMap = {\n [key: string]: Partial<Folder> & {\n children: FolderNode[];\n };\n};\n\ntype FolderNode = Partial<Folder> & {\n children: FolderNode[];\n};\n\nconst setPathIdAndPath = async (folder: Pick<Folder, 'parent'>) => {\n const { max } = await strapi.db\n .queryBuilder(FOLDER_MODEL_UID)\n .max('pathId')\n .first()\n .execute<{ max: number }>();\n\n const pathId = max + 1;\n let parentPath = '/';\n if (folder.parent) {\n const parentFolder = await strapi.db\n .query(FOLDER_MODEL_UID)\n .findOne({ where: { id: folder.parent } });\n\n parentPath = parentFolder.path;\n }\n\n return Object.assign(folder, {\n pathId,\n path: strings.joinBy('/', parentPath, `${pathId}`),\n });\n};\n\nconst create = async (\n folderData: Pick<Folder, 'name' | 'parent'>,\n opts?: { user: { id: string | number } }\n) => {\n const folderService = getService('folder');\n\n const { user } = opts || {};\n\n let enrichedFolder = await folderService.setPathIdAndPath(folderData);\n if (user) {\n enrichedFolder = await setCreatorFields({ user })(enrichedFolder);\n }\n\n const folder = await strapi.db.query(FOLDER_MODEL_UID).create({ data: enrichedFolder });\n\n strapi.eventHub.emit('media-folder.create', { folder });\n\n return folder;\n};\n\n/**\n * Recursively delete folders and included files\n * @param ids ids of the folders to delete\n * @returns {Promise<Object[]>}\n */\nconst deleteByIds = async (ids = []) => {\n const folders = await strapi.db.query(FOLDER_MODEL_UID).findMany({ where: { id: { $in: ids } } });\n if (folders.length === 0) {\n return {\n folders: [],\n totalFolderNumber: 0,\n totalFileNumber: 0,\n };\n }\n\n const pathsToDelete = map('path', folders);\n\n // delete files\n const filesToDelete = await strapi.db.query(FILE_MODEL_UID).findMany({\n where: {\n $or: pathsToDelete.flatMap((path) => [\n { folderPath: { $eq: path } },\n { folderPath: { $startsWith: `${path}/` } },\n ]),\n },\n });\n\n await Promise.all(filesToDelete.map((file: File) => getService('upload').remove(file)));\n\n // delete folders and subfolders\n const { count: totalFolderNumber } = await strapi.db.query(FOLDER_MODEL_UID).deleteMany({\n where: {\n $or: pathsToDelete.flatMap((path) => [\n { path: { $eq: path } },\n { path: { $startsWith: `${path}/` } },\n ]),\n },\n });\n\n strapi.eventHub.emit('media-folder.delete', { folders });\n\n return {\n folders,\n totalFolderNumber,\n totalFileNumber: filesToDelete.length,\n };\n};\n\n/**\n * Update name and location of a folder and its belonging folders and files\n */\nconst update = async (\n id: number,\n {\n name,\n parent,\n }: {\n name: string;\n parent: number | null;\n },\n { user }: { user: { id: string | number } }\n) => {\n // only name is updated\n if (isUndefined(parent)) {\n const existingFolder = await strapi.db.query(FOLDER_MODEL_UID).findOne({ where: { id } });\n\n if (!existingFolder) {\n return undefined;\n }\n\n const newFolder = setCreatorFields({ user, isEdition: true })({ name, parent });\n\n if (isUndefined(parent)) {\n const folder = await strapi.db\n .query(FOLDER_MODEL_UID)\n .update({ where: { id }, data: newFolder });\n\n return folder;\n }\n // location is updated => using transaction\n } else {\n const trx = await strapi.db.transaction();\n try {\n // fetch existing folder\n const existingFolder = await strapi.db\n .queryBuilder(FOLDER_MODEL_UID)\n .select(['pathId', 'path'])\n .where({ id })\n .transacting(trx.get())\n .forUpdate()\n .first()\n .execute<Folder>();\n\n // update parent folder (delete + insert; upsert not possible)\n // @ts-expect-error - no dynamic types\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]: id })\n .execute();\n\n if (parent !== null) {\n await strapi.db\n .queryBuilder(joinTable.name)\n .transacting(trx.get())\n .insert({ [joinTable.inverseJoinColumn.name]: parent, [joinTable.joinColumn.name]: id })\n .where({ [joinTable.joinColumn.name]: id })\n .execute();\n }\n\n // fetch destinationFolder path\n let destinationFolderPath = '/';\n if (parent !== null) {\n const destinationFolder = await strapi.db\n .queryBuilder(FOLDER_MODEL_UID)\n .select('path')\n .where({ id: parent })\n .transacting(trx.get())\n .first()\n .execute<Folder>();\n destinationFolderPath = destinationFolder.path;\n }\n\n const folderTable = strapi.getModel(FOLDER_MODEL_UID).collectionName;\n const fileTable = strapi.getModel(FILE_MODEL_UID).collectionName;\n const folderPathColumnName =\n // @ts-expect-error - no dynamic types\n strapi.db.metadata.get(FILE_MODEL_UID).attributes.folderPath.columnName;\n // @ts-expect-error - no dynamic types\n const pathColumnName = strapi.db.metadata.get(FOLDER_MODEL_UID).attributes.path.columnName;\n\n // update folders below\n await strapi.db\n .getConnection(folderTable)\n .transacting(trx.get())\n .where(pathColumnName, existingFolder.path)\n .orWhere(pathColumnName, 'like', `${existingFolder.path}/%`)\n .update(\n pathColumnName,\n strapi.db.connection.raw('REPLACE(??, ?, ?)', [\n pathColumnName,\n existingFolder.path,\n strings.joinBy('/', destinationFolderPath, `${existingFolder.pathId}`),\n ])\n );\n\n // update files below\n await strapi.db\n .getConnection(fileTable)\n .transacting(trx.get())\n .where(folderPathColumnName, existingFolder.path)\n .orWhere(folderPathColumnName, 'like', `${existingFolder.path}/%`)\n .update(\n folderPathColumnName,\n strapi.db.connection.raw('REPLACE(??, ?, ?)', [\n folderPathColumnName,\n existingFolder.path,\n strings.joinBy('/', destinationFolderPath, `${existingFolder.pathId}`),\n ])\n );\n\n await trx.commit();\n } catch (e) {\n await trx.rollback();\n throw e;\n }\n\n // update less critical information (name + updatedBy)\n const newFolder = setCreatorFields({ user, isEdition: true })({ name });\n\n const folder = await strapi.db\n .query(FOLDER_MODEL_UID)\n .update({ where: { id }, data: newFolder });\n\n strapi.eventHub.emit('media-folder.update', { folder });\n return folder;\n }\n};\n\n/**\n * Check if a folder exists in database\n * @param params query params to find the folder\n * @returns {Promise<boolean>}\n */\nconst exists = async (params = {}) => {\n const count = await strapi.db.query(FOLDER_MODEL_UID).count({ where: params });\n return count > 0;\n};\n\n/**\n * Returns the nested structure of folders\n * @returns {Promise<array>}\n */\nconst getStructure = async () => {\n // @ts-expect-error - no dynamic types\n const { joinTable } = strapi.db.metadata.get(FOLDER_MODEL_UID).attributes.parent;\n const qb = strapi.db.queryBuilder(FOLDER_MODEL_UID);\n const alias = qb.getAlias();\n const folders = (await qb\n .select(['id', 'name', `${alias}.${joinTable.inverseJoinColumn.name} as parent`])\n .join({\n alias,\n referencedTable: joinTable.name,\n referencedColumn: joinTable.joinColumn.name,\n rootColumn: joinTable.joinColumn.referencedColumn,\n rootTable: qb.alias,\n })\n .execute({ mapResults: false })) as Folder[];\n\n const folderMap: FolderMap = {\n null: { children: [] },\n };\n\n folders.forEach((f) => {\n folderMap[f.id] = { ...f, children: [] };\n });\n\n folders.forEach((f) => {\n const parentId = f.parent || 'null';\n\n if (!folderMap[parentId]) {\n folderMap[parentId] = { children: [] };\n }\n\n folderMap[parentId].children.push(folderMap[f.id]);\n folderMap[parentId].children = sortBy('name', folderMap[parentId].children);\n delete folderMap[f.id].parent;\n });\n\n return folderMap.null.children;\n};\n\nexport default {\n create,\n exists,\n deleteByIds,\n update,\n setPathIdAndPath,\n getStructure,\n};\n"],"names":["setPathIdAndPath","folder","max","strapi","db","queryBuilder","FOLDER_MODEL_UID","first","execute","pathId","parentPath","parent","parentFolder","query","findOne","where","id","path","Object","assign","strings","joinBy","create","folderData","opts","folderService","getService","user","enrichedFolder","setCreatorFields","data","eventHub","emit","deleteByIds","ids","folders","findMany","$in","length","totalFolderNumber","totalFileNumber","pathsToDelete","map","filesToDelete","FILE_MODEL_UID","$or","flatMap","folderPath","$eq","$startsWith","Promise","all","file","remove","count","deleteMany","update","name","isUndefined","existingFolder","undefined","newFolder","isEdition","trx","transaction","select","transacting","get","forUpdate","joinTable","metadata","attributes","delete","joinColumn","insert","inverseJoinColumn","destinationFolderPath","destinationFolder","folderTable","getModel","collectionName","fileTable","folderPathColumnName","columnName","pathColumnName","getConnection","orWhere","connection","raw","commit","e","rollback","exists","params","getStructure","qb","alias","getAlias","join","referencedTable","referencedColumn","rootColumn","rootTable","mapResults","folderMap","null","children","forEach","f","parentId","push","sortBy"],"mappings":";;;;;;;AAiBA,MAAMA,mBAAmB,OAAOC,MAAAA,GAAAA;AAC9B,IAAA,MAAM,EAAEC,GAAG,EAAE,GAAG,MAAMC,OAAOC,EAAE,CAC5BC,YAAY,CAACC,4BACbJ,GAAG,CAAC,QACJK,CAAAA,CAAAA,KAAK,GACLC,OAAO,EAAA;AAEV,IAAA,MAAMC,SAASP,GAAM,GAAA,CAAA;AACrB,IAAA,IAAIQ,UAAa,GAAA,GAAA;IACjB,IAAIT,MAAAA,CAAOU,MAAM,EAAE;QACjB,MAAMC,YAAAA,GAAe,MAAMT,MAAOC,CAAAA,EAAE,CACjCS,KAAK,CAACP,0BACNQ,CAAAA,CAAAA,OAAO,CAAC;YAAEC,KAAO,EAAA;AAAEC,gBAAAA,EAAAA,EAAIf,OAAOU;AAAO;AAAE,SAAA,CAAA;AAE1CD,QAAAA,UAAAA,GAAaE,aAAaK,IAAI;AAChC;IAEA,OAAOC,MAAAA,CAAOC,MAAM,CAAClB,MAAQ,EAAA;AAC3BQ,QAAAA,MAAAA;AACAQ,QAAAA,IAAAA,EAAMG,cAAQC,MAAM,CAAC,GAAKX,EAAAA,UAAAA,EAAY,GAAGD,MAAQ,CAAA,CAAA;AACnD,KAAA,CAAA;AACF,CAAA;AAEA,MAAMa,MAAAA,GAAS,OACbC,UACAC,EAAAA,IAAAA,GAAAA;AAEA,IAAA,MAAMC,gBAAgBC,gBAAW,CAAA,QAAA,CAAA;AAEjC,IAAA,MAAM,EAAEC,IAAI,EAAE,GAAGH,QAAQ,EAAC;AAE1B,IAAA,IAAII,cAAiB,GAAA,MAAMH,aAAczB,CAAAA,gBAAgB,CAACuB,UAAAA,CAAAA;AAC1D,IAAA,IAAII,IAAM,EAAA;AACRC,QAAAA,cAAAA,GAAiB,MAAMC,sBAAiB,CAAA;AAAEF,YAAAA;SAAQC,CAAAA,CAAAA,cAAAA,CAAAA;AACpD;IAEA,MAAM3B,MAAAA,GAAS,MAAME,MAAOC,CAAAA,EAAE,CAACS,KAAK,CAACP,0BAAkBgB,CAAAA,CAAAA,MAAM,CAAC;QAAEQ,IAAMF,EAAAA;AAAe,KAAA,CAAA;AAErFzB,IAAAA,MAAAA,CAAO4B,QAAQ,CAACC,IAAI,CAAC,qBAAuB,EAAA;AAAE/B,QAAAA;AAAO,KAAA,CAAA;IAErD,OAAOA,MAAAA;AACT,CAAA;AAEA;;;;AAIC,IACD,MAAMgC,WAAAA,GAAc,OAAOC,GAAAA,GAAM,EAAE,GAAA;IACjC,MAAMC,OAAAA,GAAU,MAAMhC,MAAOC,CAAAA,EAAE,CAACS,KAAK,CAACP,0BAAkB8B,CAAAA,CAAAA,QAAQ,CAAC;QAAErB,KAAO,EAAA;YAAEC,EAAI,EAAA;gBAAEqB,GAAKH,EAAAA;AAAI;AAAE;AAAE,KAAA,CAAA;IAC/F,IAAIC,OAAAA,CAAQG,MAAM,KAAK,CAAG,EAAA;QACxB,OAAO;AACLH,YAAAA,OAAAA,EAAS,EAAE;YACXI,iBAAmB,EAAA,CAAA;YACnBC,eAAiB,EAAA;AACnB,SAAA;AACF;IAEA,MAAMC,aAAAA,GAAgBC,OAAI,MAAQP,EAAAA,OAAAA,CAAAA;;IAGlC,MAAMQ,aAAAA,GAAgB,MAAMxC,MAAOC,CAAAA,EAAE,CAACS,KAAK,CAAC+B,wBAAgBR,CAAAA,CAAAA,QAAQ,CAAC;QACnErB,KAAO,EAAA;AACL8B,YAAAA,GAAAA,EAAKJ,aAAcK,CAAAA,OAAO,CAAC,CAAC7B,IAAS,GAAA;AACnC,oBAAA;wBAAE8B,UAAY,EAAA;4BAAEC,GAAK/B,EAAAA;AAAK;AAAE,qBAAA;AAC5B,oBAAA;wBAAE8B,UAAY,EAAA;4BAAEE,WAAa,EAAA,CAAA,EAAGhC,IAAK,CAAA,CAAC;AAAE;AAAE;AAC3C,iBAAA;AACH;AACF,KAAA,CAAA;IAEA,MAAMiC,OAAAA,CAAQC,GAAG,CAACR,aAAcD,CAAAA,GAAG,CAAC,CAACU,IAAe1B,GAAAA,gBAAAA,CAAW,QAAU2B,CAAAA,CAAAA,MAAM,CAACD,IAAAA,CAAAA,CAAAA,CAAAA;;AAGhF,IAAA,MAAM,EAAEE,KAAAA,EAAOf,iBAAiB,EAAE,GAAG,MAAMpC,MAAOC,CAAAA,EAAE,CAACS,KAAK,CAACP,0BAAAA,CAAAA,CAAkBiD,UAAU,CAAC;QACtFxC,KAAO,EAAA;AACL8B,YAAAA,GAAAA,EAAKJ,aAAcK,CAAAA,OAAO,CAAC,CAAC7B,IAAS,GAAA;AACnC,oBAAA;wBAAEA,IAAM,EAAA;4BAAE+B,GAAK/B,EAAAA;AAAK;AAAE,qBAAA;AACtB,oBAAA;wBAAEA,IAAM,EAAA;4BAAEgC,WAAa,EAAA,CAAA,EAAGhC,IAAK,CAAA,CAAC;AAAE;AAAE;AACrC,iBAAA;AACH;AACF,KAAA,CAAA;AAEAd,IAAAA,MAAAA,CAAO4B,QAAQ,CAACC,IAAI,CAAC,qBAAuB,EAAA;AAAEG,QAAAA;AAAQ,KAAA,CAAA;IAEtD,OAAO;AACLA,QAAAA,OAAAA;AACAI,QAAAA,iBAAAA;AACAC,QAAAA,eAAAA,EAAiBG,cAAcL;AACjC,KAAA;AACF,CAAA;AAEA;;AAEC,IACD,MAAMkB,MAAAA,GAAS,OACbxC,EAAAA,EACA,EACEyC,IAAI,EACJ9C,MAAM,EAIP,EACD,EAAEgB,IAAI,EAAqC,GAAA;;AAG3C,IAAA,IAAI+B,eAAY/C,MAAS,CAAA,EAAA;QACvB,MAAMgD,cAAAA,GAAiB,MAAMxD,MAAOC,CAAAA,EAAE,CAACS,KAAK,CAACP,0BAAkBQ,CAAAA,CAAAA,OAAO,CAAC;YAAEC,KAAO,EAAA;AAAEC,gBAAAA;AAAG;AAAE,SAAA,CAAA;AAEvF,QAAA,IAAI,CAAC2C,cAAgB,EAAA;YACnB,OAAOC,SAAAA;AACT;AAEA,QAAA,MAAMC,YAAYhC,sBAAiB,CAAA;AAAEF,YAAAA,IAAAA;YAAMmC,SAAW,EAAA;SAAQ,CAAA,CAAA;AAAEL,YAAAA,IAAAA;AAAM9C,YAAAA;AAAO,SAAA,CAAA;AAE7E,QAAA,IAAI+C,eAAY/C,MAAS,CAAA,EAAA;YACvB,MAAMV,MAAAA,GAAS,MAAME,MAAOC,CAAAA,EAAE,CAC3BS,KAAK,CAACP,0BACNkD,CAAAA,CAAAA,MAAM,CAAC;gBAAEzC,KAAO,EAAA;AAAEC,oBAAAA;AAAG,iBAAA;gBAAGc,IAAM+B,EAAAA;AAAU,aAAA,CAAA;YAE3C,OAAO5D,MAAAA;AACT;;KAEK,MAAA;AACL,QAAA,MAAM8D,GAAM,GAAA,MAAM5D,MAAOC,CAAAA,EAAE,CAAC4D,WAAW,EAAA;QACvC,IAAI;;YAEF,MAAML,cAAAA,GAAiB,MAAMxD,MAAOC,CAAAA,EAAE,CACnCC,YAAY,CAACC,0BACb2D,CAAAA,CAAAA,MAAM,CAAC;AAAC,gBAAA,QAAA;AAAU,gBAAA;AAAO,aAAA,CAAA,CACzBlD,KAAK,CAAC;AAAEC,gBAAAA;aACRkD,CAAAA,CAAAA,WAAW,CAACH,GAAII,CAAAA,GAAG,IACnBC,SAAS,EAAA,CACT7D,KAAK,EAAA,CACLC,OAAO,EAAA;;;AAIV,YAAA,MAAM,EAAE6D,SAAS,EAAE,GAAGlE,OAAOC,EAAE,CAACkE,QAAQ,CAACH,GAAG,CAAC7D,0BAAkBiE,CAAAA,CAAAA,UAAU,CAAC5D,MAAM;AAChF,YAAA,MAAMR,OAAOC,EAAE,CACZC,YAAY,CAACgE,UAAUZ,IAAI,CAAA,CAC3BS,WAAW,CAACH,IAAII,GAAG,EAAA,CAAA,CACnBK,MAAM,EAAA,CACNzD,KAAK,CAAC;AAAE,gBAAA,CAACsD,SAAUI,CAAAA,UAAU,CAAChB,IAAI,GAAGzC;AAAG,aAAA,CAAA,CACxCR,OAAO,EAAA;AAEV,YAAA,IAAIG,WAAW,IAAM,EAAA;AACnB,gBAAA,MAAMR,MAAOC,CAAAA,EAAE,CACZC,YAAY,CAACgE,SAAUZ,CAAAA,IAAI,CAC3BS,CAAAA,WAAW,CAACH,GAAAA,CAAII,GAAG,EAAA,CAAA,CACnBO,MAAM,CAAC;AAAE,oBAAA,CAACL,SAAUM,CAAAA,iBAAiB,CAAClB,IAAI,GAAG9C,MAAAA;AAAQ,oBAAA,CAAC0D,SAAUI,CAAAA,UAAU,CAAChB,IAAI,GAAGzC;AAAG,iBAAA,CAAA,CACrFD,KAAK,CAAC;AAAE,oBAAA,CAACsD,SAAUI,CAAAA,UAAU,CAAChB,IAAI,GAAGzC;AAAG,iBAAA,CAAA,CACxCR,OAAO,EAAA;AACZ;;AAGA,YAAA,IAAIoE,qBAAwB,GAAA,GAAA;AAC5B,YAAA,IAAIjE,WAAW,IAAM,EAAA;AACnB,gBAAA,MAAMkE,iBAAoB,GAAA,MAAM1E,MAAOC,CAAAA,EAAE,CACtCC,YAAY,CAACC,0BAAAA,CAAAA,CACb2D,MAAM,CAAC,MACPlD,CAAAA,CAAAA,KAAK,CAAC;oBAAEC,EAAIL,EAAAA;AAAO,iBAAA,CAAA,CACnBuD,WAAW,CAACH,GAAAA,CAAII,GAAG,EACnB5D,CAAAA,CAAAA,KAAK,GACLC,OAAO,EAAA;AACVoE,gBAAAA,qBAAAA,GAAwBC,kBAAkB5D,IAAI;AAChD;AAEA,YAAA,MAAM6D,WAAc3E,GAAAA,MAAAA,CAAO4E,QAAQ,CAACzE,4BAAkB0E,cAAc;AACpE,YAAA,MAAMC,SAAY9E,GAAAA,MAAAA,CAAO4E,QAAQ,CAACnC,0BAAgBoC,cAAc;AAChE,YAAA,MAAME;YAEJ/E,MAAOC,CAAAA,EAAE,CAACkE,QAAQ,CAACH,GAAG,CAACvB,wBAAAA,CAAAA,CAAgB2B,UAAU,CAACxB,UAAU,CAACoC,UAAU;;AAEzE,YAAA,MAAMC,cAAiBjF,GAAAA,MAAAA,CAAOC,EAAE,CAACkE,QAAQ,CAACH,GAAG,CAAC7D,0BAAkBiE,CAAAA,CAAAA,UAAU,CAACtD,IAAI,CAACkE,UAAU;;AAG1F,YAAA,MAAMhF,OAAOC,EAAE,CACZiF,aAAa,CAACP,aACdZ,WAAW,CAACH,GAAII,CAAAA,GAAG,IACnBpD,KAAK,CAACqE,gBAAgBzB,cAAe1C,CAAAA,IAAI,EACzCqE,OAAO,CAACF,cAAgB,EAAA,MAAA,EAAQ,GAAGzB,cAAe1C,CAAAA,IAAI,CAAC,EAAE,CAAC,CAC1DuC,CAAAA,MAAM,CACL4B,cAAAA,EACAjF,OAAOC,EAAE,CAACmF,UAAU,CAACC,GAAG,CAAC,mBAAqB,EAAA;AAC5CJ,gBAAAA,cAAAA;AACAzB,gBAAAA,cAAAA,CAAe1C,IAAI;AACnBG,gBAAAA,aAAAA,CAAQC,MAAM,CAAC,GAAA,EAAKuD,uBAAuB,CAAGjB,EAAAA,cAAAA,CAAelD,MAAM,CAAE,CAAA;AACtE,aAAA,CAAA,CAAA;;AAIL,YAAA,MAAMN,OAAOC,EAAE,CACZiF,aAAa,CAACJ,WACdf,WAAW,CAACH,GAAII,CAAAA,GAAG,IACnBpD,KAAK,CAACmE,sBAAsBvB,cAAe1C,CAAAA,IAAI,EAC/CqE,OAAO,CAACJ,oBAAsB,EAAA,MAAA,EAAQ,GAAGvB,cAAe1C,CAAAA,IAAI,CAAC,EAAE,CAAC,CAChEuC,CAAAA,MAAM,CACL0B,oBAAAA,EACA/E,OAAOC,EAAE,CAACmF,UAAU,CAACC,GAAG,CAAC,mBAAqB,EAAA;AAC5CN,gBAAAA,oBAAAA;AACAvB,gBAAAA,cAAAA,CAAe1C,IAAI;AACnBG,gBAAAA,aAAAA,CAAQC,MAAM,CAAC,GAAA,EAAKuD,uBAAuB,CAAGjB,EAAAA,cAAAA,CAAelD,MAAM,CAAE,CAAA;AACtE,aAAA,CAAA,CAAA;AAGL,YAAA,MAAMsD,IAAI0B,MAAM,EAAA;AAClB,SAAA,CAAE,OAAOC,CAAG,EAAA;AACV,YAAA,MAAM3B,IAAI4B,QAAQ,EAAA;YAClB,MAAMD,CAAAA;AACR;;AAGA,QAAA,MAAM7B,YAAYhC,sBAAiB,CAAA;AAAEF,YAAAA,IAAAA;YAAMmC,SAAW,EAAA;SAAQ,CAAA,CAAA;AAAEL,YAAAA;AAAK,SAAA,CAAA;QAErE,MAAMxD,MAAAA,GAAS,MAAME,MAAOC,CAAAA,EAAE,CAC3BS,KAAK,CAACP,0BACNkD,CAAAA,CAAAA,MAAM,CAAC;YAAEzC,KAAO,EAAA;AAAEC,gBAAAA;AAAG,aAAA;YAAGc,IAAM+B,EAAAA;AAAU,SAAA,CAAA;AAE3C1D,QAAAA,MAAAA,CAAO4B,QAAQ,CAACC,IAAI,CAAC,qBAAuB,EAAA;AAAE/B,YAAAA;AAAO,SAAA,CAAA;QACrD,OAAOA,MAAAA;AACT;AACF,CAAA;AAEA;;;;AAIC,IACD,MAAM2F,MAAAA,GAAS,OAAOC,MAAAA,GAAS,EAAE,GAAA;IAC/B,MAAMvC,KAAAA,GAAQ,MAAMnD,MAAOC,CAAAA,EAAE,CAACS,KAAK,CAACP,0BAAkBgD,CAAAA,CAAAA,KAAK,CAAC;QAAEvC,KAAO8E,EAAAA;AAAO,KAAA,CAAA;AAC5E,IAAA,OAAOvC,KAAQ,GAAA,CAAA;AACjB,CAAA;AAEA;;;AAGC,IACD,MAAMwC,YAAe,GAAA,UAAA;;AAEnB,IAAA,MAAM,EAAEzB,SAAS,EAAE,GAAGlE,OAAOC,EAAE,CAACkE,QAAQ,CAACH,GAAG,CAAC7D,0BAAkBiE,CAAAA,CAAAA,UAAU,CAAC5D,MAAM;AAChF,IAAA,MAAMoF,EAAK5F,GAAAA,MAAAA,CAAOC,EAAE,CAACC,YAAY,CAACC,0BAAAA,CAAAA;IAClC,MAAM0F,KAAAA,GAAQD,GAAGE,QAAQ,EAAA;AACzB,IAAA,MAAM9D,OAAW,GAAA,MAAM4D,EACpB9B,CAAAA,MAAM,CAAC;AAAC,QAAA,IAAA;AAAM,QAAA,MAAA;QAAQ,CAAG+B,EAAAA,KAAAA,CAAM,CAAC,EAAE3B,SAAAA,CAAUM,iBAAiB,CAAClB,IAAI,CAAC,UAAU;AAAE,KAAA,CAAA,CAC/EyC,IAAI,CAAC;AACJF,QAAAA,KAAAA;AACAG,QAAAA,eAAAA,EAAiB9B,UAAUZ,IAAI;QAC/B2C,gBAAkB/B,EAAAA,SAAAA,CAAUI,UAAU,CAAChB,IAAI;QAC3C4C,UAAYhC,EAAAA,SAAAA,CAAUI,UAAU,CAAC2B,gBAAgB;AACjDE,QAAAA,SAAAA,EAAWP,GAAGC;AAChB,KAAA,CAAA,CACCxF,OAAO,CAAC;QAAE+F,UAAY,EAAA;AAAM,KAAA,CAAA;AAE/B,IAAA,MAAMC,SAAuB,GAAA;QAC3BC,IAAM,EAAA;AAAEC,YAAAA,QAAAA,EAAU;AAAG;AACvB,KAAA;IAEAvE,OAAQwE,CAAAA,OAAO,CAAC,CAACC,CAAAA,GAAAA;AACfJ,QAAAA,SAAS,CAACI,CAAAA,CAAE5F,EAAE,CAAC,GAAG;AAAE,YAAA,GAAG4F,CAAC;AAAEF,YAAAA,QAAAA,EAAU;AAAG,SAAA;AACzC,KAAA,CAAA;IAEAvE,OAAQwE,CAAAA,OAAO,CAAC,CAACC,CAAAA,GAAAA;QACf,MAAMC,QAAAA,GAAWD,CAAEjG,CAAAA,MAAM,IAAI,MAAA;AAE7B,QAAA,IAAI,CAAC6F,SAAS,CAACK,QAAAA,CAAS,EAAE;YACxBL,SAAS,CAACK,SAAS,GAAG;AAAEH,gBAAAA,QAAAA,EAAU;AAAG,aAAA;AACvC;QAEAF,SAAS,CAACK,QAAS,CAAA,CAACH,QAAQ,CAACI,IAAI,CAACN,SAAS,CAACI,CAAE5F,CAAAA,EAAE,CAAC,CAAA;QACjDwF,SAAS,CAACK,QAAS,CAAA,CAACH,QAAQ,GAAGK,SAAO,CAAA,MAAA,EAAQP,SAAS,CAACK,QAAS,CAAA,CAACH,QAAQ,CAAA;AAC1E,QAAA,OAAOF,SAAS,CAACI,CAAAA,CAAE5F,EAAE,CAAC,CAACL,MAAM;AAC/B,KAAA,CAAA;IAEA,OAAO6F,SAAAA,CAAUC,IAAI,CAACC,QAAQ;AAChC,CAAA;AAEA,aAAe;AACbpF,IAAAA,MAAAA;AACAsE,IAAAA,MAAAA;AACA3D,IAAAA,WAAAA;AACAuB,IAAAA,MAAAA;AACAxD,IAAAA,gBAAAA;AACA8F,IAAAA;AACF,CAAE;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"folder.mjs","sources":["../../../server/src/services/folder.ts"],"sourcesContent":["import { sortBy, map, isUndefined } from 'lodash/fp';\nimport { strings, setCreatorFields } from '@strapi/utils';\nimport { FOLDER_MODEL_UID, FILE_MODEL_UID } from '../constants';\nimport { getService } from '../utils';\n\nimport type { File, Folder } from '../types';\n\ntype FolderMap = {\n [key: string]: Partial<Folder> & {\n children: FolderNode[];\n };\n};\n\ntype FolderNode = Partial<Folder> & {\n children: FolderNode[];\n};\n\nconst setPathIdAndPath = async (folder: Pick<Folder, 'parent'>) => {\n const { max } = await strapi.db\n .queryBuilder(FOLDER_MODEL_UID)\n .max('pathId')\n .first()\n .execute<{ max: number }>();\n\n const pathId = max + 1;\n let parentPath = '/';\n if (folder.parent) {\n const parentFolder = await strapi.db\n .query(FOLDER_MODEL_UID)\n .findOne({ where: { id: folder.parent } });\n\n parentPath = parentFolder.path;\n }\n\n return Object.assign(folder, {\n pathId,\n path: strings.joinBy('/', parentPath, `${pathId}`),\n });\n};\n\nconst create = async (\n folderData: Pick<Folder, 'name' | 'parent'>,\n opts?: { user: { id: string | number } }\n) => {\n const folderService = getService('folder');\n\n const { user } = opts || {};\n\n let enrichedFolder = await folderService.setPathIdAndPath(folderData);\n if (user) {\n enrichedFolder = await setCreatorFields({ user })(enrichedFolder);\n }\n\n const folder = await strapi.db.query(FOLDER_MODEL_UID).create({ data: enrichedFolder });\n\n strapi.eventHub.emit('media-folder.create', { folder });\n\n return folder;\n};\n\n/**\n * Recursively delete folders and included files\n * @param ids ids of the folders to delete\n * @returns {Promise<Object[]>}\n */\nconst deleteByIds = async (ids = []) => {\n const folders = await strapi.db.query(FOLDER_MODEL_UID).findMany({ where: { id: { $in: ids } } });\n if (folders.length === 0) {\n return {\n folders: [],\n totalFolderNumber: 0,\n totalFileNumber: 0,\n };\n }\n\n const pathsToDelete = map('path', folders);\n\n // delete files\n const filesToDelete = await strapi.db.query(FILE_MODEL_UID).findMany({\n where: {\n $or: pathsToDelete.flatMap((path) => [\n { folderPath: { $eq: path } },\n { folderPath: { $startsWith: `${path}/` } },\n ]),\n },\n });\n\n await Promise.all(filesToDelete.map((file: File) => getService('upload').remove(file)));\n\n // delete folders and subfolders\n const { count: totalFolderNumber } = await strapi.db.query(FOLDER_MODEL_UID).deleteMany({\n where: {\n $or: pathsToDelete.flatMap((path) => [\n { path: { $eq: path } },\n { path: { $startsWith: `${path}/` } },\n ]),\n },\n });\n\n strapi.eventHub.emit('media-folder.delete', { folders });\n\n return {\n folders,\n totalFolderNumber,\n totalFileNumber: filesToDelete.length,\n };\n};\n\n/**\n * Update name and location of a folder and its belonging folders and files\n */\nconst update = async (\n id: number,\n {\n name,\n parent,\n }: {\n name: string;\n parent: number | null;\n },\n { user }: { user: { id: string | number } }\n) => {\n // only name is updated\n if (isUndefined(parent)) {\n const existingFolder = await strapi.db.query(FOLDER_MODEL_UID).findOne({ where: { id } });\n\n if (!existingFolder) {\n return undefined;\n }\n\n const newFolder = setCreatorFields({ user, isEdition: true })({ name, parent });\n\n if (isUndefined(parent)) {\n const folder = await strapi.db\n .query(FOLDER_MODEL_UID)\n .update({ where: { id }, data: newFolder });\n\n return folder;\n }\n // location is updated => using transaction\n } else {\n const trx = await strapi.db.transaction();\n try {\n // fetch existing folder\n const existingFolder = await strapi.db\n .queryBuilder(FOLDER_MODEL_UID)\n .select(['pathId', 'path'])\n .where({ id })\n .transacting(trx.get())\n .forUpdate()\n .first()\n .execute<Folder>();\n\n // update parent folder (delete + insert; upsert not possible)\n // @ts-expect-error - no dynamic types\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]: id })\n .execute();\n\n if (parent !== null) {\n await strapi.db\n .queryBuilder(joinTable.name)\n .transacting(trx.get())\n .insert({ [joinTable.inverseJoinColumn.name]: parent, [joinTable.joinColumn.name]: id })\n .where({ [joinTable.joinColumn.name]: id })\n .execute();\n }\n\n // fetch destinationFolder path\n let destinationFolderPath = '/';\n if (parent !== null) {\n const destinationFolder = await strapi.db\n .queryBuilder(FOLDER_MODEL_UID)\n .select('path')\n .where({ id: parent })\n .transacting(trx.get())\n .first()\n .execute<Folder>();\n destinationFolderPath = destinationFolder.path;\n }\n\n const folderTable = strapi.getModel(FOLDER_MODEL_UID).collectionName;\n const fileTable = strapi.getModel(FILE_MODEL_UID).collectionName;\n const folderPathColumnName =\n // @ts-expect-error - no dynamic types\n strapi.db.metadata.get(FILE_MODEL_UID).attributes.folderPath.columnName;\n // @ts-expect-error - no dynamic types\n const pathColumnName = strapi.db.metadata.get(FOLDER_MODEL_UID).attributes.path.columnName;\n\n // update folders below\n await strapi.db\n .getConnection(folderTable)\n .transacting(trx.get())\n .where(pathColumnName, existingFolder.path)\n .orWhere(pathColumnName, 'like', `${existingFolder.path}/%`)\n .update(\n pathColumnName,\n strapi.db.connection.raw('REPLACE(??, ?, ?)', [\n pathColumnName,\n existingFolder.path,\n strings.joinBy('/', destinationFolderPath, `${existingFolder.pathId}`),\n ])\n );\n\n // update files below\n await strapi.db\n .getConnection(fileTable)\n .transacting(trx.get())\n .where(folderPathColumnName, existingFolder.path)\n .orWhere(folderPathColumnName, 'like', `${existingFolder.path}/%`)\n .update(\n folderPathColumnName,\n strapi.db.connection.raw('REPLACE(??, ?, ?)', [\n folderPathColumnName,\n existingFolder.path,\n strings.joinBy('/', destinationFolderPath, `${existingFolder.pathId}`),\n ])\n );\n\n await trx.commit();\n } catch (e) {\n await trx.rollback();\n throw e;\n }\n\n // update less critical information (name + updatedBy)\n const newFolder = setCreatorFields({ user, isEdition: true })({ name });\n\n const folder = await strapi.db\n .query(FOLDER_MODEL_UID)\n .update({ where: { id }, data: newFolder });\n\n strapi.eventHub.emit('media-folder.update', { folder });\n return folder;\n }\n};\n\n/**\n * Check if a folder exists in database\n * @param params query params to find the folder\n * @returns {Promise<boolean>}\n */\nconst exists = async (params = {}) => {\n const count = await strapi.db.query(FOLDER_MODEL_UID).count({ where: params });\n return count > 0;\n};\n\n/**\n * Returns the nested structure of folders\n * @returns {Promise<array>}\n */\nconst getStructure = async () => {\n // @ts-expect-error - no dynamic types\n const { joinTable } = strapi.db.metadata.get(FOLDER_MODEL_UID).attributes.parent;\n const qb = strapi.db.queryBuilder(FOLDER_MODEL_UID);\n const alias = qb.getAlias();\n const folders = (await qb\n .select(['id', 'name', `${alias}.${joinTable.inverseJoinColumn.name} as parent`])\n .join({\n alias,\n referencedTable: joinTable.name,\n referencedColumn: joinTable.joinColumn.name,\n rootColumn: joinTable.joinColumn.referencedColumn,\n rootTable: qb.alias,\n })\n .execute({ mapResults: false })) as Folder[];\n\n const folderMap: FolderMap = {\n null: { children: [] },\n };\n\n folders.forEach((f) => {\n folderMap[f.id] = { ...f, children: [] };\n });\n\n folders.forEach((f) => {\n const parentId = f.parent || 'null';\n\n if (!folderMap[parentId]) {\n folderMap[parentId] = { children: [] };\n }\n\n folderMap[parentId].children.push(folderMap[f.id]);\n folderMap[parentId].children = sortBy('name', folderMap[parentId].children);\n delete folderMap[f.id].parent;\n });\n\n return folderMap.null.children;\n};\n\nexport default {\n create,\n exists,\n deleteByIds,\n update,\n setPathIdAndPath,\n getStructure,\n};\n"],"names":["setPathIdAndPath","folder","max","strapi","db","queryBuilder","FOLDER_MODEL_UID","first","execute","pathId","parentPath","parent","parentFolder","query","findOne","where","id","path","Object","assign","strings","joinBy","create","folderData","opts","folderService","getService","user","enrichedFolder","setCreatorFields","data","eventHub","emit","deleteByIds","ids","folders","findMany","$in","length","totalFolderNumber","totalFileNumber","pathsToDelete","map","filesToDelete","FILE_MODEL_UID","$or","flatMap","folderPath","$eq","$startsWith","Promise","all","file","remove","count","deleteMany","update","name","isUndefined","existingFolder","undefined","newFolder","isEdition","trx","transaction","select","transacting","get","forUpdate","joinTable","metadata","attributes","delete","joinColumn","insert","inverseJoinColumn","destinationFolderPath","destinationFolder","folderTable","getModel","collectionName","fileTable","folderPathColumnName","columnName","pathColumnName","getConnection","orWhere","connection","raw","commit","e","rollback","exists","params","getStructure","qb","alias","getAlias","join","referencedTable","referencedColumn","rootColumn","rootTable","mapResults","folderMap","null","children","forEach","f","parentId","push","sortBy"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"folder.mjs","sources":["../../../server/src/services/folder.ts"],"sourcesContent":["import { sortBy, map, isUndefined } from 'lodash/fp';\nimport { strings, setCreatorFields } from '@strapi/utils';\nimport { FOLDER_MODEL_UID, FILE_MODEL_UID } from '../constants';\nimport { getService } from '../utils';\n\nimport type { File, Folder } from '../types';\n\ntype FolderMap = {\n [key: string]: Partial<Folder> & {\n children: FolderNode[];\n };\n};\n\ntype FolderNode = Partial<Folder> & {\n children: FolderNode[];\n};\n\nconst setPathIdAndPath = async (folder: Pick<Folder, 'parent'>) => {\n const { max } = await strapi.db\n .queryBuilder(FOLDER_MODEL_UID)\n .max('pathId')\n .first()\n .execute<{ max: number }>();\n\n const pathId = max + 1;\n let parentPath = '/';\n if (folder.parent) {\n const parentFolder = await strapi.db\n .query(FOLDER_MODEL_UID)\n .findOne({ where: { id: folder.parent } });\n\n parentPath = parentFolder.path;\n }\n\n return Object.assign(folder, {\n pathId,\n path: strings.joinBy('/', parentPath, `${pathId}`),\n });\n};\n\nconst create = async (\n folderData: Pick<Folder, 'name' | 'parent'>,\n opts?: { user: { id: string | number } }\n) => {\n const folderService = getService('folder');\n\n const { user } = opts || {};\n\n let enrichedFolder = await folderService.setPathIdAndPath(folderData);\n if (user) {\n enrichedFolder = await setCreatorFields({ user })(enrichedFolder);\n }\n\n const folder = await strapi.db.query(FOLDER_MODEL_UID).create({ data: enrichedFolder });\n\n strapi.eventHub.emit('media-folder.create', { folder });\n\n return folder;\n};\n\n/**\n * Recursively delete folders and included files\n * @param ids ids of the folders to delete\n * @returns {Promise<Object[]>}\n */\nconst deleteByIds = async (ids = []) => {\n const folders = await strapi.db.query(FOLDER_MODEL_UID).findMany({ where: { id: { $in: ids } } });\n if (folders.length === 0) {\n return {\n folders: [],\n totalFolderNumber: 0,\n totalFileNumber: 0,\n };\n }\n\n const pathsToDelete = map('path', folders);\n\n // delete files\n const filesToDelete = await strapi.db.query(FILE_MODEL_UID).findMany({\n where: {\n $or: pathsToDelete.flatMap((path) => [\n { folderPath: { $eq: path } },\n { folderPath: { $startsWith: `${path}/` } },\n ]),\n },\n });\n\n await Promise.all(filesToDelete.map((file: File) => getService('upload').remove(file)));\n\n // delete folders and subfolders\n const { count: totalFolderNumber } = await strapi.db.query(FOLDER_MODEL_UID).deleteMany({\n where: {\n $or: pathsToDelete.flatMap((path) => [\n { path: { $eq: path } },\n { path: { $startsWith: `${path}/` } },\n ]),\n },\n });\n\n strapi.eventHub.emit('media-folder.delete', { folders });\n\n return {\n folders,\n totalFolderNumber,\n totalFileNumber: filesToDelete.length,\n };\n};\n\n/**\n * Update name and location of a folder and its belonging folders and files\n */\nconst update = async (\n id: number,\n {\n name,\n parent,\n }: {\n name: string;\n parent: number | null;\n },\n { user }: { user: { id: string | number } }\n) => {\n // only name is updated\n if (isUndefined(parent)) {\n const existingFolder = await strapi.db.query(FOLDER_MODEL_UID).findOne({ where: { id } });\n\n if (!existingFolder) {\n return undefined;\n }\n\n const newFolder = setCreatorFields({ user, isEdition: true })({ name, parent });\n\n if (isUndefined(parent)) {\n const folder = await strapi.db\n .query(FOLDER_MODEL_UID)\n .update({ where: { id }, data: newFolder });\n\n return folder;\n }\n // location is updated => using transaction\n } else {\n const trx = await strapi.db.transaction();\n try {\n // fetch existing folder\n const existingFolder = await strapi.db\n .queryBuilder(FOLDER_MODEL_UID)\n .select(['pathId', 'path'])\n .where({ id })\n .transacting(trx.get())\n .forUpdate()\n .first()\n .execute<Folder>();\n\n // update parent folder (delete + insert; upsert not possible)\n // @ts-expect-error - no dynamic types\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]: id })\n .execute();\n\n if (parent !== null) {\n await strapi.db\n .queryBuilder(joinTable.name)\n .transacting(trx.get())\n .insert({ [joinTable.inverseJoinColumn.name]: parent, [joinTable.joinColumn.name]: id })\n .where({ [joinTable.joinColumn.name]: id })\n .execute();\n }\n\n // fetch destinationFolder path\n let destinationFolderPath = '/';\n if (parent !== null) {\n const destinationFolder = await strapi.db\n .queryBuilder(FOLDER_MODEL_UID)\n .select('path')\n .where({ id: parent })\n .transacting(trx.get())\n .first()\n .execute<Folder>();\n destinationFolderPath = destinationFolder.path;\n }\n\n const folderTable = strapi.getModel(FOLDER_MODEL_UID).collectionName;\n const fileTable = strapi.getModel(FILE_MODEL_UID).collectionName;\n const folderPathColumnName =\n // @ts-expect-error - no dynamic types\n strapi.db.metadata.get(FILE_MODEL_UID).attributes.folderPath.columnName;\n // @ts-expect-error - no dynamic types\n const pathColumnName = strapi.db.metadata.get(FOLDER_MODEL_UID).attributes.path.columnName;\n\n // update folders below\n await strapi.db\n .getConnection(folderTable)\n .transacting(trx.get())\n .where(pathColumnName, existingFolder.path)\n .orWhere(pathColumnName, 'like', `${existingFolder.path}/%`)\n .update(\n pathColumnName,\n strapi.db.connection.raw('REPLACE(??, ?, ?)', [\n pathColumnName,\n existingFolder.path,\n strings.joinBy('/', destinationFolderPath, `${existingFolder.pathId}`),\n ])\n );\n\n // update files below\n await strapi.db\n .getConnection(fileTable)\n .transacting(trx.get())\n .where(folderPathColumnName, existingFolder.path)\n .orWhere(folderPathColumnName, 'like', `${existingFolder.path}/%`)\n .update(\n folderPathColumnName,\n strapi.db.connection.raw('REPLACE(??, ?, ?)', [\n folderPathColumnName,\n existingFolder.path,\n strings.joinBy('/', destinationFolderPath, `${existingFolder.pathId}`),\n ])\n );\n\n await trx.commit();\n } catch (e) {\n await trx.rollback();\n throw e;\n }\n\n // update less critical information (name + updatedBy)\n const newFolder = setCreatorFields({ user, isEdition: true })({ name });\n\n const folder = await strapi.db\n .query(FOLDER_MODEL_UID)\n .update({ where: { id }, data: newFolder });\n\n strapi.eventHub.emit('media-folder.update', { folder });\n return folder;\n }\n};\n\n/**\n * Check if a folder exists in database\n * @param params query params to find the folder\n * @returns {Promise<boolean>}\n */\nconst exists = async (params = {}) => {\n const count = await strapi.db.query(FOLDER_MODEL_UID).count({ where: params });\n return count > 0;\n};\n\n/**\n * Returns the nested structure of folders\n * @returns {Promise<array>}\n */\nconst getStructure = async () => {\n // @ts-expect-error - no dynamic types\n const { joinTable } = strapi.db.metadata.get(FOLDER_MODEL_UID).attributes.parent;\n const qb = strapi.db.queryBuilder(FOLDER_MODEL_UID);\n const alias = qb.getAlias();\n const folders = (await qb\n .select(['id', 'name', `${alias}.${joinTable.inverseJoinColumn.name} as parent`])\n .join({\n alias,\n referencedTable: joinTable.name,\n referencedColumn: joinTable.joinColumn.name,\n rootColumn: joinTable.joinColumn.referencedColumn,\n rootTable: qb.alias,\n })\n .execute({ mapResults: false })) as Folder[];\n\n const folderMap: FolderMap = {\n null: { children: [] },\n };\n\n folders.forEach((f) => {\n folderMap[f.id] = { ...f, children: [] };\n });\n\n folders.forEach((f) => {\n const parentId = f.parent || 'null';\n\n if (!folderMap[parentId]) {\n folderMap[parentId] = { children: [] };\n }\n\n folderMap[parentId].children.push(folderMap[f.id]);\n folderMap[parentId].children = sortBy('name', folderMap[parentId].children);\n delete folderMap[f.id].parent;\n });\n\n return folderMap.null.children;\n};\n\nexport default {\n create,\n exists,\n deleteByIds,\n update,\n setPathIdAndPath,\n getStructure,\n};\n"],"names":["setPathIdAndPath","folder","max","strapi","db","queryBuilder","FOLDER_MODEL_UID","first","execute","pathId","parentPath","parent","parentFolder","query","findOne","where","id","path","Object","assign","strings","joinBy","create","folderData","opts","folderService","getService","user","enrichedFolder","setCreatorFields","data","eventHub","emit","deleteByIds","ids","folders","findMany","$in","length","totalFolderNumber","totalFileNumber","pathsToDelete","map","filesToDelete","FILE_MODEL_UID","$or","flatMap","folderPath","$eq","$startsWith","Promise","all","file","remove","count","deleteMany","update","name","isUndefined","existingFolder","undefined","newFolder","isEdition","trx","transaction","select","transacting","get","forUpdate","joinTable","metadata","attributes","delete","joinColumn","insert","inverseJoinColumn","destinationFolderPath","destinationFolder","folderTable","getModel","collectionName","fileTable","folderPathColumnName","columnName","pathColumnName","getConnection","orWhere","connection","raw","commit","e","rollback","exists","params","getStructure","qb","alias","getAlias","join","referencedTable","referencedColumn","rootColumn","rootTable","mapResults","folderMap","null","children","forEach","f","parentId","push","sortBy"],"mappings":"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"}
|
|
@@ -37,7 +37,7 @@ const writeStreamToFile = (stream, path)=>new Promise((resolve, reject)=>{
|
|
|
37
37
|
// Reject promise if there is an error with the provided stream
|
|
38
38
|
stream.on('error', reject);
|
|
39
39
|
stream.pipe(writeStream);
|
|
40
|
-
writeStream.on('close', resolve);
|
|
40
|
+
writeStream.on('close', ()=>resolve());
|
|
41
41
|
writeStream.on('error', reject);
|
|
42
42
|
});
|
|
43
43
|
const getMetadata = (file)=>{
|