@strapi/upload 5.59.0 → 5.61.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/components/AssetPickerDialog/AssetPickerDialog.js +434 -0
- package/dist/admin/components/AssetPickerDialog/AssetPickerDialog.js.map +1 -0
- package/dist/admin/components/AssetPickerDialog/AssetPickerDialog.mjs +432 -0
- package/dist/admin/components/AssetPickerDialog/AssetPickerDialog.mjs.map +1 -0
- package/dist/admin/components/AssetPickerDialog/FolderBreadcrumbs.js +91 -0
- package/dist/admin/components/AssetPickerDialog/FolderBreadcrumbs.js.map +1 -0
- package/dist/admin/components/AssetPickerDialog/FolderBreadcrumbs.mjs +89 -0
- package/dist/admin/components/AssetPickerDialog/FolderBreadcrumbs.mjs.map +1 -0
- package/dist/admin/components/AssetPickerDialog/MediaLibraryPickerDialog.js +29 -0
- package/dist/admin/components/AssetPickerDialog/MediaLibraryPickerDialog.js.map +1 -0
- package/dist/admin/components/AssetPickerDialog/MediaLibraryPickerDialog.mjs +27 -0
- package/dist/admin/components/AssetPickerDialog/MediaLibraryPickerDialog.mjs.map +1 -0
- package/dist/admin/components/AssetPickerDialog/PickerSelectionProvider.js +178 -0
- package/dist/admin/components/AssetPickerDialog/PickerSelectionProvider.js.map +1 -0
- package/dist/admin/components/AssetPickerDialog/PickerSelectionProvider.mjs +175 -0
- package/dist/admin/components/AssetPickerDialog/PickerSelectionProvider.mjs.map +1 -0
- package/dist/admin/components/AssetPickerDialog/SortableSelection.js +143 -0
- package/dist/admin/components/AssetPickerDialog/SortableSelection.js.map +1 -0
- package/dist/admin/components/AssetPickerDialog/SortableSelection.mjs +141 -0
- package/dist/admin/components/AssetPickerDialog/SortableSelection.mjs.map +1 -0
- package/dist/admin/components/AssetPickerDialog/pickerSelection.js +49 -0
- package/dist/admin/components/AssetPickerDialog/pickerSelection.js.map +1 -0
- package/dist/admin/components/AssetPickerDialog/pickerSelection.mjs +41 -0
- package/dist/admin/components/AssetPickerDialog/pickerSelection.mjs.map +1 -0
- package/dist/admin/components/Drawer.js +12 -7
- package/dist/admin/components/Drawer.js.map +1 -1
- package/dist/admin/components/Drawer.mjs +12 -7
- package/dist/admin/components/Drawer.mjs.map +1 -1
- package/dist/admin/components/EditorFileDropZone/EditorFileDropZone.js +188 -0
- package/dist/admin/components/EditorFileDropZone/EditorFileDropZone.js.map +1 -0
- package/dist/admin/components/EditorFileDropZone/EditorFileDropZone.mjs +186 -0
- package/dist/admin/components/EditorFileDropZone/EditorFileDropZone.mjs.map +1 -0
- package/dist/admin/components/MediaLibraryInput/AddAssetMenu.js +9 -4
- package/dist/admin/components/MediaLibraryInput/AddAssetMenu.js.map +1 -1
- package/dist/admin/components/MediaLibraryInput/AddAssetMenu.mjs +9 -4
- package/dist/admin/components/MediaLibraryInput/AddAssetMenu.mjs.map +1 -1
- package/dist/admin/components/MediaLibraryInput/AssetCard.js +240 -0
- package/dist/admin/components/MediaLibraryInput/AssetCard.js.map +1 -0
- package/dist/admin/components/MediaLibraryInput/AssetCard.mjs +237 -0
- package/dist/admin/components/MediaLibraryInput/AssetCard.mjs.map +1 -0
- package/dist/admin/components/MediaLibraryInput/AssetCarousel.js +161 -0
- package/dist/admin/components/MediaLibraryInput/AssetCarousel.js.map +1 -0
- package/dist/admin/components/MediaLibraryInput/AssetCarousel.mjs +159 -0
- package/dist/admin/components/MediaLibraryInput/AssetCarousel.mjs.map +1 -0
- package/dist/admin/components/MediaLibraryInput/AssetDropZone.js +76 -49
- package/dist/admin/components/MediaLibraryInput/AssetDropZone.js.map +1 -1
- package/dist/admin/components/MediaLibraryInput/AssetDropZone.mjs +77 -50
- package/dist/admin/components/MediaLibraryInput/AssetDropZone.mjs.map +1 -1
- package/dist/admin/components/MediaLibraryInput/AssetPreview.js +109 -0
- package/dist/admin/components/MediaLibraryInput/AssetPreview.js.map +1 -0
- package/dist/admin/components/MediaLibraryInput/AssetPreview.mjs +106 -0
- package/dist/admin/components/MediaLibraryInput/AssetPreview.mjs.map +1 -0
- package/dist/admin/components/MediaLibraryInput/AssetRow.js +146 -79
- package/dist/admin/components/MediaLibraryInput/AssetRow.js.map +1 -1
- package/dist/admin/components/MediaLibraryInput/AssetRow.mjs +148 -82
- package/dist/admin/components/MediaLibraryInput/AssetRow.mjs.map +1 -1
- package/dist/admin/components/MediaLibraryInput/FieldControls.js +32 -0
- package/dist/admin/components/MediaLibraryInput/FieldControls.js.map +1 -0
- package/dist/admin/components/MediaLibraryInput/FieldControls.mjs +29 -0
- package/dist/admin/components/MediaLibraryInput/FieldControls.mjs.map +1 -0
- package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.js +163 -111
- package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.js.map +1 -1
- package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.mjs +162 -114
- package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.mjs.map +1 -1
- package/dist/admin/components/MediaLibraryInput/UploadProgressBar.js +42 -0
- package/dist/admin/components/MediaLibraryInput/UploadProgressBar.js.map +1 -0
- package/dist/admin/components/MediaLibraryInput/UploadProgressBar.mjs +40 -0
- package/dist/admin/components/MediaLibraryInput/UploadProgressBar.mjs.map +1 -0
- package/dist/admin/components/MediaLibraryInput/openAssetDetails.js +46 -0
- package/dist/admin/components/MediaLibraryInput/openAssetDetails.js.map +1 -0
- package/dist/admin/components/MediaLibraryInput/openAssetDetails.mjs +43 -0
- package/dist/admin/components/MediaLibraryInput/openAssetDetails.mjs.map +1 -0
- package/dist/admin/components/MediaLibraryInput/useFieldUploads.js +122 -0
- package/dist/admin/components/MediaLibraryInput/useFieldUploads.js.map +1 -0
- package/dist/admin/components/MediaLibraryInput/useFieldUploads.mjs +120 -0
- package/dist/admin/components/MediaLibraryInput/useFieldUploads.mjs.map +1 -0
- package/dist/admin/components/UploadProgressDialog.js +2 -1
- package/dist/admin/components/UploadProgressDialog.js.map +1 -1
- package/dist/admin/components/UploadProgressDialog.mjs +2 -1
- package/dist/admin/components/UploadProgressDialog.mjs.map +1 -1
- package/dist/admin/hooks/useMediaLibraryPermissions.js +12 -2
- package/dist/admin/hooks/useMediaLibraryPermissions.js.map +1 -1
- package/dist/admin/hooks/useMediaLibraryPermissions.mjs +12 -2
- package/dist/admin/hooks/useMediaLibraryPermissions.mjs.map +1 -1
- package/dist/admin/index.js +10 -1
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +10 -1
- package/dist/admin/index.mjs.map +1 -1
- package/dist/admin/pages/Assets/AssetsPage.js +14 -303
- package/dist/admin/pages/Assets/AssetsPage.js.map +1 -1
- package/dist/admin/pages/Assets/AssetsPage.mjs +13 -282
- package/dist/admin/pages/Assets/AssetsPage.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/AssetDetails/AssetCropEditor.mjs +2 -2
- package/dist/admin/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js +181 -65
- package/dist/admin/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js.map +1 -1
- package/dist/admin/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs +184 -69
- package/dist/admin/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/AssetDetails/AssetPreview.mjs +1 -1
- package/dist/admin/pages/Assets/components/AssetsGrid.js +142 -31
- package/dist/admin/pages/Assets/components/AssetsGrid.js.map +1 -1
- package/dist/admin/pages/Assets/components/AssetsGrid.mjs +145 -34
- package/dist/admin/pages/Assets/components/AssetsGrid.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/AssetsSearchInput.js +43 -2
- package/dist/admin/pages/Assets/components/AssetsSearchInput.js.map +1 -1
- package/dist/admin/pages/Assets/components/AssetsSearchInput.mjs +45 -4
- package/dist/admin/pages/Assets/components/AssetsSearchInput.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/AssetsTable.js +58 -34
- package/dist/admin/pages/Assets/components/AssetsTable.js.map +1 -1
- package/dist/admin/pages/Assets/components/AssetsTable.mjs +60 -36
- package/dist/admin/pages/Assets/components/AssetsTable.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/AssetsView.js +145 -0
- package/dist/admin/pages/Assets/components/AssetsView.js.map +1 -0
- package/dist/admin/pages/Assets/components/AssetsView.mjs +143 -0
- package/dist/admin/pages/Assets/components/AssetsView.mjs.map +1 -0
- package/dist/admin/pages/Assets/components/BulkActionsBar.mjs +1 -1
- package/dist/admin/pages/Assets/components/BusyOverlay.mjs +1 -1
- package/dist/admin/pages/Assets/components/Dnd/DragOverlayChip.mjs +1 -1
- package/dist/admin/pages/Assets/components/Dnd/ReorderHandle.js +40 -0
- package/dist/admin/pages/Assets/components/Dnd/ReorderHandle.js.map +1 -0
- package/dist/admin/pages/Assets/components/Dnd/ReorderHandle.mjs +38 -0
- package/dist/admin/pages/Assets/components/Dnd/ReorderHandle.mjs.map +1 -0
- package/dist/admin/pages/Assets/components/Dnd/assetSortable.js +29 -0
- package/dist/admin/pages/Assets/components/Dnd/assetSortable.js.map +1 -0
- package/dist/admin/pages/Assets/components/Dnd/assetSortable.mjs +24 -0
- package/dist/admin/pages/Assets/components/Dnd/assetSortable.mjs.map +1 -0
- package/dist/admin/pages/Assets/components/Dnd/dndIds.js +5 -0
- package/dist/admin/pages/Assets/components/Dnd/dndIds.js.map +1 -1
- package/dist/admin/pages/Assets/components/Dnd/dndIds.mjs +5 -1
- package/dist/admin/pages/Assets/components/Dnd/dndIds.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/Dnd/useAssetDnd.js +41 -13
- package/dist/admin/pages/Assets/components/Dnd/useAssetDnd.js.map +1 -1
- package/dist/admin/pages/Assets/components/Dnd/useAssetDnd.mjs +41 -13
- package/dist/admin/pages/Assets/components/Dnd/useAssetDnd.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/FilterBadges.mjs +2 -2
- package/dist/admin/pages/Assets/components/FilterMenu.mjs +2 -2
- package/dist/admin/pages/Assets/components/FolderTree/FolderTree.js +274 -55
- package/dist/admin/pages/Assets/components/FolderTree/FolderTree.js.map +1 -1
- package/dist/admin/pages/Assets/components/FolderTree/FolderTree.mjs +277 -59
- package/dist/admin/pages/Assets/components/FolderTree/FolderTree.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/FolderTree/collapsedBranch.js +32 -0
- package/dist/admin/pages/Assets/components/FolderTree/collapsedBranch.js.map +1 -0
- package/dist/admin/pages/Assets/components/FolderTree/collapsedBranch.mjs +29 -0
- package/dist/admin/pages/Assets/components/FolderTree/collapsedBranch.mjs.map +1 -0
- package/dist/admin/pages/Assets/components/ViewToggle.js +126 -0
- package/dist/admin/pages/Assets/components/ViewToggle.js.map +1 -0
- package/dist/admin/pages/Assets/components/ViewToggle.mjs +104 -0
- package/dist/admin/pages/Assets/components/ViewToggle.mjs.map +1 -0
- package/dist/admin/pages/Assets/hooks/useAssetSearch.js +2 -2
- package/dist/admin/pages/Assets/hooks/useAssetSearch.js.map +1 -1
- package/dist/admin/pages/Assets/hooks/useAssetSearch.mjs +2 -2
- package/dist/admin/pages/Assets/hooks/useAssetSearch.mjs.map +1 -1
- package/dist/admin/pages/Assets/hooks/useAssetSelection.js +19 -1
- package/dist/admin/pages/Assets/hooks/useAssetSelection.js.map +1 -1
- package/dist/admin/pages/Assets/hooks/useAssetSelection.mjs +20 -3
- package/dist/admin/pages/Assets/hooks/useAssetSelection.mjs.map +1 -1
- package/dist/admin/pages/Assets/hooks/useAssetsList.js +87 -0
- package/dist/admin/pages/Assets/hooks/useAssetsList.js.map +1 -0
- package/dist/admin/pages/Assets/hooks/useAssetsList.mjs +85 -0
- package/dist/admin/pages/Assets/hooks/useAssetsList.mjs.map +1 -0
- package/dist/admin/pages/Assets/hooks/useBusyAssets.mjs +1 -1
- package/dist/admin/pages/Assets/hooks/useFolderNavigation.js +2 -1
- package/dist/admin/pages/Assets/hooks/useFolderNavigation.js.map +1 -1
- package/dist/admin/pages/Assets/hooks/useFolderNavigation.mjs +3 -2
- package/dist/admin/pages/Assets/hooks/useFolderNavigation.mjs.map +1 -1
- package/dist/admin/pages/Assets/hooks/useIsAssetDetailsOpen.js +2 -6
- package/dist/admin/pages/Assets/hooks/useIsAssetDetailsOpen.js.map +1 -1
- package/dist/admin/pages/Assets/hooks/useIsAssetDetailsOpen.mjs +2 -6
- package/dist/admin/pages/Assets/hooks/useIsAssetDetailsOpen.mjs.map +1 -1
- package/dist/admin/pages/Assets/hooks/useListFilters.js +2 -1
- package/dist/admin/pages/Assets/hooks/useListFilters.js.map +1 -1
- package/dist/admin/pages/Assets/hooks/useListFilters.mjs +3 -2
- package/dist/admin/pages/Assets/hooks/useListFilters.mjs.map +1 -1
- package/dist/admin/pages/Assets/hooks/useListQueryParams.js +80 -0
- package/dist/admin/pages/Assets/hooks/useListQueryParams.js.map +1 -0
- package/dist/admin/pages/Assets/hooks/useListQueryParams.mjs +77 -0
- package/dist/admin/pages/Assets/hooks/useListQueryParams.mjs.map +1 -0
- package/dist/admin/pages/Assets/hooks/useListSettings.js +32 -0
- package/dist/admin/pages/Assets/hooks/useListSettings.js.map +1 -0
- package/dist/admin/pages/Assets/hooks/useListSettings.mjs +29 -0
- package/dist/admin/pages/Assets/hooks/useListSettings.mjs.map +1 -0
- package/dist/admin/pages/Assets/hooks/useListSort.js +2 -1
- package/dist/admin/pages/Assets/hooks/useListSort.js.map +1 -1
- package/dist/admin/pages/Assets/hooks/useListSort.mjs +3 -2
- package/dist/admin/pages/Assets/hooks/useListSort.mjs.map +1 -1
- package/dist/admin/services/api.js +92 -7
- package/dist/admin/services/api.js.map +1 -1
- package/dist/admin/services/api.mjs +91 -9
- package/dist/admin/services/api.mjs.map +1 -1
- package/dist/admin/src/components/AssetPickerDialog/AssetPickerDialog.d.ts +19 -0
- package/dist/admin/src/components/AssetPickerDialog/FolderBreadcrumbs.d.ts +10 -0
- package/dist/admin/src/components/AssetPickerDialog/MediaLibraryPickerDialog.d.ts +19 -0
- package/dist/admin/src/components/AssetPickerDialog/PickerSelectionProvider.d.ts +28 -0
- package/dist/admin/src/components/AssetPickerDialog/SortableSelection.d.ts +12 -0
- package/dist/admin/src/components/AssetPickerDialog/pickerSelection.d.ts +26 -0
- package/dist/admin/src/components/Drawer.d.ts +8 -0
- package/dist/admin/src/components/EditorFileDropZone/EditorFileDropZone.d.ts +21 -0
- package/dist/admin/src/components/MediaLibraryInput/AddAssetMenu.d.ts +7 -1
- package/dist/admin/src/components/MediaLibraryInput/AssetCard.d.ts +25 -0
- package/dist/admin/src/components/MediaLibraryInput/AssetCarousel.d.ts +16 -0
- package/dist/admin/src/components/MediaLibraryInput/AssetDropZone.d.ts +11 -3
- package/dist/admin/src/components/MediaLibraryInput/AssetPreview.d.ts +17 -0
- package/dist/admin/src/components/MediaLibraryInput/AssetRow.d.ts +13 -3
- package/dist/admin/src/components/MediaLibraryInput/FieldControls.d.ts +19 -0
- package/dist/admin/src/components/MediaLibraryInput/MediaLibraryInput.d.ts +3 -1
- package/dist/admin/src/components/MediaLibraryInput/UploadProgressBar.d.ts +7 -0
- package/dist/admin/src/components/MediaLibraryInput/openAssetDetails.d.ts +10 -0
- package/dist/admin/src/components/MediaLibraryInput/useFieldUploads.d.ts +31 -0
- package/dist/admin/src/hooks/useMediaLibraryPermissions.d.ts +2 -0
- package/dist/admin/src/pages/Assets/components/AssetDetails/AssetDetailsDrawer.d.ts +41 -5
- package/dist/admin/src/pages/Assets/components/AssetsGrid.d.ts +3 -1
- package/dist/admin/src/pages/Assets/components/AssetsSearchInput.d.ts +11 -1
- package/dist/admin/src/pages/Assets/components/AssetsView.d.ts +29 -0
- package/dist/admin/src/pages/Assets/components/Dnd/ReorderHandle.d.ts +12 -0
- package/dist/admin/src/pages/Assets/components/Dnd/assetSortable.d.ts +37 -0
- package/dist/admin/src/pages/Assets/components/Dnd/dndIds.d.ts +5 -0
- package/dist/admin/src/pages/Assets/components/Dnd/useAssetDnd.d.ts +23 -2
- package/dist/admin/src/pages/Assets/components/FolderTree/FolderTree.d.ts +1 -0
- package/dist/admin/src/pages/Assets/components/FolderTree/collapsedBranch.d.ts +21 -0
- package/dist/admin/src/pages/Assets/components/ViewToggle.d.ts +8 -0
- package/dist/admin/src/pages/Assets/hooks/useAssetSelection.d.ts +26 -0
- package/dist/admin/src/pages/Assets/hooks/useAssetsList.d.ts +30 -0
- package/dist/admin/src/pages/Assets/hooks/useIsAssetDetailsOpen.d.ts +2 -6
- package/dist/admin/src/pages/Assets/hooks/useListQueryParams.d.ts +27 -0
- package/dist/admin/src/pages/Assets/hooks/useListSettings.d.ts +29 -0
- package/dist/admin/src/services/api.d.ts +24 -1
- package/dist/admin/src/store/uploadProgress.d.ts +14 -1
- package/dist/admin/src/utils/findFolderPath.d.ts +6 -0
- package/dist/admin/src/utils/isAllowedAssetType.d.ts +14 -0
- package/dist/admin/store/uploadProgress.js +30 -3
- package/dist/admin/store/uploadProgress.js.map +1 -1
- package/dist/admin/store/uploadProgress.mjs +29 -4
- package/dist/admin/store/uploadProgress.mjs.map +1 -1
- package/dist/admin/translations/en.json.js +24 -0
- package/dist/admin/translations/en.json.js.map +1 -1
- package/dist/admin/translations/en.json.mjs +24 -0
- package/dist/admin/translations/en.json.mjs.map +1 -1
- package/dist/admin/utils/findFolderPath.js +26 -0
- package/dist/admin/utils/findFolderPath.js.map +1 -0
- package/dist/admin/utils/findFolderPath.mjs +24 -0
- package/dist/admin/utils/findFolderPath.mjs.map +1 -0
- package/dist/admin/utils/isAllowedAssetType.js +33 -0
- package/dist/admin/utils/isAllowedAssetType.js.map +1 -0
- package/dist/admin/utils/isAllowedAssetType.mjs +31 -0
- package/dist/admin/utils/isAllowedAssetType.mjs.map +1 -0
- package/dist/server/audit-logs.js +264 -0
- package/dist/server/audit-logs.js.map +1 -0
- package/dist/server/audit-logs.mjs +255 -0
- package/dist/server/audit-logs.mjs.map +1 -0
- package/dist/server/bootstrap.js +4 -0
- package/dist/server/bootstrap.js.map +1 -1
- package/dist/server/bootstrap.mjs +4 -0
- package/dist/server/bootstrap.mjs.map +1 -1
- package/dist/server/controllers/admin-folder-file.js +23 -1
- package/dist/server/controllers/admin-folder-file.js.map +1 -1
- package/dist/server/controllers/admin-folder-file.mjs +23 -1
- package/dist/server/controllers/admin-folder-file.mjs.map +1 -1
- package/dist/server/controllers/admin-settings.js +5 -1
- package/dist/server/controllers/admin-settings.js.map +1 -1
- package/dist/server/controllers/admin-settings.mjs +5 -1
- package/dist/server/controllers/admin-settings.mjs.map +1 -1
- package/dist/server/services/folder.js +48 -1
- package/dist/server/services/folder.js.map +1 -1
- package/dist/server/services/folder.mjs +48 -1
- package/dist/server/services/folder.mjs.map +1 -1
- package/dist/server/services/image-manipulation.js +14 -7
- package/dist/server/services/image-manipulation.js.map +1 -1
- package/dist/server/services/image-manipulation.mjs +14 -7
- package/dist/server/services/image-manipulation.mjs.map +1 -1
- package/dist/server/services/upload.js +100 -16
- package/dist/server/services/upload.js.map +1 -1
- package/dist/server/services/upload.mjs +102 -18
- package/dist/server/services/upload.mjs.map +1 -1
- package/dist/server/src/audit-logs.d.ts +142 -0
- package/dist/server/src/audit-logs.d.ts.map +1 -0
- package/dist/server/src/bootstrap.d.ts.map +1 -1
- package/dist/server/src/controllers/admin-folder-file.d.ts.map +1 -1
- package/dist/server/src/controllers/admin-settings.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +4 -4
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/mcp/ambient-instance.d.ts.map +1 -1
- package/dist/server/src/services/extensions/utils.d.ts +11 -11
- package/dist/server/src/services/folder.d.ts.map +1 -1
- package/dist/server/src/services/image-manipulation.d.ts +4 -4
- package/dist/server/src/services/image-manipulation.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +4 -4
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/services/upload.d.ts.map +1 -1
- package/dist/server/src/types.d.ts +63 -12
- package/dist/server/src/types.d.ts.map +1 -1
- package/package.json +11 -16
- package/dist/admin/components/MediaLibraryInput/NoLibraryAccessDialog.js +0 -45
- package/dist/admin/components/MediaLibraryInput/NoLibraryAccessDialog.js.map +0 -1
- package/dist/admin/components/MediaLibraryInput/NoLibraryAccessDialog.mjs +0 -43
- package/dist/admin/components/MediaLibraryInput/NoLibraryAccessDialog.mjs.map +0 -1
- package/dist/admin/src/components/MediaLibraryInput/NoLibraryAccessDialog.d.ts +0 -10
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var utils = require('@strapi/utils');
|
|
4
|
+
|
|
5
|
+
const AUDITED_EVENTS = {
|
|
6
|
+
UPLOAD_SETTINGS_UPDATE: 'upload-settings.update',
|
|
7
|
+
MEDIA_CREATE: 'media.create',
|
|
8
|
+
MEDIA_UPDATE: 'media.update',
|
|
9
|
+
MEDIA_DELETE: 'media.delete',
|
|
10
|
+
MEDIA_MOVE: 'media.move',
|
|
11
|
+
FOLDER_CREATE: 'media-folder.create',
|
|
12
|
+
FOLDER_UPDATE: 'media-folder.update',
|
|
13
|
+
// Audit-only events. media.update is a webhook event that carries neither the file as it was
|
|
14
|
+
// nor its folder; media-folder.delete carries every deleted folder in one event.
|
|
15
|
+
MEDIA_UPDATE_AUDIT: 'media.update.audit',
|
|
16
|
+
FOLDER_DELETE_AUDIT: 'media-folder.delete.audit'
|
|
17
|
+
};
|
|
18
|
+
const AUDITED_SETTINGS = [
|
|
19
|
+
'sizeOptimization',
|
|
20
|
+
'responsiveDimensions',
|
|
21
|
+
'autoOrientation',
|
|
22
|
+
'aiMetadata'
|
|
23
|
+
];
|
|
24
|
+
// The store replaces the whole value, so an option missing from the request is removed and recorded as null.
|
|
25
|
+
const getUploadSettingsChanges = (previous, next)=>{
|
|
26
|
+
const changes = {};
|
|
27
|
+
for (const setting of AUDITED_SETTINGS){
|
|
28
|
+
const before = previous?.[setting] ?? null;
|
|
29
|
+
const after = next[setting] ?? null;
|
|
30
|
+
if (before !== after) {
|
|
31
|
+
changes[setting] = {
|
|
32
|
+
before,
|
|
33
|
+
after
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return changes;
|
|
38
|
+
};
|
|
39
|
+
const toFolderRef = (folder)=>folder ? {
|
|
40
|
+
id: Number(folder.id),
|
|
41
|
+
name: folder.name ?? null
|
|
42
|
+
} : null;
|
|
43
|
+
/** Picks the fields the audit log compares. */ const toAuditedFile = (file)=>({
|
|
44
|
+
id: Number(file.id),
|
|
45
|
+
name: file.name,
|
|
46
|
+
mime: file.mime,
|
|
47
|
+
size: file.size,
|
|
48
|
+
alternativeText: file.alternativeText ?? null,
|
|
49
|
+
caption: file.caption ?? null,
|
|
50
|
+
focalPoint: file.focalPoint ?? null,
|
|
51
|
+
folder: toFolderRef(file.folder)
|
|
52
|
+
});
|
|
53
|
+
const summarizeFile = (file)=>({
|
|
54
|
+
name: file.name,
|
|
55
|
+
mime: file.mime ?? null,
|
|
56
|
+
size: file.size ?? null
|
|
57
|
+
});
|
|
58
|
+
const getMediaChanges = ({ file: media, previous, replaced })=>{
|
|
59
|
+
const changes = {};
|
|
60
|
+
if (previous.name !== media.name) {
|
|
61
|
+
changes.name = {
|
|
62
|
+
before: previous.name,
|
|
63
|
+
after: media.name
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
// The admin sends '' for an empty field that is stored as null
|
|
67
|
+
const blankAsNull = (value)=>value || null;
|
|
68
|
+
for (const field of [
|
|
69
|
+
'alternativeText',
|
|
70
|
+
'caption'
|
|
71
|
+
]){
|
|
72
|
+
const before = previous[field] ?? null;
|
|
73
|
+
const after = media[field] ?? null;
|
|
74
|
+
if (blankAsNull(before) !== blankAsNull(after)) {
|
|
75
|
+
changes[field] = {
|
|
76
|
+
before,
|
|
77
|
+
after
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
const focalBefore = previous.focalPoint ?? null;
|
|
82
|
+
const focalAfter = media.focalPoint ?? null;
|
|
83
|
+
if (JSON.stringify(focalBefore) !== JSON.stringify(focalAfter)) {
|
|
84
|
+
changes.focalPoint = {
|
|
85
|
+
before: focalBefore,
|
|
86
|
+
after: focalAfter
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
const folderBefore = toFolderRef(previous.folder);
|
|
90
|
+
const folderAfter = toFolderRef(media.folder);
|
|
91
|
+
if ((folderBefore?.id ?? null) !== (folderAfter?.id ?? null)) {
|
|
92
|
+
changes.folder = {
|
|
93
|
+
before: folderBefore,
|
|
94
|
+
after: folderAfter
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
if (replaced) {
|
|
98
|
+
changes.file = {
|
|
99
|
+
before: summarizeFile(previous),
|
|
100
|
+
after: summarizeFile(media)
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
return changes;
|
|
104
|
+
};
|
|
105
|
+
const getFolderChanges = ({ folder, previous })=>{
|
|
106
|
+
if (!previous) {
|
|
107
|
+
return {};
|
|
108
|
+
}
|
|
109
|
+
const changes = {};
|
|
110
|
+
if (previous.name !== folder.name) {
|
|
111
|
+
changes.name = {
|
|
112
|
+
before: previous.name,
|
|
113
|
+
after: folder.name
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
const parentBefore = toFolderRef(previous.parent);
|
|
117
|
+
const parentAfter = toFolderRef(folder.parent);
|
|
118
|
+
if ((parentBefore?.id ?? null) !== (parentAfter?.id ?? null)) {
|
|
119
|
+
changes.parent = {
|
|
120
|
+
before: parentBefore,
|
|
121
|
+
after: parentAfter
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
return changes;
|
|
125
|
+
};
|
|
126
|
+
const readParents = async (read, joinTable, ids)=>{
|
|
127
|
+
if (ids.length === 0) {
|
|
128
|
+
return new Map();
|
|
129
|
+
}
|
|
130
|
+
const { joinColumn, inverseJoinColumn } = joinTable;
|
|
131
|
+
const rows = await read(joinTable.name).select(joinColumn.name, inverseJoinColumn.name).whereIn(joinColumn.name, ids);
|
|
132
|
+
return new Map(rows.map((row)=>[
|
|
133
|
+
Number(row[joinColumn.name]),
|
|
134
|
+
Number(row[inverseJoinColumn.name])
|
|
135
|
+
]));
|
|
136
|
+
};
|
|
137
|
+
const readMediaMoves = async (read, { files, folders, destinationFolderId, fileFolderJoinTable, folderParentJoinTable, folderTable })=>{
|
|
138
|
+
const fileParents = await readParents(read, fileFolderJoinTable, files.map((file)=>Number(file.id)));
|
|
139
|
+
const folderParents = await readParents(read, folderParentJoinTable, folders.map((folder)=>Number(folder.id)));
|
|
140
|
+
const destinationId = destinationFolderId === null ? null : Number(destinationFolderId);
|
|
141
|
+
const referencedIds = new Set([
|
|
142
|
+
...fileParents.values(),
|
|
143
|
+
...folderParents.values()
|
|
144
|
+
]);
|
|
145
|
+
if (destinationId !== null) {
|
|
146
|
+
referencedIds.add(destinationId);
|
|
147
|
+
}
|
|
148
|
+
const folderNames = new Map();
|
|
149
|
+
if (referencedIds.size > 0) {
|
|
150
|
+
const rows = await read(folderTable).select('id', 'name').whereIn('id', [
|
|
151
|
+
...referencedIds
|
|
152
|
+
]);
|
|
153
|
+
rows.forEach((row)=>folderNames.set(Number(row.id), row.name ?? null));
|
|
154
|
+
}
|
|
155
|
+
const toRef = (id)=>id == null ? null : {
|
|
156
|
+
id,
|
|
157
|
+
name: folderNames.get(id) ?? null
|
|
158
|
+
};
|
|
159
|
+
const to = toRef(destinationId);
|
|
160
|
+
return [
|
|
161
|
+
...files.map((file)=>({
|
|
162
|
+
kind: 'file',
|
|
163
|
+
id: Number(file.id),
|
|
164
|
+
name: file.name,
|
|
165
|
+
from: toRef(fileParents.get(Number(file.id))),
|
|
166
|
+
to
|
|
167
|
+
})),
|
|
168
|
+
...folders.map((folder)=>({
|
|
169
|
+
kind: 'folder',
|
|
170
|
+
id: Number(folder.id),
|
|
171
|
+
name: folder.name,
|
|
172
|
+
from: toRef(folderParents.get(Number(folder.id))),
|
|
173
|
+
to
|
|
174
|
+
}))
|
|
175
|
+
];
|
|
176
|
+
};
|
|
177
|
+
const emitMediaMoves = async ({ strapi }, moves)=>{
|
|
178
|
+
for (const move of moves){
|
|
179
|
+
if ((move.from?.id ?? null) !== (move.to?.id ?? null)) {
|
|
180
|
+
await utils.emitAudit({
|
|
181
|
+
strapi
|
|
182
|
+
}, AUDITED_EVENTS.MEDIA_MOVE, move);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
};
|
|
186
|
+
const registerAuditEvents = (auditLogsLifecycle)=>{
|
|
187
|
+
auditLogsLifecycle.registerEvent(AUDITED_EVENTS.UPLOAD_SETTINGS_UPDATE, (event)=>({
|
|
188
|
+
resource: {
|
|
189
|
+
type: 'upload-settings'
|
|
190
|
+
},
|
|
191
|
+
details: {
|
|
192
|
+
changes: event.changes
|
|
193
|
+
}
|
|
194
|
+
}));
|
|
195
|
+
const fileResource = (file)=>({
|
|
196
|
+
type: 'media',
|
|
197
|
+
id: Number(file.id),
|
|
198
|
+
name: file.name
|
|
199
|
+
});
|
|
200
|
+
const folderResource = (folder)=>({
|
|
201
|
+
type: 'media-folder',
|
|
202
|
+
id: Number(folder.id),
|
|
203
|
+
name: folder.name
|
|
204
|
+
});
|
|
205
|
+
auditLogsLifecycle.registerEvent(AUDITED_EVENTS.MEDIA_CREATE, ({ media })=>({
|
|
206
|
+
resource: fileResource(media),
|
|
207
|
+
details: {
|
|
208
|
+
mime: media.mime ?? null,
|
|
209
|
+
size: media.size ?? null
|
|
210
|
+
}
|
|
211
|
+
}));
|
|
212
|
+
auditLogsLifecycle.registerEvent(AUDITED_EVENTS.MEDIA_UPDATE_AUDIT, (event)=>({
|
|
213
|
+
resource: fileResource(event.file),
|
|
214
|
+
details: {
|
|
215
|
+
changes: getMediaChanges(event)
|
|
216
|
+
}
|
|
217
|
+
}), {
|
|
218
|
+
action: AUDITED_EVENTS.MEDIA_UPDATE,
|
|
219
|
+
shouldRecord: (event)=>Object.keys(getMediaChanges(event)).length > 0
|
|
220
|
+
});
|
|
221
|
+
auditLogsLifecycle.registerEvent(AUDITED_EVENTS.MEDIA_DELETE, ({ media })=>({
|
|
222
|
+
resource: fileResource(media)
|
|
223
|
+
}));
|
|
224
|
+
auditLogsLifecycle.registerEvent(AUDITED_EVENTS.FOLDER_CREATE, ({ folder })=>({
|
|
225
|
+
resource: folderResource(folder)
|
|
226
|
+
}), {
|
|
227
|
+
action: AUDITED_EVENTS.MEDIA_CREATE
|
|
228
|
+
});
|
|
229
|
+
auditLogsLifecycle.registerEvent(AUDITED_EVENTS.FOLDER_UPDATE, (event)=>({
|
|
230
|
+
resource: folderResource(event.folder),
|
|
231
|
+
details: {
|
|
232
|
+
changes: getFolderChanges(event)
|
|
233
|
+
}
|
|
234
|
+
}), {
|
|
235
|
+
action: AUDITED_EVENTS.MEDIA_UPDATE,
|
|
236
|
+
shouldRecord: (event)=>Object.keys(getFolderChanges(event)).length > 0
|
|
237
|
+
});
|
|
238
|
+
auditLogsLifecycle.registerEvent(AUDITED_EVENTS.FOLDER_DELETE_AUDIT, ({ folder })=>({
|
|
239
|
+
resource: folderResource(folder)
|
|
240
|
+
}), {
|
|
241
|
+
action: AUDITED_EVENTS.MEDIA_DELETE
|
|
242
|
+
});
|
|
243
|
+
auditLogsLifecycle.registerEvent(AUDITED_EVENTS.MEDIA_MOVE, (event)=>({
|
|
244
|
+
resource: {
|
|
245
|
+
type: event.kind === 'file' ? 'media' : 'media-folder',
|
|
246
|
+
id: event.id,
|
|
247
|
+
name: event.name
|
|
248
|
+
},
|
|
249
|
+
details: {
|
|
250
|
+
from: event.from,
|
|
251
|
+
to: event.to
|
|
252
|
+
}
|
|
253
|
+
}));
|
|
254
|
+
};
|
|
255
|
+
|
|
256
|
+
exports.AUDITED_EVENTS = AUDITED_EVENTS;
|
|
257
|
+
exports.emitMediaMoves = emitMediaMoves;
|
|
258
|
+
exports.getFolderChanges = getFolderChanges;
|
|
259
|
+
exports.getMediaChanges = getMediaChanges;
|
|
260
|
+
exports.getUploadSettingsChanges = getUploadSettingsChanges;
|
|
261
|
+
exports.readMediaMoves = readMediaMoves;
|
|
262
|
+
exports.registerAuditEvents = registerAuditEvents;
|
|
263
|
+
exports.toAuditedFile = toAuditedFile;
|
|
264
|
+
//# sourceMappingURL=audit-logs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-logs.js","sources":["../../server/src/audit-logs.ts"],"sourcesContent":["import { emitAudit } from '@strapi/utils';\nimport type { Core, Modules } from '@strapi/types';\n\nimport type { Settings } from './controllers/validation/admin/settings';\n\nexport const AUDITED_EVENTS = {\n UPLOAD_SETTINGS_UPDATE: 'upload-settings.update',\n MEDIA_CREATE: 'media.create',\n MEDIA_UPDATE: 'media.update',\n MEDIA_DELETE: 'media.delete',\n MEDIA_MOVE: 'media.move',\n FOLDER_CREATE: 'media-folder.create',\n FOLDER_UPDATE: 'media-folder.update',\n // Audit-only events. media.update is a webhook event that carries neither the file as it was\n // nor its folder; media-folder.delete carries every deleted folder in one event.\n MEDIA_UPDATE_AUDIT: 'media.update.audit',\n FOLDER_DELETE_AUDIT: 'media-folder.delete.audit',\n} as const;\n\nconst AUDITED_SETTINGS = [\n 'sizeOptimization',\n 'responsiveDimensions',\n 'autoOrientation',\n 'aiMetadata',\n] as const;\n\nexport type UploadSettingsChanges = Partial<\n Record<(typeof AUDITED_SETTINGS)[number], Modules.AuditLogs.FieldChange<boolean | null>>\n>;\n\nexport interface SettingsUpdateDetails {\n changes: UploadSettingsChanges;\n}\n\n// The store replaces the whole value, so an option missing from the request is removed and recorded as null.\nexport const getUploadSettingsChanges = (\n previous: Partial<Settings> | null,\n next: Partial<Settings>\n): UploadSettingsChanges => {\n const changes: UploadSettingsChanges = {};\n\n for (const setting of AUDITED_SETTINGS) {\n const before = previous?.[setting] ?? null;\n const after = next[setting] ?? null;\n\n if (before !== after) {\n changes[setting] = { before, after };\n }\n }\n\n return changes;\n};\n\ninterface FolderRef {\n id: number;\n name: string | null;\n}\n\nexport interface MediaMoveEvent {\n kind: 'file' | 'folder';\n id: number;\n name: string;\n from: FolderRef | null;\n to: FolderRef | null;\n}\n\nexport interface MoveDetails {\n from: FolderRef | null;\n to: FolderRef | null;\n}\n\nconst toFolderRef = (folder: { id: number | string; name?: string | null } | null | undefined) =>\n folder ? { id: Number(folder.id), name: folder.name ?? null } : null;\n\ninterface MediaFile {\n id: number;\n name: string;\n mime?: string;\n size?: number;\n alternativeText?: string | null;\n caption?: string | null;\n focalPoint?: { x: number; y: number } | null;\n folder?: { id: number; name: string | null } | null;\n}\n\n/** The payload of media.create and media.delete, which are also webhook events. */\nexport interface MediaEvent {\n media: MediaFile;\n}\n\nexport interface MediaUpdateEvent {\n file: MediaFile;\n previous: MediaFile;\n /** The file's content was replaced. It keeps its hash and url, so no field shows it. */\n replaced?: boolean;\n}\n\n/** Picks the fields the audit log compares. */\nexport const toAuditedFile = (file: Record<string, any>): MediaFile => ({\n id: Number(file.id),\n name: file.name,\n mime: file.mime,\n size: file.size,\n alternativeText: file.alternativeText ?? null,\n caption: file.caption ?? null,\n focalPoint: file.focalPoint ?? null,\n folder: toFolderRef(file.folder),\n});\n\ninterface FileSummary {\n name: string;\n mime: string | null;\n size: number | null;\n}\n\nexport interface MediaChanges {\n name?: Modules.AuditLogs.FieldChange<string>;\n alternativeText?: Modules.AuditLogs.FieldChange<string | null>;\n caption?: Modules.AuditLogs.FieldChange<string | null>;\n focalPoint?: Modules.AuditLogs.FieldChange<{ x: number; y: number } | null>;\n folder?: Modules.AuditLogs.FieldChange<FolderRef | null>;\n file?: Modules.AuditLogs.FieldChange<FileSummary>;\n}\n\nconst summarizeFile = (file: MediaFile): FileSummary => ({\n name: file.name,\n mime: file.mime ?? null,\n size: file.size ?? null,\n});\n\nexport const getMediaChanges = ({\n file: media,\n previous,\n replaced,\n}: MediaUpdateEvent): MediaChanges => {\n const changes: MediaChanges = {};\n\n if (previous.name !== media.name) {\n changes.name = { before: previous.name, after: media.name };\n }\n\n // The admin sends '' for an empty field that is stored as null\n const blankAsNull = (value: string | null | undefined) => value || null;\n for (const field of ['alternativeText', 'caption'] as const) {\n const before = previous[field] ?? null;\n const after = media[field] ?? null;\n if (blankAsNull(before) !== blankAsNull(after)) {\n changes[field] = { before, after };\n }\n }\n\n const focalBefore = previous.focalPoint ?? null;\n const focalAfter = media.focalPoint ?? null;\n if (JSON.stringify(focalBefore) !== JSON.stringify(focalAfter)) {\n changes.focalPoint = { before: focalBefore, after: focalAfter };\n }\n\n const folderBefore = toFolderRef(previous.folder);\n const folderAfter = toFolderRef(media.folder);\n if ((folderBefore?.id ?? null) !== (folderAfter?.id ?? null)) {\n changes.folder = { before: folderBefore, after: folderAfter };\n }\n\n if (replaced) {\n changes.file = { before: summarizeFile(previous), after: summarizeFile(media) };\n }\n\n return changes;\n};\n\ninterface MediaFolder {\n id: number;\n name: string;\n parent?: { id: number; name: string | null } | null;\n}\n\n/** The payload of the media-folder.* events. They are not webhook events. */\nexport interface FolderEvent {\n folder: MediaFolder;\n previous?: MediaFolder;\n}\n\nexport interface FolderChanges {\n name?: Modules.AuditLogs.FieldChange<string>;\n parent?: Modules.AuditLogs.FieldChange<FolderRef | null>;\n}\n\nexport const getFolderChanges = ({ folder, previous }: FolderEvent): FolderChanges => {\n if (!previous) {\n return {};\n }\n\n const changes: FolderChanges = {};\n\n if (previous.name !== folder.name) {\n changes.name = { before: previous.name, after: folder.name };\n }\n\n const parentBefore = toFolderRef(previous.parent);\n const parentAfter = toFolderRef(folder.parent);\n if ((parentBefore?.id ?? null) !== (parentAfter?.id ?? null)) {\n changes.parent = { before: parentBefore, after: parentAfter };\n }\n\n return changes;\n};\n\ninterface JoinTable {\n name: string;\n joinColumn: { name: string };\n inverseJoinColumn: { name: string };\n}\n\n/** Reads rows of a table inside the move transaction. */\ntype ReadTable = (table: string | undefined) => {\n select(...columns: string[]): {\n whereIn(column: string, values: readonly number[]): PromiseLike<Record<string, any>[]>;\n };\n};\n\nconst readParents = async (read: ReadTable, joinTable: JoinTable, ids: number[]) => {\n if (ids.length === 0) {\n return new Map<number, number>();\n }\n\n const { joinColumn, inverseJoinColumn } = joinTable;\n const rows = await read(joinTable.name)\n .select(joinColumn.name, inverseJoinColumn.name)\n .whereIn(joinColumn.name, ids);\n\n return new Map(\n rows.map((row) => [Number(row[joinColumn.name]), Number(row[inverseJoinColumn.name])])\n );\n};\n\nexport const readMediaMoves = async (\n read: ReadTable,\n {\n files,\n folders,\n destinationFolderId,\n fileFolderJoinTable,\n folderParentJoinTable,\n folderTable,\n }: {\n files: Array<{ id: number | string; name: string }>;\n folders: Array<{ id: number | string; name: string }>;\n destinationFolderId: number | string | null;\n fileFolderJoinTable: JoinTable;\n folderParentJoinTable: JoinTable;\n folderTable: string | undefined;\n }\n): Promise<MediaMoveEvent[]> => {\n const fileParents = await readParents(\n read,\n fileFolderJoinTable,\n files.map((file) => Number(file.id))\n );\n const folderParents = await readParents(\n read,\n folderParentJoinTable,\n folders.map((folder) => Number(folder.id))\n );\n\n const destinationId = destinationFolderId === null ? null : Number(destinationFolderId);\n const referencedIds = new Set([...fileParents.values(), ...folderParents.values()]);\n if (destinationId !== null) {\n referencedIds.add(destinationId);\n }\n\n const folderNames = new Map<number, string | null>();\n if (referencedIds.size > 0) {\n const rows = await read(folderTable)\n .select('id', 'name')\n .whereIn('id', [...referencedIds]);\n rows.forEach((row) => folderNames.set(Number(row.id), row.name ?? null));\n }\n\n const toRef = (id: number | null | undefined): FolderRef | null =>\n id == null ? null : { id, name: folderNames.get(id) ?? null };\n\n const to = toRef(destinationId);\n\n return [\n ...files.map((file) => ({\n kind: 'file' as const,\n id: Number(file.id),\n name: file.name,\n from: toRef(fileParents.get(Number(file.id))),\n to,\n })),\n ...folders.map((folder) => ({\n kind: 'folder' as const,\n id: Number(folder.id),\n name: folder.name,\n from: toRef(folderParents.get(Number(folder.id))),\n to,\n })),\n ];\n};\n\nexport const emitMediaMoves = async (\n { strapi }: { strapi: Core.Strapi },\n moves: MediaMoveEvent[]\n) => {\n for (const move of moves) {\n if ((move.from?.id ?? null) !== (move.to?.id ?? null)) {\n await emitAudit({ strapi }, AUDITED_EVENTS.MEDIA_MOVE, move);\n }\n }\n};\n\n/**\n * The part of the audit-logs lifecycle service used by this plugin.\n * The full service type lives in the Admin EE package and cannot be imported here.\n */\ninterface AuditLogsLifecycle {\n registerEvent<TDetails>(\n name: string,\n transform: Modules.AuditLogs.EventTransformer<TDetails>,\n options?: { action?: string; shouldRecord?: (...args: any[]) => boolean }\n ): void;\n}\n\nexport const registerAuditEvents = (auditLogsLifecycle: AuditLogsLifecycle) => {\n auditLogsLifecycle.registerEvent<SettingsUpdateDetails>(\n AUDITED_EVENTS.UPLOAD_SETTINGS_UPDATE,\n (event: SettingsUpdateDetails) => ({\n resource: { type: 'upload-settings' },\n details: { changes: event.changes },\n })\n );\n\n const fileResource = (file: MediaFile) => ({\n type: 'media',\n id: Number(file.id),\n name: file.name,\n });\n const folderResource = (folder: MediaFolder) => ({\n type: 'media-folder',\n id: Number(folder.id),\n name: folder.name,\n });\n\n auditLogsLifecycle.registerEvent<{ mime: string | null; size: number | null }>(\n AUDITED_EVENTS.MEDIA_CREATE,\n ({ media }: MediaEvent) => ({\n resource: fileResource(media),\n details: { mime: media.mime ?? null, size: media.size ?? null },\n })\n );\n\n auditLogsLifecycle.registerEvent<{ changes: MediaChanges }>(\n AUDITED_EVENTS.MEDIA_UPDATE_AUDIT,\n (event: MediaUpdateEvent) => ({\n resource: fileResource(event.file),\n details: { changes: getMediaChanges(event) },\n }),\n {\n action: AUDITED_EVENTS.MEDIA_UPDATE,\n shouldRecord: (event: MediaUpdateEvent) => Object.keys(getMediaChanges(event)).length > 0,\n }\n );\n\n auditLogsLifecycle.registerEvent(AUDITED_EVENTS.MEDIA_DELETE, ({ media }: MediaEvent) => ({\n resource: fileResource(media),\n }));\n\n auditLogsLifecycle.registerEvent(\n AUDITED_EVENTS.FOLDER_CREATE,\n ({ folder }: FolderEvent) => ({ resource: folderResource(folder) }),\n { action: AUDITED_EVENTS.MEDIA_CREATE }\n );\n\n auditLogsLifecycle.registerEvent<{ changes: FolderChanges }>(\n AUDITED_EVENTS.FOLDER_UPDATE,\n (event: FolderEvent) => ({\n resource: folderResource(event.folder),\n details: { changes: getFolderChanges(event) },\n }),\n {\n action: AUDITED_EVENTS.MEDIA_UPDATE,\n shouldRecord: (event: FolderEvent) => Object.keys(getFolderChanges(event)).length > 0,\n }\n );\n\n auditLogsLifecycle.registerEvent(\n AUDITED_EVENTS.FOLDER_DELETE_AUDIT,\n ({ folder }: FolderEvent) => ({ resource: folderResource(folder) }),\n { action: AUDITED_EVENTS.MEDIA_DELETE }\n );\n\n auditLogsLifecycle.registerEvent<MoveDetails>(\n AUDITED_EVENTS.MEDIA_MOVE,\n (event: MediaMoveEvent) => ({\n resource: {\n type: event.kind === 'file' ? 'media' : 'media-folder',\n id: event.id,\n name: event.name,\n },\n details: { from: event.from, to: event.to },\n })\n );\n};\n"],"names":["AUDITED_EVENTS","UPLOAD_SETTINGS_UPDATE","MEDIA_CREATE","MEDIA_UPDATE","MEDIA_DELETE","MEDIA_MOVE","FOLDER_CREATE","FOLDER_UPDATE","MEDIA_UPDATE_AUDIT","FOLDER_DELETE_AUDIT","AUDITED_SETTINGS","getUploadSettingsChanges","previous","next","changes","setting","before","after","toFolderRef","folder","id","Number","name","toAuditedFile","file","mime","size","alternativeText","caption","focalPoint","summarizeFile","getMediaChanges","media","replaced","blankAsNull","value","field","focalBefore","focalAfter","JSON","stringify","folderBefore","folderAfter","getFolderChanges","parentBefore","parent","parentAfter","readParents","read","joinTable","ids","length","Map","joinColumn","inverseJoinColumn","rows","select","whereIn","map","row","readMediaMoves","files","folders","destinationFolderId","fileFolderJoinTable","folderParentJoinTable","folderTable","fileParents","folderParents","destinationId","referencedIds","Set","values","add","folderNames","forEach","set","toRef","get","to","kind","from","emitMediaMoves","strapi","moves","move","emitAudit","registerAuditEvents","auditLogsLifecycle","registerEvent","event","resource","type","details","fileResource","folderResource","action","shouldRecord","Object","keys"],"mappings":"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"}
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
import { emitAudit } from '@strapi/utils';
|
|
2
|
+
|
|
3
|
+
const AUDITED_EVENTS = {
|
|
4
|
+
UPLOAD_SETTINGS_UPDATE: 'upload-settings.update',
|
|
5
|
+
MEDIA_CREATE: 'media.create',
|
|
6
|
+
MEDIA_UPDATE: 'media.update',
|
|
7
|
+
MEDIA_DELETE: 'media.delete',
|
|
8
|
+
MEDIA_MOVE: 'media.move',
|
|
9
|
+
FOLDER_CREATE: 'media-folder.create',
|
|
10
|
+
FOLDER_UPDATE: 'media-folder.update',
|
|
11
|
+
// Audit-only events. media.update is a webhook event that carries neither the file as it was
|
|
12
|
+
// nor its folder; media-folder.delete carries every deleted folder in one event.
|
|
13
|
+
MEDIA_UPDATE_AUDIT: 'media.update.audit',
|
|
14
|
+
FOLDER_DELETE_AUDIT: 'media-folder.delete.audit'
|
|
15
|
+
};
|
|
16
|
+
const AUDITED_SETTINGS = [
|
|
17
|
+
'sizeOptimization',
|
|
18
|
+
'responsiveDimensions',
|
|
19
|
+
'autoOrientation',
|
|
20
|
+
'aiMetadata'
|
|
21
|
+
];
|
|
22
|
+
// The store replaces the whole value, so an option missing from the request is removed and recorded as null.
|
|
23
|
+
const getUploadSettingsChanges = (previous, next)=>{
|
|
24
|
+
const changes = {};
|
|
25
|
+
for (const setting of AUDITED_SETTINGS){
|
|
26
|
+
const before = previous?.[setting] ?? null;
|
|
27
|
+
const after = next[setting] ?? null;
|
|
28
|
+
if (before !== after) {
|
|
29
|
+
changes[setting] = {
|
|
30
|
+
before,
|
|
31
|
+
after
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return changes;
|
|
36
|
+
};
|
|
37
|
+
const toFolderRef = (folder)=>folder ? {
|
|
38
|
+
id: Number(folder.id),
|
|
39
|
+
name: folder.name ?? null
|
|
40
|
+
} : null;
|
|
41
|
+
/** Picks the fields the audit log compares. */ const toAuditedFile = (file)=>({
|
|
42
|
+
id: Number(file.id),
|
|
43
|
+
name: file.name,
|
|
44
|
+
mime: file.mime,
|
|
45
|
+
size: file.size,
|
|
46
|
+
alternativeText: file.alternativeText ?? null,
|
|
47
|
+
caption: file.caption ?? null,
|
|
48
|
+
focalPoint: file.focalPoint ?? null,
|
|
49
|
+
folder: toFolderRef(file.folder)
|
|
50
|
+
});
|
|
51
|
+
const summarizeFile = (file)=>({
|
|
52
|
+
name: file.name,
|
|
53
|
+
mime: file.mime ?? null,
|
|
54
|
+
size: file.size ?? null
|
|
55
|
+
});
|
|
56
|
+
const getMediaChanges = ({ file: media, previous, replaced })=>{
|
|
57
|
+
const changes = {};
|
|
58
|
+
if (previous.name !== media.name) {
|
|
59
|
+
changes.name = {
|
|
60
|
+
before: previous.name,
|
|
61
|
+
after: media.name
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
// The admin sends '' for an empty field that is stored as null
|
|
65
|
+
const blankAsNull = (value)=>value || null;
|
|
66
|
+
for (const field of [
|
|
67
|
+
'alternativeText',
|
|
68
|
+
'caption'
|
|
69
|
+
]){
|
|
70
|
+
const before = previous[field] ?? null;
|
|
71
|
+
const after = media[field] ?? null;
|
|
72
|
+
if (blankAsNull(before) !== blankAsNull(after)) {
|
|
73
|
+
changes[field] = {
|
|
74
|
+
before,
|
|
75
|
+
after
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
const focalBefore = previous.focalPoint ?? null;
|
|
80
|
+
const focalAfter = media.focalPoint ?? null;
|
|
81
|
+
if (JSON.stringify(focalBefore) !== JSON.stringify(focalAfter)) {
|
|
82
|
+
changes.focalPoint = {
|
|
83
|
+
before: focalBefore,
|
|
84
|
+
after: focalAfter
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
const folderBefore = toFolderRef(previous.folder);
|
|
88
|
+
const folderAfter = toFolderRef(media.folder);
|
|
89
|
+
if ((folderBefore?.id ?? null) !== (folderAfter?.id ?? null)) {
|
|
90
|
+
changes.folder = {
|
|
91
|
+
before: folderBefore,
|
|
92
|
+
after: folderAfter
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
if (replaced) {
|
|
96
|
+
changes.file = {
|
|
97
|
+
before: summarizeFile(previous),
|
|
98
|
+
after: summarizeFile(media)
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
return changes;
|
|
102
|
+
};
|
|
103
|
+
const getFolderChanges = ({ folder, previous })=>{
|
|
104
|
+
if (!previous) {
|
|
105
|
+
return {};
|
|
106
|
+
}
|
|
107
|
+
const changes = {};
|
|
108
|
+
if (previous.name !== folder.name) {
|
|
109
|
+
changes.name = {
|
|
110
|
+
before: previous.name,
|
|
111
|
+
after: folder.name
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
const parentBefore = toFolderRef(previous.parent);
|
|
115
|
+
const parentAfter = toFolderRef(folder.parent);
|
|
116
|
+
if ((parentBefore?.id ?? null) !== (parentAfter?.id ?? null)) {
|
|
117
|
+
changes.parent = {
|
|
118
|
+
before: parentBefore,
|
|
119
|
+
after: parentAfter
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
return changes;
|
|
123
|
+
};
|
|
124
|
+
const readParents = async (read, joinTable, ids)=>{
|
|
125
|
+
if (ids.length === 0) {
|
|
126
|
+
return new Map();
|
|
127
|
+
}
|
|
128
|
+
const { joinColumn, inverseJoinColumn } = joinTable;
|
|
129
|
+
const rows = await read(joinTable.name).select(joinColumn.name, inverseJoinColumn.name).whereIn(joinColumn.name, ids);
|
|
130
|
+
return new Map(rows.map((row)=>[
|
|
131
|
+
Number(row[joinColumn.name]),
|
|
132
|
+
Number(row[inverseJoinColumn.name])
|
|
133
|
+
]));
|
|
134
|
+
};
|
|
135
|
+
const readMediaMoves = async (read, { files, folders, destinationFolderId, fileFolderJoinTable, folderParentJoinTable, folderTable })=>{
|
|
136
|
+
const fileParents = await readParents(read, fileFolderJoinTable, files.map((file)=>Number(file.id)));
|
|
137
|
+
const folderParents = await readParents(read, folderParentJoinTable, folders.map((folder)=>Number(folder.id)));
|
|
138
|
+
const destinationId = destinationFolderId === null ? null : Number(destinationFolderId);
|
|
139
|
+
const referencedIds = new Set([
|
|
140
|
+
...fileParents.values(),
|
|
141
|
+
...folderParents.values()
|
|
142
|
+
]);
|
|
143
|
+
if (destinationId !== null) {
|
|
144
|
+
referencedIds.add(destinationId);
|
|
145
|
+
}
|
|
146
|
+
const folderNames = new Map();
|
|
147
|
+
if (referencedIds.size > 0) {
|
|
148
|
+
const rows = await read(folderTable).select('id', 'name').whereIn('id', [
|
|
149
|
+
...referencedIds
|
|
150
|
+
]);
|
|
151
|
+
rows.forEach((row)=>folderNames.set(Number(row.id), row.name ?? null));
|
|
152
|
+
}
|
|
153
|
+
const toRef = (id)=>id == null ? null : {
|
|
154
|
+
id,
|
|
155
|
+
name: folderNames.get(id) ?? null
|
|
156
|
+
};
|
|
157
|
+
const to = toRef(destinationId);
|
|
158
|
+
return [
|
|
159
|
+
...files.map((file)=>({
|
|
160
|
+
kind: 'file',
|
|
161
|
+
id: Number(file.id),
|
|
162
|
+
name: file.name,
|
|
163
|
+
from: toRef(fileParents.get(Number(file.id))),
|
|
164
|
+
to
|
|
165
|
+
})),
|
|
166
|
+
...folders.map((folder)=>({
|
|
167
|
+
kind: 'folder',
|
|
168
|
+
id: Number(folder.id),
|
|
169
|
+
name: folder.name,
|
|
170
|
+
from: toRef(folderParents.get(Number(folder.id))),
|
|
171
|
+
to
|
|
172
|
+
}))
|
|
173
|
+
];
|
|
174
|
+
};
|
|
175
|
+
const emitMediaMoves = async ({ strapi }, moves)=>{
|
|
176
|
+
for (const move of moves){
|
|
177
|
+
if ((move.from?.id ?? null) !== (move.to?.id ?? null)) {
|
|
178
|
+
await emitAudit({
|
|
179
|
+
strapi
|
|
180
|
+
}, AUDITED_EVENTS.MEDIA_MOVE, move);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
};
|
|
184
|
+
const registerAuditEvents = (auditLogsLifecycle)=>{
|
|
185
|
+
auditLogsLifecycle.registerEvent(AUDITED_EVENTS.UPLOAD_SETTINGS_UPDATE, (event)=>({
|
|
186
|
+
resource: {
|
|
187
|
+
type: 'upload-settings'
|
|
188
|
+
},
|
|
189
|
+
details: {
|
|
190
|
+
changes: event.changes
|
|
191
|
+
}
|
|
192
|
+
}));
|
|
193
|
+
const fileResource = (file)=>({
|
|
194
|
+
type: 'media',
|
|
195
|
+
id: Number(file.id),
|
|
196
|
+
name: file.name
|
|
197
|
+
});
|
|
198
|
+
const folderResource = (folder)=>({
|
|
199
|
+
type: 'media-folder',
|
|
200
|
+
id: Number(folder.id),
|
|
201
|
+
name: folder.name
|
|
202
|
+
});
|
|
203
|
+
auditLogsLifecycle.registerEvent(AUDITED_EVENTS.MEDIA_CREATE, ({ media })=>({
|
|
204
|
+
resource: fileResource(media),
|
|
205
|
+
details: {
|
|
206
|
+
mime: media.mime ?? null,
|
|
207
|
+
size: media.size ?? null
|
|
208
|
+
}
|
|
209
|
+
}));
|
|
210
|
+
auditLogsLifecycle.registerEvent(AUDITED_EVENTS.MEDIA_UPDATE_AUDIT, (event)=>({
|
|
211
|
+
resource: fileResource(event.file),
|
|
212
|
+
details: {
|
|
213
|
+
changes: getMediaChanges(event)
|
|
214
|
+
}
|
|
215
|
+
}), {
|
|
216
|
+
action: AUDITED_EVENTS.MEDIA_UPDATE,
|
|
217
|
+
shouldRecord: (event)=>Object.keys(getMediaChanges(event)).length > 0
|
|
218
|
+
});
|
|
219
|
+
auditLogsLifecycle.registerEvent(AUDITED_EVENTS.MEDIA_DELETE, ({ media })=>({
|
|
220
|
+
resource: fileResource(media)
|
|
221
|
+
}));
|
|
222
|
+
auditLogsLifecycle.registerEvent(AUDITED_EVENTS.FOLDER_CREATE, ({ folder })=>({
|
|
223
|
+
resource: folderResource(folder)
|
|
224
|
+
}), {
|
|
225
|
+
action: AUDITED_EVENTS.MEDIA_CREATE
|
|
226
|
+
});
|
|
227
|
+
auditLogsLifecycle.registerEvent(AUDITED_EVENTS.FOLDER_UPDATE, (event)=>({
|
|
228
|
+
resource: folderResource(event.folder),
|
|
229
|
+
details: {
|
|
230
|
+
changes: getFolderChanges(event)
|
|
231
|
+
}
|
|
232
|
+
}), {
|
|
233
|
+
action: AUDITED_EVENTS.MEDIA_UPDATE,
|
|
234
|
+
shouldRecord: (event)=>Object.keys(getFolderChanges(event)).length > 0
|
|
235
|
+
});
|
|
236
|
+
auditLogsLifecycle.registerEvent(AUDITED_EVENTS.FOLDER_DELETE_AUDIT, ({ folder })=>({
|
|
237
|
+
resource: folderResource(folder)
|
|
238
|
+
}), {
|
|
239
|
+
action: AUDITED_EVENTS.MEDIA_DELETE
|
|
240
|
+
});
|
|
241
|
+
auditLogsLifecycle.registerEvent(AUDITED_EVENTS.MEDIA_MOVE, (event)=>({
|
|
242
|
+
resource: {
|
|
243
|
+
type: event.kind === 'file' ? 'media' : 'media-folder',
|
|
244
|
+
id: event.id,
|
|
245
|
+
name: event.name
|
|
246
|
+
},
|
|
247
|
+
details: {
|
|
248
|
+
from: event.from,
|
|
249
|
+
to: event.to
|
|
250
|
+
}
|
|
251
|
+
}));
|
|
252
|
+
};
|
|
253
|
+
|
|
254
|
+
export { AUDITED_EVENTS, emitMediaMoves, getFolderChanges, getMediaChanges, getUploadSettingsChanges, readMediaMoves, registerAuditEvents, toAuditedFile };
|
|
255
|
+
//# sourceMappingURL=audit-logs.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-logs.mjs","sources":["../../server/src/audit-logs.ts"],"sourcesContent":["import { emitAudit } from '@strapi/utils';\nimport type { Core, Modules } from '@strapi/types';\n\nimport type { Settings } from './controllers/validation/admin/settings';\n\nexport const AUDITED_EVENTS = {\n UPLOAD_SETTINGS_UPDATE: 'upload-settings.update',\n MEDIA_CREATE: 'media.create',\n MEDIA_UPDATE: 'media.update',\n MEDIA_DELETE: 'media.delete',\n MEDIA_MOVE: 'media.move',\n FOLDER_CREATE: 'media-folder.create',\n FOLDER_UPDATE: 'media-folder.update',\n // Audit-only events. media.update is a webhook event that carries neither the file as it was\n // nor its folder; media-folder.delete carries every deleted folder in one event.\n MEDIA_UPDATE_AUDIT: 'media.update.audit',\n FOLDER_DELETE_AUDIT: 'media-folder.delete.audit',\n} as const;\n\nconst AUDITED_SETTINGS = [\n 'sizeOptimization',\n 'responsiveDimensions',\n 'autoOrientation',\n 'aiMetadata',\n] as const;\n\nexport type UploadSettingsChanges = Partial<\n Record<(typeof AUDITED_SETTINGS)[number], Modules.AuditLogs.FieldChange<boolean | null>>\n>;\n\nexport interface SettingsUpdateDetails {\n changes: UploadSettingsChanges;\n}\n\n// The store replaces the whole value, so an option missing from the request is removed and recorded as null.\nexport const getUploadSettingsChanges = (\n previous: Partial<Settings> | null,\n next: Partial<Settings>\n): UploadSettingsChanges => {\n const changes: UploadSettingsChanges = {};\n\n for (const setting of AUDITED_SETTINGS) {\n const before = previous?.[setting] ?? null;\n const after = next[setting] ?? null;\n\n if (before !== after) {\n changes[setting] = { before, after };\n }\n }\n\n return changes;\n};\n\ninterface FolderRef {\n id: number;\n name: string | null;\n}\n\nexport interface MediaMoveEvent {\n kind: 'file' | 'folder';\n id: number;\n name: string;\n from: FolderRef | null;\n to: FolderRef | null;\n}\n\nexport interface MoveDetails {\n from: FolderRef | null;\n to: FolderRef | null;\n}\n\nconst toFolderRef = (folder: { id: number | string; name?: string | null } | null | undefined) =>\n folder ? { id: Number(folder.id), name: folder.name ?? null } : null;\n\ninterface MediaFile {\n id: number;\n name: string;\n mime?: string;\n size?: number;\n alternativeText?: string | null;\n caption?: string | null;\n focalPoint?: { x: number; y: number } | null;\n folder?: { id: number; name: string | null } | null;\n}\n\n/** The payload of media.create and media.delete, which are also webhook events. */\nexport interface MediaEvent {\n media: MediaFile;\n}\n\nexport interface MediaUpdateEvent {\n file: MediaFile;\n previous: MediaFile;\n /** The file's content was replaced. It keeps its hash and url, so no field shows it. */\n replaced?: boolean;\n}\n\n/** Picks the fields the audit log compares. */\nexport const toAuditedFile = (file: Record<string, any>): MediaFile => ({\n id: Number(file.id),\n name: file.name,\n mime: file.mime,\n size: file.size,\n alternativeText: file.alternativeText ?? null,\n caption: file.caption ?? null,\n focalPoint: file.focalPoint ?? null,\n folder: toFolderRef(file.folder),\n});\n\ninterface FileSummary {\n name: string;\n mime: string | null;\n size: number | null;\n}\n\nexport interface MediaChanges {\n name?: Modules.AuditLogs.FieldChange<string>;\n alternativeText?: Modules.AuditLogs.FieldChange<string | null>;\n caption?: Modules.AuditLogs.FieldChange<string | null>;\n focalPoint?: Modules.AuditLogs.FieldChange<{ x: number; y: number } | null>;\n folder?: Modules.AuditLogs.FieldChange<FolderRef | null>;\n file?: Modules.AuditLogs.FieldChange<FileSummary>;\n}\n\nconst summarizeFile = (file: MediaFile): FileSummary => ({\n name: file.name,\n mime: file.mime ?? null,\n size: file.size ?? null,\n});\n\nexport const getMediaChanges = ({\n file: media,\n previous,\n replaced,\n}: MediaUpdateEvent): MediaChanges => {\n const changes: MediaChanges = {};\n\n if (previous.name !== media.name) {\n changes.name = { before: previous.name, after: media.name };\n }\n\n // The admin sends '' for an empty field that is stored as null\n const blankAsNull = (value: string | null | undefined) => value || null;\n for (const field of ['alternativeText', 'caption'] as const) {\n const before = previous[field] ?? null;\n const after = media[field] ?? null;\n if (blankAsNull(before) !== blankAsNull(after)) {\n changes[field] = { before, after };\n }\n }\n\n const focalBefore = previous.focalPoint ?? null;\n const focalAfter = media.focalPoint ?? null;\n if (JSON.stringify(focalBefore) !== JSON.stringify(focalAfter)) {\n changes.focalPoint = { before: focalBefore, after: focalAfter };\n }\n\n const folderBefore = toFolderRef(previous.folder);\n const folderAfter = toFolderRef(media.folder);\n if ((folderBefore?.id ?? null) !== (folderAfter?.id ?? null)) {\n changes.folder = { before: folderBefore, after: folderAfter };\n }\n\n if (replaced) {\n changes.file = { before: summarizeFile(previous), after: summarizeFile(media) };\n }\n\n return changes;\n};\n\ninterface MediaFolder {\n id: number;\n name: string;\n parent?: { id: number; name: string | null } | null;\n}\n\n/** The payload of the media-folder.* events. They are not webhook events. */\nexport interface FolderEvent {\n folder: MediaFolder;\n previous?: MediaFolder;\n}\n\nexport interface FolderChanges {\n name?: Modules.AuditLogs.FieldChange<string>;\n parent?: Modules.AuditLogs.FieldChange<FolderRef | null>;\n}\n\nexport const getFolderChanges = ({ folder, previous }: FolderEvent): FolderChanges => {\n if (!previous) {\n return {};\n }\n\n const changes: FolderChanges = {};\n\n if (previous.name !== folder.name) {\n changes.name = { before: previous.name, after: folder.name };\n }\n\n const parentBefore = toFolderRef(previous.parent);\n const parentAfter = toFolderRef(folder.parent);\n if ((parentBefore?.id ?? null) !== (parentAfter?.id ?? null)) {\n changes.parent = { before: parentBefore, after: parentAfter };\n }\n\n return changes;\n};\n\ninterface JoinTable {\n name: string;\n joinColumn: { name: string };\n inverseJoinColumn: { name: string };\n}\n\n/** Reads rows of a table inside the move transaction. */\ntype ReadTable = (table: string | undefined) => {\n select(...columns: string[]): {\n whereIn(column: string, values: readonly number[]): PromiseLike<Record<string, any>[]>;\n };\n};\n\nconst readParents = async (read: ReadTable, joinTable: JoinTable, ids: number[]) => {\n if (ids.length === 0) {\n return new Map<number, number>();\n }\n\n const { joinColumn, inverseJoinColumn } = joinTable;\n const rows = await read(joinTable.name)\n .select(joinColumn.name, inverseJoinColumn.name)\n .whereIn(joinColumn.name, ids);\n\n return new Map(\n rows.map((row) => [Number(row[joinColumn.name]), Number(row[inverseJoinColumn.name])])\n );\n};\n\nexport const readMediaMoves = async (\n read: ReadTable,\n {\n files,\n folders,\n destinationFolderId,\n fileFolderJoinTable,\n folderParentJoinTable,\n folderTable,\n }: {\n files: Array<{ id: number | string; name: string }>;\n folders: Array<{ id: number | string; name: string }>;\n destinationFolderId: number | string | null;\n fileFolderJoinTable: JoinTable;\n folderParentJoinTable: JoinTable;\n folderTable: string | undefined;\n }\n): Promise<MediaMoveEvent[]> => {\n const fileParents = await readParents(\n read,\n fileFolderJoinTable,\n files.map((file) => Number(file.id))\n );\n const folderParents = await readParents(\n read,\n folderParentJoinTable,\n folders.map((folder) => Number(folder.id))\n );\n\n const destinationId = destinationFolderId === null ? null : Number(destinationFolderId);\n const referencedIds = new Set([...fileParents.values(), ...folderParents.values()]);\n if (destinationId !== null) {\n referencedIds.add(destinationId);\n }\n\n const folderNames = new Map<number, string | null>();\n if (referencedIds.size > 0) {\n const rows = await read(folderTable)\n .select('id', 'name')\n .whereIn('id', [...referencedIds]);\n rows.forEach((row) => folderNames.set(Number(row.id), row.name ?? null));\n }\n\n const toRef = (id: number | null | undefined): FolderRef | null =>\n id == null ? null : { id, name: folderNames.get(id) ?? null };\n\n const to = toRef(destinationId);\n\n return [\n ...files.map((file) => ({\n kind: 'file' as const,\n id: Number(file.id),\n name: file.name,\n from: toRef(fileParents.get(Number(file.id))),\n to,\n })),\n ...folders.map((folder) => ({\n kind: 'folder' as const,\n id: Number(folder.id),\n name: folder.name,\n from: toRef(folderParents.get(Number(folder.id))),\n to,\n })),\n ];\n};\n\nexport const emitMediaMoves = async (\n { strapi }: { strapi: Core.Strapi },\n moves: MediaMoveEvent[]\n) => {\n for (const move of moves) {\n if ((move.from?.id ?? null) !== (move.to?.id ?? null)) {\n await emitAudit({ strapi }, AUDITED_EVENTS.MEDIA_MOVE, move);\n }\n }\n};\n\n/**\n * The part of the audit-logs lifecycle service used by this plugin.\n * The full service type lives in the Admin EE package and cannot be imported here.\n */\ninterface AuditLogsLifecycle {\n registerEvent<TDetails>(\n name: string,\n transform: Modules.AuditLogs.EventTransformer<TDetails>,\n options?: { action?: string; shouldRecord?: (...args: any[]) => boolean }\n ): void;\n}\n\nexport const registerAuditEvents = (auditLogsLifecycle: AuditLogsLifecycle) => {\n auditLogsLifecycle.registerEvent<SettingsUpdateDetails>(\n AUDITED_EVENTS.UPLOAD_SETTINGS_UPDATE,\n (event: SettingsUpdateDetails) => ({\n resource: { type: 'upload-settings' },\n details: { changes: event.changes },\n })\n );\n\n const fileResource = (file: MediaFile) => ({\n type: 'media',\n id: Number(file.id),\n name: file.name,\n });\n const folderResource = (folder: MediaFolder) => ({\n type: 'media-folder',\n id: Number(folder.id),\n name: folder.name,\n });\n\n auditLogsLifecycle.registerEvent<{ mime: string | null; size: number | null }>(\n AUDITED_EVENTS.MEDIA_CREATE,\n ({ media }: MediaEvent) => ({\n resource: fileResource(media),\n details: { mime: media.mime ?? null, size: media.size ?? null },\n })\n );\n\n auditLogsLifecycle.registerEvent<{ changes: MediaChanges }>(\n AUDITED_EVENTS.MEDIA_UPDATE_AUDIT,\n (event: MediaUpdateEvent) => ({\n resource: fileResource(event.file),\n details: { changes: getMediaChanges(event) },\n }),\n {\n action: AUDITED_EVENTS.MEDIA_UPDATE,\n shouldRecord: (event: MediaUpdateEvent) => Object.keys(getMediaChanges(event)).length > 0,\n }\n );\n\n auditLogsLifecycle.registerEvent(AUDITED_EVENTS.MEDIA_DELETE, ({ media }: MediaEvent) => ({\n resource: fileResource(media),\n }));\n\n auditLogsLifecycle.registerEvent(\n AUDITED_EVENTS.FOLDER_CREATE,\n ({ folder }: FolderEvent) => ({ resource: folderResource(folder) }),\n { action: AUDITED_EVENTS.MEDIA_CREATE }\n );\n\n auditLogsLifecycle.registerEvent<{ changes: FolderChanges }>(\n AUDITED_EVENTS.FOLDER_UPDATE,\n (event: FolderEvent) => ({\n resource: folderResource(event.folder),\n details: { changes: getFolderChanges(event) },\n }),\n {\n action: AUDITED_EVENTS.MEDIA_UPDATE,\n shouldRecord: (event: FolderEvent) => Object.keys(getFolderChanges(event)).length > 0,\n }\n );\n\n auditLogsLifecycle.registerEvent(\n AUDITED_EVENTS.FOLDER_DELETE_AUDIT,\n ({ folder }: FolderEvent) => ({ resource: folderResource(folder) }),\n { action: AUDITED_EVENTS.MEDIA_DELETE }\n );\n\n auditLogsLifecycle.registerEvent<MoveDetails>(\n AUDITED_EVENTS.MEDIA_MOVE,\n (event: MediaMoveEvent) => ({\n resource: {\n type: event.kind === 'file' ? 'media' : 'media-folder',\n id: event.id,\n name: event.name,\n },\n details: { from: event.from, to: event.to },\n })\n );\n};\n"],"names":["AUDITED_EVENTS","UPLOAD_SETTINGS_UPDATE","MEDIA_CREATE","MEDIA_UPDATE","MEDIA_DELETE","MEDIA_MOVE","FOLDER_CREATE","FOLDER_UPDATE","MEDIA_UPDATE_AUDIT","FOLDER_DELETE_AUDIT","AUDITED_SETTINGS","getUploadSettingsChanges","previous","next","changes","setting","before","after","toFolderRef","folder","id","Number","name","toAuditedFile","file","mime","size","alternativeText","caption","focalPoint","summarizeFile","getMediaChanges","media","replaced","blankAsNull","value","field","focalBefore","focalAfter","JSON","stringify","folderBefore","folderAfter","getFolderChanges","parentBefore","parent","parentAfter","readParents","read","joinTable","ids","length","Map","joinColumn","inverseJoinColumn","rows","select","whereIn","map","row","readMediaMoves","files","folders","destinationFolderId","fileFolderJoinTable","folderParentJoinTable","folderTable","fileParents","folderParents","destinationId","referencedIds","Set","values","add","folderNames","forEach","set","toRef","get","to","kind","from","emitMediaMoves","strapi","moves","move","emitAudit","registerAuditEvents","auditLogsLifecycle","registerEvent","event","resource","type","details","fileResource","folderResource","action","shouldRecord","Object","keys"],"mappings":"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"}
|
package/dist/server/bootstrap.js
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
var index = require('./utils/index.js');
|
|
4
4
|
var constants = require('./constants.js');
|
|
5
5
|
var mediaLibraryDefaultNotice = require('./media-library-default-notice.js');
|
|
6
|
+
var auditLogs = require('./audit-logs.js');
|
|
6
7
|
|
|
7
8
|
async function bootstrap({ strapi: strapi1 }) {
|
|
8
9
|
const defaultConfig = {
|
|
@@ -46,6 +47,9 @@ async function bootstrap({ strapi: strapi1 }) {
|
|
|
46
47
|
});
|
|
47
48
|
await registerPermissionActions();
|
|
48
49
|
await registerWebhookEvents();
|
|
50
|
+
if (strapi1.has('audit-logs-lifecycle')) {
|
|
51
|
+
auditLogs.registerAuditEvents(strapi1.get('audit-logs-lifecycle'));
|
|
52
|
+
}
|
|
49
53
|
await index.getService('weeklyMetrics').registerCron();
|
|
50
54
|
// AI metadata
|
|
51
55
|
if (strapi1.ai.admin.isAvailable()) {
|