@strapi/content-manager 0.0.0-next.959c5589d0d3efa25d7ca014656d9ff48c173399 → 0.0.0-next.a4bb06d54b493ab973659d0200e0e42937988850
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-gsCd80MU.js → ComponentConfigurationPage-BLWQy8ru.js} +4 -5
- package/dist/_chunks/{ComponentConfigurationPage-gsCd80MU.js.map → ComponentConfigurationPage-BLWQy8ru.js.map} +1 -1
- package/dist/_chunks/{ComponentConfigurationPage-CIjXcRAB.mjs → ComponentConfigurationPage-CtIa3aa2.mjs} +3 -3
- package/dist/_chunks/{ComponentConfigurationPage-CIjXcRAB.mjs.map → ComponentConfigurationPage-CtIa3aa2.mjs.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-BglmD_BF.mjs → EditConfigurationPage-DsPR2DVk.mjs} +3 -3
- package/dist/_chunks/{EditConfigurationPage-BglmD_BF.mjs.map → EditConfigurationPage-DsPR2DVk.mjs.map} +1 -1
- package/dist/_chunks/{EditConfigurationPage-DHDQKBzw.js → EditConfigurationPage-RQkymxCy.js} +4 -5
- package/dist/_chunks/{EditConfigurationPage-DHDQKBzw.js.map → EditConfigurationPage-RQkymxCy.js.map} +1 -1
- package/dist/_chunks/{EditViewPage-C4iTxUPU.js → EditViewPage-B-kExt8C.js} +38 -9
- package/dist/_chunks/EditViewPage-B-kExt8C.js.map +1 -0
- package/dist/_chunks/{EditViewPage-CiwVPMaK.mjs → EditViewPage-BPyVuPfM.mjs} +38 -8
- package/dist/_chunks/EditViewPage-BPyVuPfM.mjs.map +1 -0
- package/dist/_chunks/{Field-DhXEK8y1.js → Field-DPIsQRre.js} +177 -122
- package/dist/_chunks/Field-DPIsQRre.js.map +1 -0
- package/dist/_chunks/{Field-DIjL1b5d.mjs → Field-Dltnt1km.mjs} +175 -120
- package/dist/_chunks/Field-Dltnt1km.mjs.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-CwmJ4sWe.js → Form-BFi4MXMT.js} +5 -6
- package/dist/_chunks/{Form-CwmJ4sWe.js.map → Form-BFi4MXMT.js.map} +1 -1
- package/dist/_chunks/{Form-CmNesrvR.mjs → Form-C1IcWm1u.mjs} +3 -3
- package/dist/_chunks/{Form-CmNesrvR.mjs.map → Form-C1IcWm1u.mjs.map} +1 -1
- package/dist/_chunks/{History-D-99Wh30.mjs → History-04ChQ4pl.mjs} +50 -96
- package/dist/_chunks/History-04ChQ4pl.mjs.map +1 -0
- package/dist/_chunks/{History-BLCCNgCt.js → History-wjcK4L0C.js} +50 -97
- package/dist/_chunks/History-wjcK4L0C.js.map +1 -0
- package/dist/_chunks/{ListConfigurationPage-JPWZz7Kg.mjs → ListConfigurationPage-BYqPYLSU.mjs} +6 -5
- package/dist/_chunks/ListConfigurationPage-BYqPYLSU.mjs.map +1 -0
- package/dist/_chunks/{ListConfigurationPage-DxWpeZrO.js → ListConfigurationPage-CRbxIC3J.js} +6 -6
- package/dist/_chunks/ListConfigurationPage-CRbxIC3J.js.map +1 -0
- package/dist/_chunks/{ListViewPage-CIQekSFz.js → ListViewPage-D5NY9183.js} +64 -53
- package/dist/_chunks/ListViewPage-D5NY9183.js.map +1 -0
- package/dist/_chunks/{ListViewPage-DSK3f0ST.mjs → ListViewPage-FU2LBuhl.mjs} +63 -51
- package/dist/_chunks/ListViewPage-FU2LBuhl.mjs.map +1 -0
- package/dist/_chunks/{NoContentTypePage-C5cxKvC2.js → NoContentTypePage-BgQVE_Qb.js} +2 -2
- package/dist/_chunks/{NoContentTypePage-C5cxKvC2.js.map → NoContentTypePage-BgQVE_Qb.js.map} +1 -1
- package/dist/_chunks/{NoContentTypePage-D99LU1YP.mjs → NoContentTypePage-DCKUkwb8.mjs} +2 -2
- package/dist/_chunks/{NoContentTypePage-D99LU1YP.mjs.map → NoContentTypePage-DCKUkwb8.mjs.map} +1 -1
- package/dist/_chunks/{NoPermissionsPage-Oy4tmUrW.js → NoPermissionsPage-C5jwn70o.js} +2 -2
- package/dist/_chunks/{NoPermissionsPage-Oy4tmUrW.js.map → NoPermissionsPage-C5jwn70o.js.map} +1 -1
- package/dist/_chunks/{NoPermissionsPage-DBrBw-0y.mjs → NoPermissionsPage-jqve7C8l.mjs} +2 -2
- package/dist/_chunks/{NoPermissionsPage-DBrBw-0y.mjs.map → NoPermissionsPage-jqve7C8l.mjs.map} +1 -1
- package/dist/_chunks/Preview-BMYN548c.mjs +294 -0
- package/dist/_chunks/Preview-BMYN548c.mjs.map +1 -0
- package/dist/_chunks/Preview-DaOihysv.js +312 -0
- package/dist/_chunks/Preview-DaOihysv.js.map +1 -0
- package/dist/_chunks/{Relations-eG-9p_qS.js → Relations-CTGM7Hv5.js} +10 -10
- package/dist/_chunks/Relations-CTGM7Hv5.js.map +1 -0
- package/dist/_chunks/{Relations-BBmhcWFV.mjs → Relations-gscPkxjF.mjs} +9 -8
- package/dist/_chunks/Relations-gscPkxjF.mjs.map +1 -0
- package/dist/_chunks/{en-Bm0D0IWz.js → en-BzQmavmK.js} +21 -4
- package/dist/_chunks/{en-Bm0D0IWz.js.map → en-BzQmavmK.js.map} +1 -1
- package/dist/_chunks/{en-DKV44jRb.mjs → en-CSxLmrh1.mjs} +21 -4
- package/dist/_chunks/{en-DKV44jRb.mjs.map → en-CSxLmrh1.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-CD9VFbPM.mjs → fr--pg5jUbt.mjs} +13 -3
- package/dist/_chunks/{fr-CD9VFbPM.mjs.map → fr--pg5jUbt.mjs.map} +1 -1
- package/dist/_chunks/{fr-B7kGGg3E.js → fr-B2Kyv8Z9.js} +13 -3
- package/dist/_chunks/{fr-B7kGGg3E.js.map → fr-B2Kyv8Z9.js.map} +1 -1
- package/dist/_chunks/hooks-BAaaKPS_.js.map +1 -1
- package/dist/_chunks/{index-BIWDoFLK.js → index-Ca7YWlAA.js} +363 -193
- package/dist/_chunks/index-Ca7YWlAA.js.map +1 -0
- package/dist/_chunks/{index-BrUzbQ30.mjs → index-DqasUQ6Q.mjs} +366 -195
- package/dist/_chunks/index-DqasUQ6Q.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-lMc9i1-Z.js → layout-BW80JSCd.js} +5 -6
- package/dist/_chunks/{layout-lMc9i1-Z.js.map → layout-BW80JSCd.js.map} +1 -1
- package/dist/_chunks/{layout-_5-cXs34.mjs → layout-W3clJSCy.mjs} +4 -4
- package/dist/_chunks/{layout-_5-cXs34.mjs.map → layout-W3clJSCy.mjs.map} +1 -1
- package/dist/_chunks/objects-BcXOv6_9.js.map +1 -1
- package/dist/_chunks/objects-D6yBsdmx.mjs.map +1 -1
- package/dist/_chunks/{relations-B_VLk-DD.mjs → relations-BlDkoeWh.mjs} +6 -3
- package/dist/_chunks/relations-BlDkoeWh.mjs.map +1 -0
- package/dist/_chunks/{relations-BRHithi8.js → relations-C9Usz9k5.js} +6 -3
- package/dist/_chunks/relations-C9Usz9k5.js.map +1 -0
- package/dist/_chunks/useDebounce-CtcjDB3L.js.map +1 -1
- package/dist/_chunks/useDebounce-DmuSJIF3.mjs.map +1 -1
- 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/admin/index.js +2 -1
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +5 -4
- 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/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/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 +1 -1
- 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 +516 -312
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +517 -312
- package/dist/server/index.mjs.map +1 -1
- package/dist/server/src/controllers/index.d.ts.map +1 -1
- package/dist/server/src/controllers/utils/metadata.d.ts +1 -0
- 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 +3 -2
- 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.map +1 -1
- 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 +4 -2
- package/dist/server/src/services/document-metadata.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +3 -2
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/services/utils/configuration/index.d.ts +2 -2
- package/dist/server/src/services/utils/configuration/layouts.d.ts +2 -2
- 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/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-C4iTxUPU.js.map +0 -1
- package/dist/_chunks/EditViewPage-CiwVPMaK.mjs.map +0 -1
- package/dist/_chunks/Field-DIjL1b5d.mjs.map +0 -1
- package/dist/_chunks/Field-DhXEK8y1.js.map +0 -1
- package/dist/_chunks/History-BLCCNgCt.js.map +0 -1
- package/dist/_chunks/History-D-99Wh30.mjs.map +0 -1
- package/dist/_chunks/ListConfigurationPage-DxWpeZrO.js.map +0 -1
- package/dist/_chunks/ListConfigurationPage-JPWZz7Kg.mjs.map +0 -1
- package/dist/_chunks/ListViewPage-CIQekSFz.js.map +0 -1
- package/dist/_chunks/ListViewPage-DSK3f0ST.mjs.map +0 -1
- package/dist/_chunks/Relations-BBmhcWFV.mjs.map +0 -1
- package/dist/_chunks/Relations-eG-9p_qS.js.map +0 -1
- package/dist/_chunks/index-BIWDoFLK.js.map +0 -1
- package/dist/_chunks/index-BrUzbQ30.mjs.map +0 -1
- package/dist/_chunks/relations-BRHithi8.js.map +0 -1
- package/dist/_chunks/relations-B_VLk-DD.mjs.map +0 -1
- package/dist/admin/src/preview/constants.d.ts +0 -1
- package/dist/server/src/preview/constants.d.ts +0 -2
- package/dist/server/src/preview/constants.d.ts.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
|
+
}
|
493
|
+
}
|
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);
|
489
502
|
}
|
490
|
-
if (attribute.type === "media") {
|
491
|
-
|
492
|
-
|
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 = {
|
@@ -702,14 +724,14 @@ const getFeature$1 = () => {
|
|
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 {
|
@@ -719,33 +741,213 @@ const getFeature$1 = () => {
|
|
719
741
|
};
|
720
742
|
};
|
721
743
|
const history = getFeature$1();
|
722
|
-
const
|
723
|
-
|
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
|
+
]
|
724
758
|
};
|
725
|
-
const
|
726
|
-
|
727
|
-
ENTRY_UNPUBLISH: "entry.unpublish"
|
759
|
+
const routes$1 = {
|
760
|
+
preview: previewRouter
|
728
761
|
};
|
729
|
-
|
730
|
-
|
731
|
-
|
732
|
-
|
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");
|
733
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 = () => {
|
734
796
|
return {
|
735
|
-
|
736
|
-
|
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;
|
737
913
|
}
|
738
914
|
};
|
739
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
|
+
};
|
740
934
|
const preview = getFeature();
|
935
|
+
const register = async ({ strapi: strapi2 }) => {
|
936
|
+
await history.register?.({ strapi: strapi2 });
|
937
|
+
await preview.register?.({ strapi: strapi2 });
|
938
|
+
};
|
939
|
+
const ALLOWED_WEBHOOK_EVENTS = {
|
940
|
+
ENTRY_PUBLISH: "entry.publish",
|
941
|
+
ENTRY_UNPUBLISH: "entry.unpublish"
|
942
|
+
};
|
741
943
|
const bootstrap = async () => {
|
742
944
|
Object.entries(ALLOWED_WEBHOOK_EVENTS).forEach(([key, value]) => {
|
743
945
|
strapi.get("webhookStore").addAllowedEvent(key, value);
|
744
946
|
});
|
745
|
-
getService$
|
746
|
-
await getService$
|
747
|
-
await getService$
|
748
|
-
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();
|
749
951
|
await history.bootstrap?.({ strapi });
|
750
952
|
await preview.bootstrap?.({ strapi });
|
751
953
|
};
|
@@ -1237,7 +1439,8 @@ const admin = {
|
|
1237
1439
|
};
|
1238
1440
|
const routes = {
|
1239
1441
|
admin,
|
1240
|
-
...history.routes ? history.routes : {}
|
1442
|
+
...history.routes ? history.routes : {},
|
1443
|
+
...preview.routes ? preview.routes : {}
|
1241
1444
|
};
|
1242
1445
|
const hasPermissionsSchema = strapiUtils.yup.object({
|
1243
1446
|
actions: strapiUtils.yup.array().of(strapiUtils.yup.string()),
|
@@ -1300,8 +1503,7 @@ const isSortable = (schema, name) => {
|
|
1300
1503
|
if (!___default.default.has(schema.attributes, name)) {
|
1301
1504
|
return false;
|
1302
1505
|
}
|
1303
|
-
if (schema.modelType === "component" && name === "id")
|
1304
|
-
return false;
|
1506
|
+
if (schema.modelType === "component" && name === "id") return false;
|
1305
1507
|
const attribute = schema.attributes[name];
|
1306
1508
|
if (NON_SORTABLES.includes(attribute.type)) {
|
1307
1509
|
return false;
|
@@ -1446,8 +1648,7 @@ const createDefaultSettings = async (schema) => {
|
|
1446
1648
|
};
|
1447
1649
|
};
|
1448
1650
|
const syncSettings = async (configuration, schema) => {
|
1449
|
-
if (fp.isEmpty(configuration.settings))
|
1450
|
-
return createDefaultSettings(schema);
|
1651
|
+
if (fp.isEmpty(configuration.settings)) return createDefaultSettings(schema);
|
1451
1652
|
const defaultField = getDefaultMainField(schema);
|
1452
1653
|
const { mainField = defaultField, defaultSortBy = defaultField } = configuration.settings || {};
|
1453
1654
|
return {
|
@@ -1494,7 +1695,7 @@ const createMetadasSchema = (schema) => {
|
|
1494
1695
|
if (!value) {
|
1495
1696
|
return strapiUtils.yup.string();
|
1496
1697
|
}
|
1497
|
-
const targetSchema = getService$
|
1698
|
+
const targetSchema = getService$2("content-types").findContentType(
|
1498
1699
|
schema.attributes[key].targetModel
|
1499
1700
|
);
|
1500
1701
|
if (!targetSchema) {
|
@@ -1623,8 +1824,7 @@ const excludeNotCreatableFields = (uid2, permissionChecker2) => (body, path = []
|
|
1623
1824
|
}
|
1624
1825
|
switch (attribute.type) {
|
1625
1826
|
case "relation": {
|
1626
|
-
if (canCreate(attributePath))
|
1627
|
-
return body2;
|
1827
|
+
if (canCreate(attributePath)) return body2;
|
1628
1828
|
return fp.set(attributePath, { set: [] }, body2);
|
1629
1829
|
}
|
1630
1830
|
case "component": {
|
@@ -1634,8 +1834,7 @@ const excludeNotCreatableFields = (uid2, permissionChecker2) => (body, path = []
|
|
1634
1834
|
]);
|
1635
1835
|
}
|
1636
1836
|
default: {
|
1637
|
-
if (canCreate(attributePath))
|
1638
|
-
return body2;
|
1837
|
+
if (canCreate(attributePath)) return body2;
|
1639
1838
|
return fp.set(attributePath, null, body2);
|
1640
1839
|
}
|
1641
1840
|
}
|
@@ -1663,7 +1862,7 @@ const getDocumentLocaleAndStatus = async (request, model, opts = { allowMultiple
|
|
1663
1862
|
}
|
1664
1863
|
};
|
1665
1864
|
const formatDocumentWithMetadata = async (permissionChecker2, uid2, document, opts = {}) => {
|
1666
|
-
const documentMetadata2 = getService$
|
1865
|
+
const documentMetadata2 = getService$2("document-metadata");
|
1667
1866
|
const serviceOutput = await documentMetadata2.formatDocumentWithMetadata(uid2, document, opts);
|
1668
1867
|
let {
|
1669
1868
|
meta: { availableLocales, availableStatus }
|
@@ -1689,8 +1888,8 @@ const createDocument = async (ctx, opts) => {
|
|
1689
1888
|
const { userAbility, user } = ctx.state;
|
1690
1889
|
const { model } = ctx.params;
|
1691
1890
|
const { body } = ctx.request;
|
1692
|
-
const documentManager2 = getService$
|
1693
|
-
const permissionChecker2 = getService$
|
1891
|
+
const documentManager2 = getService$2("document-manager");
|
1892
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
1694
1893
|
if (permissionChecker2.cannot.create()) {
|
1695
1894
|
throw new strapiUtils.errors.ForbiddenError();
|
1696
1895
|
}
|
@@ -1710,13 +1909,13 @@ const updateDocument = async (ctx, opts) => {
|
|
1710
1909
|
const { userAbility, user } = ctx.state;
|
1711
1910
|
const { id, model } = ctx.params;
|
1712
1911
|
const { body } = ctx.request;
|
1713
|
-
const documentManager2 = getService$
|
1714
|
-
const permissionChecker2 = getService$
|
1912
|
+
const documentManager2 = getService$2("document-manager");
|
1913
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
1715
1914
|
if (permissionChecker2.cannot.update()) {
|
1716
1915
|
throw new strapiUtils.errors.ForbiddenError();
|
1717
1916
|
}
|
1718
1917
|
const permissionQuery = await permissionChecker2.sanitizedQuery.update(ctx.query);
|
1719
|
-
const populate = await getService$
|
1918
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
|
1720
1919
|
const { locale } = await getDocumentLocaleAndStatus(body, model);
|
1721
1920
|
const [documentVersion, documentExists] = await Promise.all([
|
1722
1921
|
documentManager2.findOne(id, model, { populate, locale, status: "draft" }),
|
@@ -1747,14 +1946,14 @@ const collectionTypes = {
|
|
1747
1946
|
const { userAbility } = ctx.state;
|
1748
1947
|
const { model } = ctx.params;
|
1749
1948
|
const { query } = ctx.request;
|
1750
|
-
const documentMetadata2 = getService$
|
1751
|
-
const documentManager2 = getService$
|
1752
|
-
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 });
|
1753
1952
|
if (permissionChecker2.cannot.read()) {
|
1754
1953
|
return ctx.forbidden();
|
1755
1954
|
}
|
1756
1955
|
const permissionQuery = await permissionChecker2.sanitizedQuery.read(query);
|
1757
|
-
const populate = await getService$
|
1956
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(1).countRelations({ toOne: false, toMany: true }).build();
|
1758
1957
|
const { locale, status } = await getDocumentLocaleAndStatus(query, model);
|
1759
1958
|
const { results: documents, pagination } = await documentManager2.findPage(
|
1760
1959
|
{ ...permissionQuery, populate, locale, status },
|
@@ -1783,13 +1982,13 @@ const collectionTypes = {
|
|
1783
1982
|
async findOne(ctx) {
|
1784
1983
|
const { userAbility } = ctx.state;
|
1785
1984
|
const { model, id } = ctx.params;
|
1786
|
-
const documentManager2 = getService$
|
1787
|
-
const permissionChecker2 = getService$
|
1985
|
+
const documentManager2 = getService$2("document-manager");
|
1986
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
1788
1987
|
if (permissionChecker2.cannot.read()) {
|
1789
1988
|
return ctx.forbidden();
|
1790
1989
|
}
|
1791
1990
|
const permissionQuery = await permissionChecker2.sanitizedQuery.read(ctx.query);
|
1792
|
-
const populate = await getService$
|
1991
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(Infinity).countRelations().build();
|
1793
1992
|
const { locale, status } = await getDocumentLocaleAndStatus(ctx.query, model);
|
1794
1993
|
const version = await documentManager2.findOne(id, model, {
|
1795
1994
|
populate,
|
@@ -1820,7 +2019,7 @@ const collectionTypes = {
|
|
1820
2019
|
async create(ctx) {
|
1821
2020
|
const { userAbility } = ctx.state;
|
1822
2021
|
const { model } = ctx.params;
|
1823
|
-
const permissionChecker2 = getService$
|
2022
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
1824
2023
|
const [totalEntries, document] = await Promise.all([
|
1825
2024
|
strapi.db.query(model).count(),
|
1826
2025
|
createDocument(ctx)
|
@@ -1841,7 +2040,7 @@ const collectionTypes = {
|
|
1841
2040
|
async update(ctx) {
|
1842
2041
|
const { userAbility } = ctx.state;
|
1843
2042
|
const { model } = ctx.params;
|
1844
|
-
const permissionChecker2 = getService$
|
2043
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
1845
2044
|
const updatedVersion = await updateDocument(ctx);
|
1846
2045
|
const sanitizedVersion = await permissionChecker2.sanitizeOutput(updatedVersion);
|
1847
2046
|
ctx.body = await formatDocumentWithMetadata(permissionChecker2, model, sanitizedVersion);
|
@@ -1850,13 +2049,13 @@ const collectionTypes = {
|
|
1850
2049
|
const { userAbility, user } = ctx.state;
|
1851
2050
|
const { model, sourceId: id } = ctx.params;
|
1852
2051
|
const { body } = ctx.request;
|
1853
|
-
const documentManager2 = getService$
|
1854
|
-
const permissionChecker2 = getService$
|
2052
|
+
const documentManager2 = getService$2("document-manager");
|
2053
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
1855
2054
|
if (permissionChecker2.cannot.create()) {
|
1856
2055
|
return ctx.forbidden();
|
1857
2056
|
}
|
1858
2057
|
const permissionQuery = await permissionChecker2.sanitizedQuery.create(ctx.query);
|
1859
|
-
const populate = await getService$
|
2058
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
|
1860
2059
|
const { locale } = await getDocumentLocaleAndStatus(body, model);
|
1861
2060
|
const document = await documentManager2.findOne(id, model, {
|
1862
2061
|
populate,
|
@@ -1895,13 +2094,13 @@ const collectionTypes = {
|
|
1895
2094
|
async delete(ctx) {
|
1896
2095
|
const { userAbility } = ctx.state;
|
1897
2096
|
const { id, model } = ctx.params;
|
1898
|
-
const documentManager2 = getService$
|
1899
|
-
const permissionChecker2 = getService$
|
2097
|
+
const documentManager2 = getService$2("document-manager");
|
2098
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
1900
2099
|
if (permissionChecker2.cannot.delete()) {
|
1901
2100
|
return ctx.forbidden();
|
1902
2101
|
}
|
1903
2102
|
const permissionQuery = await permissionChecker2.sanitizedQuery.delete(ctx.query);
|
1904
|
-
const populate = await getService$
|
2103
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
|
1905
2104
|
const { locale } = await getDocumentLocaleAndStatus(ctx.query, model);
|
1906
2105
|
const documentLocales = await documentManager2.findLocales(id, model, { populate, locale });
|
1907
2106
|
if (documentLocales.length === 0) {
|
@@ -1923,14 +2122,14 @@ const collectionTypes = {
|
|
1923
2122
|
const { userAbility } = ctx.state;
|
1924
2123
|
const { id, model } = ctx.params;
|
1925
2124
|
const { body } = ctx.request;
|
1926
|
-
const documentManager2 = getService$
|
1927
|
-
const permissionChecker2 = getService$
|
2125
|
+
const documentManager2 = getService$2("document-manager");
|
2126
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
1928
2127
|
if (permissionChecker2.cannot.publish()) {
|
1929
2128
|
return ctx.forbidden();
|
1930
2129
|
}
|
1931
2130
|
const publishedDocument = await strapi.db.transaction(async () => {
|
1932
2131
|
const permissionQuery = await permissionChecker2.sanitizedQuery.publish(ctx.query);
|
1933
|
-
const populate = await getService$
|
2132
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(Infinity).countRelations().build();
|
1934
2133
|
let document;
|
1935
2134
|
const { locale } = await getDocumentLocaleAndStatus(body, model);
|
1936
2135
|
const isCreate = fp.isNil(id);
|
@@ -1978,13 +2177,13 @@ const collectionTypes = {
|
|
1978
2177
|
const { body } = ctx.request;
|
1979
2178
|
const { documentIds } = body;
|
1980
2179
|
await validateBulkActionInput(body);
|
1981
|
-
const documentManager2 = getService$
|
1982
|
-
const permissionChecker2 = getService$
|
2180
|
+
const documentManager2 = getService$2("document-manager");
|
2181
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
1983
2182
|
if (permissionChecker2.cannot.publish()) {
|
1984
2183
|
return ctx.forbidden();
|
1985
2184
|
}
|
1986
2185
|
const permissionQuery = await permissionChecker2.sanitizedQuery.publish(ctx.query);
|
1987
|
-
const populate = await getService$
|
2186
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(Infinity).countRelations().build();
|
1988
2187
|
const { locale } = await getDocumentLocaleAndStatus(body, model, {
|
1989
2188
|
allowMultipleLocales: true
|
1990
2189
|
});
|
@@ -2009,8 +2208,8 @@ const collectionTypes = {
|
|
2009
2208
|
const { body } = ctx.request;
|
2010
2209
|
const { documentIds } = body;
|
2011
2210
|
await validateBulkActionInput(body);
|
2012
|
-
const documentManager2 = getService$
|
2013
|
-
const permissionChecker2 = getService$
|
2211
|
+
const documentManager2 = getService$2("document-manager");
|
2212
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2014
2213
|
if (permissionChecker2.cannot.unpublish()) {
|
2015
2214
|
return ctx.forbidden();
|
2016
2215
|
}
|
@@ -2039,8 +2238,8 @@ const collectionTypes = {
|
|
2039
2238
|
const {
|
2040
2239
|
body: { discardDraft, ...body }
|
2041
2240
|
} = ctx.request;
|
2042
|
-
const documentManager2 = getService$
|
2043
|
-
const permissionChecker2 = getService$
|
2241
|
+
const documentManager2 = getService$2("document-manager");
|
2242
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2044
2243
|
if (permissionChecker2.cannot.unpublish()) {
|
2045
2244
|
return ctx.forbidden();
|
2046
2245
|
}
|
@@ -2048,7 +2247,7 @@ const collectionTypes = {
|
|
2048
2247
|
return ctx.forbidden();
|
2049
2248
|
}
|
2050
2249
|
const permissionQuery = await permissionChecker2.sanitizedQuery.unpublish(ctx.query);
|
2051
|
-
const populate = await getService$
|
2250
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
|
2052
2251
|
const { locale } = await getDocumentLocaleAndStatus(body, model);
|
2053
2252
|
const document = await documentManager2.findOne(id, model, {
|
2054
2253
|
populate,
|
@@ -2079,13 +2278,13 @@ const collectionTypes = {
|
|
2079
2278
|
const { userAbility } = ctx.state;
|
2080
2279
|
const { id, model } = ctx.params;
|
2081
2280
|
const { body } = ctx.request;
|
2082
|
-
const documentManager2 = getService$
|
2083
|
-
const permissionChecker2 = getService$
|
2281
|
+
const documentManager2 = getService$2("document-manager");
|
2282
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2084
2283
|
if (permissionChecker2.cannot.discard()) {
|
2085
2284
|
return ctx.forbidden();
|
2086
2285
|
}
|
2087
2286
|
const permissionQuery = await permissionChecker2.sanitizedQuery.discard(ctx.query);
|
2088
|
-
const populate = await getService$
|
2287
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
|
2089
2288
|
const { locale } = await getDocumentLocaleAndStatus(body, model);
|
2090
2289
|
const document = await documentManager2.findOne(id, model, {
|
2091
2290
|
populate,
|
@@ -2110,13 +2309,13 @@ const collectionTypes = {
|
|
2110
2309
|
const { query, body } = ctx.request;
|
2111
2310
|
const { documentIds } = body;
|
2112
2311
|
await validateBulkActionInput(body);
|
2113
|
-
const documentManager2 = getService$
|
2114
|
-
const permissionChecker2 = getService$
|
2312
|
+
const documentManager2 = getService$2("document-manager");
|
2313
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2115
2314
|
if (permissionChecker2.cannot.delete()) {
|
2116
2315
|
return ctx.forbidden();
|
2117
2316
|
}
|
2118
2317
|
const permissionQuery = await permissionChecker2.sanitizedQuery.delete(query);
|
2119
|
-
const populate = await getService$
|
2318
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
|
2120
2319
|
const { locale } = await getDocumentLocaleAndStatus(body, model);
|
2121
2320
|
const documentLocales = await documentManager2.findLocales(documentIds, model, {
|
2122
2321
|
populate,
|
@@ -2137,13 +2336,13 @@ const collectionTypes = {
|
|
2137
2336
|
async countDraftRelations(ctx) {
|
2138
2337
|
const { userAbility } = ctx.state;
|
2139
2338
|
const { model, id } = ctx.params;
|
2140
|
-
const documentManager2 = getService$
|
2141
|
-
const permissionChecker2 = getService$
|
2339
|
+
const documentManager2 = getService$2("document-manager");
|
2340
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2142
2341
|
if (permissionChecker2.cannot.read()) {
|
2143
2342
|
return ctx.forbidden();
|
2144
2343
|
}
|
2145
2344
|
const permissionQuery = await permissionChecker2.sanitizedQuery.read(ctx.query);
|
2146
|
-
const populate = await getService$
|
2345
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
|
2147
2346
|
const { locale, status } = await getDocumentLocaleAndStatus(ctx.query, model);
|
2148
2347
|
const entity = await documentManager2.findOne(id, model, { populate, locale, status });
|
2149
2348
|
if (!entity) {
|
@@ -2162,8 +2361,8 @@ const collectionTypes = {
|
|
2162
2361
|
const ids = ctx.request.query.documentIds;
|
2163
2362
|
const locale = ctx.request.query.locale;
|
2164
2363
|
const { model } = ctx.params;
|
2165
|
-
const documentManager2 = getService$
|
2166
|
-
const permissionChecker2 = getService$
|
2364
|
+
const documentManager2 = getService$2("document-manager");
|
2365
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2167
2366
|
if (permissionChecker2.cannot.read()) {
|
2168
2367
|
return ctx.forbidden();
|
2169
2368
|
}
|
@@ -2187,13 +2386,13 @@ const collectionTypes = {
|
|
2187
2386
|
};
|
2188
2387
|
const components$1 = {
|
2189
2388
|
findComponents(ctx) {
|
2190
|
-
const components2 = getService$
|
2191
|
-
const { toDto } = getService$
|
2389
|
+
const components2 = getService$2("components").findAllComponents();
|
2390
|
+
const { toDto } = getService$2("data-mapper");
|
2192
2391
|
ctx.body = { data: components2.map(toDto) };
|
2193
2392
|
},
|
2194
2393
|
async findComponentConfiguration(ctx) {
|
2195
2394
|
const { uid: uid2 } = ctx.params;
|
2196
|
-
const componentService = getService$
|
2395
|
+
const componentService = getService$2("components");
|
2197
2396
|
const component = componentService.findComponent(uid2);
|
2198
2397
|
if (!component) {
|
2199
2398
|
return ctx.notFound("component.notFound");
|
@@ -2210,7 +2409,7 @@ const components$1 = {
|
|
2210
2409
|
async updateComponentConfiguration(ctx) {
|
2211
2410
|
const { uid: uid2 } = ctx.params;
|
2212
2411
|
const { body } = ctx.request;
|
2213
|
-
const componentService = getService$
|
2412
|
+
const componentService = getService$2("components");
|
2214
2413
|
const component = componentService.findComponent(uid2);
|
2215
2414
|
if (!component) {
|
2216
2415
|
return ctx.notFound("component.notFound");
|
@@ -2244,12 +2443,12 @@ const contentTypes = {
|
|
2244
2443
|
} catch (error) {
|
2245
2444
|
return ctx.send({ error }, 400);
|
2246
2445
|
}
|
2247
|
-
const contentTypes2 = getService$
|
2248
|
-
const { toDto } = getService$
|
2446
|
+
const contentTypes2 = getService$2("content-types").findContentTypesByKind(kind);
|
2447
|
+
const { toDto } = getService$2("data-mapper");
|
2249
2448
|
ctx.body = { data: contentTypes2.map(toDto) };
|
2250
2449
|
},
|
2251
2450
|
async findContentTypesSettings(ctx) {
|
2252
|
-
const { findAllContentTypes, findConfiguration } = getService$
|
2451
|
+
const { findAllContentTypes, findConfiguration } = getService$2("content-types");
|
2253
2452
|
const contentTypes2 = await findAllContentTypes();
|
2254
2453
|
const configurations = await Promise.all(
|
2255
2454
|
contentTypes2.map(async (contentType) => {
|
@@ -2263,7 +2462,7 @@ const contentTypes = {
|
|
2263
2462
|
},
|
2264
2463
|
async findContentTypeConfiguration(ctx) {
|
2265
2464
|
const { uid: uid2 } = ctx.params;
|
2266
|
-
const contentTypeService = getService$
|
2465
|
+
const contentTypeService = getService$2("content-types");
|
2267
2466
|
const contentType = await contentTypeService.findContentType(uid2);
|
2268
2467
|
if (!contentType) {
|
2269
2468
|
return ctx.notFound("contentType.notFound");
|
@@ -2285,13 +2484,13 @@ const contentTypes = {
|
|
2285
2484
|
const { userAbility } = ctx.state;
|
2286
2485
|
const { uid: uid2 } = ctx.params;
|
2287
2486
|
const { body } = ctx.request;
|
2288
|
-
const contentTypeService = getService$
|
2289
|
-
const metricsService = getService$
|
2487
|
+
const contentTypeService = getService$2("content-types");
|
2488
|
+
const metricsService = getService$2("metrics");
|
2290
2489
|
const contentType = await contentTypeService.findContentType(uid2);
|
2291
2490
|
if (!contentType) {
|
2292
2491
|
return ctx.notFound("contentType.notFound");
|
2293
2492
|
}
|
2294
|
-
if (!getService$
|
2493
|
+
if (!getService$2("permission").canConfigureContentType({ userAbility, contentType })) {
|
2295
2494
|
return ctx.forbidden();
|
2296
2495
|
}
|
2297
2496
|
let input;
|
@@ -2324,10 +2523,10 @@ const contentTypes = {
|
|
2324
2523
|
};
|
2325
2524
|
const init = {
|
2326
2525
|
getInitData(ctx) {
|
2327
|
-
const { toDto } = getService$
|
2328
|
-
const { findAllComponents } = getService$
|
2329
|
-
const { getAllFieldSizes } = getService$
|
2330
|
-
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");
|
2331
2530
|
ctx.body = {
|
2332
2531
|
data: {
|
2333
2532
|
fieldSizes: getAllFieldSizes(),
|
@@ -2363,7 +2562,7 @@ const addFiltersClause = (params, filtersClause) => {
|
|
2363
2562
|
params.filters.$and.push(filtersClause);
|
2364
2563
|
};
|
2365
2564
|
const sanitizeMainField = (model, mainField, userAbility) => {
|
2366
|
-
const permissionChecker2 = getService$
|
2565
|
+
const permissionChecker2 = getService$2("permission-checker").create({
|
2367
2566
|
userAbility,
|
2368
2567
|
model: model.uid
|
2369
2568
|
});
|
@@ -2381,7 +2580,7 @@ const addStatusToRelations = async (targetUid, relations2) => {
|
|
2381
2580
|
if (!strapiUtils.contentTypes.hasDraftAndPublish(strapi.getModel(targetUid))) {
|
2382
2581
|
return relations2;
|
2383
2582
|
}
|
2384
|
-
const documentMetadata2 = getService$
|
2583
|
+
const documentMetadata2 = getService$2("document-metadata");
|
2385
2584
|
if (!relations2.length) {
|
2386
2585
|
return relations2;
|
2387
2586
|
}
|
@@ -2428,8 +2627,7 @@ const validateStatus = (sourceUid, status) => {
|
|
2428
2627
|
const sourceModel = strapi.getModel(sourceUid);
|
2429
2628
|
const isDP = strapiUtils.contentTypes.hasDraftAndPublish;
|
2430
2629
|
const isSourceDP = isDP(sourceModel);
|
2431
|
-
if (!isSourceDP)
|
2432
|
-
return { status: void 0 };
|
2630
|
+
if (!isSourceDP) return { status: void 0 };
|
2433
2631
|
switch (status) {
|
2434
2632
|
case "published":
|
2435
2633
|
return { status: "published" };
|
@@ -2459,7 +2657,7 @@ const relations = {
|
|
2459
2657
|
ctx.request?.query?.locale
|
2460
2658
|
);
|
2461
2659
|
const { status } = validateStatus(sourceUid, ctx.request?.query?.status);
|
2462
|
-
const permissionChecker2 = getService$
|
2660
|
+
const permissionChecker2 = getService$2("permission-checker").create({
|
2463
2661
|
userAbility,
|
2464
2662
|
model
|
2465
2663
|
});
|
@@ -2484,7 +2682,7 @@ const relations = {
|
|
2484
2682
|
where.id = id;
|
2485
2683
|
}
|
2486
2684
|
const permissionQuery = await permissionChecker2.sanitizedQuery.read(ctx.query);
|
2487
|
-
const populate = await getService$
|
2685
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
|
2488
2686
|
const currentEntity = await strapi.db.query(model).findOne({
|
2489
2687
|
where,
|
2490
2688
|
populate
|
@@ -2499,7 +2697,7 @@ const relations = {
|
|
2499
2697
|
}
|
2500
2698
|
entryId = currentEntity.id;
|
2501
2699
|
}
|
2502
|
-
const modelConfig = isComponent2 ? await getService$
|
2700
|
+
const modelConfig = isComponent2 ? await getService$2("components").findConfiguration(sourceSchema) : await getService$2("content-types").findConfiguration(sourceSchema);
|
2503
2701
|
const targetSchema = strapi.getModel(targetUid);
|
2504
2702
|
const mainField = fp.flow(
|
2505
2703
|
fp.prop(`metadatas.${targetField}.edit.mainField`),
|
@@ -2553,7 +2751,7 @@ const relations = {
|
|
2553
2751
|
}
|
2554
2752
|
} = await this.extractAndValidateRequestInfo(ctx, id);
|
2555
2753
|
const { idsToOmit, idsToInclude, _q, ...query } = ctx.request.query;
|
2556
|
-
const permissionChecker2 = getService$
|
2754
|
+
const permissionChecker2 = getService$2("permission-checker").create({
|
2557
2755
|
userAbility: ctx.state.userAbility,
|
2558
2756
|
model: targetUid
|
2559
2757
|
});
|
@@ -2632,7 +2830,7 @@ const relations = {
|
|
2632
2830
|
} = await this.extractAndValidateRequestInfo(ctx, id);
|
2633
2831
|
const { uid: sourceUid } = sourceSchema;
|
2634
2832
|
const { uid: targetUid } = targetSchema;
|
2635
|
-
const permissionQuery = await getService$
|
2833
|
+
const permissionQuery = await getService$2("permission-checker").create({ userAbility, model: targetUid }).sanitizedQuery.read({ fields: fieldsToSelect });
|
2636
2834
|
const dbQuery = strapi.db.query(sourceUid);
|
2637
2835
|
const loadRelations = strapiUtils.relations.isAnyToMany(attribute) ? (...args) => dbQuery.loadPages(...args) : (...args) => dbQuery.load(...args).then((res2) => ({ results: res2 ? [res2] : [] }));
|
2638
2836
|
const filters = {};
|
@@ -2673,10 +2871,10 @@ const relations = {
|
|
2673
2871
|
}
|
2674
2872
|
};
|
2675
2873
|
const buildPopulateFromQuery = async (query, model) => {
|
2676
|
-
return getService$
|
2874
|
+
return getService$2("populate-builder")(model).populateFromQuery(query).populateDeep(Infinity).countRelations().build();
|
2677
2875
|
};
|
2678
2876
|
const findDocument = async (query, uid2, opts = {}) => {
|
2679
|
-
const documentManager2 = getService$
|
2877
|
+
const documentManager2 = getService$2("document-manager");
|
2680
2878
|
const populate = await buildPopulateFromQuery(query, uid2);
|
2681
2879
|
return documentManager2.findMany({ ...opts, populate }, uid2).then((documents) => documents[0]);
|
2682
2880
|
};
|
@@ -2684,8 +2882,8 @@ const createOrUpdateDocument = async (ctx, opts) => {
|
|
2684
2882
|
const { user, userAbility } = ctx.state;
|
2685
2883
|
const { model } = ctx.params;
|
2686
2884
|
const { body, query } = ctx.request;
|
2687
|
-
const documentManager2 = getService$
|
2688
|
-
const permissionChecker2 = getService$
|
2885
|
+
const documentManager2 = getService$2("document-manager");
|
2886
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2689
2887
|
if (permissionChecker2.cannot.create() && permissionChecker2.cannot.update()) {
|
2690
2888
|
throw new strapiUtils.errors.ForbiddenError();
|
2691
2889
|
}
|
@@ -2726,7 +2924,7 @@ const singleTypes = {
|
|
2726
2924
|
const { userAbility } = ctx.state;
|
2727
2925
|
const { model } = ctx.params;
|
2728
2926
|
const { query = {} } = ctx.request;
|
2729
|
-
const permissionChecker2 = getService$
|
2927
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2730
2928
|
if (permissionChecker2.cannot.read()) {
|
2731
2929
|
return ctx.forbidden();
|
2732
2930
|
}
|
@@ -2760,7 +2958,7 @@ const singleTypes = {
|
|
2760
2958
|
async createOrUpdate(ctx) {
|
2761
2959
|
const { userAbility } = ctx.state;
|
2762
2960
|
const { model } = ctx.params;
|
2763
|
-
const permissionChecker2 = getService$
|
2961
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2764
2962
|
const document = await createOrUpdateDocument(ctx);
|
2765
2963
|
const sanitizedDocument = await permissionChecker2.sanitizeOutput(document);
|
2766
2964
|
ctx.body = await formatDocumentWithMetadata(permissionChecker2, model, sanitizedDocument);
|
@@ -2769,8 +2967,8 @@ const singleTypes = {
|
|
2769
2967
|
const { userAbility } = ctx.state;
|
2770
2968
|
const { model } = ctx.params;
|
2771
2969
|
const { query = {} } = ctx.request;
|
2772
|
-
const documentManager2 = getService$
|
2773
|
-
const permissionChecker2 = getService$
|
2970
|
+
const documentManager2 = getService$2("document-manager");
|
2971
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2774
2972
|
if (permissionChecker2.cannot.delete()) {
|
2775
2973
|
return ctx.forbidden();
|
2776
2974
|
}
|
@@ -2798,8 +2996,8 @@ const singleTypes = {
|
|
2798
2996
|
const { userAbility } = ctx.state;
|
2799
2997
|
const { model } = ctx.params;
|
2800
2998
|
const { query = {} } = ctx.request;
|
2801
|
-
const documentManager2 = getService$
|
2802
|
-
const permissionChecker2 = getService$
|
2999
|
+
const documentManager2 = getService$2("document-manager");
|
3000
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2803
3001
|
if (permissionChecker2.cannot.publish()) {
|
2804
3002
|
return ctx.forbidden();
|
2805
3003
|
}
|
@@ -2827,8 +3025,8 @@ const singleTypes = {
|
|
2827
3025
|
body: { discardDraft, ...body },
|
2828
3026
|
query = {}
|
2829
3027
|
} = ctx.request;
|
2830
|
-
const documentManager2 = getService$
|
2831
|
-
const permissionChecker2 = getService$
|
3028
|
+
const documentManager2 = getService$2("document-manager");
|
3029
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2832
3030
|
if (permissionChecker2.cannot.unpublish()) {
|
2833
3031
|
return ctx.forbidden();
|
2834
3032
|
}
|
@@ -2862,8 +3060,8 @@ const singleTypes = {
|
|
2862
3060
|
const { userAbility } = ctx.state;
|
2863
3061
|
const { model } = ctx.params;
|
2864
3062
|
const { body, query = {} } = ctx.request;
|
2865
|
-
const documentManager2 = getService$
|
2866
|
-
const permissionChecker2 = getService$
|
3063
|
+
const documentManager2 = getService$2("document-manager");
|
3064
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2867
3065
|
if (permissionChecker2.cannot.discard()) {
|
2868
3066
|
return ctx.forbidden();
|
2869
3067
|
}
|
@@ -2886,8 +3084,8 @@ const singleTypes = {
|
|
2886
3084
|
const { userAbility } = ctx.state;
|
2887
3085
|
const { model } = ctx.params;
|
2888
3086
|
const { query } = ctx.request;
|
2889
|
-
const documentManager2 = getService$
|
2890
|
-
const permissionChecker2 = getService$
|
3087
|
+
const documentManager2 = getService$2("document-manager");
|
3088
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2891
3089
|
const { locale } = await getDocumentLocaleAndStatus(query, model);
|
2892
3090
|
if (permissionChecker2.cannot.read()) {
|
2893
3091
|
return ctx.forbidden();
|
@@ -2911,7 +3109,7 @@ const uid$1 = {
|
|
2911
3109
|
const { query = {} } = ctx.request;
|
2912
3110
|
const { locale } = await getDocumentLocaleAndStatus(query, contentTypeUID);
|
2913
3111
|
await validateUIDField(contentTypeUID, field);
|
2914
|
-
const uidService = getService$
|
3112
|
+
const uidService = getService$2("uid");
|
2915
3113
|
ctx.body = {
|
2916
3114
|
data: await uidService.generateUIDField({ contentTypeUID, field, data, locale })
|
2917
3115
|
};
|
@@ -2923,7 +3121,7 @@ const uid$1 = {
|
|
2923
3121
|
const { query = {} } = ctx.request;
|
2924
3122
|
const { locale } = await getDocumentLocaleAndStatus(query, contentTypeUID);
|
2925
3123
|
await validateUIDField(contentTypeUID, field);
|
2926
|
-
const uidService = getService$
|
3124
|
+
const uidService = getService$2("uid");
|
2927
3125
|
const isAvailable = await uidService.checkUIDAvailability({
|
2928
3126
|
contentTypeUID,
|
2929
3127
|
field,
|
@@ -2944,7 +3142,8 @@ const controllers = {
|
|
2944
3142
|
relations,
|
2945
3143
|
"single-types": singleTypes,
|
2946
3144
|
uid: uid$1,
|
2947
|
-
...history.controllers ? history.controllers : {}
|
3145
|
+
...history.controllers ? history.controllers : {},
|
3146
|
+
...preview.controllers ? preview.controllers : {}
|
2948
3147
|
};
|
2949
3148
|
const keys = {
|
2950
3149
|
CONFIGURATION: "configuration"
|
@@ -3073,18 +3272,15 @@ async function syncMetadatas(configuration, schema) {
|
|
3073
3272
|
___default.default.set(updatedMeta, ["list", "searchable"], false);
|
3074
3273
|
___default.default.set(acc, [key], updatedMeta);
|
3075
3274
|
}
|
3076
|
-
if (!___default.default.has(edit, "mainField"))
|
3077
|
-
return acc;
|
3275
|
+
if (!___default.default.has(edit, "mainField")) return acc;
|
3078
3276
|
if (!isRelation$1(attr)) {
|
3079
3277
|
___default.default.set(updatedMeta, "edit", ___default.default.omit(edit, ["mainField"]));
|
3080
3278
|
___default.default.set(acc, [key], updatedMeta);
|
3081
3279
|
return acc;
|
3082
3280
|
}
|
3083
|
-
if (edit.mainField === "id")
|
3084
|
-
return acc;
|
3281
|
+
if (edit.mainField === "id") return acc;
|
3085
3282
|
const targetSchema = getTargetSchema(attr.targetModel);
|
3086
|
-
if (!targetSchema)
|
3087
|
-
return acc;
|
3283
|
+
if (!targetSchema) return acc;
|
3088
3284
|
if (!isSortable(targetSchema, edit.mainField) && !isListable(targetSchema, edit.mainField)) {
|
3089
3285
|
___default.default.set(updatedMeta, ["edit", "mainField"], getDefaultMainField(targetSchema));
|
3090
3286
|
___default.default.set(acc, [key], updatedMeta);
|
@@ -3095,12 +3291,12 @@ async function syncMetadatas(configuration, schema) {
|
|
3095
3291
|
return ___default.default.assign(metasWithDefaults, updatedMetas);
|
3096
3292
|
}
|
3097
3293
|
const getTargetSchema = (targetModel) => {
|
3098
|
-
return getService$
|
3294
|
+
return getService$2("content-types").findContentType(targetModel);
|
3099
3295
|
};
|
3100
3296
|
const DEFAULT_LIST_LENGTH = 4;
|
3101
3297
|
const MAX_ROW_SIZE = 12;
|
3102
3298
|
const isAllowedFieldSize = (type, size) => {
|
3103
|
-
const { getFieldSize } = getService$
|
3299
|
+
const { getFieldSize } = getService$2("field-sizes");
|
3104
3300
|
const fieldSize = getFieldSize(type);
|
3105
3301
|
if (!fieldSize.isResizable && size !== fieldSize.default) {
|
3106
3302
|
return false;
|
@@ -3108,7 +3304,7 @@ const isAllowedFieldSize = (type, size) => {
|
|
3108
3304
|
return size <= MAX_ROW_SIZE;
|
3109
3305
|
};
|
3110
3306
|
const getDefaultFieldSize = (attribute) => {
|
3111
|
-
const { hasFieldSize, getFieldSize } = getService$
|
3307
|
+
const { hasFieldSize, getFieldSize } = getService$2("field-sizes");
|
3112
3308
|
return getFieldSize(hasFieldSize(attribute.customField) ? attribute.customField : attribute.type).default;
|
3113
3309
|
};
|
3114
3310
|
async function createDefaultLayouts(schema) {
|
@@ -3129,8 +3325,7 @@ function createDefaultEditLayout(schema) {
|
|
3129
3325
|
return appendToEditLayout([], keys2, schema);
|
3130
3326
|
}
|
3131
3327
|
function syncLayouts(configuration, schema) {
|
3132
|
-
if (___default.default.isEmpty(configuration.layouts))
|
3133
|
-
return createDefaultLayouts(schema);
|
3328
|
+
if (___default.default.isEmpty(configuration.layouts)) return createDefaultLayouts(schema);
|
3134
3329
|
const { list = [], editRelations = [], edit = [] } = configuration.layouts || {};
|
3135
3330
|
let cleanList = list.filter((attr) => isListable(schema, attr));
|
3136
3331
|
const cleanEditRelations = editRelations.filter(
|
@@ -3141,9 +3336,8 @@ function syncLayouts(configuration, schema) {
|
|
3141
3336
|
for (const row of edit) {
|
3142
3337
|
const newRow = [];
|
3143
3338
|
for (const el of row) {
|
3144
|
-
if (!hasEditableAttribute(schema, el.name))
|
3145
|
-
|
3146
|
-
const { hasFieldSize } = getService$1("field-sizes");
|
3339
|
+
if (!hasEditableAttribute(schema, el.name)) continue;
|
3340
|
+
const { hasFieldSize } = getService$2("field-sizes");
|
3147
3341
|
const fieldType = hasFieldSize(schema.attributes[el.name].customField) ? schema.attributes[el.name].customField : schema.attributes[el.name].type;
|
3148
3342
|
if (!isAllowedFieldSize(fieldType, el.size)) {
|
3149
3343
|
elementsToReAppend.push(el.name);
|
@@ -3173,8 +3367,7 @@ function syncLayouts(configuration, schema) {
|
|
3173
3367
|
};
|
3174
3368
|
}
|
3175
3369
|
const appendToEditLayout = (layout = [], keysToAppend, schema) => {
|
3176
|
-
if (keysToAppend.length === 0)
|
3177
|
-
return layout;
|
3370
|
+
if (keysToAppend.length === 0) return layout;
|
3178
3371
|
let currentRowIndex = Math.max(layout.length - 1, 0);
|
3179
3372
|
if (!layout[currentRowIndex]) {
|
3180
3373
|
layout[currentRowIndex] = [];
|
@@ -3283,17 +3476,17 @@ const configurationService$1 = createConfigurationService({
|
|
3283
3476
|
isComponent: true,
|
3284
3477
|
prefix: STORE_KEY_PREFIX,
|
3285
3478
|
getModels() {
|
3286
|
-
const { toContentManagerModel } = getService$
|
3479
|
+
const { toContentManagerModel } = getService$2("data-mapper");
|
3287
3480
|
return fp.mapValues(toContentManagerModel, strapi.components);
|
3288
3481
|
}
|
3289
3482
|
});
|
3290
3483
|
const components = ({ strapi: strapi2 }) => ({
|
3291
3484
|
findAllComponents() {
|
3292
|
-
const { toContentManagerModel } = getService$
|
3485
|
+
const { toContentManagerModel } = getService$2("data-mapper");
|
3293
3486
|
return Object.values(strapi2.components).map(toContentManagerModel);
|
3294
3487
|
},
|
3295
3488
|
findComponent(uid2) {
|
3296
|
-
const { toContentManagerModel } = getService$
|
3489
|
+
const { toContentManagerModel } = getService$2("data-mapper");
|
3297
3490
|
const component = strapi2.components[uid2];
|
3298
3491
|
return fp.isNil(component) ? component : toContentManagerModel(component);
|
3299
3492
|
},
|
@@ -3344,17 +3537,17 @@ const configurationService = createConfigurationService({
|
|
3344
3537
|
storeUtils,
|
3345
3538
|
prefix: "content_types",
|
3346
3539
|
getModels() {
|
3347
|
-
const { toContentManagerModel } = getService$
|
3540
|
+
const { toContentManagerModel } = getService$2("data-mapper");
|
3348
3541
|
return fp.mapValues(toContentManagerModel, strapi.contentTypes);
|
3349
3542
|
}
|
3350
3543
|
});
|
3351
3544
|
const service = ({ strapi: strapi2 }) => ({
|
3352
3545
|
findAllContentTypes() {
|
3353
|
-
const { toContentManagerModel } = getService$
|
3546
|
+
const { toContentManagerModel } = getService$2("data-mapper");
|
3354
3547
|
return Object.values(strapi2.contentTypes).map(toContentManagerModel);
|
3355
3548
|
},
|
3356
3549
|
findContentType(uid2) {
|
3357
|
-
const { toContentManagerModel } = getService$
|
3550
|
+
const { toContentManagerModel } = getService$2("data-mapper");
|
3358
3551
|
const contentType = strapi2.contentTypes[uid2];
|
3359
3552
|
return fp.isNil(contentType) ? contentType : toContentManagerModel(contentType);
|
3360
3553
|
},
|
@@ -3383,7 +3576,7 @@ const service = ({ strapi: strapi2 }) => ({
|
|
3383
3576
|
return this.findConfiguration(contentType);
|
3384
3577
|
},
|
3385
3578
|
findComponentsConfigurations(contentType) {
|
3386
|
-
return getService$
|
3579
|
+
return getService$2("components").findComponentsConfigurations(contentType);
|
3387
3580
|
},
|
3388
3581
|
syncConfigurations() {
|
3389
3582
|
return configurationService.syncConfigurations();
|
@@ -3655,7 +3848,7 @@ const permission = ({ strapi: strapi2 }) => ({
|
|
3655
3848
|
return userAbility.can(action);
|
3656
3849
|
},
|
3657
3850
|
async registerPermissions() {
|
3658
|
-
const displayedContentTypes = getService$
|
3851
|
+
const displayedContentTypes = getService$2("content-types").findDisplayedContentTypes();
|
3659
3852
|
const contentTypesUids = displayedContentTypes.map(fp.prop("uid"));
|
3660
3853
|
const actions = [
|
3661
3854
|
{
|
@@ -3740,6 +3933,12 @@ function getPopulateForRelation(attribute, model, attributeName, { countMany, co
|
|
3740
3933
|
if (initialPopulate) {
|
3741
3934
|
return initialPopulate;
|
3742
3935
|
}
|
3936
|
+
if (attributeName === "localizations") {
|
3937
|
+
const validationPopulate = getPopulateForValidation(model.uid);
|
3938
|
+
return {
|
3939
|
+
populate: validationPopulate.populate
|
3940
|
+
};
|
3941
|
+
}
|
3743
3942
|
if (!isVisibleAttribute$1(model, attributeName)) {
|
3744
3943
|
return true;
|
3745
3944
|
}
|
@@ -3799,6 +3998,9 @@ const getDeepPopulate = (uid2, {
|
|
3799
3998
|
return {};
|
3800
3999
|
}
|
3801
4000
|
const model = strapi.getModel(uid2);
|
4001
|
+
if (!model) {
|
4002
|
+
return {};
|
4003
|
+
}
|
3802
4004
|
return Object.keys(model.attributes).reduce(
|
3803
4005
|
(populateAcc, attributeName) => fp.merge(
|
3804
4006
|
populateAcc,
|
@@ -3818,40 +4020,46 @@ const getDeepPopulate = (uid2, {
|
|
3818
4020
|
{}
|
3819
4021
|
);
|
3820
4022
|
};
|
3821
|
-
const
|
3822
|
-
|
3823
|
-
|
3824
|
-
countOne = false,
|
3825
|
-
maxLevel = Infinity
|
3826
|
-
} = {}, level = 1) => {
|
3827
|
-
if (level > maxLevel) {
|
4023
|
+
const getPopulateForValidation = (uid2) => {
|
4024
|
+
const model = strapi.getModel(uid2);
|
4025
|
+
if (!model) {
|
3828
4026
|
return {};
|
3829
4027
|
}
|
3830
|
-
const model = strapi.getModel(uid2);
|
3831
4028
|
return Object.entries(model.attributes).reduce((populateAcc, [attributeName, attribute]) => {
|
3832
|
-
if (
|
4029
|
+
if (isScalarAttribute(attribute)) {
|
4030
|
+
if (getDoesAttributeRequireValidation(attribute)) {
|
4031
|
+
populateAcc.fields = populateAcc.fields || [];
|
4032
|
+
populateAcc.fields.push(attributeName);
|
4033
|
+
}
|
3833
4034
|
return populateAcc;
|
3834
4035
|
}
|
3835
|
-
if (
|
3836
|
-
|
3837
|
-
|
3838
|
-
|
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;
|
3839
4044
|
}
|
3840
|
-
|
3841
|
-
|
3842
|
-
|
3843
|
-
|
3844
|
-
|
3845
|
-
|
3846
|
-
|
3847
|
-
|
3848
|
-
|
3849
|
-
countOne,
|
3850
|
-
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;
|
3851
4054
|
},
|
3852
|
-
|
3853
|
-
)
|
3854
|
-
|
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;
|
3855
4063
|
}, {});
|
3856
4064
|
};
|
3857
4065
|
const getDeepPopulateDraftCount = (uid2) => {
|
@@ -3931,7 +4139,7 @@ const getQueryPopulate = async (uid2, query) => {
|
|
3931
4139
|
return populateQuery;
|
3932
4140
|
};
|
3933
4141
|
const buildDeepPopulate = (uid2) => {
|
3934
|
-
return getService$
|
4142
|
+
return getService$2("populate-builder")(uid2).populateDeep(Infinity).countRelations().build();
|
3935
4143
|
};
|
3936
4144
|
const populateBuilder = (uid2) => {
|
3937
4145
|
let getInitialPopulate = async () => {
|
@@ -4093,7 +4301,6 @@ const AVAILABLE_LOCALES_FIELDS = [
|
|
4093
4301
|
"locale",
|
4094
4302
|
"updatedAt",
|
4095
4303
|
"createdAt",
|
4096
|
-
"status",
|
4097
4304
|
"publishedAt",
|
4098
4305
|
"documentId"
|
4099
4306
|
];
|
@@ -4114,36 +4321,20 @@ const documentMetadata = ({ strapi: strapi2 }) => ({
|
|
4114
4321
|
/**
|
4115
4322
|
* Returns available locales of a document for the current status
|
4116
4323
|
*/
|
4117
|
-
async getAvailableLocales(uid2, version, allVersions
|
4324
|
+
async getAvailableLocales(uid2, version, allVersions) {
|
4118
4325
|
const versionsByLocale = fp.groupBy("locale", allVersions);
|
4119
4326
|
if (version.locale) {
|
4120
4327
|
delete versionsByLocale[version.locale];
|
4121
4328
|
}
|
4122
4329
|
const model = strapi2.getModel(uid2);
|
4123
|
-
const keysToKeep = [...AVAILABLE_LOCALES_FIELDS, ...validatableFields];
|
4124
|
-
const traversalFunction = async (localeVersion) => strapiUtils.traverseEntity(
|
4125
|
-
({ key }, { remove }) => {
|
4126
|
-
if (keysToKeep.includes(key)) {
|
4127
|
-
return;
|
4128
|
-
}
|
4129
|
-
remove(key);
|
4130
|
-
},
|
4131
|
-
{ schema: model, getModel: strapi2.getModel.bind(strapi2) },
|
4132
|
-
// @ts-expect-error fix types DocumentVersion incompatible with Data
|
4133
|
-
localeVersion
|
4134
|
-
);
|
4135
4330
|
const mappingResult = await strapiUtils.async.map(
|
4136
4331
|
Object.values(versionsByLocale),
|
4137
4332
|
async (localeVersions) => {
|
4138
|
-
const mappedLocaleVersions = await strapiUtils.async.map(
|
4139
|
-
localeVersions,
|
4140
|
-
traversalFunction
|
4141
|
-
);
|
4142
4333
|
if (!strapiUtils.contentTypes.hasDraftAndPublish(model)) {
|
4143
|
-
return
|
4334
|
+
return localeVersions[0];
|
4144
4335
|
}
|
4145
|
-
const draftVersion =
|
4146
|
-
const otherVersions =
|
4336
|
+
const draftVersion = localeVersions.find((v) => v.publishedAt === null);
|
4337
|
+
const otherVersions = localeVersions.filter((v) => v.id !== draftVersion?.id);
|
4147
4338
|
if (!draftVersion) {
|
4148
4339
|
return;
|
4149
4340
|
}
|
@@ -4165,8 +4356,7 @@ const documentMetadata = ({ strapi: strapi2 }) => ({
|
|
4165
4356
|
const matchStatus = status === "published" ? v.publishedAt !== null : v.publishedAt === null;
|
4166
4357
|
return matchLocale && matchStatus;
|
4167
4358
|
});
|
4168
|
-
if (!availableStatus)
|
4169
|
-
return availableStatus;
|
4359
|
+
if (!availableStatus) return availableStatus;
|
4170
4360
|
return fp.pick(AVAILABLE_STATUS_FIELDS, availableStatus);
|
4171
4361
|
},
|
4172
4362
|
/**
|
@@ -4176,18 +4366,19 @@ const documentMetadata = ({ strapi: strapi2 }) => ({
|
|
4176
4366
|
* @returns
|
4177
4367
|
*/
|
4178
4368
|
async getManyAvailableStatus(uid2, documents) {
|
4179
|
-
if (!documents.length)
|
4180
|
-
return [];
|
4369
|
+
if (!documents.length) return [];
|
4181
4370
|
const status = documents[0].publishedAt !== null ? "published" : "draft";
|
4182
|
-
const
|
4183
|
-
const
|
4184
|
-
|
4185
|
-
|
4186
|
-
|
4187
|
-
|
4188
|
-
|
4189
|
-
|
4190
|
-
|
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"]
|
4191
4382
|
});
|
4192
4383
|
},
|
4193
4384
|
getStatus(version, otherDocumentStatuses) {
|
@@ -4204,10 +4395,8 @@ const documentMetadata = ({ strapi: strapi2 }) => ({
|
|
4204
4395
|
} else if (otherVersion) {
|
4205
4396
|
draftVersion = otherVersion;
|
4206
4397
|
}
|
4207
|
-
if (!draftVersion)
|
4208
|
-
|
4209
|
-
if (!publishedVersion)
|
4210
|
-
return CONTENT_MANAGER_STATUS.DRAFT;
|
4398
|
+
if (!draftVersion) return CONTENT_MANAGER_STATUS.PUBLISHED;
|
4399
|
+
if (!publishedVersion) return CONTENT_MANAGER_STATUS.DRAFT;
|
4211
4400
|
const isDraftModified = getIsVersionLatestModification(draftVersion, publishedVersion);
|
4212
4401
|
return isDraftModified ? CONTENT_MANAGER_STATUS.MODIFIED : CONTENT_MANAGER_STATUS.PUBLISHED;
|
4213
4402
|
},
|
@@ -4215,11 +4404,9 @@ const documentMetadata = ({ strapi: strapi2 }) => ({
|
|
4215
4404
|
// We could refactor this so the locales are only loaded when they're
|
4216
4405
|
// needed. e.g. in the bulk locale action modal.
|
4217
4406
|
async getMetadata(uid2, version, { availableLocales = true, availableStatus = true } = {}) {
|
4218
|
-
const populate =
|
4219
|
-
const
|
4220
|
-
where: { documentId: version.documentId },
|
4407
|
+
const { populate = {}, fields = [] } = getPopulateForValidation(uid2);
|
4408
|
+
const params = {
|
4221
4409
|
populate: {
|
4222
|
-
// Populate only fields that require validation for bulk locale actions
|
4223
4410
|
...populate,
|
4224
4411
|
// NOTE: creator fields are selected in this way to avoid exposing sensitive data
|
4225
4412
|
createdBy: {
|
@@ -4228,9 +4415,15 @@ const documentMetadata = ({ strapi: strapi2 }) => ({
|
|
4228
4415
|
updatedBy: {
|
4229
4416
|
select: ["id", "firstname", "lastname", "email"]
|
4230
4417
|
}
|
4418
|
+
},
|
4419
|
+
fields: fp.uniq([...AVAILABLE_LOCALES_FIELDS, ...fields]),
|
4420
|
+
filters: {
|
4421
|
+
documentId: version.documentId
|
4231
4422
|
}
|
4232
|
-
}
|
4233
|
-
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) : [];
|
4234
4427
|
const availableStatusResult = availableStatus ? this.getAvailableStatus(version, versions) : null;
|
4235
4428
|
return {
|
4236
4429
|
availableLocales: availableLocalesResult,
|
@@ -4257,6 +4450,16 @@ const documentMetadata = ({ strapi: strapi2 }) => ({
|
|
4257
4450
|
opts.availableStatus = false;
|
4258
4451
|
}
|
4259
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
|
+
}
|
4260
4463
|
return {
|
4261
4464
|
data: {
|
4262
4465
|
...document,
|
@@ -4474,7 +4677,8 @@ const services = {
|
|
4474
4677
|
permission,
|
4475
4678
|
"populate-builder": populateBuilder$1,
|
4476
4679
|
uid,
|
4477
|
-
...history.services ? history.services : {}
|
4680
|
+
...history.services ? history.services : {},
|
4681
|
+
...preview.services ? preview.services : {}
|
4478
4682
|
};
|
4479
4683
|
const index = () => {
|
4480
4684
|
return {
|