@strapi/content-manager 0.0.0-next.df5dd4b92e1b046c04ff00d00d76c88ea51b57d4 → 0.0.0-next.e1a19b9e52cdcb526515883c8289522a64c9871a
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/Fields.js +4 -1
- package/dist/admin/components/ConfigurationForm/Fields.js.map +1 -1
- package/dist/admin/components/ConfigurationForm/Fields.mjs +5 -2
- 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 +89 -49
- package/dist/admin/components/LeftMenu.js.map +1 -1
- package/dist/admin/components/LeftMenu.mjs +91 -51
- package/dist/admin/components/LeftMenu.mjs.map +1 -1
- package/dist/admin/components/Widgets.js +269 -9
- package/dist/admin/components/Widgets.js.map +1 -1
- package/dist/admin/components/Widgets.mjs +252 -12
- 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 +1 -0
- package/dist/admin/history/components/VersionHeader.js.map +1 -1
- package/dist/admin/history/components/VersionHeader.mjs +1 -0
- 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 +5 -5
- package/dist/admin/hooks/useDocumentActions.js.map +1 -1
- package/dist/admin/hooks/useDocumentActions.mjs +6 -6
- 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 +34 -20
- package/dist/admin/pages/EditView/EditViewPage.js.map +1 -1
- package/dist/admin/pages/EditView/EditViewPage.mjs +36 -22
- 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 +74 -63
- package/dist/admin/pages/EditView/components/DocumentActions.js.map +1 -1
- package/dist/admin/pages/EditView/components/DocumentActions.mjs +76 -65
- package/dist/admin/pages/EditView/components/DocumentActions.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 +2 -2
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.mjs +2 -2
- 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/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 +20 -6
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs +22 -8
- 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 +158 -106
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs +161 -109
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.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 +40 -11
- package/dist/admin/pages/EditView/components/FormLayout.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormLayout.mjs +41 -11
- package/dist/admin/pages/EditView/components/FormLayout.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/Header.js +22 -7
- package/dist/admin/pages/EditView/components/Header.js.map +1 -1
- package/dist/admin/pages/EditView/components/Header.mjs +23 -8
- 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 +221 -203
- package/dist/admin/pages/ListView/ListViewPage.js.map +1 -1
- package/dist/admin/pages/ListView/ListViewPage.mjs +222 -204
- package/dist/admin/pages/ListView/ListViewPage.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 +3 -1
- package/dist/admin/pages/ListView/components/Filters.js.map +1 -1
- package/dist/admin/pages/ListView/components/Filters.mjs +3 -1
- 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/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 +4 -1
- package/dist/admin/services/api.js.map +1 -1
- package/dist/admin/services/api.mjs +4 -1
- package/dist/admin/services/api.mjs.map +1 -1
- package/dist/admin/services/documents.js +42 -16
- package/dist/admin/services/documents.js.map +1 -1
- package/dist/admin/services/documents.mjs +42 -16
- package/dist/admin/services/documents.mjs.map +1 -1
- package/dist/admin/src/components/LeftMenu.d.ts +3 -1
- package/dist/admin/src/components/Widgets.d.ts +2 -1
- 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/FormLayout.d.ts +0 -3
- 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 +12 -0
- package/dist/admin/translations/en.json.js.map +1 -1
- package/dist/admin/translations/en.json.mjs +12 -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 +18 -6
- package/dist/admin/utils/validation.js.map +1 -1
- package/dist/admin/utils/validation.mjs +18 -6
- package/dist/admin/utils/validation.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/history/services/lifecycles.js +20 -19
- package/dist/server/history/services/lifecycles.js.map +1 -1
- package/dist/server/history/services/lifecycles.mjs +20 -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 +5 -1
- package/dist/server/preview/services/preview-config.js.map +1 -1
- package/dist/server/preview/services/preview-config.mjs +5 -1
- 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/document-manager.js +3 -0
- package/dist/server/services/document-manager.js.map +1 -1
- package/dist/server/services/document-manager.mjs +3 -0
- package/dist/server/services/document-manager.mjs.map +1 -1
- package/dist/server/services/document-metadata.js +1 -1
- package/dist/server/services/document-metadata.js.map +1 -1
- package/dist/server/services/document-metadata.mjs +1 -1
- package/dist/server/services/document-metadata.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/relations.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 +7 -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/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 +7 -0
- package/dist/server/src/services/index.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 +7 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"document-manager.mjs","sources":["../../../server/src/services/document-manager.ts"],"sourcesContent":["import { omit, pipe } from 'lodash/fp';\n\nimport { contentTypes, errors, pagination } from '@strapi/utils';\nimport type { Core, Modules, UID } from '@strapi/types';\n\nimport { buildDeepPopulate, getDeepPopulate, getDeepPopulateDraftCount } from './utils/populate';\nimport { sumDraftCounts } from './utils/draft';\n\ntype DocService = Modules.Documents.ServiceInstance;\ntype DocServiceParams<TAction extends keyof DocService> = Parameters<DocService[TAction]>[0];\nexport type Document = Modules.Documents.Result<UID.ContentType>;\n\nconst { ApplicationError } = errors;\nconst { PUBLISHED_AT_ATTRIBUTE } = contentTypes.constants;\n\nconst omitPublishedAtField = omit(PUBLISHED_AT_ATTRIBUTE);\nconst omitIdField = omit('id');\n\nconst documentManager = ({ strapi }: { strapi: Core.Strapi }) => {\n return {\n async findOne(\n id: string,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'findOne'>, 'documentId'> = {}\n ) {\n return strapi.documents(uid).findOne({ ...opts, documentId: id });\n },\n\n /**\n * Find multiple (or all) locales for a document\n */\n async findLocales(\n id: string | string[] | undefined,\n uid: UID.CollectionType,\n opts: {\n populate?: Modules.Documents.Params.Pick<any, 'populate'>;\n locale?: string | string[] | '*';\n isPublished?: boolean;\n }\n ) {\n // Will look for a specific locale by default\n const where: any = {};\n\n // Might not have an id if querying a single type\n if (id) {\n where.documentId = id;\n }\n\n // Search in array of locales\n if (Array.isArray(opts.locale)) {\n where.locale = { $in: opts.locale };\n } else if (opts.locale && opts.locale !== '*') {\n // Look for a specific locale, ignore if looking for all locales\n where.locale = opts.locale;\n }\n\n // Published is passed, so we filter on it, otherwise we don't filter\n if (typeof opts.isPublished === 'boolean') {\n where.publishedAt = { $notNull: opts.isPublished };\n }\n\n return strapi.db.query(uid).findMany({ populate: opts.populate, where });\n },\n\n async findMany(opts: DocServiceParams<'findMany'>, uid: UID.CollectionType) {\n const params = { ...opts, populate: getDeepPopulate(uid) } as typeof opts;\n return strapi.documents(uid).findMany(params);\n },\n\n async findPage(opts: DocServiceParams<'findMany'>, uid: UID.CollectionType) {\n const params = pagination.withDefaultPagination(opts || {}, {\n maxLimit: 1000,\n });\n\n const [documents, total = 0] = await Promise.all([\n strapi.documents(uid).findMany(params),\n strapi.documents(uid).count(params),\n ]);\n\n return {\n results: documents,\n pagination: pagination.transformPagedPaginationInfo(params, total),\n };\n },\n\n async create(uid: UID.CollectionType, opts: DocServiceParams<'create'> = {} as any) {\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, status: 'draft' as const, populate };\n\n return strapi.documents(uid).create(params);\n },\n\n async update(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'update'>, 'documentId'> = {} as any\n ) {\n const publishData = pipe(omitPublishedAtField, omitIdField)(opts.data || {});\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, data: publishData, populate, status: 'draft' };\n\n return strapi.documents(uid).update({ ...params, documentId: id });\n },\n\n async clone(\n id: Modules.Documents.ID,\n body: Partial<Modules.Documents.Params.Data.Input<UID.CollectionType>>,\n uid: UID.CollectionType\n ) {\n const populate = await buildDeepPopulate(uid);\n\n const params = {\n // Ensure id and documentId are not copied to the clone\n data: omit(['id', 'documentId'], body),\n populate,\n };\n\n return strapi\n .documents(uid)\n .clone({ ...params, documentId: id })\n .then((result) => result?.entries.at(0));\n },\n\n /**\n * Check if a document exists\n */\n async exists(uid: UID.CollectionType, id?: string) {\n // Collection type\n if (id) {\n const count = await strapi.db.query(uid).count({ where: { documentId: id } });\n return count > 0;\n }\n\n // Single type\n const count = await strapi.db.query(uid).count();\n return count > 0;\n },\n\n async delete(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'delete'>, 'documentId'> = {} as any\n ) {\n const populate = await buildDeepPopulate(uid);\n\n await strapi.documents(uid).delete({\n ...opts,\n documentId: id,\n populate,\n });\n return {};\n },\n\n // FIXME: handle relations\n async deleteMany(\n documentIds: Modules.Documents.ID[],\n uid: UID.CollectionType,\n opts: DocServiceParams<'findMany'> & { locale?: string } = {}\n ) {\n const deletedEntries = await strapi.db.transaction(async () => {\n return Promise.all(documentIds.map(async (id) => this.delete(id, uid, opts)));\n });\n\n return { count: deletedEntries.length };\n },\n\n async publish(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'publish'>, 'documentId'> = {} as any\n ) {\n const populate = await buildDeepPopulate(uid);\n const params = { ...opts, populate };\n\n return strapi\n .documents(uid)\n .publish({ ...params, documentId: id })\n .then((result) => result?.entries);\n },\n\n async publishMany(uid: UID.ContentType, documentIds: string[], locale?: string | string[]) {\n return strapi.db.transaction(async () => {\n const results = await Promise.all(\n documentIds.map((documentId) => this.publish(documentId, uid, { locale }))\n );\n\n const publishedEntitiesCount = results.flat().filter(Boolean).length;\n return publishedEntitiesCount;\n });\n },\n\n async unpublishMany(\n documentIds: Modules.Documents.ID[],\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'unpublish'>, 'documentId'> = {} as any\n ) {\n const unpublishedEntries = await strapi.db.transaction(async () => {\n return Promise.all(\n documentIds.map((id) =>\n strapi\n .documents(uid)\n .unpublish({ ...opts, documentId: id })\n .then((result) => result?.entries)\n )\n );\n });\n\n const unpublishedEntitiesCount = unpublishedEntries.flat().filter(Boolean).length;\n\n // Return the number of unpublished entities\n return { count: unpublishedEntitiesCount };\n },\n\n async unpublish(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'unpublish'>, 'documentId'> = {} as any\n ) {\n const populate = await buildDeepPopulate(uid);\n const params = { ...opts, populate };\n\n return strapi\n .documents(uid)\n .unpublish({ ...params, documentId: id })\n .then((result) => result?.entries.at(0));\n },\n\n async discardDraft(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'discardDraft'>, 'documentId'> = {} as any\n ) {\n const populate = await buildDeepPopulate(uid);\n const params = { ...opts, populate };\n\n return strapi\n .documents(uid)\n .discardDraft({ ...params, documentId: id })\n .then((result) => result?.entries.at(0));\n },\n\n async countDraftRelations(id: string, uid: UID.ContentType, locale: string) {\n const { populate, hasRelations } = getDeepPopulateDraftCount(uid);\n\n if (!hasRelations) {\n return 0;\n }\n\n const document = await strapi.documents(uid).findOne({ documentId: id, populate, locale });\n if (!document) {\n throw new ApplicationError(\n `Unable to count draft relations, document with id ${id} and locale ${locale} not found`\n );\n }\n\n return sumDraftCounts(document, uid);\n },\n\n async countManyEntriesDraftRelations(\n documentIds: Modules.Documents.ID[],\n uid: UID.CollectionType,\n locale: string | string[]\n ) {\n const { populate, hasRelations } = getDeepPopulateDraftCount(uid);\n\n if (!hasRelations) {\n return 0;\n }\n\n let localeFilter = {};\n if (locale) {\n localeFilter = Array.isArray(locale) ? { locale: { $in: locale } } : { locale };\n }\n\n const entities = await strapi.db.query(uid).findMany({\n populate,\n where: {\n documentId: { $in: documentIds },\n ...localeFilter,\n },\n });\n\n const totalNumberDraftRelations: number = entities!.reduce(\n (count: number, entity: Document) => sumDraftCounts(entity, uid) + count,\n 0\n );\n\n return totalNumberDraftRelations;\n },\n };\n};\n\nexport type DocumentManagerService = typeof documentManager;\n\nexport default documentManager;\n"],"names":["ApplicationError","errors","PUBLISHED_AT_ATTRIBUTE","contentTypes","constants","omitPublishedAtField","omit","omitIdField","documentManager","strapi","findOne","id","uid","opts","documents","documentId","findLocales","where","Array","isArray","locale","$in","isPublished","publishedAt","$notNull","db","query","findMany","populate","params","getDeepPopulate","findPage","pagination","withDefaultPagination","maxLimit","total","Promise","all","count","results","transformPagedPaginationInfo","create","buildDeepPopulate","status","update","publishData","pipe","data","clone","body","then","result","entries","at","exists","delete","deleteMany","documentIds","deletedEntries","transaction","map","length","publish","publishMany","publishedEntitiesCount","flat","filter","Boolean","unpublishMany","unpublishedEntries","unpublish","unpublishedEntitiesCount","discardDraft","countDraftRelations","hasRelations","getDeepPopulateDraftCount","document","sumDraftCounts","countManyEntriesDraftRelations","localeFilter","entities","totalNumberDraftRelations","reduce","entity"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"document-manager.mjs","sources":["../../../server/src/services/document-manager.ts"],"sourcesContent":["import { omit, pipe } from 'lodash/fp';\n\nimport { contentTypes, errors, pagination } from '@strapi/utils';\nimport type { Core, Modules, UID } from '@strapi/types';\n\nimport { buildDeepPopulate, getDeepPopulate, getDeepPopulateDraftCount } from './utils/populate';\nimport { sumDraftCounts } from './utils/draft';\n\ntype DocService = Modules.Documents.ServiceInstance;\ntype DocServiceParams<TAction extends keyof DocService> = Parameters<DocService[TAction]>[0];\nexport type Document = Modules.Documents.Result<UID.ContentType>;\n\nconst { ApplicationError } = errors;\nconst { PUBLISHED_AT_ATTRIBUTE } = contentTypes.constants;\n\nconst omitPublishedAtField = omit(PUBLISHED_AT_ATTRIBUTE);\nconst omitIdField = omit('id');\n\nconst documentManager = ({ strapi }: { strapi: Core.Strapi }) => {\n return {\n async findOne(\n id: string,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'findOne'>, 'documentId'> = {}\n ) {\n return strapi.documents(uid).findOne({ ...opts, documentId: id });\n },\n\n /**\n * Find multiple (or all) locales for a document\n */\n async findLocales(\n id: string | string[] | undefined,\n uid: UID.CollectionType,\n opts: {\n populate?: Modules.Documents.Params.Pick<any, 'populate'>;\n locale?: string | string[] | '*';\n isPublished?: boolean;\n }\n ) {\n // Will look for a specific locale by default\n const where: any = {};\n\n // Might not have an id if querying a single type\n if (id) {\n where.documentId = id;\n }\n\n // Search in array of locales\n if (Array.isArray(opts.locale)) {\n where.locale = { $in: opts.locale };\n } else if (opts.locale && opts.locale !== '*') {\n // Look for a specific locale, ignore if looking for all locales\n where.locale = opts.locale;\n }\n\n // Published is passed, so we filter on it, otherwise we don't filter\n if (typeof opts.isPublished === 'boolean') {\n where.publishedAt = { $notNull: opts.isPublished };\n }\n\n return strapi.db.query(uid).findMany({ populate: opts.populate, where });\n },\n\n async findMany(opts: DocServiceParams<'findMany'>, uid: UID.CollectionType) {\n const params = { ...opts, populate: getDeepPopulate(uid) } as typeof opts;\n return strapi.documents(uid).findMany(params);\n },\n\n async findPage(opts: DocServiceParams<'findMany'>, uid: UID.CollectionType) {\n const params = pagination.withDefaultPagination(opts || {}, {\n maxLimit: 1000,\n });\n\n const [documents, total = 0] = await Promise.all([\n strapi.documents(uid).findMany(params),\n strapi.documents(uid).count(params),\n ]);\n\n return {\n results: documents,\n pagination: pagination.transformPagedPaginationInfo(params, total),\n };\n },\n\n async create(uid: UID.CollectionType, opts: DocServiceParams<'create'> = {} as any) {\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, status: 'draft' as const, populate };\n\n return strapi.documents(uid).create(params);\n },\n\n async update(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'update'>, 'documentId'> = {} as any\n ) {\n const publishData = pipe(omitPublishedAtField, omitIdField)(opts.data || {});\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, data: publishData, populate, status: 'draft' };\n\n return strapi.documents(uid).update({ ...params, documentId: id });\n },\n\n async clone(\n id: Modules.Documents.ID,\n body: Partial<Modules.Documents.Params.Data.Input<UID.CollectionType>>,\n uid: UID.CollectionType\n ) {\n const populate = await buildDeepPopulate(uid);\n\n // Extract the locale to pass it as a plain param\n const locale = body?.locale;\n const params = {\n // Ensure id and documentId are not copied to the clone\n data: omit(['id', 'documentId'], body),\n locale,\n populate,\n };\n\n return strapi\n .documents(uid)\n .clone({ ...params, documentId: id })\n .then((result) => result?.entries.at(0));\n },\n\n /**\n * Check if a document exists\n */\n async exists(uid: UID.CollectionType, id?: string) {\n // Collection type\n if (id) {\n const count = await strapi.db.query(uid).count({ where: { documentId: id } });\n return count > 0;\n }\n\n // Single type\n const count = await strapi.db.query(uid).count();\n return count > 0;\n },\n\n async delete(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'delete'>, 'documentId'> = {} as any\n ) {\n const populate = await buildDeepPopulate(uid);\n\n await strapi.documents(uid).delete({\n ...opts,\n documentId: id,\n populate,\n });\n return {};\n },\n\n // FIXME: handle relations\n async deleteMany(\n documentIds: Modules.Documents.ID[],\n uid: UID.CollectionType,\n opts: DocServiceParams<'findMany'> & { locale?: string } = {}\n ) {\n const deletedEntries = await strapi.db.transaction(async () => {\n return Promise.all(documentIds.map(async (id) => this.delete(id, uid, opts)));\n });\n\n return { count: deletedEntries.length };\n },\n\n async publish(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'publish'>, 'documentId'> = {} as any\n ) {\n const populate = await buildDeepPopulate(uid);\n const params = { ...opts, populate };\n\n return strapi\n .documents(uid)\n .publish({ ...params, documentId: id })\n .then((result) => result?.entries);\n },\n\n async publishMany(uid: UID.ContentType, documentIds: string[], locale?: string | string[]) {\n return strapi.db.transaction(async () => {\n const results = await Promise.all(\n documentIds.map((documentId) => this.publish(documentId, uid, { locale }))\n );\n\n const publishedEntitiesCount = results.flat().filter(Boolean).length;\n return publishedEntitiesCount;\n });\n },\n\n async unpublishMany(\n documentIds: Modules.Documents.ID[],\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'unpublish'>, 'documentId'> = {} as any\n ) {\n const unpublishedEntries = await strapi.db.transaction(async () => {\n return Promise.all(\n documentIds.map((id) =>\n strapi\n .documents(uid)\n .unpublish({ ...opts, documentId: id })\n .then((result) => result?.entries)\n )\n );\n });\n\n const unpublishedEntitiesCount = unpublishedEntries.flat().filter(Boolean).length;\n\n // Return the number of unpublished entities\n return { count: unpublishedEntitiesCount };\n },\n\n async unpublish(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'unpublish'>, 'documentId'> = {} as any\n ) {\n const populate = await buildDeepPopulate(uid);\n const params = { ...opts, populate };\n\n return strapi\n .documents(uid)\n .unpublish({ ...params, documentId: id })\n .then((result) => result?.entries.at(0));\n },\n\n async discardDraft(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'discardDraft'>, 'documentId'> = {} as any\n ) {\n const populate = await buildDeepPopulate(uid);\n const params = { ...opts, populate };\n\n return strapi\n .documents(uid)\n .discardDraft({ ...params, documentId: id })\n .then((result) => result?.entries.at(0));\n },\n\n async countDraftRelations(id: string, uid: UID.ContentType, locale: string) {\n const { populate, hasRelations } = getDeepPopulateDraftCount(uid);\n\n if (!hasRelations) {\n return 0;\n }\n\n const document = await strapi.documents(uid).findOne({ documentId: id, populate, locale });\n if (!document) {\n throw new ApplicationError(\n `Unable to count draft relations, document with id ${id} and locale ${locale} not found`\n );\n }\n\n return sumDraftCounts(document, uid);\n },\n\n async countManyEntriesDraftRelations(\n documentIds: Modules.Documents.ID[],\n uid: UID.CollectionType,\n locale: string | string[]\n ) {\n const { populate, hasRelations } = getDeepPopulateDraftCount(uid);\n\n if (!hasRelations) {\n return 0;\n }\n\n let localeFilter = {};\n if (locale) {\n localeFilter = Array.isArray(locale) ? { locale: { $in: locale } } : { locale };\n }\n\n const entities = await strapi.db.query(uid).findMany({\n populate,\n where: {\n documentId: { $in: documentIds },\n ...localeFilter,\n },\n });\n\n const totalNumberDraftRelations: number = entities!.reduce(\n (count: number, entity: Document) => sumDraftCounts(entity, uid) + count,\n 0\n );\n\n return totalNumberDraftRelations;\n },\n };\n};\n\nexport type DocumentManagerService = typeof documentManager;\n\nexport default documentManager;\n"],"names":["ApplicationError","errors","PUBLISHED_AT_ATTRIBUTE","contentTypes","constants","omitPublishedAtField","omit","omitIdField","documentManager","strapi","findOne","id","uid","opts","documents","documentId","findLocales","where","Array","isArray","locale","$in","isPublished","publishedAt","$notNull","db","query","findMany","populate","params","getDeepPopulate","findPage","pagination","withDefaultPagination","maxLimit","total","Promise","all","count","results","transformPagedPaginationInfo","create","buildDeepPopulate","status","update","publishData","pipe","data","clone","body","then","result","entries","at","exists","delete","deleteMany","documentIds","deletedEntries","transaction","map","length","publish","publishMany","publishedEntitiesCount","flat","filter","Boolean","unpublishMany","unpublishedEntries","unpublish","unpublishedEntitiesCount","discardDraft","countDraftRelations","hasRelations","getDeepPopulateDraftCount","document","sumDraftCounts","countManyEntriesDraftRelations","localeFilter","entities","totalNumberDraftRelations","reduce","entity"],"mappings":"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"}
|
|
@@ -215,7 +215,7 @@ var documentMetadata = (({ strapi })=>({
|
|
|
215
215
|
if (document.localizations) {
|
|
216
216
|
const otherStatus = await this.getManyAvailableStatus(uid, document.localizations);
|
|
217
217
|
document.localizations = document.localizations.map((d)=>{
|
|
218
|
-
const status = otherStatus.find((s)=>s.documentId === d.documentId);
|
|
218
|
+
const status = otherStatus.find((s)=>s.documentId === d.documentId && s.locale === d.locale);
|
|
219
219
|
return {
|
|
220
220
|
...d,
|
|
221
221
|
status: this.getStatus(d, status ? [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"document-metadata.js","sources":["../../../server/src/services/document-metadata.ts"],"sourcesContent":["import { groupBy, pick, uniq } from 'lodash/fp';\n\nimport { async, contentTypes } from '@strapi/utils';\nimport type { Core, UID, Modules } from '@strapi/types';\n\nimport type { DocumentMetadata } from '../../../shared/contracts/collection-types';\nimport { getPopulateForValidation } from './utils/populate';\n\nexport interface DocumentVersion {\n id: string | number;\n documentId: Modules.Documents.ID;\n locale?: string;\n localizations?: DocumentVersion[];\n updatedAt?: string | null | Date;\n publishedAt?: string | null | Date;\n}\n\nconst AVAILABLE_STATUS_FIELDS = [\n 'id',\n 'documentId',\n 'locale',\n 'updatedAt',\n 'createdAt',\n 'publishedAt',\n 'createdBy',\n 'updatedBy',\n 'status',\n];\nconst AVAILABLE_LOCALES_FIELDS = [\n 'id',\n 'documentId',\n 'locale',\n 'updatedAt',\n 'createdAt',\n 'publishedAt',\n 'documentId',\n];\n\nconst CONTENT_MANAGER_STATUS = {\n PUBLISHED: 'published',\n DRAFT: 'draft',\n MODIFIED: 'modified',\n};\n\n/**\n * Controls the metadata properties to be returned\n *\n * If `availableLocales` is set to `true` (default), the returned metadata will include\n * the available locales of the document for its current status.\n *\n * If `availableStatus` is set to `true` (default), the returned metadata will include\n * the available status of the document for its current locale.\n */\nexport interface GetMetadataOptions {\n availableLocales?: boolean;\n availableStatus?: boolean;\n}\n\n/**\n * Checks if the provided document version has been modified after all other versions.\n */\nconst getIsVersionLatestModification = (\n version?: DocumentVersion,\n otherVersion?: DocumentVersion\n): boolean => {\n if (!version || !version.updatedAt) {\n return false;\n }\n\n const versionUpdatedAt = version?.updatedAt ? new Date(version.updatedAt).getTime() : 0;\n\n const otherUpdatedAt = otherVersion?.updatedAt ? new Date(otherVersion.updatedAt).getTime() : 0;\n\n return versionUpdatedAt > otherUpdatedAt;\n};\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => ({\n /**\n * Returns available locales of a document for the current status\n */\n async getAvailableLocales(\n uid: UID.ContentType,\n version: DocumentVersion,\n allVersions: DocumentVersion[]\n ) {\n // Group all versions by locale\n const versionsByLocale = groupBy('locale', allVersions);\n\n // Delete the current locale\n if (version.locale) {\n delete versionsByLocale[version.locale];\n }\n\n // For each locale, get the ones with the same status\n // There will not be a draft and a version counterpart if the content\n // type does not have draft and publish\n const model = strapi.getModel(uid);\n\n const mappingResult = await async.map(\n Object.values(versionsByLocale),\n async (localeVersions: DocumentVersion[]) => {\n if (!contentTypes.hasDraftAndPublish(model)) {\n return localeVersions[0];\n }\n\n const draftVersion = localeVersions.find((v) => v.publishedAt === null);\n const otherVersions = localeVersions.filter((v) => v.id !== draftVersion?.id);\n\n if (!draftVersion) {\n return;\n }\n\n return {\n ...draftVersion,\n status: this.getStatus(draftVersion, otherVersions as any),\n };\n }\n );\n\n return (\n mappingResult\n // Filter just in case there is a document with no drafts\n .filter(Boolean) as unknown as DocumentMetadata['availableLocales']\n );\n },\n\n /**\n * Returns available status of a document for the current locale\n */\n getAvailableStatus(version: DocumentVersion, allVersions: DocumentVersion[]) {\n // Find the other status of the document\n const status =\n version.publishedAt !== null\n ? CONTENT_MANAGER_STATUS.DRAFT\n : CONTENT_MANAGER_STATUS.PUBLISHED;\n\n // Get version that match the current locale and not match the current status\n const availableStatus = allVersions.find((v) => {\n const matchLocale = v.locale === version.locale;\n const matchStatus = status === 'published' ? v.publishedAt !== null : v.publishedAt === null;\n return matchLocale && matchStatus;\n });\n\n if (!availableStatus) return availableStatus;\n\n // Pick status fields (at fields, status, by fields), use lodash fp\n return pick(AVAILABLE_STATUS_FIELDS, availableStatus);\n },\n\n /**\n * Get the available status of many documents, useful for batch operations\n * @param uid\n * @param documents\n * @returns\n */\n async getManyAvailableStatus(uid: UID.ContentType, documents: DocumentVersion[]) {\n if (!documents.length) return [];\n\n // The status and locale of all documents should be the same\n const status = documents[0].publishedAt !== null ? 'published' : 'draft';\n const locales = documents.map((d) => d.locale).filter(Boolean);\n\n const where: Record<string, any> = {\n documentId: { $in: documents.map((d) => d.documentId).filter(Boolean) },\n publishedAt: { $null: status === 'published' },\n };\n\n // If there is any locale to filter (if i18n is enabled)\n if (locales.length) {\n where.locale = { $in: locales };\n }\n\n return strapi.query(uid).findMany({\n where,\n select: ['id', 'documentId', 'locale', 'updatedAt', 'createdAt', 'publishedAt'],\n });\n },\n\n getStatus(version: DocumentVersion, otherDocumentStatuses?: DocumentMetadata['availableStatus']) {\n let draftVersion: DocumentVersion | undefined;\n let publishedVersion: DocumentVersion | undefined;\n\n if (version.publishedAt) {\n publishedVersion = version;\n } else {\n draftVersion = version;\n }\n\n const otherVersion = otherDocumentStatuses?.at(0);\n if (otherVersion?.publishedAt) {\n publishedVersion = otherVersion;\n } else if (otherVersion) {\n draftVersion = otherVersion;\n }\n\n if (!draftVersion) return CONTENT_MANAGER_STATUS.PUBLISHED;\n if (!publishedVersion) return CONTENT_MANAGER_STATUS.DRAFT;\n\n /*\n * The document is modified if the draft version has been updated more\n * recently than the published version.\n */\n const isDraftModified = getIsVersionLatestModification(draftVersion, publishedVersion);\n return isDraftModified ? CONTENT_MANAGER_STATUS.MODIFIED : CONTENT_MANAGER_STATUS.PUBLISHED;\n },\n\n // TODO is it necessary to return metadata on every page of the CM\n // We could refactor this so the locales are only loaded when they're\n // needed. e.g. in the bulk locale action modal.\n async getMetadata(\n uid: UID.ContentType,\n version: DocumentVersion,\n { availableLocales = true, availableStatus = true }: GetMetadataOptions = {}\n ) {\n // TODO: Ignore publishedAt if availableStatus=false, and ignore locale if\n // i18n is disabled\n const { populate = {}, fields = [] } = getPopulateForValidation(uid);\n\n const params = {\n populate: {\n ...populate,\n // NOTE: creator fields are selected in this way to avoid exposing sensitive data\n createdBy: {\n select: ['id', 'firstname', 'lastname', 'email'],\n },\n updatedBy: {\n select: ['id', 'firstname', 'lastname', 'email'],\n },\n },\n fields: uniq([...AVAILABLE_LOCALES_FIELDS, ...fields]),\n filters: {\n documentId: version.documentId,\n },\n };\n\n const dbParams = strapi.get('query-params').transform(uid, params);\n const versions = await strapi.db.query(uid).findMany(dbParams);\n\n // TODO: Remove use of available locales and use localizations instead\n const availableLocalesResult = availableLocales\n ? await this.getAvailableLocales(uid, version, versions)\n : [];\n\n const availableStatusResult = availableStatus\n ? this.getAvailableStatus(version, versions)\n : null;\n\n return {\n availableLocales: availableLocalesResult,\n availableStatus: availableStatusResult ? [availableStatusResult] : [],\n };\n },\n\n /**\n * Returns associated metadata of a document:\n * - Available locales of the document for the current status\n * - Available status of the document for the current locale\n */\n async formatDocumentWithMetadata(\n uid: UID.ContentType,\n document: DocumentVersion,\n opts: GetMetadataOptions = {}\n ) {\n if (!document) {\n return {\n data: document,\n meta: {\n availableLocales: [],\n availableStatus: [],\n },\n };\n }\n\n const hasDraftAndPublish = contentTypes.hasDraftAndPublish(strapi.getModel(uid));\n\n // Ignore available status if the content type does not have draft and publish\n if (!hasDraftAndPublish) {\n opts.availableStatus = false;\n }\n\n const meta = await this.getMetadata(uid, document, opts);\n\n // Populate localization statuses\n if (document.localizations) {\n const otherStatus = await this.getManyAvailableStatus(uid, document.localizations);\n\n document.localizations = document.localizations.map((d) => {\n const status = otherStatus.find((s) => s.documentId === d.documentId);\n return {\n ...d,\n status: this.getStatus(d, status ? [status] : []),\n };\n });\n }\n\n return {\n data: {\n ...document,\n // Add status to the document only if draft and publish is enabled\n status: hasDraftAndPublish\n ? this.getStatus(document, meta.availableStatus as any)\n : undefined,\n },\n meta,\n };\n },\n});\n"],"names":["AVAILABLE_STATUS_FIELDS","AVAILABLE_LOCALES_FIELDS","CONTENT_MANAGER_STATUS","PUBLISHED","DRAFT","MODIFIED","getIsVersionLatestModification","version","otherVersion","updatedAt","versionUpdatedAt","Date","getTime","otherUpdatedAt","strapi","getAvailableLocales","uid","allVersions","versionsByLocale","groupBy","locale","model","getModel","mappingResult","async","map","Object","values","localeVersions","contentTypes","hasDraftAndPublish","draftVersion","find","v","publishedAt","otherVersions","filter","id","status","getStatus","Boolean","getAvailableStatus","availableStatus","matchLocale","matchStatus","pick","getManyAvailableStatus","documents","length","locales","d","where","documentId","$in","$null","query","findMany","select","otherDocumentStatuses","publishedVersion","at","isDraftModified","getMetadata","availableLocales","populate","fields","getPopulateForValidation","params","createdBy","updatedBy","uniq","filters","dbParams","get","transform","versions","db","availableLocalesResult","availableStatusResult","formatDocumentWithMetadata","document","opts","data","meta","localizations","otherStatus","s","undefined"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"document-metadata.js","sources":["../../../server/src/services/document-metadata.ts"],"sourcesContent":["import { groupBy, pick, uniq } from 'lodash/fp';\n\nimport { async, contentTypes } from '@strapi/utils';\nimport type { Core, UID, Modules } from '@strapi/types';\n\nimport type { DocumentMetadata } from '../../../shared/contracts/collection-types';\nimport { getPopulateForValidation } from './utils/populate';\n\nexport interface DocumentVersion {\n id: string | number;\n documentId: Modules.Documents.ID;\n locale?: string;\n localizations?: DocumentVersion[];\n updatedAt?: string | null | Date;\n publishedAt?: string | null | Date;\n}\n\nconst AVAILABLE_STATUS_FIELDS = [\n 'id',\n 'documentId',\n 'locale',\n 'updatedAt',\n 'createdAt',\n 'publishedAt',\n 'createdBy',\n 'updatedBy',\n 'status',\n];\nconst AVAILABLE_LOCALES_FIELDS = [\n 'id',\n 'documentId',\n 'locale',\n 'updatedAt',\n 'createdAt',\n 'publishedAt',\n 'documentId',\n];\n\nconst CONTENT_MANAGER_STATUS = {\n PUBLISHED: 'published',\n DRAFT: 'draft',\n MODIFIED: 'modified',\n};\n\n/**\n * Controls the metadata properties to be returned\n *\n * If `availableLocales` is set to `true` (default), the returned metadata will include\n * the available locales of the document for its current status.\n *\n * If `availableStatus` is set to `true` (default), the returned metadata will include\n * the available status of the document for its current locale.\n */\nexport interface GetMetadataOptions {\n availableLocales?: boolean;\n availableStatus?: boolean;\n}\n\n/**\n * Checks if the provided document version has been modified after all other versions.\n */\nconst getIsVersionLatestModification = (\n version?: DocumentVersion,\n otherVersion?: DocumentVersion\n): boolean => {\n if (!version || !version.updatedAt) {\n return false;\n }\n\n const versionUpdatedAt = version?.updatedAt ? new Date(version.updatedAt).getTime() : 0;\n\n const otherUpdatedAt = otherVersion?.updatedAt ? new Date(otherVersion.updatedAt).getTime() : 0;\n\n return versionUpdatedAt > otherUpdatedAt;\n};\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => ({\n /**\n * Returns available locales of a document for the current status\n */\n async getAvailableLocales(\n uid: UID.ContentType,\n version: DocumentVersion,\n allVersions: DocumentVersion[]\n ) {\n // Group all versions by locale\n const versionsByLocale = groupBy('locale', allVersions);\n\n // Delete the current locale\n if (version.locale) {\n delete versionsByLocale[version.locale];\n }\n\n // For each locale, get the ones with the same status\n // There will not be a draft and a version counterpart if the content\n // type does not have draft and publish\n const model = strapi.getModel(uid);\n\n const mappingResult = await async.map(\n Object.values(versionsByLocale),\n async (localeVersions: DocumentVersion[]) => {\n if (!contentTypes.hasDraftAndPublish(model)) {\n return localeVersions[0];\n }\n\n const draftVersion = localeVersions.find((v) => v.publishedAt === null);\n const otherVersions = localeVersions.filter((v) => v.id !== draftVersion?.id);\n\n if (!draftVersion) {\n return;\n }\n\n return {\n ...draftVersion,\n status: this.getStatus(draftVersion, otherVersions as any),\n };\n }\n );\n\n return (\n mappingResult\n // Filter just in case there is a document with no drafts\n .filter(Boolean) as unknown as DocumentMetadata['availableLocales']\n );\n },\n\n /**\n * Returns available status of a document for the current locale\n */\n getAvailableStatus(version: DocumentVersion, allVersions: DocumentVersion[]) {\n // Find the other status of the document\n const status =\n version.publishedAt !== null\n ? CONTENT_MANAGER_STATUS.DRAFT\n : CONTENT_MANAGER_STATUS.PUBLISHED;\n\n // Get version that match the current locale and not match the current status\n const availableStatus = allVersions.find((v) => {\n const matchLocale = v.locale === version.locale;\n const matchStatus = status === 'published' ? v.publishedAt !== null : v.publishedAt === null;\n return matchLocale && matchStatus;\n });\n\n if (!availableStatus) return availableStatus;\n\n // Pick status fields (at fields, status, by fields), use lodash fp\n return pick(AVAILABLE_STATUS_FIELDS, availableStatus);\n },\n\n /**\n * Get the available status of many documents, useful for batch operations\n * @param uid\n * @param documents\n * @returns\n */\n async getManyAvailableStatus(uid: UID.ContentType, documents: DocumentVersion[]) {\n if (!documents.length) return [];\n\n // The status and locale of all documents should be the same\n const status = documents[0].publishedAt !== null ? 'published' : 'draft';\n const locales = documents.map((d) => d.locale).filter(Boolean);\n\n const where: Record<string, any> = {\n documentId: { $in: documents.map((d) => d.documentId).filter(Boolean) },\n publishedAt: { $null: status === 'published' },\n };\n\n // If there is any locale to filter (if i18n is enabled)\n if (locales.length) {\n where.locale = { $in: locales };\n }\n\n return strapi.query(uid).findMany({\n where,\n select: ['id', 'documentId', 'locale', 'updatedAt', 'createdAt', 'publishedAt'],\n });\n },\n\n getStatus(version: DocumentVersion, otherDocumentStatuses?: DocumentMetadata['availableStatus']) {\n let draftVersion: DocumentVersion | undefined;\n let publishedVersion: DocumentVersion | undefined;\n\n if (version.publishedAt) {\n publishedVersion = version;\n } else {\n draftVersion = version;\n }\n\n const otherVersion = otherDocumentStatuses?.at(0);\n if (otherVersion?.publishedAt) {\n publishedVersion = otherVersion;\n } else if (otherVersion) {\n draftVersion = otherVersion;\n }\n\n if (!draftVersion) return CONTENT_MANAGER_STATUS.PUBLISHED;\n if (!publishedVersion) return CONTENT_MANAGER_STATUS.DRAFT;\n\n /*\n * The document is modified if the draft version has been updated more\n * recently than the published version.\n */\n const isDraftModified = getIsVersionLatestModification(draftVersion, publishedVersion);\n return isDraftModified ? CONTENT_MANAGER_STATUS.MODIFIED : CONTENT_MANAGER_STATUS.PUBLISHED;\n },\n\n // TODO is it necessary to return metadata on every page of the CM\n // We could refactor this so the locales are only loaded when they're\n // needed. e.g. in the bulk locale action modal.\n async getMetadata(\n uid: UID.ContentType,\n version: DocumentVersion,\n { availableLocales = true, availableStatus = true }: GetMetadataOptions = {}\n ) {\n // TODO: Ignore publishedAt if availableStatus=false, and ignore locale if\n // i18n is disabled\n const { populate = {}, fields = [] } = getPopulateForValidation(uid);\n\n const params = {\n populate: {\n ...populate,\n // NOTE: creator fields are selected in this way to avoid exposing sensitive data\n createdBy: {\n select: ['id', 'firstname', 'lastname', 'email'],\n },\n updatedBy: {\n select: ['id', 'firstname', 'lastname', 'email'],\n },\n },\n fields: uniq([...AVAILABLE_LOCALES_FIELDS, ...fields]),\n filters: {\n documentId: version.documentId,\n },\n };\n\n const dbParams = strapi.get('query-params').transform(uid, params);\n const versions = await strapi.db.query(uid).findMany(dbParams);\n\n // TODO: Remove use of available locales and use localizations instead\n const availableLocalesResult = availableLocales\n ? await this.getAvailableLocales(uid, version, versions)\n : [];\n\n const availableStatusResult = availableStatus\n ? this.getAvailableStatus(version, versions)\n : null;\n\n return {\n availableLocales: availableLocalesResult,\n availableStatus: availableStatusResult ? [availableStatusResult] : [],\n };\n },\n\n /**\n * Returns associated metadata of a document:\n * - Available locales of the document for the current status\n * - Available status of the document for the current locale\n */\n async formatDocumentWithMetadata(\n uid: UID.ContentType,\n document: DocumentVersion,\n opts: GetMetadataOptions = {}\n ) {\n if (!document) {\n return {\n data: document,\n meta: {\n availableLocales: [],\n availableStatus: [],\n },\n };\n }\n\n const hasDraftAndPublish = contentTypes.hasDraftAndPublish(strapi.getModel(uid));\n\n // Ignore available status if the content type does not have draft and publish\n if (!hasDraftAndPublish) {\n opts.availableStatus = false;\n }\n\n const meta = await this.getMetadata(uid, document, opts);\n\n // Populate localization statuses\n if (document.localizations) {\n const otherStatus = await this.getManyAvailableStatus(uid, document.localizations);\n\n document.localizations = document.localizations.map((d) => {\n const status = otherStatus.find(\n (s) => s.documentId === d.documentId && s.locale === d.locale\n );\n return {\n ...d,\n status: this.getStatus(d, status ? [status] : []),\n };\n });\n }\n\n return {\n data: {\n ...document,\n // Add status to the document only if draft and publish is enabled\n status: hasDraftAndPublish\n ? this.getStatus(document, meta.availableStatus as any)\n : undefined,\n },\n meta,\n };\n },\n});\n"],"names":["AVAILABLE_STATUS_FIELDS","AVAILABLE_LOCALES_FIELDS","CONTENT_MANAGER_STATUS","PUBLISHED","DRAFT","MODIFIED","getIsVersionLatestModification","version","otherVersion","updatedAt","versionUpdatedAt","Date","getTime","otherUpdatedAt","strapi","getAvailableLocales","uid","allVersions","versionsByLocale","groupBy","locale","model","getModel","mappingResult","async","map","Object","values","localeVersions","contentTypes","hasDraftAndPublish","draftVersion","find","v","publishedAt","otherVersions","filter","id","status","getStatus","Boolean","getAvailableStatus","availableStatus","matchLocale","matchStatus","pick","getManyAvailableStatus","documents","length","locales","d","where","documentId","$in","$null","query","findMany","select","otherDocumentStatuses","publishedVersion","at","isDraftModified","getMetadata","availableLocales","populate","fields","getPopulateForValidation","params","createdBy","updatedBy","uniq","filters","dbParams","get","transform","versions","db","availableLocalesResult","availableStatusResult","formatDocumentWithMetadata","document","opts","data","meta","localizations","otherStatus","s","undefined"],"mappings":"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"}
|
|
@@ -213,7 +213,7 @@ var documentMetadata = (({ strapi })=>({
|
|
|
213
213
|
if (document.localizations) {
|
|
214
214
|
const otherStatus = await this.getManyAvailableStatus(uid, document.localizations);
|
|
215
215
|
document.localizations = document.localizations.map((d)=>{
|
|
216
|
-
const status = otherStatus.find((s)=>s.documentId === d.documentId);
|
|
216
|
+
const status = otherStatus.find((s)=>s.documentId === d.documentId && s.locale === d.locale);
|
|
217
217
|
return {
|
|
218
218
|
...d,
|
|
219
219
|
status: this.getStatus(d, status ? [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"document-metadata.mjs","sources":["../../../server/src/services/document-metadata.ts"],"sourcesContent":["import { groupBy, pick, uniq } from 'lodash/fp';\n\nimport { async, contentTypes } from '@strapi/utils';\nimport type { Core, UID, Modules } from '@strapi/types';\n\nimport type { DocumentMetadata } from '../../../shared/contracts/collection-types';\nimport { getPopulateForValidation } from './utils/populate';\n\nexport interface DocumentVersion {\n id: string | number;\n documentId: Modules.Documents.ID;\n locale?: string;\n localizations?: DocumentVersion[];\n updatedAt?: string | null | Date;\n publishedAt?: string | null | Date;\n}\n\nconst AVAILABLE_STATUS_FIELDS = [\n 'id',\n 'documentId',\n 'locale',\n 'updatedAt',\n 'createdAt',\n 'publishedAt',\n 'createdBy',\n 'updatedBy',\n 'status',\n];\nconst AVAILABLE_LOCALES_FIELDS = [\n 'id',\n 'documentId',\n 'locale',\n 'updatedAt',\n 'createdAt',\n 'publishedAt',\n 'documentId',\n];\n\nconst CONTENT_MANAGER_STATUS = {\n PUBLISHED: 'published',\n DRAFT: 'draft',\n MODIFIED: 'modified',\n};\n\n/**\n * Controls the metadata properties to be returned\n *\n * If `availableLocales` is set to `true` (default), the returned metadata will include\n * the available locales of the document for its current status.\n *\n * If `availableStatus` is set to `true` (default), the returned metadata will include\n * the available status of the document for its current locale.\n */\nexport interface GetMetadataOptions {\n availableLocales?: boolean;\n availableStatus?: boolean;\n}\n\n/**\n * Checks if the provided document version has been modified after all other versions.\n */\nconst getIsVersionLatestModification = (\n version?: DocumentVersion,\n otherVersion?: DocumentVersion\n): boolean => {\n if (!version || !version.updatedAt) {\n return false;\n }\n\n const versionUpdatedAt = version?.updatedAt ? new Date(version.updatedAt).getTime() : 0;\n\n const otherUpdatedAt = otherVersion?.updatedAt ? new Date(otherVersion.updatedAt).getTime() : 0;\n\n return versionUpdatedAt > otherUpdatedAt;\n};\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => ({\n /**\n * Returns available locales of a document for the current status\n */\n async getAvailableLocales(\n uid: UID.ContentType,\n version: DocumentVersion,\n allVersions: DocumentVersion[]\n ) {\n // Group all versions by locale\n const versionsByLocale = groupBy('locale', allVersions);\n\n // Delete the current locale\n if (version.locale) {\n delete versionsByLocale[version.locale];\n }\n\n // For each locale, get the ones with the same status\n // There will not be a draft and a version counterpart if the content\n // type does not have draft and publish\n const model = strapi.getModel(uid);\n\n const mappingResult = await async.map(\n Object.values(versionsByLocale),\n async (localeVersions: DocumentVersion[]) => {\n if (!contentTypes.hasDraftAndPublish(model)) {\n return localeVersions[0];\n }\n\n const draftVersion = localeVersions.find((v) => v.publishedAt === null);\n const otherVersions = localeVersions.filter((v) => v.id !== draftVersion?.id);\n\n if (!draftVersion) {\n return;\n }\n\n return {\n ...draftVersion,\n status: this.getStatus(draftVersion, otherVersions as any),\n };\n }\n );\n\n return (\n mappingResult\n // Filter just in case there is a document with no drafts\n .filter(Boolean) as unknown as DocumentMetadata['availableLocales']\n );\n },\n\n /**\n * Returns available status of a document for the current locale\n */\n getAvailableStatus(version: DocumentVersion, allVersions: DocumentVersion[]) {\n // Find the other status of the document\n const status =\n version.publishedAt !== null\n ? CONTENT_MANAGER_STATUS.DRAFT\n : CONTENT_MANAGER_STATUS.PUBLISHED;\n\n // Get version that match the current locale and not match the current status\n const availableStatus = allVersions.find((v) => {\n const matchLocale = v.locale === version.locale;\n const matchStatus = status === 'published' ? v.publishedAt !== null : v.publishedAt === null;\n return matchLocale && matchStatus;\n });\n\n if (!availableStatus) return availableStatus;\n\n // Pick status fields (at fields, status, by fields), use lodash fp\n return pick(AVAILABLE_STATUS_FIELDS, availableStatus);\n },\n\n /**\n * Get the available status of many documents, useful for batch operations\n * @param uid\n * @param documents\n * @returns\n */\n async getManyAvailableStatus(uid: UID.ContentType, documents: DocumentVersion[]) {\n if (!documents.length) return [];\n\n // The status and locale of all documents should be the same\n const status = documents[0].publishedAt !== null ? 'published' : 'draft';\n const locales = documents.map((d) => d.locale).filter(Boolean);\n\n const where: Record<string, any> = {\n documentId: { $in: documents.map((d) => d.documentId).filter(Boolean) },\n publishedAt: { $null: status === 'published' },\n };\n\n // If there is any locale to filter (if i18n is enabled)\n if (locales.length) {\n where.locale = { $in: locales };\n }\n\n return strapi.query(uid).findMany({\n where,\n select: ['id', 'documentId', 'locale', 'updatedAt', 'createdAt', 'publishedAt'],\n });\n },\n\n getStatus(version: DocumentVersion, otherDocumentStatuses?: DocumentMetadata['availableStatus']) {\n let draftVersion: DocumentVersion | undefined;\n let publishedVersion: DocumentVersion | undefined;\n\n if (version.publishedAt) {\n publishedVersion = version;\n } else {\n draftVersion = version;\n }\n\n const otherVersion = otherDocumentStatuses?.at(0);\n if (otherVersion?.publishedAt) {\n publishedVersion = otherVersion;\n } else if (otherVersion) {\n draftVersion = otherVersion;\n }\n\n if (!draftVersion) return CONTENT_MANAGER_STATUS.PUBLISHED;\n if (!publishedVersion) return CONTENT_MANAGER_STATUS.DRAFT;\n\n /*\n * The document is modified if the draft version has been updated more\n * recently than the published version.\n */\n const isDraftModified = getIsVersionLatestModification(draftVersion, publishedVersion);\n return isDraftModified ? CONTENT_MANAGER_STATUS.MODIFIED : CONTENT_MANAGER_STATUS.PUBLISHED;\n },\n\n // TODO is it necessary to return metadata on every page of the CM\n // We could refactor this so the locales are only loaded when they're\n // needed. e.g. in the bulk locale action modal.\n async getMetadata(\n uid: UID.ContentType,\n version: DocumentVersion,\n { availableLocales = true, availableStatus = true }: GetMetadataOptions = {}\n ) {\n // TODO: Ignore publishedAt if availableStatus=false, and ignore locale if\n // i18n is disabled\n const { populate = {}, fields = [] } = getPopulateForValidation(uid);\n\n const params = {\n populate: {\n ...populate,\n // NOTE: creator fields are selected in this way to avoid exposing sensitive data\n createdBy: {\n select: ['id', 'firstname', 'lastname', 'email'],\n },\n updatedBy: {\n select: ['id', 'firstname', 'lastname', 'email'],\n },\n },\n fields: uniq([...AVAILABLE_LOCALES_FIELDS, ...fields]),\n filters: {\n documentId: version.documentId,\n },\n };\n\n const dbParams = strapi.get('query-params').transform(uid, params);\n const versions = await strapi.db.query(uid).findMany(dbParams);\n\n // TODO: Remove use of available locales and use localizations instead\n const availableLocalesResult = availableLocales\n ? await this.getAvailableLocales(uid, version, versions)\n : [];\n\n const availableStatusResult = availableStatus\n ? this.getAvailableStatus(version, versions)\n : null;\n\n return {\n availableLocales: availableLocalesResult,\n availableStatus: availableStatusResult ? [availableStatusResult] : [],\n };\n },\n\n /**\n * Returns associated metadata of a document:\n * - Available locales of the document for the current status\n * - Available status of the document for the current locale\n */\n async formatDocumentWithMetadata(\n uid: UID.ContentType,\n document: DocumentVersion,\n opts: GetMetadataOptions = {}\n ) {\n if (!document) {\n return {\n data: document,\n meta: {\n availableLocales: [],\n availableStatus: [],\n },\n };\n }\n\n const hasDraftAndPublish = contentTypes.hasDraftAndPublish(strapi.getModel(uid));\n\n // Ignore available status if the content type does not have draft and publish\n if (!hasDraftAndPublish) {\n opts.availableStatus = false;\n }\n\n const meta = await this.getMetadata(uid, document, opts);\n\n // Populate localization statuses\n if (document.localizations) {\n const otherStatus = await this.getManyAvailableStatus(uid, document.localizations);\n\n document.localizations = document.localizations.map((d) => {\n const status = otherStatus.find((s) => s.documentId === d.documentId);\n return {\n ...d,\n status: this.getStatus(d, status ? [status] : []),\n };\n });\n }\n\n return {\n data: {\n ...document,\n // Add status to the document only if draft and publish is enabled\n status: hasDraftAndPublish\n ? this.getStatus(document, meta.availableStatus as any)\n : undefined,\n },\n meta,\n };\n },\n});\n"],"names":["AVAILABLE_STATUS_FIELDS","AVAILABLE_LOCALES_FIELDS","CONTENT_MANAGER_STATUS","PUBLISHED","DRAFT","MODIFIED","getIsVersionLatestModification","version","otherVersion","updatedAt","versionUpdatedAt","Date","getTime","otherUpdatedAt","strapi","getAvailableLocales","uid","allVersions","versionsByLocale","groupBy","locale","model","getModel","mappingResult","async","map","Object","values","localeVersions","contentTypes","hasDraftAndPublish","draftVersion","find","v","publishedAt","otherVersions","filter","id","status","getStatus","Boolean","getAvailableStatus","availableStatus","matchLocale","matchStatus","pick","getManyAvailableStatus","documents","length","locales","d","where","documentId","$in","$null","query","findMany","select","otherDocumentStatuses","publishedVersion","at","isDraftModified","getMetadata","availableLocales","populate","fields","getPopulateForValidation","params","createdBy","updatedBy","uniq","filters","dbParams","get","transform","versions","db","availableLocalesResult","availableStatusResult","formatDocumentWithMetadata","document","opts","data","meta","localizations","otherStatus","s","undefined"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"document-metadata.mjs","sources":["../../../server/src/services/document-metadata.ts"],"sourcesContent":["import { groupBy, pick, uniq } from 'lodash/fp';\n\nimport { async, contentTypes } from '@strapi/utils';\nimport type { Core, UID, Modules } from '@strapi/types';\n\nimport type { DocumentMetadata } from '../../../shared/contracts/collection-types';\nimport { getPopulateForValidation } from './utils/populate';\n\nexport interface DocumentVersion {\n id: string | number;\n documentId: Modules.Documents.ID;\n locale?: string;\n localizations?: DocumentVersion[];\n updatedAt?: string | null | Date;\n publishedAt?: string | null | Date;\n}\n\nconst AVAILABLE_STATUS_FIELDS = [\n 'id',\n 'documentId',\n 'locale',\n 'updatedAt',\n 'createdAt',\n 'publishedAt',\n 'createdBy',\n 'updatedBy',\n 'status',\n];\nconst AVAILABLE_LOCALES_FIELDS = [\n 'id',\n 'documentId',\n 'locale',\n 'updatedAt',\n 'createdAt',\n 'publishedAt',\n 'documentId',\n];\n\nconst CONTENT_MANAGER_STATUS = {\n PUBLISHED: 'published',\n DRAFT: 'draft',\n MODIFIED: 'modified',\n};\n\n/**\n * Controls the metadata properties to be returned\n *\n * If `availableLocales` is set to `true` (default), the returned metadata will include\n * the available locales of the document for its current status.\n *\n * If `availableStatus` is set to `true` (default), the returned metadata will include\n * the available status of the document for its current locale.\n */\nexport interface GetMetadataOptions {\n availableLocales?: boolean;\n availableStatus?: boolean;\n}\n\n/**\n * Checks if the provided document version has been modified after all other versions.\n */\nconst getIsVersionLatestModification = (\n version?: DocumentVersion,\n otherVersion?: DocumentVersion\n): boolean => {\n if (!version || !version.updatedAt) {\n return false;\n }\n\n const versionUpdatedAt = version?.updatedAt ? new Date(version.updatedAt).getTime() : 0;\n\n const otherUpdatedAt = otherVersion?.updatedAt ? new Date(otherVersion.updatedAt).getTime() : 0;\n\n return versionUpdatedAt > otherUpdatedAt;\n};\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => ({\n /**\n * Returns available locales of a document for the current status\n */\n async getAvailableLocales(\n uid: UID.ContentType,\n version: DocumentVersion,\n allVersions: DocumentVersion[]\n ) {\n // Group all versions by locale\n const versionsByLocale = groupBy('locale', allVersions);\n\n // Delete the current locale\n if (version.locale) {\n delete versionsByLocale[version.locale];\n }\n\n // For each locale, get the ones with the same status\n // There will not be a draft and a version counterpart if the content\n // type does not have draft and publish\n const model = strapi.getModel(uid);\n\n const mappingResult = await async.map(\n Object.values(versionsByLocale),\n async (localeVersions: DocumentVersion[]) => {\n if (!contentTypes.hasDraftAndPublish(model)) {\n return localeVersions[0];\n }\n\n const draftVersion = localeVersions.find((v) => v.publishedAt === null);\n const otherVersions = localeVersions.filter((v) => v.id !== draftVersion?.id);\n\n if (!draftVersion) {\n return;\n }\n\n return {\n ...draftVersion,\n status: this.getStatus(draftVersion, otherVersions as any),\n };\n }\n );\n\n return (\n mappingResult\n // Filter just in case there is a document with no drafts\n .filter(Boolean) as unknown as DocumentMetadata['availableLocales']\n );\n },\n\n /**\n * Returns available status of a document for the current locale\n */\n getAvailableStatus(version: DocumentVersion, allVersions: DocumentVersion[]) {\n // Find the other status of the document\n const status =\n version.publishedAt !== null\n ? CONTENT_MANAGER_STATUS.DRAFT\n : CONTENT_MANAGER_STATUS.PUBLISHED;\n\n // Get version that match the current locale and not match the current status\n const availableStatus = allVersions.find((v) => {\n const matchLocale = v.locale === version.locale;\n const matchStatus = status === 'published' ? v.publishedAt !== null : v.publishedAt === null;\n return matchLocale && matchStatus;\n });\n\n if (!availableStatus) return availableStatus;\n\n // Pick status fields (at fields, status, by fields), use lodash fp\n return pick(AVAILABLE_STATUS_FIELDS, availableStatus);\n },\n\n /**\n * Get the available status of many documents, useful for batch operations\n * @param uid\n * @param documents\n * @returns\n */\n async getManyAvailableStatus(uid: UID.ContentType, documents: DocumentVersion[]) {\n if (!documents.length) return [];\n\n // The status and locale of all documents should be the same\n const status = documents[0].publishedAt !== null ? 'published' : 'draft';\n const locales = documents.map((d) => d.locale).filter(Boolean);\n\n const where: Record<string, any> = {\n documentId: { $in: documents.map((d) => d.documentId).filter(Boolean) },\n publishedAt: { $null: status === 'published' },\n };\n\n // If there is any locale to filter (if i18n is enabled)\n if (locales.length) {\n where.locale = { $in: locales };\n }\n\n return strapi.query(uid).findMany({\n where,\n select: ['id', 'documentId', 'locale', 'updatedAt', 'createdAt', 'publishedAt'],\n });\n },\n\n getStatus(version: DocumentVersion, otherDocumentStatuses?: DocumentMetadata['availableStatus']) {\n let draftVersion: DocumentVersion | undefined;\n let publishedVersion: DocumentVersion | undefined;\n\n if (version.publishedAt) {\n publishedVersion = version;\n } else {\n draftVersion = version;\n }\n\n const otherVersion = otherDocumentStatuses?.at(0);\n if (otherVersion?.publishedAt) {\n publishedVersion = otherVersion;\n } else if (otherVersion) {\n draftVersion = otherVersion;\n }\n\n if (!draftVersion) return CONTENT_MANAGER_STATUS.PUBLISHED;\n if (!publishedVersion) return CONTENT_MANAGER_STATUS.DRAFT;\n\n /*\n * The document is modified if the draft version has been updated more\n * recently than the published version.\n */\n const isDraftModified = getIsVersionLatestModification(draftVersion, publishedVersion);\n return isDraftModified ? CONTENT_MANAGER_STATUS.MODIFIED : CONTENT_MANAGER_STATUS.PUBLISHED;\n },\n\n // TODO is it necessary to return metadata on every page of the CM\n // We could refactor this so the locales are only loaded when they're\n // needed. e.g. in the bulk locale action modal.\n async getMetadata(\n uid: UID.ContentType,\n version: DocumentVersion,\n { availableLocales = true, availableStatus = true }: GetMetadataOptions = {}\n ) {\n // TODO: Ignore publishedAt if availableStatus=false, and ignore locale if\n // i18n is disabled\n const { populate = {}, fields = [] } = getPopulateForValidation(uid);\n\n const params = {\n populate: {\n ...populate,\n // NOTE: creator fields are selected in this way to avoid exposing sensitive data\n createdBy: {\n select: ['id', 'firstname', 'lastname', 'email'],\n },\n updatedBy: {\n select: ['id', 'firstname', 'lastname', 'email'],\n },\n },\n fields: uniq([...AVAILABLE_LOCALES_FIELDS, ...fields]),\n filters: {\n documentId: version.documentId,\n },\n };\n\n const dbParams = strapi.get('query-params').transform(uid, params);\n const versions = await strapi.db.query(uid).findMany(dbParams);\n\n // TODO: Remove use of available locales and use localizations instead\n const availableLocalesResult = availableLocales\n ? await this.getAvailableLocales(uid, version, versions)\n : [];\n\n const availableStatusResult = availableStatus\n ? this.getAvailableStatus(version, versions)\n : null;\n\n return {\n availableLocales: availableLocalesResult,\n availableStatus: availableStatusResult ? [availableStatusResult] : [],\n };\n },\n\n /**\n * Returns associated metadata of a document:\n * - Available locales of the document for the current status\n * - Available status of the document for the current locale\n */\n async formatDocumentWithMetadata(\n uid: UID.ContentType,\n document: DocumentVersion,\n opts: GetMetadataOptions = {}\n ) {\n if (!document) {\n return {\n data: document,\n meta: {\n availableLocales: [],\n availableStatus: [],\n },\n };\n }\n\n const hasDraftAndPublish = contentTypes.hasDraftAndPublish(strapi.getModel(uid));\n\n // Ignore available status if the content type does not have draft and publish\n if (!hasDraftAndPublish) {\n opts.availableStatus = false;\n }\n\n const meta = await this.getMetadata(uid, document, opts);\n\n // Populate localization statuses\n if (document.localizations) {\n const otherStatus = await this.getManyAvailableStatus(uid, document.localizations);\n\n document.localizations = document.localizations.map((d) => {\n const status = otherStatus.find(\n (s) => s.documentId === d.documentId && s.locale === d.locale\n );\n return {\n ...d,\n status: this.getStatus(d, status ? [status] : []),\n };\n });\n }\n\n return {\n data: {\n ...document,\n // Add status to the document only if draft and publish is enabled\n status: hasDraftAndPublish\n ? this.getStatus(document, meta.availableStatus as any)\n : undefined,\n },\n meta,\n };\n },\n});\n"],"names":["AVAILABLE_STATUS_FIELDS","AVAILABLE_LOCALES_FIELDS","CONTENT_MANAGER_STATUS","PUBLISHED","DRAFT","MODIFIED","getIsVersionLatestModification","version","otherVersion","updatedAt","versionUpdatedAt","Date","getTime","otherUpdatedAt","strapi","getAvailableLocales","uid","allVersions","versionsByLocale","groupBy","locale","model","getModel","mappingResult","async","map","Object","values","localeVersions","contentTypes","hasDraftAndPublish","draftVersion","find","v","publishedAt","otherVersions","filter","id","status","getStatus","Boolean","getAvailableStatus","availableStatus","matchLocale","matchStatus","pick","getManyAvailableStatus","documents","length","locales","d","where","documentId","$in","$null","query","findMany","select","otherDocumentStatuses","publishedVersion","at","isDraftModified","getMetadata","availableLocales","populate","fields","getPopulateForValidation","params","createdBy","updatedBy","uniq","filters","dbParams","get","transform","versions","db","availableLocalesResult","availableStatusResult","formatDocumentWithMetadata","document","opts","data","meta","localizations","otherStatus","s","undefined"],"mappings":"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"}
|
|
@@ -140,6 +140,17 @@ const isDynamicZone = fp.propEq('type', 'dynamiczone');
|
|
|
140
140
|
}
|
|
141
141
|
return populateAcc;
|
|
142
142
|
}
|
|
143
|
+
if (isMedia(attribute)) {
|
|
144
|
+
if (getDoesAttributeRequireValidation(attribute)) {
|
|
145
|
+
populateAcc.populate = populateAcc.populate || {};
|
|
146
|
+
populateAcc.populate[attributeName] = {
|
|
147
|
+
populate: {
|
|
148
|
+
folder: true
|
|
149
|
+
}
|
|
150
|
+
};
|
|
151
|
+
return populateAcc;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
143
154
|
if (isComponent(attribute)) {
|
|
144
155
|
// @ts-expect-error - should be a component
|
|
145
156
|
const component = attribute.component;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"populate.js","sources":["../../../../server/src/services/utils/populate.ts"],"sourcesContent":["import { merge, isEmpty, set, propEq } from 'lodash/fp';\nimport strapiUtils from '@strapi/utils';\nimport type { UID, Schema, Modules } from '@strapi/types';\nimport { getService } from '../../utils';\n\nconst { isVisibleAttribute, isScalarAttribute, getDoesAttributeRequireValidation } =\n strapiUtils.contentTypes;\nconst { isAnyToMany } = strapiUtils.relations;\nconst { PUBLISHED_AT_ATTRIBUTE } = strapiUtils.contentTypes.constants;\n\nconst isMorphToRelation = (attribute: any) =>\n isRelation(attribute) && attribute.relation.includes('morphTo');\nconst isMedia = propEq('type', 'media');\nconst isRelation = propEq('type', 'relation');\nconst isComponent = propEq('type', 'component');\nconst isDynamicZone = propEq('type', 'dynamiczone');\n\n// TODO: Import from @strapi/types when it's available there\ntype Model = Parameters<typeof isVisibleAttribute>[0];\nexport type Populate = Modules.EntityService.Params.Populate.Any<UID.Schema>;\n\ntype PopulateOptions = {\n initialPopulate?: Populate;\n countMany?: boolean;\n countOne?: boolean;\n maxLevel?: number;\n};\n\n/**\n * Populate the model for relation\n * @param attribute - Attribute containing a relation\n * @param attribute.relation - type of relation\n * @param model - Model of the populated entity\n * @param attributeName\n * @param options - Options to apply while populating\n */\nfunction getPopulateForRelation(\n attribute: Schema.Attribute.AnyAttribute,\n model: Model,\n attributeName: string,\n { countMany, countOne, initialPopulate }: PopulateOptions\n) {\n const isManyRelation = isAnyToMany(attribute);\n\n if (initialPopulate) {\n return initialPopulate;\n }\n\n // If populating localizations attribute, also include validatable fields\n // Mainly needed for bulk locale publishing, so the Client has all the information necessary to perform validations\n if (attributeName === 'localizations') {\n const validationPopulate = getPopulateForValidation(model.uid as UID.Schema);\n return {\n populate: validationPopulate.populate,\n };\n }\n\n // always populate createdBy, updatedBy, localizations etc.\n if (!isVisibleAttribute(model, attributeName)) {\n return true;\n }\n\n if ((isManyRelation && countMany) || (!isManyRelation && countOne)) {\n return { count: true };\n }\n\n return true;\n}\n\n/**\n * Populate the model for Dynamic Zone components\n * @param attribute - Attribute containing the components\n * @param attribute.components - IDs of components\n * @param options - Options to apply while populating\n */\nfunction getPopulateForDZ(\n attribute: Schema.Attribute.DynamicZone,\n options: PopulateOptions,\n level: number\n) {\n // Use fragments to populate the dynamic zone components\n const populatedComponents = (attribute.components || []).reduce(\n (acc: any, componentUID: UID.Component) => ({\n ...acc,\n [componentUID]: {\n populate: getDeepPopulate(componentUID, options, level + 1),\n },\n }),\n {}\n );\n\n return { on: populatedComponents };\n}\n\n/**\n * Get the populated value based on the type of the attribute\n * @param attributeName - Name of the attribute\n * @param model - Model of the populated entity\n * @param model.attributes\n * @param options - Options to apply while populating\n * @param options.countMany\n * @param options.countOne\n * @param options.maxLevel\n * @param level\n */\nfunction getPopulateFor(\n attributeName: string,\n model: any,\n options: PopulateOptions,\n level: number\n): { [key: string]: boolean | object } {\n const attribute = model.attributes[attributeName];\n\n switch (attribute.type) {\n case 'relation':\n // @ts-expect-error - TODO: support populate count typing\n return {\n [attributeName]: getPopulateForRelation(attribute, model, attributeName, options),\n };\n case 'component':\n return {\n [attributeName]: {\n populate: getDeepPopulate(attribute.component, options, level + 1),\n },\n };\n case 'media':\n return {\n [attributeName]: {\n populate: {\n folder: true,\n },\n },\n };\n case 'dynamiczone':\n return {\n [attributeName]: getPopulateForDZ(attribute, options, level),\n };\n default:\n return {};\n }\n}\n\n/**\n * Deeply populate a model based on UID\n * @param uid - Unique identifier of the model\n * @param options - Options to apply while populating\n * @param level - Current level of nested call\n */\nconst getDeepPopulate = (\n uid: UID.Schema,\n {\n initialPopulate = {} as any,\n countMany = false,\n countOne = false,\n maxLevel = Infinity,\n }: PopulateOptions = {},\n level = 1\n) => {\n if (level > maxLevel) {\n return {};\n }\n\n const model = strapi.getModel(uid);\n\n if (!model) {\n return {};\n }\n\n return Object.keys(model.attributes).reduce(\n (populateAcc, attributeName: string) =>\n merge(\n populateAcc,\n getPopulateFor(\n attributeName,\n model,\n {\n // @ts-expect-error - improve types\n initialPopulate: initialPopulate?.[attributeName],\n countMany,\n countOne,\n maxLevel,\n },\n level\n )\n ),\n {}\n );\n};\n\n/**\n * Deeply populate a model based on UID. Only populating fields that require validation.\n * @param uid - Unique identifier of the model\n * @param options - Options to apply while populating\n * @param level - Current level of nested call\n */\nconst getPopulateForValidation = (uid: UID.Schema): Record<string, any> => {\n const model = strapi.getModel(uid);\n if (!model) {\n return {};\n }\n\n return Object.entries(model.attributes).reduce((populateAcc: any, [attributeName, attribute]) => {\n if (isScalarAttribute(attribute)) {\n // If the scalar attribute requires validation, add it to the fields array\n if (getDoesAttributeRequireValidation(attribute)) {\n populateAcc.fields = populateAcc.fields || [];\n populateAcc.fields.push(attributeName);\n }\n return populateAcc;\n }\n\n if (isComponent(attribute)) {\n // @ts-expect-error - should be a component\n const component = attribute.component;\n\n // Get the validation result for this component\n const componentResult = getPopulateForValidation(component);\n\n if (Object.keys(componentResult).length > 0) {\n populateAcc.populate = populateAcc.populate || {};\n populateAcc.populate[attributeName] = componentResult;\n }\n\n return populateAcc;\n }\n\n if (isDynamicZone(attribute)) {\n const components = (attribute as Schema.Attribute.DynamicZone).components;\n // Handle dynamic zone components\n const componentsResult = (components || []).reduce(\n (acc, componentUID) => {\n // Get validation populate for this component\n const componentResult = getPopulateForValidation(componentUID);\n\n // Only include component if it has fields requiring validation\n if (Object.keys(componentResult).length > 0) {\n acc[componentUID] = componentResult;\n }\n\n return acc;\n },\n {} as Record<string, any>\n );\n\n // Only add to populate if we have components requiring validation\n if (Object.keys(componentsResult).length > 0) {\n populateAcc.populate = populateAcc.populate || {};\n populateAcc.populate[attributeName] = { on: componentsResult };\n }\n }\n\n return populateAcc;\n }, {});\n};\n\n/**\n * getDeepPopulateDraftCount works recursively on the attributes of a model\n * creating a populated object to count all the unpublished relations within the model\n * These relations can be direct to this content type or contained within components/dynamic zones\n * @param uid of the model\n * @returns result\n * @returns result.populate\n * @returns result.hasRelations\n */\nconst getDeepPopulateDraftCount = (uid: UID.Schema) => {\n const model = strapi.getModel(uid);\n let hasRelations = false;\n\n const populate = Object.keys(model.attributes).reduce((populateAcc: any, attributeName) => {\n const attribute: Schema.Attribute.AnyAttribute = model.attributes[attributeName];\n\n switch (attribute.type) {\n case 'relation': {\n // TODO: Support polymorphic relations\n const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph');\n if (isMorphRelation) {\n break;\n }\n\n if (isVisibleAttribute(model, attributeName)) {\n populateAcc[attributeName] = {\n count: true,\n filters: { [PUBLISHED_AT_ATTRIBUTE]: { $null: true } },\n };\n hasRelations = true;\n }\n break;\n }\n case 'component': {\n const { populate, hasRelations: childHasRelations } = getDeepPopulateDraftCount(\n attribute.component\n );\n if (childHasRelations) {\n populateAcc[attributeName] = {\n populate,\n };\n hasRelations = true;\n }\n break;\n }\n case 'dynamiczone': {\n const dzPopulateFragment = attribute.components?.reduce((acc, componentUID) => {\n const { populate: componentPopulate, hasRelations: componentHasRelations } =\n getDeepPopulateDraftCount(componentUID);\n\n if (componentHasRelations) {\n hasRelations = true;\n\n return { ...acc, [componentUID]: { populate: componentPopulate } };\n }\n\n return acc;\n }, {});\n\n if (!isEmpty(dzPopulateFragment)) {\n populateAcc[attributeName] = { on: dzPopulateFragment };\n }\n break;\n }\n default:\n }\n\n return populateAcc;\n }, {});\n\n return { populate, hasRelations };\n};\n\n/**\n * Create a Strapi populate object which populates all attribute fields of a Strapi query.\n */\nconst getQueryPopulate = async (uid: UID.Schema, query: object): Promise<Populate> => {\n let populateQuery: Populate = {};\n\n await strapiUtils.traverse.traverseQueryFilters(\n /**\n *\n * @param {Object} param0\n * @param {string} param0.key - Attribute name\n * @param {Object} param0.attribute - Attribute definition\n * @param {string} param0.path - Content Type path to the attribute\n * @returns\n */\n ({ attribute, path }: any) => {\n // TODO: handle dynamic zones and morph relations\n if (!attribute || isDynamicZone(attribute) || isMorphToRelation(attribute)) {\n return;\n }\n\n // Populate all relations, components and media\n if (isRelation(attribute) || isMedia(attribute) || isComponent(attribute)) {\n const populatePath = path.attribute.replace(/\\./g, '.populate.');\n // @ts-expect-error - lodash doesn't resolve the Populate type correctly\n populateQuery = set(populatePath, {}, populateQuery);\n }\n },\n { schema: strapi.getModel(uid), getModel: strapi.getModel.bind(strapi) },\n query\n );\n\n return populateQuery;\n};\n\nconst buildDeepPopulate = (uid: UID.CollectionType) => {\n return getService('populate-builder')(uid).populateDeep(Infinity).countRelations().build();\n};\n\nexport {\n getDeepPopulate,\n getDeepPopulateDraftCount,\n getPopulateForValidation,\n getQueryPopulate,\n buildDeepPopulate,\n};\n"],"names":["isVisibleAttribute","isScalarAttribute","getDoesAttributeRequireValidation","strapiUtils","contentTypes","isAnyToMany","relations","PUBLISHED_AT_ATTRIBUTE","constants","isMorphToRelation","attribute","isRelation","relation","includes","isMedia","propEq","isComponent","isDynamicZone","getPopulateForRelation","model","attributeName","countMany","countOne","initialPopulate","isManyRelation","validationPopulate","getPopulateForValidation","uid","populate","count","getPopulateForDZ","options","level","populatedComponents","components","reduce","acc","componentUID","getDeepPopulate","on","getPopulateFor","attributes","type","component","folder","maxLevel","Infinity","strapi","getModel","Object","keys","populateAcc","merge","entries","fields","push","componentResult","length","componentsResult","getDeepPopulateDraftCount","hasRelations","isMorphRelation","toLowerCase","startsWith","filters","$null","childHasRelations","dzPopulateFragment","componentPopulate","componentHasRelations","isEmpty","getQueryPopulate","query","populateQuery","traverse","traverseQueryFilters","path","populatePath","replace","set","schema","bind","buildDeepPopulate","getService","populateDeep","countRelations","build"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"populate.js","sources":["../../../../server/src/services/utils/populate.ts"],"sourcesContent":["import { merge, isEmpty, set, propEq } from 'lodash/fp';\nimport strapiUtils from '@strapi/utils';\nimport type { UID, Schema, Modules } from '@strapi/types';\nimport { getService } from '../../utils';\n\nconst { isVisibleAttribute, isScalarAttribute, getDoesAttributeRequireValidation } =\n strapiUtils.contentTypes;\nconst { isAnyToMany } = strapiUtils.relations;\nconst { PUBLISHED_AT_ATTRIBUTE } = strapiUtils.contentTypes.constants;\n\nconst isMorphToRelation = (attribute: any) =>\n isRelation(attribute) && attribute.relation.includes('morphTo');\nconst isMedia = propEq('type', 'media');\nconst isRelation = propEq('type', 'relation');\nconst isComponent = propEq('type', 'component');\nconst isDynamicZone = propEq('type', 'dynamiczone');\n\n// TODO: Import from @strapi/types when it's available there\ntype Model = Parameters<typeof isVisibleAttribute>[0];\nexport type Populate = Modules.EntityService.Params.Populate.Any<UID.Schema>;\n\ntype PopulateOptions = {\n initialPopulate?: Populate;\n countMany?: boolean;\n countOne?: boolean;\n maxLevel?: number;\n};\n\n/**\n * Populate the model for relation\n * @param attribute - Attribute containing a relation\n * @param attribute.relation - type of relation\n * @param model - Model of the populated entity\n * @param attributeName\n * @param options - Options to apply while populating\n */\nfunction getPopulateForRelation(\n attribute: Schema.Attribute.AnyAttribute,\n model: Model,\n attributeName: string,\n { countMany, countOne, initialPopulate }: PopulateOptions\n) {\n const isManyRelation = isAnyToMany(attribute);\n\n if (initialPopulate) {\n return initialPopulate;\n }\n\n // If populating localizations attribute, also include validatable fields\n // Mainly needed for bulk locale publishing, so the Client has all the information necessary to perform validations\n if (attributeName === 'localizations') {\n const validationPopulate = getPopulateForValidation(model.uid as UID.Schema);\n\n return {\n populate: validationPopulate.populate,\n };\n }\n\n // always populate createdBy, updatedBy, localizations etc.\n if (!isVisibleAttribute(model, attributeName)) {\n return true;\n }\n\n if ((isManyRelation && countMany) || (!isManyRelation && countOne)) {\n return { count: true };\n }\n\n return true;\n}\n\n/**\n * Populate the model for Dynamic Zone components\n * @param attribute - Attribute containing the components\n * @param attribute.components - IDs of components\n * @param options - Options to apply while populating\n */\nfunction getPopulateForDZ(\n attribute: Schema.Attribute.DynamicZone,\n options: PopulateOptions,\n level: number\n) {\n // Use fragments to populate the dynamic zone components\n const populatedComponents = (attribute.components || []).reduce(\n (acc: any, componentUID: UID.Component) => ({\n ...acc,\n [componentUID]: {\n populate: getDeepPopulate(componentUID, options, level + 1),\n },\n }),\n {}\n );\n\n return { on: populatedComponents };\n}\n\n/**\n * Get the populated value based on the type of the attribute\n * @param attributeName - Name of the attribute\n * @param model - Model of the populated entity\n * @param model.attributes\n * @param options - Options to apply while populating\n * @param options.countMany\n * @param options.countOne\n * @param options.maxLevel\n * @param level\n */\nfunction getPopulateFor(\n attributeName: string,\n model: any,\n options: PopulateOptions,\n level: number\n): { [key: string]: boolean | object } {\n const attribute = model.attributes[attributeName];\n\n switch (attribute.type) {\n case 'relation':\n // @ts-expect-error - TODO: support populate count typing\n return {\n [attributeName]: getPopulateForRelation(attribute, model, attributeName, options),\n };\n case 'component':\n return {\n [attributeName]: {\n populate: getDeepPopulate(attribute.component, options, level + 1),\n },\n };\n case 'media':\n return {\n [attributeName]: {\n populate: {\n folder: true,\n },\n },\n };\n case 'dynamiczone':\n return {\n [attributeName]: getPopulateForDZ(attribute, options, level),\n };\n default:\n return {};\n }\n}\n\n/**\n * Deeply populate a model based on UID\n * @param uid - Unique identifier of the model\n * @param options - Options to apply while populating\n * @param level - Current level of nested call\n */\nconst getDeepPopulate = (\n uid: UID.Schema,\n {\n initialPopulate = {} as any,\n countMany = false,\n countOne = false,\n maxLevel = Infinity,\n }: PopulateOptions = {},\n level = 1\n) => {\n if (level > maxLevel) {\n return {};\n }\n\n const model = strapi.getModel(uid);\n\n if (!model) {\n return {};\n }\n\n return Object.keys(model.attributes).reduce(\n (populateAcc, attributeName: string) =>\n merge(\n populateAcc,\n getPopulateFor(\n attributeName,\n model,\n {\n // @ts-expect-error - improve types\n initialPopulate: initialPopulate?.[attributeName],\n countMany,\n countOne,\n maxLevel,\n },\n level\n )\n ),\n {}\n );\n};\n\n/**\n * Deeply populate a model based on UID. Only populating fields that require validation.\n * @param uid - Unique identifier of the model\n * @param options - Options to apply while populating\n * @param level - Current level of nested call\n */\nconst getPopulateForValidation = (uid: UID.Schema): Record<string, any> => {\n const model = strapi.getModel(uid);\n if (!model) {\n return {};\n }\n\n return Object.entries(model.attributes).reduce((populateAcc: any, [attributeName, attribute]) => {\n if (isScalarAttribute(attribute)) {\n // If the scalar attribute requires validation, add it to the fields array\n if (getDoesAttributeRequireValidation(attribute)) {\n populateAcc.fields = populateAcc.fields || [];\n populateAcc.fields.push(attributeName);\n }\n return populateAcc;\n }\n\n if (isMedia(attribute)) {\n if (getDoesAttributeRequireValidation(attribute)) {\n populateAcc.populate = populateAcc.populate || {};\n populateAcc.populate[attributeName] = {\n populate: {\n folder: true,\n },\n };\n return populateAcc;\n }\n }\n\n if (isComponent(attribute)) {\n // @ts-expect-error - should be a component\n const component = attribute.component;\n\n // Get the validation result for this component\n const componentResult = getPopulateForValidation(component);\n\n if (Object.keys(componentResult).length > 0) {\n populateAcc.populate = populateAcc.populate || {};\n populateAcc.populate[attributeName] = componentResult;\n }\n\n return populateAcc;\n }\n\n if (isDynamicZone(attribute)) {\n const components = (attribute as Schema.Attribute.DynamicZone).components;\n // Handle dynamic zone components\n const componentsResult = (components || []).reduce(\n (acc, componentUID) => {\n // Get validation populate for this component\n const componentResult = getPopulateForValidation(componentUID);\n\n // Only include component if it has fields requiring validation\n if (Object.keys(componentResult).length > 0) {\n acc[componentUID] = componentResult;\n }\n\n return acc;\n },\n {} as Record<string, any>\n );\n\n // Only add to populate if we have components requiring validation\n if (Object.keys(componentsResult).length > 0) {\n populateAcc.populate = populateAcc.populate || {};\n populateAcc.populate[attributeName] = { on: componentsResult };\n }\n }\n\n return populateAcc;\n }, {});\n};\n\n/**\n * getDeepPopulateDraftCount works recursively on the attributes of a model\n * creating a populated object to count all the unpublished relations within the model\n * These relations can be direct to this content type or contained within components/dynamic zones\n * @param uid of the model\n * @returns result\n * @returns result.populate\n * @returns result.hasRelations\n */\nconst getDeepPopulateDraftCount = (uid: UID.Schema) => {\n const model = strapi.getModel(uid);\n let hasRelations = false;\n\n const populate = Object.keys(model.attributes).reduce((populateAcc: any, attributeName) => {\n const attribute: Schema.Attribute.AnyAttribute = model.attributes[attributeName];\n\n switch (attribute.type) {\n case 'relation': {\n // TODO: Support polymorphic relations\n const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph');\n if (isMorphRelation) {\n break;\n }\n\n if (isVisibleAttribute(model, attributeName)) {\n populateAcc[attributeName] = {\n count: true,\n filters: { [PUBLISHED_AT_ATTRIBUTE]: { $null: true } },\n };\n hasRelations = true;\n }\n break;\n }\n case 'component': {\n const { populate, hasRelations: childHasRelations } = getDeepPopulateDraftCount(\n attribute.component\n );\n if (childHasRelations) {\n populateAcc[attributeName] = {\n populate,\n };\n hasRelations = true;\n }\n break;\n }\n case 'dynamiczone': {\n const dzPopulateFragment = attribute.components?.reduce((acc, componentUID) => {\n const { populate: componentPopulate, hasRelations: componentHasRelations } =\n getDeepPopulateDraftCount(componentUID);\n\n if (componentHasRelations) {\n hasRelations = true;\n\n return { ...acc, [componentUID]: { populate: componentPopulate } };\n }\n\n return acc;\n }, {});\n\n if (!isEmpty(dzPopulateFragment)) {\n populateAcc[attributeName] = { on: dzPopulateFragment };\n }\n break;\n }\n default:\n }\n\n return populateAcc;\n }, {});\n\n return { populate, hasRelations };\n};\n\n/**\n * Create a Strapi populate object which populates all attribute fields of a Strapi query.\n */\nconst getQueryPopulate = async (uid: UID.Schema, query: object): Promise<Populate> => {\n let populateQuery: Populate = {};\n\n await strapiUtils.traverse.traverseQueryFilters(\n /**\n *\n * @param {Object} param0\n * @param {string} param0.key - Attribute name\n * @param {Object} param0.attribute - Attribute definition\n * @param {string} param0.path - Content Type path to the attribute\n * @returns\n */\n ({ attribute, path }: any) => {\n // TODO: handle dynamic zones and morph relations\n if (!attribute || isDynamicZone(attribute) || isMorphToRelation(attribute)) {\n return;\n }\n\n // Populate all relations, components and media\n if (isRelation(attribute) || isMedia(attribute) || isComponent(attribute)) {\n const populatePath = path.attribute.replace(/\\./g, '.populate.');\n // @ts-expect-error - lodash doesn't resolve the Populate type correctly\n populateQuery = set(populatePath, {}, populateQuery);\n }\n },\n { schema: strapi.getModel(uid), getModel: strapi.getModel.bind(strapi) },\n query\n );\n\n return populateQuery;\n};\n\nconst buildDeepPopulate = (uid: UID.CollectionType) => {\n return getService('populate-builder')(uid).populateDeep(Infinity).countRelations().build();\n};\n\nexport {\n getDeepPopulate,\n getDeepPopulateDraftCount,\n getPopulateForValidation,\n getQueryPopulate,\n buildDeepPopulate,\n};\n"],"names":["isVisibleAttribute","isScalarAttribute","getDoesAttributeRequireValidation","strapiUtils","contentTypes","isAnyToMany","relations","PUBLISHED_AT_ATTRIBUTE","constants","isMorphToRelation","attribute","isRelation","relation","includes","isMedia","propEq","isComponent","isDynamicZone","getPopulateForRelation","model","attributeName","countMany","countOne","initialPopulate","isManyRelation","validationPopulate","getPopulateForValidation","uid","populate","count","getPopulateForDZ","options","level","populatedComponents","components","reduce","acc","componentUID","getDeepPopulate","on","getPopulateFor","attributes","type","component","folder","maxLevel","Infinity","strapi","getModel","Object","keys","populateAcc","merge","entries","fields","push","componentResult","length","componentsResult","getDeepPopulateDraftCount","hasRelations","isMorphRelation","toLowerCase","startsWith","filters","$null","childHasRelations","dzPopulateFragment","componentPopulate","componentHasRelations","isEmpty","getQueryPopulate","query","populateQuery","traverse","traverseQueryFilters","path","populatePath","replace","set","schema","bind","buildDeepPopulate","getService","populateDeep","countRelations","build"],"mappings":"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"}
|
|
@@ -138,6 +138,17 @@ const isDynamicZone = propEq('type', 'dynamiczone');
|
|
|
138
138
|
}
|
|
139
139
|
return populateAcc;
|
|
140
140
|
}
|
|
141
|
+
if (isMedia(attribute)) {
|
|
142
|
+
if (getDoesAttributeRequireValidation(attribute)) {
|
|
143
|
+
populateAcc.populate = populateAcc.populate || {};
|
|
144
|
+
populateAcc.populate[attributeName] = {
|
|
145
|
+
populate: {
|
|
146
|
+
folder: true
|
|
147
|
+
}
|
|
148
|
+
};
|
|
149
|
+
return populateAcc;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
141
152
|
if (isComponent(attribute)) {
|
|
142
153
|
// @ts-expect-error - should be a component
|
|
143
154
|
const component = attribute.component;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"populate.mjs","sources":["../../../../server/src/services/utils/populate.ts"],"sourcesContent":["import { merge, isEmpty, set, propEq } from 'lodash/fp';\nimport strapiUtils from '@strapi/utils';\nimport type { UID, Schema, Modules } from '@strapi/types';\nimport { getService } from '../../utils';\n\nconst { isVisibleAttribute, isScalarAttribute, getDoesAttributeRequireValidation } =\n strapiUtils.contentTypes;\nconst { isAnyToMany } = strapiUtils.relations;\nconst { PUBLISHED_AT_ATTRIBUTE } = strapiUtils.contentTypes.constants;\n\nconst isMorphToRelation = (attribute: any) =>\n isRelation(attribute) && attribute.relation.includes('morphTo');\nconst isMedia = propEq('type', 'media');\nconst isRelation = propEq('type', 'relation');\nconst isComponent = propEq('type', 'component');\nconst isDynamicZone = propEq('type', 'dynamiczone');\n\n// TODO: Import from @strapi/types when it's available there\ntype Model = Parameters<typeof isVisibleAttribute>[0];\nexport type Populate = Modules.EntityService.Params.Populate.Any<UID.Schema>;\n\ntype PopulateOptions = {\n initialPopulate?: Populate;\n countMany?: boolean;\n countOne?: boolean;\n maxLevel?: number;\n};\n\n/**\n * Populate the model for relation\n * @param attribute - Attribute containing a relation\n * @param attribute.relation - type of relation\n * @param model - Model of the populated entity\n * @param attributeName\n * @param options - Options to apply while populating\n */\nfunction getPopulateForRelation(\n attribute: Schema.Attribute.AnyAttribute,\n model: Model,\n attributeName: string,\n { countMany, countOne, initialPopulate }: PopulateOptions\n) {\n const isManyRelation = isAnyToMany(attribute);\n\n if (initialPopulate) {\n return initialPopulate;\n }\n\n // If populating localizations attribute, also include validatable fields\n // Mainly needed for bulk locale publishing, so the Client has all the information necessary to perform validations\n if (attributeName === 'localizations') {\n const validationPopulate = getPopulateForValidation(model.uid as UID.Schema);\n return {\n populate: validationPopulate.populate,\n };\n }\n\n // always populate createdBy, updatedBy, localizations etc.\n if (!isVisibleAttribute(model, attributeName)) {\n return true;\n }\n\n if ((isManyRelation && countMany) || (!isManyRelation && countOne)) {\n return { count: true };\n }\n\n return true;\n}\n\n/**\n * Populate the model for Dynamic Zone components\n * @param attribute - Attribute containing the components\n * @param attribute.components - IDs of components\n * @param options - Options to apply while populating\n */\nfunction getPopulateForDZ(\n attribute: Schema.Attribute.DynamicZone,\n options: PopulateOptions,\n level: number\n) {\n // Use fragments to populate the dynamic zone components\n const populatedComponents = (attribute.components || []).reduce(\n (acc: any, componentUID: UID.Component) => ({\n ...acc,\n [componentUID]: {\n populate: getDeepPopulate(componentUID, options, level + 1),\n },\n }),\n {}\n );\n\n return { on: populatedComponents };\n}\n\n/**\n * Get the populated value based on the type of the attribute\n * @param attributeName - Name of the attribute\n * @param model - Model of the populated entity\n * @param model.attributes\n * @param options - Options to apply while populating\n * @param options.countMany\n * @param options.countOne\n * @param options.maxLevel\n * @param level\n */\nfunction getPopulateFor(\n attributeName: string,\n model: any,\n options: PopulateOptions,\n level: number\n): { [key: string]: boolean | object } {\n const attribute = model.attributes[attributeName];\n\n switch (attribute.type) {\n case 'relation':\n // @ts-expect-error - TODO: support populate count typing\n return {\n [attributeName]: getPopulateForRelation(attribute, model, attributeName, options),\n };\n case 'component':\n return {\n [attributeName]: {\n populate: getDeepPopulate(attribute.component, options, level + 1),\n },\n };\n case 'media':\n return {\n [attributeName]: {\n populate: {\n folder: true,\n },\n },\n };\n case 'dynamiczone':\n return {\n [attributeName]: getPopulateForDZ(attribute, options, level),\n };\n default:\n return {};\n }\n}\n\n/**\n * Deeply populate a model based on UID\n * @param uid - Unique identifier of the model\n * @param options - Options to apply while populating\n * @param level - Current level of nested call\n */\nconst getDeepPopulate = (\n uid: UID.Schema,\n {\n initialPopulate = {} as any,\n countMany = false,\n countOne = false,\n maxLevel = Infinity,\n }: PopulateOptions = {},\n level = 1\n) => {\n if (level > maxLevel) {\n return {};\n }\n\n const model = strapi.getModel(uid);\n\n if (!model) {\n return {};\n }\n\n return Object.keys(model.attributes).reduce(\n (populateAcc, attributeName: string) =>\n merge(\n populateAcc,\n getPopulateFor(\n attributeName,\n model,\n {\n // @ts-expect-error - improve types\n initialPopulate: initialPopulate?.[attributeName],\n countMany,\n countOne,\n maxLevel,\n },\n level\n )\n ),\n {}\n );\n};\n\n/**\n * Deeply populate a model based on UID. Only populating fields that require validation.\n * @param uid - Unique identifier of the model\n * @param options - Options to apply while populating\n * @param level - Current level of nested call\n */\nconst getPopulateForValidation = (uid: UID.Schema): Record<string, any> => {\n const model = strapi.getModel(uid);\n if (!model) {\n return {};\n }\n\n return Object.entries(model.attributes).reduce((populateAcc: any, [attributeName, attribute]) => {\n if (isScalarAttribute(attribute)) {\n // If the scalar attribute requires validation, add it to the fields array\n if (getDoesAttributeRequireValidation(attribute)) {\n populateAcc.fields = populateAcc.fields || [];\n populateAcc.fields.push(attributeName);\n }\n return populateAcc;\n }\n\n if (isComponent(attribute)) {\n // @ts-expect-error - should be a component\n const component = attribute.component;\n\n // Get the validation result for this component\n const componentResult = getPopulateForValidation(component);\n\n if (Object.keys(componentResult).length > 0) {\n populateAcc.populate = populateAcc.populate || {};\n populateAcc.populate[attributeName] = componentResult;\n }\n\n return populateAcc;\n }\n\n if (isDynamicZone(attribute)) {\n const components = (attribute as Schema.Attribute.DynamicZone).components;\n // Handle dynamic zone components\n const componentsResult = (components || []).reduce(\n (acc, componentUID) => {\n // Get validation populate for this component\n const componentResult = getPopulateForValidation(componentUID);\n\n // Only include component if it has fields requiring validation\n if (Object.keys(componentResult).length > 0) {\n acc[componentUID] = componentResult;\n }\n\n return acc;\n },\n {} as Record<string, any>\n );\n\n // Only add to populate if we have components requiring validation\n if (Object.keys(componentsResult).length > 0) {\n populateAcc.populate = populateAcc.populate || {};\n populateAcc.populate[attributeName] = { on: componentsResult };\n }\n }\n\n return populateAcc;\n }, {});\n};\n\n/**\n * getDeepPopulateDraftCount works recursively on the attributes of a model\n * creating a populated object to count all the unpublished relations within the model\n * These relations can be direct to this content type or contained within components/dynamic zones\n * @param uid of the model\n * @returns result\n * @returns result.populate\n * @returns result.hasRelations\n */\nconst getDeepPopulateDraftCount = (uid: UID.Schema) => {\n const model = strapi.getModel(uid);\n let hasRelations = false;\n\n const populate = Object.keys(model.attributes).reduce((populateAcc: any, attributeName) => {\n const attribute: Schema.Attribute.AnyAttribute = model.attributes[attributeName];\n\n switch (attribute.type) {\n case 'relation': {\n // TODO: Support polymorphic relations\n const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph');\n if (isMorphRelation) {\n break;\n }\n\n if (isVisibleAttribute(model, attributeName)) {\n populateAcc[attributeName] = {\n count: true,\n filters: { [PUBLISHED_AT_ATTRIBUTE]: { $null: true } },\n };\n hasRelations = true;\n }\n break;\n }\n case 'component': {\n const { populate, hasRelations: childHasRelations } = getDeepPopulateDraftCount(\n attribute.component\n );\n if (childHasRelations) {\n populateAcc[attributeName] = {\n populate,\n };\n hasRelations = true;\n }\n break;\n }\n case 'dynamiczone': {\n const dzPopulateFragment = attribute.components?.reduce((acc, componentUID) => {\n const { populate: componentPopulate, hasRelations: componentHasRelations } =\n getDeepPopulateDraftCount(componentUID);\n\n if (componentHasRelations) {\n hasRelations = true;\n\n return { ...acc, [componentUID]: { populate: componentPopulate } };\n }\n\n return acc;\n }, {});\n\n if (!isEmpty(dzPopulateFragment)) {\n populateAcc[attributeName] = { on: dzPopulateFragment };\n }\n break;\n }\n default:\n }\n\n return populateAcc;\n }, {});\n\n return { populate, hasRelations };\n};\n\n/**\n * Create a Strapi populate object which populates all attribute fields of a Strapi query.\n */\nconst getQueryPopulate = async (uid: UID.Schema, query: object): Promise<Populate> => {\n let populateQuery: Populate = {};\n\n await strapiUtils.traverse.traverseQueryFilters(\n /**\n *\n * @param {Object} param0\n * @param {string} param0.key - Attribute name\n * @param {Object} param0.attribute - Attribute definition\n * @param {string} param0.path - Content Type path to the attribute\n * @returns\n */\n ({ attribute, path }: any) => {\n // TODO: handle dynamic zones and morph relations\n if (!attribute || isDynamicZone(attribute) || isMorphToRelation(attribute)) {\n return;\n }\n\n // Populate all relations, components and media\n if (isRelation(attribute) || isMedia(attribute) || isComponent(attribute)) {\n const populatePath = path.attribute.replace(/\\./g, '.populate.');\n // @ts-expect-error - lodash doesn't resolve the Populate type correctly\n populateQuery = set(populatePath, {}, populateQuery);\n }\n },\n { schema: strapi.getModel(uid), getModel: strapi.getModel.bind(strapi) },\n query\n );\n\n return populateQuery;\n};\n\nconst buildDeepPopulate = (uid: UID.CollectionType) => {\n return getService('populate-builder')(uid).populateDeep(Infinity).countRelations().build();\n};\n\nexport {\n getDeepPopulate,\n getDeepPopulateDraftCount,\n getPopulateForValidation,\n getQueryPopulate,\n buildDeepPopulate,\n};\n"],"names":["isVisibleAttribute","isScalarAttribute","getDoesAttributeRequireValidation","strapiUtils","contentTypes","isAnyToMany","relations","PUBLISHED_AT_ATTRIBUTE","constants","isMorphToRelation","attribute","isRelation","relation","includes","isMedia","propEq","isComponent","isDynamicZone","getPopulateForRelation","model","attributeName","countMany","countOne","initialPopulate","isManyRelation","validationPopulate","getPopulateForValidation","uid","populate","count","getPopulateForDZ","options","level","populatedComponents","components","reduce","acc","componentUID","getDeepPopulate","on","getPopulateFor","attributes","type","component","folder","maxLevel","Infinity","strapi","getModel","Object","keys","populateAcc","merge","entries","fields","push","componentResult","length","componentsResult","getDeepPopulateDraftCount","hasRelations","isMorphRelation","toLowerCase","startsWith","filters","$null","childHasRelations","dzPopulateFragment","componentPopulate","componentHasRelations","isEmpty","getQueryPopulate","query","populateQuery","traverse","traverseQueryFilters","path","populatePath","replace","set","schema","bind","buildDeepPopulate","getService","populateDeep","countRelations","build"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"populate.mjs","sources":["../../../../server/src/services/utils/populate.ts"],"sourcesContent":["import { merge, isEmpty, set, propEq } from 'lodash/fp';\nimport strapiUtils from '@strapi/utils';\nimport type { UID, Schema, Modules } from '@strapi/types';\nimport { getService } from '../../utils';\n\nconst { isVisibleAttribute, isScalarAttribute, getDoesAttributeRequireValidation } =\n strapiUtils.contentTypes;\nconst { isAnyToMany } = strapiUtils.relations;\nconst { PUBLISHED_AT_ATTRIBUTE } = strapiUtils.contentTypes.constants;\n\nconst isMorphToRelation = (attribute: any) =>\n isRelation(attribute) && attribute.relation.includes('morphTo');\nconst isMedia = propEq('type', 'media');\nconst isRelation = propEq('type', 'relation');\nconst isComponent = propEq('type', 'component');\nconst isDynamicZone = propEq('type', 'dynamiczone');\n\n// TODO: Import from @strapi/types when it's available there\ntype Model = Parameters<typeof isVisibleAttribute>[0];\nexport type Populate = Modules.EntityService.Params.Populate.Any<UID.Schema>;\n\ntype PopulateOptions = {\n initialPopulate?: Populate;\n countMany?: boolean;\n countOne?: boolean;\n maxLevel?: number;\n};\n\n/**\n * Populate the model for relation\n * @param attribute - Attribute containing a relation\n * @param attribute.relation - type of relation\n * @param model - Model of the populated entity\n * @param attributeName\n * @param options - Options to apply while populating\n */\nfunction getPopulateForRelation(\n attribute: Schema.Attribute.AnyAttribute,\n model: Model,\n attributeName: string,\n { countMany, countOne, initialPopulate }: PopulateOptions\n) {\n const isManyRelation = isAnyToMany(attribute);\n\n if (initialPopulate) {\n return initialPopulate;\n }\n\n // If populating localizations attribute, also include validatable fields\n // Mainly needed for bulk locale publishing, so the Client has all the information necessary to perform validations\n if (attributeName === 'localizations') {\n const validationPopulate = getPopulateForValidation(model.uid as UID.Schema);\n\n return {\n populate: validationPopulate.populate,\n };\n }\n\n // always populate createdBy, updatedBy, localizations etc.\n if (!isVisibleAttribute(model, attributeName)) {\n return true;\n }\n\n if ((isManyRelation && countMany) || (!isManyRelation && countOne)) {\n return { count: true };\n }\n\n return true;\n}\n\n/**\n * Populate the model for Dynamic Zone components\n * @param attribute - Attribute containing the components\n * @param attribute.components - IDs of components\n * @param options - Options to apply while populating\n */\nfunction getPopulateForDZ(\n attribute: Schema.Attribute.DynamicZone,\n options: PopulateOptions,\n level: number\n) {\n // Use fragments to populate the dynamic zone components\n const populatedComponents = (attribute.components || []).reduce(\n (acc: any, componentUID: UID.Component) => ({\n ...acc,\n [componentUID]: {\n populate: getDeepPopulate(componentUID, options, level + 1),\n },\n }),\n {}\n );\n\n return { on: populatedComponents };\n}\n\n/**\n * Get the populated value based on the type of the attribute\n * @param attributeName - Name of the attribute\n * @param model - Model of the populated entity\n * @param model.attributes\n * @param options - Options to apply while populating\n * @param options.countMany\n * @param options.countOne\n * @param options.maxLevel\n * @param level\n */\nfunction getPopulateFor(\n attributeName: string,\n model: any,\n options: PopulateOptions,\n level: number\n): { [key: string]: boolean | object } {\n const attribute = model.attributes[attributeName];\n\n switch (attribute.type) {\n case 'relation':\n // @ts-expect-error - TODO: support populate count typing\n return {\n [attributeName]: getPopulateForRelation(attribute, model, attributeName, options),\n };\n case 'component':\n return {\n [attributeName]: {\n populate: getDeepPopulate(attribute.component, options, level + 1),\n },\n };\n case 'media':\n return {\n [attributeName]: {\n populate: {\n folder: true,\n },\n },\n };\n case 'dynamiczone':\n return {\n [attributeName]: getPopulateForDZ(attribute, options, level),\n };\n default:\n return {};\n }\n}\n\n/**\n * Deeply populate a model based on UID\n * @param uid - Unique identifier of the model\n * @param options - Options to apply while populating\n * @param level - Current level of nested call\n */\nconst getDeepPopulate = (\n uid: UID.Schema,\n {\n initialPopulate = {} as any,\n countMany = false,\n countOne = false,\n maxLevel = Infinity,\n }: PopulateOptions = {},\n level = 1\n) => {\n if (level > maxLevel) {\n return {};\n }\n\n const model = strapi.getModel(uid);\n\n if (!model) {\n return {};\n }\n\n return Object.keys(model.attributes).reduce(\n (populateAcc, attributeName: string) =>\n merge(\n populateAcc,\n getPopulateFor(\n attributeName,\n model,\n {\n // @ts-expect-error - improve types\n initialPopulate: initialPopulate?.[attributeName],\n countMany,\n countOne,\n maxLevel,\n },\n level\n )\n ),\n {}\n );\n};\n\n/**\n * Deeply populate a model based on UID. Only populating fields that require validation.\n * @param uid - Unique identifier of the model\n * @param options - Options to apply while populating\n * @param level - Current level of nested call\n */\nconst getPopulateForValidation = (uid: UID.Schema): Record<string, any> => {\n const model = strapi.getModel(uid);\n if (!model) {\n return {};\n }\n\n return Object.entries(model.attributes).reduce((populateAcc: any, [attributeName, attribute]) => {\n if (isScalarAttribute(attribute)) {\n // If the scalar attribute requires validation, add it to the fields array\n if (getDoesAttributeRequireValidation(attribute)) {\n populateAcc.fields = populateAcc.fields || [];\n populateAcc.fields.push(attributeName);\n }\n return populateAcc;\n }\n\n if (isMedia(attribute)) {\n if (getDoesAttributeRequireValidation(attribute)) {\n populateAcc.populate = populateAcc.populate || {};\n populateAcc.populate[attributeName] = {\n populate: {\n folder: true,\n },\n };\n return populateAcc;\n }\n }\n\n if (isComponent(attribute)) {\n // @ts-expect-error - should be a component\n const component = attribute.component;\n\n // Get the validation result for this component\n const componentResult = getPopulateForValidation(component);\n\n if (Object.keys(componentResult).length > 0) {\n populateAcc.populate = populateAcc.populate || {};\n populateAcc.populate[attributeName] = componentResult;\n }\n\n return populateAcc;\n }\n\n if (isDynamicZone(attribute)) {\n const components = (attribute as Schema.Attribute.DynamicZone).components;\n // Handle dynamic zone components\n const componentsResult = (components || []).reduce(\n (acc, componentUID) => {\n // Get validation populate for this component\n const componentResult = getPopulateForValidation(componentUID);\n\n // Only include component if it has fields requiring validation\n if (Object.keys(componentResult).length > 0) {\n acc[componentUID] = componentResult;\n }\n\n return acc;\n },\n {} as Record<string, any>\n );\n\n // Only add to populate if we have components requiring validation\n if (Object.keys(componentsResult).length > 0) {\n populateAcc.populate = populateAcc.populate || {};\n populateAcc.populate[attributeName] = { on: componentsResult };\n }\n }\n\n return populateAcc;\n }, {});\n};\n\n/**\n * getDeepPopulateDraftCount works recursively on the attributes of a model\n * creating a populated object to count all the unpublished relations within the model\n * These relations can be direct to this content type or contained within components/dynamic zones\n * @param uid of the model\n * @returns result\n * @returns result.populate\n * @returns result.hasRelations\n */\nconst getDeepPopulateDraftCount = (uid: UID.Schema) => {\n const model = strapi.getModel(uid);\n let hasRelations = false;\n\n const populate = Object.keys(model.attributes).reduce((populateAcc: any, attributeName) => {\n const attribute: Schema.Attribute.AnyAttribute = model.attributes[attributeName];\n\n switch (attribute.type) {\n case 'relation': {\n // TODO: Support polymorphic relations\n const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph');\n if (isMorphRelation) {\n break;\n }\n\n if (isVisibleAttribute(model, attributeName)) {\n populateAcc[attributeName] = {\n count: true,\n filters: { [PUBLISHED_AT_ATTRIBUTE]: { $null: true } },\n };\n hasRelations = true;\n }\n break;\n }\n case 'component': {\n const { populate, hasRelations: childHasRelations } = getDeepPopulateDraftCount(\n attribute.component\n );\n if (childHasRelations) {\n populateAcc[attributeName] = {\n populate,\n };\n hasRelations = true;\n }\n break;\n }\n case 'dynamiczone': {\n const dzPopulateFragment = attribute.components?.reduce((acc, componentUID) => {\n const { populate: componentPopulate, hasRelations: componentHasRelations } =\n getDeepPopulateDraftCount(componentUID);\n\n if (componentHasRelations) {\n hasRelations = true;\n\n return { ...acc, [componentUID]: { populate: componentPopulate } };\n }\n\n return acc;\n }, {});\n\n if (!isEmpty(dzPopulateFragment)) {\n populateAcc[attributeName] = { on: dzPopulateFragment };\n }\n break;\n }\n default:\n }\n\n return populateAcc;\n }, {});\n\n return { populate, hasRelations };\n};\n\n/**\n * Create a Strapi populate object which populates all attribute fields of a Strapi query.\n */\nconst getQueryPopulate = async (uid: UID.Schema, query: object): Promise<Populate> => {\n let populateQuery: Populate = {};\n\n await strapiUtils.traverse.traverseQueryFilters(\n /**\n *\n * @param {Object} param0\n * @param {string} param0.key - Attribute name\n * @param {Object} param0.attribute - Attribute definition\n * @param {string} param0.path - Content Type path to the attribute\n * @returns\n */\n ({ attribute, path }: any) => {\n // TODO: handle dynamic zones and morph relations\n if (!attribute || isDynamicZone(attribute) || isMorphToRelation(attribute)) {\n return;\n }\n\n // Populate all relations, components and media\n if (isRelation(attribute) || isMedia(attribute) || isComponent(attribute)) {\n const populatePath = path.attribute.replace(/\\./g, '.populate.');\n // @ts-expect-error - lodash doesn't resolve the Populate type correctly\n populateQuery = set(populatePath, {}, populateQuery);\n }\n },\n { schema: strapi.getModel(uid), getModel: strapi.getModel.bind(strapi) },\n query\n );\n\n return populateQuery;\n};\n\nconst buildDeepPopulate = (uid: UID.CollectionType) => {\n return getService('populate-builder')(uid).populateDeep(Infinity).countRelations().build();\n};\n\nexport {\n getDeepPopulate,\n getDeepPopulateDraftCount,\n getPopulateForValidation,\n getQueryPopulate,\n buildDeepPopulate,\n};\n"],"names":["isVisibleAttribute","isScalarAttribute","getDoesAttributeRequireValidation","strapiUtils","contentTypes","isAnyToMany","relations","PUBLISHED_AT_ATTRIBUTE","constants","isMorphToRelation","attribute","isRelation","relation","includes","isMedia","propEq","isComponent","isDynamicZone","getPopulateForRelation","model","attributeName","countMany","countOne","initialPopulate","isManyRelation","validationPopulate","getPopulateForValidation","uid","populate","count","getPopulateForDZ","options","level","populatedComponents","components","reduce","acc","componentUID","getDeepPopulate","on","getPopulateFor","attributes","type","component","folder","maxLevel","Infinity","strapi","getModel","Object","keys","populateAcc","merge","entries","fields","push","componentResult","length","componentsResult","getDeepPopulateDraftCount","hasRelations","isMorphRelation","toLowerCase","startsWith","filters","$null","childHasRelations","dzPopulateFragment","componentPopulate","componentHasRelations","isEmpty","getQueryPopulate","query","populateQuery","traverse","traverseQueryFilters","path","populatePath","replace","set","schema","bind","buildDeepPopulate","getService","populateDeep","countRelations","build"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relations.d.ts","sourceRoot":"","sources":["../../../../server/src/controllers/relations.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAgB,MAAM,eAAe,CAAC;;
|
|
1
|
+
{"version":3,"file":"relations.d.ts","sourceRoot":"","sources":["../../../../server/src/controllers/relations.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAgB,MAAM,eAAe,CAAC;;uCA+Ib,GAAG,OAAO,KAAK,EAAE;IA4H1D;;;;OAIG;uBACsB,GAAG;sBAwIJ,GAAG;;AA1Q7B,wBAkXE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lifecycles.d.ts","sourceRoot":"","sources":["../../../../../server/src/history/services/lifecycles.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAgB,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"lifecycles.d.ts","sourceRoot":"","sources":["../../../../../server/src/history/services/lifecycles.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAgB,MAAM,eAAe,CAAC;AA2FxD,QAAA,MAAM,uBAAuB,eAAgB;IAAE,MAAM,EAAE,KAAK,MAAM,CAAA;CAAE;;;CAoHnE,CAAC;AAEF,OAAO,EAAE,uBAAuB,EAAE,CAAC"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
|
-
import type { GetRecentDocuments } from '../../../../shared/contracts/homepage';
|
|
2
|
+
import type { GetRecentDocuments, GetCountDocuments } from '../../../../shared/contracts/homepage';
|
|
3
3
|
declare const createHomepageController: () => {
|
|
4
4
|
getRecentDocuments(ctx: import("koa").Context): Promise<GetRecentDocuments.Response>;
|
|
5
|
+
getCountDocuments(): Promise<GetCountDocuments.Response>;
|
|
5
6
|
};
|
|
6
7
|
export { createHomepageController };
|
|
7
8
|
//# sourceMappingURL=homepage.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"homepage.d.ts","sourceRoot":"","sources":["../../../../../server/src/homepage/controllers/homepage.ts"],"names":[],"mappings":";AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;
|
|
1
|
+
{"version":3,"file":"homepage.d.ts","sourceRoot":"","sources":["../../../../../server/src/homepage/controllers/homepage.ts"],"names":[],"mappings":";AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAEnG,QAAA,MAAM,wBAAwB;oDAWK,QAAQ,2BAA2B,CAAC;yBAkBxC,QAAQ,0BAA0B,CAAC;CAIjE,CAAC;AAEF,OAAO,EAAE,wBAAwB,EAAE,CAAC"}
|
|
@@ -7,8 +7,15 @@ declare const _default: {
|
|
|
7
7
|
homepage: ({ strapi }: {
|
|
8
8
|
strapi: import("@strapi/types/dist/core").Strapi;
|
|
9
9
|
}) => {
|
|
10
|
+
addStatusToDocuments(documents: import("../../../shared/contracts/homepage").RecentDocument[]): Promise<import("../../../shared/contracts/homepage").RecentDocument[]>;
|
|
11
|
+
queryLastDocuments(additionalQueryParams?: Record<string, unknown> | undefined, draftAndPublishOnly?: boolean | undefined): Promise<import("../../../shared/contracts/homepage").RecentDocument[]>;
|
|
10
12
|
getRecentlyPublishedDocuments(): Promise<import("../../../shared/contracts/homepage").RecentDocument[]>;
|
|
11
13
|
getRecentlyUpdatedDocuments(): Promise<import("../../../shared/contracts/homepage").RecentDocument[]>;
|
|
14
|
+
getCountDocuments(): Promise<{
|
|
15
|
+
draft: number;
|
|
16
|
+
published: number;
|
|
17
|
+
modified: number;
|
|
18
|
+
}>;
|
|
12
19
|
};
|
|
13
20
|
};
|
|
14
21
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../server/src/homepage/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../server/src/homepage/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAIA,wBAIE"}
|