@strapi/content-manager 5.59.0 → 5.61.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/constants/customOrder.js +14 -0
- package/dist/admin/constants/customOrder.js.map +1 -0
- package/dist/admin/constants/customOrder.mjs +10 -0
- package/dist/admin/constants/customOrder.mjs.map +1 -0
- package/dist/admin/history/components/VersionInputRenderer.js +2 -1
- package/dist/admin/history/components/VersionInputRenderer.js.map +1 -1
- package/dist/admin/history/components/VersionInputRenderer.mjs +2 -1
- package/dist/admin/history/components/VersionInputRenderer.mjs.map +1 -1
- package/dist/admin/hooks/useDocument.js +22 -11
- package/dist/admin/hooks/useDocument.js.map +1 -1
- package/dist/admin/hooks/useDocument.mjs +22 -11
- package/dist/admin/hooks/useDocument.mjs.map +1 -1
- package/dist/admin/hooks/useDocumentLayout.js.map +1 -1
- package/dist/admin/hooks/useDocumentLayout.mjs.map +1 -1
- package/dist/admin/hooks/useHasBeenNearViewport.js +70 -0
- package/dist/admin/hooks/useHasBeenNearViewport.js.map +1 -0
- package/dist/admin/hooks/useHasBeenNearViewport.mjs +46 -0
- package/dist/admin/hooks/useHasBeenNearViewport.mjs.map +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Image.js +102 -32
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Image.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Image.mjs +104 -35
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Image.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/List.js +20 -17
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/List.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/List.mjs +20 -17
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/List.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.js +15 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.mjs +17 -3
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/plugins/withStrapiSchema.js +21 -0
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/plugins/withStrapiSchema.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/plugins/withStrapiSchema.mjs +22 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/plugins/withStrapiSchema.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js +2 -0
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs +2 -0
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js +4 -7
- package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs +4 -7
- package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js +46 -10
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs +47 -11
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormLayout.js +201 -50
- package/dist/admin/pages/EditView/components/FormLayout.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormLayout.mjs +202 -52
- package/dist/admin/pages/EditView/components/FormLayout.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/InputRenderer.js +3 -1
- package/dist/admin/pages/EditView/components/InputRenderer.js.map +1 -1
- package/dist/admin/pages/EditView/components/InputRenderer.mjs +3 -1
- package/dist/admin/pages/EditView/components/InputRenderer.mjs.map +1 -1
- package/dist/admin/pages/ListConfiguration/components/Settings.js +31 -2
- package/dist/admin/pages/ListConfiguration/components/Settings.js.map +1 -1
- package/dist/admin/pages/ListConfiguration/components/Settings.mjs +31 -2
- package/dist/admin/pages/ListConfiguration/components/Settings.mjs.map +1 -1
- package/dist/admin/pages/ListView/ListViewPage.js +196 -132
- package/dist/admin/pages/ListView/ListViewPage.js.map +1 -1
- package/dist/admin/pages/ListView/ListViewPage.mjs +196 -132
- package/dist/admin/pages/ListView/ListViewPage.mjs.map +1 -1
- package/dist/admin/pages/ListView/components/CustomOrder.js +571 -0
- package/dist/admin/pages/ListView/components/CustomOrder.js.map +1 -0
- package/dist/admin/pages/ListView/components/CustomOrder.mjs +546 -0
- package/dist/admin/pages/ListView/components/CustomOrder.mjs.map +1 -0
- package/dist/admin/pages/ListView/components/TableActions.js +4 -1
- package/dist/admin/pages/ListView/components/TableActions.js.map +1 -1
- package/dist/admin/pages/ListView/components/TableActions.mjs +4 -1
- package/dist/admin/pages/ListView/components/TableActions.mjs.map +1 -1
- package/dist/admin/preview/components/PreviewSidePanel.js +2 -1
- package/dist/admin/preview/components/PreviewSidePanel.js.map +1 -1
- package/dist/admin/preview/components/PreviewSidePanel.mjs +2 -1
- package/dist/admin/preview/components/PreviewSidePanel.mjs.map +1 -1
- package/dist/admin/preview/utils/getPreviewUrlStatus.js +17 -0
- package/dist/admin/preview/utils/getPreviewUrlStatus.js.map +1 -0
- package/dist/admin/preview/utils/getPreviewUrlStatus.mjs +15 -0
- package/dist/admin/preview/utils/getPreviewUrlStatus.mjs.map +1 -0
- package/dist/admin/services/documents.js +22 -1
- package/dist/admin/services/documents.js.map +1 -1
- package/dist/admin/services/documents.mjs +21 -2
- package/dist/admin/services/documents.mjs.map +1 -1
- package/dist/admin/src/constants/customOrder.d.ts +8 -0
- package/dist/admin/src/exports.d.ts +1 -1
- package/dist/admin/src/history/components/VersionInputRenderer.d.ts +3 -1
- package/dist/admin/src/hooks/useDocument.d.ts +4 -0
- package/dist/admin/src/hooks/useDocumentLayout.d.ts +6 -2
- package/dist/admin/src/hooks/useHasBeenNearViewport.d.ts +13 -0
- package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/Blocks/Image.d.ts +13 -1
- package/dist/admin/src/pages/EditView/components/FormLayout.d.ts +11 -1
- package/dist/admin/src/pages/EditView/components/InputRenderer.d.ts +2 -0
- package/dist/admin/src/pages/ListView/components/CustomOrder.d.ts +72 -0
- package/dist/admin/src/preview/utils/getPreviewUrlStatus.d.ts +6 -0
- package/dist/admin/src/services/documents.d.ts +10 -2
- package/dist/admin/translations/en.json.js +9 -0
- package/dist/admin/translations/en.json.js.map +1 -1
- package/dist/admin/translations/en.json.mjs +9 -0
- package/dist/admin/translations/en.json.mjs.map +1 -1
- package/dist/server/audit-logs.js +36 -0
- package/dist/server/audit-logs.js.map +1 -0
- package/dist/server/audit-logs.mjs +33 -0
- package/dist/server/audit-logs.mjs.map +1 -0
- package/dist/server/bootstrap.js +8 -0
- package/dist/server/bootstrap.js.map +1 -1
- package/dist/server/bootstrap.mjs +8 -0
- package/dist/server/bootstrap.mjs.map +1 -1
- package/dist/server/controllers/collection-types.js +8 -0
- package/dist/server/controllers/collection-types.js.map +1 -1
- package/dist/server/controllers/collection-types.mjs +8 -0
- package/dist/server/controllers/collection-types.mjs.map +1 -1
- package/dist/server/controllers/content-types.js +15 -0
- package/dist/server/controllers/content-types.js.map +1 -1
- package/dist/server/controllers/content-types.mjs +16 -1
- package/dist/server/controllers/content-types.mjs.map +1 -1
- package/dist/server/controllers/index.js +3 -1
- package/dist/server/controllers/index.js.map +1 -1
- package/dist/server/controllers/index.mjs +2 -0
- package/dist/server/controllers/index.mjs.map +1 -1
- package/dist/server/controllers/relations.js +53 -17
- package/dist/server/controllers/relations.js.map +1 -1
- package/dist/server/controllers/relations.mjs +54 -18
- package/dist/server/controllers/relations.mjs.map +1 -1
- package/dist/server/controllers/single-types.js +10 -1
- package/dist/server/controllers/single-types.js.map +1 -1
- package/dist/server/controllers/single-types.mjs +10 -1
- package/dist/server/controllers/single-types.mjs.map +1 -1
- package/dist/server/controllers/validation/model-configuration.js +2 -1
- package/dist/server/controllers/validation/model-configuration.js.map +1 -1
- package/dist/server/controllers/validation/model-configuration.mjs +2 -1
- package/dist/server/controllers/validation/model-configuration.mjs.map +1 -1
- package/dist/server/custom-order/constants.js +21 -0
- package/dist/server/custom-order/constants.js.map +1 -0
- package/dist/server/custom-order/constants.mjs +17 -0
- package/dist/server/custom-order/constants.mjs.map +1 -0
- package/dist/server/custom-order/controllers/custom-order.js +77 -0
- package/dist/server/custom-order/controllers/custom-order.js.map +1 -0
- package/dist/server/custom-order/controllers/custom-order.mjs +75 -0
- package/dist/server/custom-order/controllers/custom-order.mjs.map +1 -0
- package/dist/server/custom-order/controllers/index.js +10 -0
- package/dist/server/custom-order/controllers/index.js.map +1 -0
- package/dist/server/custom-order/controllers/index.mjs +8 -0
- package/dist/server/custom-order/controllers/index.mjs.map +1 -0
- package/dist/server/custom-order/index.js +71 -0
- package/dist/server/custom-order/index.js.map +1 -0
- package/dist/server/custom-order/index.mjs +69 -0
- package/dist/server/custom-order/index.mjs.map +1 -0
- package/dist/server/custom-order/routes/custom-order.js +38 -0
- package/dist/server/custom-order/routes/custom-order.js.map +1 -0
- package/dist/server/custom-order/routes/custom-order.mjs +36 -0
- package/dist/server/custom-order/routes/custom-order.mjs.map +1 -0
- package/dist/server/custom-order/routes/index.js +13 -0
- package/dist/server/custom-order/routes/index.js.map +1 -0
- package/dist/server/custom-order/routes/index.mjs +11 -0
- package/dist/server/custom-order/routes/index.mjs.map +1 -0
- package/dist/server/custom-order/services/custom-order.js +286 -0
- package/dist/server/custom-order/services/custom-order.js.map +1 -0
- package/dist/server/custom-order/services/custom-order.mjs +284 -0
- package/dist/server/custom-order/services/custom-order.mjs.map +1 -0
- package/dist/server/custom-order/services/document-middleware.js +83 -0
- package/dist/server/custom-order/services/document-middleware.js.map +1 -0
- package/dist/server/custom-order/services/document-middleware.mjs +81 -0
- package/dist/server/custom-order/services/document-middleware.mjs.map +1 -0
- package/dist/server/custom-order/services/index.js +10 -0
- package/dist/server/custom-order/services/index.js.map +1 -0
- package/dist/server/custom-order/services/index.mjs +8 -0
- package/dist/server/custom-order/services/index.mjs.map +1 -0
- package/dist/server/custom-order/services/utils.js +152 -0
- package/dist/server/custom-order/services/utils.js.map +1 -0
- package/dist/server/custom-order/services/utils.mjs +148 -0
- package/dist/server/custom-order/services/utils.mjs.map +1 -0
- package/dist/server/custom-order/utils.js +13 -0
- package/dist/server/custom-order/utils.js.map +1 -0
- package/dist/server/custom-order/utils.mjs +10 -0
- package/dist/server/custom-order/utils.mjs.map +1 -0
- package/dist/server/history/constants.js +2 -1
- package/dist/server/history/constants.js.map +1 -1
- package/dist/server/history/constants.mjs +2 -1
- package/dist/server/history/constants.mjs.map +1 -1
- package/dist/server/history/controllers/history-version.js +6 -2
- package/dist/server/history/controllers/history-version.js.map +1 -1
- package/dist/server/history/controllers/history-version.mjs +6 -2
- package/dist/server/history/controllers/history-version.mjs.map +1 -1
- package/dist/server/history/services/history.js +24 -7
- package/dist/server/history/services/history.js.map +1 -1
- package/dist/server/history/services/history.mjs +25 -8
- package/dist/server/history/services/history.mjs.map +1 -1
- package/dist/server/history/services/lifecycles.js +2 -16
- package/dist/server/history/services/lifecycles.js.map +1 -1
- package/dist/server/history/services/lifecycles.mjs +2 -16
- package/dist/server/history/services/lifecycles.mjs.map +1 -1
- package/dist/server/mcp/schemas/filters-schema.js +10 -2
- package/dist/server/mcp/schemas/filters-schema.js.map +1 -1
- package/dist/server/mcp/schemas/filters-schema.mjs +10 -2
- package/dist/server/mcp/schemas/filters-schema.mjs.map +1 -1
- package/dist/server/preview/controllers/validation/preview.js +1 -1
- package/dist/server/preview/controllers/validation/preview.js.map +1 -1
- package/dist/server/preview/controllers/validation/preview.mjs +2 -2
- package/dist/server/preview/controllers/validation/preview.mjs.map +1 -1
- package/dist/server/register.js +4 -0
- package/dist/server/register.js.map +1 -1
- package/dist/server/register.mjs +4 -0
- package/dist/server/register.mjs.map +1 -1
- package/dist/server/routes/index.js +3 -1
- package/dist/server/routes/index.js.map +1 -1
- package/dist/server/routes/index.mjs +2 -0
- package/dist/server/routes/index.mjs.map +1 -1
- package/dist/server/services/content-types.js +2 -2
- package/dist/server/services/content-types.js.map +1 -1
- package/dist/server/services/content-types.mjs +2 -2
- package/dist/server/services/content-types.mjs.map +1 -1
- package/dist/server/services/document-manager.js +13 -0
- package/dist/server/services/document-manager.js.map +1 -1
- package/dist/server/services/document-manager.mjs +14 -1
- 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/index.js +3 -1
- package/dist/server/services/index.js.map +1 -1
- package/dist/server/services/index.mjs +2 -0
- package/dist/server/services/index.mjs.map +1 -1
- package/dist/server/services/utils/configuration/settings.js +2 -1
- package/dist/server/services/utils/configuration/settings.js.map +1 -1
- package/dist/server/services/utils/configuration/settings.mjs +2 -1
- package/dist/server/services/utils/configuration/settings.mjs.map +1 -1
- package/dist/server/src/audit-logs.d.ts +40 -0
- package/dist/server/src/audit-logs.d.ts.map +1 -0
- package/dist/server/src/bootstrap.d.ts.map +1 -1
- package/dist/server/src/controllers/collection-types.d.ts +1 -1
- package/dist/server/src/controllers/collection-types.d.ts.map +1 -1
- package/dist/server/src/controllers/content-types.d.ts.map +1 -1
- package/dist/server/src/controllers/index.d.ts +21 -3
- package/dist/server/src/controllers/index.d.ts.map +1 -1
- package/dist/server/src/controllers/relations.d.ts +19 -1
- package/dist/server/src/controllers/relations.d.ts.map +1 -1
- package/dist/server/src/controllers/single-types.d.ts +1 -1
- package/dist/server/src/controllers/single-types.d.ts.map +1 -1
- package/dist/server/src/custom-order/constants.d.ts +18 -0
- package/dist/server/src/custom-order/constants.d.ts.map +1 -0
- package/dist/server/src/custom-order/controllers/custom-order.d.ts +8 -0
- package/dist/server/src/custom-order/controllers/custom-order.d.ts.map +1 -0
- package/dist/server/src/custom-order/controllers/index.d.ts +3 -0
- package/dist/server/src/custom-order/controllers/index.d.ts.map +1 -0
- package/dist/server/src/custom-order/index.d.ts +8 -0
- package/dist/server/src/custom-order/index.d.ts.map +1 -0
- package/dist/server/src/custom-order/routes/custom-order.d.ts +4 -0
- package/dist/server/src/custom-order/routes/custom-order.d.ts.map +1 -0
- package/dist/server/src/custom-order/routes/index.d.ts +10 -0
- package/dist/server/src/custom-order/routes/index.d.ts.map +1 -0
- package/dist/server/src/custom-order/services/custom-order.d.ts +43 -0
- package/dist/server/src/custom-order/services/custom-order.d.ts.map +1 -0
- package/dist/server/src/custom-order/services/document-middleware.d.ts +16 -0
- package/dist/server/src/custom-order/services/document-middleware.d.ts.map +1 -0
- package/dist/server/src/custom-order/services/index.d.ts +24 -0
- package/dist/server/src/custom-order/services/index.d.ts.map +1 -0
- package/dist/server/src/custom-order/services/utils.d.ts +34 -0
- package/dist/server/src/custom-order/services/utils.d.ts.map +1 -0
- package/dist/server/src/custom-order/utils.d.ts +6 -0
- package/dist/server/src/custom-order/utils.d.ts.map +1 -0
- package/dist/server/src/history/constants.d.ts.map +1 -1
- package/dist/server/src/history/controllers/history-version.d.ts.map +1 -1
- package/dist/server/src/history/services/history.d.ts.map +1 -1
- package/dist/server/src/history/services/lifecycles.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +22 -6
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/mcp/schemas/filters-schema.d.ts.map +1 -1
- package/dist/server/src/register.d.ts.map +1 -1
- package/dist/server/src/routes/index.d.ts.map +1 -1
- package/dist/server/src/services/content-types.d.ts +1 -3
- package/dist/server/src/services/content-types.d.ts.map +1 -1
- package/dist/server/src/services/document-manager.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +1 -3
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/services/utils/configuration/settings.d.ts.map +1 -1
- package/dist/shared/contracts/content-types.d.ts +5 -0
- package/dist/shared/contracts/content-types.d.ts.map +1 -1
- package/dist/shared/contracts/custom-order.d.ts +33 -0
- package/dist/shared/contracts/custom-order.d.ts.map +1 -0
- package/dist/shared/contracts/custom-order.js +3 -0
- package/dist/shared/contracts/custom-order.js.map +1 -0
- package/dist/shared/contracts/custom-order.mjs +2 -0
- package/dist/shared/contracts/custom-order.mjs.map +1 -0
- package/dist/shared/contracts/history-versions.d.ts +0 -1
- package/dist/shared/contracts/history-versions.d.ts.map +1 -1
- package/dist/shared/contracts/index.d.ts +1 -0
- package/dist/shared/contracts/index.d.ts.map +1 -1
- package/dist/shared/contracts/index.js +2 -0
- package/dist/shared/contracts/index.js.map +1 -1
- package/dist/shared/contracts/index.mjs +2 -0
- package/dist/shared/contracts/index.mjs.map +1 -1
- package/package.json +10 -10
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { FUTURE_FLAG } from './constants.mjs';
|
|
2
|
+
|
|
3
|
+
function getService(strapi, name) {
|
|
4
|
+
// Cast is needed because the return type of strapi.service is too vague
|
|
5
|
+
return strapi.service(`plugin::content-manager.${name}`);
|
|
6
|
+
}
|
|
7
|
+
const isFeatureEnabled = (strapi)=>strapi.features.future.isEnabled(FUTURE_FLAG);
|
|
8
|
+
|
|
9
|
+
export { getService, isFeatureEnabled };
|
|
10
|
+
//# sourceMappingURL=utils.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.mjs","sources":["../../../server/src/custom-order/utils.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\n\nimport { FUTURE_FLAG } from './constants';\n\ntype CustomOrderServices = typeof import('./services').services;\n\nfunction getService<T extends keyof CustomOrderServices>(strapi: Core.Strapi, name: T) {\n // Cast is needed because the return type of strapi.service is too vague\n return strapi.service(`plugin::content-manager.${name}`) as ReturnType<CustomOrderServices[T]>;\n}\n\nconst isFeatureEnabled = (strapi: Core.Strapi) => strapi.features.future.isEnabled(FUTURE_FLAG);\n\nexport { getService, isFeatureEnabled };\n"],"names":["getService","strapi","name","service","isFeatureEnabled","features","future","isEnabled","FUTURE_FLAG"],"mappings":";;AAMA,SAASA,UAAAA,CAAgDC,MAAmB,EAAEC,IAAO,EAAA;;AAEnF,IAAA,OAAOD,OAAOE,OAAO,CAAC,CAAC,wBAAwB,EAAED,IAAAA,CAAAA,CAAM,CAAA;AACzD;AAEA,MAAME,gBAAAA,GAAmB,CAACH,MAAAA,GAAwBA,MAAAA,CAAOI,QAAQ,CAACC,MAAM,CAACC,SAAS,CAACC,WAAAA;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sources":["../../../server/src/history/constants.ts"],"sourcesContent":["export const HISTORY_VERSION_UID = 'plugin::content-manager.history-version';\nexport const FIELDS_TO_IGNORE = [\n 'createdAt',\n 'updatedAt',\n 'publishedAt',\n 'createdBy',\n 'updatedBy',\n 'strapi_stage',\n 'strapi_assignee',\n];\n"],"names":["HISTORY_VERSION_UID","FIELDS_TO_IGNORE"],"mappings":";;AAAO,MAAMA,sBAAsB;MACtBC,gBAAAA,GAAmB;AAC9B,IAAA,WAAA;AACA,IAAA,WAAA;AACA,IAAA,aAAA;AACA,IAAA,WAAA;AACA,IAAA,WAAA;AACA,IAAA,cAAA;AACA,IAAA;;;;;;"}
|
|
1
|
+
{"version":3,"file":"constants.js","sources":["../../../server/src/history/constants.ts"],"sourcesContent":["export const HISTORY_VERSION_UID = 'plugin::content-manager.history-version';\nexport const FIELDS_TO_IGNORE = [\n 'createdAt',\n 'updatedAt',\n 'publishedAt',\n 'createdBy',\n 'updatedBy',\n 'strapi_stage',\n 'strapi_assignee',\n 'strapi_position',\n];\n"],"names":["HISTORY_VERSION_UID","FIELDS_TO_IGNORE"],"mappings":";;AAAO,MAAMA,sBAAsB;MACtBC,gBAAAA,GAAmB;AAC9B,IAAA,WAAA;AACA,IAAA,WAAA;AACA,IAAA,aAAA;AACA,IAAA,WAAA;AACA,IAAA,WAAA;AACA,IAAA,cAAA;AACA,IAAA,iBAAA;AACA,IAAA;;;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.mjs","sources":["../../../server/src/history/constants.ts"],"sourcesContent":["export const HISTORY_VERSION_UID = 'plugin::content-manager.history-version';\nexport const FIELDS_TO_IGNORE = [\n 'createdAt',\n 'updatedAt',\n 'publishedAt',\n 'createdBy',\n 'updatedBy',\n 'strapi_stage',\n 'strapi_assignee',\n];\n"],"names":["HISTORY_VERSION_UID","FIELDS_TO_IGNORE"],"mappings":"AAAO,MAAMA,sBAAsB;MACtBC,gBAAAA,GAAmB;AAC9B,IAAA,WAAA;AACA,IAAA,WAAA;AACA,IAAA,aAAA;AACA,IAAA,WAAA;AACA,IAAA,WAAA;AACA,IAAA,cAAA;AACA,IAAA;;;;;"}
|
|
1
|
+
{"version":3,"file":"constants.mjs","sources":["../../../server/src/history/constants.ts"],"sourcesContent":["export const HISTORY_VERSION_UID = 'plugin::content-manager.history-version';\nexport const FIELDS_TO_IGNORE = [\n 'createdAt',\n 'updatedAt',\n 'publishedAt',\n 'createdBy',\n 'updatedBy',\n 'strapi_stage',\n 'strapi_assignee',\n 'strapi_position',\n];\n"],"names":["HISTORY_VERSION_UID","FIELDS_TO_IGNORE"],"mappings":"AAAO,MAAMA,sBAAsB;MACtBC,gBAAAA,GAAmB;AAC9B,IAAA,WAAA;AACA,IAAA,WAAA;AACA,IAAA,aAAA;AACA,IAAA,WAAA;AACA,IAAA,WAAA;AACA,IAAA,cAAA;AACA,IAAA,iBAAA;AACA,IAAA;;;;;"}
|
|
@@ -13,7 +13,6 @@ var historyVersion = require('./validation/history-version.js');
|
|
|
13
13
|
let pageSizeNumber = 20;
|
|
14
14
|
if (page) {
|
|
15
15
|
const parsedPage = parseInt(page, 10);
|
|
16
|
-
pageNumber = parseInt(page, 10);
|
|
17
16
|
if (!Number.isNaN(parsedPage) && parsedPage >= 1) {
|
|
18
17
|
pageNumber = parsedPage;
|
|
19
18
|
}
|
|
@@ -93,7 +92,12 @@ const createHistoryVersionController = ({ strapi })=>{
|
|
|
93
92
|
if (permissionChecker.cannot.update()) {
|
|
94
93
|
throw new strapiUtils.errors.ForbiddenError();
|
|
95
94
|
}
|
|
96
|
-
|
|
95
|
+
// Version ids are positive integers, other values cannot match a version
|
|
96
|
+
const versionId = Number(request.params.versionId);
|
|
97
|
+
if (Number.isInteger(versionId) === false || versionId < 1) {
|
|
98
|
+
throw new strapiUtils.errors.NotFoundError('History version not found');
|
|
99
|
+
}
|
|
100
|
+
const restoredDocument = await utils.getService(strapi, 'history').restoreVersion(versionId);
|
|
97
101
|
return {
|
|
98
102
|
data: {
|
|
99
103
|
documentId: restoredDocument.documentId
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"history-version.js","sources":["../../../../server/src/history/controllers/history-version.ts"],"sourcesContent":["import { async, errors } from '@strapi/utils';\nimport type { Core, UID } from '@strapi/types';\nimport { pick } from 'lodash';\n\nimport { getService as getContentManagerService } from '../../utils';\nimport { getService } from '../utils';\nimport type { HistoryVersions } from '../../../../shared/contracts';\nimport { validateRestoreVersion } from './validation/history-version';\n\n/**\n * Parses pagination params and makes sure they're within valid ranges\n */\nconst getValidPagination = ({ page, pageSize }: { page: any; pageSize: any }) => {\n let pageNumber = 1;\n let pageSizeNumber = 20;\n\n if (page) {\n const parsedPage = parseInt(page, 10);\n
|
|
1
|
+
{"version":3,"file":"history-version.js","sources":["../../../../server/src/history/controllers/history-version.ts"],"sourcesContent":["import { async, errors } from '@strapi/utils';\nimport type { Core, UID } from '@strapi/types';\nimport { pick } from 'lodash';\n\nimport { getService as getContentManagerService } from '../../utils';\nimport { getService } from '../utils';\nimport type { HistoryVersions } from '../../../../shared/contracts';\nimport { validateRestoreVersion } from './validation/history-version';\n\n/**\n * Parses pagination params and makes sure they're within valid ranges\n */\nconst getValidPagination = ({ page, pageSize }: { page: any; pageSize: any }) => {\n let pageNumber = 1;\n let pageSizeNumber = 20;\n\n if (page) {\n const parsedPage = parseInt(page, 10);\n\n if (!Number.isNaN(parsedPage) && parsedPage >= 1) {\n pageNumber = parsedPage;\n }\n }\n\n if (pageSize) {\n const parsedPageSize = parseInt(pageSize, 10);\n\n if (!Number.isNaN(parsedPageSize) && parsedPageSize >= 1 && parsedPageSize <= 100) {\n pageSizeNumber = parsedPageSize;\n }\n }\n\n return { page: pageNumber, pageSize: pageSizeNumber };\n};\n\nconst createHistoryVersionController = ({ strapi }: { strapi: Core.Strapi }) => {\n return {\n async findMany(ctx) {\n const contentTypeUid = ctx.query.contentType as UID.ContentType;\n const isSingleType = strapi.getModel(contentTypeUid)?.kind === 'singleType';\n\n if (isSingleType && !contentTypeUid) {\n throw new errors.ForbiddenError('contentType is required');\n }\n\n if (!isSingleType && (!contentTypeUid || !ctx.query.documentId)) {\n throw new errors.ForbiddenError('contentType and documentId are required');\n }\n\n /**\n * There are no permissions specifically for history versions,\n * but we need to check that the user can read the content type\n */\n const permissionChecker = getContentManagerService('permission-checker').create({\n userAbility: ctx.state.userAbility,\n model: ctx.query.contentType,\n });\n\n if (permissionChecker.cannot.read()) {\n return ctx.forbidden();\n }\n\n const query: HistoryVersions.GetHistoryVersions.Request['query'] =\n await permissionChecker.sanitizeQuery(ctx.query);\n\n const { results, pagination } = await getService(strapi, 'history').findVersionsPage({\n query: {\n ...query,\n ...getValidPagination({ page: query.page, pageSize: query.pageSize }),\n },\n state: { userAbility: ctx.state.userAbility },\n });\n\n const sanitizedResults = await async.map(\n results,\n async (version: HistoryVersions.HistoryVersionDataResponse & { locale: string }) => {\n return {\n ...version,\n data: await permissionChecker.sanitizeOutput(version.data),\n createdBy: version.createdBy\n ? pick(version.createdBy, ['id', 'firstname', 'lastname', 'username', 'email'])\n : undefined,\n };\n }\n );\n\n return {\n data: sanitizedResults,\n meta: { pagination },\n };\n },\n\n async restoreVersion(ctx) {\n const request = ctx.request as unknown as HistoryVersions.RestoreHistoryVersion.Request;\n\n await validateRestoreVersion(request.body, 'contentType is required');\n\n const permissionChecker = getContentManagerService('permission-checker').create({\n userAbility: ctx.state.userAbility,\n model: request.body.contentType,\n });\n\n if (permissionChecker.cannot.update()) {\n throw new errors.ForbiddenError();\n }\n\n // Version ids are positive integers, other values cannot match a version\n const versionId = Number(request.params.versionId);\n if (Number.isInteger(versionId) === false || versionId < 1) {\n throw new errors.NotFoundError('History version not found');\n }\n\n const restoredDocument = await getService(strapi, 'history').restoreVersion(versionId);\n\n return {\n data: { documentId: restoredDocument.documentId },\n } satisfies HistoryVersions.RestoreHistoryVersion.Response;\n },\n } satisfies Core.Controller;\n};\n\nexport { createHistoryVersionController };\n"],"names":["getValidPagination","page","pageSize","pageNumber","pageSizeNumber","parsedPage","parseInt","Number","isNaN","parsedPageSize","createHistoryVersionController","strapi","findMany","ctx","contentTypeUid","query","contentType","isSingleType","getModel","kind","errors","ForbiddenError","documentId","permissionChecker","getContentManagerService","create","userAbility","state","model","cannot","read","forbidden","sanitizeQuery","results","pagination","getService","findVersionsPage","sanitizedResults","async","map","version","data","sanitizeOutput","createdBy","pick","undefined","meta","restoreVersion","request","validateRestoreVersion","body","update","versionId","params","isInteger","NotFoundError","restoredDocument"],"mappings":"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"}
|
|
@@ -11,7 +11,6 @@ import { validateRestoreVersion } from './validation/history-version.mjs';
|
|
|
11
11
|
let pageSizeNumber = 20;
|
|
12
12
|
if (page) {
|
|
13
13
|
const parsedPage = parseInt(page, 10);
|
|
14
|
-
pageNumber = parseInt(page, 10);
|
|
15
14
|
if (!Number.isNaN(parsedPage) && parsedPage >= 1) {
|
|
16
15
|
pageNumber = parsedPage;
|
|
17
16
|
}
|
|
@@ -91,7 +90,12 @@ const createHistoryVersionController = ({ strapi })=>{
|
|
|
91
90
|
if (permissionChecker.cannot.update()) {
|
|
92
91
|
throw new errors.ForbiddenError();
|
|
93
92
|
}
|
|
94
|
-
|
|
93
|
+
// Version ids are positive integers, other values cannot match a version
|
|
94
|
+
const versionId = Number(request.params.versionId);
|
|
95
|
+
if (Number.isInteger(versionId) === false || versionId < 1) {
|
|
96
|
+
throw new errors.NotFoundError('History version not found');
|
|
97
|
+
}
|
|
98
|
+
const restoredDocument = await getService$1(strapi, 'history').restoreVersion(versionId);
|
|
95
99
|
return {
|
|
96
100
|
data: {
|
|
97
101
|
documentId: restoredDocument.documentId
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"history-version.mjs","sources":["../../../../server/src/history/controllers/history-version.ts"],"sourcesContent":["import { async, errors } from '@strapi/utils';\nimport type { Core, UID } from '@strapi/types';\nimport { pick } from 'lodash';\n\nimport { getService as getContentManagerService } from '../../utils';\nimport { getService } from '../utils';\nimport type { HistoryVersions } from '../../../../shared/contracts';\nimport { validateRestoreVersion } from './validation/history-version';\n\n/**\n * Parses pagination params and makes sure they're within valid ranges\n */\nconst getValidPagination = ({ page, pageSize }: { page: any; pageSize: any }) => {\n let pageNumber = 1;\n let pageSizeNumber = 20;\n\n if (page) {\n const parsedPage = parseInt(page, 10);\n
|
|
1
|
+
{"version":3,"file":"history-version.mjs","sources":["../../../../server/src/history/controllers/history-version.ts"],"sourcesContent":["import { async, errors } from '@strapi/utils';\nimport type { Core, UID } from '@strapi/types';\nimport { pick } from 'lodash';\n\nimport { getService as getContentManagerService } from '../../utils';\nimport { getService } from '../utils';\nimport type { HistoryVersions } from '../../../../shared/contracts';\nimport { validateRestoreVersion } from './validation/history-version';\n\n/**\n * Parses pagination params and makes sure they're within valid ranges\n */\nconst getValidPagination = ({ page, pageSize }: { page: any; pageSize: any }) => {\n let pageNumber = 1;\n let pageSizeNumber = 20;\n\n if (page) {\n const parsedPage = parseInt(page, 10);\n\n if (!Number.isNaN(parsedPage) && parsedPage >= 1) {\n pageNumber = parsedPage;\n }\n }\n\n if (pageSize) {\n const parsedPageSize = parseInt(pageSize, 10);\n\n if (!Number.isNaN(parsedPageSize) && parsedPageSize >= 1 && parsedPageSize <= 100) {\n pageSizeNumber = parsedPageSize;\n }\n }\n\n return { page: pageNumber, pageSize: pageSizeNumber };\n};\n\nconst createHistoryVersionController = ({ strapi }: { strapi: Core.Strapi }) => {\n return {\n async findMany(ctx) {\n const contentTypeUid = ctx.query.contentType as UID.ContentType;\n const isSingleType = strapi.getModel(contentTypeUid)?.kind === 'singleType';\n\n if (isSingleType && !contentTypeUid) {\n throw new errors.ForbiddenError('contentType is required');\n }\n\n if (!isSingleType && (!contentTypeUid || !ctx.query.documentId)) {\n throw new errors.ForbiddenError('contentType and documentId are required');\n }\n\n /**\n * There are no permissions specifically for history versions,\n * but we need to check that the user can read the content type\n */\n const permissionChecker = getContentManagerService('permission-checker').create({\n userAbility: ctx.state.userAbility,\n model: ctx.query.contentType,\n });\n\n if (permissionChecker.cannot.read()) {\n return ctx.forbidden();\n }\n\n const query: HistoryVersions.GetHistoryVersions.Request['query'] =\n await permissionChecker.sanitizeQuery(ctx.query);\n\n const { results, pagination } = await getService(strapi, 'history').findVersionsPage({\n query: {\n ...query,\n ...getValidPagination({ page: query.page, pageSize: query.pageSize }),\n },\n state: { userAbility: ctx.state.userAbility },\n });\n\n const sanitizedResults = await async.map(\n results,\n async (version: HistoryVersions.HistoryVersionDataResponse & { locale: string }) => {\n return {\n ...version,\n data: await permissionChecker.sanitizeOutput(version.data),\n createdBy: version.createdBy\n ? pick(version.createdBy, ['id', 'firstname', 'lastname', 'username', 'email'])\n : undefined,\n };\n }\n );\n\n return {\n data: sanitizedResults,\n meta: { pagination },\n };\n },\n\n async restoreVersion(ctx) {\n const request = ctx.request as unknown as HistoryVersions.RestoreHistoryVersion.Request;\n\n await validateRestoreVersion(request.body, 'contentType is required');\n\n const permissionChecker = getContentManagerService('permission-checker').create({\n userAbility: ctx.state.userAbility,\n model: request.body.contentType,\n });\n\n if (permissionChecker.cannot.update()) {\n throw new errors.ForbiddenError();\n }\n\n // Version ids are positive integers, other values cannot match a version\n const versionId = Number(request.params.versionId);\n if (Number.isInteger(versionId) === false || versionId < 1) {\n throw new errors.NotFoundError('History version not found');\n }\n\n const restoredDocument = await getService(strapi, 'history').restoreVersion(versionId);\n\n return {\n data: { documentId: restoredDocument.documentId },\n } satisfies HistoryVersions.RestoreHistoryVersion.Response;\n },\n } satisfies Core.Controller;\n};\n\nexport { createHistoryVersionController };\n"],"names":["getValidPagination","page","pageSize","pageNumber","pageSizeNumber","parsedPage","parseInt","Number","isNaN","parsedPageSize","createHistoryVersionController","strapi","findMany","ctx","contentTypeUid","query","contentType","isSingleType","getModel","kind","errors","ForbiddenError","documentId","permissionChecker","getContentManagerService","create","userAbility","state","model","cannot","read","forbidden","sanitizeQuery","results","pagination","getService","findVersionsPage","sanitizedResults","async","map","version","data","sanitizeOutput","createdBy","pick","undefined","meta","restoreVersion","request","validateRestoreVersion","body","update","versionId","params","isInteger","NotFoundError","restoredDocument"],"mappings":";;;;;;AASA;;AAEC,IACD,MAAMA,kBAAAA,GAAqB,CAAC,EAAEC,IAAI,EAAEC,QAAQ,EAAgC,GAAA;AAC1E,IAAA,IAAIC,UAAAA,GAAa,CAAA;AACjB,IAAA,IAAIC,cAAAA,GAAiB,EAAA;AAErB,IAAA,IAAIH,IAAAA,EAAM;QACR,MAAMI,UAAAA,GAAaC,SAASL,IAAAA,EAAM,EAAA,CAAA;AAElC,QAAA,IAAI,CAACM,MAAAA,CAAOC,KAAK,CAACH,UAAAA,CAAAA,IAAeA,cAAc,CAAA,EAAG;YAChDF,UAAAA,GAAaE,UAAAA;AACf,QAAA;AACF,IAAA;AAEA,IAAA,IAAIH,QAAAA,EAAU;QACZ,MAAMO,cAAAA,GAAiBH,SAASJ,QAAAA,EAAU,EAAA,CAAA;QAE1C,IAAI,CAACK,OAAOC,KAAK,CAACC,mBAAmBA,cAAAA,IAAkB,CAAA,IAAKA,kBAAkB,GAAA,EAAK;YACjFL,cAAAA,GAAiBK,cAAAA;AACnB,QAAA;AACF,IAAA;IAEA,OAAO;QAAER,IAAAA,EAAME,UAAAA;QAAYD,QAAAA,EAAUE;AAAe,KAAA;AACtD,CAAA;AAEA,MAAMM,8BAAAA,GAAiC,CAAC,EAAEC,MAAM,EAA2B,GAAA;IACzE,OAAO;AACL,QAAA,MAAMC,UAASC,GAAG,EAAA;AAChB,YAAA,MAAMC,cAAAA,GAAiBD,GAAAA,CAAIE,KAAK,CAACC,WAAW;AAC5C,YAAA,MAAMC,YAAAA,GAAeN,MAAAA,CAAOO,QAAQ,CAACJ,iBAAiBK,IAAAA,KAAS,YAAA;YAE/D,IAAIF,YAAAA,IAAgB,CAACH,cAAAA,EAAgB;gBACnC,MAAM,IAAIM,MAAAA,CAAOC,cAAc,CAAC,yBAAA,CAAA;AAClC,YAAA;YAEA,IAAI,CAACJ,YAAAA,KAAiB,CAACH,cAAAA,IAAkB,CAACD,GAAAA,CAAIE,KAAK,CAACO,UAAS,CAAA,EAAI;gBAC/D,MAAM,IAAIF,MAAAA,CAAOC,cAAc,CAAC,yCAAA,CAAA;AAClC,YAAA;AAEA;;;AAGC,UACD,MAAME,iBAAAA,GAAoBC,UAAAA,CAAyB,oBAAA,CAAA,CAAsBC,MAAM,CAAC;gBAC9EC,WAAAA,EAAab,GAAAA,CAAIc,KAAK,CAACD,WAAW;gBAClCE,KAAAA,EAAOf,GAAAA,CAAIE,KAAK,CAACC;AACnB,aAAA,CAAA;AAEA,YAAA,IAAIO,iBAAAA,CAAkBM,MAAM,CAACC,IAAI,EAAA,EAAI;AACnC,gBAAA,OAAOjB,IAAIkB,SAAS,EAAA;AACtB,YAAA;AAEA,YAAA,MAAMhB,QACJ,MAAMQ,iBAAAA,CAAkBS,aAAa,CAACnB,IAAIE,KAAK,CAAA;YAEjD,MAAM,EAAEkB,OAAO,EAAEC,UAAU,EAAE,GAAG,MAAMC,YAAAA,CAAWxB,MAAAA,EAAQ,SAAA,CAAA,CAAWyB,gBAAgB,CAAC;gBACnFrB,KAAAA,EAAO;AACL,oBAAA,GAAGA,KAAK;AACR,oBAAA,GAAGf,kBAAAA,CAAmB;AAAEC,wBAAAA,IAAAA,EAAMc,MAAMd,IAAI;AAAEC,wBAAAA,QAAAA,EAAUa,MAAMb;qBAAS;AACrE,iBAAA;gBACAyB,KAAAA,EAAO;oBAAED,WAAAA,EAAab,GAAAA,CAAIc,KAAK,CAACD;AAAY;AAC9C,aAAA,CAAA;AAEA,YAAA,MAAMW,mBAAmB,MAAMC,KAAAA,CAAMC,GAAG,CACtCN,SACA,OAAOO,OAAAA,GAAAA;gBACL,OAAO;AACL,oBAAA,GAAGA,OAAO;AACVC,oBAAAA,IAAAA,EAAM,MAAMlB,iBAAAA,CAAkBmB,cAAc,CAACF,QAAQC,IAAI,CAAA;AACzDE,oBAAAA,SAAAA,EAAWH,QAAQG,SAAS,GACxBC,IAAAA,CAAKJ,OAAAA,CAAQG,SAAS,EAAE;AAAC,wBAAA,IAAA;AAAM,wBAAA,WAAA;AAAa,wBAAA,UAAA;AAAY,wBAAA,UAAA;AAAY,wBAAA;qBAAQ,CAAA,GAC5EE;AACN,iBAAA;AACF,YAAA,CAAA,CAAA;YAGF,OAAO;gBACLJ,IAAAA,EAAMJ,gBAAAA;gBACNS,IAAAA,EAAM;AAAEZ,oBAAAA;AAAW;AACrB,aAAA;AACF,QAAA,CAAA;AAEA,QAAA,MAAMa,gBAAelC,GAAG,EAAA;YACtB,MAAMmC,OAAAA,GAAUnC,IAAImC,OAAO;YAE3B,MAAMC,sBAAAA,CAAuBD,OAAAA,CAAQE,IAAI,EAAE,yBAAA,CAAA;AAE3C,YAAA,MAAM3B,iBAAAA,GAAoBC,UAAAA,CAAyB,oBAAA,CAAA,CAAsBC,MAAM,CAAC;gBAC9EC,WAAAA,EAAab,GAAAA,CAAIc,KAAK,CAACD,WAAW;gBAClCE,KAAAA,EAAOoB,OAAAA,CAAQE,IAAI,CAAClC;AACtB,aAAA,CAAA;AAEA,YAAA,IAAIO,iBAAAA,CAAkBM,MAAM,CAACsB,MAAM,EAAA,EAAI;gBACrC,MAAM,IAAI/B,OAAOC,cAAc,EAAA;AACjC,YAAA;;AAGA,YAAA,MAAM+B,SAAAA,GAAY7C,MAAAA,CAAOyC,OAAAA,CAAQK,MAAM,CAACD,SAAS,CAAA;AACjD,YAAA,IAAI7C,OAAO+C,SAAS,CAACF,SAAAA,CAAAA,KAAe,KAAA,IAASA,YAAY,CAAA,EAAG;gBAC1D,MAAM,IAAIhC,MAAAA,CAAOmC,aAAa,CAAC,2BAAA,CAAA;AACjC,YAAA;AAEA,YAAA,MAAMC,mBAAmB,MAAMrB,YAAAA,CAAWxB,MAAAA,EAAQ,SAAA,CAAA,CAAWoC,cAAc,CAACK,SAAAA,CAAAA;YAE5E,OAAO;gBACLX,IAAAA,EAAM;AAAEnB,oBAAAA,UAAAA,EAAYkC,iBAAiBlC;AAAW;AAClD,aAAA;AACF,QAAA;AACF,KAAA;AACF;;;;"}
|
|
@@ -5,6 +5,7 @@ var _ = require('lodash');
|
|
|
5
5
|
var constants = require('../constants.js');
|
|
6
6
|
var utils = require('./utils.js');
|
|
7
7
|
var index = require('../../utils/index.js');
|
|
8
|
+
var auditLogs = require('../../audit-logs.js');
|
|
8
9
|
|
|
9
10
|
const createHistoryService = ({ strapi })=>{
|
|
10
11
|
const query = strapi.db.query(constants.HISTORY_VERSION_UID);
|
|
@@ -80,15 +81,16 @@ const createHistoryService = ({ strapi })=>{
|
|
|
80
81
|
const results = ids.map((id)=>versionsById.get(id)).filter(Boolean);
|
|
81
82
|
const populateEntry = async (entry)=>{
|
|
82
83
|
return strapiUtils.traverseEntity(async (options, utils)=>{
|
|
84
|
+
if (options.key === 'id' && options.schema.modelType === 'component') {
|
|
85
|
+
// Ids on components throw an error when restoring
|
|
86
|
+
utils.remove('id');
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
83
89
|
if (!options.attribute) return;
|
|
84
90
|
if (!options.value) return;
|
|
85
91
|
const currentValue = Array.isArray(options.value) ? options.value : [
|
|
86
92
|
options.value
|
|
87
93
|
];
|
|
88
|
-
if (options.attribute.type === 'component') {
|
|
89
|
-
// Ids on components throw an error when restoring
|
|
90
|
-
utils.remove('id');
|
|
91
|
-
}
|
|
92
94
|
if (options.attribute.type === 'relation' && // TODO: handle polymorphic relations
|
|
93
95
|
options.attribute.relation !== 'morphToOne' && options.attribute.relation !== 'morphToMany') {
|
|
94
96
|
if (options.attribute.target === 'admin::user') {
|
|
@@ -96,7 +98,7 @@ const createHistoryService = ({ strapi })=>{
|
|
|
96
98
|
if (userToPopulate == null) {
|
|
97
99
|
return null;
|
|
98
100
|
}
|
|
99
|
-
return strapi.query('admin::user').findOne({
|
|
101
|
+
return strapi.db.query('admin::user').findOne({
|
|
100
102
|
where: {
|
|
101
103
|
...userToPopulate.id ? {
|
|
102
104
|
id: userToPopulate.id
|
|
@@ -158,6 +160,9 @@ const createHistoryService = ({ strapi })=>{
|
|
|
158
160
|
id: versionId
|
|
159
161
|
}
|
|
160
162
|
});
|
|
163
|
+
if (version === null) {
|
|
164
|
+
throw new strapiUtils.errors.NotFoundError('History version not found');
|
|
165
|
+
}
|
|
161
166
|
const contentTypeSchemaAttributes = strapi.getModel(version.contentType).attributes;
|
|
162
167
|
const schemaDiff = serviceUtils.getSchemaAttributesDiff(version.schema, contentTypeSchemaAttributes);
|
|
163
168
|
// Set all added attribute values to null
|
|
@@ -170,10 +175,13 @@ const createHistoryService = ({ strapi })=>{
|
|
|
170
175
|
const schema = structuredClone(version.schema);
|
|
171
176
|
schema.attributes = _.omit(contentTypeSchemaAttributes, constants.FIELDS_TO_IGNORE);
|
|
172
177
|
const dataWithoutMissingRelations = await strapiUtils.traverseEntity(async (options, utils)=>{
|
|
173
|
-
if (
|
|
174
|
-
if (options.attribute.type === 'component') {
|
|
178
|
+
if (options.key === 'id' && options.schema.modelType === 'component') {
|
|
175
179
|
// Ids on components throw an error when restoring
|
|
176
180
|
utils.remove('id');
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
if (!options.attribute) return;
|
|
184
|
+
if (options.attribute.type === 'component') {
|
|
177
185
|
if (options.attribute.repeatable && options.value === null) {
|
|
178
186
|
// Repeatable Components should always be an array
|
|
179
187
|
utils.set(options.key, []);
|
|
@@ -212,6 +220,15 @@ const createHistoryService = ({ strapi })=>{
|
|
|
212
220
|
if (!restoredDocument) {
|
|
213
221
|
throw new strapiUtils.errors.ApplicationError('Failed to restore version');
|
|
214
222
|
}
|
|
223
|
+
await strapiUtils.emitAudit({
|
|
224
|
+
strapi
|
|
225
|
+
}, auditLogs.AUDITED_EVENTS.ENTRY_HISTORY_RESTORE, {
|
|
226
|
+
uid: version.contentType,
|
|
227
|
+
documentId: restoredDocument.documentId,
|
|
228
|
+
locale: version.locale ?? null,
|
|
229
|
+
versionId: version.id,
|
|
230
|
+
versionCreatedAt: new Date(version.createdAt).toISOString()
|
|
231
|
+
});
|
|
215
232
|
return restoredDocument;
|
|
216
233
|
}
|
|
217
234
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"history.js","sources":["../../../../server/src/history/services/history.ts"],"sourcesContent":["import type { Core, Data, Modules, Schema } from '@strapi/types';\nimport { errors, traverseEntity } from '@strapi/utils';\nimport { omit } from 'lodash';\n\nimport { FIELDS_TO_IGNORE, HISTORY_VERSION_UID } from '../constants';\nimport type { HistoryVersions } from '../../../../shared/contracts';\nimport type {\n CreateHistoryVersion,\n HistoryVersionDataResponse,\n} from '../../../../shared/contracts/history-versions';\nimport { createServiceUtils } from './utils';\nimport { getService as getContentManagerService } from '../../utils';\n\n// Needed because the query engine doesn't return any types yet\ntype HistoryVersionQueryResult = Omit<HistoryVersionDataResponse, 'locale'> &\n Pick<CreateHistoryVersion, 'locale'>;\n\nconst createHistoryService = ({ strapi }: { strapi: Core.Strapi }) => {\n const query = strapi.db.query(HISTORY_VERSION_UID);\n const serviceUtils = createServiceUtils({ strapi });\n\n return {\n async createVersion(historyVersionData: HistoryVersions.CreateHistoryVersion) {\n await query.create({\n data: {\n ...historyVersionData,\n createdAt: new Date(),\n createdBy: strapi.requestContext.get()?.state?.user.id,\n },\n });\n },\n\n async findVersionsPage(params: HistoryVersions.GetHistoryVersions.Request): Promise<{\n results: HistoryVersions.HistoryVersionDataResponse[];\n pagination: HistoryVersions.Pagination;\n }> {\n const schema = strapi.getModel(params.query.contentType);\n const isLocalizedContentType = serviceUtils.isLocalizedContentType(schema);\n const defaultLocale = await serviceUtils.getDefaultLocale();\n\n let locale = null;\n if (isLocalizedContentType) {\n locale = params.query.locale || defaultLocale;\n }\n\n // NOTE: We get the IDs first because sorting full rows runs MySQL/MariaDB out of sort memory\n // See: https://github.com/strapi/strapi/issues/27393\n const [{ results: versionRows, pagination }, localeDictionary] = await Promise.all([\n query.findPage({\n ...params.query,\n select: ['id'],\n where: {\n $and: [\n { contentType: params.query.contentType },\n ...(params.query.documentId ? [{ relatedDocumentId: params.query.documentId }] : []),\n ...(locale ? [{ locale }] : []),\n ],\n },\n orderBy: [{ createdAt: 'desc' }],\n }),\n serviceUtils.getLocaleDictionary(),\n ]);\n\n const ids = versionRows.map((version) => version.id);\n const versions = ids.length\n ? await query.findMany({\n where: { id: { $in: ids } },\n populate: ['createdBy'],\n })\n : [];\n const versionsById = new Map(versions.map((version) => [version.id, version]));\n const results = ids.map((id) => versionsById.get(id)).filter(Boolean);\n\n const populateEntry = async (entry: HistoryVersionQueryResult) => {\n return traverseEntity(\n async (options, utils) => {\n if (!options.attribute) return;\n if (!options.value) return;\n\n const currentValue: any[] = Array.isArray(options.value)\n ? options.value\n : [options.value];\n\n if (options.attribute.type === 'component') {\n // Ids on components throw an error when restoring\n utils.remove('id');\n }\n\n if (\n options.attribute.type === 'relation' &&\n // TODO: handle polymorphic relations\n options.attribute.relation !== 'morphToOne' &&\n options.attribute.relation !== 'morphToMany'\n ) {\n if (options.attribute.target === 'admin::user') {\n const adminUsers = await Promise.all(\n currentValue.map((userToPopulate) => {\n if (userToPopulate == null) {\n return null;\n }\n\n return strapi.query('admin::user').findOne({\n where: {\n ...(userToPopulate.id ? { id: userToPopulate.id } : {}),\n ...(userToPopulate.documentId\n ? { documentId: userToPopulate.documentId }\n : {}),\n },\n });\n })\n );\n\n utils.set(options.key, adminUsers as any);\n }\n\n const permissionChecker = getContentManagerService('permission-checker').create({\n userAbility: params.state.userAbility,\n model: options.attribute.target,\n });\n\n const response = await serviceUtils.buildRelationReponse(\n currentValue,\n options.attribute as Schema.Attribute.RelationWithTarget\n );\n const sanitizedResults = await Promise.all(\n response.results.map((media) => permissionChecker.sanitizeOutput(media))\n );\n\n utils.set(options.key, {\n results: sanitizedResults,\n meta: response.meta,\n });\n }\n\n if (options.attribute.type === 'media') {\n const permissionChecker = getContentManagerService('permission-checker').create({\n userAbility: params.state.userAbility,\n model: 'plugin::upload.file',\n });\n\n const response = await serviceUtils.buildMediaResponse(currentValue);\n const sanitizedResults = await Promise.all(\n response.results.map((media) => permissionChecker.sanitizeOutput(media))\n );\n\n utils.set(options.key, {\n results: sanitizedResults,\n meta: response.meta,\n });\n }\n },\n {\n schema,\n getModel: strapi.getModel.bind(strapi),\n },\n entry.data\n );\n };\n\n const formattedResults: any[] = await Promise.all(\n (results as HistoryVersionQueryResult[]).map(async (result) => {\n return {\n ...result,\n data: await populateEntry(result),\n meta: {\n unknownAttributes: serviceUtils.getSchemaAttributesDiff(\n result.schema,\n strapi.getModel(params.query.contentType).attributes\n ),\n },\n locale: result.locale ? localeDictionary[result.locale] : null,\n };\n })\n );\n\n return {\n results: formattedResults,\n pagination,\n };\n },\n\n async restoreVersion(versionId: Data.ID) {\n const version = await query.findOne({ where: { id: versionId } });\n const contentTypeSchemaAttributes = strapi.getModel(version.contentType).attributes;\n const schemaDiff = serviceUtils.getSchemaAttributesDiff(\n version.schema,\n contentTypeSchemaAttributes\n );\n\n // Set all added attribute values to null\n const dataWithoutAddedAttributes = Object.keys(schemaDiff.added).reduce(\n (currentData, addedKey) => {\n currentData[addedKey] = null;\n return currentData;\n },\n // Clone to avoid mutating the original version data\n structuredClone(version.data)\n );\n\n // Remove the schema attributes history should ignore\n const schema = structuredClone(version.schema);\n schema.attributes = omit(contentTypeSchemaAttributes, FIELDS_TO_IGNORE);\n\n const dataWithoutMissingRelations = await traverseEntity(\n async (options, utils) => {\n if (!options.attribute) return;\n\n if (options.attribute.type === 'component') {\n // Ids on components throw an error when restoring\n utils.remove('id');\n\n if (options.attribute.repeatable && options.value === null) {\n // Repeatable Components should always be an array\n utils.set(options.key, [] as any);\n }\n }\n\n if (options.attribute.type === 'dynamiczone') {\n if (options.value === null) {\n // Dynamic zones should always be an array\n utils.set(options.key, [] as any);\n }\n }\n\n if (\n options.attribute.type === 'relation' &&\n // TODO: handle polymorphic relations\n options.attribute.relation !== 'morphToOne' &&\n options.attribute.relation !== 'morphToMany'\n ) {\n if (!options.value) return;\n\n const data = await serviceUtils.getRelationRestoreValue(\n options.value as Modules.Documents.AnyDocument,\n options.attribute as Schema.Attribute.RelationWithTarget\n );\n\n utils.set(options.key, data as Modules.Documents.AnyDocument);\n }\n\n if (options.attribute.type === 'media') {\n if (!options.value) return;\n\n const data = await serviceUtils.getMediaRestoreValue(\n options.value as Modules.Documents.AnyDocument\n );\n\n utils.set(options.key, data);\n }\n },\n {\n schema,\n getModel: strapi.getModel.bind(strapi),\n },\n dataWithoutAddedAttributes\n );\n\n const data = omit(dataWithoutMissingRelations, ['id', ...Object.keys(schemaDiff.removed)]);\n const restoredDocument = await strapi.documents(version.contentType).update({\n documentId: version.relatedDocumentId,\n locale: version.locale,\n data,\n });\n\n if (!restoredDocument) {\n throw new errors.ApplicationError('Failed to restore version');\n }\n\n return restoredDocument;\n },\n };\n};\n\nexport { createHistoryService };\n"],"names":["createHistoryService","strapi","query","db","HISTORY_VERSION_UID","serviceUtils","createServiceUtils","createVersion","historyVersionData","create","data","createdAt","Date","createdBy","requestContext","get","state","user","id","findVersionsPage","params","schema","getModel","contentType","isLocalizedContentType","defaultLocale","getDefaultLocale","locale","results","versionRows","pagination","localeDictionary","Promise","all","findPage","select","where","$and","documentId","relatedDocumentId","orderBy","getLocaleDictionary","ids","map","version","versions","length","findMany","$in","populate","versionsById","Map","filter","Boolean","populateEntry","entry","traverseEntity","options","utils","attribute","value","currentValue","Array","isArray","type","remove","relation","target","adminUsers","userToPopulate","findOne","set","key","permissionChecker","getContentManagerService","userAbility","model","response","buildRelationReponse","sanitizedResults","media","sanitizeOutput","meta","buildMediaResponse","bind","formattedResults","result","unknownAttributes","getSchemaAttributesDiff","attributes","restoreVersion","versionId","contentTypeSchemaAttributes","schemaDiff","dataWithoutAddedAttributes","Object","keys","added","reduce","currentData","addedKey","structuredClone","omit","FIELDS_TO_IGNORE","dataWithoutMissingRelations","repeatable","getRelationRestoreValue","getMediaRestoreValue","removed","restoredDocument","documents","update","errors","ApplicationError"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"history.js","sources":["../../../../server/src/history/services/history.ts"],"sourcesContent":["import type { Core, Data, Modules, Schema } from '@strapi/types';\nimport { emitAudit, errors, traverseEntity } from '@strapi/utils';\nimport { omit } from 'lodash';\n\nimport { FIELDS_TO_IGNORE, HISTORY_VERSION_UID } from '../constants';\nimport type { HistoryVersions } from '../../../../shared/contracts';\nimport type {\n CreateHistoryVersion,\n HistoryVersionDataResponse,\n} from '../../../../shared/contracts/history-versions';\nimport { createServiceUtils } from './utils';\nimport { getService as getContentManagerService } from '../../utils';\nimport { AUDITED_EVENTS, type HistoryRestoreEvent } from '../../audit-logs';\n\n// Needed because the query engine doesn't return any types yet\ntype HistoryVersionQueryResult = Omit<HistoryVersionDataResponse, 'locale'> &\n Pick<CreateHistoryVersion, 'locale'>;\n\nconst createHistoryService = ({ strapi }: { strapi: Core.Strapi }) => {\n const query = strapi.db.query(HISTORY_VERSION_UID);\n const serviceUtils = createServiceUtils({ strapi });\n\n return {\n async createVersion(historyVersionData: HistoryVersions.CreateHistoryVersion) {\n await query.create({\n data: {\n ...historyVersionData,\n createdAt: new Date(),\n createdBy: strapi.requestContext.get()?.state?.user.id,\n },\n });\n },\n\n async findVersionsPage(params: HistoryVersions.GetHistoryVersions.Request): Promise<{\n results: HistoryVersions.HistoryVersionDataResponse[];\n pagination: HistoryVersions.Pagination;\n }> {\n const schema = strapi.getModel(params.query.contentType);\n const isLocalizedContentType = serviceUtils.isLocalizedContentType(schema);\n const defaultLocale = await serviceUtils.getDefaultLocale();\n\n let locale = null;\n if (isLocalizedContentType) {\n locale = params.query.locale || defaultLocale;\n }\n\n // NOTE: We get the IDs first because sorting full rows runs MySQL/MariaDB out of sort memory\n // See: https://github.com/strapi/strapi/issues/27393\n const [{ results: versionRows, pagination }, localeDictionary] = await Promise.all([\n query.findPage({\n ...params.query,\n select: ['id'],\n where: {\n $and: [\n { contentType: params.query.contentType },\n ...(params.query.documentId ? [{ relatedDocumentId: params.query.documentId }] : []),\n ...(locale ? [{ locale }] : []),\n ],\n },\n orderBy: [{ createdAt: 'desc' }],\n }),\n serviceUtils.getLocaleDictionary(),\n ]);\n\n const ids = versionRows.map((version) => version.id);\n const versions = ids.length\n ? await query.findMany({\n where: { id: { $in: ids } },\n populate: ['createdBy'],\n })\n : [];\n const versionsById = new Map(versions.map((version) => [version.id, version]));\n const results = ids.map((id) => versionsById.get(id)).filter(Boolean);\n\n const populateEntry = async (entry: HistoryVersionQueryResult) => {\n return traverseEntity(\n async (options, utils) => {\n if (options.key === 'id' && options.schema.modelType === 'component') {\n // Ids on components throw an error when restoring\n utils.remove('id');\n return;\n }\n\n if (!options.attribute) return;\n if (!options.value) return;\n\n const currentValue: any[] = Array.isArray(options.value)\n ? options.value\n : [options.value];\n\n if (\n options.attribute.type === 'relation' &&\n // TODO: handle polymorphic relations\n options.attribute.relation !== 'morphToOne' &&\n options.attribute.relation !== 'morphToMany'\n ) {\n if (options.attribute.target === 'admin::user') {\n const adminUsers = await Promise.all(\n currentValue.map((userToPopulate) => {\n if (userToPopulate == null) {\n return null;\n }\n\n return strapi.db.query('admin::user').findOne({\n where: {\n ...(userToPopulate.id ? { id: userToPopulate.id } : {}),\n ...(userToPopulate.documentId\n ? { documentId: userToPopulate.documentId }\n : {}),\n },\n });\n })\n );\n\n utils.set(options.key, adminUsers as any);\n }\n\n const permissionChecker = getContentManagerService('permission-checker').create({\n userAbility: params.state.userAbility,\n model: options.attribute.target,\n });\n\n const response = await serviceUtils.buildRelationReponse(\n currentValue,\n options.attribute as Schema.Attribute.RelationWithTarget\n );\n const sanitizedResults = await Promise.all(\n response.results.map((media) => permissionChecker.sanitizeOutput(media))\n );\n\n utils.set(options.key, {\n results: sanitizedResults,\n meta: response.meta,\n });\n }\n\n if (options.attribute.type === 'media') {\n const permissionChecker = getContentManagerService('permission-checker').create({\n userAbility: params.state.userAbility,\n model: 'plugin::upload.file',\n });\n\n const response = await serviceUtils.buildMediaResponse(currentValue);\n const sanitizedResults = await Promise.all(\n response.results.map((media) => permissionChecker.sanitizeOutput(media))\n );\n\n utils.set(options.key, {\n results: sanitizedResults,\n meta: response.meta,\n });\n }\n },\n {\n schema,\n getModel: strapi.getModel.bind(strapi),\n },\n entry.data\n );\n };\n\n const formattedResults: any[] = await Promise.all(\n (results as HistoryVersionQueryResult[]).map(async (result) => {\n return {\n ...result,\n data: await populateEntry(result),\n meta: {\n unknownAttributes: serviceUtils.getSchemaAttributesDiff(\n result.schema,\n strapi.getModel(params.query.contentType).attributes\n ),\n },\n locale: result.locale ? localeDictionary[result.locale] : null,\n };\n })\n );\n\n return {\n results: formattedResults,\n pagination,\n };\n },\n\n async restoreVersion(versionId: Data.ID) {\n const version = await query.findOne({ where: { id: versionId } });\n\n if (version === null) {\n throw new errors.NotFoundError('History version not found');\n }\n\n const contentTypeSchemaAttributes = strapi.getModel(version.contentType).attributes;\n const schemaDiff = serviceUtils.getSchemaAttributesDiff(\n version.schema,\n contentTypeSchemaAttributes\n );\n\n // Set all added attribute values to null\n const dataWithoutAddedAttributes = Object.keys(schemaDiff.added).reduce(\n (currentData, addedKey) => {\n currentData[addedKey] = null;\n return currentData;\n },\n // Clone to avoid mutating the original version data\n structuredClone(version.data)\n );\n\n // Remove the schema attributes history should ignore\n const schema = structuredClone(version.schema);\n schema.attributes = omit(contentTypeSchemaAttributes, FIELDS_TO_IGNORE);\n\n const dataWithoutMissingRelations = await traverseEntity(\n async (options, utils) => {\n if (options.key === 'id' && options.schema.modelType === 'component') {\n // Ids on components throw an error when restoring\n utils.remove('id');\n return;\n }\n\n if (!options.attribute) return;\n\n if (options.attribute.type === 'component') {\n if (options.attribute.repeatable && options.value === null) {\n // Repeatable Components should always be an array\n utils.set(options.key, [] as any);\n }\n }\n\n if (options.attribute.type === 'dynamiczone') {\n if (options.value === null) {\n // Dynamic zones should always be an array\n utils.set(options.key, [] as any);\n }\n }\n\n if (\n options.attribute.type === 'relation' &&\n // TODO: handle polymorphic relations\n options.attribute.relation !== 'morphToOne' &&\n options.attribute.relation !== 'morphToMany'\n ) {\n if (!options.value) return;\n\n const data = await serviceUtils.getRelationRestoreValue(\n options.value as Modules.Documents.AnyDocument,\n options.attribute as Schema.Attribute.RelationWithTarget\n );\n\n utils.set(options.key, data as Modules.Documents.AnyDocument);\n }\n\n if (options.attribute.type === 'media') {\n if (!options.value) return;\n\n const data = await serviceUtils.getMediaRestoreValue(\n options.value as Modules.Documents.AnyDocument\n );\n\n utils.set(options.key, data);\n }\n },\n {\n schema,\n getModel: strapi.getModel.bind(strapi),\n },\n dataWithoutAddedAttributes\n );\n\n const data = omit(dataWithoutMissingRelations, ['id', ...Object.keys(schemaDiff.removed)]);\n const restoredDocument = await strapi.documents(version.contentType).update({\n documentId: version.relatedDocumentId,\n locale: version.locale,\n data,\n });\n\n if (!restoredDocument) {\n throw new errors.ApplicationError('Failed to restore version');\n }\n\n await emitAudit({ strapi }, AUDITED_EVENTS.ENTRY_HISTORY_RESTORE, {\n uid: version.contentType,\n documentId: restoredDocument.documentId,\n locale: version.locale ?? null,\n versionId: version.id,\n versionCreatedAt: new Date(version.createdAt).toISOString(),\n } satisfies HistoryRestoreEvent);\n\n return restoredDocument;\n },\n };\n};\n\nexport { createHistoryService };\n"],"names":["createHistoryService","strapi","query","db","HISTORY_VERSION_UID","serviceUtils","createServiceUtils","createVersion","historyVersionData","create","data","createdAt","Date","createdBy","requestContext","get","state","user","id","findVersionsPage","params","schema","getModel","contentType","isLocalizedContentType","defaultLocale","getDefaultLocale","locale","results","versionRows","pagination","localeDictionary","Promise","all","findPage","select","where","$and","documentId","relatedDocumentId","orderBy","getLocaleDictionary","ids","map","version","versions","length","findMany","$in","populate","versionsById","Map","filter","Boolean","populateEntry","entry","traverseEntity","options","utils","key","modelType","remove","attribute","value","currentValue","Array","isArray","type","relation","target","adminUsers","userToPopulate","findOne","set","permissionChecker","getContentManagerService","userAbility","model","response","buildRelationReponse","sanitizedResults","media","sanitizeOutput","meta","buildMediaResponse","bind","formattedResults","result","unknownAttributes","getSchemaAttributesDiff","attributes","restoreVersion","versionId","errors","NotFoundError","contentTypeSchemaAttributes","schemaDiff","dataWithoutAddedAttributes","Object","keys","added","reduce","currentData","addedKey","structuredClone","omit","FIELDS_TO_IGNORE","dataWithoutMissingRelations","repeatable","getRelationRestoreValue","getMediaRestoreValue","removed","restoredDocument","documents","update","ApplicationError","emitAudit","AUDITED_EVENTS","ENTRY_HISTORY_RESTORE","uid","versionCreatedAt","toISOString"],"mappings":"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"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { traverseEntity,
|
|
1
|
+
import { errors, traverseEntity, emitAudit } from '@strapi/utils';
|
|
2
2
|
import { omit } from 'lodash';
|
|
3
3
|
import { HISTORY_VERSION_UID, FIELDS_TO_IGNORE } from '../constants.mjs';
|
|
4
4
|
import { createServiceUtils } from './utils.mjs';
|
|
5
5
|
import { getService } from '../../utils/index.mjs';
|
|
6
|
+
import { AUDITED_EVENTS } from '../../audit-logs.mjs';
|
|
6
7
|
|
|
7
8
|
const createHistoryService = ({ strapi })=>{
|
|
8
9
|
const query = strapi.db.query(HISTORY_VERSION_UID);
|
|
@@ -78,15 +79,16 @@ const createHistoryService = ({ strapi })=>{
|
|
|
78
79
|
const results = ids.map((id)=>versionsById.get(id)).filter(Boolean);
|
|
79
80
|
const populateEntry = async (entry)=>{
|
|
80
81
|
return traverseEntity(async (options, utils)=>{
|
|
82
|
+
if (options.key === 'id' && options.schema.modelType === 'component') {
|
|
83
|
+
// Ids on components throw an error when restoring
|
|
84
|
+
utils.remove('id');
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
81
87
|
if (!options.attribute) return;
|
|
82
88
|
if (!options.value) return;
|
|
83
89
|
const currentValue = Array.isArray(options.value) ? options.value : [
|
|
84
90
|
options.value
|
|
85
91
|
];
|
|
86
|
-
if (options.attribute.type === 'component') {
|
|
87
|
-
// Ids on components throw an error when restoring
|
|
88
|
-
utils.remove('id');
|
|
89
|
-
}
|
|
90
92
|
if (options.attribute.type === 'relation' && // TODO: handle polymorphic relations
|
|
91
93
|
options.attribute.relation !== 'morphToOne' && options.attribute.relation !== 'morphToMany') {
|
|
92
94
|
if (options.attribute.target === 'admin::user') {
|
|
@@ -94,7 +96,7 @@ const createHistoryService = ({ strapi })=>{
|
|
|
94
96
|
if (userToPopulate == null) {
|
|
95
97
|
return null;
|
|
96
98
|
}
|
|
97
|
-
return strapi.query('admin::user').findOne({
|
|
99
|
+
return strapi.db.query('admin::user').findOne({
|
|
98
100
|
where: {
|
|
99
101
|
...userToPopulate.id ? {
|
|
100
102
|
id: userToPopulate.id
|
|
@@ -156,6 +158,9 @@ const createHistoryService = ({ strapi })=>{
|
|
|
156
158
|
id: versionId
|
|
157
159
|
}
|
|
158
160
|
});
|
|
161
|
+
if (version === null) {
|
|
162
|
+
throw new errors.NotFoundError('History version not found');
|
|
163
|
+
}
|
|
159
164
|
const contentTypeSchemaAttributes = strapi.getModel(version.contentType).attributes;
|
|
160
165
|
const schemaDiff = serviceUtils.getSchemaAttributesDiff(version.schema, contentTypeSchemaAttributes);
|
|
161
166
|
// Set all added attribute values to null
|
|
@@ -168,10 +173,13 @@ const createHistoryService = ({ strapi })=>{
|
|
|
168
173
|
const schema = structuredClone(version.schema);
|
|
169
174
|
schema.attributes = omit(contentTypeSchemaAttributes, FIELDS_TO_IGNORE);
|
|
170
175
|
const dataWithoutMissingRelations = await traverseEntity(async (options, utils)=>{
|
|
171
|
-
if (
|
|
172
|
-
if (options.attribute.type === 'component') {
|
|
176
|
+
if (options.key === 'id' && options.schema.modelType === 'component') {
|
|
173
177
|
// Ids on components throw an error when restoring
|
|
174
178
|
utils.remove('id');
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
if (!options.attribute) return;
|
|
182
|
+
if (options.attribute.type === 'component') {
|
|
175
183
|
if (options.attribute.repeatable && options.value === null) {
|
|
176
184
|
// Repeatable Components should always be an array
|
|
177
185
|
utils.set(options.key, []);
|
|
@@ -210,6 +218,15 @@ const createHistoryService = ({ strapi })=>{
|
|
|
210
218
|
if (!restoredDocument) {
|
|
211
219
|
throw new errors.ApplicationError('Failed to restore version');
|
|
212
220
|
}
|
|
221
|
+
await emitAudit({
|
|
222
|
+
strapi
|
|
223
|
+
}, AUDITED_EVENTS.ENTRY_HISTORY_RESTORE, {
|
|
224
|
+
uid: version.contentType,
|
|
225
|
+
documentId: restoredDocument.documentId,
|
|
226
|
+
locale: version.locale ?? null,
|
|
227
|
+
versionId: version.id,
|
|
228
|
+
versionCreatedAt: new Date(version.createdAt).toISOString()
|
|
229
|
+
});
|
|
213
230
|
return restoredDocument;
|
|
214
231
|
}
|
|
215
232
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"history.mjs","sources":["../../../../server/src/history/services/history.ts"],"sourcesContent":["import type { Core, Data, Modules, Schema } from '@strapi/types';\nimport { errors, traverseEntity } from '@strapi/utils';\nimport { omit } from 'lodash';\n\nimport { FIELDS_TO_IGNORE, HISTORY_VERSION_UID } from '../constants';\nimport type { HistoryVersions } from '../../../../shared/contracts';\nimport type {\n CreateHistoryVersion,\n HistoryVersionDataResponse,\n} from '../../../../shared/contracts/history-versions';\nimport { createServiceUtils } from './utils';\nimport { getService as getContentManagerService } from '../../utils';\n\n// Needed because the query engine doesn't return any types yet\ntype HistoryVersionQueryResult = Omit<HistoryVersionDataResponse, 'locale'> &\n Pick<CreateHistoryVersion, 'locale'>;\n\nconst createHistoryService = ({ strapi }: { strapi: Core.Strapi }) => {\n const query = strapi.db.query(HISTORY_VERSION_UID);\n const serviceUtils = createServiceUtils({ strapi });\n\n return {\n async createVersion(historyVersionData: HistoryVersions.CreateHistoryVersion) {\n await query.create({\n data: {\n ...historyVersionData,\n createdAt: new Date(),\n createdBy: strapi.requestContext.get()?.state?.user.id,\n },\n });\n },\n\n async findVersionsPage(params: HistoryVersions.GetHistoryVersions.Request): Promise<{\n results: HistoryVersions.HistoryVersionDataResponse[];\n pagination: HistoryVersions.Pagination;\n }> {\n const schema = strapi.getModel(params.query.contentType);\n const isLocalizedContentType = serviceUtils.isLocalizedContentType(schema);\n const defaultLocale = await serviceUtils.getDefaultLocale();\n\n let locale = null;\n if (isLocalizedContentType) {\n locale = params.query.locale || defaultLocale;\n }\n\n // NOTE: We get the IDs first because sorting full rows runs MySQL/MariaDB out of sort memory\n // See: https://github.com/strapi/strapi/issues/27393\n const [{ results: versionRows, pagination }, localeDictionary] = await Promise.all([\n query.findPage({\n ...params.query,\n select: ['id'],\n where: {\n $and: [\n { contentType: params.query.contentType },\n ...(params.query.documentId ? [{ relatedDocumentId: params.query.documentId }] : []),\n ...(locale ? [{ locale }] : []),\n ],\n },\n orderBy: [{ createdAt: 'desc' }],\n }),\n serviceUtils.getLocaleDictionary(),\n ]);\n\n const ids = versionRows.map((version) => version.id);\n const versions = ids.length\n ? await query.findMany({\n where: { id: { $in: ids } },\n populate: ['createdBy'],\n })\n : [];\n const versionsById = new Map(versions.map((version) => [version.id, version]));\n const results = ids.map((id) => versionsById.get(id)).filter(Boolean);\n\n const populateEntry = async (entry: HistoryVersionQueryResult) => {\n return traverseEntity(\n async (options, utils) => {\n if (!options.attribute) return;\n if (!options.value) return;\n\n const currentValue: any[] = Array.isArray(options.value)\n ? options.value\n : [options.value];\n\n if (options.attribute.type === 'component') {\n // Ids on components throw an error when restoring\n utils.remove('id');\n }\n\n if (\n options.attribute.type === 'relation' &&\n // TODO: handle polymorphic relations\n options.attribute.relation !== 'morphToOne' &&\n options.attribute.relation !== 'morphToMany'\n ) {\n if (options.attribute.target === 'admin::user') {\n const adminUsers = await Promise.all(\n currentValue.map((userToPopulate) => {\n if (userToPopulate == null) {\n return null;\n }\n\n return strapi.query('admin::user').findOne({\n where: {\n ...(userToPopulate.id ? { id: userToPopulate.id } : {}),\n ...(userToPopulate.documentId\n ? { documentId: userToPopulate.documentId }\n : {}),\n },\n });\n })\n );\n\n utils.set(options.key, adminUsers as any);\n }\n\n const permissionChecker = getContentManagerService('permission-checker').create({\n userAbility: params.state.userAbility,\n model: options.attribute.target,\n });\n\n const response = await serviceUtils.buildRelationReponse(\n currentValue,\n options.attribute as Schema.Attribute.RelationWithTarget\n );\n const sanitizedResults = await Promise.all(\n response.results.map((media) => permissionChecker.sanitizeOutput(media))\n );\n\n utils.set(options.key, {\n results: sanitizedResults,\n meta: response.meta,\n });\n }\n\n if (options.attribute.type === 'media') {\n const permissionChecker = getContentManagerService('permission-checker').create({\n userAbility: params.state.userAbility,\n model: 'plugin::upload.file',\n });\n\n const response = await serviceUtils.buildMediaResponse(currentValue);\n const sanitizedResults = await Promise.all(\n response.results.map((media) => permissionChecker.sanitizeOutput(media))\n );\n\n utils.set(options.key, {\n results: sanitizedResults,\n meta: response.meta,\n });\n }\n },\n {\n schema,\n getModel: strapi.getModel.bind(strapi),\n },\n entry.data\n );\n };\n\n const formattedResults: any[] = await Promise.all(\n (results as HistoryVersionQueryResult[]).map(async (result) => {\n return {\n ...result,\n data: await populateEntry(result),\n meta: {\n unknownAttributes: serviceUtils.getSchemaAttributesDiff(\n result.schema,\n strapi.getModel(params.query.contentType).attributes\n ),\n },\n locale: result.locale ? localeDictionary[result.locale] : null,\n };\n })\n );\n\n return {\n results: formattedResults,\n pagination,\n };\n },\n\n async restoreVersion(versionId: Data.ID) {\n const version = await query.findOne({ where: { id: versionId } });\n const contentTypeSchemaAttributes = strapi.getModel(version.contentType).attributes;\n const schemaDiff = serviceUtils.getSchemaAttributesDiff(\n version.schema,\n contentTypeSchemaAttributes\n );\n\n // Set all added attribute values to null\n const dataWithoutAddedAttributes = Object.keys(schemaDiff.added).reduce(\n (currentData, addedKey) => {\n currentData[addedKey] = null;\n return currentData;\n },\n // Clone to avoid mutating the original version data\n structuredClone(version.data)\n );\n\n // Remove the schema attributes history should ignore\n const schema = structuredClone(version.schema);\n schema.attributes = omit(contentTypeSchemaAttributes, FIELDS_TO_IGNORE);\n\n const dataWithoutMissingRelations = await traverseEntity(\n async (options, utils) => {\n if (!options.attribute) return;\n\n if (options.attribute.type === 'component') {\n // Ids on components throw an error when restoring\n utils.remove('id');\n\n if (options.attribute.repeatable && options.value === null) {\n // Repeatable Components should always be an array\n utils.set(options.key, [] as any);\n }\n }\n\n if (options.attribute.type === 'dynamiczone') {\n if (options.value === null) {\n // Dynamic zones should always be an array\n utils.set(options.key, [] as any);\n }\n }\n\n if (\n options.attribute.type === 'relation' &&\n // TODO: handle polymorphic relations\n options.attribute.relation !== 'morphToOne' &&\n options.attribute.relation !== 'morphToMany'\n ) {\n if (!options.value) return;\n\n const data = await serviceUtils.getRelationRestoreValue(\n options.value as Modules.Documents.AnyDocument,\n options.attribute as Schema.Attribute.RelationWithTarget\n );\n\n utils.set(options.key, data as Modules.Documents.AnyDocument);\n }\n\n if (options.attribute.type === 'media') {\n if (!options.value) return;\n\n const data = await serviceUtils.getMediaRestoreValue(\n options.value as Modules.Documents.AnyDocument\n );\n\n utils.set(options.key, data);\n }\n },\n {\n schema,\n getModel: strapi.getModel.bind(strapi),\n },\n dataWithoutAddedAttributes\n );\n\n const data = omit(dataWithoutMissingRelations, ['id', ...Object.keys(schemaDiff.removed)]);\n const restoredDocument = await strapi.documents(version.contentType).update({\n documentId: version.relatedDocumentId,\n locale: version.locale,\n data,\n });\n\n if (!restoredDocument) {\n throw new errors.ApplicationError('Failed to restore version');\n }\n\n return restoredDocument;\n },\n };\n};\n\nexport { createHistoryService };\n"],"names":["createHistoryService","strapi","query","db","HISTORY_VERSION_UID","serviceUtils","createServiceUtils","createVersion","historyVersionData","create","data","createdAt","Date","createdBy","requestContext","get","state","user","id","findVersionsPage","params","schema","getModel","contentType","isLocalizedContentType","defaultLocale","getDefaultLocale","locale","results","versionRows","pagination","localeDictionary","Promise","all","findPage","select","where","$and","documentId","relatedDocumentId","orderBy","getLocaleDictionary","ids","map","version","versions","length","findMany","$in","populate","versionsById","Map","filter","Boolean","populateEntry","entry","traverseEntity","options","utils","attribute","value","currentValue","Array","isArray","type","remove","relation","target","adminUsers","userToPopulate","findOne","set","key","permissionChecker","getContentManagerService","userAbility","model","response","buildRelationReponse","sanitizedResults","media","sanitizeOutput","meta","buildMediaResponse","bind","formattedResults","result","unknownAttributes","getSchemaAttributesDiff","attributes","restoreVersion","versionId","contentTypeSchemaAttributes","schemaDiff","dataWithoutAddedAttributes","Object","keys","added","reduce","currentData","addedKey","structuredClone","omit","FIELDS_TO_IGNORE","dataWithoutMissingRelations","repeatable","getRelationRestoreValue","getMediaRestoreValue","removed","restoredDocument","documents","update","errors","ApplicationError"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"history.mjs","sources":["../../../../server/src/history/services/history.ts"],"sourcesContent":["import type { Core, Data, Modules, Schema } from '@strapi/types';\nimport { emitAudit, errors, traverseEntity } from '@strapi/utils';\nimport { omit } from 'lodash';\n\nimport { FIELDS_TO_IGNORE, HISTORY_VERSION_UID } from '../constants';\nimport type { HistoryVersions } from '../../../../shared/contracts';\nimport type {\n CreateHistoryVersion,\n HistoryVersionDataResponse,\n} from '../../../../shared/contracts/history-versions';\nimport { createServiceUtils } from './utils';\nimport { getService as getContentManagerService } from '../../utils';\nimport { AUDITED_EVENTS, type HistoryRestoreEvent } from '../../audit-logs';\n\n// Needed because the query engine doesn't return any types yet\ntype HistoryVersionQueryResult = Omit<HistoryVersionDataResponse, 'locale'> &\n Pick<CreateHistoryVersion, 'locale'>;\n\nconst createHistoryService = ({ strapi }: { strapi: Core.Strapi }) => {\n const query = strapi.db.query(HISTORY_VERSION_UID);\n const serviceUtils = createServiceUtils({ strapi });\n\n return {\n async createVersion(historyVersionData: HistoryVersions.CreateHistoryVersion) {\n await query.create({\n data: {\n ...historyVersionData,\n createdAt: new Date(),\n createdBy: strapi.requestContext.get()?.state?.user.id,\n },\n });\n },\n\n async findVersionsPage(params: HistoryVersions.GetHistoryVersions.Request): Promise<{\n results: HistoryVersions.HistoryVersionDataResponse[];\n pagination: HistoryVersions.Pagination;\n }> {\n const schema = strapi.getModel(params.query.contentType);\n const isLocalizedContentType = serviceUtils.isLocalizedContentType(schema);\n const defaultLocale = await serviceUtils.getDefaultLocale();\n\n let locale = null;\n if (isLocalizedContentType) {\n locale = params.query.locale || defaultLocale;\n }\n\n // NOTE: We get the IDs first because sorting full rows runs MySQL/MariaDB out of sort memory\n // See: https://github.com/strapi/strapi/issues/27393\n const [{ results: versionRows, pagination }, localeDictionary] = await Promise.all([\n query.findPage({\n ...params.query,\n select: ['id'],\n where: {\n $and: [\n { contentType: params.query.contentType },\n ...(params.query.documentId ? [{ relatedDocumentId: params.query.documentId }] : []),\n ...(locale ? [{ locale }] : []),\n ],\n },\n orderBy: [{ createdAt: 'desc' }],\n }),\n serviceUtils.getLocaleDictionary(),\n ]);\n\n const ids = versionRows.map((version) => version.id);\n const versions = ids.length\n ? await query.findMany({\n where: { id: { $in: ids } },\n populate: ['createdBy'],\n })\n : [];\n const versionsById = new Map(versions.map((version) => [version.id, version]));\n const results = ids.map((id) => versionsById.get(id)).filter(Boolean);\n\n const populateEntry = async (entry: HistoryVersionQueryResult) => {\n return traverseEntity(\n async (options, utils) => {\n if (options.key === 'id' && options.schema.modelType === 'component') {\n // Ids on components throw an error when restoring\n utils.remove('id');\n return;\n }\n\n if (!options.attribute) return;\n if (!options.value) return;\n\n const currentValue: any[] = Array.isArray(options.value)\n ? options.value\n : [options.value];\n\n if (\n options.attribute.type === 'relation' &&\n // TODO: handle polymorphic relations\n options.attribute.relation !== 'morphToOne' &&\n options.attribute.relation !== 'morphToMany'\n ) {\n if (options.attribute.target === 'admin::user') {\n const adminUsers = await Promise.all(\n currentValue.map((userToPopulate) => {\n if (userToPopulate == null) {\n return null;\n }\n\n return strapi.db.query('admin::user').findOne({\n where: {\n ...(userToPopulate.id ? { id: userToPopulate.id } : {}),\n ...(userToPopulate.documentId\n ? { documentId: userToPopulate.documentId }\n : {}),\n },\n });\n })\n );\n\n utils.set(options.key, adminUsers as any);\n }\n\n const permissionChecker = getContentManagerService('permission-checker').create({\n userAbility: params.state.userAbility,\n model: options.attribute.target,\n });\n\n const response = await serviceUtils.buildRelationReponse(\n currentValue,\n options.attribute as Schema.Attribute.RelationWithTarget\n );\n const sanitizedResults = await Promise.all(\n response.results.map((media) => permissionChecker.sanitizeOutput(media))\n );\n\n utils.set(options.key, {\n results: sanitizedResults,\n meta: response.meta,\n });\n }\n\n if (options.attribute.type === 'media') {\n const permissionChecker = getContentManagerService('permission-checker').create({\n userAbility: params.state.userAbility,\n model: 'plugin::upload.file',\n });\n\n const response = await serviceUtils.buildMediaResponse(currentValue);\n const sanitizedResults = await Promise.all(\n response.results.map((media) => permissionChecker.sanitizeOutput(media))\n );\n\n utils.set(options.key, {\n results: sanitizedResults,\n meta: response.meta,\n });\n }\n },\n {\n schema,\n getModel: strapi.getModel.bind(strapi),\n },\n entry.data\n );\n };\n\n const formattedResults: any[] = await Promise.all(\n (results as HistoryVersionQueryResult[]).map(async (result) => {\n return {\n ...result,\n data: await populateEntry(result),\n meta: {\n unknownAttributes: serviceUtils.getSchemaAttributesDiff(\n result.schema,\n strapi.getModel(params.query.contentType).attributes\n ),\n },\n locale: result.locale ? localeDictionary[result.locale] : null,\n };\n })\n );\n\n return {\n results: formattedResults,\n pagination,\n };\n },\n\n async restoreVersion(versionId: Data.ID) {\n const version = await query.findOne({ where: { id: versionId } });\n\n if (version === null) {\n throw new errors.NotFoundError('History version not found');\n }\n\n const contentTypeSchemaAttributes = strapi.getModel(version.contentType).attributes;\n const schemaDiff = serviceUtils.getSchemaAttributesDiff(\n version.schema,\n contentTypeSchemaAttributes\n );\n\n // Set all added attribute values to null\n const dataWithoutAddedAttributes = Object.keys(schemaDiff.added).reduce(\n (currentData, addedKey) => {\n currentData[addedKey] = null;\n return currentData;\n },\n // Clone to avoid mutating the original version data\n structuredClone(version.data)\n );\n\n // Remove the schema attributes history should ignore\n const schema = structuredClone(version.schema);\n schema.attributes = omit(contentTypeSchemaAttributes, FIELDS_TO_IGNORE);\n\n const dataWithoutMissingRelations = await traverseEntity(\n async (options, utils) => {\n if (options.key === 'id' && options.schema.modelType === 'component') {\n // Ids on components throw an error when restoring\n utils.remove('id');\n return;\n }\n\n if (!options.attribute) return;\n\n if (options.attribute.type === 'component') {\n if (options.attribute.repeatable && options.value === null) {\n // Repeatable Components should always be an array\n utils.set(options.key, [] as any);\n }\n }\n\n if (options.attribute.type === 'dynamiczone') {\n if (options.value === null) {\n // Dynamic zones should always be an array\n utils.set(options.key, [] as any);\n }\n }\n\n if (\n options.attribute.type === 'relation' &&\n // TODO: handle polymorphic relations\n options.attribute.relation !== 'morphToOne' &&\n options.attribute.relation !== 'morphToMany'\n ) {\n if (!options.value) return;\n\n const data = await serviceUtils.getRelationRestoreValue(\n options.value as Modules.Documents.AnyDocument,\n options.attribute as Schema.Attribute.RelationWithTarget\n );\n\n utils.set(options.key, data as Modules.Documents.AnyDocument);\n }\n\n if (options.attribute.type === 'media') {\n if (!options.value) return;\n\n const data = await serviceUtils.getMediaRestoreValue(\n options.value as Modules.Documents.AnyDocument\n );\n\n utils.set(options.key, data);\n }\n },\n {\n schema,\n getModel: strapi.getModel.bind(strapi),\n },\n dataWithoutAddedAttributes\n );\n\n const data = omit(dataWithoutMissingRelations, ['id', ...Object.keys(schemaDiff.removed)]);\n const restoredDocument = await strapi.documents(version.contentType).update({\n documentId: version.relatedDocumentId,\n locale: version.locale,\n data,\n });\n\n if (!restoredDocument) {\n throw new errors.ApplicationError('Failed to restore version');\n }\n\n await emitAudit({ strapi }, AUDITED_EVENTS.ENTRY_HISTORY_RESTORE, {\n uid: version.contentType,\n documentId: restoredDocument.documentId,\n locale: version.locale ?? null,\n versionId: version.id,\n versionCreatedAt: new Date(version.createdAt).toISOString(),\n } satisfies HistoryRestoreEvent);\n\n return restoredDocument;\n },\n };\n};\n\nexport { createHistoryService };\n"],"names":["createHistoryService","strapi","query","db","HISTORY_VERSION_UID","serviceUtils","createServiceUtils","createVersion","historyVersionData","create","data","createdAt","Date","createdBy","requestContext","get","state","user","id","findVersionsPage","params","schema","getModel","contentType","isLocalizedContentType","defaultLocale","getDefaultLocale","locale","results","versionRows","pagination","localeDictionary","Promise","all","findPage","select","where","$and","documentId","relatedDocumentId","orderBy","getLocaleDictionary","ids","map","version","versions","length","findMany","$in","populate","versionsById","Map","filter","Boolean","populateEntry","entry","traverseEntity","options","utils","key","modelType","remove","attribute","value","currentValue","Array","isArray","type","relation","target","adminUsers","userToPopulate","findOne","set","permissionChecker","getContentManagerService","userAbility","model","response","buildRelationReponse","sanitizedResults","media","sanitizeOutput","meta","buildMediaResponse","bind","formattedResults","result","unknownAttributes","getSchemaAttributesDiff","attributes","restoreVersion","versionId","errors","NotFoundError","contentTypeSchemaAttributes","schemaDiff","dataWithoutAddedAttributes","Object","keys","added","reduce","currentData","addedKey","structuredClone","omit","FIELDS_TO_IGNORE","dataWithoutMissingRelations","repeatable","getRelationRestoreValue","getMediaRestoreValue","removed","restoredDocument","documents","update","ApplicationError","emitAudit","AUDITED_EVENTS","ENTRY_HISTORY_RESTORE","uid","versionCreatedAt","toISOString"],"mappings":"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"}
|
|
@@ -32,27 +32,13 @@ var utils$1 = require('./utils.js');
|
|
|
32
32
|
return true;
|
|
33
33
|
};
|
|
34
34
|
/**
|
|
35
|
-
* Returns the content type schema
|
|
35
|
+
* Returns the content type schema.
|
|
36
36
|
* Used to determine if changes were made in the content type builder since a history version was created.
|
|
37
37
|
* And therefore which fields can be restored and which cannot.
|
|
38
38
|
*/ const getSchemas = (uid)=>{
|
|
39
39
|
const attributesSchema = strapi.getModel(uid).attributes;
|
|
40
|
-
// TODO: Handle nested components
|
|
41
|
-
const componentsSchemas = Object.keys(attributesSchema).reduce((currentComponentSchemas, key)=>{
|
|
42
|
-
const fieldSchema = attributesSchema[key];
|
|
43
|
-
if (fieldSchema.type === 'component') {
|
|
44
|
-
const componentSchema = strapi.getModel(fieldSchema.component).attributes;
|
|
45
|
-
return {
|
|
46
|
-
...currentComponentSchemas,
|
|
47
|
-
[fieldSchema.component]: componentSchema
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
// Ignore anything that's not a component
|
|
51
|
-
return currentComponentSchemas;
|
|
52
|
-
}, {});
|
|
53
40
|
return {
|
|
54
|
-
schema: _.omit(attributesSchema, constants.FIELDS_TO_IGNORE)
|
|
55
|
-
componentsSchemas
|
|
41
|
+
schema: _.omit(attributesSchema, constants.FIELDS_TO_IGNORE)
|
|
56
42
|
};
|
|
57
43
|
};
|
|
58
44
|
const createLifecyclesService = ({ strapi: strapi1 })=>{
|