@strapi/content-manager 0.0.0-experimental.86fea32ae4240d73f76516d7238e302b6b927e88 → 0.0.0-experimental.8e4302929d7fe147203ed0266450d0a565c69660
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/_chunks/CardDragPreview-C0QyJgRA.js.map +1 -1
- package/dist/_chunks/CardDragPreview-DOxamsuj.mjs.map +1 -1
- package/dist/_chunks/{ComponentConfigurationPage-B2g3icXu.mjs → ComponentConfigurationPage-D4H-v0et.mjs} +4 -4
- package/dist/_chunks/{ComponentConfigurationPage-B2g3icXu.mjs.map → ComponentConfigurationPage-D4H-v0et.mjs.map} +1 -1
- package/dist/_chunks/{ComponentConfigurationPage-CzDn8Uxh.js → ComponentConfigurationPage-DdkVGfXC.js} +5 -6
- package/dist/_chunks/{ComponentConfigurationPage-CzDn8Uxh.js.map → ComponentConfigurationPage-DdkVGfXC.js.map} +1 -1
- package/dist/_chunks/{ComponentIcon-BXdiCGQp.js → ComponentIcon-CRbtQEUV.js} +2 -3
- package/dist/_chunks/{ComponentIcon-BXdiCGQp.js.map → ComponentIcon-CRbtQEUV.js.map} +1 -1
- package/dist/_chunks/ComponentIcon-u4bIXTFY.mjs.map +1 -1
- package/dist/_chunks/{EditConfigurationPage-DSA1zONV.mjs → EditConfigurationPage-D1nvB7Br.mjs} +4 -4
- package/dist/_chunks/{EditConfigurationPage-DSA1zONV.mjs.map → EditConfigurationPage-D1nvB7Br.mjs.map} +1 -1
- package/dist/_chunks/{EditConfigurationPage-Bcbi6r5y.js → EditConfigurationPage-LYEvR4fW.js} +5 -6
- package/dist/_chunks/{EditConfigurationPage-Bcbi6r5y.js.map → EditConfigurationPage-LYEvR4fW.js.map} +1 -1
- package/dist/_chunks/{EditViewPage-Ca2EmJpb.mjs → EditViewPage-Bcnff6Vd.mjs} +21 -54
- package/dist/_chunks/EditViewPage-Bcnff6Vd.mjs.map +1 -0
- package/dist/_chunks/{EditViewPage-BvcMXaP2.js → EditViewPage-DqelJ9UK.js} +23 -57
- package/dist/_chunks/EditViewPage-DqelJ9UK.js.map +1 -0
- package/dist/_chunks/FieldTypeIcon-CMlNO8PE.mjs.map +1 -1
- package/dist/_chunks/FieldTypeIcon-Dnwq_IRF.js.map +1 -1
- package/dist/_chunks/{Form-DAUpPBVM.js → Form-CnHfBeiB.js} +5 -6
- package/dist/_chunks/{Form-DAUpPBVM.js.map → Form-CnHfBeiB.js.map} +1 -1
- package/dist/_chunks/{Form-BJVbU6w4.mjs → Form-CzPCJi3B.mjs} +3 -3
- package/dist/_chunks/{Form-BJVbU6w4.mjs.map → Form-CzPCJi3B.mjs.map} +1 -1
- package/dist/_chunks/{History-M6Pk9CoY.mjs → History-CcmSn3Mj.mjs} +51 -97
- package/dist/_chunks/History-CcmSn3Mj.mjs.map +1 -0
- package/dist/_chunks/{History-Bw9vfT1k.js → History-zArjENzj.js} +62 -109
- package/dist/_chunks/History-zArjENzj.js.map +1 -0
- package/dist/_chunks/{Field-CmaWxdpf.js → Input-CDHKQd7o.js} +1259 -1236
- package/dist/_chunks/Input-CDHKQd7o.js.map +1 -0
- package/dist/_chunks/{Field-BEYkgCZ0.mjs → Input-aV8SSoTa.mjs} +1334 -1311
- package/dist/_chunks/Input-aV8SSoTa.mjs.map +1 -0
- package/dist/_chunks/{ListConfigurationPage-D7ior2zq.mjs → ListConfigurationPage-BPvzENJJ.mjs} +7 -6
- package/dist/_chunks/ListConfigurationPage-BPvzENJJ.mjs.map +1 -0
- package/dist/_chunks/{ListConfigurationPage-DBVqF5fc.js → ListConfigurationPage-ByZAO_9H.js} +7 -7
- package/dist/_chunks/ListConfigurationPage-ByZAO_9H.js.map +1 -0
- package/dist/_chunks/{ListViewPage-MZu-8OKX.js → ListViewPage-BVKBeQAA.js} +73 -48
- package/dist/_chunks/ListViewPage-BVKBeQAA.js.map +1 -0
- package/dist/_chunks/{ListViewPage-BH37wONY.mjs → ListViewPage-HljQVnFH.mjs} +67 -41
- package/dist/_chunks/ListViewPage-HljQVnFH.mjs.map +1 -0
- package/dist/_chunks/{NoContentTypePage-C9lRMTCa.js → NoContentTypePage-BV5zfDxr.js} +2 -2
- package/dist/_chunks/{NoContentTypePage-C9lRMTCa.js.map → NoContentTypePage-BV5zfDxr.js.map} +1 -1
- package/dist/_chunks/{NoContentTypePage-DRp7Aem_.mjs → NoContentTypePage-BfHaSM-K.mjs} +2 -2
- package/dist/_chunks/{NoContentTypePage-DRp7Aem_.mjs.map → NoContentTypePage-BfHaSM-K.mjs.map} +1 -1
- package/dist/_chunks/{NoPermissionsPage-CzhRt5CA.mjs → NoPermissionsPage-D6ze2nQL.mjs} +2 -2
- package/dist/_chunks/{NoPermissionsPage-CzhRt5CA.mjs.map → NoPermissionsPage-D6ze2nQL.mjs.map} +1 -1
- package/dist/_chunks/{NoPermissionsPage-COs61PpB.js → NoPermissionsPage-vdNpc6jb.js} +2 -2
- package/dist/_chunks/{NoPermissionsPage-COs61PpB.js.map → NoPermissionsPage-vdNpc6jb.js.map} +1 -1
- package/dist/_chunks/Preview-DEHdENT1.js +305 -0
- package/dist/_chunks/Preview-DEHdENT1.js.map +1 -0
- package/dist/_chunks/Preview-vfWOtPG5.mjs +287 -0
- package/dist/_chunks/Preview-vfWOtPG5.mjs.map +1 -0
- package/dist/_chunks/{Relations-68XxIzPI.mjs → Relations-B7_hbF0w.mjs} +33 -19
- package/dist/_chunks/Relations-B7_hbF0w.mjs.map +1 -0
- package/dist/_chunks/{Relations-CsGlulU_.js → Relations-DcoOBejP.js} +33 -20
- package/dist/_chunks/Relations-DcoOBejP.js.map +1 -0
- package/dist/_chunks/{en-Bm0D0IWz.js → en-BR48D_RH.js} +23 -4
- package/dist/_chunks/{en-Bm0D0IWz.js.map → en-BR48D_RH.js.map} +1 -1
- package/dist/_chunks/{en-DKV44jRb.mjs → en-D65uIF6Y.mjs} +23 -4
- package/dist/_chunks/{en-DKV44jRb.mjs.map → en-D65uIF6Y.mjs.map} +1 -1
- package/dist/_chunks/{es-EUonQTon.js → es-9K52xZIr.js} +2 -2
- package/dist/_chunks/{ja-CcFe8diO.js.map → es-9K52xZIr.js.map} +1 -1
- package/dist/_chunks/{es-CeXiYflN.mjs → es-D34tqjMw.mjs} +2 -2
- package/dist/_chunks/{es-CeXiYflN.mjs.map → es-D34tqjMw.mjs.map} +1 -1
- package/dist/_chunks/{fr-B7kGGg3E.js → fr-C43IbhA_.js} +16 -3
- package/dist/_chunks/{fr-B7kGGg3E.js.map → fr-C43IbhA_.js.map} +1 -1
- package/dist/_chunks/{fr-CD9VFbPM.mjs → fr-DBseuRuB.mjs} +16 -3
- package/dist/_chunks/{fr-CD9VFbPM.mjs.map → fr-DBseuRuB.mjs.map} +1 -1
- package/dist/_chunks/hooks-BAaaKPS_.js.map +1 -1
- package/dist/_chunks/{index-oDq3VO9j.js → index-CxLSGwnk.js} +614 -237
- package/dist/_chunks/index-CxLSGwnk.js.map +1 -0
- package/dist/_chunks/{index-CsfwpRfc.mjs → index-EH8ZtHd5.mjs} +631 -253
- package/dist/_chunks/index-EH8ZtHd5.mjs.map +1 -0
- package/dist/_chunks/{ja-CcFe8diO.js → ja-7sfIbjxE.js} +2 -2
- package/dist/_chunks/{es-EUonQTon.js.map → ja-7sfIbjxE.js.map} +1 -1
- package/dist/_chunks/{ja-CtsUxOvk.mjs → ja-BHqhDq4V.mjs} +2 -2
- package/dist/_chunks/{ja-CtsUxOvk.mjs.map → ja-BHqhDq4V.mjs.map} +1 -1
- package/dist/_chunks/{layout-C5uSVTqi.mjs → layout-CxDMdJ13.mjs} +4 -4
- package/dist/_chunks/{layout-C5uSVTqi.mjs.map → layout-CxDMdJ13.mjs.map} +1 -1
- package/dist/_chunks/{layout-Euka-kfv.js → layout-DSeUTfMv.js} +5 -6
- package/dist/_chunks/{layout-Euka-kfv.js.map → layout-DSeUTfMv.js.map} +1 -1
- package/dist/_chunks/{objects-gigeqt7s.js → objects-BcXOv6_9.js} +2 -4
- package/dist/_chunks/{objects-gigeqt7s.js.map → objects-BcXOv6_9.js.map} +1 -1
- package/dist/_chunks/{objects-mKMAmfec.mjs → objects-D6yBsdmx.mjs} +2 -4
- package/dist/_chunks/{objects-mKMAmfec.mjs.map → objects-D6yBsdmx.mjs.map} +1 -1
- package/dist/_chunks/{relations-BpHVgFuV.mjs → relations-B8_Uu38Q.mjs} +21 -8
- package/dist/_chunks/relations-B8_Uu38Q.mjs.map +1 -0
- package/dist/_chunks/{relations-DG7kmxa0.js → relations-S5nNKdN3.js} +20 -7
- package/dist/_chunks/relations-S5nNKdN3.js.map +1 -0
- package/dist/_chunks/{useDragAndDrop-J0TUUbR6.js → useDragAndDrop-BMtgCYzL.js} +5 -9
- package/dist/_chunks/{useDragAndDrop-J0TUUbR6.js.map → useDragAndDrop-BMtgCYzL.js.map} +1 -1
- package/dist/_chunks/{useDragAndDrop-DdHgKsqq.mjs → useDragAndDrop-DJ6jqvZN.mjs} +4 -7
- package/dist/_chunks/{useDragAndDrop-DdHgKsqq.mjs.map → useDragAndDrop-DJ6jqvZN.mjs.map} +1 -1
- package/dist/_chunks/{useDebounce-CtcjDB3L.js → usePrev-B9w_-eYc.js} +1 -14
- package/dist/_chunks/usePrev-B9w_-eYc.js.map +1 -0
- package/dist/_chunks/usePrev-DH6iah0A.mjs +16 -0
- package/dist/_chunks/usePrev-DH6iah0A.mjs.map +1 -0
- package/dist/admin/index.js +2 -1
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +6 -5
- package/dist/admin/src/content-manager.d.ts +3 -2
- 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/useDocument.d.ts +19 -2
- package/dist/admin/src/pages/EditView/EditViewPage.d.ts +9 -1
- package/dist/admin/src/pages/EditView/components/DocumentActions.d.ts +1 -1
- package/dist/admin/src/pages/EditView/components/DocumentStatus.d.ts +3 -3
- package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.d.ts +7 -0
- package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/Blocks/utils/prismLanguages.d.ts +49 -0
- package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/utils/constants.d.ts +1 -0
- package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.d.ts +4 -1
- package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/Field.d.ts +4 -1
- package/dist/admin/src/pages/EditView/components/FormLayout.d.ts +27 -0
- package/dist/admin/src/pages/EditView/utils/data.d.ts +1 -0
- package/dist/admin/src/preview/components/PreviewContent.d.ts +2 -0
- package/dist/admin/src/preview/components/PreviewHeader.d.ts +2 -0
- package/dist/admin/src/preview/components/PreviewSidePanel.d.ts +3 -0
- package/dist/admin/src/preview/index.d.ts +4 -0
- package/dist/admin/src/preview/pages/Preview.d.ts +11 -0
- package/dist/admin/src/preview/routes.d.ts +3 -0
- package/dist/admin/src/preview/services/preview.d.ts +3 -0
- package/dist/admin/src/router.d.ts +1 -1
- 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 +16 -19
- 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/server/index.js +561 -323
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +562 -323
- package/dist/server/index.mjs.map +1 -1
- package/dist/server/src/bootstrap.d.ts.map +1 -1
- package/dist/server/src/controllers/index.d.ts.map +1 -1
- package/dist/server/src/controllers/relations.d.ts.map +1 -1
- package/dist/server/src/controllers/utils/metadata.d.ts +16 -1
- package/dist/server/src/controllers/utils/metadata.d.ts.map +1 -1
- package/dist/server/src/history/controllers/history-version.d.ts +1 -1
- package/dist/server/src/history/controllers/history-version.d.ts.map +1 -1
- package/dist/server/src/history/services/history.d.ts +3 -3
- 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/history/services/utils.d.ts +6 -11
- package/dist/server/src/history/services/utils.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +7 -6
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/preview/controllers/index.d.ts +2 -0
- package/dist/server/src/preview/controllers/index.d.ts.map +1 -0
- package/dist/server/src/preview/controllers/preview.d.ts +13 -0
- package/dist/server/src/preview/controllers/preview.d.ts.map +1 -0
- package/dist/server/src/preview/controllers/validation/preview.d.ts +6 -0
- package/dist/server/src/preview/controllers/validation/preview.d.ts.map +1 -0
- package/dist/server/src/preview/index.d.ts +4 -0
- package/dist/server/src/preview/index.d.ts.map +1 -0
- package/dist/server/src/preview/routes/index.d.ts +8 -0
- package/dist/server/src/preview/routes/index.d.ts.map +1 -0
- package/dist/server/src/preview/routes/preview.d.ts +4 -0
- package/dist/server/src/preview/routes/preview.d.ts.map +1 -0
- package/dist/server/src/preview/services/index.d.ts +16 -0
- package/dist/server/src/preview/services/index.d.ts.map +1 -0
- package/dist/server/src/preview/services/preview-config.d.ts +32 -0
- package/dist/server/src/preview/services/preview-config.d.ts.map +1 -0
- package/dist/server/src/preview/services/preview.d.ts +12 -0
- package/dist/server/src/preview/services/preview.d.ts.map +1 -0
- package/dist/server/src/preview/utils.d.ts +19 -0
- package/dist/server/src/preview/utils.d.ts.map +1 -0
- 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/document-manager.d.ts.map +1 -1
- package/dist/server/src/services/document-metadata.d.ts +12 -10
- package/dist/server/src/services/document-metadata.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +7 -6
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/services/utils/populate.d.ts +2 -2
- package/dist/server/src/services/utils/populate.d.ts.map +1 -1
- package/dist/server/src/utils/index.d.ts +2 -0
- package/dist/server/src/utils/index.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/preview.d.ts +27 -0
- package/dist/shared/contracts/preview.d.ts.map +1 -0
- package/dist/shared/index.js +4 -0
- package/dist/shared/index.js.map +1 -1
- package/dist/shared/index.mjs +4 -0
- package/dist/shared/index.mjs.map +1 -1
- package/package.json +13 -12
- package/dist/_chunks/EditViewPage-BvcMXaP2.js.map +0 -1
- package/dist/_chunks/EditViewPage-Ca2EmJpb.mjs.map +0 -1
- package/dist/_chunks/Field-BEYkgCZ0.mjs.map +0 -1
- package/dist/_chunks/Field-CmaWxdpf.js.map +0 -1
- package/dist/_chunks/History-Bw9vfT1k.js.map +0 -1
- package/dist/_chunks/History-M6Pk9CoY.mjs.map +0 -1
- package/dist/_chunks/ListConfigurationPage-D7ior2zq.mjs.map +0 -1
- package/dist/_chunks/ListConfigurationPage-DBVqF5fc.js.map +0 -1
- package/dist/_chunks/ListViewPage-BH37wONY.mjs.map +0 -1
- package/dist/_chunks/ListViewPage-MZu-8OKX.js.map +0 -1
- package/dist/_chunks/Relations-68XxIzPI.mjs.map +0 -1
- package/dist/_chunks/Relations-CsGlulU_.js.map +0 -1
- package/dist/_chunks/index-CsfwpRfc.mjs.map +0 -1
- package/dist/_chunks/index-oDq3VO9j.js.map +0 -1
- package/dist/_chunks/relations-BpHVgFuV.mjs.map +0 -1
- package/dist/_chunks/relations-DG7kmxa0.js.map +0 -1
- package/dist/_chunks/useDebounce-CtcjDB3L.js.map +0 -1
- package/dist/_chunks/useDebounce-DmuSJIF3.mjs +0 -29
- package/dist/_chunks/useDebounce-DmuSJIF3.mjs.map +0 -1
package/dist/server/index.js
CHANGED
@@ -10,8 +10,7 @@ const qs = require("qs");
|
|
10
10
|
const slugify = require("@sindresorhus/slugify");
|
11
11
|
const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
|
12
12
|
function _interopNamespace(e) {
|
13
|
-
if (e && e.__esModule)
|
14
|
-
return e;
|
13
|
+
if (e && e.__esModule) return e;
|
15
14
|
const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
|
16
15
|
if (e) {
|
17
16
|
for (const k in e) {
|
@@ -33,10 +32,10 @@ const isNil__default = /* @__PURE__ */ _interopDefault(isNil);
|
|
33
32
|
const ___default = /* @__PURE__ */ _interopDefault(_);
|
34
33
|
const qs__default = /* @__PURE__ */ _interopDefault(qs);
|
35
34
|
const slugify__default = /* @__PURE__ */ _interopDefault(slugify);
|
36
|
-
const getService$
|
35
|
+
const getService$2 = (name) => {
|
37
36
|
return strapi.plugin("content-manager").service(name);
|
38
37
|
};
|
39
|
-
function getService(strapi2, name) {
|
38
|
+
function getService$1(strapi2, name) {
|
40
39
|
return strapi2.service(`plugin::content-manager.${name}`);
|
41
40
|
}
|
42
41
|
const historyRestoreVersionSchema = yup__namespace.object().shape({
|
@@ -72,7 +71,7 @@ const createHistoryVersionController = ({ strapi: strapi2 }) => {
|
|
72
71
|
if (!isSingleType && (!contentTypeUid || !ctx.query.documentId)) {
|
73
72
|
throw new strapiUtils.errors.ForbiddenError("contentType and documentId are required");
|
74
73
|
}
|
75
|
-
const permissionChecker2 = getService$
|
74
|
+
const permissionChecker2 = getService$2("permission-checker").create({
|
76
75
|
userAbility: ctx.state.userAbility,
|
77
76
|
model: ctx.query.contentType
|
78
77
|
});
|
@@ -80,7 +79,7 @@ const createHistoryVersionController = ({ strapi: strapi2 }) => {
|
|
80
79
|
return ctx.forbidden();
|
81
80
|
}
|
82
81
|
const query = await permissionChecker2.sanitizeQuery(ctx.query);
|
83
|
-
const { results, pagination } = await getService(strapi2, "history").findVersionsPage({
|
82
|
+
const { results, pagination } = await getService$1(strapi2, "history").findVersionsPage({
|
84
83
|
query: {
|
85
84
|
...query,
|
86
85
|
...getValidPagination({ page: query.page, pageSize: query.pageSize })
|
@@ -105,14 +104,14 @@ const createHistoryVersionController = ({ strapi: strapi2 }) => {
|
|
105
104
|
async restoreVersion(ctx) {
|
106
105
|
const request = ctx.request;
|
107
106
|
await validateRestoreVersion(request.body, "contentType is required");
|
108
|
-
const permissionChecker2 = getService$
|
107
|
+
const permissionChecker2 = getService$2("permission-checker").create({
|
109
108
|
userAbility: ctx.state.userAbility,
|
110
109
|
model: request.body.contentType
|
111
110
|
});
|
112
111
|
if (permissionChecker2.cannot.update()) {
|
113
112
|
throw new strapiUtils.errors.ForbiddenError();
|
114
113
|
}
|
115
|
-
const restoredDocument = await getService(strapi2, "history").restoreVersion(
|
114
|
+
const restoredDocument = await getService$1(strapi2, "history").restoreVersion(
|
116
115
|
request.params.versionId
|
117
116
|
);
|
118
117
|
return {
|
@@ -121,7 +120,7 @@ const createHistoryVersionController = ({ strapi: strapi2 }) => {
|
|
121
120
|
}
|
122
121
|
};
|
123
122
|
};
|
124
|
-
const controllers$
|
123
|
+
const controllers$2 = {
|
125
124
|
"history-version": createHistoryVersionController
|
126
125
|
/**
|
127
126
|
* Casting is needed because the types aren't aware that Strapi supports
|
@@ -167,8 +166,7 @@ const createServiceUtils = ({ strapi: strapi2 }) => {
|
|
167
166
|
};
|
168
167
|
const getRelationRestoreValue = async (versionRelationData, attribute) => {
|
169
168
|
if (Array.isArray(versionRelationData)) {
|
170
|
-
if (versionRelationData.length === 0)
|
171
|
-
return versionRelationData;
|
169
|
+
if (versionRelationData.length === 0) return versionRelationData;
|
172
170
|
const existingAndMissingRelations = await Promise.all(
|
173
171
|
versionRelationData.map((relation) => {
|
174
172
|
return strapi2.documents(attribute.target).findOne({
|
@@ -177,19 +175,16 @@ const createServiceUtils = ({ strapi: strapi2 }) => {
|
|
177
175
|
});
|
178
176
|
})
|
179
177
|
);
|
180
|
-
return existingAndMissingRelations.filter(
|
181
|
-
(relation) => relation !== null
|
182
|
-
);
|
178
|
+
return existingAndMissingRelations.filter((relation) => relation !== null);
|
183
179
|
}
|
184
180
|
return strapi2.documents(attribute.target).findOne({
|
185
181
|
documentId: versionRelationData.documentId,
|
186
182
|
locale: versionRelationData.locale || void 0
|
187
183
|
});
|
188
184
|
};
|
189
|
-
const getMediaRestoreValue = async (versionRelationData
|
190
|
-
if (
|
185
|
+
const getMediaRestoreValue = async (versionRelationData) => {
|
186
|
+
if (Array.isArray(versionRelationData)) {
|
191
187
|
const existingAndMissingMedias = await Promise.all(
|
192
|
-
// @ts-expect-error Fix the type definitions so this isn't any
|
193
188
|
versionRelationData.map((media) => {
|
194
189
|
return strapi2.db.query("plugin::upload.file").findOne({ where: { id: media.id } });
|
195
190
|
})
|
@@ -203,8 +198,7 @@ const createServiceUtils = ({ strapi: strapi2 }) => {
|
|
203
198
|
const getDefaultLocale = async () => localesService ? localesService.getDefaultLocale() : null;
|
204
199
|
const isLocalizedContentType = (model) => i18nContentTypeService ? i18nContentTypeService.isLocalizedContentType(model) : false;
|
205
200
|
const getLocaleDictionary = async () => {
|
206
|
-
if (!localesService)
|
207
|
-
return {};
|
201
|
+
if (!localesService) return {};
|
208
202
|
const locales = await localesService.find() || [];
|
209
203
|
return locales.reduce(
|
210
204
|
(acc, locale) => {
|
@@ -228,6 +222,17 @@ const createServiceUtils = ({ strapi: strapi2 }) => {
|
|
228
222
|
const meta = await documentMetadataService.getMetadata(contentTypeUid, document);
|
229
223
|
return documentMetadataService.getStatus(document, meta.availableStatus);
|
230
224
|
};
|
225
|
+
const getComponentFields = (componentUID) => {
|
226
|
+
return Object.entries(strapi2.getModel(componentUID).attributes).reduce(
|
227
|
+
(fieldsAcc, [key, attribute]) => {
|
228
|
+
if (!["relation", "media", "component", "dynamiczone"].includes(attribute.type)) {
|
229
|
+
fieldsAcc.push(key);
|
230
|
+
}
|
231
|
+
return fieldsAcc;
|
232
|
+
},
|
233
|
+
[]
|
234
|
+
);
|
235
|
+
};
|
231
236
|
const getDeepPopulate2 = (uid2, useDatabaseSyntax = false) => {
|
232
237
|
const model = strapi2.getModel(uid2);
|
233
238
|
const attributes = Object.entries(model.attributes);
|
@@ -251,13 +256,19 @@ const createServiceUtils = ({ strapi: strapi2 }) => {
|
|
251
256
|
}
|
252
257
|
case "component": {
|
253
258
|
const populate = getDeepPopulate2(attribute.component);
|
254
|
-
acc[attributeName] = {
|
259
|
+
acc[attributeName] = {
|
260
|
+
populate,
|
261
|
+
[fieldSelector]: getComponentFields(attribute.component)
|
262
|
+
};
|
255
263
|
break;
|
256
264
|
}
|
257
265
|
case "dynamiczone": {
|
258
266
|
const populatedComponents = (attribute.components || []).reduce(
|
259
267
|
(acc2, componentUID) => {
|
260
|
-
acc2[componentUID] = {
|
268
|
+
acc2[componentUID] = {
|
269
|
+
populate: getDeepPopulate2(componentUID),
|
270
|
+
[fieldSelector]: getComponentFields(componentUID)
|
271
|
+
};
|
261
272
|
return acc2;
|
262
273
|
},
|
263
274
|
{}
|
@@ -342,8 +353,8 @@ const createHistoryService = ({ strapi: strapi2 }) => {
|
|
342
353
|
});
|
343
354
|
},
|
344
355
|
async findVersionsPage(params) {
|
345
|
-
const
|
346
|
-
const isLocalizedContentType = serviceUtils.isLocalizedContentType(
|
356
|
+
const schema = strapi2.getModel(params.query.contentType);
|
357
|
+
const isLocalizedContentType = serviceUtils.isLocalizedContentType(schema);
|
347
358
|
const defaultLocale = await serviceUtils.getDefaultLocale();
|
348
359
|
let locale = null;
|
349
360
|
if (isLocalizedContentType) {
|
@@ -364,32 +375,20 @@ const createHistoryService = ({ strapi: strapi2 }) => {
|
|
364
375
|
}),
|
365
376
|
serviceUtils.getLocaleDictionary()
|
366
377
|
]);
|
367
|
-
const
|
368
|
-
|
369
|
-
async (
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
model: "plugin::upload.file"
|
376
|
-
});
|
377
|
-
const response = await serviceUtils.buildMediaResponse(attributeValues);
|
378
|
-
const sanitizedResults = await Promise.all(
|
379
|
-
response.results.map((media) => permissionChecker2.sanitizeOutput(media))
|
380
|
-
);
|
381
|
-
return {
|
382
|
-
...await currentDataWithRelations,
|
383
|
-
[attributeKey]: {
|
384
|
-
results: sanitizedResults,
|
385
|
-
meta: response.meta
|
386
|
-
}
|
387
|
-
};
|
378
|
+
const populateEntry = async (entry) => {
|
379
|
+
return strapiUtils.traverseEntity(
|
380
|
+
async (options, utils) => {
|
381
|
+
if (!options.attribute) return;
|
382
|
+
if (!options.value) return;
|
383
|
+
const currentValue = Array.isArray(options.value) ? options.value : [options.value];
|
384
|
+
if (options.attribute.type === "component") {
|
385
|
+
utils.remove("id");
|
388
386
|
}
|
389
|
-
if (
|
390
|
-
|
387
|
+
if (options.attribute.type === "relation" && // TODO: handle polymorphic relations
|
388
|
+
options.attribute.relation !== "morphToOne" && options.attribute.relation !== "morphToMany") {
|
389
|
+
if (options.attribute.target === "admin::user") {
|
391
390
|
const adminUsers = await Promise.all(
|
392
|
-
|
391
|
+
currentValue.map((userToPopulate) => {
|
393
392
|
if (userToPopulate == null) {
|
394
393
|
return null;
|
395
394
|
}
|
@@ -401,46 +400,51 @@ const createHistoryService = ({ strapi: strapi2 }) => {
|
|
401
400
|
});
|
402
401
|
})
|
403
402
|
);
|
404
|
-
|
405
|
-
...await currentDataWithRelations,
|
406
|
-
/**
|
407
|
-
* Ideally we would return the same "{results: [], meta: {}}" shape, however,
|
408
|
-
* when sanitizing the data as a whole in the controller before sending to the client,
|
409
|
-
* the data for admin relation user is completely sanitized if we return an object here as opposed to an array.
|
410
|
-
*/
|
411
|
-
[attributeKey]: adminUsers
|
412
|
-
};
|
403
|
+
utils.set(options.key, adminUsers);
|
413
404
|
}
|
414
|
-
const permissionChecker2 = getService$
|
405
|
+
const permissionChecker2 = getService$2("permission-checker").create({
|
415
406
|
userAbility: params.state.userAbility,
|
416
|
-
model:
|
407
|
+
model: options.attribute.target
|
417
408
|
});
|
418
409
|
const response = await serviceUtils.buildRelationReponse(
|
419
|
-
|
420
|
-
|
410
|
+
currentValue,
|
411
|
+
options.attribute
|
421
412
|
);
|
422
413
|
const sanitizedResults = await Promise.all(
|
423
414
|
response.results.map((media) => permissionChecker2.sanitizeOutput(media))
|
424
415
|
);
|
425
|
-
|
426
|
-
|
427
|
-
|
428
|
-
|
429
|
-
meta: response.meta
|
430
|
-
}
|
431
|
-
};
|
416
|
+
utils.set(options.key, {
|
417
|
+
results: sanitizedResults,
|
418
|
+
meta: response.meta
|
419
|
+
});
|
432
420
|
}
|
433
|
-
|
421
|
+
if (options.attribute.type === "media") {
|
422
|
+
const permissionChecker2 = getService$2("permission-checker").create({
|
423
|
+
userAbility: params.state.userAbility,
|
424
|
+
model: "plugin::upload.file"
|
425
|
+
});
|
426
|
+
const response = await serviceUtils.buildMediaResponse(currentValue);
|
427
|
+
const sanitizedResults = await Promise.all(
|
428
|
+
response.results.map((media) => permissionChecker2.sanitizeOutput(media))
|
429
|
+
);
|
430
|
+
utils.set(options.key, {
|
431
|
+
results: sanitizedResults,
|
432
|
+
meta: response.meta
|
433
|
+
});
|
434
|
+
}
|
435
|
+
},
|
436
|
+
{
|
437
|
+
schema,
|
438
|
+
getModel: strapi2.getModel.bind(strapi2)
|
434
439
|
},
|
435
|
-
|
440
|
+
entry.data
|
436
441
|
);
|
437
|
-
return entryWithRelations;
|
438
442
|
};
|
439
443
|
const formattedResults = await Promise.all(
|
440
444
|
results.map(async (result) => {
|
441
445
|
return {
|
442
446
|
...result,
|
443
|
-
data: await
|
447
|
+
data: await populateEntry(result),
|
444
448
|
meta: {
|
445
449
|
unknownAttributes: serviceUtils.getSchemaAttributesDiff(
|
446
450
|
result.schema,
|
@@ -471,30 +475,44 @@ const createHistoryService = ({ strapi: strapi2 }) => {
|
|
471
475
|
// Clone to avoid mutating the original version data
|
472
476
|
structuredClone(version.data)
|
473
477
|
);
|
474
|
-
const
|
475
|
-
|
476
|
-
|
477
|
-
|
478
|
-
|
479
|
-
|
480
|
-
|
481
|
-
|
482
|
-
|
483
|
-
|
478
|
+
const schema = structuredClone(version.schema);
|
479
|
+
schema.attributes = fp.omit(FIELDS_TO_IGNORE, contentTypeSchemaAttributes);
|
480
|
+
const dataWithoutMissingRelations = await strapiUtils.traverseEntity(
|
481
|
+
async (options, utils) => {
|
482
|
+
if (!options.attribute) return;
|
483
|
+
if (options.attribute.type === "component") {
|
484
|
+
utils.remove("id");
|
485
|
+
if (options.attribute.repeatable && options.value === null) {
|
486
|
+
utils.set(options.key, []);
|
487
|
+
}
|
484
488
|
}
|
485
|
-
if (attribute.type === "
|
486
|
-
|
487
|
-
|
488
|
-
|
489
|
+
if (options.attribute.type === "dynamiczone") {
|
490
|
+
if (options.value === null) {
|
491
|
+
utils.set(options.key, []);
|
492
|
+
}
|
489
493
|
}
|
490
|
-
if (attribute.type === "
|
491
|
-
|
492
|
-
|
494
|
+
if (options.attribute.type === "relation" && // TODO: handle polymorphic relations
|
495
|
+
options.attribute.relation !== "morphToOne" && options.attribute.relation !== "morphToMany") {
|
496
|
+
if (!options.value) return;
|
497
|
+
const data2 = await serviceUtils.getRelationRestoreValue(
|
498
|
+
options.value,
|
499
|
+
options.attribute
|
500
|
+
);
|
501
|
+
utils.set(options.key, data2);
|
502
|
+
}
|
503
|
+
if (options.attribute.type === "media") {
|
504
|
+
if (!options.value) return;
|
505
|
+
const data2 = await serviceUtils.getMediaRestoreValue(
|
506
|
+
options.value
|
507
|
+
);
|
508
|
+
utils.set(options.key, data2);
|
493
509
|
}
|
494
|
-
return previousRelationAttributes;
|
495
510
|
},
|
496
|
-
|
497
|
-
|
511
|
+
{
|
512
|
+
schema,
|
513
|
+
getModel: strapi2.getModel.bind(strapi2)
|
514
|
+
},
|
515
|
+
dataWithoutAddedAttributes
|
498
516
|
);
|
499
517
|
const data = fp.omit(["id", ...Object.keys(schemaDiff.removed)], dataWithoutMissingRelations);
|
500
518
|
const restoredDocument = await strapi2.documents(version.contentType).update({
|
@@ -587,7 +605,7 @@ const createLifecyclesService = ({ strapi: strapi2 }) => {
|
|
587
605
|
onCommit(async () => {
|
588
606
|
for (const entry of localeEntries) {
|
589
607
|
const status = await serviceUtils.getVersionStatus(uid2, entry);
|
590
|
-
await getService(strapi2, "history").createVersion({
|
608
|
+
await getService$1(strapi2, "history").createVersion({
|
591
609
|
contentType: uid2,
|
592
610
|
data: fp.omit(FIELDS_TO_IGNORE, entry),
|
593
611
|
relatedDocumentId: documentId,
|
@@ -600,15 +618,19 @@ const createLifecyclesService = ({ strapi: strapi2 }) => {
|
|
600
618
|
});
|
601
619
|
return result;
|
602
620
|
});
|
603
|
-
state.deleteExpiredJob = nodeSchedule.scheduleJob("0 0 * * *", () => {
|
621
|
+
state.deleteExpiredJob = nodeSchedule.scheduleJob("historyDaily", "0 0 * * *", () => {
|
604
622
|
const retentionDaysInMilliseconds = serviceUtils.getRetentionDays() * 24 * 60 * 60 * 1e3;
|
605
623
|
const expirationDate = new Date(Date.now() - retentionDaysInMilliseconds);
|
606
624
|
strapi2.db.query(HISTORY_VERSION_UID).deleteMany({
|
607
625
|
where: {
|
608
626
|
created_at: {
|
609
|
-
$lt: expirationDate
|
627
|
+
$lt: expirationDate
|
610
628
|
}
|
611
629
|
}
|
630
|
+
}).catch((error) => {
|
631
|
+
if (error instanceof Error) {
|
632
|
+
strapi2.log.error("Error deleting expired history versions", error.message);
|
633
|
+
}
|
612
634
|
});
|
613
635
|
});
|
614
636
|
state.isInitialized = true;
|
@@ -620,17 +642,17 @@ const createLifecyclesService = ({ strapi: strapi2 }) => {
|
|
620
642
|
}
|
621
643
|
};
|
622
644
|
};
|
623
|
-
const services$
|
645
|
+
const services$2 = {
|
624
646
|
history: createHistoryService,
|
625
647
|
lifecycles: createLifecyclesService
|
626
648
|
};
|
627
|
-
const info = { pluginName: "content-manager", type: "admin" };
|
649
|
+
const info$1 = { pluginName: "content-manager", type: "admin" };
|
628
650
|
const historyVersionRouter = {
|
629
651
|
type: "admin",
|
630
652
|
routes: [
|
631
653
|
{
|
632
654
|
method: "GET",
|
633
|
-
info,
|
655
|
+
info: info$1,
|
634
656
|
path: "/history-versions",
|
635
657
|
handler: "history-version.findMany",
|
636
658
|
config: {
|
@@ -639,7 +661,7 @@ const historyVersionRouter = {
|
|
639
661
|
},
|
640
662
|
{
|
641
663
|
method: "PUT",
|
642
|
-
info,
|
664
|
+
info: info$1,
|
643
665
|
path: "/history-versions/:versionId/restore",
|
644
666
|
handler: "history-version.restoreVersion",
|
645
667
|
config: {
|
@@ -648,7 +670,7 @@ const historyVersionRouter = {
|
|
648
670
|
}
|
649
671
|
]
|
650
672
|
};
|
651
|
-
const routes$
|
673
|
+
const routes$2 = {
|
652
674
|
"history-version": historyVersionRouter
|
653
675
|
};
|
654
676
|
const historyVersion = {
|
@@ -695,21 +717,21 @@ const historyVersion = {
|
|
695
717
|
}
|
696
718
|
}
|
697
719
|
};
|
698
|
-
const getFeature = () => {
|
720
|
+
const getFeature$1 = () => {
|
699
721
|
if (strapi.ee.features.isEnabled("cms-content-history")) {
|
700
722
|
return {
|
701
723
|
register({ strapi: strapi2 }) {
|
702
724
|
strapi2.get("models").add(historyVersion);
|
703
725
|
},
|
704
726
|
bootstrap({ strapi: strapi2 }) {
|
705
|
-
getService(strapi2, "lifecycles").bootstrap();
|
727
|
+
getService$1(strapi2, "lifecycles").bootstrap();
|
706
728
|
},
|
707
729
|
destroy({ strapi: strapi2 }) {
|
708
|
-
getService(strapi2, "lifecycles").destroy();
|
730
|
+
getService$1(strapi2, "lifecycles").destroy();
|
709
731
|
},
|
710
|
-
controllers: controllers$
|
711
|
-
services: services$
|
712
|
-
routes: routes$
|
732
|
+
controllers: controllers$2,
|
733
|
+
services: services$2,
|
734
|
+
routes: routes$2
|
713
735
|
};
|
714
736
|
}
|
715
737
|
return {
|
@@ -718,9 +740,201 @@ const getFeature = () => {
|
|
718
740
|
}
|
719
741
|
};
|
720
742
|
};
|
721
|
-
const history = getFeature();
|
743
|
+
const history = getFeature$1();
|
744
|
+
const info = { pluginName: "content-manager", type: "admin" };
|
745
|
+
const previewRouter = {
|
746
|
+
type: "admin",
|
747
|
+
routes: [
|
748
|
+
{
|
749
|
+
method: "GET",
|
750
|
+
info,
|
751
|
+
path: "/preview/url/:contentType",
|
752
|
+
handler: "preview.getPreviewUrl",
|
753
|
+
config: {
|
754
|
+
policies: ["admin::isAuthenticatedAdmin"]
|
755
|
+
}
|
756
|
+
}
|
757
|
+
]
|
758
|
+
};
|
759
|
+
const routes$1 = {
|
760
|
+
preview: previewRouter
|
761
|
+
};
|
762
|
+
function getService(strapi2, name) {
|
763
|
+
return strapi2.service(`plugin::content-manager.${name}`);
|
764
|
+
}
|
765
|
+
const getPreviewUrlSchema = yup__namespace.object().shape({
|
766
|
+
// Will be undefined for single types
|
767
|
+
documentId: yup__namespace.string(),
|
768
|
+
locale: yup__namespace.string().nullable(),
|
769
|
+
status: yup__namespace.string()
|
770
|
+
}).required();
|
771
|
+
const validatePreviewUrl = async (strapi2, uid2, params) => {
|
772
|
+
await strapiUtils.validateYupSchema(getPreviewUrlSchema)(params);
|
773
|
+
const newParams = fp.pick(["documentId", "locale", "status"], params);
|
774
|
+
const model = strapi2.getModel(uid2);
|
775
|
+
if (!model || model.modelType !== "contentType") {
|
776
|
+
throw new strapiUtils.errors.ValidationError("Invalid content type");
|
777
|
+
}
|
778
|
+
const isSingleType = model?.kind === "singleType";
|
779
|
+
if (!isSingleType && !params.documentId) {
|
780
|
+
throw new strapiUtils.errors.ValidationError("documentId is required for Collection Types");
|
781
|
+
}
|
782
|
+
if (isSingleType) {
|
783
|
+
const doc = await strapi2.documents(uid2).findFirst();
|
784
|
+
if (!doc) {
|
785
|
+
throw new strapiUtils.errors.NotFoundError("Document not found");
|
786
|
+
}
|
787
|
+
newParams.documentId = doc?.documentId;
|
788
|
+
}
|
789
|
+
if (!newParams.status) {
|
790
|
+
const isDPEnabled = model?.options?.draftAndPublish;
|
791
|
+
newParams.status = isDPEnabled ? "draft" : "published";
|
792
|
+
}
|
793
|
+
return newParams;
|
794
|
+
};
|
795
|
+
const createPreviewController = () => {
|
796
|
+
return {
|
797
|
+
/**
|
798
|
+
* Transforms an entry into a preview URL, so that it can be previewed
|
799
|
+
* in the Content Manager.
|
800
|
+
*/
|
801
|
+
async getPreviewUrl(ctx) {
|
802
|
+
const uid2 = ctx.params.contentType;
|
803
|
+
const query = ctx.request.query;
|
804
|
+
const params = await validatePreviewUrl(strapi, uid2, query);
|
805
|
+
const previewService = getService(strapi, "preview");
|
806
|
+
const url = await previewService.getPreviewUrl(uid2, params);
|
807
|
+
if (!url) {
|
808
|
+
ctx.status = 204;
|
809
|
+
}
|
810
|
+
return {
|
811
|
+
data: { url }
|
812
|
+
};
|
813
|
+
}
|
814
|
+
};
|
815
|
+
};
|
816
|
+
const controllers$1 = {
|
817
|
+
preview: createPreviewController
|
818
|
+
/**
|
819
|
+
* Casting is needed because the types aren't aware that Strapi supports
|
820
|
+
* passing a controller factory as the value, instead of a controller object directly
|
821
|
+
*/
|
822
|
+
};
|
823
|
+
const createPreviewService = ({ strapi: strapi2 }) => {
|
824
|
+
const config = getService(strapi2, "preview-config");
|
825
|
+
return {
|
826
|
+
async getPreviewUrl(uid2, params) {
|
827
|
+
const handler = config.getPreviewHandler();
|
828
|
+
try {
|
829
|
+
return handler(uid2, params);
|
830
|
+
} catch (error) {
|
831
|
+
strapi2.log.error(`Failed to get preview URL: ${error}`);
|
832
|
+
throw new strapiUtils.errors.ApplicationError("Failed to get preview URL");
|
833
|
+
}
|
834
|
+
return;
|
835
|
+
}
|
836
|
+
};
|
837
|
+
};
|
838
|
+
const extendMiddlewareConfiguration = (middleware = { name: "", config: {} }) => {
|
839
|
+
const middlewares = strapi.config.get("middlewares");
|
840
|
+
const configuredMiddlewares = middlewares.map((currentMiddleware) => {
|
841
|
+
if (currentMiddleware === middleware.name) {
|
842
|
+
return middleware;
|
843
|
+
}
|
844
|
+
if (currentMiddleware.name === middleware.name) {
|
845
|
+
return fp.mergeWith(
|
846
|
+
(objValue, srcValue) => {
|
847
|
+
if (Array.isArray(objValue)) {
|
848
|
+
return objValue.concat(srcValue);
|
849
|
+
}
|
850
|
+
return void 0;
|
851
|
+
},
|
852
|
+
currentMiddleware,
|
853
|
+
middleware
|
854
|
+
);
|
855
|
+
}
|
856
|
+
return currentMiddleware;
|
857
|
+
});
|
858
|
+
strapi.config.set("middlewares", configuredMiddlewares);
|
859
|
+
};
|
860
|
+
const createPreviewConfigService = ({ strapi: strapi2 }) => {
|
861
|
+
return {
|
862
|
+
register() {
|
863
|
+
if (!this.isEnabled()) {
|
864
|
+
return;
|
865
|
+
}
|
866
|
+
const config = strapi2.config.get("admin.preview");
|
867
|
+
if (config.config?.allowedOrigins) {
|
868
|
+
extendMiddlewareConfiguration({
|
869
|
+
name: "strapi::security",
|
870
|
+
config: {
|
871
|
+
contentSecurityPolicy: {
|
872
|
+
directives: {
|
873
|
+
"frame-src": config.config.allowedOrigins
|
874
|
+
}
|
875
|
+
}
|
876
|
+
}
|
877
|
+
});
|
878
|
+
}
|
879
|
+
},
|
880
|
+
isEnabled() {
|
881
|
+
const config = strapi2.config.get("admin.preview");
|
882
|
+
if (!config) {
|
883
|
+
return false;
|
884
|
+
}
|
885
|
+
return config?.enabled ?? true;
|
886
|
+
},
|
887
|
+
/**
|
888
|
+
* Validate if the configuration is valid
|
889
|
+
*/
|
890
|
+
validate() {
|
891
|
+
if (!this.isEnabled()) {
|
892
|
+
return;
|
893
|
+
}
|
894
|
+
const handler = this.getPreviewHandler();
|
895
|
+
if (typeof handler !== "function") {
|
896
|
+
throw new strapiUtils.errors.ValidationError(
|
897
|
+
"Preview configuration is invalid. Handler must be a function"
|
898
|
+
);
|
899
|
+
}
|
900
|
+
},
|
901
|
+
/**
|
902
|
+
* Utility to get the preview handler from the configuration
|
903
|
+
*/
|
904
|
+
getPreviewHandler() {
|
905
|
+
const config = strapi2.config.get("admin.preview");
|
906
|
+
const emptyHandler = () => {
|
907
|
+
return void 0;
|
908
|
+
};
|
909
|
+
if (!this.isEnabled()) {
|
910
|
+
return emptyHandler;
|
911
|
+
}
|
912
|
+
return config?.config?.handler || emptyHandler;
|
913
|
+
}
|
914
|
+
};
|
915
|
+
};
|
916
|
+
const services$1 = {
|
917
|
+
preview: createPreviewService,
|
918
|
+
"preview-config": createPreviewConfigService
|
919
|
+
};
|
920
|
+
const getFeature = () => {
|
921
|
+
return {
|
922
|
+
register() {
|
923
|
+
const config = getService(strapi, "preview-config");
|
924
|
+
config.validate();
|
925
|
+
config.register();
|
926
|
+
},
|
927
|
+
bootstrap() {
|
928
|
+
},
|
929
|
+
routes: routes$1,
|
930
|
+
controllers: controllers$1,
|
931
|
+
services: services$1
|
932
|
+
};
|
933
|
+
};
|
934
|
+
const preview = getFeature();
|
722
935
|
const register = async ({ strapi: strapi2 }) => {
|
723
936
|
await history.register?.({ strapi: strapi2 });
|
937
|
+
await preview.register?.({ strapi: strapi2 });
|
724
938
|
};
|
725
939
|
const ALLOWED_WEBHOOK_EVENTS = {
|
726
940
|
ENTRY_PUBLISH: "entry.publish",
|
@@ -730,11 +944,12 @@ const bootstrap = async () => {
|
|
730
944
|
Object.entries(ALLOWED_WEBHOOK_EVENTS).forEach(([key, value]) => {
|
731
945
|
strapi.get("webhookStore").addAllowedEvent(key, value);
|
732
946
|
});
|
733
|
-
getService$
|
734
|
-
await getService$
|
735
|
-
await getService$
|
736
|
-
await getService$
|
947
|
+
getService$2("field-sizes").setCustomFieldInputSizes();
|
948
|
+
await getService$2("components").syncConfigurations();
|
949
|
+
await getService$2("content-types").syncConfigurations();
|
950
|
+
await getService$2("permission").registerPermissions();
|
737
951
|
await history.bootstrap?.({ strapi });
|
952
|
+
await preview.bootstrap?.({ strapi });
|
738
953
|
};
|
739
954
|
const destroy = async ({ strapi: strapi2 }) => {
|
740
955
|
await history.destroy?.({ strapi: strapi2 });
|
@@ -1224,7 +1439,8 @@ const admin = {
|
|
1224
1439
|
};
|
1225
1440
|
const routes = {
|
1226
1441
|
admin,
|
1227
|
-
...history.routes ? history.routes : {}
|
1442
|
+
...history.routes ? history.routes : {},
|
1443
|
+
...preview.routes ? preview.routes : {}
|
1228
1444
|
};
|
1229
1445
|
const hasPermissionsSchema = strapiUtils.yup.object({
|
1230
1446
|
actions: strapiUtils.yup.array().of(strapiUtils.yup.string()),
|
@@ -1287,8 +1503,7 @@ const isSortable = (schema, name) => {
|
|
1287
1503
|
if (!___default.default.has(schema.attributes, name)) {
|
1288
1504
|
return false;
|
1289
1505
|
}
|
1290
|
-
if (schema.modelType === "component" && name === "id")
|
1291
|
-
return false;
|
1506
|
+
if (schema.modelType === "component" && name === "id") return false;
|
1292
1507
|
const attribute = schema.attributes[name];
|
1293
1508
|
if (NON_SORTABLES.includes(attribute.type)) {
|
1294
1509
|
return false;
|
@@ -1433,8 +1648,7 @@ const createDefaultSettings = async (schema) => {
|
|
1433
1648
|
};
|
1434
1649
|
};
|
1435
1650
|
const syncSettings = async (configuration, schema) => {
|
1436
|
-
if (fp.isEmpty(configuration.settings))
|
1437
|
-
return createDefaultSettings(schema);
|
1651
|
+
if (fp.isEmpty(configuration.settings)) return createDefaultSettings(schema);
|
1438
1652
|
const defaultField = getDefaultMainField(schema);
|
1439
1653
|
const { mainField = defaultField, defaultSortBy = defaultField } = configuration.settings || {};
|
1440
1654
|
return {
|
@@ -1481,7 +1695,7 @@ const createMetadasSchema = (schema) => {
|
|
1481
1695
|
if (!value) {
|
1482
1696
|
return strapiUtils.yup.string();
|
1483
1697
|
}
|
1484
|
-
const targetSchema = getService$
|
1698
|
+
const targetSchema = getService$2("content-types").findContentType(
|
1485
1699
|
schema.attributes[key].targetModel
|
1486
1700
|
);
|
1487
1701
|
if (!targetSchema) {
|
@@ -1610,8 +1824,7 @@ const excludeNotCreatableFields = (uid2, permissionChecker2) => (body, path = []
|
|
1610
1824
|
}
|
1611
1825
|
switch (attribute.type) {
|
1612
1826
|
case "relation": {
|
1613
|
-
if (canCreate(attributePath))
|
1614
|
-
return body2;
|
1827
|
+
if (canCreate(attributePath)) return body2;
|
1615
1828
|
return fp.set(attributePath, { set: [] }, body2);
|
1616
1829
|
}
|
1617
1830
|
case "component": {
|
@@ -1621,8 +1834,7 @@ const excludeNotCreatableFields = (uid2, permissionChecker2) => (body, path = []
|
|
1621
1834
|
]);
|
1622
1835
|
}
|
1623
1836
|
default: {
|
1624
|
-
if (canCreate(attributePath))
|
1625
|
-
return body2;
|
1837
|
+
if (canCreate(attributePath)) return body2;
|
1626
1838
|
return fp.set(attributePath, null, body2);
|
1627
1839
|
}
|
1628
1840
|
}
|
@@ -1650,7 +1862,7 @@ const getDocumentLocaleAndStatus = async (request, model, opts = { allowMultiple
|
|
1650
1862
|
}
|
1651
1863
|
};
|
1652
1864
|
const formatDocumentWithMetadata = async (permissionChecker2, uid2, document, opts = {}) => {
|
1653
|
-
const documentMetadata2 = getService$
|
1865
|
+
const documentMetadata2 = getService$2("document-metadata");
|
1654
1866
|
const serviceOutput = await documentMetadata2.formatDocumentWithMetadata(uid2, document, opts);
|
1655
1867
|
let {
|
1656
1868
|
meta: { availableLocales, availableStatus }
|
@@ -1676,8 +1888,8 @@ const createDocument = async (ctx, opts) => {
|
|
1676
1888
|
const { userAbility, user } = ctx.state;
|
1677
1889
|
const { model } = ctx.params;
|
1678
1890
|
const { body } = ctx.request;
|
1679
|
-
const documentManager2 = getService$
|
1680
|
-
const permissionChecker2 = getService$
|
1891
|
+
const documentManager2 = getService$2("document-manager");
|
1892
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
1681
1893
|
if (permissionChecker2.cannot.create()) {
|
1682
1894
|
throw new strapiUtils.errors.ForbiddenError();
|
1683
1895
|
}
|
@@ -1697,13 +1909,13 @@ const updateDocument = async (ctx, opts) => {
|
|
1697
1909
|
const { userAbility, user } = ctx.state;
|
1698
1910
|
const { id, model } = ctx.params;
|
1699
1911
|
const { body } = ctx.request;
|
1700
|
-
const documentManager2 = getService$
|
1701
|
-
const permissionChecker2 = getService$
|
1912
|
+
const documentManager2 = getService$2("document-manager");
|
1913
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
1702
1914
|
if (permissionChecker2.cannot.update()) {
|
1703
1915
|
throw new strapiUtils.errors.ForbiddenError();
|
1704
1916
|
}
|
1705
1917
|
const permissionQuery = await permissionChecker2.sanitizedQuery.update(ctx.query);
|
1706
|
-
const populate = await getService$
|
1918
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
|
1707
1919
|
const { locale } = await getDocumentLocaleAndStatus(body, model);
|
1708
1920
|
const [documentVersion, documentExists] = await Promise.all([
|
1709
1921
|
documentManager2.findOne(id, model, { populate, locale, status: "draft" }),
|
@@ -1734,14 +1946,14 @@ const collectionTypes = {
|
|
1734
1946
|
const { userAbility } = ctx.state;
|
1735
1947
|
const { model } = ctx.params;
|
1736
1948
|
const { query } = ctx.request;
|
1737
|
-
const documentMetadata2 = getService$
|
1738
|
-
const documentManager2 = getService$
|
1739
|
-
const permissionChecker2 = getService$
|
1949
|
+
const documentMetadata2 = getService$2("document-metadata");
|
1950
|
+
const documentManager2 = getService$2("document-manager");
|
1951
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
1740
1952
|
if (permissionChecker2.cannot.read()) {
|
1741
1953
|
return ctx.forbidden();
|
1742
1954
|
}
|
1743
1955
|
const permissionQuery = await permissionChecker2.sanitizedQuery.read(query);
|
1744
|
-
const populate = await getService$
|
1956
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(1).countRelations({ toOne: false, toMany: true }).build();
|
1745
1957
|
const { locale, status } = await getDocumentLocaleAndStatus(query, model);
|
1746
1958
|
const { results: documents, pagination } = await documentManager2.findPage(
|
1747
1959
|
{ ...permissionQuery, populate, locale, status },
|
@@ -1770,13 +1982,13 @@ const collectionTypes = {
|
|
1770
1982
|
async findOne(ctx) {
|
1771
1983
|
const { userAbility } = ctx.state;
|
1772
1984
|
const { model, id } = ctx.params;
|
1773
|
-
const documentManager2 = getService$
|
1774
|
-
const permissionChecker2 = getService$
|
1985
|
+
const documentManager2 = getService$2("document-manager");
|
1986
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
1775
1987
|
if (permissionChecker2.cannot.read()) {
|
1776
1988
|
return ctx.forbidden();
|
1777
1989
|
}
|
1778
1990
|
const permissionQuery = await permissionChecker2.sanitizedQuery.read(ctx.query);
|
1779
|
-
const populate = await getService$
|
1991
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(Infinity).countRelations().build();
|
1780
1992
|
const { locale, status } = await getDocumentLocaleAndStatus(ctx.query, model);
|
1781
1993
|
const version = await documentManager2.findOne(id, model, {
|
1782
1994
|
populate,
|
@@ -1807,7 +2019,7 @@ const collectionTypes = {
|
|
1807
2019
|
async create(ctx) {
|
1808
2020
|
const { userAbility } = ctx.state;
|
1809
2021
|
const { model } = ctx.params;
|
1810
|
-
const permissionChecker2 = getService$
|
2022
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
1811
2023
|
const [totalEntries, document] = await Promise.all([
|
1812
2024
|
strapi.db.query(model).count(),
|
1813
2025
|
createDocument(ctx)
|
@@ -1828,7 +2040,7 @@ const collectionTypes = {
|
|
1828
2040
|
async update(ctx) {
|
1829
2041
|
const { userAbility } = ctx.state;
|
1830
2042
|
const { model } = ctx.params;
|
1831
|
-
const permissionChecker2 = getService$
|
2043
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
1832
2044
|
const updatedVersion = await updateDocument(ctx);
|
1833
2045
|
const sanitizedVersion = await permissionChecker2.sanitizeOutput(updatedVersion);
|
1834
2046
|
ctx.body = await formatDocumentWithMetadata(permissionChecker2, model, sanitizedVersion);
|
@@ -1837,13 +2049,13 @@ const collectionTypes = {
|
|
1837
2049
|
const { userAbility, user } = ctx.state;
|
1838
2050
|
const { model, sourceId: id } = ctx.params;
|
1839
2051
|
const { body } = ctx.request;
|
1840
|
-
const documentManager2 = getService$
|
1841
|
-
const permissionChecker2 = getService$
|
2052
|
+
const documentManager2 = getService$2("document-manager");
|
2053
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
1842
2054
|
if (permissionChecker2.cannot.create()) {
|
1843
2055
|
return ctx.forbidden();
|
1844
2056
|
}
|
1845
2057
|
const permissionQuery = await permissionChecker2.sanitizedQuery.create(ctx.query);
|
1846
|
-
const populate = await getService$
|
2058
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
|
1847
2059
|
const { locale } = await getDocumentLocaleAndStatus(body, model);
|
1848
2060
|
const document = await documentManager2.findOne(id, model, {
|
1849
2061
|
populate,
|
@@ -1882,13 +2094,13 @@ const collectionTypes = {
|
|
1882
2094
|
async delete(ctx) {
|
1883
2095
|
const { userAbility } = ctx.state;
|
1884
2096
|
const { id, model } = ctx.params;
|
1885
|
-
const documentManager2 = getService$
|
1886
|
-
const permissionChecker2 = getService$
|
2097
|
+
const documentManager2 = getService$2("document-manager");
|
2098
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
1887
2099
|
if (permissionChecker2.cannot.delete()) {
|
1888
2100
|
return ctx.forbidden();
|
1889
2101
|
}
|
1890
2102
|
const permissionQuery = await permissionChecker2.sanitizedQuery.delete(ctx.query);
|
1891
|
-
const populate = await getService$
|
2103
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
|
1892
2104
|
const { locale } = await getDocumentLocaleAndStatus(ctx.query, model);
|
1893
2105
|
const documentLocales = await documentManager2.findLocales(id, model, { populate, locale });
|
1894
2106
|
if (documentLocales.length === 0) {
|
@@ -1910,14 +2122,14 @@ const collectionTypes = {
|
|
1910
2122
|
const { userAbility } = ctx.state;
|
1911
2123
|
const { id, model } = ctx.params;
|
1912
2124
|
const { body } = ctx.request;
|
1913
|
-
const documentManager2 = getService$
|
1914
|
-
const permissionChecker2 = getService$
|
2125
|
+
const documentManager2 = getService$2("document-manager");
|
2126
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
1915
2127
|
if (permissionChecker2.cannot.publish()) {
|
1916
2128
|
return ctx.forbidden();
|
1917
2129
|
}
|
1918
2130
|
const publishedDocument = await strapi.db.transaction(async () => {
|
1919
2131
|
const permissionQuery = await permissionChecker2.sanitizedQuery.publish(ctx.query);
|
1920
|
-
const populate = await getService$
|
2132
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(Infinity).countRelations().build();
|
1921
2133
|
let document;
|
1922
2134
|
const { locale } = await getDocumentLocaleAndStatus(body, model);
|
1923
2135
|
const isCreate = fp.isNil(id);
|
@@ -1965,13 +2177,13 @@ const collectionTypes = {
|
|
1965
2177
|
const { body } = ctx.request;
|
1966
2178
|
const { documentIds } = body;
|
1967
2179
|
await validateBulkActionInput(body);
|
1968
|
-
const documentManager2 = getService$
|
1969
|
-
const permissionChecker2 = getService$
|
2180
|
+
const documentManager2 = getService$2("document-manager");
|
2181
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
1970
2182
|
if (permissionChecker2.cannot.publish()) {
|
1971
2183
|
return ctx.forbidden();
|
1972
2184
|
}
|
1973
2185
|
const permissionQuery = await permissionChecker2.sanitizedQuery.publish(ctx.query);
|
1974
|
-
const populate = await getService$
|
2186
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(Infinity).countRelations().build();
|
1975
2187
|
const { locale } = await getDocumentLocaleAndStatus(body, model, {
|
1976
2188
|
allowMultipleLocales: true
|
1977
2189
|
});
|
@@ -1996,8 +2208,8 @@ const collectionTypes = {
|
|
1996
2208
|
const { body } = ctx.request;
|
1997
2209
|
const { documentIds } = body;
|
1998
2210
|
await validateBulkActionInput(body);
|
1999
|
-
const documentManager2 = getService$
|
2000
|
-
const permissionChecker2 = getService$
|
2211
|
+
const documentManager2 = getService$2("document-manager");
|
2212
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2001
2213
|
if (permissionChecker2.cannot.unpublish()) {
|
2002
2214
|
return ctx.forbidden();
|
2003
2215
|
}
|
@@ -2026,8 +2238,8 @@ const collectionTypes = {
|
|
2026
2238
|
const {
|
2027
2239
|
body: { discardDraft, ...body }
|
2028
2240
|
} = ctx.request;
|
2029
|
-
const documentManager2 = getService$
|
2030
|
-
const permissionChecker2 = getService$
|
2241
|
+
const documentManager2 = getService$2("document-manager");
|
2242
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2031
2243
|
if (permissionChecker2.cannot.unpublish()) {
|
2032
2244
|
return ctx.forbidden();
|
2033
2245
|
}
|
@@ -2035,7 +2247,7 @@ const collectionTypes = {
|
|
2035
2247
|
return ctx.forbidden();
|
2036
2248
|
}
|
2037
2249
|
const permissionQuery = await permissionChecker2.sanitizedQuery.unpublish(ctx.query);
|
2038
|
-
const populate = await getService$
|
2250
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
|
2039
2251
|
const { locale } = await getDocumentLocaleAndStatus(body, model);
|
2040
2252
|
const document = await documentManager2.findOne(id, model, {
|
2041
2253
|
populate,
|
@@ -2066,13 +2278,13 @@ const collectionTypes = {
|
|
2066
2278
|
const { userAbility } = ctx.state;
|
2067
2279
|
const { id, model } = ctx.params;
|
2068
2280
|
const { body } = ctx.request;
|
2069
|
-
const documentManager2 = getService$
|
2070
|
-
const permissionChecker2 = getService$
|
2281
|
+
const documentManager2 = getService$2("document-manager");
|
2282
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2071
2283
|
if (permissionChecker2.cannot.discard()) {
|
2072
2284
|
return ctx.forbidden();
|
2073
2285
|
}
|
2074
2286
|
const permissionQuery = await permissionChecker2.sanitizedQuery.discard(ctx.query);
|
2075
|
-
const populate = await getService$
|
2287
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
|
2076
2288
|
const { locale } = await getDocumentLocaleAndStatus(body, model);
|
2077
2289
|
const document = await documentManager2.findOne(id, model, {
|
2078
2290
|
populate,
|
@@ -2097,13 +2309,13 @@ const collectionTypes = {
|
|
2097
2309
|
const { query, body } = ctx.request;
|
2098
2310
|
const { documentIds } = body;
|
2099
2311
|
await validateBulkActionInput(body);
|
2100
|
-
const documentManager2 = getService$
|
2101
|
-
const permissionChecker2 = getService$
|
2312
|
+
const documentManager2 = getService$2("document-manager");
|
2313
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2102
2314
|
if (permissionChecker2.cannot.delete()) {
|
2103
2315
|
return ctx.forbidden();
|
2104
2316
|
}
|
2105
2317
|
const permissionQuery = await permissionChecker2.sanitizedQuery.delete(query);
|
2106
|
-
const populate = await getService$
|
2318
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
|
2107
2319
|
const { locale } = await getDocumentLocaleAndStatus(body, model);
|
2108
2320
|
const documentLocales = await documentManager2.findLocales(documentIds, model, {
|
2109
2321
|
populate,
|
@@ -2124,13 +2336,13 @@ const collectionTypes = {
|
|
2124
2336
|
async countDraftRelations(ctx) {
|
2125
2337
|
const { userAbility } = ctx.state;
|
2126
2338
|
const { model, id } = ctx.params;
|
2127
|
-
const documentManager2 = getService$
|
2128
|
-
const permissionChecker2 = getService$
|
2339
|
+
const documentManager2 = getService$2("document-manager");
|
2340
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2129
2341
|
if (permissionChecker2.cannot.read()) {
|
2130
2342
|
return ctx.forbidden();
|
2131
2343
|
}
|
2132
2344
|
const permissionQuery = await permissionChecker2.sanitizedQuery.read(ctx.query);
|
2133
|
-
const populate = await getService$
|
2345
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
|
2134
2346
|
const { locale, status } = await getDocumentLocaleAndStatus(ctx.query, model);
|
2135
2347
|
const entity = await documentManager2.findOne(id, model, { populate, locale, status });
|
2136
2348
|
if (!entity) {
|
@@ -2149,8 +2361,8 @@ const collectionTypes = {
|
|
2149
2361
|
const ids = ctx.request.query.documentIds;
|
2150
2362
|
const locale = ctx.request.query.locale;
|
2151
2363
|
const { model } = ctx.params;
|
2152
|
-
const documentManager2 = getService$
|
2153
|
-
const permissionChecker2 = getService$
|
2364
|
+
const documentManager2 = getService$2("document-manager");
|
2365
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2154
2366
|
if (permissionChecker2.cannot.read()) {
|
2155
2367
|
return ctx.forbidden();
|
2156
2368
|
}
|
@@ -2174,13 +2386,13 @@ const collectionTypes = {
|
|
2174
2386
|
};
|
2175
2387
|
const components$1 = {
|
2176
2388
|
findComponents(ctx) {
|
2177
|
-
const components2 = getService$
|
2178
|
-
const { toDto } = getService$
|
2389
|
+
const components2 = getService$2("components").findAllComponents();
|
2390
|
+
const { toDto } = getService$2("data-mapper");
|
2179
2391
|
ctx.body = { data: components2.map(toDto) };
|
2180
2392
|
},
|
2181
2393
|
async findComponentConfiguration(ctx) {
|
2182
2394
|
const { uid: uid2 } = ctx.params;
|
2183
|
-
const componentService = getService$
|
2395
|
+
const componentService = getService$2("components");
|
2184
2396
|
const component = componentService.findComponent(uid2);
|
2185
2397
|
if (!component) {
|
2186
2398
|
return ctx.notFound("component.notFound");
|
@@ -2197,7 +2409,7 @@ const components$1 = {
|
|
2197
2409
|
async updateComponentConfiguration(ctx) {
|
2198
2410
|
const { uid: uid2 } = ctx.params;
|
2199
2411
|
const { body } = ctx.request;
|
2200
|
-
const componentService = getService$
|
2412
|
+
const componentService = getService$2("components");
|
2201
2413
|
const component = componentService.findComponent(uid2);
|
2202
2414
|
if (!component) {
|
2203
2415
|
return ctx.notFound("component.notFound");
|
@@ -2231,12 +2443,12 @@ const contentTypes = {
|
|
2231
2443
|
} catch (error) {
|
2232
2444
|
return ctx.send({ error }, 400);
|
2233
2445
|
}
|
2234
|
-
const contentTypes2 = getService$
|
2235
|
-
const { toDto } = getService$
|
2446
|
+
const contentTypes2 = getService$2("content-types").findContentTypesByKind(kind);
|
2447
|
+
const { toDto } = getService$2("data-mapper");
|
2236
2448
|
ctx.body = { data: contentTypes2.map(toDto) };
|
2237
2449
|
},
|
2238
2450
|
async findContentTypesSettings(ctx) {
|
2239
|
-
const { findAllContentTypes, findConfiguration } = getService$
|
2451
|
+
const { findAllContentTypes, findConfiguration } = getService$2("content-types");
|
2240
2452
|
const contentTypes2 = await findAllContentTypes();
|
2241
2453
|
const configurations = await Promise.all(
|
2242
2454
|
contentTypes2.map(async (contentType) => {
|
@@ -2250,7 +2462,7 @@ const contentTypes = {
|
|
2250
2462
|
},
|
2251
2463
|
async findContentTypeConfiguration(ctx) {
|
2252
2464
|
const { uid: uid2 } = ctx.params;
|
2253
|
-
const contentTypeService = getService$
|
2465
|
+
const contentTypeService = getService$2("content-types");
|
2254
2466
|
const contentType = await contentTypeService.findContentType(uid2);
|
2255
2467
|
if (!contentType) {
|
2256
2468
|
return ctx.notFound("contentType.notFound");
|
@@ -2272,13 +2484,13 @@ const contentTypes = {
|
|
2272
2484
|
const { userAbility } = ctx.state;
|
2273
2485
|
const { uid: uid2 } = ctx.params;
|
2274
2486
|
const { body } = ctx.request;
|
2275
|
-
const contentTypeService = getService$
|
2276
|
-
const metricsService = getService$
|
2487
|
+
const contentTypeService = getService$2("content-types");
|
2488
|
+
const metricsService = getService$2("metrics");
|
2277
2489
|
const contentType = await contentTypeService.findContentType(uid2);
|
2278
2490
|
if (!contentType) {
|
2279
2491
|
return ctx.notFound("contentType.notFound");
|
2280
2492
|
}
|
2281
|
-
if (!getService$
|
2493
|
+
if (!getService$2("permission").canConfigureContentType({ userAbility, contentType })) {
|
2282
2494
|
return ctx.forbidden();
|
2283
2495
|
}
|
2284
2496
|
let input;
|
@@ -2311,10 +2523,10 @@ const contentTypes = {
|
|
2311
2523
|
};
|
2312
2524
|
const init = {
|
2313
2525
|
getInitData(ctx) {
|
2314
|
-
const { toDto } = getService$
|
2315
|
-
const { findAllComponents } = getService$
|
2316
|
-
const { getAllFieldSizes } = getService$
|
2317
|
-
const { findAllContentTypes } = getService$
|
2526
|
+
const { toDto } = getService$2("data-mapper");
|
2527
|
+
const { findAllComponents } = getService$2("components");
|
2528
|
+
const { getAllFieldSizes } = getService$2("field-sizes");
|
2529
|
+
const { findAllContentTypes } = getService$2("content-types");
|
2318
2530
|
ctx.body = {
|
2319
2531
|
data: {
|
2320
2532
|
fieldSizes: getAllFieldSizes(),
|
@@ -2350,7 +2562,7 @@ const addFiltersClause = (params, filtersClause) => {
|
|
2350
2562
|
params.filters.$and.push(filtersClause);
|
2351
2563
|
};
|
2352
2564
|
const sanitizeMainField = (model, mainField, userAbility) => {
|
2353
|
-
const permissionChecker2 = getService$
|
2565
|
+
const permissionChecker2 = getService$2("permission-checker").create({
|
2354
2566
|
userAbility,
|
2355
2567
|
model: model.uid
|
2356
2568
|
});
|
@@ -2364,15 +2576,27 @@ const sanitizeMainField = (model, mainField, userAbility) => {
|
|
2364
2576
|
}
|
2365
2577
|
return mainField;
|
2366
2578
|
};
|
2367
|
-
const addStatusToRelations = async (
|
2368
|
-
if (!strapiUtils.contentTypes.hasDraftAndPublish(strapi.
|
2579
|
+
const addStatusToRelations = async (targetUid, relations2) => {
|
2580
|
+
if (!strapiUtils.contentTypes.hasDraftAndPublish(strapi.getModel(targetUid))) {
|
2369
2581
|
return relations2;
|
2370
2582
|
}
|
2371
|
-
const documentMetadata2 = getService$
|
2372
|
-
|
2583
|
+
const documentMetadata2 = getService$2("document-metadata");
|
2584
|
+
if (!relations2.length) {
|
2585
|
+
return relations2;
|
2586
|
+
}
|
2587
|
+
const firstRelation = relations2[0];
|
2588
|
+
const filters = {
|
2589
|
+
documentId: { $in: relations2.map((r) => r.documentId) },
|
2590
|
+
// NOTE: find the "opposite" status
|
2591
|
+
publishedAt: firstRelation.publishedAt !== null ? { $null: true } : { $notNull: true }
|
2592
|
+
};
|
2593
|
+
const availableStatus = await strapi.query(targetUid).findMany({
|
2594
|
+
select: ["id", "documentId", "locale", "updatedAt", "createdAt", "publishedAt"],
|
2595
|
+
filters
|
2596
|
+
});
|
2373
2597
|
return relations2.map((relation) => {
|
2374
|
-
const availableStatuses =
|
2375
|
-
(availableDocument) => availableDocument.documentId === relation.documentId
|
2598
|
+
const availableStatuses = availableStatus.filter(
|
2599
|
+
(availableDocument) => availableDocument.documentId === relation.documentId && (relation.locale ? availableDocument.locale === relation.locale : true)
|
2376
2600
|
);
|
2377
2601
|
return {
|
2378
2602
|
...relation,
|
@@ -2403,8 +2627,7 @@ const validateStatus = (sourceUid, status) => {
|
|
2403
2627
|
const sourceModel = strapi.getModel(sourceUid);
|
2404
2628
|
const isDP = strapiUtils.contentTypes.hasDraftAndPublish;
|
2405
2629
|
const isSourceDP = isDP(sourceModel);
|
2406
|
-
if (!isSourceDP)
|
2407
|
-
return { status: void 0 };
|
2630
|
+
if (!isSourceDP) return { status: void 0 };
|
2408
2631
|
switch (status) {
|
2409
2632
|
case "published":
|
2410
2633
|
return { status: "published" };
|
@@ -2434,7 +2657,7 @@ const relations = {
|
|
2434
2657
|
ctx.request?.query?.locale
|
2435
2658
|
);
|
2436
2659
|
const { status } = validateStatus(sourceUid, ctx.request?.query?.status);
|
2437
|
-
const permissionChecker2 = getService$
|
2660
|
+
const permissionChecker2 = getService$2("permission-checker").create({
|
2438
2661
|
userAbility,
|
2439
2662
|
model
|
2440
2663
|
});
|
@@ -2459,7 +2682,7 @@ const relations = {
|
|
2459
2682
|
where.id = id;
|
2460
2683
|
}
|
2461
2684
|
const permissionQuery = await permissionChecker2.sanitizedQuery.read(ctx.query);
|
2462
|
-
const populate = await getService$
|
2685
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
|
2463
2686
|
const currentEntity = await strapi.db.query(model).findOne({
|
2464
2687
|
where,
|
2465
2688
|
populate
|
@@ -2474,7 +2697,7 @@ const relations = {
|
|
2474
2697
|
}
|
2475
2698
|
entryId = currentEntity.id;
|
2476
2699
|
}
|
2477
|
-
const modelConfig = isComponent2 ? await getService$
|
2700
|
+
const modelConfig = isComponent2 ? await getService$2("components").findConfiguration(sourceSchema) : await getService$2("content-types").findConfiguration(sourceSchema);
|
2478
2701
|
const targetSchema = strapi.getModel(targetUid);
|
2479
2702
|
const mainField = fp.flow(
|
2480
2703
|
fp.prop(`metadatas.${targetField}.edit.mainField`),
|
@@ -2528,7 +2751,7 @@ const relations = {
|
|
2528
2751
|
}
|
2529
2752
|
} = await this.extractAndValidateRequestInfo(ctx, id);
|
2530
2753
|
const { idsToOmit, idsToInclude, _q, ...query } = ctx.request.query;
|
2531
|
-
const permissionChecker2 = getService$
|
2754
|
+
const permissionChecker2 = getService$2("permission-checker").create({
|
2532
2755
|
userAbility: ctx.state.userAbility,
|
2533
2756
|
model: targetUid
|
2534
2757
|
});
|
@@ -2601,21 +2824,33 @@ const relations = {
|
|
2601
2824
|
attribute,
|
2602
2825
|
targetField,
|
2603
2826
|
fieldsToSelect,
|
2604
|
-
|
2605
|
-
|
2606
|
-
}
|
2607
|
-
target: {
|
2608
|
-
schema: { uid: targetUid }
|
2609
|
-
}
|
2827
|
+
status,
|
2828
|
+
source: { schema: sourceSchema },
|
2829
|
+
target: { schema: targetSchema }
|
2610
2830
|
} = await this.extractAndValidateRequestInfo(ctx, id);
|
2611
|
-
const
|
2831
|
+
const { uid: sourceUid } = sourceSchema;
|
2832
|
+
const { uid: targetUid } = targetSchema;
|
2833
|
+
const permissionQuery = await getService$2("permission-checker").create({ userAbility, model: targetUid }).sanitizedQuery.read({ fields: fieldsToSelect });
|
2612
2834
|
const dbQuery = strapi.db.query(sourceUid);
|
2613
2835
|
const loadRelations = strapiUtils.relations.isAnyToMany(attribute) ? (...args) => dbQuery.loadPages(...args) : (...args) => dbQuery.load(...args).then((res2) => ({ results: res2 ? [res2] : [] }));
|
2836
|
+
const filters = {};
|
2837
|
+
if (sourceSchema?.options?.draftAndPublish) {
|
2838
|
+
if (targetSchema?.options?.draftAndPublish) {
|
2839
|
+
if (status === "published") {
|
2840
|
+
filters.publishedAt = { $notNull: true };
|
2841
|
+
} else {
|
2842
|
+
filters.publishedAt = { $null: true };
|
2843
|
+
}
|
2844
|
+
}
|
2845
|
+
} else if (targetSchema?.options?.draftAndPublish) {
|
2846
|
+
filters.publishedAt = { $null: true };
|
2847
|
+
}
|
2614
2848
|
const res = await loadRelations({ id: entryId }, targetField, {
|
2615
|
-
select: ["id", "documentId", "locale", "publishedAt"],
|
2849
|
+
select: ["id", "documentId", "locale", "publishedAt", "updatedAt"],
|
2616
2850
|
ordering: "desc",
|
2617
2851
|
page: ctx.request.query.page,
|
2618
|
-
pageSize: ctx.request.query.pageSize
|
2852
|
+
pageSize: ctx.request.query.pageSize,
|
2853
|
+
filters
|
2619
2854
|
});
|
2620
2855
|
const loadedIds = res.results.map((item) => item.id);
|
2621
2856
|
addFiltersClause(permissionQuery, { id: { $in: loadedIds } });
|
@@ -2623,12 +2858,7 @@ const relations = {
|
|
2623
2858
|
...strapi.get("query-params").transform(targetUid, permissionQuery),
|
2624
2859
|
ordering: "desc"
|
2625
2860
|
});
|
2626
|
-
const relationsUnion = fp.uniqBy(
|
2627
|
-
(res2) => {
|
2628
|
-
return res2.locale ? `${res2.documentId}-${res2.locale}` : `${res2.documentId}-`;
|
2629
|
-
},
|
2630
|
-
fp.concat(sanitizedRes.results, res.results)
|
2631
|
-
);
|
2861
|
+
const relationsUnion = fp.uniqBy("id", fp.concat(sanitizedRes.results, res.results));
|
2632
2862
|
ctx.body = {
|
2633
2863
|
pagination: res.pagination || {
|
2634
2864
|
page: 1,
|
@@ -2641,10 +2871,10 @@ const relations = {
|
|
2641
2871
|
}
|
2642
2872
|
};
|
2643
2873
|
const buildPopulateFromQuery = async (query, model) => {
|
2644
|
-
return getService$
|
2874
|
+
return getService$2("populate-builder")(model).populateFromQuery(query).populateDeep(Infinity).countRelations().build();
|
2645
2875
|
};
|
2646
2876
|
const findDocument = async (query, uid2, opts = {}) => {
|
2647
|
-
const documentManager2 = getService$
|
2877
|
+
const documentManager2 = getService$2("document-manager");
|
2648
2878
|
const populate = await buildPopulateFromQuery(query, uid2);
|
2649
2879
|
return documentManager2.findMany({ ...opts, populate }, uid2).then((documents) => documents[0]);
|
2650
2880
|
};
|
@@ -2652,8 +2882,8 @@ const createOrUpdateDocument = async (ctx, opts) => {
|
|
2652
2882
|
const { user, userAbility } = ctx.state;
|
2653
2883
|
const { model } = ctx.params;
|
2654
2884
|
const { body, query } = ctx.request;
|
2655
|
-
const documentManager2 = getService$
|
2656
|
-
const permissionChecker2 = getService$
|
2885
|
+
const documentManager2 = getService$2("document-manager");
|
2886
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2657
2887
|
if (permissionChecker2.cannot.create() && permissionChecker2.cannot.update()) {
|
2658
2888
|
throw new strapiUtils.errors.ForbiddenError();
|
2659
2889
|
}
|
@@ -2694,7 +2924,7 @@ const singleTypes = {
|
|
2694
2924
|
const { userAbility } = ctx.state;
|
2695
2925
|
const { model } = ctx.params;
|
2696
2926
|
const { query = {} } = ctx.request;
|
2697
|
-
const permissionChecker2 = getService$
|
2927
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2698
2928
|
if (permissionChecker2.cannot.read()) {
|
2699
2929
|
return ctx.forbidden();
|
2700
2930
|
}
|
@@ -2728,7 +2958,7 @@ const singleTypes = {
|
|
2728
2958
|
async createOrUpdate(ctx) {
|
2729
2959
|
const { userAbility } = ctx.state;
|
2730
2960
|
const { model } = ctx.params;
|
2731
|
-
const permissionChecker2 = getService$
|
2961
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2732
2962
|
const document = await createOrUpdateDocument(ctx);
|
2733
2963
|
const sanitizedDocument = await permissionChecker2.sanitizeOutput(document);
|
2734
2964
|
ctx.body = await formatDocumentWithMetadata(permissionChecker2, model, sanitizedDocument);
|
@@ -2737,8 +2967,8 @@ const singleTypes = {
|
|
2737
2967
|
const { userAbility } = ctx.state;
|
2738
2968
|
const { model } = ctx.params;
|
2739
2969
|
const { query = {} } = ctx.request;
|
2740
|
-
const documentManager2 = getService$
|
2741
|
-
const permissionChecker2 = getService$
|
2970
|
+
const documentManager2 = getService$2("document-manager");
|
2971
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2742
2972
|
if (permissionChecker2.cannot.delete()) {
|
2743
2973
|
return ctx.forbidden();
|
2744
2974
|
}
|
@@ -2766,8 +2996,8 @@ const singleTypes = {
|
|
2766
2996
|
const { userAbility } = ctx.state;
|
2767
2997
|
const { model } = ctx.params;
|
2768
2998
|
const { query = {} } = ctx.request;
|
2769
|
-
const documentManager2 = getService$
|
2770
|
-
const permissionChecker2 = getService$
|
2999
|
+
const documentManager2 = getService$2("document-manager");
|
3000
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2771
3001
|
if (permissionChecker2.cannot.publish()) {
|
2772
3002
|
return ctx.forbidden();
|
2773
3003
|
}
|
@@ -2795,8 +3025,8 @@ const singleTypes = {
|
|
2795
3025
|
body: { discardDraft, ...body },
|
2796
3026
|
query = {}
|
2797
3027
|
} = ctx.request;
|
2798
|
-
const documentManager2 = getService$
|
2799
|
-
const permissionChecker2 = getService$
|
3028
|
+
const documentManager2 = getService$2("document-manager");
|
3029
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2800
3030
|
if (permissionChecker2.cannot.unpublish()) {
|
2801
3031
|
return ctx.forbidden();
|
2802
3032
|
}
|
@@ -2830,8 +3060,8 @@ const singleTypes = {
|
|
2830
3060
|
const { userAbility } = ctx.state;
|
2831
3061
|
const { model } = ctx.params;
|
2832
3062
|
const { body, query = {} } = ctx.request;
|
2833
|
-
const documentManager2 = getService$
|
2834
|
-
const permissionChecker2 = getService$
|
3063
|
+
const documentManager2 = getService$2("document-manager");
|
3064
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2835
3065
|
if (permissionChecker2.cannot.discard()) {
|
2836
3066
|
return ctx.forbidden();
|
2837
3067
|
}
|
@@ -2854,8 +3084,8 @@ const singleTypes = {
|
|
2854
3084
|
const { userAbility } = ctx.state;
|
2855
3085
|
const { model } = ctx.params;
|
2856
3086
|
const { query } = ctx.request;
|
2857
|
-
const documentManager2 = getService$
|
2858
|
-
const permissionChecker2 = getService$
|
3087
|
+
const documentManager2 = getService$2("document-manager");
|
3088
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2859
3089
|
const { locale } = await getDocumentLocaleAndStatus(query, model);
|
2860
3090
|
if (permissionChecker2.cannot.read()) {
|
2861
3091
|
return ctx.forbidden();
|
@@ -2879,7 +3109,7 @@ const uid$1 = {
|
|
2879
3109
|
const { query = {} } = ctx.request;
|
2880
3110
|
const { locale } = await getDocumentLocaleAndStatus(query, contentTypeUID);
|
2881
3111
|
await validateUIDField(contentTypeUID, field);
|
2882
|
-
const uidService = getService$
|
3112
|
+
const uidService = getService$2("uid");
|
2883
3113
|
ctx.body = {
|
2884
3114
|
data: await uidService.generateUIDField({ contentTypeUID, field, data, locale })
|
2885
3115
|
};
|
@@ -2891,7 +3121,7 @@ const uid$1 = {
|
|
2891
3121
|
const { query = {} } = ctx.request;
|
2892
3122
|
const { locale } = await getDocumentLocaleAndStatus(query, contentTypeUID);
|
2893
3123
|
await validateUIDField(contentTypeUID, field);
|
2894
|
-
const uidService = getService$
|
3124
|
+
const uidService = getService$2("uid");
|
2895
3125
|
const isAvailable = await uidService.checkUIDAvailability({
|
2896
3126
|
contentTypeUID,
|
2897
3127
|
field,
|
@@ -2912,7 +3142,8 @@ const controllers = {
|
|
2912
3142
|
relations,
|
2913
3143
|
"single-types": singleTypes,
|
2914
3144
|
uid: uid$1,
|
2915
|
-
...history.controllers ? history.controllers : {}
|
3145
|
+
...history.controllers ? history.controllers : {},
|
3146
|
+
...preview.controllers ? preview.controllers : {}
|
2916
3147
|
};
|
2917
3148
|
const keys = {
|
2918
3149
|
CONFIGURATION: "configuration"
|
@@ -3041,18 +3272,15 @@ async function syncMetadatas(configuration, schema) {
|
|
3041
3272
|
___default.default.set(updatedMeta, ["list", "searchable"], false);
|
3042
3273
|
___default.default.set(acc, [key], updatedMeta);
|
3043
3274
|
}
|
3044
|
-
if (!___default.default.has(edit, "mainField"))
|
3045
|
-
return acc;
|
3275
|
+
if (!___default.default.has(edit, "mainField")) return acc;
|
3046
3276
|
if (!isRelation$1(attr)) {
|
3047
3277
|
___default.default.set(updatedMeta, "edit", ___default.default.omit(edit, ["mainField"]));
|
3048
3278
|
___default.default.set(acc, [key], updatedMeta);
|
3049
3279
|
return acc;
|
3050
3280
|
}
|
3051
|
-
if (edit.mainField === "id")
|
3052
|
-
return acc;
|
3281
|
+
if (edit.mainField === "id") return acc;
|
3053
3282
|
const targetSchema = getTargetSchema(attr.targetModel);
|
3054
|
-
if (!targetSchema)
|
3055
|
-
return acc;
|
3283
|
+
if (!targetSchema) return acc;
|
3056
3284
|
if (!isSortable(targetSchema, edit.mainField) && !isListable(targetSchema, edit.mainField)) {
|
3057
3285
|
___default.default.set(updatedMeta, ["edit", "mainField"], getDefaultMainField(targetSchema));
|
3058
3286
|
___default.default.set(acc, [key], updatedMeta);
|
@@ -3063,12 +3291,12 @@ async function syncMetadatas(configuration, schema) {
|
|
3063
3291
|
return ___default.default.assign(metasWithDefaults, updatedMetas);
|
3064
3292
|
}
|
3065
3293
|
const getTargetSchema = (targetModel) => {
|
3066
|
-
return getService$
|
3294
|
+
return getService$2("content-types").findContentType(targetModel);
|
3067
3295
|
};
|
3068
3296
|
const DEFAULT_LIST_LENGTH = 4;
|
3069
3297
|
const MAX_ROW_SIZE = 12;
|
3070
3298
|
const isAllowedFieldSize = (type, size) => {
|
3071
|
-
const { getFieldSize } = getService$
|
3299
|
+
const { getFieldSize } = getService$2("field-sizes");
|
3072
3300
|
const fieldSize = getFieldSize(type);
|
3073
3301
|
if (!fieldSize.isResizable && size !== fieldSize.default) {
|
3074
3302
|
return false;
|
@@ -3076,7 +3304,7 @@ const isAllowedFieldSize = (type, size) => {
|
|
3076
3304
|
return size <= MAX_ROW_SIZE;
|
3077
3305
|
};
|
3078
3306
|
const getDefaultFieldSize = (attribute) => {
|
3079
|
-
const { hasFieldSize, getFieldSize } = getService$
|
3307
|
+
const { hasFieldSize, getFieldSize } = getService$2("field-sizes");
|
3080
3308
|
return getFieldSize(hasFieldSize(attribute.customField) ? attribute.customField : attribute.type).default;
|
3081
3309
|
};
|
3082
3310
|
async function createDefaultLayouts(schema) {
|
@@ -3097,8 +3325,7 @@ function createDefaultEditLayout(schema) {
|
|
3097
3325
|
return appendToEditLayout([], keys2, schema);
|
3098
3326
|
}
|
3099
3327
|
function syncLayouts(configuration, schema) {
|
3100
|
-
if (___default.default.isEmpty(configuration.layouts))
|
3101
|
-
return createDefaultLayouts(schema);
|
3328
|
+
if (___default.default.isEmpty(configuration.layouts)) return createDefaultLayouts(schema);
|
3102
3329
|
const { list = [], editRelations = [], edit = [] } = configuration.layouts || {};
|
3103
3330
|
let cleanList = list.filter((attr) => isListable(schema, attr));
|
3104
3331
|
const cleanEditRelations = editRelations.filter(
|
@@ -3109,9 +3336,8 @@ function syncLayouts(configuration, schema) {
|
|
3109
3336
|
for (const row of edit) {
|
3110
3337
|
const newRow = [];
|
3111
3338
|
for (const el of row) {
|
3112
|
-
if (!hasEditableAttribute(schema, el.name))
|
3113
|
-
|
3114
|
-
const { hasFieldSize } = getService$1("field-sizes");
|
3339
|
+
if (!hasEditableAttribute(schema, el.name)) continue;
|
3340
|
+
const { hasFieldSize } = getService$2("field-sizes");
|
3115
3341
|
const fieldType = hasFieldSize(schema.attributes[el.name].customField) ? schema.attributes[el.name].customField : schema.attributes[el.name].type;
|
3116
3342
|
if (!isAllowedFieldSize(fieldType, el.size)) {
|
3117
3343
|
elementsToReAppend.push(el.name);
|
@@ -3141,8 +3367,7 @@ function syncLayouts(configuration, schema) {
|
|
3141
3367
|
};
|
3142
3368
|
}
|
3143
3369
|
const appendToEditLayout = (layout = [], keysToAppend, schema) => {
|
3144
|
-
if (keysToAppend.length === 0)
|
3145
|
-
return layout;
|
3370
|
+
if (keysToAppend.length === 0) return layout;
|
3146
3371
|
let currentRowIndex = Math.max(layout.length - 1, 0);
|
3147
3372
|
if (!layout[currentRowIndex]) {
|
3148
3373
|
layout[currentRowIndex] = [];
|
@@ -3251,17 +3476,17 @@ const configurationService$1 = createConfigurationService({
|
|
3251
3476
|
isComponent: true,
|
3252
3477
|
prefix: STORE_KEY_PREFIX,
|
3253
3478
|
getModels() {
|
3254
|
-
const { toContentManagerModel } = getService$
|
3479
|
+
const { toContentManagerModel } = getService$2("data-mapper");
|
3255
3480
|
return fp.mapValues(toContentManagerModel, strapi.components);
|
3256
3481
|
}
|
3257
3482
|
});
|
3258
3483
|
const components = ({ strapi: strapi2 }) => ({
|
3259
3484
|
findAllComponents() {
|
3260
|
-
const { toContentManagerModel } = getService$
|
3485
|
+
const { toContentManagerModel } = getService$2("data-mapper");
|
3261
3486
|
return Object.values(strapi2.components).map(toContentManagerModel);
|
3262
3487
|
},
|
3263
3488
|
findComponent(uid2) {
|
3264
|
-
const { toContentManagerModel } = getService$
|
3489
|
+
const { toContentManagerModel } = getService$2("data-mapper");
|
3265
3490
|
const component = strapi2.components[uid2];
|
3266
3491
|
return fp.isNil(component) ? component : toContentManagerModel(component);
|
3267
3492
|
},
|
@@ -3312,17 +3537,17 @@ const configurationService = createConfigurationService({
|
|
3312
3537
|
storeUtils,
|
3313
3538
|
prefix: "content_types",
|
3314
3539
|
getModels() {
|
3315
|
-
const { toContentManagerModel } = getService$
|
3540
|
+
const { toContentManagerModel } = getService$2("data-mapper");
|
3316
3541
|
return fp.mapValues(toContentManagerModel, strapi.contentTypes);
|
3317
3542
|
}
|
3318
3543
|
});
|
3319
3544
|
const service = ({ strapi: strapi2 }) => ({
|
3320
3545
|
findAllContentTypes() {
|
3321
|
-
const { toContentManagerModel } = getService$
|
3546
|
+
const { toContentManagerModel } = getService$2("data-mapper");
|
3322
3547
|
return Object.values(strapi2.contentTypes).map(toContentManagerModel);
|
3323
3548
|
},
|
3324
3549
|
findContentType(uid2) {
|
3325
|
-
const { toContentManagerModel } = getService$
|
3550
|
+
const { toContentManagerModel } = getService$2("data-mapper");
|
3326
3551
|
const contentType = strapi2.contentTypes[uid2];
|
3327
3552
|
return fp.isNil(contentType) ? contentType : toContentManagerModel(contentType);
|
3328
3553
|
},
|
@@ -3351,7 +3576,7 @@ const service = ({ strapi: strapi2 }) => ({
|
|
3351
3576
|
return this.findConfiguration(contentType);
|
3352
3577
|
},
|
3353
3578
|
findComponentsConfigurations(contentType) {
|
3354
|
-
return getService$
|
3579
|
+
return getService$2("components").findComponentsConfigurations(contentType);
|
3355
3580
|
},
|
3356
3581
|
syncConfigurations() {
|
3357
3582
|
return configurationService.syncConfigurations();
|
@@ -3623,7 +3848,7 @@ const permission = ({ strapi: strapi2 }) => ({
|
|
3623
3848
|
return userAbility.can(action);
|
3624
3849
|
},
|
3625
3850
|
async registerPermissions() {
|
3626
|
-
const displayedContentTypes = getService$
|
3851
|
+
const displayedContentTypes = getService$2("content-types").findDisplayedContentTypes();
|
3627
3852
|
const contentTypesUids = displayedContentTypes.map(fp.prop("uid"));
|
3628
3853
|
const actions = [
|
3629
3854
|
{
|
@@ -3708,6 +3933,12 @@ function getPopulateForRelation(attribute, model, attributeName, { countMany, co
|
|
3708
3933
|
if (initialPopulate) {
|
3709
3934
|
return initialPopulate;
|
3710
3935
|
}
|
3936
|
+
if (attributeName === "localizations") {
|
3937
|
+
const validationPopulate = getPopulateForValidation(model.uid);
|
3938
|
+
return {
|
3939
|
+
populate: validationPopulate.populate
|
3940
|
+
};
|
3941
|
+
}
|
3711
3942
|
if (!isVisibleAttribute$1(model, attributeName)) {
|
3712
3943
|
return true;
|
3713
3944
|
}
|
@@ -3767,6 +3998,9 @@ const getDeepPopulate = (uid2, {
|
|
3767
3998
|
return {};
|
3768
3999
|
}
|
3769
4000
|
const model = strapi.getModel(uid2);
|
4001
|
+
if (!model) {
|
4002
|
+
return {};
|
4003
|
+
}
|
3770
4004
|
return Object.keys(model.attributes).reduce(
|
3771
4005
|
(populateAcc, attributeName) => fp.merge(
|
3772
4006
|
populateAcc,
|
@@ -3786,40 +4020,46 @@ const getDeepPopulate = (uid2, {
|
|
3786
4020
|
{}
|
3787
4021
|
);
|
3788
4022
|
};
|
3789
|
-
const
|
3790
|
-
|
3791
|
-
|
3792
|
-
countOne = false,
|
3793
|
-
maxLevel = Infinity
|
3794
|
-
} = {}, level = 1) => {
|
3795
|
-
if (level > maxLevel) {
|
4023
|
+
const getPopulateForValidation = (uid2) => {
|
4024
|
+
const model = strapi.getModel(uid2);
|
4025
|
+
if (!model) {
|
3796
4026
|
return {};
|
3797
4027
|
}
|
3798
|
-
const model = strapi.getModel(uid2);
|
3799
4028
|
return Object.entries(model.attributes).reduce((populateAcc, [attributeName, attribute]) => {
|
3800
|
-
if (
|
4029
|
+
if (isScalarAttribute(attribute)) {
|
4030
|
+
if (getDoesAttributeRequireValidation(attribute)) {
|
4031
|
+
populateAcc.fields = populateAcc.fields || [];
|
4032
|
+
populateAcc.fields.push(attributeName);
|
4033
|
+
}
|
3801
4034
|
return populateAcc;
|
3802
4035
|
}
|
3803
|
-
if (
|
3804
|
-
|
3805
|
-
|
3806
|
-
|
4036
|
+
if (isComponent(attribute)) {
|
4037
|
+
const component = attribute.component;
|
4038
|
+
const componentResult = getPopulateForValidation(component);
|
4039
|
+
if (Object.keys(componentResult).length > 0) {
|
4040
|
+
populateAcc.populate = populateAcc.populate || {};
|
4041
|
+
populateAcc.populate[attributeName] = componentResult;
|
4042
|
+
}
|
4043
|
+
return populateAcc;
|
3807
4044
|
}
|
3808
|
-
|
3809
|
-
|
3810
|
-
|
3811
|
-
|
3812
|
-
|
3813
|
-
|
3814
|
-
|
3815
|
-
|
3816
|
-
|
3817
|
-
countOne,
|
3818
|
-
maxLevel
|
4045
|
+
if (isDynamicZone(attribute)) {
|
4046
|
+
const components2 = attribute.components;
|
4047
|
+
const componentsResult = (components2 || []).reduce(
|
4048
|
+
(acc, componentUID) => {
|
4049
|
+
const componentResult = getPopulateForValidation(componentUID);
|
4050
|
+
if (Object.keys(componentResult).length > 0) {
|
4051
|
+
acc[componentUID] = componentResult;
|
4052
|
+
}
|
4053
|
+
return acc;
|
3819
4054
|
},
|
3820
|
-
|
3821
|
-
)
|
3822
|
-
|
4055
|
+
{}
|
4056
|
+
);
|
4057
|
+
if (Object.keys(componentsResult).length > 0) {
|
4058
|
+
populateAcc.populate = populateAcc.populate || {};
|
4059
|
+
populateAcc.populate[attributeName] = { on: componentsResult };
|
4060
|
+
}
|
4061
|
+
}
|
4062
|
+
return populateAcc;
|
3823
4063
|
}, {});
|
3824
4064
|
};
|
3825
4065
|
const getDeepPopulateDraftCount = (uid2) => {
|
@@ -3899,7 +4139,7 @@ const getQueryPopulate = async (uid2, query) => {
|
|
3899
4139
|
return populateQuery;
|
3900
4140
|
};
|
3901
4141
|
const buildDeepPopulate = (uid2) => {
|
3902
|
-
return getService$
|
4142
|
+
return getService$2("populate-builder")(uid2).populateDeep(Infinity).countRelations().build();
|
3903
4143
|
};
|
3904
4144
|
const populateBuilder = (uid2) => {
|
3905
4145
|
let getInitialPopulate = async () => {
|
@@ -4061,7 +4301,6 @@ const AVAILABLE_LOCALES_FIELDS = [
|
|
4061
4301
|
"locale",
|
4062
4302
|
"updatedAt",
|
4063
4303
|
"createdAt",
|
4064
|
-
"status",
|
4065
4304
|
"publishedAt",
|
4066
4305
|
"documentId"
|
4067
4306
|
];
|
@@ -4082,34 +4321,20 @@ const documentMetadata = ({ strapi: strapi2 }) => ({
|
|
4082
4321
|
/**
|
4083
4322
|
* Returns available locales of a document for the current status
|
4084
4323
|
*/
|
4085
|
-
async getAvailableLocales(uid2, version, allVersions
|
4324
|
+
async getAvailableLocales(uid2, version, allVersions) {
|
4086
4325
|
const versionsByLocale = fp.groupBy("locale", allVersions);
|
4087
|
-
|
4326
|
+
if (version.locale) {
|
4327
|
+
delete versionsByLocale[version.locale];
|
4328
|
+
}
|
4088
4329
|
const model = strapi2.getModel(uid2);
|
4089
|
-
const keysToKeep = [...AVAILABLE_LOCALES_FIELDS, ...validatableFields];
|
4090
|
-
const traversalFunction = async (localeVersion) => strapiUtils.traverseEntity(
|
4091
|
-
({ key }, { remove }) => {
|
4092
|
-
if (keysToKeep.includes(key)) {
|
4093
|
-
return;
|
4094
|
-
}
|
4095
|
-
remove(key);
|
4096
|
-
},
|
4097
|
-
{ schema: model, getModel: strapi2.getModel.bind(strapi2) },
|
4098
|
-
// @ts-expect-error fix types DocumentVersion incompatible with Data
|
4099
|
-
localeVersion
|
4100
|
-
);
|
4101
4330
|
const mappingResult = await strapiUtils.async.map(
|
4102
4331
|
Object.values(versionsByLocale),
|
4103
4332
|
async (localeVersions) => {
|
4104
|
-
const mappedLocaleVersions = await strapiUtils.async.map(
|
4105
|
-
localeVersions,
|
4106
|
-
traversalFunction
|
4107
|
-
);
|
4108
4333
|
if (!strapiUtils.contentTypes.hasDraftAndPublish(model)) {
|
4109
|
-
return
|
4334
|
+
return localeVersions[0];
|
4110
4335
|
}
|
4111
|
-
const draftVersion =
|
4112
|
-
const otherVersions =
|
4336
|
+
const draftVersion = localeVersions.find((v) => v.publishedAt === null);
|
4337
|
+
const otherVersions = localeVersions.filter((v) => v.id !== draftVersion?.id);
|
4113
4338
|
if (!draftVersion) {
|
4114
4339
|
return;
|
4115
4340
|
}
|
@@ -4131,8 +4356,7 @@ const documentMetadata = ({ strapi: strapi2 }) => ({
|
|
4131
4356
|
const matchStatus = status === "published" ? v.publishedAt !== null : v.publishedAt === null;
|
4132
4357
|
return matchLocale && matchStatus;
|
4133
4358
|
});
|
4134
|
-
if (!availableStatus)
|
4135
|
-
return availableStatus;
|
4359
|
+
if (!availableStatus) return availableStatus;
|
4136
4360
|
return fp.pick(AVAILABLE_STATUS_FIELDS, availableStatus);
|
4137
4361
|
},
|
4138
4362
|
/**
|
@@ -4142,18 +4366,19 @@ const documentMetadata = ({ strapi: strapi2 }) => ({
|
|
4142
4366
|
* @returns
|
4143
4367
|
*/
|
4144
4368
|
async getManyAvailableStatus(uid2, documents) {
|
4145
|
-
if (!documents.length)
|
4146
|
-
return [];
|
4369
|
+
if (!documents.length) return [];
|
4147
4370
|
const status = documents[0].publishedAt !== null ? "published" : "draft";
|
4148
|
-
const
|
4149
|
-
const
|
4150
|
-
|
4151
|
-
|
4152
|
-
|
4153
|
-
|
4154
|
-
|
4155
|
-
|
4156
|
-
|
4371
|
+
const locales = documents.map((d) => d.locale).filter(Boolean);
|
4372
|
+
const where = {
|
4373
|
+
documentId: { $in: documents.map((d) => d.documentId).filter(Boolean) },
|
4374
|
+
publishedAt: { $null: status === "published" }
|
4375
|
+
};
|
4376
|
+
if (locales.length) {
|
4377
|
+
where.locale = { $in: locales };
|
4378
|
+
}
|
4379
|
+
return strapi2.query(uid2).findMany({
|
4380
|
+
where,
|
4381
|
+
select: ["id", "documentId", "locale", "updatedAt", "createdAt", "publishedAt"]
|
4157
4382
|
});
|
4158
4383
|
},
|
4159
4384
|
getStatus(version, otherDocumentStatuses) {
|
@@ -4170,10 +4395,8 @@ const documentMetadata = ({ strapi: strapi2 }) => ({
|
|
4170
4395
|
} else if (otherVersion) {
|
4171
4396
|
draftVersion = otherVersion;
|
4172
4397
|
}
|
4173
|
-
if (!draftVersion)
|
4174
|
-
|
4175
|
-
if (!publishedVersion)
|
4176
|
-
return CONTENT_MANAGER_STATUS.DRAFT;
|
4398
|
+
if (!draftVersion) return CONTENT_MANAGER_STATUS.PUBLISHED;
|
4399
|
+
if (!publishedVersion) return CONTENT_MANAGER_STATUS.DRAFT;
|
4177
4400
|
const isDraftModified = getIsVersionLatestModification(draftVersion, publishedVersion);
|
4178
4401
|
return isDraftModified ? CONTENT_MANAGER_STATUS.MODIFIED : CONTENT_MANAGER_STATUS.PUBLISHED;
|
4179
4402
|
},
|
@@ -4181,11 +4404,9 @@ const documentMetadata = ({ strapi: strapi2 }) => ({
|
|
4181
4404
|
// We could refactor this so the locales are only loaded when they're
|
4182
4405
|
// needed. e.g. in the bulk locale action modal.
|
4183
4406
|
async getMetadata(uid2, version, { availableLocales = true, availableStatus = true } = {}) {
|
4184
|
-
const populate =
|
4185
|
-
const
|
4186
|
-
where: { documentId: version.documentId },
|
4407
|
+
const { populate = {}, fields = [] } = getPopulateForValidation(uid2);
|
4408
|
+
const params = {
|
4187
4409
|
populate: {
|
4188
|
-
// Populate only fields that require validation for bulk locale actions
|
4189
4410
|
...populate,
|
4190
4411
|
// NOTE: creator fields are selected in this way to avoid exposing sensitive data
|
4191
4412
|
createdBy: {
|
@@ -4194,9 +4415,15 @@ const documentMetadata = ({ strapi: strapi2 }) => ({
|
|
4194
4415
|
updatedBy: {
|
4195
4416
|
select: ["id", "firstname", "lastname", "email"]
|
4196
4417
|
}
|
4418
|
+
},
|
4419
|
+
fields: fp.uniq([...AVAILABLE_LOCALES_FIELDS, ...fields]),
|
4420
|
+
filters: {
|
4421
|
+
documentId: version.documentId
|
4197
4422
|
}
|
4198
|
-
}
|
4199
|
-
const
|
4423
|
+
};
|
4424
|
+
const dbParams = strapi2.get("query-params").transform(uid2, params);
|
4425
|
+
const versions = await strapi2.db.query(uid2).findMany(dbParams);
|
4426
|
+
const availableLocalesResult = availableLocales ? await this.getAvailableLocales(uid2, version, versions) : [];
|
4200
4427
|
const availableStatusResult = availableStatus ? this.getAvailableStatus(version, versions) : null;
|
4201
4428
|
return {
|
4202
4429
|
availableLocales: availableLocalesResult,
|
@@ -4223,6 +4450,16 @@ const documentMetadata = ({ strapi: strapi2 }) => ({
|
|
4223
4450
|
opts.availableStatus = false;
|
4224
4451
|
}
|
4225
4452
|
const meta = await this.getMetadata(uid2, document, opts);
|
4453
|
+
if (document.localizations) {
|
4454
|
+
const otherStatus = await this.getManyAvailableStatus(uid2, document.localizations);
|
4455
|
+
document.localizations = document.localizations.map((d) => {
|
4456
|
+
const status = otherStatus.find((s) => s.documentId === d.documentId);
|
4457
|
+
return {
|
4458
|
+
...d,
|
4459
|
+
status: this.getStatus(d, status ? [status] : [])
|
4460
|
+
};
|
4461
|
+
});
|
4462
|
+
}
|
4226
4463
|
return {
|
4227
4464
|
data: {
|
4228
4465
|
...document,
|
@@ -4440,7 +4677,8 @@ const services = {
|
|
4440
4677
|
permission,
|
4441
4678
|
"populate-builder": populateBuilder$1,
|
4442
4679
|
uid,
|
4443
|
-
...history.services ? history.services : {}
|
4680
|
+
...history.services ? history.services : {},
|
4681
|
+
...preview.services ? preview.services : {}
|
4444
4682
|
};
|
4445
4683
|
const index = () => {
|
4446
4684
|
return {
|