@strapi/content-manager 0.0.0-next.b558642be856459a3e6c076f5d76fffbfc5fc5a1 → 0.0.0-next.b6435ada233136a0d0b14fba67961ff8f16cdac2
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-BlzvDpbX.js} +4 -5
- package/dist/_chunks/{ComponentConfigurationPage-gsCd80MU.js.map → ComponentConfigurationPage-BlzvDpbX.js.map} +1 -1
- package/dist/_chunks/{ComponentConfigurationPage-CIjXcRAB.mjs → ComponentConfigurationPage-DaPOlQaD.mjs} +3 -3
- package/dist/_chunks/{ComponentConfigurationPage-CIjXcRAB.mjs.map → ComponentConfigurationPage-DaPOlQaD.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-BZPXItXo.mjs} +3 -3
- package/dist/_chunks/{EditConfigurationPage-BglmD_BF.mjs.map → EditConfigurationPage-BZPXItXo.mjs.map} +1 -1
- package/dist/_chunks/{EditConfigurationPage-DHDQKBzw.js → EditConfigurationPage-uy-v43AR.js} +4 -5
- package/dist/_chunks/{EditConfigurationPage-DHDQKBzw.js.map → EditConfigurationPage-uy-v43AR.js.map} +1 -1
- package/dist/_chunks/{EditViewPage-C4iTxUPU.js → EditViewPage-DT6A4ayX.js} +38 -9
- package/dist/_chunks/EditViewPage-DT6A4ayX.js.map +1 -0
- package/dist/_chunks/{EditViewPage-CiwVPMaK.mjs → EditViewPage-oOLeTySr.mjs} +38 -8
- package/dist/_chunks/EditViewPage-oOLeTySr.mjs.map +1 -0
- package/dist/_chunks/{Field-DIjL1b5d.mjs → Field-D7dv2aUX.mjs} +169 -117
- package/dist/_chunks/Field-D7dv2aUX.mjs.map +1 -0
- package/dist/_chunks/{Field-DhXEK8y1.js → Field-kYFVIGiP.js} +171 -119
- package/dist/_chunks/Field-kYFVIGiP.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-CmNesrvR.mjs → Form-BxR6sc29.mjs} +3 -3
- package/dist/_chunks/{Form-CmNesrvR.mjs.map → Form-BxR6sc29.mjs.map} +1 -1
- package/dist/_chunks/{Form-CwmJ4sWe.js → Form-CCijSg3V.js} +5 -6
- package/dist/_chunks/{Form-CwmJ4sWe.js.map → Form-CCijSg3V.js.map} +1 -1
- package/dist/_chunks/{History-BLCCNgCt.js → History-BMndx49M.js} +22 -93
- package/dist/_chunks/History-BMndx49M.js.map +1 -0
- package/dist/_chunks/{History-D-99Wh30.mjs → History-D8F7aYQU.mjs} +22 -92
- package/dist/_chunks/History-D8F7aYQU.mjs.map +1 -0
- package/dist/_chunks/{ListConfigurationPage-DxWpeZrO.js → ListConfigurationPage-DouY1EWM.js} +6 -6
- package/dist/_chunks/ListConfigurationPage-DouY1EWM.js.map +1 -0
- package/dist/_chunks/{ListConfigurationPage-JPWZz7Kg.mjs → ListConfigurationPage-DqAdSPwC.mjs} +6 -5
- package/dist/_chunks/ListConfigurationPage-DqAdSPwC.mjs.map +1 -0
- package/dist/_chunks/{ListViewPage-CIQekSFz.js → ListViewPage-BPVmh9pq.js} +64 -53
- package/dist/_chunks/ListViewPage-BPVmh9pq.js.map +1 -0
- package/dist/_chunks/{ListViewPage-DSK3f0ST.mjs → ListViewPage-C73F0jPh.mjs} +63 -51
- package/dist/_chunks/ListViewPage-C73F0jPh.mjs.map +1 -0
- package/dist/_chunks/{NoContentTypePage-D99LU1YP.mjs → NoContentTypePage-B5w7iJOF.mjs} +2 -2
- package/dist/_chunks/{NoContentTypePage-D99LU1YP.mjs.map → NoContentTypePage-B5w7iJOF.mjs.map} +1 -1
- package/dist/_chunks/{NoContentTypePage-C5cxKvC2.js → NoContentTypePage-BwcL--4H.js} +2 -2
- package/dist/_chunks/{NoContentTypePage-C5cxKvC2.js.map → NoContentTypePage-BwcL--4H.js.map} +1 -1
- package/dist/_chunks/{NoPermissionsPage-Oy4tmUrW.js → NoPermissionsPage-BMFKVcwJ.js} +2 -2
- package/dist/_chunks/{NoPermissionsPage-Oy4tmUrW.js.map → NoPermissionsPage-BMFKVcwJ.js.map} +1 -1
- package/dist/_chunks/{NoPermissionsPage-DBrBw-0y.mjs → NoPermissionsPage-UnEgMGK4.mjs} +2 -2
- package/dist/_chunks/{NoPermissionsPage-DBrBw-0y.mjs.map → NoPermissionsPage-UnEgMGK4.mjs.map} +1 -1
- package/dist/_chunks/Preview-B7PR3Ok_.js +312 -0
- package/dist/_chunks/Preview-B7PR3Ok_.js.map +1 -0
- package/dist/_chunks/Preview-DECOhK0D.mjs +294 -0
- package/dist/_chunks/Preview-DECOhK0D.mjs.map +1 -0
- package/dist/_chunks/{Relations-BBmhcWFV.mjs → Relations-DinMQJ4B.mjs} +9 -8
- package/dist/_chunks/Relations-DinMQJ4B.mjs.map +1 -0
- package/dist/_chunks/{Relations-eG-9p_qS.js → Relations-lndx3aQk.js} +10 -10
- package/dist/_chunks/Relations-lndx3aQk.js.map +1 -0
- package/dist/_chunks/{en-Bm0D0IWz.js → en-BK8Xyl5I.js} +16 -4
- package/dist/_chunks/{en-Bm0D0IWz.js.map → en-BK8Xyl5I.js.map} +1 -1
- package/dist/_chunks/{en-DKV44jRb.mjs → en-Dtk_ot79.mjs} +16 -4
- package/dist/_chunks/{en-DKV44jRb.mjs.map → en-Dtk_ot79.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-BrUzbQ30.mjs → index-C2SagWVW.mjs} +327 -183
- package/dist/_chunks/index-C2SagWVW.mjs.map +1 -0
- package/dist/_chunks/{index-BIWDoFLK.js → index-Cnw4gqee.js} +324 -181
- package/dist/_chunks/index-Cnw4gqee.js.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-_5-cXs34.mjs → layout-DY_D9MGA.mjs} +4 -4
- package/dist/_chunks/{layout-_5-cXs34.mjs.map → layout-DY_D9MGA.mjs.map} +1 -1
- package/dist/_chunks/{layout-lMc9i1-Z.js → layout-ivwIVPnV.js} +5 -6
- package/dist/_chunks/{layout-lMc9i1-Z.js.map → layout-ivwIVPnV.js.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-BRHithi8.js → relations-B7C7O_Pv.js} +6 -3
- package/dist/_chunks/relations-B7C7O_Pv.js.map +1 -0
- package/dist/_chunks/{relations-B_VLk-DD.mjs → relations-Boc5Y9kX.mjs} +6 -3
- package/dist/_chunks/relations-Boc5Y9kX.mjs.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 +1 -1
- package/dist/admin/index.mjs +4 -4
- package/dist/admin/src/content-manager.d.ts +3 -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 +2 -2
- 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/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/documents.d.ts +0 -3
- package/dist/server/index.js +384 -233
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +385 -233
- package/dist/server/index.mjs.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/services/lifecycles.d.ts.map +1 -1
- 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/preview.d.ts +6 -2
- package/dist/server/src/preview/controllers/preview.d.ts.map +1 -1
- 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/services/index.d.ts +13 -1
- package/dist/server/src/preview/services/index.d.ts.map +1 -1
- 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 +7 -1
- package/dist/server/src/preview/services/preview.d.ts.map +1 -1
- package/dist/server/src/preview/utils.d.ts +13 -1
- package/dist/server/src/preview/utils.d.ts.map +1 -1
- package/dist/server/src/register.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 -11
- 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 {
|
@@ -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({
|
@@ -203,8 +201,7 @@ const createServiceUtils = ({ strapi: strapi2 }) => {
|
|
203
201
|
const getDefaultLocale = async () => localesService ? localesService.getDefaultLocale() : null;
|
204
202
|
const isLocalizedContentType = (model) => i18nContentTypeService ? i18nContentTypeService.isLocalizedContentType(model) : false;
|
205
203
|
const getLocaleDictionary = async () => {
|
206
|
-
if (!localesService)
|
207
|
-
return {};
|
204
|
+
if (!localesService) return {};
|
208
205
|
const locales = await localesService.find() || [];
|
209
206
|
return locales.reduce(
|
210
207
|
(acc, locale) => {
|
@@ -228,6 +225,17 @@ const createServiceUtils = ({ strapi: strapi2 }) => {
|
|
228
225
|
const meta = await documentMetadataService.getMetadata(contentTypeUid, document);
|
229
226
|
return documentMetadataService.getStatus(document, meta.availableStatus);
|
230
227
|
};
|
228
|
+
const getComponentFields = (componentUID) => {
|
229
|
+
return Object.entries(strapi2.getModel(componentUID).attributes).reduce(
|
230
|
+
(fieldsAcc, [key, attribute]) => {
|
231
|
+
if (!["relation", "media", "component", "dynamiczone"].includes(attribute.type)) {
|
232
|
+
fieldsAcc.push(key);
|
233
|
+
}
|
234
|
+
return fieldsAcc;
|
235
|
+
},
|
236
|
+
[]
|
237
|
+
);
|
238
|
+
};
|
231
239
|
const getDeepPopulate2 = (uid2, useDatabaseSyntax = false) => {
|
232
240
|
const model = strapi2.getModel(uid2);
|
233
241
|
const attributes = Object.entries(model.attributes);
|
@@ -251,13 +259,19 @@ const createServiceUtils = ({ strapi: strapi2 }) => {
|
|
251
259
|
}
|
252
260
|
case "component": {
|
253
261
|
const populate = getDeepPopulate2(attribute.component);
|
254
|
-
acc[attributeName] = {
|
262
|
+
acc[attributeName] = {
|
263
|
+
populate,
|
264
|
+
[fieldSelector]: getComponentFields(attribute.component)
|
265
|
+
};
|
255
266
|
break;
|
256
267
|
}
|
257
268
|
case "dynamiczone": {
|
258
269
|
const populatedComponents = (attribute.components || []).reduce(
|
259
270
|
(acc2, componentUID) => {
|
260
|
-
acc2[componentUID] = {
|
271
|
+
acc2[componentUID] = {
|
272
|
+
populate: getDeepPopulate2(componentUID),
|
273
|
+
[fieldSelector]: getComponentFields(componentUID)
|
274
|
+
};
|
261
275
|
return acc2;
|
262
276
|
},
|
263
277
|
{}
|
@@ -370,7 +384,7 @@ const createHistoryService = ({ strapi: strapi2 }) => {
|
|
370
384
|
const attributeValue = entry.data[attributeKey];
|
371
385
|
const attributeValues = Array.isArray(attributeValue) ? attributeValue : [attributeValue];
|
372
386
|
if (attributeSchema.type === "media") {
|
373
|
-
const permissionChecker2 = getService$
|
387
|
+
const permissionChecker2 = getService$2("permission-checker").create({
|
374
388
|
userAbility: params.state.userAbility,
|
375
389
|
model: "plugin::upload.file"
|
376
390
|
});
|
@@ -411,7 +425,7 @@ const createHistoryService = ({ strapi: strapi2 }) => {
|
|
411
425
|
[attributeKey]: adminUsers
|
412
426
|
};
|
413
427
|
}
|
414
|
-
const permissionChecker2 = getService$
|
428
|
+
const permissionChecker2 = getService$2("permission-checker").create({
|
415
429
|
userAbility: params.state.userAbility,
|
416
430
|
model: attributeSchema.target
|
417
431
|
});
|
@@ -587,7 +601,7 @@ const createLifecyclesService = ({ strapi: strapi2 }) => {
|
|
587
601
|
onCommit(async () => {
|
588
602
|
for (const entry of localeEntries) {
|
589
603
|
const status = await serviceUtils.getVersionStatus(uid2, entry);
|
590
|
-
await getService(strapi2, "history").createVersion({
|
604
|
+
await getService$1(strapi2, "history").createVersion({
|
591
605
|
contentType: uid2,
|
592
606
|
data: fp.omit(FIELDS_TO_IGNORE, entry),
|
593
607
|
relatedDocumentId: documentId,
|
@@ -600,15 +614,19 @@ const createLifecyclesService = ({ strapi: strapi2 }) => {
|
|
600
614
|
});
|
601
615
|
return result;
|
602
616
|
});
|
603
|
-
state.deleteExpiredJob = nodeSchedule.scheduleJob("0 0 * * *", () => {
|
617
|
+
state.deleteExpiredJob = nodeSchedule.scheduleJob("historyDaily", "0 0 * * *", () => {
|
604
618
|
const retentionDaysInMilliseconds = serviceUtils.getRetentionDays() * 24 * 60 * 60 * 1e3;
|
605
619
|
const expirationDate = new Date(Date.now() - retentionDaysInMilliseconds);
|
606
620
|
strapi2.db.query(HISTORY_VERSION_UID).deleteMany({
|
607
621
|
where: {
|
608
622
|
created_at: {
|
609
|
-
$lt: expirationDate
|
623
|
+
$lt: expirationDate
|
610
624
|
}
|
611
625
|
}
|
626
|
+
}).catch((error) => {
|
627
|
+
if (error instanceof Error) {
|
628
|
+
strapi2.log.error("Error deleting expired history versions", error.message);
|
629
|
+
}
|
612
630
|
});
|
613
631
|
});
|
614
632
|
state.isInitialized = true;
|
@@ -702,10 +720,10 @@ const getFeature$1 = () => {
|
|
702
720
|
strapi2.get("models").add(historyVersion);
|
703
721
|
},
|
704
722
|
bootstrap({ strapi: strapi2 }) {
|
705
|
-
getService(strapi2, "lifecycles").bootstrap();
|
723
|
+
getService$1(strapi2, "lifecycles").bootstrap();
|
706
724
|
},
|
707
725
|
destroy({ strapi: strapi2 }) {
|
708
|
-
getService(strapi2, "lifecycles").destroy();
|
726
|
+
getService$1(strapi2, "lifecycles").destroy();
|
709
727
|
},
|
710
728
|
controllers: controllers$2,
|
711
729
|
services: services$2,
|
@@ -719,14 +737,6 @@ const getFeature$1 = () => {
|
|
719
737
|
};
|
720
738
|
};
|
721
739
|
const history = getFeature$1();
|
722
|
-
const register = async ({ strapi: strapi2 }) => {
|
723
|
-
await history.register?.({ strapi: strapi2 });
|
724
|
-
};
|
725
|
-
const ALLOWED_WEBHOOK_EVENTS = {
|
726
|
-
ENTRY_PUBLISH: "entry.publish",
|
727
|
-
ENTRY_UNPUBLISH: "entry.unpublish"
|
728
|
-
};
|
729
|
-
const FEATURE_ID = "preview";
|
730
740
|
const info = { pluginName: "content-manager", type: "admin" };
|
731
741
|
const previewRouter = {
|
732
742
|
type: "admin",
|
@@ -735,7 +745,7 @@ const previewRouter = {
|
|
735
745
|
method: "GET",
|
736
746
|
info,
|
737
747
|
path: "/preview/url/:contentType",
|
738
|
-
handler: "preview.
|
748
|
+
handler: "preview.getPreviewUrl",
|
739
749
|
config: {
|
740
750
|
policies: ["admin::isAuthenticatedAdmin"]
|
741
751
|
}
|
@@ -745,12 +755,56 @@ const previewRouter = {
|
|
745
755
|
const routes$1 = {
|
746
756
|
preview: previewRouter
|
747
757
|
};
|
758
|
+
function getService(strapi2, name) {
|
759
|
+
return strapi2.service(`plugin::content-manager.${name}`);
|
760
|
+
}
|
761
|
+
const getPreviewUrlSchema = yup__namespace.object().shape({
|
762
|
+
// Will be undefined for single types
|
763
|
+
documentId: yup__namespace.string(),
|
764
|
+
locale: yup__namespace.string().nullable(),
|
765
|
+
status: yup__namespace.string()
|
766
|
+
}).required();
|
767
|
+
const validatePreviewUrl = async (strapi2, uid2, params) => {
|
768
|
+
await strapiUtils.validateYupSchema(getPreviewUrlSchema)(params);
|
769
|
+
const newParams = fp.pick(["documentId", "locale", "status"], params);
|
770
|
+
const model = strapi2.getModel(uid2);
|
771
|
+
if (!model || model.modelType !== "contentType") {
|
772
|
+
throw new strapiUtils.errors.ValidationError("Invalid content type");
|
773
|
+
}
|
774
|
+
const isSingleType = model?.kind === "singleType";
|
775
|
+
if (!isSingleType && !params.documentId) {
|
776
|
+
throw new strapiUtils.errors.ValidationError("documentId is required for Collection Types");
|
777
|
+
}
|
778
|
+
if (isSingleType) {
|
779
|
+
const doc = await strapi2.documents(uid2).findFirst();
|
780
|
+
if (!doc) {
|
781
|
+
throw new strapiUtils.errors.NotFoundError("Document not found");
|
782
|
+
}
|
783
|
+
newParams.documentId = doc?.documentId;
|
784
|
+
}
|
785
|
+
if (!newParams.status) {
|
786
|
+
const isDPEnabled = model?.options?.draftAndPublish;
|
787
|
+
newParams.status = isDPEnabled ? "draft" : "published";
|
788
|
+
}
|
789
|
+
return newParams;
|
790
|
+
};
|
748
791
|
const createPreviewController = () => {
|
749
792
|
return {
|
750
|
-
|
751
|
-
|
793
|
+
/**
|
794
|
+
* Transforms an entry into a preview URL, so that it can be previewed
|
795
|
+
* in the Content Manager.
|
796
|
+
*/
|
797
|
+
async getPreviewUrl(ctx) {
|
798
|
+
const uid2 = ctx.params.contentType;
|
799
|
+
const query = ctx.request.query;
|
800
|
+
const params = await validatePreviewUrl(strapi, uid2, query);
|
801
|
+
const previewService = getService(strapi, "preview");
|
802
|
+
const url = await previewService.getPreviewUrl(uid2, params);
|
803
|
+
if (!url) {
|
804
|
+
ctx.status = 204;
|
805
|
+
}
|
752
806
|
return {
|
753
|
-
data: { url
|
807
|
+
data: { url }
|
754
808
|
};
|
755
809
|
}
|
756
810
|
};
|
@@ -762,19 +816,111 @@ const controllers$1 = {
|
|
762
816
|
* passing a controller factory as the value, instead of a controller object directly
|
763
817
|
*/
|
764
818
|
};
|
765
|
-
const createPreviewService = () => {
|
819
|
+
const createPreviewService = ({ strapi: strapi2 }) => {
|
820
|
+
const config = getService(strapi2, "preview-config");
|
821
|
+
return {
|
822
|
+
async getPreviewUrl(uid2, params) {
|
823
|
+
const handler = config.getPreviewHandler();
|
824
|
+
try {
|
825
|
+
return handler(uid2, params);
|
826
|
+
} catch (error) {
|
827
|
+
strapi2.log.error(`Failed to get preview URL: ${error}`);
|
828
|
+
throw new strapiUtils.errors.ApplicationError("Failed to get preview URL");
|
829
|
+
}
|
830
|
+
return;
|
831
|
+
}
|
832
|
+
};
|
833
|
+
};
|
834
|
+
const extendMiddlewareConfiguration = (middleware = { name: "", config: {} }) => {
|
835
|
+
const middlewares = strapi.config.get("middlewares");
|
836
|
+
const configuredMiddlewares = middlewares.map((currentMiddleware) => {
|
837
|
+
if (currentMiddleware === middleware.name) {
|
838
|
+
return middleware;
|
839
|
+
}
|
840
|
+
if (currentMiddleware.name === middleware.name) {
|
841
|
+
return fp.mergeWith(
|
842
|
+
(objValue, srcValue) => {
|
843
|
+
if (Array.isArray(objValue)) {
|
844
|
+
return objValue.concat(srcValue);
|
845
|
+
}
|
846
|
+
return void 0;
|
847
|
+
},
|
848
|
+
currentMiddleware,
|
849
|
+
middleware
|
850
|
+
);
|
851
|
+
}
|
852
|
+
return currentMiddleware;
|
853
|
+
});
|
854
|
+
strapi.config.set("middlewares", configuredMiddlewares);
|
855
|
+
};
|
856
|
+
const createPreviewConfigService = ({ strapi: strapi2 }) => {
|
857
|
+
return {
|
858
|
+
register() {
|
859
|
+
if (!this.isEnabled()) {
|
860
|
+
return;
|
861
|
+
}
|
862
|
+
const config = strapi2.config.get("admin.preview");
|
863
|
+
if (config.config?.allowedOrigins) {
|
864
|
+
extendMiddlewareConfiguration({
|
865
|
+
name: "strapi::security",
|
866
|
+
config: {
|
867
|
+
contentSecurityPolicy: {
|
868
|
+
directives: {
|
869
|
+
"frame-src": config.config.allowedOrigins
|
870
|
+
}
|
871
|
+
}
|
872
|
+
}
|
873
|
+
});
|
874
|
+
}
|
875
|
+
},
|
876
|
+
isEnabled() {
|
877
|
+
const config = strapi2.config.get("admin.preview");
|
878
|
+
if (!config) {
|
879
|
+
return false;
|
880
|
+
}
|
881
|
+
return config?.enabled ?? true;
|
882
|
+
},
|
883
|
+
/**
|
884
|
+
* Validate if the configuration is valid
|
885
|
+
*/
|
886
|
+
validate() {
|
887
|
+
if (!this.isEnabled()) {
|
888
|
+
return;
|
889
|
+
}
|
890
|
+
const handler = this.getPreviewHandler();
|
891
|
+
if (typeof handler !== "function") {
|
892
|
+
throw new strapiUtils.errors.ValidationError(
|
893
|
+
"Preview configuration is invalid. Handler must be a function"
|
894
|
+
);
|
895
|
+
}
|
896
|
+
},
|
897
|
+
/**
|
898
|
+
* Utility to get the preview handler from the configuration
|
899
|
+
*/
|
900
|
+
getPreviewHandler() {
|
901
|
+
const config = strapi2.config.get("admin.preview");
|
902
|
+
const emptyHandler = () => {
|
903
|
+
return void 0;
|
904
|
+
};
|
905
|
+
if (!this.isEnabled()) {
|
906
|
+
return emptyHandler;
|
907
|
+
}
|
908
|
+
return config?.config?.handler || emptyHandler;
|
909
|
+
}
|
910
|
+
};
|
766
911
|
};
|
767
912
|
const services$1 = {
|
768
|
-
preview: createPreviewService
|
913
|
+
preview: createPreviewService,
|
914
|
+
"preview-config": createPreviewConfigService
|
769
915
|
};
|
770
916
|
const getFeature = () => {
|
771
|
-
if (!strapi.features.future.isEnabled(FEATURE_ID)) {
|
772
|
-
return {};
|
773
|
-
}
|
774
917
|
return {
|
918
|
+
register() {
|
919
|
+
const config = getService(strapi, "preview-config");
|
920
|
+
config.validate();
|
921
|
+
config.register();
|
922
|
+
},
|
775
923
|
bootstrap() {
|
776
|
-
console.log("Bootstrapping preview server");
|
777
|
-
strapi.config.get("admin.preview");
|
778
924
|
},
|
779
925
|
routes: routes$1,
|
780
926
|
controllers: controllers$1,
|
@@ -782,14 +928,22 @@ const getFeature = () => {
|
|
782
928
|
};
|
783
929
|
};
|
784
930
|
const preview = getFeature();
|
931
|
+
const register = async ({ strapi: strapi2 }) => {
|
932
|
+
await history.register?.({ strapi: strapi2 });
|
933
|
+
await preview.register?.({ strapi: strapi2 });
|
934
|
+
};
|
935
|
+
const ALLOWED_WEBHOOK_EVENTS = {
|
936
|
+
ENTRY_PUBLISH: "entry.publish",
|
937
|
+
ENTRY_UNPUBLISH: "entry.unpublish"
|
938
|
+
};
|
785
939
|
const bootstrap = async () => {
|
786
940
|
Object.entries(ALLOWED_WEBHOOK_EVENTS).forEach(([key, value]) => {
|
787
941
|
strapi.get("webhookStore").addAllowedEvent(key, value);
|
788
942
|
});
|
789
|
-
getService$
|
790
|
-
await getService$
|
791
|
-
await getService$
|
792
|
-
await getService$
|
943
|
+
getService$2("field-sizes").setCustomFieldInputSizes();
|
944
|
+
await getService$2("components").syncConfigurations();
|
945
|
+
await getService$2("content-types").syncConfigurations();
|
946
|
+
await getService$2("permission").registerPermissions();
|
793
947
|
await history.bootstrap?.({ strapi });
|
794
948
|
await preview.bootstrap?.({ strapi });
|
795
949
|
};
|
@@ -1345,8 +1499,7 @@ const isSortable = (schema, name) => {
|
|
1345
1499
|
if (!___default.default.has(schema.attributes, name)) {
|
1346
1500
|
return false;
|
1347
1501
|
}
|
1348
|
-
if (schema.modelType === "component" && name === "id")
|
1349
|
-
return false;
|
1502
|
+
if (schema.modelType === "component" && name === "id") return false;
|
1350
1503
|
const attribute = schema.attributes[name];
|
1351
1504
|
if (NON_SORTABLES.includes(attribute.type)) {
|
1352
1505
|
return false;
|
@@ -1491,8 +1644,7 @@ const createDefaultSettings = async (schema) => {
|
|
1491
1644
|
};
|
1492
1645
|
};
|
1493
1646
|
const syncSettings = async (configuration, schema) => {
|
1494
|
-
if (fp.isEmpty(configuration.settings))
|
1495
|
-
return createDefaultSettings(schema);
|
1647
|
+
if (fp.isEmpty(configuration.settings)) return createDefaultSettings(schema);
|
1496
1648
|
const defaultField = getDefaultMainField(schema);
|
1497
1649
|
const { mainField = defaultField, defaultSortBy = defaultField } = configuration.settings || {};
|
1498
1650
|
return {
|
@@ -1539,7 +1691,7 @@ const createMetadasSchema = (schema) => {
|
|
1539
1691
|
if (!value) {
|
1540
1692
|
return strapiUtils.yup.string();
|
1541
1693
|
}
|
1542
|
-
const targetSchema = getService$
|
1694
|
+
const targetSchema = getService$2("content-types").findContentType(
|
1543
1695
|
schema.attributes[key].targetModel
|
1544
1696
|
);
|
1545
1697
|
if (!targetSchema) {
|
@@ -1668,8 +1820,7 @@ const excludeNotCreatableFields = (uid2, permissionChecker2) => (body, path = []
|
|
1668
1820
|
}
|
1669
1821
|
switch (attribute.type) {
|
1670
1822
|
case "relation": {
|
1671
|
-
if (canCreate(attributePath))
|
1672
|
-
return body2;
|
1823
|
+
if (canCreate(attributePath)) return body2;
|
1673
1824
|
return fp.set(attributePath, { set: [] }, body2);
|
1674
1825
|
}
|
1675
1826
|
case "component": {
|
@@ -1679,8 +1830,7 @@ const excludeNotCreatableFields = (uid2, permissionChecker2) => (body, path = []
|
|
1679
1830
|
]);
|
1680
1831
|
}
|
1681
1832
|
default: {
|
1682
|
-
if (canCreate(attributePath))
|
1683
|
-
return body2;
|
1833
|
+
if (canCreate(attributePath)) return body2;
|
1684
1834
|
return fp.set(attributePath, null, body2);
|
1685
1835
|
}
|
1686
1836
|
}
|
@@ -1708,7 +1858,7 @@ const getDocumentLocaleAndStatus = async (request, model, opts = { allowMultiple
|
|
1708
1858
|
}
|
1709
1859
|
};
|
1710
1860
|
const formatDocumentWithMetadata = async (permissionChecker2, uid2, document, opts = {}) => {
|
1711
|
-
const documentMetadata2 = getService$
|
1861
|
+
const documentMetadata2 = getService$2("document-metadata");
|
1712
1862
|
const serviceOutput = await documentMetadata2.formatDocumentWithMetadata(uid2, document, opts);
|
1713
1863
|
let {
|
1714
1864
|
meta: { availableLocales, availableStatus }
|
@@ -1734,8 +1884,8 @@ const createDocument = async (ctx, opts) => {
|
|
1734
1884
|
const { userAbility, user } = ctx.state;
|
1735
1885
|
const { model } = ctx.params;
|
1736
1886
|
const { body } = ctx.request;
|
1737
|
-
const documentManager2 = getService$
|
1738
|
-
const permissionChecker2 = getService$
|
1887
|
+
const documentManager2 = getService$2("document-manager");
|
1888
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
1739
1889
|
if (permissionChecker2.cannot.create()) {
|
1740
1890
|
throw new strapiUtils.errors.ForbiddenError();
|
1741
1891
|
}
|
@@ -1755,13 +1905,13 @@ const updateDocument = async (ctx, opts) => {
|
|
1755
1905
|
const { userAbility, user } = ctx.state;
|
1756
1906
|
const { id, model } = ctx.params;
|
1757
1907
|
const { body } = ctx.request;
|
1758
|
-
const documentManager2 = getService$
|
1759
|
-
const permissionChecker2 = getService$
|
1908
|
+
const documentManager2 = getService$2("document-manager");
|
1909
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
1760
1910
|
if (permissionChecker2.cannot.update()) {
|
1761
1911
|
throw new strapiUtils.errors.ForbiddenError();
|
1762
1912
|
}
|
1763
1913
|
const permissionQuery = await permissionChecker2.sanitizedQuery.update(ctx.query);
|
1764
|
-
const populate = await getService$
|
1914
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
|
1765
1915
|
const { locale } = await getDocumentLocaleAndStatus(body, model);
|
1766
1916
|
const [documentVersion, documentExists] = await Promise.all([
|
1767
1917
|
documentManager2.findOne(id, model, { populate, locale, status: "draft" }),
|
@@ -1792,14 +1942,14 @@ const collectionTypes = {
|
|
1792
1942
|
const { userAbility } = ctx.state;
|
1793
1943
|
const { model } = ctx.params;
|
1794
1944
|
const { query } = ctx.request;
|
1795
|
-
const documentMetadata2 = getService$
|
1796
|
-
const documentManager2 = getService$
|
1797
|
-
const permissionChecker2 = getService$
|
1945
|
+
const documentMetadata2 = getService$2("document-metadata");
|
1946
|
+
const documentManager2 = getService$2("document-manager");
|
1947
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
1798
1948
|
if (permissionChecker2.cannot.read()) {
|
1799
1949
|
return ctx.forbidden();
|
1800
1950
|
}
|
1801
1951
|
const permissionQuery = await permissionChecker2.sanitizedQuery.read(query);
|
1802
|
-
const populate = await getService$
|
1952
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(1).countRelations({ toOne: false, toMany: true }).build();
|
1803
1953
|
const { locale, status } = await getDocumentLocaleAndStatus(query, model);
|
1804
1954
|
const { results: documents, pagination } = await documentManager2.findPage(
|
1805
1955
|
{ ...permissionQuery, populate, locale, status },
|
@@ -1828,13 +1978,13 @@ const collectionTypes = {
|
|
1828
1978
|
async findOne(ctx) {
|
1829
1979
|
const { userAbility } = ctx.state;
|
1830
1980
|
const { model, id } = ctx.params;
|
1831
|
-
const documentManager2 = getService$
|
1832
|
-
const permissionChecker2 = getService$
|
1981
|
+
const documentManager2 = getService$2("document-manager");
|
1982
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
1833
1983
|
if (permissionChecker2.cannot.read()) {
|
1834
1984
|
return ctx.forbidden();
|
1835
1985
|
}
|
1836
1986
|
const permissionQuery = await permissionChecker2.sanitizedQuery.read(ctx.query);
|
1837
|
-
const populate = await getService$
|
1987
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(Infinity).countRelations().build();
|
1838
1988
|
const { locale, status } = await getDocumentLocaleAndStatus(ctx.query, model);
|
1839
1989
|
const version = await documentManager2.findOne(id, model, {
|
1840
1990
|
populate,
|
@@ -1865,7 +2015,7 @@ const collectionTypes = {
|
|
1865
2015
|
async create(ctx) {
|
1866
2016
|
const { userAbility } = ctx.state;
|
1867
2017
|
const { model } = ctx.params;
|
1868
|
-
const permissionChecker2 = getService$
|
2018
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
1869
2019
|
const [totalEntries, document] = await Promise.all([
|
1870
2020
|
strapi.db.query(model).count(),
|
1871
2021
|
createDocument(ctx)
|
@@ -1886,7 +2036,7 @@ const collectionTypes = {
|
|
1886
2036
|
async update(ctx) {
|
1887
2037
|
const { userAbility } = ctx.state;
|
1888
2038
|
const { model } = ctx.params;
|
1889
|
-
const permissionChecker2 = getService$
|
2039
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
1890
2040
|
const updatedVersion = await updateDocument(ctx);
|
1891
2041
|
const sanitizedVersion = await permissionChecker2.sanitizeOutput(updatedVersion);
|
1892
2042
|
ctx.body = await formatDocumentWithMetadata(permissionChecker2, model, sanitizedVersion);
|
@@ -1895,13 +2045,13 @@ const collectionTypes = {
|
|
1895
2045
|
const { userAbility, user } = ctx.state;
|
1896
2046
|
const { model, sourceId: id } = ctx.params;
|
1897
2047
|
const { body } = ctx.request;
|
1898
|
-
const documentManager2 = getService$
|
1899
|
-
const permissionChecker2 = getService$
|
2048
|
+
const documentManager2 = getService$2("document-manager");
|
2049
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
1900
2050
|
if (permissionChecker2.cannot.create()) {
|
1901
2051
|
return ctx.forbidden();
|
1902
2052
|
}
|
1903
2053
|
const permissionQuery = await permissionChecker2.sanitizedQuery.create(ctx.query);
|
1904
|
-
const populate = await getService$
|
2054
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
|
1905
2055
|
const { locale } = await getDocumentLocaleAndStatus(body, model);
|
1906
2056
|
const document = await documentManager2.findOne(id, model, {
|
1907
2057
|
populate,
|
@@ -1940,13 +2090,13 @@ const collectionTypes = {
|
|
1940
2090
|
async delete(ctx) {
|
1941
2091
|
const { userAbility } = ctx.state;
|
1942
2092
|
const { id, model } = ctx.params;
|
1943
|
-
const documentManager2 = getService$
|
1944
|
-
const permissionChecker2 = getService$
|
2093
|
+
const documentManager2 = getService$2("document-manager");
|
2094
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
1945
2095
|
if (permissionChecker2.cannot.delete()) {
|
1946
2096
|
return ctx.forbidden();
|
1947
2097
|
}
|
1948
2098
|
const permissionQuery = await permissionChecker2.sanitizedQuery.delete(ctx.query);
|
1949
|
-
const populate = await getService$
|
2099
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
|
1950
2100
|
const { locale } = await getDocumentLocaleAndStatus(ctx.query, model);
|
1951
2101
|
const documentLocales = await documentManager2.findLocales(id, model, { populate, locale });
|
1952
2102
|
if (documentLocales.length === 0) {
|
@@ -1968,14 +2118,14 @@ const collectionTypes = {
|
|
1968
2118
|
const { userAbility } = ctx.state;
|
1969
2119
|
const { id, model } = ctx.params;
|
1970
2120
|
const { body } = ctx.request;
|
1971
|
-
const documentManager2 = getService$
|
1972
|
-
const permissionChecker2 = getService$
|
2121
|
+
const documentManager2 = getService$2("document-manager");
|
2122
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
1973
2123
|
if (permissionChecker2.cannot.publish()) {
|
1974
2124
|
return ctx.forbidden();
|
1975
2125
|
}
|
1976
2126
|
const publishedDocument = await strapi.db.transaction(async () => {
|
1977
2127
|
const permissionQuery = await permissionChecker2.sanitizedQuery.publish(ctx.query);
|
1978
|
-
const populate = await getService$
|
2128
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(Infinity).countRelations().build();
|
1979
2129
|
let document;
|
1980
2130
|
const { locale } = await getDocumentLocaleAndStatus(body, model);
|
1981
2131
|
const isCreate = fp.isNil(id);
|
@@ -2023,13 +2173,13 @@ const collectionTypes = {
|
|
2023
2173
|
const { body } = ctx.request;
|
2024
2174
|
const { documentIds } = body;
|
2025
2175
|
await validateBulkActionInput(body);
|
2026
|
-
const documentManager2 = getService$
|
2027
|
-
const permissionChecker2 = getService$
|
2176
|
+
const documentManager2 = getService$2("document-manager");
|
2177
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2028
2178
|
if (permissionChecker2.cannot.publish()) {
|
2029
2179
|
return ctx.forbidden();
|
2030
2180
|
}
|
2031
2181
|
const permissionQuery = await permissionChecker2.sanitizedQuery.publish(ctx.query);
|
2032
|
-
const populate = await getService$
|
2182
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(Infinity).countRelations().build();
|
2033
2183
|
const { locale } = await getDocumentLocaleAndStatus(body, model, {
|
2034
2184
|
allowMultipleLocales: true
|
2035
2185
|
});
|
@@ -2054,8 +2204,8 @@ const collectionTypes = {
|
|
2054
2204
|
const { body } = ctx.request;
|
2055
2205
|
const { documentIds } = body;
|
2056
2206
|
await validateBulkActionInput(body);
|
2057
|
-
const documentManager2 = getService$
|
2058
|
-
const permissionChecker2 = getService$
|
2207
|
+
const documentManager2 = getService$2("document-manager");
|
2208
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2059
2209
|
if (permissionChecker2.cannot.unpublish()) {
|
2060
2210
|
return ctx.forbidden();
|
2061
2211
|
}
|
@@ -2084,8 +2234,8 @@ const collectionTypes = {
|
|
2084
2234
|
const {
|
2085
2235
|
body: { discardDraft, ...body }
|
2086
2236
|
} = ctx.request;
|
2087
|
-
const documentManager2 = getService$
|
2088
|
-
const permissionChecker2 = getService$
|
2237
|
+
const documentManager2 = getService$2("document-manager");
|
2238
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2089
2239
|
if (permissionChecker2.cannot.unpublish()) {
|
2090
2240
|
return ctx.forbidden();
|
2091
2241
|
}
|
@@ -2093,7 +2243,7 @@ const collectionTypes = {
|
|
2093
2243
|
return ctx.forbidden();
|
2094
2244
|
}
|
2095
2245
|
const permissionQuery = await permissionChecker2.sanitizedQuery.unpublish(ctx.query);
|
2096
|
-
const populate = await getService$
|
2246
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
|
2097
2247
|
const { locale } = await getDocumentLocaleAndStatus(body, model);
|
2098
2248
|
const document = await documentManager2.findOne(id, model, {
|
2099
2249
|
populate,
|
@@ -2124,13 +2274,13 @@ const collectionTypes = {
|
|
2124
2274
|
const { userAbility } = ctx.state;
|
2125
2275
|
const { id, model } = ctx.params;
|
2126
2276
|
const { body } = ctx.request;
|
2127
|
-
const documentManager2 = getService$
|
2128
|
-
const permissionChecker2 = getService$
|
2277
|
+
const documentManager2 = getService$2("document-manager");
|
2278
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2129
2279
|
if (permissionChecker2.cannot.discard()) {
|
2130
2280
|
return ctx.forbidden();
|
2131
2281
|
}
|
2132
2282
|
const permissionQuery = await permissionChecker2.sanitizedQuery.discard(ctx.query);
|
2133
|
-
const populate = await getService$
|
2283
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
|
2134
2284
|
const { locale } = await getDocumentLocaleAndStatus(body, model);
|
2135
2285
|
const document = await documentManager2.findOne(id, model, {
|
2136
2286
|
populate,
|
@@ -2155,13 +2305,13 @@ const collectionTypes = {
|
|
2155
2305
|
const { query, body } = ctx.request;
|
2156
2306
|
const { documentIds } = body;
|
2157
2307
|
await validateBulkActionInput(body);
|
2158
|
-
const documentManager2 = getService$
|
2159
|
-
const permissionChecker2 = getService$
|
2308
|
+
const documentManager2 = getService$2("document-manager");
|
2309
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2160
2310
|
if (permissionChecker2.cannot.delete()) {
|
2161
2311
|
return ctx.forbidden();
|
2162
2312
|
}
|
2163
2313
|
const permissionQuery = await permissionChecker2.sanitizedQuery.delete(query);
|
2164
|
-
const populate = await getService$
|
2314
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
|
2165
2315
|
const { locale } = await getDocumentLocaleAndStatus(body, model);
|
2166
2316
|
const documentLocales = await documentManager2.findLocales(documentIds, model, {
|
2167
2317
|
populate,
|
@@ -2182,13 +2332,13 @@ const collectionTypes = {
|
|
2182
2332
|
async countDraftRelations(ctx) {
|
2183
2333
|
const { userAbility } = ctx.state;
|
2184
2334
|
const { model, id } = ctx.params;
|
2185
|
-
const documentManager2 = getService$
|
2186
|
-
const permissionChecker2 = getService$
|
2335
|
+
const documentManager2 = getService$2("document-manager");
|
2336
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2187
2337
|
if (permissionChecker2.cannot.read()) {
|
2188
2338
|
return ctx.forbidden();
|
2189
2339
|
}
|
2190
2340
|
const permissionQuery = await permissionChecker2.sanitizedQuery.read(ctx.query);
|
2191
|
-
const populate = await getService$
|
2341
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
|
2192
2342
|
const { locale, status } = await getDocumentLocaleAndStatus(ctx.query, model);
|
2193
2343
|
const entity = await documentManager2.findOne(id, model, { populate, locale, status });
|
2194
2344
|
if (!entity) {
|
@@ -2207,8 +2357,8 @@ const collectionTypes = {
|
|
2207
2357
|
const ids = ctx.request.query.documentIds;
|
2208
2358
|
const locale = ctx.request.query.locale;
|
2209
2359
|
const { model } = ctx.params;
|
2210
|
-
const documentManager2 = getService$
|
2211
|
-
const permissionChecker2 = getService$
|
2360
|
+
const documentManager2 = getService$2("document-manager");
|
2361
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2212
2362
|
if (permissionChecker2.cannot.read()) {
|
2213
2363
|
return ctx.forbidden();
|
2214
2364
|
}
|
@@ -2232,13 +2382,13 @@ const collectionTypes = {
|
|
2232
2382
|
};
|
2233
2383
|
const components$1 = {
|
2234
2384
|
findComponents(ctx) {
|
2235
|
-
const components2 = getService$
|
2236
|
-
const { toDto } = getService$
|
2385
|
+
const components2 = getService$2("components").findAllComponents();
|
2386
|
+
const { toDto } = getService$2("data-mapper");
|
2237
2387
|
ctx.body = { data: components2.map(toDto) };
|
2238
2388
|
},
|
2239
2389
|
async findComponentConfiguration(ctx) {
|
2240
2390
|
const { uid: uid2 } = ctx.params;
|
2241
|
-
const componentService = getService$
|
2391
|
+
const componentService = getService$2("components");
|
2242
2392
|
const component = componentService.findComponent(uid2);
|
2243
2393
|
if (!component) {
|
2244
2394
|
return ctx.notFound("component.notFound");
|
@@ -2255,7 +2405,7 @@ const components$1 = {
|
|
2255
2405
|
async updateComponentConfiguration(ctx) {
|
2256
2406
|
const { uid: uid2 } = ctx.params;
|
2257
2407
|
const { body } = ctx.request;
|
2258
|
-
const componentService = getService$
|
2408
|
+
const componentService = getService$2("components");
|
2259
2409
|
const component = componentService.findComponent(uid2);
|
2260
2410
|
if (!component) {
|
2261
2411
|
return ctx.notFound("component.notFound");
|
@@ -2289,12 +2439,12 @@ const contentTypes = {
|
|
2289
2439
|
} catch (error) {
|
2290
2440
|
return ctx.send({ error }, 400);
|
2291
2441
|
}
|
2292
|
-
const contentTypes2 = getService$
|
2293
|
-
const { toDto } = getService$
|
2442
|
+
const contentTypes2 = getService$2("content-types").findContentTypesByKind(kind);
|
2443
|
+
const { toDto } = getService$2("data-mapper");
|
2294
2444
|
ctx.body = { data: contentTypes2.map(toDto) };
|
2295
2445
|
},
|
2296
2446
|
async findContentTypesSettings(ctx) {
|
2297
|
-
const { findAllContentTypes, findConfiguration } = getService$
|
2447
|
+
const { findAllContentTypes, findConfiguration } = getService$2("content-types");
|
2298
2448
|
const contentTypes2 = await findAllContentTypes();
|
2299
2449
|
const configurations = await Promise.all(
|
2300
2450
|
contentTypes2.map(async (contentType) => {
|
@@ -2308,7 +2458,7 @@ const contentTypes = {
|
|
2308
2458
|
},
|
2309
2459
|
async findContentTypeConfiguration(ctx) {
|
2310
2460
|
const { uid: uid2 } = ctx.params;
|
2311
|
-
const contentTypeService = getService$
|
2461
|
+
const contentTypeService = getService$2("content-types");
|
2312
2462
|
const contentType = await contentTypeService.findContentType(uid2);
|
2313
2463
|
if (!contentType) {
|
2314
2464
|
return ctx.notFound("contentType.notFound");
|
@@ -2330,13 +2480,13 @@ const contentTypes = {
|
|
2330
2480
|
const { userAbility } = ctx.state;
|
2331
2481
|
const { uid: uid2 } = ctx.params;
|
2332
2482
|
const { body } = ctx.request;
|
2333
|
-
const contentTypeService = getService$
|
2334
|
-
const metricsService = getService$
|
2483
|
+
const contentTypeService = getService$2("content-types");
|
2484
|
+
const metricsService = getService$2("metrics");
|
2335
2485
|
const contentType = await contentTypeService.findContentType(uid2);
|
2336
2486
|
if (!contentType) {
|
2337
2487
|
return ctx.notFound("contentType.notFound");
|
2338
2488
|
}
|
2339
|
-
if (!getService$
|
2489
|
+
if (!getService$2("permission").canConfigureContentType({ userAbility, contentType })) {
|
2340
2490
|
return ctx.forbidden();
|
2341
2491
|
}
|
2342
2492
|
let input;
|
@@ -2369,10 +2519,10 @@ const contentTypes = {
|
|
2369
2519
|
};
|
2370
2520
|
const init = {
|
2371
2521
|
getInitData(ctx) {
|
2372
|
-
const { toDto } = getService$
|
2373
|
-
const { findAllComponents } = getService$
|
2374
|
-
const { getAllFieldSizes } = getService$
|
2375
|
-
const { findAllContentTypes } = getService$
|
2522
|
+
const { toDto } = getService$2("data-mapper");
|
2523
|
+
const { findAllComponents } = getService$2("components");
|
2524
|
+
const { getAllFieldSizes } = getService$2("field-sizes");
|
2525
|
+
const { findAllContentTypes } = getService$2("content-types");
|
2376
2526
|
ctx.body = {
|
2377
2527
|
data: {
|
2378
2528
|
fieldSizes: getAllFieldSizes(),
|
@@ -2408,7 +2558,7 @@ const addFiltersClause = (params, filtersClause) => {
|
|
2408
2558
|
params.filters.$and.push(filtersClause);
|
2409
2559
|
};
|
2410
2560
|
const sanitizeMainField = (model, mainField, userAbility) => {
|
2411
|
-
const permissionChecker2 = getService$
|
2561
|
+
const permissionChecker2 = getService$2("permission-checker").create({
|
2412
2562
|
userAbility,
|
2413
2563
|
model: model.uid
|
2414
2564
|
});
|
@@ -2426,7 +2576,7 @@ const addStatusToRelations = async (targetUid, relations2) => {
|
|
2426
2576
|
if (!strapiUtils.contentTypes.hasDraftAndPublish(strapi.getModel(targetUid))) {
|
2427
2577
|
return relations2;
|
2428
2578
|
}
|
2429
|
-
const documentMetadata2 = getService$
|
2579
|
+
const documentMetadata2 = getService$2("document-metadata");
|
2430
2580
|
if (!relations2.length) {
|
2431
2581
|
return relations2;
|
2432
2582
|
}
|
@@ -2473,8 +2623,7 @@ const validateStatus = (sourceUid, status) => {
|
|
2473
2623
|
const sourceModel = strapi.getModel(sourceUid);
|
2474
2624
|
const isDP = strapiUtils.contentTypes.hasDraftAndPublish;
|
2475
2625
|
const isSourceDP = isDP(sourceModel);
|
2476
|
-
if (!isSourceDP)
|
2477
|
-
return { status: void 0 };
|
2626
|
+
if (!isSourceDP) return { status: void 0 };
|
2478
2627
|
switch (status) {
|
2479
2628
|
case "published":
|
2480
2629
|
return { status: "published" };
|
@@ -2504,7 +2653,7 @@ const relations = {
|
|
2504
2653
|
ctx.request?.query?.locale
|
2505
2654
|
);
|
2506
2655
|
const { status } = validateStatus(sourceUid, ctx.request?.query?.status);
|
2507
|
-
const permissionChecker2 = getService$
|
2656
|
+
const permissionChecker2 = getService$2("permission-checker").create({
|
2508
2657
|
userAbility,
|
2509
2658
|
model
|
2510
2659
|
});
|
@@ -2529,7 +2678,7 @@ const relations = {
|
|
2529
2678
|
where.id = id;
|
2530
2679
|
}
|
2531
2680
|
const permissionQuery = await permissionChecker2.sanitizedQuery.read(ctx.query);
|
2532
|
-
const populate = await getService$
|
2681
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
|
2533
2682
|
const currentEntity = await strapi.db.query(model).findOne({
|
2534
2683
|
where,
|
2535
2684
|
populate
|
@@ -2544,7 +2693,7 @@ const relations = {
|
|
2544
2693
|
}
|
2545
2694
|
entryId = currentEntity.id;
|
2546
2695
|
}
|
2547
|
-
const modelConfig = isComponent2 ? await getService$
|
2696
|
+
const modelConfig = isComponent2 ? await getService$2("components").findConfiguration(sourceSchema) : await getService$2("content-types").findConfiguration(sourceSchema);
|
2548
2697
|
const targetSchema = strapi.getModel(targetUid);
|
2549
2698
|
const mainField = fp.flow(
|
2550
2699
|
fp.prop(`metadatas.${targetField}.edit.mainField`),
|
@@ -2598,7 +2747,7 @@ const relations = {
|
|
2598
2747
|
}
|
2599
2748
|
} = await this.extractAndValidateRequestInfo(ctx, id);
|
2600
2749
|
const { idsToOmit, idsToInclude, _q, ...query } = ctx.request.query;
|
2601
|
-
const permissionChecker2 = getService$
|
2750
|
+
const permissionChecker2 = getService$2("permission-checker").create({
|
2602
2751
|
userAbility: ctx.state.userAbility,
|
2603
2752
|
model: targetUid
|
2604
2753
|
});
|
@@ -2677,7 +2826,7 @@ const relations = {
|
|
2677
2826
|
} = await this.extractAndValidateRequestInfo(ctx, id);
|
2678
2827
|
const { uid: sourceUid } = sourceSchema;
|
2679
2828
|
const { uid: targetUid } = targetSchema;
|
2680
|
-
const permissionQuery = await getService$
|
2829
|
+
const permissionQuery = await getService$2("permission-checker").create({ userAbility, model: targetUid }).sanitizedQuery.read({ fields: fieldsToSelect });
|
2681
2830
|
const dbQuery = strapi.db.query(sourceUid);
|
2682
2831
|
const loadRelations = strapiUtils.relations.isAnyToMany(attribute) ? (...args) => dbQuery.loadPages(...args) : (...args) => dbQuery.load(...args).then((res2) => ({ results: res2 ? [res2] : [] }));
|
2683
2832
|
const filters = {};
|
@@ -2718,10 +2867,10 @@ const relations = {
|
|
2718
2867
|
}
|
2719
2868
|
};
|
2720
2869
|
const buildPopulateFromQuery = async (query, model) => {
|
2721
|
-
return getService$
|
2870
|
+
return getService$2("populate-builder")(model).populateFromQuery(query).populateDeep(Infinity).countRelations().build();
|
2722
2871
|
};
|
2723
2872
|
const findDocument = async (query, uid2, opts = {}) => {
|
2724
|
-
const documentManager2 = getService$
|
2873
|
+
const documentManager2 = getService$2("document-manager");
|
2725
2874
|
const populate = await buildPopulateFromQuery(query, uid2);
|
2726
2875
|
return documentManager2.findMany({ ...opts, populate }, uid2).then((documents) => documents[0]);
|
2727
2876
|
};
|
@@ -2729,8 +2878,8 @@ const createOrUpdateDocument = async (ctx, opts) => {
|
|
2729
2878
|
const { user, userAbility } = ctx.state;
|
2730
2879
|
const { model } = ctx.params;
|
2731
2880
|
const { body, query } = ctx.request;
|
2732
|
-
const documentManager2 = getService$
|
2733
|
-
const permissionChecker2 = getService$
|
2881
|
+
const documentManager2 = getService$2("document-manager");
|
2882
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2734
2883
|
if (permissionChecker2.cannot.create() && permissionChecker2.cannot.update()) {
|
2735
2884
|
throw new strapiUtils.errors.ForbiddenError();
|
2736
2885
|
}
|
@@ -2771,7 +2920,7 @@ const singleTypes = {
|
|
2771
2920
|
const { userAbility } = ctx.state;
|
2772
2921
|
const { model } = ctx.params;
|
2773
2922
|
const { query = {} } = ctx.request;
|
2774
|
-
const permissionChecker2 = getService$
|
2923
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2775
2924
|
if (permissionChecker2.cannot.read()) {
|
2776
2925
|
return ctx.forbidden();
|
2777
2926
|
}
|
@@ -2805,7 +2954,7 @@ const singleTypes = {
|
|
2805
2954
|
async createOrUpdate(ctx) {
|
2806
2955
|
const { userAbility } = ctx.state;
|
2807
2956
|
const { model } = ctx.params;
|
2808
|
-
const permissionChecker2 = getService$
|
2957
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2809
2958
|
const document = await createOrUpdateDocument(ctx);
|
2810
2959
|
const sanitizedDocument = await permissionChecker2.sanitizeOutput(document);
|
2811
2960
|
ctx.body = await formatDocumentWithMetadata(permissionChecker2, model, sanitizedDocument);
|
@@ -2814,8 +2963,8 @@ const singleTypes = {
|
|
2814
2963
|
const { userAbility } = ctx.state;
|
2815
2964
|
const { model } = ctx.params;
|
2816
2965
|
const { query = {} } = ctx.request;
|
2817
|
-
const documentManager2 = getService$
|
2818
|
-
const permissionChecker2 = getService$
|
2966
|
+
const documentManager2 = getService$2("document-manager");
|
2967
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2819
2968
|
if (permissionChecker2.cannot.delete()) {
|
2820
2969
|
return ctx.forbidden();
|
2821
2970
|
}
|
@@ -2843,8 +2992,8 @@ const singleTypes = {
|
|
2843
2992
|
const { userAbility } = ctx.state;
|
2844
2993
|
const { model } = ctx.params;
|
2845
2994
|
const { query = {} } = ctx.request;
|
2846
|
-
const documentManager2 = getService$
|
2847
|
-
const permissionChecker2 = getService$
|
2995
|
+
const documentManager2 = getService$2("document-manager");
|
2996
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2848
2997
|
if (permissionChecker2.cannot.publish()) {
|
2849
2998
|
return ctx.forbidden();
|
2850
2999
|
}
|
@@ -2872,8 +3021,8 @@ const singleTypes = {
|
|
2872
3021
|
body: { discardDraft, ...body },
|
2873
3022
|
query = {}
|
2874
3023
|
} = ctx.request;
|
2875
|
-
const documentManager2 = getService$
|
2876
|
-
const permissionChecker2 = getService$
|
3024
|
+
const documentManager2 = getService$2("document-manager");
|
3025
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2877
3026
|
if (permissionChecker2.cannot.unpublish()) {
|
2878
3027
|
return ctx.forbidden();
|
2879
3028
|
}
|
@@ -2907,8 +3056,8 @@ const singleTypes = {
|
|
2907
3056
|
const { userAbility } = ctx.state;
|
2908
3057
|
const { model } = ctx.params;
|
2909
3058
|
const { body, query = {} } = ctx.request;
|
2910
|
-
const documentManager2 = getService$
|
2911
|
-
const permissionChecker2 = getService$
|
3059
|
+
const documentManager2 = getService$2("document-manager");
|
3060
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2912
3061
|
if (permissionChecker2.cannot.discard()) {
|
2913
3062
|
return ctx.forbidden();
|
2914
3063
|
}
|
@@ -2931,8 +3080,8 @@ const singleTypes = {
|
|
2931
3080
|
const { userAbility } = ctx.state;
|
2932
3081
|
const { model } = ctx.params;
|
2933
3082
|
const { query } = ctx.request;
|
2934
|
-
const documentManager2 = getService$
|
2935
|
-
const permissionChecker2 = getService$
|
3083
|
+
const documentManager2 = getService$2("document-manager");
|
3084
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2936
3085
|
const { locale } = await getDocumentLocaleAndStatus(query, model);
|
2937
3086
|
if (permissionChecker2.cannot.read()) {
|
2938
3087
|
return ctx.forbidden();
|
@@ -2956,7 +3105,7 @@ const uid$1 = {
|
|
2956
3105
|
const { query = {} } = ctx.request;
|
2957
3106
|
const { locale } = await getDocumentLocaleAndStatus(query, contentTypeUID);
|
2958
3107
|
await validateUIDField(contentTypeUID, field);
|
2959
|
-
const uidService = getService$
|
3108
|
+
const uidService = getService$2("uid");
|
2960
3109
|
ctx.body = {
|
2961
3110
|
data: await uidService.generateUIDField({ contentTypeUID, field, data, locale })
|
2962
3111
|
};
|
@@ -2968,7 +3117,7 @@ const uid$1 = {
|
|
2968
3117
|
const { query = {} } = ctx.request;
|
2969
3118
|
const { locale } = await getDocumentLocaleAndStatus(query, contentTypeUID);
|
2970
3119
|
await validateUIDField(contentTypeUID, field);
|
2971
|
-
const uidService = getService$
|
3120
|
+
const uidService = getService$2("uid");
|
2972
3121
|
const isAvailable = await uidService.checkUIDAvailability({
|
2973
3122
|
contentTypeUID,
|
2974
3123
|
field,
|
@@ -3119,18 +3268,15 @@ async function syncMetadatas(configuration, schema) {
|
|
3119
3268
|
___default.default.set(updatedMeta, ["list", "searchable"], false);
|
3120
3269
|
___default.default.set(acc, [key], updatedMeta);
|
3121
3270
|
}
|
3122
|
-
if (!___default.default.has(edit, "mainField"))
|
3123
|
-
return acc;
|
3271
|
+
if (!___default.default.has(edit, "mainField")) return acc;
|
3124
3272
|
if (!isRelation$1(attr)) {
|
3125
3273
|
___default.default.set(updatedMeta, "edit", ___default.default.omit(edit, ["mainField"]));
|
3126
3274
|
___default.default.set(acc, [key], updatedMeta);
|
3127
3275
|
return acc;
|
3128
3276
|
}
|
3129
|
-
if (edit.mainField === "id")
|
3130
|
-
return acc;
|
3277
|
+
if (edit.mainField === "id") return acc;
|
3131
3278
|
const targetSchema = getTargetSchema(attr.targetModel);
|
3132
|
-
if (!targetSchema)
|
3133
|
-
return acc;
|
3279
|
+
if (!targetSchema) return acc;
|
3134
3280
|
if (!isSortable(targetSchema, edit.mainField) && !isListable(targetSchema, edit.mainField)) {
|
3135
3281
|
___default.default.set(updatedMeta, ["edit", "mainField"], getDefaultMainField(targetSchema));
|
3136
3282
|
___default.default.set(acc, [key], updatedMeta);
|
@@ -3141,12 +3287,12 @@ async function syncMetadatas(configuration, schema) {
|
|
3141
3287
|
return ___default.default.assign(metasWithDefaults, updatedMetas);
|
3142
3288
|
}
|
3143
3289
|
const getTargetSchema = (targetModel) => {
|
3144
|
-
return getService$
|
3290
|
+
return getService$2("content-types").findContentType(targetModel);
|
3145
3291
|
};
|
3146
3292
|
const DEFAULT_LIST_LENGTH = 4;
|
3147
3293
|
const MAX_ROW_SIZE = 12;
|
3148
3294
|
const isAllowedFieldSize = (type, size) => {
|
3149
|
-
const { getFieldSize } = getService$
|
3295
|
+
const { getFieldSize } = getService$2("field-sizes");
|
3150
3296
|
const fieldSize = getFieldSize(type);
|
3151
3297
|
if (!fieldSize.isResizable && size !== fieldSize.default) {
|
3152
3298
|
return false;
|
@@ -3154,7 +3300,7 @@ const isAllowedFieldSize = (type, size) => {
|
|
3154
3300
|
return size <= MAX_ROW_SIZE;
|
3155
3301
|
};
|
3156
3302
|
const getDefaultFieldSize = (attribute) => {
|
3157
|
-
const { hasFieldSize, getFieldSize } = getService$
|
3303
|
+
const { hasFieldSize, getFieldSize } = getService$2("field-sizes");
|
3158
3304
|
return getFieldSize(hasFieldSize(attribute.customField) ? attribute.customField : attribute.type).default;
|
3159
3305
|
};
|
3160
3306
|
async function createDefaultLayouts(schema) {
|
@@ -3175,8 +3321,7 @@ function createDefaultEditLayout(schema) {
|
|
3175
3321
|
return appendToEditLayout([], keys2, schema);
|
3176
3322
|
}
|
3177
3323
|
function syncLayouts(configuration, schema) {
|
3178
|
-
if (___default.default.isEmpty(configuration.layouts))
|
3179
|
-
return createDefaultLayouts(schema);
|
3324
|
+
if (___default.default.isEmpty(configuration.layouts)) return createDefaultLayouts(schema);
|
3180
3325
|
const { list = [], editRelations = [], edit = [] } = configuration.layouts || {};
|
3181
3326
|
let cleanList = list.filter((attr) => isListable(schema, attr));
|
3182
3327
|
const cleanEditRelations = editRelations.filter(
|
@@ -3187,9 +3332,8 @@ function syncLayouts(configuration, schema) {
|
|
3187
3332
|
for (const row of edit) {
|
3188
3333
|
const newRow = [];
|
3189
3334
|
for (const el of row) {
|
3190
|
-
if (!hasEditableAttribute(schema, el.name))
|
3191
|
-
|
3192
|
-
const { hasFieldSize } = getService$1("field-sizes");
|
3335
|
+
if (!hasEditableAttribute(schema, el.name)) continue;
|
3336
|
+
const { hasFieldSize } = getService$2("field-sizes");
|
3193
3337
|
const fieldType = hasFieldSize(schema.attributes[el.name].customField) ? schema.attributes[el.name].customField : schema.attributes[el.name].type;
|
3194
3338
|
if (!isAllowedFieldSize(fieldType, el.size)) {
|
3195
3339
|
elementsToReAppend.push(el.name);
|
@@ -3219,8 +3363,7 @@ function syncLayouts(configuration, schema) {
|
|
3219
3363
|
};
|
3220
3364
|
}
|
3221
3365
|
const appendToEditLayout = (layout = [], keysToAppend, schema) => {
|
3222
|
-
if (keysToAppend.length === 0)
|
3223
|
-
return layout;
|
3366
|
+
if (keysToAppend.length === 0) return layout;
|
3224
3367
|
let currentRowIndex = Math.max(layout.length - 1, 0);
|
3225
3368
|
if (!layout[currentRowIndex]) {
|
3226
3369
|
layout[currentRowIndex] = [];
|
@@ -3329,17 +3472,17 @@ const configurationService$1 = createConfigurationService({
|
|
3329
3472
|
isComponent: true,
|
3330
3473
|
prefix: STORE_KEY_PREFIX,
|
3331
3474
|
getModels() {
|
3332
|
-
const { toContentManagerModel } = getService$
|
3475
|
+
const { toContentManagerModel } = getService$2("data-mapper");
|
3333
3476
|
return fp.mapValues(toContentManagerModel, strapi.components);
|
3334
3477
|
}
|
3335
3478
|
});
|
3336
3479
|
const components = ({ strapi: strapi2 }) => ({
|
3337
3480
|
findAllComponents() {
|
3338
|
-
const { toContentManagerModel } = getService$
|
3481
|
+
const { toContentManagerModel } = getService$2("data-mapper");
|
3339
3482
|
return Object.values(strapi2.components).map(toContentManagerModel);
|
3340
3483
|
},
|
3341
3484
|
findComponent(uid2) {
|
3342
|
-
const { toContentManagerModel } = getService$
|
3485
|
+
const { toContentManagerModel } = getService$2("data-mapper");
|
3343
3486
|
const component = strapi2.components[uid2];
|
3344
3487
|
return fp.isNil(component) ? component : toContentManagerModel(component);
|
3345
3488
|
},
|
@@ -3390,17 +3533,17 @@ const configurationService = createConfigurationService({
|
|
3390
3533
|
storeUtils,
|
3391
3534
|
prefix: "content_types",
|
3392
3535
|
getModels() {
|
3393
|
-
const { toContentManagerModel } = getService$
|
3536
|
+
const { toContentManagerModel } = getService$2("data-mapper");
|
3394
3537
|
return fp.mapValues(toContentManagerModel, strapi.contentTypes);
|
3395
3538
|
}
|
3396
3539
|
});
|
3397
3540
|
const service = ({ strapi: strapi2 }) => ({
|
3398
3541
|
findAllContentTypes() {
|
3399
|
-
const { toContentManagerModel } = getService$
|
3542
|
+
const { toContentManagerModel } = getService$2("data-mapper");
|
3400
3543
|
return Object.values(strapi2.contentTypes).map(toContentManagerModel);
|
3401
3544
|
},
|
3402
3545
|
findContentType(uid2) {
|
3403
|
-
const { toContentManagerModel } = getService$
|
3546
|
+
const { toContentManagerModel } = getService$2("data-mapper");
|
3404
3547
|
const contentType = strapi2.contentTypes[uid2];
|
3405
3548
|
return fp.isNil(contentType) ? contentType : toContentManagerModel(contentType);
|
3406
3549
|
},
|
@@ -3429,7 +3572,7 @@ const service = ({ strapi: strapi2 }) => ({
|
|
3429
3572
|
return this.findConfiguration(contentType);
|
3430
3573
|
},
|
3431
3574
|
findComponentsConfigurations(contentType) {
|
3432
|
-
return getService$
|
3575
|
+
return getService$2("components").findComponentsConfigurations(contentType);
|
3433
3576
|
},
|
3434
3577
|
syncConfigurations() {
|
3435
3578
|
return configurationService.syncConfigurations();
|
@@ -3701,7 +3844,7 @@ const permission = ({ strapi: strapi2 }) => ({
|
|
3701
3844
|
return userAbility.can(action);
|
3702
3845
|
},
|
3703
3846
|
async registerPermissions() {
|
3704
|
-
const displayedContentTypes = getService$
|
3847
|
+
const displayedContentTypes = getService$2("content-types").findDisplayedContentTypes();
|
3705
3848
|
const contentTypesUids = displayedContentTypes.map(fp.prop("uid"));
|
3706
3849
|
const actions = [
|
3707
3850
|
{
|
@@ -3786,6 +3929,12 @@ function getPopulateForRelation(attribute, model, attributeName, { countMany, co
|
|
3786
3929
|
if (initialPopulate) {
|
3787
3930
|
return initialPopulate;
|
3788
3931
|
}
|
3932
|
+
if (attributeName === "localizations") {
|
3933
|
+
const validationPopulate = getPopulateForValidation(model.uid);
|
3934
|
+
return {
|
3935
|
+
populate: validationPopulate.populate
|
3936
|
+
};
|
3937
|
+
}
|
3789
3938
|
if (!isVisibleAttribute$1(model, attributeName)) {
|
3790
3939
|
return true;
|
3791
3940
|
}
|
@@ -3845,6 +3994,9 @@ const getDeepPopulate = (uid2, {
|
|
3845
3994
|
return {};
|
3846
3995
|
}
|
3847
3996
|
const model = strapi.getModel(uid2);
|
3997
|
+
if (!model) {
|
3998
|
+
return {};
|
3999
|
+
}
|
3848
4000
|
return Object.keys(model.attributes).reduce(
|
3849
4001
|
(populateAcc, attributeName) => fp.merge(
|
3850
4002
|
populateAcc,
|
@@ -3864,40 +4016,46 @@ const getDeepPopulate = (uid2, {
|
|
3864
4016
|
{}
|
3865
4017
|
);
|
3866
4018
|
};
|
3867
|
-
const
|
3868
|
-
|
3869
|
-
|
3870
|
-
countOne = false,
|
3871
|
-
maxLevel = Infinity
|
3872
|
-
} = {}, level = 1) => {
|
3873
|
-
if (level > maxLevel) {
|
4019
|
+
const getPopulateForValidation = (uid2) => {
|
4020
|
+
const model = strapi.getModel(uid2);
|
4021
|
+
if (!model) {
|
3874
4022
|
return {};
|
3875
4023
|
}
|
3876
|
-
const model = strapi.getModel(uid2);
|
3877
4024
|
return Object.entries(model.attributes).reduce((populateAcc, [attributeName, attribute]) => {
|
3878
|
-
if (
|
4025
|
+
if (isScalarAttribute(attribute)) {
|
4026
|
+
if (getDoesAttributeRequireValidation(attribute)) {
|
4027
|
+
populateAcc.fields = populateAcc.fields || [];
|
4028
|
+
populateAcc.fields.push(attributeName);
|
4029
|
+
}
|
3879
4030
|
return populateAcc;
|
3880
4031
|
}
|
3881
|
-
if (
|
3882
|
-
|
3883
|
-
|
3884
|
-
|
4032
|
+
if (isComponent(attribute)) {
|
4033
|
+
const component = attribute.component;
|
4034
|
+
const componentResult = getPopulateForValidation(component);
|
4035
|
+
if (Object.keys(componentResult).length > 0) {
|
4036
|
+
populateAcc.populate = populateAcc.populate || {};
|
4037
|
+
populateAcc.populate[attributeName] = componentResult;
|
4038
|
+
}
|
4039
|
+
return populateAcc;
|
3885
4040
|
}
|
3886
|
-
|
3887
|
-
|
3888
|
-
|
3889
|
-
|
3890
|
-
|
3891
|
-
|
3892
|
-
|
3893
|
-
|
3894
|
-
|
3895
|
-
countOne,
|
3896
|
-
maxLevel
|
4041
|
+
if (isDynamicZone(attribute)) {
|
4042
|
+
const components2 = attribute.components;
|
4043
|
+
const componentsResult = (components2 || []).reduce(
|
4044
|
+
(acc, componentUID) => {
|
4045
|
+
const componentResult = getPopulateForValidation(componentUID);
|
4046
|
+
if (Object.keys(componentResult).length > 0) {
|
4047
|
+
acc[componentUID] = componentResult;
|
4048
|
+
}
|
4049
|
+
return acc;
|
3897
4050
|
},
|
3898
|
-
|
3899
|
-
)
|
3900
|
-
|
4051
|
+
{}
|
4052
|
+
);
|
4053
|
+
if (Object.keys(componentsResult).length > 0) {
|
4054
|
+
populateAcc.populate = populateAcc.populate || {};
|
4055
|
+
populateAcc.populate[attributeName] = { on: componentsResult };
|
4056
|
+
}
|
4057
|
+
}
|
4058
|
+
return populateAcc;
|
3901
4059
|
}, {});
|
3902
4060
|
};
|
3903
4061
|
const getDeepPopulateDraftCount = (uid2) => {
|
@@ -3977,7 +4135,7 @@ const getQueryPopulate = async (uid2, query) => {
|
|
3977
4135
|
return populateQuery;
|
3978
4136
|
};
|
3979
4137
|
const buildDeepPopulate = (uid2) => {
|
3980
|
-
return getService$
|
4138
|
+
return getService$2("populate-builder")(uid2).populateDeep(Infinity).countRelations().build();
|
3981
4139
|
};
|
3982
4140
|
const populateBuilder = (uid2) => {
|
3983
4141
|
let getInitialPopulate = async () => {
|
@@ -4139,7 +4297,6 @@ const AVAILABLE_LOCALES_FIELDS = [
|
|
4139
4297
|
"locale",
|
4140
4298
|
"updatedAt",
|
4141
4299
|
"createdAt",
|
4142
|
-
"status",
|
4143
4300
|
"publishedAt",
|
4144
4301
|
"documentId"
|
4145
4302
|
];
|
@@ -4160,36 +4317,20 @@ const documentMetadata = ({ strapi: strapi2 }) => ({
|
|
4160
4317
|
/**
|
4161
4318
|
* Returns available locales of a document for the current status
|
4162
4319
|
*/
|
4163
|
-
async getAvailableLocales(uid2, version, allVersions
|
4320
|
+
async getAvailableLocales(uid2, version, allVersions) {
|
4164
4321
|
const versionsByLocale = fp.groupBy("locale", allVersions);
|
4165
4322
|
if (version.locale) {
|
4166
4323
|
delete versionsByLocale[version.locale];
|
4167
4324
|
}
|
4168
4325
|
const model = strapi2.getModel(uid2);
|
4169
|
-
const keysToKeep = [...AVAILABLE_LOCALES_FIELDS, ...validatableFields];
|
4170
|
-
const traversalFunction = async (localeVersion) => strapiUtils.traverseEntity(
|
4171
|
-
({ key }, { remove }) => {
|
4172
|
-
if (keysToKeep.includes(key)) {
|
4173
|
-
return;
|
4174
|
-
}
|
4175
|
-
remove(key);
|
4176
|
-
},
|
4177
|
-
{ schema: model, getModel: strapi2.getModel.bind(strapi2) },
|
4178
|
-
// @ts-expect-error fix types DocumentVersion incompatible with Data
|
4179
|
-
localeVersion
|
4180
|
-
);
|
4181
4326
|
const mappingResult = await strapiUtils.async.map(
|
4182
4327
|
Object.values(versionsByLocale),
|
4183
4328
|
async (localeVersions) => {
|
4184
|
-
const mappedLocaleVersions = await strapiUtils.async.map(
|
4185
|
-
localeVersions,
|
4186
|
-
traversalFunction
|
4187
|
-
);
|
4188
4329
|
if (!strapiUtils.contentTypes.hasDraftAndPublish(model)) {
|
4189
|
-
return
|
4330
|
+
return localeVersions[0];
|
4190
4331
|
}
|
4191
|
-
const draftVersion =
|
4192
|
-
const otherVersions =
|
4332
|
+
const draftVersion = localeVersions.find((v) => v.publishedAt === null);
|
4333
|
+
const otherVersions = localeVersions.filter((v) => v.id !== draftVersion?.id);
|
4193
4334
|
if (!draftVersion) {
|
4194
4335
|
return;
|
4195
4336
|
}
|
@@ -4211,8 +4352,7 @@ const documentMetadata = ({ strapi: strapi2 }) => ({
|
|
4211
4352
|
const matchStatus = status === "published" ? v.publishedAt !== null : v.publishedAt === null;
|
4212
4353
|
return matchLocale && matchStatus;
|
4213
4354
|
});
|
4214
|
-
if (!availableStatus)
|
4215
|
-
return availableStatus;
|
4355
|
+
if (!availableStatus) return availableStatus;
|
4216
4356
|
return fp.pick(AVAILABLE_STATUS_FIELDS, availableStatus);
|
4217
4357
|
},
|
4218
4358
|
/**
|
@@ -4222,18 +4362,17 @@ const documentMetadata = ({ strapi: strapi2 }) => ({
|
|
4222
4362
|
* @returns
|
4223
4363
|
*/
|
4224
4364
|
async getManyAvailableStatus(uid2, documents) {
|
4225
|
-
if (!documents.length)
|
4226
|
-
return [];
|
4365
|
+
if (!documents.length) return [];
|
4227
4366
|
const status = documents[0].publishedAt !== null ? "published" : "draft";
|
4228
|
-
const
|
4229
|
-
|
4230
|
-
|
4231
|
-
|
4232
|
-
|
4367
|
+
const locales = documents.map((d) => d.locale).filter(Boolean);
|
4368
|
+
return strapi2.query(uid2).findMany({
|
4369
|
+
where: {
|
4370
|
+
documentId: { $in: documents.map((d) => d.documentId).filter(Boolean) },
|
4371
|
+
// NOTE: find the "opposite" status
|
4372
|
+
publishedAt: { $null: status === "published" },
|
4373
|
+
locale: { $in: locales }
|
4233
4374
|
},
|
4234
|
-
|
4235
|
-
locale,
|
4236
|
-
fields: ["documentId", "locale", "updatedAt", "createdAt", "publishedAt"]
|
4375
|
+
select: ["id", "documentId", "locale", "updatedAt", "createdAt", "publishedAt"]
|
4237
4376
|
});
|
4238
4377
|
},
|
4239
4378
|
getStatus(version, otherDocumentStatuses) {
|
@@ -4250,10 +4389,8 @@ const documentMetadata = ({ strapi: strapi2 }) => ({
|
|
4250
4389
|
} else if (otherVersion) {
|
4251
4390
|
draftVersion = otherVersion;
|
4252
4391
|
}
|
4253
|
-
if (!draftVersion)
|
4254
|
-
|
4255
|
-
if (!publishedVersion)
|
4256
|
-
return CONTENT_MANAGER_STATUS.DRAFT;
|
4392
|
+
if (!draftVersion) return CONTENT_MANAGER_STATUS.PUBLISHED;
|
4393
|
+
if (!publishedVersion) return CONTENT_MANAGER_STATUS.DRAFT;
|
4257
4394
|
const isDraftModified = getIsVersionLatestModification(draftVersion, publishedVersion);
|
4258
4395
|
return isDraftModified ? CONTENT_MANAGER_STATUS.MODIFIED : CONTENT_MANAGER_STATUS.PUBLISHED;
|
4259
4396
|
},
|
@@ -4261,11 +4398,9 @@ const documentMetadata = ({ strapi: strapi2 }) => ({
|
|
4261
4398
|
// We could refactor this so the locales are only loaded when they're
|
4262
4399
|
// needed. e.g. in the bulk locale action modal.
|
4263
4400
|
async getMetadata(uid2, version, { availableLocales = true, availableStatus = true } = {}) {
|
4264
|
-
const populate =
|
4265
|
-
const
|
4266
|
-
where: { documentId: version.documentId },
|
4401
|
+
const { populate = {}, fields = [] } = getPopulateForValidation(uid2);
|
4402
|
+
const params = {
|
4267
4403
|
populate: {
|
4268
|
-
// Populate only fields that require validation for bulk locale actions
|
4269
4404
|
...populate,
|
4270
4405
|
// NOTE: creator fields are selected in this way to avoid exposing sensitive data
|
4271
4406
|
createdBy: {
|
@@ -4274,9 +4409,15 @@ const documentMetadata = ({ strapi: strapi2 }) => ({
|
|
4274
4409
|
updatedBy: {
|
4275
4410
|
select: ["id", "firstname", "lastname", "email"]
|
4276
4411
|
}
|
4412
|
+
},
|
4413
|
+
fields: fp.uniq([...AVAILABLE_LOCALES_FIELDS, ...fields]),
|
4414
|
+
filters: {
|
4415
|
+
documentId: version.documentId
|
4277
4416
|
}
|
4278
|
-
}
|
4279
|
-
const
|
4417
|
+
};
|
4418
|
+
const dbParams = strapi2.get("query-params").transform(uid2, params);
|
4419
|
+
const versions = await strapi2.db.query(uid2).findMany(dbParams);
|
4420
|
+
const availableLocalesResult = availableLocales ? await this.getAvailableLocales(uid2, version, versions) : [];
|
4280
4421
|
const availableStatusResult = availableStatus ? this.getAvailableStatus(version, versions) : null;
|
4281
4422
|
return {
|
4282
4423
|
availableLocales: availableLocalesResult,
|
@@ -4303,6 +4444,16 @@ const documentMetadata = ({ strapi: strapi2 }) => ({
|
|
4303
4444
|
opts.availableStatus = false;
|
4304
4445
|
}
|
4305
4446
|
const meta = await this.getMetadata(uid2, document, opts);
|
4447
|
+
if (document.localizations) {
|
4448
|
+
const otherStatus = await this.getManyAvailableStatus(uid2, document.localizations);
|
4449
|
+
document.localizations = document.localizations.map((d) => {
|
4450
|
+
const status = otherStatus.find((s) => s.documentId === d.documentId);
|
4451
|
+
return {
|
4452
|
+
...d,
|
4453
|
+
status: this.getStatus(d, status ? [status] : [])
|
4454
|
+
};
|
4455
|
+
});
|
4456
|
+
}
|
4306
4457
|
return {
|
4307
4458
|
data: {
|
4308
4459
|
...document,
|