@strapi/content-manager 0.0.0-next.d8f8da8f5b333be4a20563a1a15cd61350139956 → 0.0.0-next.da19c0501ff87d14fb664b55b8e0630d3c548485
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/ConfigurationForm/EditFieldForm.js +1 -1
- package/dist/admin/components/ConfigurationForm/EditFieldForm.js.map +1 -1
- package/dist/admin/components/ConfigurationForm/EditFieldForm.mjs +1 -1
- package/dist/admin/components/ConfigurationForm/EditFieldForm.mjs.map +1 -1
- package/dist/admin/components/ConfigurationForm/Fields.js +304 -205
- package/dist/admin/components/ConfigurationForm/Fields.js.map +1 -1
- package/dist/admin/components/ConfigurationForm/Fields.mjs +309 -211
- package/dist/admin/components/ConfigurationForm/Fields.mjs.map +1 -1
- package/dist/admin/components/ConfigurationForm/Form.js +1 -1
- package/dist/admin/components/ConfigurationForm/Form.js.map +1 -1
- package/dist/admin/components/ConfigurationForm/Form.mjs +3 -3
- package/dist/admin/components/ConfigurationForm/Form.mjs.map +1 -1
- package/dist/admin/components/DragPreviews/CardDragPreview.js +3 -1
- package/dist/admin/components/DragPreviews/CardDragPreview.js.map +1 -1
- package/dist/admin/components/DragPreviews/CardDragPreview.mjs +3 -1
- package/dist/admin/components/DragPreviews/CardDragPreview.mjs.map +1 -1
- package/dist/admin/components/DragPreviews/ComponentDragPreview.js +3 -1
- package/dist/admin/components/DragPreviews/ComponentDragPreview.js.map +1 -1
- package/dist/admin/components/DragPreviews/ComponentDragPreview.mjs +3 -1
- package/dist/admin/components/DragPreviews/ComponentDragPreview.mjs.map +1 -1
- package/dist/admin/components/DragPreviews/RelationDragPreview.js +3 -1
- package/dist/admin/components/DragPreviews/RelationDragPreview.js.map +1 -1
- package/dist/admin/components/DragPreviews/RelationDragPreview.mjs +3 -1
- package/dist/admin/components/DragPreviews/RelationDragPreview.mjs.map +1 -1
- package/dist/admin/components/LeftMenu.js +94 -50
- package/dist/admin/components/LeftMenu.js.map +1 -1
- package/dist/admin/components/LeftMenu.mjs +97 -53
- package/dist/admin/components/LeftMenu.mjs.map +1 -1
- package/dist/admin/components/Widgets.js +287 -11
- package/dist/admin/components/Widgets.js.map +1 -1
- package/dist/admin/components/Widgets.mjs +270 -14
- package/dist/admin/components/Widgets.mjs.map +1 -1
- package/dist/admin/history/components/VersionContent.js +24 -3
- package/dist/admin/history/components/VersionContent.js.map +1 -1
- package/dist/admin/history/components/VersionContent.mjs +25 -4
- package/dist/admin/history/components/VersionContent.mjs.map +1 -1
- package/dist/admin/history/components/VersionHeader.js +7 -0
- package/dist/admin/history/components/VersionHeader.js.map +1 -1
- package/dist/admin/history/components/VersionHeader.mjs +8 -1
- package/dist/admin/history/components/VersionHeader.mjs.map +1 -1
- package/dist/admin/history/components/VersionsList.js +1 -1
- package/dist/admin/history/components/VersionsList.js.map +1 -1
- package/dist/admin/history/components/VersionsList.mjs +1 -1
- package/dist/admin/history/components/VersionsList.mjs.map +1 -1
- package/dist/admin/history/pages/History.js +7 -7
- package/dist/admin/history/pages/History.js.map +1 -1
- package/dist/admin/history/pages/History.mjs +7 -7
- package/dist/admin/history/pages/History.mjs.map +1 -1
- package/dist/admin/hooks/useDocumentActions.js +7 -6
- package/dist/admin/hooks/useDocumentActions.js.map +1 -1
- package/dist/admin/hooks/useDocumentActions.mjs +8 -7
- package/dist/admin/hooks/useDocumentActions.mjs.map +1 -1
- package/dist/admin/index.js +47 -8
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +47 -9
- package/dist/admin/index.mjs.map +1 -1
- package/dist/admin/layout.js +28 -33
- package/dist/admin/layout.js.map +1 -1
- package/dist/admin/layout.mjs +29 -15
- package/dist/admin/layout.mjs.map +1 -1
- package/dist/admin/pages/EditView/EditViewPage.js +98 -77
- package/dist/admin/pages/EditView/EditViewPage.js.map +1 -1
- package/dist/admin/pages/EditView/EditViewPage.mjs +100 -79
- package/dist/admin/pages/EditView/EditViewPage.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/Blocker.js +18 -0
- package/dist/admin/pages/EditView/components/Blocker.js.map +1 -0
- package/dist/admin/pages/EditView/components/Blocker.mjs +16 -0
- package/dist/admin/pages/EditView/components/Blocker.mjs.map +1 -0
- package/dist/admin/pages/EditView/components/DocumentActions.js +104 -70
- package/dist/admin/pages/EditView/components/DocumentActions.js.map +1 -1
- package/dist/admin/pages/EditView/components/DocumentActions.mjs +106 -72
- package/dist/admin/pages/EditView/components/DocumentActions.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Link.js +66 -2
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Link.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Link.mjs +66 -2
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Link.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.js +12 -15
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.mjs +12 -15
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.js +54 -14
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.mjs +55 -15
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.js +21 -35
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.mjs +21 -35
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.js +2 -2
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.mjs +2 -2
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/utils/links.js +7 -3
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/utils/links.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/utils/links.mjs +7 -3
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/utils/links.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js +12 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs +13 -2
- package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js +15 -3
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs +16 -4
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js +1 -2
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs +1 -2
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js +22 -8
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs +24 -10
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js +160 -107
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs +163 -110
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/UID.js +6 -3
- package/dist/admin/pages/EditView/components/FormInputs/UID.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/UID.mjs +6 -3
- package/dist/admin/pages/EditView/components/FormInputs/UID.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.js +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.mjs +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.js +2 -2
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.mjs +2 -2
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/WysiwygNav.js +86 -118
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/WysiwygNav.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/WysiwygNav.mjs +86 -118
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/WysiwygNav.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormLayout.js +59 -34
- package/dist/admin/pages/EditView/components/FormLayout.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormLayout.mjs +60 -34
- package/dist/admin/pages/EditView/components/FormLayout.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/Header.js +85 -25
- package/dist/admin/pages/EditView/components/Header.js.map +1 -1
- package/dist/admin/pages/EditView/components/Header.mjs +87 -27
- package/dist/admin/pages/EditView/components/Header.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/InputRenderer.js +20 -7
- package/dist/admin/pages/EditView/components/InputRenderer.js.map +1 -1
- package/dist/admin/pages/EditView/components/InputRenderer.mjs +20 -7
- package/dist/admin/pages/EditView/components/InputRenderer.mjs.map +1 -1
- package/dist/admin/pages/EditView/utils/data.js +128 -0
- package/dist/admin/pages/EditView/utils/data.js.map +1 -1
- package/dist/admin/pages/EditView/utils/data.mjs +128 -1
- package/dist/admin/pages/EditView/utils/data.mjs.map +1 -1
- package/dist/admin/pages/ListConfiguration/ListConfigurationPage.js +1 -0
- package/dist/admin/pages/ListConfiguration/ListConfigurationPage.js.map +1 -1
- package/dist/admin/pages/ListConfiguration/ListConfigurationPage.mjs +1 -0
- package/dist/admin/pages/ListConfiguration/ListConfigurationPage.mjs.map +1 -1
- package/dist/admin/pages/ListView/ListViewPage.js +227 -132
- package/dist/admin/pages/ListView/ListViewPage.js.map +1 -1
- package/dist/admin/pages/ListView/ListViewPage.mjs +229 -134
- package/dist/admin/pages/ListView/ListViewPage.mjs.map +1 -1
- package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.js +2 -1
- package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.js.map +1 -1
- package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.mjs +2 -1
- package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.mjs.map +1 -1
- package/dist/admin/pages/ListView/components/BulkActions/PublishAction.js +12 -2
- package/dist/admin/pages/ListView/components/BulkActions/PublishAction.js.map +1 -1
- package/dist/admin/pages/ListView/components/BulkActions/PublishAction.mjs +12 -2
- package/dist/admin/pages/ListView/components/BulkActions/PublishAction.mjs.map +1 -1
- package/dist/admin/pages/ListView/components/Filters.js +8 -2
- package/dist/admin/pages/ListView/components/Filters.js.map +1 -1
- package/dist/admin/pages/ListView/components/Filters.mjs +8 -2
- package/dist/admin/pages/ListView/components/Filters.mjs.map +1 -1
- package/dist/admin/pages/ListView/components/TableActions.js +13 -3
- package/dist/admin/pages/ListView/components/TableActions.js.map +1 -1
- package/dist/admin/pages/ListView/components/TableActions.mjs +13 -3
- package/dist/admin/pages/ListView/components/TableActions.mjs.map +1 -1
- package/dist/admin/pages/ListView/components/ViewSettingsMenu.js +5 -2
- package/dist/admin/pages/ListView/components/ViewSettingsMenu.js.map +1 -1
- package/dist/admin/pages/ListView/components/ViewSettingsMenu.mjs +5 -2
- package/dist/admin/pages/ListView/components/ViewSettingsMenu.mjs.map +1 -1
- package/dist/admin/preview/components/InputPopover.js +189 -0
- package/dist/admin/preview/components/InputPopover.js.map +1 -0
- package/dist/admin/preview/components/InputPopover.mjs +167 -0
- package/dist/admin/preview/components/InputPopover.mjs.map +1 -0
- package/dist/admin/preview/components/PreviewHeader.js +0 -1
- package/dist/admin/preview/components/PreviewHeader.js.map +1 -1
- package/dist/admin/preview/components/PreviewHeader.mjs +0 -1
- package/dist/admin/preview/components/PreviewHeader.mjs.map +1 -1
- package/dist/admin/preview/components/PreviewSidePanel.js +31 -4
- package/dist/admin/preview/components/PreviewSidePanel.js.map +1 -1
- package/dist/admin/preview/components/PreviewSidePanel.mjs +32 -5
- package/dist/admin/preview/components/PreviewSidePanel.mjs.map +1 -1
- package/dist/admin/preview/hooks/usePreviewInputManager.js +77 -0
- package/dist/admin/preview/hooks/usePreviewInputManager.js.map +1 -0
- package/dist/admin/preview/hooks/usePreviewInputManager.mjs +56 -0
- package/dist/admin/preview/hooks/usePreviewInputManager.mjs.map +1 -0
- package/dist/admin/preview/pages/Preview.js +178 -74
- package/dist/admin/preview/pages/Preview.js.map +1 -1
- package/dist/admin/preview/pages/Preview.mjs +180 -76
- package/dist/admin/preview/pages/Preview.mjs.map +1 -1
- package/dist/admin/preview/utils/constants.js +56 -0
- package/dist/admin/preview/utils/constants.js.map +1 -0
- package/dist/admin/preview/utils/constants.mjs +52 -0
- package/dist/admin/preview/utils/constants.mjs.map +1 -0
- package/dist/admin/preview/utils/fieldUtils.js +107 -0
- package/dist/admin/preview/utils/fieldUtils.js.map +1 -0
- package/dist/admin/preview/utils/fieldUtils.mjs +102 -0
- package/dist/admin/preview/utils/fieldUtils.mjs.map +1 -0
- package/dist/admin/preview/utils/getSendMessage.js +22 -0
- package/dist/admin/preview/utils/getSendMessage.js.map +1 -0
- package/dist/admin/preview/utils/getSendMessage.mjs +20 -0
- package/dist/admin/preview/utils/getSendMessage.mjs.map +1 -0
- package/dist/admin/preview/utils/previewScript.js +534 -0
- package/dist/admin/preview/utils/previewScript.js.map +1 -0
- package/dist/admin/preview/utils/previewScript.mjs +532 -0
- package/dist/admin/preview/utils/previewScript.mjs.map +1 -0
- package/dist/admin/services/api.js +5 -1
- package/dist/admin/services/api.js.map +1 -1
- package/dist/admin/services/api.mjs +5 -1
- package/dist/admin/services/api.mjs.map +1 -1
- package/dist/admin/services/documents.js +59 -17
- package/dist/admin/services/documents.js.map +1 -1
- package/dist/admin/services/documents.mjs +59 -17
- package/dist/admin/services/documents.mjs.map +1 -1
- package/dist/admin/src/components/ConfigurationForm/Fields.d.ts +6 -4
- package/dist/admin/src/components/LeftMenu.d.ts +3 -1
- package/dist/admin/src/components/Widgets.d.ts +8 -3
- package/dist/admin/src/exports.d.ts +1 -0
- package/dist/admin/src/history/services/historyVersion.d.ts +1 -1
- package/dist/admin/src/hooks/useDocumentActions.d.ts +1 -0
- package/dist/admin/src/pages/EditView/components/Blocker.d.ts +5 -0
- package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/utils/links.d.ts +2 -0
- package/dist/admin/src/pages/EditView/components/FormInputs/UID.d.ts +1 -0
- package/dist/admin/src/pages/EditView/components/FormLayout.d.ts +7 -11
- package/dist/admin/src/pages/EditView/components/Header.d.ts +4 -0
- package/dist/admin/src/pages/EditView/components/InputRenderer.d.ts +1 -1
- package/dist/admin/src/pages/EditView/utils/data.d.ts +19 -1
- package/dist/admin/src/preview/components/InputPopover.d.ts +6 -0
- package/dist/admin/src/preview/hooks/usePreviewInputManager.d.ts +5 -0
- package/dist/admin/src/preview/pages/Preview.d.ts +12 -0
- package/dist/admin/src/preview/services/preview.d.ts +1 -1
- package/dist/admin/src/preview/utils/constants.d.ts +55 -0
- package/dist/admin/src/preview/utils/fieldUtils.d.ts +22 -0
- package/dist/admin/src/preview/utils/getSendMessage.d.ts +11 -0
- package/dist/admin/src/preview/utils/previewScript.d.ts +24 -0
- package/dist/admin/src/services/api.d.ts +1 -1
- package/dist/admin/src/services/components.d.ts +2 -2
- package/dist/admin/src/services/contentTypes.d.ts +3 -3
- package/dist/admin/src/services/documents.d.ts +23 -17
- package/dist/admin/src/services/homepage.d.ts +1 -1
- package/dist/admin/src/services/init.d.ts +1 -1
- package/dist/admin/src/services/relations.d.ts +2 -2
- package/dist/admin/src/services/uid.d.ts +3 -3
- package/dist/admin/src/utils/api.d.ts +1 -1
- package/dist/admin/src/utils/validation.d.ts +1 -0
- package/dist/admin/translations/en.json.js +13 -0
- package/dist/admin/translations/en.json.js.map +1 -1
- package/dist/admin/translations/en.json.mjs +13 -0
- package/dist/admin/translations/en.json.mjs.map +1 -1
- package/dist/admin/translations/es.json.js +6 -2
- package/dist/admin/translations/es.json.js.map +1 -1
- package/dist/admin/translations/es.json.mjs +6 -2
- package/dist/admin/translations/es.json.mjs.map +1 -1
- package/dist/admin/translations/fr.json.js +11 -2
- package/dist/admin/translations/fr.json.js.map +1 -1
- package/dist/admin/translations/fr.json.mjs +11 -2
- package/dist/admin/translations/fr.json.mjs.map +1 -1
- package/dist/admin/utils/api.js +1 -1
- package/dist/admin/utils/api.js.map +1 -1
- package/dist/admin/utils/api.mjs +1 -1
- package/dist/admin/utils/api.mjs.map +1 -1
- package/dist/admin/utils/validation.js +19 -7
- package/dist/admin/utils/validation.js.map +1 -1
- package/dist/admin/utils/validation.mjs +19 -7
- package/dist/admin/utils/validation.mjs.map +1 -1
- package/dist/server/controllers/collection-types.js +2 -1
- package/dist/server/controllers/collection-types.js.map +1 -1
- package/dist/server/controllers/collection-types.mjs +2 -1
- package/dist/server/controllers/collection-types.mjs.map +1 -1
- package/dist/server/controllers/content-types.js +11 -1
- package/dist/server/controllers/content-types.js.map +1 -1
- package/dist/server/controllers/content-types.mjs +11 -1
- package/dist/server/controllers/content-types.mjs.map +1 -1
- package/dist/server/controllers/relations.js +8 -6
- package/dist/server/controllers/relations.js.map +1 -1
- package/dist/server/controllers/relations.mjs +8 -6
- package/dist/server/controllers/relations.mjs.map +1 -1
- package/dist/server/controllers/single-types.js.map +1 -1
- package/dist/server/controllers/single-types.mjs.map +1 -1
- package/dist/server/controllers/validation/index.js +14 -2
- package/dist/server/controllers/validation/index.js.map +1 -1
- package/dist/server/controllers/validation/index.mjs +14 -2
- package/dist/server/controllers/validation/index.mjs.map +1 -1
- package/dist/server/history/services/lifecycles.js +23 -19
- package/dist/server/history/services/lifecycles.js.map +1 -1
- package/dist/server/history/services/lifecycles.mjs +23 -19
- package/dist/server/history/services/lifecycles.mjs.map +1 -1
- package/dist/server/homepage/controllers/homepage.js +5 -0
- package/dist/server/homepage/controllers/homepage.js.map +1 -1
- package/dist/server/homepage/controllers/homepage.mjs +5 -0
- package/dist/server/homepage/controllers/homepage.mjs.map +1 -1
- package/dist/server/homepage/routes/homepage.js +11 -0
- package/dist/server/homepage/routes/homepage.js.map +1 -1
- package/dist/server/homepage/routes/homepage.mjs +11 -0
- package/dist/server/homepage/routes/homepage.mjs.map +1 -1
- package/dist/server/homepage/services/homepage.js +86 -46
- package/dist/server/homepage/services/homepage.js.map +1 -1
- package/dist/server/homepage/services/homepage.mjs +86 -46
- package/dist/server/homepage/services/homepage.mjs.map +1 -1
- package/dist/server/preview/services/preview-config.js +11 -32
- package/dist/server/preview/services/preview-config.js.map +1 -1
- package/dist/server/preview/services/preview-config.mjs +12 -33
- package/dist/server/preview/services/preview-config.mjs.map +1 -1
- package/dist/server/preview/services/preview.js +4 -0
- package/dist/server/preview/services/preview.js.map +1 -1
- package/dist/server/preview/services/preview.mjs +4 -0
- package/dist/server/preview/services/preview.mjs.map +1 -1
- package/dist/server/services/data-mapper.js +4 -1
- package/dist/server/services/data-mapper.js.map +1 -1
- package/dist/server/services/data-mapper.mjs +4 -1
- package/dist/server/services/data-mapper.mjs.map +1 -1
- package/dist/server/services/document-manager.js +8 -1
- package/dist/server/services/document-manager.js.map +1 -1
- package/dist/server/services/document-manager.mjs +8 -1
- package/dist/server/services/document-manager.mjs.map +1 -1
- package/dist/server/services/document-metadata.js +3 -1
- package/dist/server/services/document-metadata.js.map +1 -1
- package/dist/server/services/document-metadata.mjs +3 -1
- package/dist/server/services/document-metadata.mjs.map +1 -1
- package/dist/server/services/utils/configuration/attributes.js +1 -1
- package/dist/server/services/utils/configuration/attributes.js.map +1 -1
- package/dist/server/services/utils/configuration/attributes.mjs +1 -1
- package/dist/server/services/utils/configuration/attributes.mjs.map +1 -1
- package/dist/server/services/utils/configuration/layouts.js +1 -1
- package/dist/server/services/utils/configuration/layouts.js.map +1 -1
- package/dist/server/services/utils/configuration/layouts.mjs +1 -1
- package/dist/server/services/utils/configuration/layouts.mjs.map +1 -1
- package/dist/server/services/utils/configuration/metadatas.js +8 -0
- package/dist/server/services/utils/configuration/metadatas.js.map +1 -1
- package/dist/server/services/utils/configuration/metadatas.mjs +8 -0
- package/dist/server/services/utils/configuration/metadatas.mjs.map +1 -1
- package/dist/server/services/utils/populate.js +11 -0
- package/dist/server/services/utils/populate.js.map +1 -1
- package/dist/server/services/utils/populate.mjs +11 -0
- package/dist/server/services/utils/populate.mjs.map +1 -1
- package/dist/server/src/controllers/collection-types.d.ts.map +1 -1
- package/dist/server/src/controllers/content-types.d.ts.map +1 -1
- package/dist/server/src/controllers/relations.d.ts.map +1 -1
- package/dist/server/src/controllers/single-types.d.ts.map +1 -1
- package/dist/server/src/controllers/validation/index.d.ts +6 -1
- package/dist/server/src/controllers/validation/index.d.ts.map +1 -1
- package/dist/server/src/history/services/lifecycles.d.ts.map +1 -1
- package/dist/server/src/homepage/controllers/homepage.d.ts +2 -1
- package/dist/server/src/homepage/controllers/homepage.d.ts.map +1 -1
- package/dist/server/src/homepage/index.d.ts +7 -0
- package/dist/server/src/homepage/index.d.ts.map +1 -1
- package/dist/server/src/homepage/routes/homepage.d.ts.map +1 -1
- package/dist/server/src/homepage/services/homepage.d.ts +4 -1
- package/dist/server/src/homepage/services/homepage.d.ts.map +1 -1
- package/dist/server/src/homepage/services/index.d.ts +7 -0
- package/dist/server/src/homepage/services/index.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +8 -0
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/preview/services/index.d.ts +1 -0
- package/dist/server/src/preview/services/index.d.ts.map +1 -1
- package/dist/server/src/preview/services/preview-config.d.ts +1 -0
- package/dist/server/src/preview/services/preview-config.d.ts.map +1 -1
- package/dist/server/src/preview/services/preview.d.ts.map +1 -1
- package/dist/server/src/preview/utils.d.ts +1 -0
- package/dist/server/src/preview/utils.d.ts.map +1 -1
- package/dist/server/src/services/data-mapper.d.ts +1 -0
- package/dist/server/src/services/data-mapper.d.ts.map +1 -1
- package/dist/server/src/services/document-manager.d.ts.map +1 -1
- package/dist/server/src/services/document-metadata.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +8 -0
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/services/utils/configuration/metadatas.d.ts.map +1 -1
- package/dist/server/src/services/utils/populate.d.ts.map +1 -1
- package/dist/shared/contracts/collection-types.d.ts +0 -1
- package/dist/shared/contracts/collection-types.d.ts.map +1 -1
- package/dist/shared/contracts/homepage.d.ts +13 -0
- package/dist/shared/contracts/homepage.d.ts.map +1 -1
- package/package.json +11 -9
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"single-types.mjs","sources":["../../../server/src/controllers/single-types.ts"],"sourcesContent":["import type { UID, Modules } from '@strapi/types';\nimport { setCreatorFields, async, errors } from '@strapi/utils';\n\nimport { getDocumentLocaleAndStatus } from './validation/dimensions';\nimport { getService } from '../utils';\nimport { formatDocumentWithMetadata } from './utils/metadata';\n\ntype OptionsWithPopulate = Modules.Documents.Params.Pick<UID.ContentType, 'populate:object'>;\n\nconst buildPopulateFromQuery = async (query: any, model: any) => {\n return getService('populate-builder')(model)\n .populateFromQuery(query)\n .populateDeep(Infinity)\n .countRelations()\n .build();\n};\n\nconst findDocument = async (query: any, uid: UID.SingleType, opts: any = {}) => {\n const documentManager = getService('document-manager');\n const populate = await buildPopulateFromQuery(query, uid);\n\n return (\n documentManager\n .findMany({ ...opts, populate }, uid)\n // Return the first document found\n .then((documents: any) => documents[0])\n );\n};\n\nconst createOrUpdateDocument = async (ctx: any, opts?: OptionsWithPopulate) => {\n const { user, userAbility } = ctx.state;\n const { model } = ctx.params;\n const { body, query } = ctx.request;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n if (permissionChecker.cannot.create() && permissionChecker.cannot.update()) {\n throw new errors.ForbiddenError();\n }\n\n const sanitizedQuery = await permissionChecker.sanitizedQuery.update(query);\n\n const { locale } = await getDocumentLocaleAndStatus(body, model);\n\n // Load document version to update\n const [documentVersion, otherDocumentVersion] = await Promise.all([\n findDocument(sanitizedQuery, model, { locale, status: 'draft' }),\n // Find the first document to check if it exists\n strapi.db.query(model).findOne({ select: ['documentId'] }),\n ]);\n\n const documentId = otherDocumentVersion?.documentId;\n\n const pickPermittedFields = documentVersion\n ? permissionChecker.sanitizeUpdateInput(documentVersion)\n : permissionChecker.sanitizeCreateInput;\n\n const setCreator = documentVersion\n ? setCreatorFields({ user, isEdition: true })\n : setCreatorFields({ user });\n\n const sanitizeFn = async.pipe(pickPermittedFields, setCreator as any);\n\n // If version is not found, but document exists,\n // the intent is to create a new document locale\n if (documentVersion) {\n if (permissionChecker.cannot.update(documentVersion)) {\n throw new errors.ForbiddenError();\n }\n } else if (permissionChecker.cannot.create()) {\n throw new errors.ForbiddenError();\n }\n\n const sanitizedBody = await sanitizeFn(body);\n\n if (!documentId) {\n return documentManager.create(model, {\n data: sanitizedBody,\n ...sanitizedQuery,\n locale,\n });\n }\n\n return documentManager.update(documentId, model, {\n data: sanitizedBody as any,\n populate: opts?.populate,\n locale,\n });\n};\n\nexport default {\n async find(ctx: any) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n const { query = {} } = ctx.request;\n\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n if (permissionChecker.cannot.read()) {\n return ctx.forbidden();\n }\n\n const permissionQuery = await permissionChecker.sanitizedQuery.read(query);\n const { locale, status } = await getDocumentLocaleAndStatus(query, model);\n\n const version = await findDocument(permissionQuery, model, { locale, status });\n\n // allow user with create permission to know a single type is not created\n if (!version) {\n if (permissionChecker.cannot.create()) {\n return ctx.forbidden();\n }\n // Check if document exists\n const document = await strapi.db.query(model).findOne({});\n\n if (!document) {\n return ctx.notFound();\n }\n\n // If the requested locale doesn't exist, return an empty response\n const { meta } = await formatDocumentWithMetadata(\n permissionChecker,\n model,\n // @ts-expect-error - fix types\n { documentId: document.documentId, locale, publishedAt: null },\n { availableLocales: true, availableStatus: false }\n );\n ctx.body = { data: {}, meta };\n return;\n }\n\n if (permissionChecker.cannot.read(version)) {\n return ctx.forbidden();\n }\n\n const sanitizedDocument = await permissionChecker.sanitizeOutput(version);\n ctx.body = await formatDocumentWithMetadata(permissionChecker, model, sanitizedDocument);\n },\n\n async createOrUpdate(ctx: any) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n const document = await createOrUpdateDocument(ctx);\n const sanitizedDocument = await permissionChecker.sanitizeOutput(document);\n ctx.body = await formatDocumentWithMetadata(permissionChecker, model, sanitizedDocument);\n },\n\n async delete(ctx: any) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n const { query = {} } = ctx.request;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n if (permissionChecker.cannot.delete()) {\n return ctx.forbidden();\n }\n\n const sanitizedQuery = await permissionChecker.sanitizedQuery.delete(query);\n const populate = await buildPopulateFromQuery(sanitizedQuery, model);\n\n const { locale } = await getDocumentLocaleAndStatus(query, model);\n const documentLocales = await documentManager.findLocales(undefined, model, {\n populate,\n locale,\n });\n\n if (documentLocales.length === 0) {\n return ctx.notFound();\n }\n\n for (const document of documentLocales) {\n if (permissionChecker.cannot.delete(document)) {\n return ctx.forbidden();\n }\n }\n\n const deletedEntity = await documentManager.delete(documentLocales.at(0).documentId, model, {\n locale,\n });\n\n ctx.body = await permissionChecker.sanitizeOutput(deletedEntity);\n },\n\n async publish(ctx: any) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n const { query = {} } = ctx.request;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n if (permissionChecker.cannot.publish()) {\n return ctx.forbidden();\n }\n\n const publishedDocument = await strapi.db.transaction(async () => {\n const sanitizedQuery = await permissionChecker.sanitizedQuery.publish(query);\n const populate = await buildPopulateFromQuery(sanitizedQuery, model);\n const document = await createOrUpdateDocument(ctx, { populate });\n\n if (!document) {\n throw new errors.NotFoundError();\n }\n\n if (permissionChecker.cannot.publish(document)) {\n throw new errors.ForbiddenError();\n }\n\n const { locale } = await getDocumentLocaleAndStatus(document, model);\n const publishResult = await documentManager.publish(document.documentId, model, { locale });\n\n return publishResult.at(0);\n });\n\n const sanitizedDocument = await permissionChecker.sanitizeOutput(publishedDocument);\n ctx.body = await formatDocumentWithMetadata(permissionChecker, model, sanitizedDocument);\n },\n\n async unpublish(ctx: any) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n const {\n body: { discardDraft, ...body },\n query = {},\n } = ctx.request;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n if (permissionChecker.cannot.unpublish()) {\n return ctx.forbidden();\n }\n\n if (discardDraft && permissionChecker.cannot.discard()) {\n return ctx.forbidden();\n }\n\n const sanitizedQuery = await permissionChecker.sanitizedQuery.unpublish(query);\n const { locale } = await getDocumentLocaleAndStatus(body, model);\n\n const document = await findDocument(sanitizedQuery, model, { locale });\n\n if (!document) {\n return ctx.notFound();\n }\n\n if (permissionChecker.cannot.unpublish(document)) {\n return ctx.forbidden();\n }\n\n if (discardDraft && permissionChecker.cannot.discard(document)) {\n return ctx.forbidden();\n }\n\n await strapi.db.transaction(async () => {\n if (discardDraft) {\n await documentManager.discardDraft(document.documentId, model, { locale });\n }\n\n ctx.body = await async.pipe(\n (document) => documentManager.unpublish(document.documentId, model, { locale }),\n permissionChecker.sanitizeOutput,\n (document) => formatDocumentWithMetadata(permissionChecker, model, document)\n )(document);\n });\n },\n\n async discard(ctx: any) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n const { body, query = {} } = ctx.request;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n if (permissionChecker.cannot.discard()) {\n return ctx.forbidden();\n }\n\n const sanitizedQuery = await permissionChecker.sanitizedQuery.discard(query);\n const { locale } = await getDocumentLocaleAndStatus(body, model);\n\n const document = await findDocument(sanitizedQuery, model, { locale, status: 'published' });\n\n // Can not discard a document that is not published\n if (!document) {\n return ctx.notFound();\n }\n\n if (permissionChecker.cannot.discard(document)) {\n return ctx.forbidden();\n }\n\n ctx.body = await async.pipe(\n (document) => documentManager.discardDraft(document.documentId, model, { locale }),\n permissionChecker.sanitizeOutput,\n (document) => formatDocumentWithMetadata(permissionChecker, model, document)\n )(document);\n },\n\n async countDraftRelations(ctx: any) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n const { query } = ctx.request;\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n const { locale } = await getDocumentLocaleAndStatus(query, model);\n\n if (permissionChecker.cannot.read()) {\n return ctx.forbidden();\n }\n\n const document = await findDocument({}, model);\n if (!document) {\n return ctx.notFound();\n }\n\n if (permissionChecker.cannot.read(document)) {\n return ctx.forbidden();\n }\n\n const number = await documentManager.countDraftRelations(document.documentId, model, locale);\n\n return {\n data: number,\n };\n },\n};\n"],"names":["buildPopulateFromQuery","query","model","getService","populateFromQuery","populateDeep","Infinity","countRelations","build","findDocument","uid","opts","documentManager","populate","findMany","then","documents","createOrUpdateDocument","ctx","user","userAbility","state","params","body","request","permissionChecker","create","cannot","update","errors","ForbiddenError","sanitizedQuery","locale","getDocumentLocaleAndStatus","documentVersion","otherDocumentVersion","Promise","all","status","strapi","db","findOne","select","documentId","pickPermittedFields","sanitizeUpdateInput","sanitizeCreateInput","setCreator","setCreatorFields","isEdition","sanitizeFn","async","pipe","sanitizedBody","data","find","read","forbidden","permissionQuery","version","document","notFound","meta","formatDocumentWithMetadata","publishedAt","availableLocales","availableStatus","sanitizedDocument","sanitizeOutput","createOrUpdate","delete","documentLocales","findLocales","undefined","length","deletedEntity","at","publish","publishedDocument","transaction","NotFoundError","publishResult","unpublish","discardDraft","discard","countDraftRelations","number"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"single-types.mjs","sources":["../../../server/src/controllers/single-types.ts"],"sourcesContent":["import type { UID, Modules } from '@strapi/types';\nimport { setCreatorFields, async, errors } from '@strapi/utils';\n\nimport { getDocumentLocaleAndStatus } from './validation/dimensions';\nimport { getService } from '../utils';\nimport { formatDocumentWithMetadata } from './utils/metadata';\n\ntype OptionsWithPopulate = Modules.Documents.Params.Pick<UID.ContentType, 'populate:object'>;\n\nconst buildPopulateFromQuery = async (query: any, model: any) => {\n return getService('populate-builder')(model)\n .populateFromQuery(query)\n .populateDeep(Infinity)\n .countRelations()\n .build();\n};\n\nconst findDocument = async (query: any, uid: UID.SingleType, opts: any = {}) => {\n const documentManager = getService('document-manager');\n const populate = await buildPopulateFromQuery(query, uid);\n\n return (\n documentManager\n .findMany({ ...opts, populate }, uid)\n // Return the first document found\n .then((documents: any) => documents[0])\n );\n};\n\nconst createOrUpdateDocument = async (ctx: any, opts?: OptionsWithPopulate) => {\n const { user, userAbility } = ctx.state;\n const { model } = ctx.params;\n const { body, query } = ctx.request;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n if (permissionChecker.cannot.create() && permissionChecker.cannot.update()) {\n throw new errors.ForbiddenError();\n }\n\n const sanitizedQuery = await permissionChecker.sanitizedQuery.update(query);\n\n const { locale } = await getDocumentLocaleAndStatus(body, model);\n\n // Load document version to update\n const [documentVersion, otherDocumentVersion] = await Promise.all([\n findDocument(sanitizedQuery, model, { locale, status: 'draft' }),\n // Find the first document to check if it exists\n strapi.db.query(model).findOne({ select: ['documentId'] }),\n ]);\n\n const documentId = otherDocumentVersion?.documentId;\n\n const pickPermittedFields = documentVersion\n ? permissionChecker.sanitizeUpdateInput(documentVersion)\n : permissionChecker.sanitizeCreateInput;\n\n const setCreator = documentVersion\n ? setCreatorFields({ user, isEdition: true })\n : setCreatorFields({ user });\n\n const sanitizeFn = async.pipe(pickPermittedFields, setCreator as any);\n\n // If version is not found, but document exists,\n // the intent is to create a new document locale\n if (documentVersion) {\n if (permissionChecker.cannot.update(documentVersion)) {\n throw new errors.ForbiddenError();\n }\n } else if (permissionChecker.cannot.create()) {\n throw new errors.ForbiddenError();\n }\n\n const sanitizedBody = await sanitizeFn(body);\n\n if (!documentId) {\n return documentManager.create(model, {\n data: sanitizedBody,\n ...sanitizedQuery,\n locale,\n });\n }\n\n return documentManager.update(documentId, model, {\n data: sanitizedBody as any,\n populate: opts?.populate,\n locale,\n });\n};\n\nexport default {\n async find(ctx: any) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n const { query = {} } = ctx.request;\n\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n if (permissionChecker.cannot.read()) {\n return ctx.forbidden();\n }\n\n const permissionQuery = await permissionChecker.sanitizedQuery.read(query);\n const { locale, status } = await getDocumentLocaleAndStatus(query, model);\n\n const version = await findDocument(permissionQuery, model, { locale, status });\n\n // allow user with create permission to know a single type is not created\n if (!version) {\n if (permissionChecker.cannot.create()) {\n return ctx.forbidden();\n }\n // Check if document exists\n const document = await strapi.db.query(model).findOne({});\n\n if (!document) {\n return ctx.notFound();\n }\n\n // If the requested locale doesn't exist, return an empty response\n const { meta } = await formatDocumentWithMetadata(\n permissionChecker,\n model,\n // @ts-expect-error - fix types\n { documentId: document.documentId, locale, publishedAt: null },\n { availableLocales: true, availableStatus: false }\n );\n ctx.body = { data: {}, meta };\n return;\n }\n\n if (permissionChecker.cannot.read(version)) {\n return ctx.forbidden();\n }\n\n const sanitizedDocument = await permissionChecker.sanitizeOutput(version);\n ctx.body = await formatDocumentWithMetadata(permissionChecker, model, sanitizedDocument);\n },\n\n async createOrUpdate(ctx: any) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n const document = await createOrUpdateDocument(ctx);\n\n const sanitizedDocument = await permissionChecker.sanitizeOutput(document);\n ctx.body = await formatDocumentWithMetadata(permissionChecker, model, sanitizedDocument);\n },\n\n async delete(ctx: any) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n const { query = {} } = ctx.request;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n if (permissionChecker.cannot.delete()) {\n return ctx.forbidden();\n }\n\n const sanitizedQuery = await permissionChecker.sanitizedQuery.delete(query);\n const populate = await buildPopulateFromQuery(sanitizedQuery, model);\n\n const { locale } = await getDocumentLocaleAndStatus(query, model);\n const documentLocales = await documentManager.findLocales(undefined, model, {\n populate,\n locale,\n });\n\n if (documentLocales.length === 0) {\n return ctx.notFound();\n }\n\n for (const document of documentLocales) {\n if (permissionChecker.cannot.delete(document)) {\n return ctx.forbidden();\n }\n }\n\n const deletedEntity = await documentManager.delete(documentLocales.at(0).documentId, model, {\n locale,\n });\n\n ctx.body = await permissionChecker.sanitizeOutput(deletedEntity);\n },\n\n async publish(ctx: any) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n const { query = {} } = ctx.request;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n if (permissionChecker.cannot.publish()) {\n return ctx.forbidden();\n }\n\n const publishedDocument = await strapi.db.transaction(async () => {\n const sanitizedQuery = await permissionChecker.sanitizedQuery.publish(query);\n const populate = await buildPopulateFromQuery(sanitizedQuery, model);\n const document = await createOrUpdateDocument(ctx, { populate });\n\n if (!document) {\n throw new errors.NotFoundError();\n }\n\n if (permissionChecker.cannot.publish(document)) {\n throw new errors.ForbiddenError();\n }\n\n const { locale } = await getDocumentLocaleAndStatus(document, model);\n const publishResult = await documentManager.publish(document.documentId, model, { locale });\n\n return publishResult.at(0);\n });\n\n const sanitizedDocument = await permissionChecker.sanitizeOutput(publishedDocument);\n ctx.body = await formatDocumentWithMetadata(permissionChecker, model, sanitizedDocument);\n },\n\n async unpublish(ctx: any) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n const {\n body: { discardDraft, ...body },\n query = {},\n } = ctx.request;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n if (permissionChecker.cannot.unpublish()) {\n return ctx.forbidden();\n }\n\n if (discardDraft && permissionChecker.cannot.discard()) {\n return ctx.forbidden();\n }\n\n const sanitizedQuery = await permissionChecker.sanitizedQuery.unpublish(query);\n const { locale } = await getDocumentLocaleAndStatus(body, model);\n\n const document = await findDocument(sanitizedQuery, model, { locale });\n\n if (!document) {\n return ctx.notFound();\n }\n\n if (permissionChecker.cannot.unpublish(document)) {\n return ctx.forbidden();\n }\n\n if (discardDraft && permissionChecker.cannot.discard(document)) {\n return ctx.forbidden();\n }\n\n await strapi.db.transaction(async () => {\n if (discardDraft) {\n await documentManager.discardDraft(document.documentId, model, { locale });\n }\n\n ctx.body = await async.pipe(\n (document) => documentManager.unpublish(document.documentId, model, { locale }),\n permissionChecker.sanitizeOutput,\n (document) => formatDocumentWithMetadata(permissionChecker, model, document)\n )(document);\n });\n },\n\n async discard(ctx: any) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n const { body, query = {} } = ctx.request;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n if (permissionChecker.cannot.discard()) {\n return ctx.forbidden();\n }\n\n const sanitizedQuery = await permissionChecker.sanitizedQuery.discard(query);\n const { locale } = await getDocumentLocaleAndStatus(body, model);\n\n const document = await findDocument(sanitizedQuery, model, { locale, status: 'published' });\n\n // Can not discard a document that is not published\n if (!document) {\n return ctx.notFound();\n }\n\n if (permissionChecker.cannot.discard(document)) {\n return ctx.forbidden();\n }\n\n ctx.body = await async.pipe(\n (document) => documentManager.discardDraft(document.documentId, model, { locale }),\n permissionChecker.sanitizeOutput,\n (document) => formatDocumentWithMetadata(permissionChecker, model, document)\n )(document);\n },\n\n async countDraftRelations(ctx: any) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n const { query } = ctx.request;\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n const { locale } = await getDocumentLocaleAndStatus(query, model);\n\n if (permissionChecker.cannot.read()) {\n return ctx.forbidden();\n }\n\n const document = await findDocument({}, model);\n if (!document) {\n return ctx.notFound();\n }\n\n if (permissionChecker.cannot.read(document)) {\n return ctx.forbidden();\n }\n\n const number = await documentManager.countDraftRelations(document.documentId, model, locale);\n\n return {\n data: number,\n };\n },\n};\n"],"names":["buildPopulateFromQuery","query","model","getService","populateFromQuery","populateDeep","Infinity","countRelations","build","findDocument","uid","opts","documentManager","populate","findMany","then","documents","createOrUpdateDocument","ctx","user","userAbility","state","params","body","request","permissionChecker","create","cannot","update","errors","ForbiddenError","sanitizedQuery","locale","getDocumentLocaleAndStatus","documentVersion","otherDocumentVersion","Promise","all","status","strapi","db","findOne","select","documentId","pickPermittedFields","sanitizeUpdateInput","sanitizeCreateInput","setCreator","setCreatorFields","isEdition","sanitizeFn","async","pipe","sanitizedBody","data","find","read","forbidden","permissionQuery","version","document","notFound","meta","formatDocumentWithMetadata","publishedAt","availableLocales","availableStatus","sanitizedDocument","sanitizeOutput","createOrUpdate","delete","documentLocales","findLocales","undefined","length","deletedEntity","at","publish","publishedDocument","transaction","NotFoundError","publishResult","unpublish","discardDraft","discard","countDraftRelations","number"],"mappings":"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"}
|
|
@@ -25,7 +25,9 @@ const generateUIDInputSchema = strapiUtils.yup.object({
|
|
|
25
25
|
const checkUIDAvailabilityInputSchema = strapiUtils.yup.object({
|
|
26
26
|
contentTypeUID: strapiUtils.yup.string().required(),
|
|
27
27
|
field: strapiUtils.yup.string().required(),
|
|
28
|
-
value: strapiUtils.yup.string().
|
|
28
|
+
value: strapiUtils.yup.string().required().test('isValueMatchingRegex', `\${path} must match the custom regex or the default one "/^[A-Za-z0-9-_.~]*$/"`, function(value, context) {
|
|
29
|
+
return value === '' || (context.options.context?.regex ? new RegExp(context.options?.context.regex).test(value) : /^[A-Za-z0-9-_.~]*$/.test(value));
|
|
30
|
+
})
|
|
29
31
|
});
|
|
30
32
|
const validateUIDField = (contentTypeUID, field)=>{
|
|
31
33
|
const model = strapi.contentTypes[contentTypeUID];
|
|
@@ -46,7 +48,17 @@ const validateUIDField = (contentTypeUID, field)=>{
|
|
|
46
48
|
const validateKind = strapiUtils.validateYupSchema(kindSchema);
|
|
47
49
|
const validateBulkActionInput = strapiUtils.validateYupSchema(bulkActionInputSchema);
|
|
48
50
|
const validateGenerateUIDInput = strapiUtils.validateYupSchema(generateUIDInputSchema);
|
|
49
|
-
const validateCheckUIDAvailabilityInput =
|
|
51
|
+
const validateCheckUIDAvailabilityInput = (body)=>{
|
|
52
|
+
const options = {};
|
|
53
|
+
const contentType = body.contentTypeUID in strapi.contentTypes ? strapi.contentTypes[body.contentTypeUID] : null;
|
|
54
|
+
if (contentType?.attributes[body.field] && `regex` in contentType.attributes[body.field] && contentType.attributes[body.field].regex) {
|
|
55
|
+
options.context = {
|
|
56
|
+
regex: (contentType?.attributes[body.field]).regex
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
const validator = strapiUtils.validateYupSchema(checkUIDAvailabilityInputSchema, options);
|
|
60
|
+
return validator(body);
|
|
61
|
+
};
|
|
50
62
|
|
|
51
63
|
exports.validateBulkActionInput = validateBulkActionInput;
|
|
52
64
|
exports.validateCheckUIDAvailabilityInput = validateCheckUIDAvailabilityInput;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../server/src/controllers/validation/index.ts"],"sourcesContent":["import _ from 'lodash';\nimport { yup, validateYupSchema, errors } from '@strapi/utils';\nimport createModelConfigurationSchema from './model-configuration';\n\nconst { PaginationError, ValidationError } = errors;\nconst TYPES = ['singleType', 'collectionType'];\n\n/**\n * Validates type kind\n */\nconst kindSchema = yup.string().oneOf(TYPES).nullable();\n\nconst bulkActionInputSchema = yup\n .object({\n documentIds: yup.array().of(yup.strapiID()).min(1).required(),\n })\n .required();\n\nconst generateUIDInputSchema = yup.object({\n contentTypeUID: yup.string().required(),\n field: yup.string().required(),\n data: yup.object().required(),\n});\n\nconst checkUIDAvailabilityInputSchema = yup.object({\n contentTypeUID: yup.string().required(),\n field: yup.string().required(),\n value: yup\n .string()\n .
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../server/src/controllers/validation/index.ts"],"sourcesContent":["import _ from 'lodash';\nimport { Schema, UID } from '@strapi/types';\nimport { yup, validateYupSchema, errors } from '@strapi/utils';\nimport { ValidateOptions } from 'yup/lib/types';\nimport { TestContext } from 'yup';\nimport createModelConfigurationSchema from './model-configuration';\n\nconst { PaginationError, ValidationError } = errors;\nconst TYPES = ['singleType', 'collectionType'];\n\n/**\n * Validates type kind\n */\nconst kindSchema = yup.string().oneOf(TYPES).nullable();\n\nconst bulkActionInputSchema = yup\n .object({\n documentIds: yup.array().of(yup.strapiID()).min(1).required(),\n })\n .required();\n\nconst generateUIDInputSchema = yup.object({\n contentTypeUID: yup.string().required(),\n field: yup.string().required(),\n data: yup.object().required(),\n});\n\nconst checkUIDAvailabilityInputSchema = yup.object({\n contentTypeUID: yup.string().required(),\n field: yup.string().required(),\n value: yup\n .string()\n .required()\n .test(\n 'isValueMatchingRegex',\n `\\${path} must match the custom regex or the default one \"/^[A-Za-z0-9-_.~]*$/\"`,\n function (value, context: TestContext<{ regex?: string }>) {\n return (\n value === '' ||\n (context.options.context?.regex\n ? new RegExp(context.options?.context.regex).test(value as string)\n : /^[A-Za-z0-9-_.~]*$/.test(value as string))\n );\n }\n ),\n});\n\nconst validateUIDField = (contentTypeUID: any, field: any) => {\n const model = strapi.contentTypes[contentTypeUID];\n\n if (!model) {\n throw new ValidationError('ContentType not found');\n }\n\n if (\n !_.has(model, ['attributes', field]) ||\n _.get(model, ['attributes', field, 'type']) !== 'uid'\n ) {\n throw new ValidationError(`${field} must be a valid \\`uid\\` attribute`);\n }\n};\n\nconst validatePagination = ({ page, pageSize }: any) => {\n const pageNumber = parseInt(page, 10);\n const pageSizeNumber = parseInt(pageSize, 10);\n\n if (Number.isNaN(pageNumber) || pageNumber < 1) {\n throw new PaginationError('invalid pageNumber param');\n }\n if (Number.isNaN(pageSizeNumber) || pageSizeNumber < 1) {\n throw new PaginationError('invalid pageSize param');\n }\n};\n\nconst validateKind = validateYupSchema(kindSchema);\nconst validateBulkActionInput = validateYupSchema(bulkActionInputSchema);\nconst validateGenerateUIDInput = validateYupSchema(generateUIDInputSchema);\nconst validateCheckUIDAvailabilityInput = (body: {\n contentTypeUID: UID.ContentType;\n field: string;\n value: string;\n}) => {\n const options: ValidateOptions<{ regex?: string }> = {};\n\n const contentType =\n body.contentTypeUID in strapi.contentTypes ? strapi.contentTypes[body.contentTypeUID] : null;\n\n if (\n contentType?.attributes[body.field] &&\n `regex` in contentType.attributes[body.field] &&\n (contentType.attributes[body.field] as Schema.Attribute.UID).regex\n ) {\n options.context = {\n regex: (contentType?.attributes[body.field] as Schema.Attribute.UID).regex,\n };\n }\n\n const validator = validateYupSchema(checkUIDAvailabilityInputSchema, options);\n\n return validator(body);\n};\n\nexport {\n createModelConfigurationSchema,\n validateUIDField,\n validatePagination,\n validateKind,\n validateBulkActionInput,\n validateGenerateUIDInput,\n validateCheckUIDAvailabilityInput,\n};\n"],"names":["PaginationError","ValidationError","errors","TYPES","kindSchema","yup","string","oneOf","nullable","bulkActionInputSchema","object","documentIds","array","of","strapiID","min","required","generateUIDInputSchema","contentTypeUID","field","data","checkUIDAvailabilityInputSchema","value","test","context","options","regex","RegExp","validateUIDField","model","strapi","contentTypes","_","has","get","validateKind","validateYupSchema","validateBulkActionInput","validateGenerateUIDInput","validateCheckUIDAvailabilityInput","body","contentType","attributes","validator"],"mappings":"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"}
|
|
@@ -23,7 +23,9 @@ const generateUIDInputSchema = yup.object({
|
|
|
23
23
|
const checkUIDAvailabilityInputSchema = yup.object({
|
|
24
24
|
contentTypeUID: yup.string().required(),
|
|
25
25
|
field: yup.string().required(),
|
|
26
|
-
value: yup.string().
|
|
26
|
+
value: yup.string().required().test('isValueMatchingRegex', `\${path} must match the custom regex or the default one "/^[A-Za-z0-9-_.~]*$/"`, function(value, context) {
|
|
27
|
+
return value === '' || (context.options.context?.regex ? new RegExp(context.options?.context.regex).test(value) : /^[A-Za-z0-9-_.~]*$/.test(value));
|
|
28
|
+
})
|
|
27
29
|
});
|
|
28
30
|
const validateUIDField = (contentTypeUID, field)=>{
|
|
29
31
|
const model = strapi.contentTypes[contentTypeUID];
|
|
@@ -44,7 +46,17 @@ const validateUIDField = (contentTypeUID, field)=>{
|
|
|
44
46
|
const validateKind = validateYupSchema(kindSchema);
|
|
45
47
|
const validateBulkActionInput = validateYupSchema(bulkActionInputSchema);
|
|
46
48
|
const validateGenerateUIDInput = validateYupSchema(generateUIDInputSchema);
|
|
47
|
-
const validateCheckUIDAvailabilityInput =
|
|
49
|
+
const validateCheckUIDAvailabilityInput = (body)=>{
|
|
50
|
+
const options = {};
|
|
51
|
+
const contentType = body.contentTypeUID in strapi.contentTypes ? strapi.contentTypes[body.contentTypeUID] : null;
|
|
52
|
+
if (contentType?.attributes[body.field] && `regex` in contentType.attributes[body.field] && contentType.attributes[body.field].regex) {
|
|
53
|
+
options.context = {
|
|
54
|
+
regex: (contentType?.attributes[body.field]).regex
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
const validator = validateYupSchema(checkUIDAvailabilityInputSchema, options);
|
|
58
|
+
return validator(body);
|
|
59
|
+
};
|
|
48
60
|
|
|
49
61
|
export { validateBulkActionInput, validateCheckUIDAvailabilityInput, validateGenerateUIDInput, validateKind, validateUIDField };
|
|
50
62
|
//# sourceMappingURL=index.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../../../server/src/controllers/validation/index.ts"],"sourcesContent":["import _ from 'lodash';\nimport { yup, validateYupSchema, errors } from '@strapi/utils';\nimport createModelConfigurationSchema from './model-configuration';\n\nconst { PaginationError, ValidationError } = errors;\nconst TYPES = ['singleType', 'collectionType'];\n\n/**\n * Validates type kind\n */\nconst kindSchema = yup.string().oneOf(TYPES).nullable();\n\nconst bulkActionInputSchema = yup\n .object({\n documentIds: yup.array().of(yup.strapiID()).min(1).required(),\n })\n .required();\n\nconst generateUIDInputSchema = yup.object({\n contentTypeUID: yup.string().required(),\n field: yup.string().required(),\n data: yup.object().required(),\n});\n\nconst checkUIDAvailabilityInputSchema = yup.object({\n contentTypeUID: yup.string().required(),\n field: yup.string().required(),\n value: yup\n .string()\n .
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../../../server/src/controllers/validation/index.ts"],"sourcesContent":["import _ from 'lodash';\nimport { Schema, UID } from '@strapi/types';\nimport { yup, validateYupSchema, errors } from '@strapi/utils';\nimport { ValidateOptions } from 'yup/lib/types';\nimport { TestContext } from 'yup';\nimport createModelConfigurationSchema from './model-configuration';\n\nconst { PaginationError, ValidationError } = errors;\nconst TYPES = ['singleType', 'collectionType'];\n\n/**\n * Validates type kind\n */\nconst kindSchema = yup.string().oneOf(TYPES).nullable();\n\nconst bulkActionInputSchema = yup\n .object({\n documentIds: yup.array().of(yup.strapiID()).min(1).required(),\n })\n .required();\n\nconst generateUIDInputSchema = yup.object({\n contentTypeUID: yup.string().required(),\n field: yup.string().required(),\n data: yup.object().required(),\n});\n\nconst checkUIDAvailabilityInputSchema = yup.object({\n contentTypeUID: yup.string().required(),\n field: yup.string().required(),\n value: yup\n .string()\n .required()\n .test(\n 'isValueMatchingRegex',\n `\\${path} must match the custom regex or the default one \"/^[A-Za-z0-9-_.~]*$/\"`,\n function (value, context: TestContext<{ regex?: string }>) {\n return (\n value === '' ||\n (context.options.context?.regex\n ? new RegExp(context.options?.context.regex).test(value as string)\n : /^[A-Za-z0-9-_.~]*$/.test(value as string))\n );\n }\n ),\n});\n\nconst validateUIDField = (contentTypeUID: any, field: any) => {\n const model = strapi.contentTypes[contentTypeUID];\n\n if (!model) {\n throw new ValidationError('ContentType not found');\n }\n\n if (\n !_.has(model, ['attributes', field]) ||\n _.get(model, ['attributes', field, 'type']) !== 'uid'\n ) {\n throw new ValidationError(`${field} must be a valid \\`uid\\` attribute`);\n }\n};\n\nconst validatePagination = ({ page, pageSize }: any) => {\n const pageNumber = parseInt(page, 10);\n const pageSizeNumber = parseInt(pageSize, 10);\n\n if (Number.isNaN(pageNumber) || pageNumber < 1) {\n throw new PaginationError('invalid pageNumber param');\n }\n if (Number.isNaN(pageSizeNumber) || pageSizeNumber < 1) {\n throw new PaginationError('invalid pageSize param');\n }\n};\n\nconst validateKind = validateYupSchema(kindSchema);\nconst validateBulkActionInput = validateYupSchema(bulkActionInputSchema);\nconst validateGenerateUIDInput = validateYupSchema(generateUIDInputSchema);\nconst validateCheckUIDAvailabilityInput = (body: {\n contentTypeUID: UID.ContentType;\n field: string;\n value: string;\n}) => {\n const options: ValidateOptions<{ regex?: string }> = {};\n\n const contentType =\n body.contentTypeUID in strapi.contentTypes ? strapi.contentTypes[body.contentTypeUID] : null;\n\n if (\n contentType?.attributes[body.field] &&\n `regex` in contentType.attributes[body.field] &&\n (contentType.attributes[body.field] as Schema.Attribute.UID).regex\n ) {\n options.context = {\n regex: (contentType?.attributes[body.field] as Schema.Attribute.UID).regex,\n };\n }\n\n const validator = validateYupSchema(checkUIDAvailabilityInputSchema, options);\n\n return validator(body);\n};\n\nexport {\n createModelConfigurationSchema,\n validateUIDField,\n validatePagination,\n validateKind,\n validateBulkActionInput,\n validateGenerateUIDInput,\n validateCheckUIDAvailabilityInput,\n};\n"],"names":["PaginationError","ValidationError","errors","TYPES","kindSchema","yup","string","oneOf","nullable","bulkActionInputSchema","object","documentIds","array","of","strapiID","min","required","generateUIDInputSchema","contentTypeUID","field","data","checkUIDAvailabilityInputSchema","value","test","context","options","regex","RegExp","validateUIDField","model","strapi","contentTypes","_","has","get","validateKind","validateYupSchema","validateBulkActionInput","validateGenerateUIDInput","validateCheckUIDAvailabilityInput","body","contentType","attributes","validator"],"mappings":"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"}
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
var strapiUtils = require('@strapi/utils');
|
|
4
4
|
var fp = require('lodash/fp');
|
|
5
|
-
var nodeSchedule = require('node-schedule');
|
|
6
5
|
var utils$1 = require('../utils.js');
|
|
7
6
|
var constants = require('../constants.js');
|
|
8
7
|
var utils = require('./utils.js');
|
|
@@ -58,18 +57,20 @@ var utils = require('./utils.js');
|
|
|
58
57
|
};
|
|
59
58
|
const createLifecyclesService = ({ strapi: strapi1 })=>{
|
|
60
59
|
const state = {
|
|
61
|
-
deleteExpiredJob: null,
|
|
62
60
|
isInitialized: false
|
|
63
61
|
};
|
|
64
62
|
const serviceUtils = utils.createServiceUtils({
|
|
65
63
|
strapi: strapi1
|
|
66
64
|
});
|
|
65
|
+
const { persistTablesWithPrefix } = strapi1.service('admin::persist-tables');
|
|
67
66
|
return {
|
|
68
67
|
async bootstrap () {
|
|
69
68
|
// Prevent initializing the service twice
|
|
70
69
|
if (state.isInitialized) {
|
|
71
70
|
return;
|
|
72
71
|
}
|
|
72
|
+
// Avoid data loss in case users temporarily don't have a license
|
|
73
|
+
await persistTablesWithPrefix('strapi_history_versions');
|
|
73
74
|
strapi1.documents.use(async (context, next)=>{
|
|
74
75
|
const result = await next();
|
|
75
76
|
if (!shouldCreateHistoryVersion(context)) {
|
|
@@ -124,27 +125,30 @@ const createLifecyclesService = ({ strapi: strapi1 })=>{
|
|
|
124
125
|
return result;
|
|
125
126
|
});
|
|
126
127
|
// Schedule a job to delete expired history versions every day at midnight
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
128
|
+
strapi1.cron.add({
|
|
129
|
+
deleteHistoryDaily: {
|
|
130
|
+
async task () {
|
|
131
|
+
const retentionDaysInMilliseconds = serviceUtils.getRetentionDays() * 24 * 60 * 60 * 1000;
|
|
132
|
+
const expirationDate = new Date(Date.now() - retentionDaysInMilliseconds);
|
|
133
|
+
strapi1.db.query(constants.HISTORY_VERSION_UID).deleteMany({
|
|
134
|
+
where: {
|
|
135
|
+
created_at: {
|
|
136
|
+
$lt: expirationDate
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}).catch((error)=>{
|
|
140
|
+
if (error instanceof Error) {
|
|
141
|
+
strapi1.log.error('Error deleting expired history versions', error.message);
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
},
|
|
145
|
+
options: '0 0 * * *'
|
|
146
|
+
}
|
|
141
147
|
});
|
|
142
148
|
state.isInitialized = true;
|
|
143
149
|
},
|
|
144
150
|
async destroy () {
|
|
145
|
-
|
|
146
|
-
state.deleteExpiredJob.cancel();
|
|
147
|
-
}
|
|
151
|
+
strapi1.cron.remove('deleteHistoryDaily');
|
|
148
152
|
}
|
|
149
153
|
};
|
|
150
154
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lifecycles.js","sources":["../../../../server/src/history/services/lifecycles.ts"],"sourcesContent":["import type { Core, Modules, UID } from '@strapi/types';\nimport { contentTypes } from '@strapi/utils';\n\nimport { omit, castArray } from 'lodash/fp';\n\nimport { scheduleJob } from 'node-schedule';\n\nimport { getService } from '../utils';\nimport { FIELDS_TO_IGNORE, HISTORY_VERSION_UID } from '../constants';\n\nimport type { CreateHistoryVersion } from '../../../../shared/contracts/history-versions';\nimport { createServiceUtils } from './utils';\n\n/**\n * Filters out actions that should not create a history version.\n */\nconst shouldCreateHistoryVersion = (\n context: Modules.Documents.Middleware.Context\n): context is Modules.Documents.Middleware.Context & {\n action: 'create' | 'update' | 'clone' | 'publish' | 'unpublish' | 'discardDraft';\n contentType: UID.CollectionType;\n} => {\n // Ignore requests that are not related to the content manager\n if (!strapi.requestContext.get()?.request.url.startsWith('/content-manager')) {\n return false;\n }\n\n // NOTE: cannot do type narrowing with array includes\n if (\n context.action !== 'create' &&\n context.action !== 'update' &&\n context.action !== 'clone' &&\n context.action !== 'publish' &&\n context.action !== 'unpublish' &&\n context.action !== 'discardDraft'\n ) {\n return false;\n }\n\n /**\n * When a document is published, the draft version of the document is also updated.\n * It creates confusion for users because they see two history versions each publish action.\n * To avoid this, we silence the update action during a publish request,\n * so that they only see the published version of the document in the history.\n */\n if (\n context.action === 'update' &&\n strapi.requestContext.get()?.request.url.endsWith('/actions/publish')\n ) {\n return false;\n }\n\n // Ignore content types not created by the user\n if (!context.contentType.uid.startsWith('api::')) {\n return false;\n }\n\n return true;\n};\n\n/**\n * Returns the content type schema (and its components schemas).\n * Used to determine if changes were made in the content type builder since a history version was created.\n * And therefore which fields can be restored and which cannot.\n */\nconst getSchemas = (uid: UID.CollectionType) => {\n const attributesSchema = strapi.getModel(uid).attributes;\n\n // TODO: Handle nested components\n const componentsSchemas = Object.keys(attributesSchema).reduce(\n (currentComponentSchemas, key) => {\n const fieldSchema = attributesSchema[key];\n\n if (fieldSchema.type === 'component') {\n const componentSchema = strapi.getModel(fieldSchema.component).attributes;\n return {\n ...currentComponentSchemas,\n [fieldSchema.component]: componentSchema,\n };\n }\n\n // Ignore anything that's not a component\n return currentComponentSchemas;\n },\n {} as CreateHistoryVersion['componentsSchemas']\n );\n\n return {\n schema: omit(FIELDS_TO_IGNORE, attributesSchema) as CreateHistoryVersion['schema'],\n componentsSchemas,\n };\n};\n\nconst createLifecyclesService = ({ strapi }: { strapi: Core.Strapi }) => {\n const state: {\n deleteExpiredJob: ReturnType<typeof scheduleJob> | null;\n isInitialized: boolean;\n } = {\n deleteExpiredJob: null,\n isInitialized: false,\n };\n\n const serviceUtils = createServiceUtils({ strapi });\n\n return {\n async bootstrap() {\n // Prevent initializing the service twice\n if (state.isInitialized) {\n return;\n }\n\n strapi.documents.use(async (context, next) => {\n const result = (await next()) as any;\n\n if (!shouldCreateHistoryVersion(context)) {\n return result;\n }\n\n // On create/clone actions, the documentId is not available before creating the action is executed\n const documentId =\n context.action === 'create' || context.action === 'clone'\n ? result.documentId\n : context.params.documentId;\n\n // Apply default locale if not available in the request\n const defaultLocale = await serviceUtils.getDefaultLocale();\n const locales = castArray(context.params?.locale || defaultLocale);\n if (!locales.length) {\n return result;\n }\n\n // All schemas related to the content type\n const uid = context.contentType.uid;\n const schemas = getSchemas(uid);\n const model = strapi.getModel(uid);\n\n const isLocalizedContentType = serviceUtils.isLocalizedContentType(model);\n\n // Find all affected entries\n const localeEntries = await strapi.db.query(uid).findMany({\n where: {\n documentId,\n ...(isLocalizedContentType ? { locale: { $in: locales } } : {}),\n ...(contentTypes.hasDraftAndPublish(strapi.contentTypes[uid])\n ? { publishedAt: null }\n : {}),\n },\n populate: serviceUtils.getDeepPopulate(uid, true /* use database syntax */),\n });\n\n await strapi.db.transaction(async ({ onCommit }) => {\n // .createVersion() is executed asynchronously,\n // onCommit prevents creating a history version\n // when the transaction has already been committed\n onCommit(async () => {\n for (const entry of localeEntries) {\n const status = await serviceUtils.getVersionStatus(uid, entry);\n\n await getService(strapi, 'history').createVersion({\n contentType: uid,\n data: omit(FIELDS_TO_IGNORE, entry) as Modules.Documents.AnyDocument,\n relatedDocumentId: documentId,\n locale: entry.locale,\n status,\n ...schemas,\n });\n }\n });\n });\n\n return result;\n });\n\n // Schedule a job to delete expired history versions every day at midnight\n state.deleteExpiredJob = scheduleJob('historyDaily', '0 0 * * *', () => {\n const retentionDaysInMilliseconds = serviceUtils.getRetentionDays() * 24 * 60 * 60 * 1000;\n const expirationDate = new Date(Date.now() - retentionDaysInMilliseconds);\n\n strapi.db\n .query(HISTORY_VERSION_UID)\n .deleteMany({\n where: {\n created_at: {\n $lt: expirationDate,\n },\n },\n })\n .catch((error) => {\n if (error instanceof Error) {\n strapi.log.error('Error deleting expired history versions', error.message);\n }\n });\n });\n\n state.isInitialized = true;\n },\n\n async destroy() {\n if (state.deleteExpiredJob) {\n state.deleteExpiredJob.cancel();\n }\n },\n };\n};\n\nexport { createLifecyclesService };\n"],"names":["shouldCreateHistoryVersion","context","strapi","requestContext","get","request","url","startsWith","action","endsWith","contentType","uid","getSchemas","attributesSchema","getModel","attributes","componentsSchemas","Object","keys","reduce","currentComponentSchemas","key","fieldSchema","type","componentSchema","component","schema","omit","FIELDS_TO_IGNORE","createLifecyclesService","state","deleteExpiredJob","isInitialized","serviceUtils","createServiceUtils","bootstrap","documents","use","next","result","documentId","params","defaultLocale","getDefaultLocale","locales","castArray","locale","length","schemas","model","isLocalizedContentType","localeEntries","db","query","findMany","where","$in","contentTypes","hasDraftAndPublish","publishedAt","populate","getDeepPopulate","transaction","onCommit","entry","status","getVersionStatus","getService","createVersion","data","relatedDocumentId","scheduleJob","retentionDaysInMilliseconds","getRetentionDays","expirationDate","Date","now","HISTORY_VERSION_UID","deleteMany","created_at","$lt","catch","error","Error","log","message","destroy","cancel"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"lifecycles.js","sources":["../../../../server/src/history/services/lifecycles.ts"],"sourcesContent":["import type { Core, Modules, UID } from '@strapi/types';\nimport { contentTypes } from '@strapi/utils';\n\nimport { omit, castArray } from 'lodash/fp';\n\nimport { getService } from '../utils';\nimport { FIELDS_TO_IGNORE, HISTORY_VERSION_UID } from '../constants';\n\nimport type { CreateHistoryVersion } from '../../../../shared/contracts/history-versions';\nimport { createServiceUtils } from './utils';\n\n/**\n * Filters out actions that should not create a history version.\n */\nconst shouldCreateHistoryVersion = (\n context: Modules.Documents.Middleware.Context\n): context is Modules.Documents.Middleware.Context & {\n action: 'create' | 'update' | 'clone' | 'publish' | 'unpublish' | 'discardDraft';\n contentType: UID.CollectionType;\n} => {\n // Ignore requests that are not related to the content manager\n if (!strapi.requestContext.get()?.request.url.startsWith('/content-manager')) {\n return false;\n }\n\n // NOTE: cannot do type narrowing with array includes\n if (\n context.action !== 'create' &&\n context.action !== 'update' &&\n context.action !== 'clone' &&\n context.action !== 'publish' &&\n context.action !== 'unpublish' &&\n context.action !== 'discardDraft'\n ) {\n return false;\n }\n\n /**\n * When a document is published, the draft version of the document is also updated.\n * It creates confusion for users because they see two history versions each publish action.\n * To avoid this, we silence the update action during a publish request,\n * so that they only see the published version of the document in the history.\n */\n if (\n context.action === 'update' &&\n strapi.requestContext.get()?.request.url.endsWith('/actions/publish')\n ) {\n return false;\n }\n\n // Ignore content types not created by the user\n if (!context.contentType.uid.startsWith('api::')) {\n return false;\n }\n\n return true;\n};\n\n/**\n * Returns the content type schema (and its components schemas).\n * Used to determine if changes were made in the content type builder since a history version was created.\n * And therefore which fields can be restored and which cannot.\n */\nconst getSchemas = (uid: UID.CollectionType) => {\n const attributesSchema = strapi.getModel(uid).attributes;\n\n // TODO: Handle nested components\n const componentsSchemas = Object.keys(attributesSchema).reduce(\n (currentComponentSchemas, key) => {\n const fieldSchema = attributesSchema[key];\n\n if (fieldSchema.type === 'component') {\n const componentSchema = strapi.getModel(fieldSchema.component).attributes;\n return {\n ...currentComponentSchemas,\n [fieldSchema.component]: componentSchema,\n };\n }\n\n // Ignore anything that's not a component\n return currentComponentSchemas;\n },\n {} as CreateHistoryVersion['componentsSchemas']\n );\n\n return {\n schema: omit(FIELDS_TO_IGNORE, attributesSchema) as CreateHistoryVersion['schema'],\n componentsSchemas,\n };\n};\n\nconst createLifecyclesService = ({ strapi }: { strapi: Core.Strapi }) => {\n const state: {\n isInitialized: boolean;\n } = {\n isInitialized: false,\n };\n\n const serviceUtils = createServiceUtils({ strapi });\n const { persistTablesWithPrefix } = strapi.service('admin::persist-tables');\n\n return {\n async bootstrap() {\n // Prevent initializing the service twice\n if (state.isInitialized) {\n return;\n }\n\n // Avoid data loss in case users temporarily don't have a license\n await persistTablesWithPrefix('strapi_history_versions');\n\n strapi.documents.use(async (context, next) => {\n const result = (await next()) as any;\n\n if (!shouldCreateHistoryVersion(context)) {\n return result;\n }\n\n // On create/clone actions, the documentId is not available before creating the action is executed\n const documentId =\n context.action === 'create' || context.action === 'clone'\n ? result.documentId\n : context.params.documentId;\n\n // Apply default locale if not available in the request\n const defaultLocale = await serviceUtils.getDefaultLocale();\n const locales = castArray(context.params?.locale || defaultLocale);\n if (!locales.length) {\n return result;\n }\n\n // All schemas related to the content type\n const uid = context.contentType.uid;\n const schemas = getSchemas(uid);\n const model = strapi.getModel(uid);\n\n const isLocalizedContentType = serviceUtils.isLocalizedContentType(model);\n\n // Find all affected entries\n const localeEntries = await strapi.db.query(uid).findMany({\n where: {\n documentId,\n ...(isLocalizedContentType ? { locale: { $in: locales } } : {}),\n ...(contentTypes.hasDraftAndPublish(strapi.contentTypes[uid])\n ? { publishedAt: null }\n : {}),\n },\n populate: serviceUtils.getDeepPopulate(uid, true /* use database syntax */),\n });\n\n await strapi.db.transaction(async ({ onCommit }) => {\n // .createVersion() is executed asynchronously,\n // onCommit prevents creating a history version\n // when the transaction has already been committed\n onCommit(async () => {\n for (const entry of localeEntries) {\n const status = await serviceUtils.getVersionStatus(uid, entry);\n\n await getService(strapi, 'history').createVersion({\n contentType: uid,\n data: omit(FIELDS_TO_IGNORE, entry) as Modules.Documents.AnyDocument,\n relatedDocumentId: documentId,\n locale: entry.locale,\n status,\n ...schemas,\n });\n }\n });\n });\n\n return result;\n });\n\n // Schedule a job to delete expired history versions every day at midnight\n strapi.cron.add({\n deleteHistoryDaily: {\n async task() {\n const retentionDaysInMilliseconds =\n serviceUtils.getRetentionDays() * 24 * 60 * 60 * 1000;\n const expirationDate = new Date(Date.now() - retentionDaysInMilliseconds);\n\n strapi.db\n .query(HISTORY_VERSION_UID)\n .deleteMany({\n where: {\n created_at: {\n $lt: expirationDate,\n },\n },\n })\n .catch((error) => {\n if (error instanceof Error) {\n strapi.log.error('Error deleting expired history versions', error.message);\n }\n });\n },\n options: '0 0 * * *',\n },\n });\n\n state.isInitialized = true;\n },\n\n async destroy() {\n strapi.cron.remove('deleteHistoryDaily');\n },\n };\n};\n\nexport { createLifecyclesService };\n"],"names":["shouldCreateHistoryVersion","context","strapi","requestContext","get","request","url","startsWith","action","endsWith","contentType","uid","getSchemas","attributesSchema","getModel","attributes","componentsSchemas","Object","keys","reduce","currentComponentSchemas","key","fieldSchema","type","componentSchema","component","schema","omit","FIELDS_TO_IGNORE","createLifecyclesService","state","isInitialized","serviceUtils","createServiceUtils","persistTablesWithPrefix","service","bootstrap","documents","use","next","result","documentId","params","defaultLocale","getDefaultLocale","locales","castArray","locale","length","schemas","model","isLocalizedContentType","localeEntries","db","query","findMany","where","$in","contentTypes","hasDraftAndPublish","publishedAt","populate","getDeepPopulate","transaction","onCommit","entry","status","getVersionStatus","getService","createVersion","data","relatedDocumentId","cron","add","deleteHistoryDaily","task","retentionDaysInMilliseconds","getRetentionDays","expirationDate","Date","now","HISTORY_VERSION_UID","deleteMany","created_at","$lt","catch","error","Error","log","message","options","destroy","remove"],"mappings":"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"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { contentTypes } from '@strapi/utils';
|
|
2
2
|
import { castArray, omit } from 'lodash/fp';
|
|
3
|
-
import { scheduleJob } from 'node-schedule';
|
|
4
3
|
import { getService } from '../utils.mjs';
|
|
5
4
|
import { FIELDS_TO_IGNORE, HISTORY_VERSION_UID } from '../constants.mjs';
|
|
6
5
|
import { createServiceUtils } from './utils.mjs';
|
|
@@ -56,18 +55,20 @@ import { createServiceUtils } from './utils.mjs';
|
|
|
56
55
|
};
|
|
57
56
|
const createLifecyclesService = ({ strapi: strapi1 })=>{
|
|
58
57
|
const state = {
|
|
59
|
-
deleteExpiredJob: null,
|
|
60
58
|
isInitialized: false
|
|
61
59
|
};
|
|
62
60
|
const serviceUtils = createServiceUtils({
|
|
63
61
|
strapi: strapi1
|
|
64
62
|
});
|
|
63
|
+
const { persistTablesWithPrefix } = strapi1.service('admin::persist-tables');
|
|
65
64
|
return {
|
|
66
65
|
async bootstrap () {
|
|
67
66
|
// Prevent initializing the service twice
|
|
68
67
|
if (state.isInitialized) {
|
|
69
68
|
return;
|
|
70
69
|
}
|
|
70
|
+
// Avoid data loss in case users temporarily don't have a license
|
|
71
|
+
await persistTablesWithPrefix('strapi_history_versions');
|
|
71
72
|
strapi1.documents.use(async (context, next)=>{
|
|
72
73
|
const result = await next();
|
|
73
74
|
if (!shouldCreateHistoryVersion(context)) {
|
|
@@ -122,27 +123,30 @@ const createLifecyclesService = ({ strapi: strapi1 })=>{
|
|
|
122
123
|
return result;
|
|
123
124
|
});
|
|
124
125
|
// Schedule a job to delete expired history versions every day at midnight
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
126
|
+
strapi1.cron.add({
|
|
127
|
+
deleteHistoryDaily: {
|
|
128
|
+
async task () {
|
|
129
|
+
const retentionDaysInMilliseconds = serviceUtils.getRetentionDays() * 24 * 60 * 60 * 1000;
|
|
130
|
+
const expirationDate = new Date(Date.now() - retentionDaysInMilliseconds);
|
|
131
|
+
strapi1.db.query(HISTORY_VERSION_UID).deleteMany({
|
|
132
|
+
where: {
|
|
133
|
+
created_at: {
|
|
134
|
+
$lt: expirationDate
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}).catch((error)=>{
|
|
138
|
+
if (error instanceof Error) {
|
|
139
|
+
strapi1.log.error('Error deleting expired history versions', error.message);
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
},
|
|
143
|
+
options: '0 0 * * *'
|
|
144
|
+
}
|
|
139
145
|
});
|
|
140
146
|
state.isInitialized = true;
|
|
141
147
|
},
|
|
142
148
|
async destroy () {
|
|
143
|
-
|
|
144
|
-
state.deleteExpiredJob.cancel();
|
|
145
|
-
}
|
|
149
|
+
strapi1.cron.remove('deleteHistoryDaily');
|
|
146
150
|
}
|
|
147
151
|
};
|
|
148
152
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lifecycles.mjs","sources":["../../../../server/src/history/services/lifecycles.ts"],"sourcesContent":["import type { Core, Modules, UID } from '@strapi/types';\nimport { contentTypes } from '@strapi/utils';\n\nimport { omit, castArray } from 'lodash/fp';\n\nimport { scheduleJob } from 'node-schedule';\n\nimport { getService } from '../utils';\nimport { FIELDS_TO_IGNORE, HISTORY_VERSION_UID } from '../constants';\n\nimport type { CreateHistoryVersion } from '../../../../shared/contracts/history-versions';\nimport { createServiceUtils } from './utils';\n\n/**\n * Filters out actions that should not create a history version.\n */\nconst shouldCreateHistoryVersion = (\n context: Modules.Documents.Middleware.Context\n): context is Modules.Documents.Middleware.Context & {\n action: 'create' | 'update' | 'clone' | 'publish' | 'unpublish' | 'discardDraft';\n contentType: UID.CollectionType;\n} => {\n // Ignore requests that are not related to the content manager\n if (!strapi.requestContext.get()?.request.url.startsWith('/content-manager')) {\n return false;\n }\n\n // NOTE: cannot do type narrowing with array includes\n if (\n context.action !== 'create' &&\n context.action !== 'update' &&\n context.action !== 'clone' &&\n context.action !== 'publish' &&\n context.action !== 'unpublish' &&\n context.action !== 'discardDraft'\n ) {\n return false;\n }\n\n /**\n * When a document is published, the draft version of the document is also updated.\n * It creates confusion for users because they see two history versions each publish action.\n * To avoid this, we silence the update action during a publish request,\n * so that they only see the published version of the document in the history.\n */\n if (\n context.action === 'update' &&\n strapi.requestContext.get()?.request.url.endsWith('/actions/publish')\n ) {\n return false;\n }\n\n // Ignore content types not created by the user\n if (!context.contentType.uid.startsWith('api::')) {\n return false;\n }\n\n return true;\n};\n\n/**\n * Returns the content type schema (and its components schemas).\n * Used to determine if changes were made in the content type builder since a history version was created.\n * And therefore which fields can be restored and which cannot.\n */\nconst getSchemas = (uid: UID.CollectionType) => {\n const attributesSchema = strapi.getModel(uid).attributes;\n\n // TODO: Handle nested components\n const componentsSchemas = Object.keys(attributesSchema).reduce(\n (currentComponentSchemas, key) => {\n const fieldSchema = attributesSchema[key];\n\n if (fieldSchema.type === 'component') {\n const componentSchema = strapi.getModel(fieldSchema.component).attributes;\n return {\n ...currentComponentSchemas,\n [fieldSchema.component]: componentSchema,\n };\n }\n\n // Ignore anything that's not a component\n return currentComponentSchemas;\n },\n {} as CreateHistoryVersion['componentsSchemas']\n );\n\n return {\n schema: omit(FIELDS_TO_IGNORE, attributesSchema) as CreateHistoryVersion['schema'],\n componentsSchemas,\n };\n};\n\nconst createLifecyclesService = ({ strapi }: { strapi: Core.Strapi }) => {\n const state: {\n deleteExpiredJob: ReturnType<typeof scheduleJob> | null;\n isInitialized: boolean;\n } = {\n deleteExpiredJob: null,\n isInitialized: false,\n };\n\n const serviceUtils = createServiceUtils({ strapi });\n\n return {\n async bootstrap() {\n // Prevent initializing the service twice\n if (state.isInitialized) {\n return;\n }\n\n strapi.documents.use(async (context, next) => {\n const result = (await next()) as any;\n\n if (!shouldCreateHistoryVersion(context)) {\n return result;\n }\n\n // On create/clone actions, the documentId is not available before creating the action is executed\n const documentId =\n context.action === 'create' || context.action === 'clone'\n ? result.documentId\n : context.params.documentId;\n\n // Apply default locale if not available in the request\n const defaultLocale = await serviceUtils.getDefaultLocale();\n const locales = castArray(context.params?.locale || defaultLocale);\n if (!locales.length) {\n return result;\n }\n\n // All schemas related to the content type\n const uid = context.contentType.uid;\n const schemas = getSchemas(uid);\n const model = strapi.getModel(uid);\n\n const isLocalizedContentType = serviceUtils.isLocalizedContentType(model);\n\n // Find all affected entries\n const localeEntries = await strapi.db.query(uid).findMany({\n where: {\n documentId,\n ...(isLocalizedContentType ? { locale: { $in: locales } } : {}),\n ...(contentTypes.hasDraftAndPublish(strapi.contentTypes[uid])\n ? { publishedAt: null }\n : {}),\n },\n populate: serviceUtils.getDeepPopulate(uid, true /* use database syntax */),\n });\n\n await strapi.db.transaction(async ({ onCommit }) => {\n // .createVersion() is executed asynchronously,\n // onCommit prevents creating a history version\n // when the transaction has already been committed\n onCommit(async () => {\n for (const entry of localeEntries) {\n const status = await serviceUtils.getVersionStatus(uid, entry);\n\n await getService(strapi, 'history').createVersion({\n contentType: uid,\n data: omit(FIELDS_TO_IGNORE, entry) as Modules.Documents.AnyDocument,\n relatedDocumentId: documentId,\n locale: entry.locale,\n status,\n ...schemas,\n });\n }\n });\n });\n\n return result;\n });\n\n // Schedule a job to delete expired history versions every day at midnight\n state.deleteExpiredJob = scheduleJob('historyDaily', '0 0 * * *', () => {\n const retentionDaysInMilliseconds = serviceUtils.getRetentionDays() * 24 * 60 * 60 * 1000;\n const expirationDate = new Date(Date.now() - retentionDaysInMilliseconds);\n\n strapi.db\n .query(HISTORY_VERSION_UID)\n .deleteMany({\n where: {\n created_at: {\n $lt: expirationDate,\n },\n },\n })\n .catch((error) => {\n if (error instanceof Error) {\n strapi.log.error('Error deleting expired history versions', error.message);\n }\n });\n });\n\n state.isInitialized = true;\n },\n\n async destroy() {\n if (state.deleteExpiredJob) {\n state.deleteExpiredJob.cancel();\n }\n },\n };\n};\n\nexport { createLifecyclesService };\n"],"names":["shouldCreateHistoryVersion","context","strapi","requestContext","get","request","url","startsWith","action","endsWith","contentType","uid","getSchemas","attributesSchema","getModel","attributes","componentsSchemas","Object","keys","reduce","currentComponentSchemas","key","fieldSchema","type","componentSchema","component","schema","omit","FIELDS_TO_IGNORE","createLifecyclesService","state","deleteExpiredJob","isInitialized","serviceUtils","createServiceUtils","bootstrap","documents","use","next","result","documentId","params","defaultLocale","getDefaultLocale","locales","castArray","locale","length","schemas","model","isLocalizedContentType","localeEntries","db","query","findMany","where","$in","contentTypes","hasDraftAndPublish","publishedAt","populate","getDeepPopulate","transaction","onCommit","entry","status","getVersionStatus","getService","createVersion","data","relatedDocumentId","scheduleJob","retentionDaysInMilliseconds","getRetentionDays","expirationDate","Date","now","HISTORY_VERSION_UID","deleteMany","created_at","$lt","catch","error","Error","log","message","destroy","cancel"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"lifecycles.mjs","sources":["../../../../server/src/history/services/lifecycles.ts"],"sourcesContent":["import type { Core, Modules, UID } from '@strapi/types';\nimport { contentTypes } from '@strapi/utils';\n\nimport { omit, castArray } from 'lodash/fp';\n\nimport { getService } from '../utils';\nimport { FIELDS_TO_IGNORE, HISTORY_VERSION_UID } from '../constants';\n\nimport type { CreateHistoryVersion } from '../../../../shared/contracts/history-versions';\nimport { createServiceUtils } from './utils';\n\n/**\n * Filters out actions that should not create a history version.\n */\nconst shouldCreateHistoryVersion = (\n context: Modules.Documents.Middleware.Context\n): context is Modules.Documents.Middleware.Context & {\n action: 'create' | 'update' | 'clone' | 'publish' | 'unpublish' | 'discardDraft';\n contentType: UID.CollectionType;\n} => {\n // Ignore requests that are not related to the content manager\n if (!strapi.requestContext.get()?.request.url.startsWith('/content-manager')) {\n return false;\n }\n\n // NOTE: cannot do type narrowing with array includes\n if (\n context.action !== 'create' &&\n context.action !== 'update' &&\n context.action !== 'clone' &&\n context.action !== 'publish' &&\n context.action !== 'unpublish' &&\n context.action !== 'discardDraft'\n ) {\n return false;\n }\n\n /**\n * When a document is published, the draft version of the document is also updated.\n * It creates confusion for users because they see two history versions each publish action.\n * To avoid this, we silence the update action during a publish request,\n * so that they only see the published version of the document in the history.\n */\n if (\n context.action === 'update' &&\n strapi.requestContext.get()?.request.url.endsWith('/actions/publish')\n ) {\n return false;\n }\n\n // Ignore content types not created by the user\n if (!context.contentType.uid.startsWith('api::')) {\n return false;\n }\n\n return true;\n};\n\n/**\n * Returns the content type schema (and its components schemas).\n * Used to determine if changes were made in the content type builder since a history version was created.\n * And therefore which fields can be restored and which cannot.\n */\nconst getSchemas = (uid: UID.CollectionType) => {\n const attributesSchema = strapi.getModel(uid).attributes;\n\n // TODO: Handle nested components\n const componentsSchemas = Object.keys(attributesSchema).reduce(\n (currentComponentSchemas, key) => {\n const fieldSchema = attributesSchema[key];\n\n if (fieldSchema.type === 'component') {\n const componentSchema = strapi.getModel(fieldSchema.component).attributes;\n return {\n ...currentComponentSchemas,\n [fieldSchema.component]: componentSchema,\n };\n }\n\n // Ignore anything that's not a component\n return currentComponentSchemas;\n },\n {} as CreateHistoryVersion['componentsSchemas']\n );\n\n return {\n schema: omit(FIELDS_TO_IGNORE, attributesSchema) as CreateHistoryVersion['schema'],\n componentsSchemas,\n };\n};\n\nconst createLifecyclesService = ({ strapi }: { strapi: Core.Strapi }) => {\n const state: {\n isInitialized: boolean;\n } = {\n isInitialized: false,\n };\n\n const serviceUtils = createServiceUtils({ strapi });\n const { persistTablesWithPrefix } = strapi.service('admin::persist-tables');\n\n return {\n async bootstrap() {\n // Prevent initializing the service twice\n if (state.isInitialized) {\n return;\n }\n\n // Avoid data loss in case users temporarily don't have a license\n await persistTablesWithPrefix('strapi_history_versions');\n\n strapi.documents.use(async (context, next) => {\n const result = (await next()) as any;\n\n if (!shouldCreateHistoryVersion(context)) {\n return result;\n }\n\n // On create/clone actions, the documentId is not available before creating the action is executed\n const documentId =\n context.action === 'create' || context.action === 'clone'\n ? result.documentId\n : context.params.documentId;\n\n // Apply default locale if not available in the request\n const defaultLocale = await serviceUtils.getDefaultLocale();\n const locales = castArray(context.params?.locale || defaultLocale);\n if (!locales.length) {\n return result;\n }\n\n // All schemas related to the content type\n const uid = context.contentType.uid;\n const schemas = getSchemas(uid);\n const model = strapi.getModel(uid);\n\n const isLocalizedContentType = serviceUtils.isLocalizedContentType(model);\n\n // Find all affected entries\n const localeEntries = await strapi.db.query(uid).findMany({\n where: {\n documentId,\n ...(isLocalizedContentType ? { locale: { $in: locales } } : {}),\n ...(contentTypes.hasDraftAndPublish(strapi.contentTypes[uid])\n ? { publishedAt: null }\n : {}),\n },\n populate: serviceUtils.getDeepPopulate(uid, true /* use database syntax */),\n });\n\n await strapi.db.transaction(async ({ onCommit }) => {\n // .createVersion() is executed asynchronously,\n // onCommit prevents creating a history version\n // when the transaction has already been committed\n onCommit(async () => {\n for (const entry of localeEntries) {\n const status = await serviceUtils.getVersionStatus(uid, entry);\n\n await getService(strapi, 'history').createVersion({\n contentType: uid,\n data: omit(FIELDS_TO_IGNORE, entry) as Modules.Documents.AnyDocument,\n relatedDocumentId: documentId,\n locale: entry.locale,\n status,\n ...schemas,\n });\n }\n });\n });\n\n return result;\n });\n\n // Schedule a job to delete expired history versions every day at midnight\n strapi.cron.add({\n deleteHistoryDaily: {\n async task() {\n const retentionDaysInMilliseconds =\n serviceUtils.getRetentionDays() * 24 * 60 * 60 * 1000;\n const expirationDate = new Date(Date.now() - retentionDaysInMilliseconds);\n\n strapi.db\n .query(HISTORY_VERSION_UID)\n .deleteMany({\n where: {\n created_at: {\n $lt: expirationDate,\n },\n },\n })\n .catch((error) => {\n if (error instanceof Error) {\n strapi.log.error('Error deleting expired history versions', error.message);\n }\n });\n },\n options: '0 0 * * *',\n },\n });\n\n state.isInitialized = true;\n },\n\n async destroy() {\n strapi.cron.remove('deleteHistoryDaily');\n },\n };\n};\n\nexport { createLifecyclesService };\n"],"names":["shouldCreateHistoryVersion","context","strapi","requestContext","get","request","url","startsWith","action","endsWith","contentType","uid","getSchemas","attributesSchema","getModel","attributes","componentsSchemas","Object","keys","reduce","currentComponentSchemas","key","fieldSchema","type","componentSchema","component","schema","omit","FIELDS_TO_IGNORE","createLifecyclesService","state","isInitialized","serviceUtils","createServiceUtils","persistTablesWithPrefix","service","bootstrap","documents","use","next","result","documentId","params","defaultLocale","getDefaultLocale","locales","castArray","locale","length","schemas","model","isLocalizedContentType","localeEntries","db","query","findMany","where","$in","contentTypes","hasDraftAndPublish","publishedAt","populate","getDeepPopulate","transaction","onCommit","entry","status","getVersionStatus","getService","createVersion","data","relatedDocumentId","cron","add","deleteHistoryDaily","task","retentionDaysInMilliseconds","getRetentionDays","expirationDate","Date","now","HISTORY_VERSION_UID","deleteMany","created_at","$lt","catch","error","Error","log","message","options","destroy","remove"],"mappings":";;;;;;AAWA;;IAGA,MAAMA,6BAA6B,CACjCC,OAAAA,GAAAA;;IAMA,IAAI,CAACC,OAAOC,cAAc,CAACC,GAAG,EAAIC,EAAAA,OAAAA,CAAQC,GAAIC,CAAAA,UAAAA,CAAW,kBAAqB,CAAA,EAAA;QAC5E,OAAO,KAAA;AACT;;IAGA,IACEN,OAAAA,CAAQO,MAAM,KAAK,QAAA,IACnBP,QAAQO,MAAM,KAAK,QACnBP,IAAAA,OAAAA,CAAQO,MAAM,KAAK,WACnBP,OAAQO,CAAAA,MAAM,KAAK,SAAA,IACnBP,OAAQO,CAAAA,MAAM,KAAK,WACnBP,IAAAA,OAAAA,CAAQO,MAAM,KAAK,cACnB,EAAA;QACA,OAAO,KAAA;AACT;AAEA;;;;;AAKC,MACD,IACEP,OAAAA,CAAQO,MAAM,KAAK,QACnBN,IAAAA,MAAAA,CAAOC,cAAc,CAACC,GAAG,EAAA,EAAIC,OAAQC,CAAAA,GAAAA,CAAIG,SAAS,kBAClD,CAAA,EAAA;QACA,OAAO,KAAA;AACT;;IAGA,IAAI,CAACR,QAAQS,WAAW,CAACC,GAAG,CAACJ,UAAU,CAAC,OAAU,CAAA,EAAA;QAChD,OAAO,KAAA;AACT;IAEA,OAAO,IAAA;AACT,CAAA;AAEA;;;;IAKA,MAAMK,aAAa,CAACD,GAAAA,GAAAA;AAClB,IAAA,MAAME,gBAAmBX,GAAAA,MAAAA,CAAOY,QAAQ,CAACH,KAAKI,UAAU;;IAGxD,MAAMC,iBAAAA,GAAoBC,OAAOC,IAAI,CAACL,kBAAkBM,MAAM,CAC5D,CAACC,uBAAyBC,EAAAA,GAAAA,GAAAA;QACxB,MAAMC,WAAAA,GAAcT,gBAAgB,CAACQ,GAAI,CAAA;QAEzC,IAAIC,WAAAA,CAAYC,IAAI,KAAK,WAAa,EAAA;AACpC,YAAA,MAAMC,kBAAkBtB,MAAOY,CAAAA,QAAQ,CAACQ,WAAYG,CAAAA,SAAS,EAAEV,UAAU;YACzE,OAAO;AACL,gBAAA,GAAGK,uBAAuB;gBAC1B,CAACE,WAAAA,CAAYG,SAAS,GAAGD;AAC3B,aAAA;AACF;;QAGA,OAAOJ,uBAAAA;AACT,KAAA,EACA,EAAC,CAAA;IAGH,OAAO;AACLM,QAAAA,MAAAA,EAAQC,KAAKC,gBAAkBf,EAAAA,gBAAAA,CAAAA;AAC/BG,QAAAA;AACF,KAAA;AACF,CAAA;AAEA,MAAMa,uBAA0B,GAAA,CAAC,EAAE3B,MAAAA,EAAAA,OAAM,EAA2B,GAAA;AAClE,IAAA,MAAM4B,KAEF,GAAA;QACFC,aAAe,EAAA;AACjB,KAAA;AAEA,IAAA,MAAMC,eAAeC,kBAAmB,CAAA;QAAE/B,MAAAA,EAAAA;AAAO,KAAA,CAAA;AACjD,IAAA,MAAM,EAAEgC,uBAAuB,EAAE,GAAGhC,OAAAA,CAAOiC,OAAO,CAAC,uBAAA,CAAA;IAEnD,OAAO;QACL,MAAMC,SAAAA,CAAAA,GAAAA;;YAEJ,IAAIN,KAAAA,CAAMC,aAAa,EAAE;AACvB,gBAAA;AACF;;AAGA,YAAA,MAAMG,uBAAwB,CAAA,yBAAA,CAAA;AAE9BhC,YAAAA,OAAAA,CAAOmC,SAAS,CAACC,GAAG,CAAC,OAAOrC,OAASsC,EAAAA,IAAAA,GAAAA;AACnC,gBAAA,MAAMC,SAAU,MAAMD,IAAAA,EAAAA;gBAEtB,IAAI,CAACvC,2BAA2BC,OAAU,CAAA,EAAA;oBACxC,OAAOuC,MAAAA;AACT;;AAGA,gBAAA,MAAMC,UACJxC,GAAAA,OAAAA,CAAQO,MAAM,KAAK,YAAYP,OAAQO,CAAAA,MAAM,KAAK,OAAA,GAC9CgC,OAAOC,UAAU,GACjBxC,OAAQyC,CAAAA,MAAM,CAACD,UAAU;;gBAG/B,MAAME,aAAAA,GAAgB,MAAMX,YAAAA,CAAaY,gBAAgB,EAAA;AACzD,gBAAA,MAAMC,OAAUC,GAAAA,SAAAA,CAAU7C,OAAQyC,CAAAA,MAAM,EAAEK,MAAUJ,IAAAA,aAAAA,CAAAA;gBACpD,IAAI,CAACE,OAAQG,CAAAA,MAAM,EAAE;oBACnB,OAAOR,MAAAA;AACT;;AAGA,gBAAA,MAAM7B,GAAMV,GAAAA,OAAAA,CAAQS,WAAW,CAACC,GAAG;AACnC,gBAAA,MAAMsC,UAAUrC,UAAWD,CAAAA,GAAAA,CAAAA;gBAC3B,MAAMuC,KAAAA,GAAQhD,OAAOY,CAAAA,QAAQ,CAACH,GAAAA,CAAAA;gBAE9B,MAAMwC,sBAAAA,GAAyBnB,YAAamB,CAAAA,sBAAsB,CAACD,KAAAA,CAAAA;;gBAGnE,MAAME,aAAAA,GAAgB,MAAMlD,OAAOmD,CAAAA,EAAE,CAACC,KAAK,CAAC3C,GAAK4C,CAAAA,CAAAA,QAAQ,CAAC;oBACxDC,KAAO,EAAA;AACLf,wBAAAA,UAAAA;AACA,wBAAA,GAAIU,sBAAyB,GAAA;4BAAEJ,MAAQ,EAAA;gCAAEU,GAAKZ,EAAAA;AAAQ;AAAE,yBAAA,GAAI,EAAE;AAC9D,wBAAA,GAAIa,aAAaC,kBAAkB,CAACzD,QAAOwD,YAAY,CAAC/C,IAAI,CACxD,GAAA;4BAAEiD,WAAa,EAAA;AAAK,yBAAA,GACpB;AACN,qBAAA;oBACAC,QAAU7B,EAAAA,YAAAA,CAAa8B,eAAe,CAACnD,GAAK,EAAA,IAAA;AAC9C,iBAAA,CAAA;gBAEA,MAAMT,OAAAA,CAAOmD,EAAE,CAACU,WAAW,CAAC,OAAO,EAAEC,QAAQ,EAAE,GAAA;;;;oBAI7CA,QAAS,CAAA,UAAA;wBACP,KAAK,MAAMC,SAASb,aAAe,CAAA;AACjC,4BAAA,MAAMc,MAAS,GAAA,MAAMlC,YAAamC,CAAAA,gBAAgB,CAACxD,GAAKsD,EAAAA,KAAAA,CAAAA;AAExD,4BAAA,MAAMG,UAAWlE,CAAAA,OAAAA,EAAQ,SAAWmE,CAAAA,CAAAA,aAAa,CAAC;gCAChD3D,WAAaC,EAAAA,GAAAA;AACb2D,gCAAAA,IAAAA,EAAM3C,KAAKC,gBAAkBqC,EAAAA,KAAAA,CAAAA;gCAC7BM,iBAAmB9B,EAAAA,UAAAA;AACnBM,gCAAAA,MAAAA,EAAQkB,MAAMlB,MAAM;AACpBmB,gCAAAA,MAAAA;AACA,gCAAA,GAAGjB;AACL,6BAAA,CAAA;AACF;AACF,qBAAA,CAAA;AACF,iBAAA,CAAA;gBAEA,OAAOT,MAAAA;AACT,aAAA,CAAA;;YAGAtC,OAAOsE,CAAAA,IAAI,CAACC,GAAG,CAAC;gBACdC,kBAAoB,EAAA;oBAClB,MAAMC,IAAAA,CAAAA,GAAAA;AACJ,wBAAA,MAAMC,8BACJ5C,YAAa6C,CAAAA,gBAAgB,EAAK,GAAA,EAAA,GAAK,KAAK,EAAK,GAAA,IAAA;AACnD,wBAAA,MAAMC,cAAiB,GAAA,IAAIC,IAAKA,CAAAA,IAAAA,CAAKC,GAAG,EAAKJ,GAAAA,2BAAAA,CAAAA;AAE7C1E,wBAAAA,OAAAA,CAAOmD,EAAE,CACNC,KAAK,CAAC2B,mBAAAA,CAAAA,CACNC,UAAU,CAAC;4BACV1B,KAAO,EAAA;gCACL2B,UAAY,EAAA;oCACVC,GAAKN,EAAAA;AACP;AACF;yBAEDO,CAAAA,CAAAA,KAAK,CAAC,CAACC,KAAAA,GAAAA;AACN,4BAAA,IAAIA,iBAAiBC,KAAO,EAAA;AAC1BrF,gCAAAA,OAAAA,CAAOsF,GAAG,CAACF,KAAK,CAAC,yCAAA,EAA2CA,MAAMG,OAAO,CAAA;AAC3E;AACF,yBAAA,CAAA;AACJ,qBAAA;oBACAC,OAAS,EAAA;AACX;AACF,aAAA,CAAA;AAEA5D,YAAAA,KAAAA,CAAMC,aAAa,GAAG,IAAA;AACxB,SAAA;QAEA,MAAM4D,OAAAA,CAAAA,GAAAA;YACJzF,OAAOsE,CAAAA,IAAI,CAACoB,MAAM,CAAC,oBAAA,CAAA;AACrB;AACF,KAAA;AACF;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"homepage.js","sources":["../../../../server/src/homepage/controllers/homepage.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport * as yup from 'yup';\nimport { errors } from '@strapi/utils';\nimport type { GetRecentDocuments } from '../../../../shared/contracts/homepage';\n\nconst createHomepageController = () => {\n const homepageService = strapi.plugin('content-manager').service('homepage');\n\n const recentDocumentParamsSchema = yup.object().shape({\n action: yup\n .mixed<GetRecentDocuments.Request['query']['action']>()\n .oneOf(['update', 'publish'])\n .required(),\n });\n\n return {\n async getRecentDocuments(ctx): Promise<GetRecentDocuments.Response> {\n let action;\n\n try {\n action = (await recentDocumentParamsSchema.validate(ctx.query)).action;\n } catch (error) {\n if (error instanceof yup.ValidationError) {\n throw new errors.ValidationError(error.message);\n }\n throw error;\n }\n\n if (action === 'publish') {\n return { data: await homepageService.getRecentlyPublishedDocuments() };\n }\n\n return { data: await homepageService.getRecentlyUpdatedDocuments() };\n },\n } satisfies Core.Controller;\n};\n\nexport { createHomepageController };\n"],"names":["createHomepageController","homepageService","strapi","plugin","service","recentDocumentParamsSchema","yup","object","shape","action","mixed","oneOf","required","getRecentDocuments","ctx","validate","query","error","ValidationError","errors","message","data","getRecentlyPublishedDocuments","getRecentlyUpdatedDocuments"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAKA,MAAMA,wBAA2B,GAAA,IAAA;AAC/B,IAAA,MAAMC,kBAAkBC,MAAOC,CAAAA,MAAM,CAAC,iBAAA,CAAA,CAAmBC,OAAO,CAAC,UAAA,CAAA;AAEjE,IAAA,MAAMC,0BAA6BC,GAAAA,cAAAA,CAAIC,MAAM,EAAA,CAAGC,KAAK,CAAC;AACpDC,QAAAA,MAAAA,EAAQH,cACLI,CAAAA,KAAK,EACLC,CAAAA,KAAK,CAAC;AAAC,YAAA,QAAA;AAAU,YAAA;AAAU,SAAA,CAAA,CAC3BC,QAAQ;AACb,KAAA,CAAA;IAEA,OAAO;AACL,QAAA,MAAMC,oBAAmBC,GAAG,EAAA;YAC1B,IAAIL,MAAAA;YAEJ,IAAI;gBACFA,MAAS,GAAC,CAAA,MAAMJ,0BAA2BU,CAAAA,QAAQ,CAACD,GAAIE,CAAAA,KAAK,CAAA,EAAGP,MAAM;AACxE,aAAA,CAAE,OAAOQ,KAAO,EAAA;gBACd,IAAIA,KAAAA,YAAiBX,cAAIY,CAAAA,eAAe,EAAE;AACxC,oBAAA,MAAM,IAAIC,kBAAAA,CAAOD,eAAe,CAACD,MAAMG,OAAO,CAAA;AAChD;gBACA,MAAMH,KAAAA;AACR;AAEA,YAAA,IAAIR,WAAW,SAAW,EAAA;gBACxB,OAAO;oBAAEY,IAAM,EAAA,MAAMpB,gBAAgBqB,6BAA6B;AAAG,iBAAA;AACvE;YAEA,OAAO;gBAAED,IAAM,EAAA,MAAMpB,gBAAgBsB,2BAA2B;AAAG,aAAA;AACrE;AACF,KAAA;AACF;;;;"}
|
|
1
|
+
{"version":3,"file":"homepage.js","sources":["../../../../server/src/homepage/controllers/homepage.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport * as yup from 'yup';\nimport { errors } from '@strapi/utils';\nimport type { GetRecentDocuments, GetCountDocuments } from '../../../../shared/contracts/homepage';\n\nconst createHomepageController = () => {\n const homepageService = strapi.plugin('content-manager').service('homepage');\n\n const recentDocumentParamsSchema = yup.object().shape({\n action: yup\n .mixed<GetRecentDocuments.Request['query']['action']>()\n .oneOf(['update', 'publish'])\n .required(),\n });\n\n return {\n async getRecentDocuments(ctx): Promise<GetRecentDocuments.Response> {\n let action;\n\n try {\n action = (await recentDocumentParamsSchema.validate(ctx.query)).action;\n } catch (error) {\n if (error instanceof yup.ValidationError) {\n throw new errors.ValidationError(error.message);\n }\n throw error;\n }\n\n if (action === 'publish') {\n return { data: await homepageService.getRecentlyPublishedDocuments() };\n }\n\n return { data: await homepageService.getRecentlyUpdatedDocuments() };\n },\n async getCountDocuments(): Promise<GetCountDocuments.Response> {\n return { data: await homepageService.getCountDocuments() };\n },\n } satisfies Core.Controller;\n};\n\nexport { createHomepageController };\n"],"names":["createHomepageController","homepageService","strapi","plugin","service","recentDocumentParamsSchema","yup","object","shape","action","mixed","oneOf","required","getRecentDocuments","ctx","validate","query","error","ValidationError","errors","message","data","getRecentlyPublishedDocuments","getRecentlyUpdatedDocuments","getCountDocuments"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAKA,MAAMA,wBAA2B,GAAA,IAAA;AAC/B,IAAA,MAAMC,kBAAkBC,MAAOC,CAAAA,MAAM,CAAC,iBAAA,CAAA,CAAmBC,OAAO,CAAC,UAAA,CAAA;AAEjE,IAAA,MAAMC,0BAA6BC,GAAAA,cAAAA,CAAIC,MAAM,EAAA,CAAGC,KAAK,CAAC;AACpDC,QAAAA,MAAAA,EAAQH,cACLI,CAAAA,KAAK,EACLC,CAAAA,KAAK,CAAC;AAAC,YAAA,QAAA;AAAU,YAAA;AAAU,SAAA,CAAA,CAC3BC,QAAQ;AACb,KAAA,CAAA;IAEA,OAAO;AACL,QAAA,MAAMC,oBAAmBC,GAAG,EAAA;YAC1B,IAAIL,MAAAA;YAEJ,IAAI;gBACFA,MAAS,GAAC,CAAA,MAAMJ,0BAA2BU,CAAAA,QAAQ,CAACD,GAAIE,CAAAA,KAAK,CAAA,EAAGP,MAAM;AACxE,aAAA,CAAE,OAAOQ,KAAO,EAAA;gBACd,IAAIA,KAAAA,YAAiBX,cAAIY,CAAAA,eAAe,EAAE;AACxC,oBAAA,MAAM,IAAIC,kBAAAA,CAAOD,eAAe,CAACD,MAAMG,OAAO,CAAA;AAChD;gBACA,MAAMH,KAAAA;AACR;AAEA,YAAA,IAAIR,WAAW,SAAW,EAAA;gBACxB,OAAO;oBAAEY,IAAM,EAAA,MAAMpB,gBAAgBqB,6BAA6B;AAAG,iBAAA;AACvE;YAEA,OAAO;gBAAED,IAAM,EAAA,MAAMpB,gBAAgBsB,2BAA2B;AAAG,aAAA;AACrE,SAAA;QACA,MAAMC,iBAAAA,CAAAA,GAAAA;YACJ,OAAO;gBAAEH,IAAM,EAAA,MAAMpB,gBAAgBuB,iBAAiB;AAAG,aAAA;AAC3D;AACF,KAAA;AACF;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"homepage.mjs","sources":["../../../../server/src/homepage/controllers/homepage.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport * as yup from 'yup';\nimport { errors } from '@strapi/utils';\nimport type { GetRecentDocuments } from '../../../../shared/contracts/homepage';\n\nconst createHomepageController = () => {\n const homepageService = strapi.plugin('content-manager').service('homepage');\n\n const recentDocumentParamsSchema = yup.object().shape({\n action: yup\n .mixed<GetRecentDocuments.Request['query']['action']>()\n .oneOf(['update', 'publish'])\n .required(),\n });\n\n return {\n async getRecentDocuments(ctx): Promise<GetRecentDocuments.Response> {\n let action;\n\n try {\n action = (await recentDocumentParamsSchema.validate(ctx.query)).action;\n } catch (error) {\n if (error instanceof yup.ValidationError) {\n throw new errors.ValidationError(error.message);\n }\n throw error;\n }\n\n if (action === 'publish') {\n return { data: await homepageService.getRecentlyPublishedDocuments() };\n }\n\n return { data: await homepageService.getRecentlyUpdatedDocuments() };\n },\n } satisfies Core.Controller;\n};\n\nexport { createHomepageController };\n"],"names":["createHomepageController","homepageService","strapi","plugin","service","recentDocumentParamsSchema","yup","object","shape","action","mixed","oneOf","required","getRecentDocuments","ctx","validate","query","error","ValidationError","errors","message","data","getRecentlyPublishedDocuments","getRecentlyUpdatedDocuments"],"mappings":";;;AAKA,MAAMA,wBAA2B,GAAA,IAAA;AAC/B,IAAA,MAAMC,kBAAkBC,MAAOC,CAAAA,MAAM,CAAC,iBAAA,CAAA,CAAmBC,OAAO,CAAC,UAAA,CAAA;AAEjE,IAAA,MAAMC,0BAA6BC,GAAAA,GAAAA,CAAIC,MAAM,EAAA,CAAGC,KAAK,CAAC;AACpDC,QAAAA,MAAAA,EAAQH,GACLI,CAAAA,KAAK,EACLC,CAAAA,KAAK,CAAC;AAAC,YAAA,QAAA;AAAU,YAAA;AAAU,SAAA,CAAA,CAC3BC,QAAQ;AACb,KAAA,CAAA;IAEA,OAAO;AACL,QAAA,MAAMC,oBAAmBC,GAAG,EAAA;YAC1B,IAAIL,MAAAA;YAEJ,IAAI;gBACFA,MAAS,GAAC,CAAA,MAAMJ,0BAA2BU,CAAAA,QAAQ,CAACD,GAAIE,CAAAA,KAAK,CAAA,EAAGP,MAAM;AACxE,aAAA,CAAE,OAAOQ,KAAO,EAAA;gBACd,IAAIA,KAAAA,YAAiBX,GAAIY,CAAAA,eAAe,EAAE;AACxC,oBAAA,MAAM,IAAIC,MAAAA,CAAOD,eAAe,CAACD,MAAMG,OAAO,CAAA;AAChD;gBACA,MAAMH,KAAAA;AACR;AAEA,YAAA,IAAIR,WAAW,SAAW,EAAA;gBACxB,OAAO;oBAAEY,IAAM,EAAA,MAAMpB,gBAAgBqB,6BAA6B;AAAG,iBAAA;AACvE;YAEA,OAAO;gBAAED,IAAM,EAAA,MAAMpB,gBAAgBsB,2BAA2B;AAAG,aAAA;AACrE;AACF,KAAA;AACF;;;;"}
|
|
1
|
+
{"version":3,"file":"homepage.mjs","sources":["../../../../server/src/homepage/controllers/homepage.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport * as yup from 'yup';\nimport { errors } from '@strapi/utils';\nimport type { GetRecentDocuments, GetCountDocuments } from '../../../../shared/contracts/homepage';\n\nconst createHomepageController = () => {\n const homepageService = strapi.plugin('content-manager').service('homepage');\n\n const recentDocumentParamsSchema = yup.object().shape({\n action: yup\n .mixed<GetRecentDocuments.Request['query']['action']>()\n .oneOf(['update', 'publish'])\n .required(),\n });\n\n return {\n async getRecentDocuments(ctx): Promise<GetRecentDocuments.Response> {\n let action;\n\n try {\n action = (await recentDocumentParamsSchema.validate(ctx.query)).action;\n } catch (error) {\n if (error instanceof yup.ValidationError) {\n throw new errors.ValidationError(error.message);\n }\n throw error;\n }\n\n if (action === 'publish') {\n return { data: await homepageService.getRecentlyPublishedDocuments() };\n }\n\n return { data: await homepageService.getRecentlyUpdatedDocuments() };\n },\n async getCountDocuments(): Promise<GetCountDocuments.Response> {\n return { data: await homepageService.getCountDocuments() };\n },\n } satisfies Core.Controller;\n};\n\nexport { createHomepageController };\n"],"names":["createHomepageController","homepageService","strapi","plugin","service","recentDocumentParamsSchema","yup","object","shape","action","mixed","oneOf","required","getRecentDocuments","ctx","validate","query","error","ValidationError","errors","message","data","getRecentlyPublishedDocuments","getRecentlyUpdatedDocuments","getCountDocuments"],"mappings":";;;AAKA,MAAMA,wBAA2B,GAAA,IAAA;AAC/B,IAAA,MAAMC,kBAAkBC,MAAOC,CAAAA,MAAM,CAAC,iBAAA,CAAA,CAAmBC,OAAO,CAAC,UAAA,CAAA;AAEjE,IAAA,MAAMC,0BAA6BC,GAAAA,GAAAA,CAAIC,MAAM,EAAA,CAAGC,KAAK,CAAC;AACpDC,QAAAA,MAAAA,EAAQH,GACLI,CAAAA,KAAK,EACLC,CAAAA,KAAK,CAAC;AAAC,YAAA,QAAA;AAAU,YAAA;AAAU,SAAA,CAAA,CAC3BC,QAAQ;AACb,KAAA,CAAA;IAEA,OAAO;AACL,QAAA,MAAMC,oBAAmBC,GAAG,EAAA;YAC1B,IAAIL,MAAAA;YAEJ,IAAI;gBACFA,MAAS,GAAC,CAAA,MAAMJ,0BAA2BU,CAAAA,QAAQ,CAACD,GAAIE,CAAAA,KAAK,CAAA,EAAGP,MAAM;AACxE,aAAA,CAAE,OAAOQ,KAAO,EAAA;gBACd,IAAIA,KAAAA,YAAiBX,GAAIY,CAAAA,eAAe,EAAE;AACxC,oBAAA,MAAM,IAAIC,MAAAA,CAAOD,eAAe,CAACD,MAAMG,OAAO,CAAA;AAChD;gBACA,MAAMH,KAAAA;AACR;AAEA,YAAA,IAAIR,WAAW,SAAW,EAAA;gBACxB,OAAO;oBAAEY,IAAM,EAAA,MAAMpB,gBAAgBqB,6BAA6B;AAAG,iBAAA;AACvE;YAEA,OAAO;gBAAED,IAAM,EAAA,MAAMpB,gBAAgBsB,2BAA2B;AAAG,aAAA;AACrE,SAAA;QACA,MAAMC,iBAAAA,CAAAA,GAAAA;YACJ,OAAO;gBAAEH,IAAM,EAAA,MAAMpB,gBAAgBuB,iBAAiB;AAAG,aAAA;AAC3D;AACF,KAAA;AACF;;;;"}
|