@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.mjs
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
import strapiUtils, { validateYupSchema, errors, async, contentTypes as contentTypes$1, yup as yup$1, validateYupSchemaSync, policy, traverse, setCreatorFields, isOperatorOfType, relations as relations$1,
|
2
|
-
import { pick, omit, difference, castArray, intersection, pipe, propOr, isEqual, isEmpty, set, isNil as isNil$1, has, prop, assoc, mapValues, flow, uniq, uniqBy, concat, getOr, propEq, merge, groupBy } from "lodash/fp";
|
1
|
+
import strapiUtils, { validateYupSchema, errors, async, contentTypes as contentTypes$1, yup as yup$1, validateYupSchemaSync, policy, traverse, setCreatorFields, isOperatorOfType, relations as relations$1, pagination } from "@strapi/utils";
|
2
|
+
import { pick, omit, difference, castArray, mergeWith, intersection, pipe, propOr, isEqual, isEmpty, set, isNil as isNil$1, has, prop, assoc, mapValues, flow, uniq, uniqBy, concat, getOr, propEq, merge, groupBy } from "lodash/fp";
|
3
3
|
import "@strapi/types";
|
4
4
|
import * as yup from "yup";
|
5
5
|
import { scheduleJob } from "node-schedule";
|
@@ -7,10 +7,10 @@ import isNil from "lodash/isNil";
|
|
7
7
|
import _, { intersection as intersection$1, difference as difference$1 } from "lodash";
|
8
8
|
import qs from "qs";
|
9
9
|
import slugify from "@sindresorhus/slugify";
|
10
|
-
const getService$
|
10
|
+
const getService$2 = (name) => {
|
11
11
|
return strapi.plugin("content-manager").service(name);
|
12
12
|
};
|
13
|
-
function getService(strapi2, name) {
|
13
|
+
function getService$1(strapi2, name) {
|
14
14
|
return strapi2.service(`plugin::content-manager.${name}`);
|
15
15
|
}
|
16
16
|
const historyRestoreVersionSchema = yup.object().shape({
|
@@ -46,7 +46,7 @@ const createHistoryVersionController = ({ strapi: strapi2 }) => {
|
|
46
46
|
if (!isSingleType && (!contentTypeUid || !ctx.query.documentId)) {
|
47
47
|
throw new errors.ForbiddenError("contentType and documentId are required");
|
48
48
|
}
|
49
|
-
const permissionChecker2 = getService$
|
49
|
+
const permissionChecker2 = getService$2("permission-checker").create({
|
50
50
|
userAbility: ctx.state.userAbility,
|
51
51
|
model: ctx.query.contentType
|
52
52
|
});
|
@@ -54,7 +54,7 @@ const createHistoryVersionController = ({ strapi: strapi2 }) => {
|
|
54
54
|
return ctx.forbidden();
|
55
55
|
}
|
56
56
|
const query = await permissionChecker2.sanitizeQuery(ctx.query);
|
57
|
-
const { results, pagination: pagination2 } = await getService(strapi2, "history").findVersionsPage({
|
57
|
+
const { results, pagination: pagination2 } = await getService$1(strapi2, "history").findVersionsPage({
|
58
58
|
query: {
|
59
59
|
...query,
|
60
60
|
...getValidPagination({ page: query.page, pageSize: query.pageSize })
|
@@ -79,14 +79,14 @@ const createHistoryVersionController = ({ strapi: strapi2 }) => {
|
|
79
79
|
async restoreVersion(ctx) {
|
80
80
|
const request = ctx.request;
|
81
81
|
await validateRestoreVersion(request.body, "contentType is required");
|
82
|
-
const permissionChecker2 = getService$
|
82
|
+
const permissionChecker2 = getService$2("permission-checker").create({
|
83
83
|
userAbility: ctx.state.userAbility,
|
84
84
|
model: request.body.contentType
|
85
85
|
});
|
86
86
|
if (permissionChecker2.cannot.update()) {
|
87
87
|
throw new errors.ForbiddenError();
|
88
88
|
}
|
89
|
-
const restoredDocument = await getService(strapi2, "history").restoreVersion(
|
89
|
+
const restoredDocument = await getService$1(strapi2, "history").restoreVersion(
|
90
90
|
request.params.versionId
|
91
91
|
);
|
92
92
|
return {
|
@@ -141,8 +141,7 @@ const createServiceUtils = ({ strapi: strapi2 }) => {
|
|
141
141
|
};
|
142
142
|
const getRelationRestoreValue = async (versionRelationData, attribute) => {
|
143
143
|
if (Array.isArray(versionRelationData)) {
|
144
|
-
if (versionRelationData.length === 0)
|
145
|
-
return versionRelationData;
|
144
|
+
if (versionRelationData.length === 0) return versionRelationData;
|
146
145
|
const existingAndMissingRelations = await Promise.all(
|
147
146
|
versionRelationData.map((relation) => {
|
148
147
|
return strapi2.documents(attribute.target).findOne({
|
@@ -177,8 +176,7 @@ const createServiceUtils = ({ strapi: strapi2 }) => {
|
|
177
176
|
const getDefaultLocale = async () => localesService ? localesService.getDefaultLocale() : null;
|
178
177
|
const isLocalizedContentType = (model) => i18nContentTypeService ? i18nContentTypeService.isLocalizedContentType(model) : false;
|
179
178
|
const getLocaleDictionary = async () => {
|
180
|
-
if (!localesService)
|
181
|
-
return {};
|
179
|
+
if (!localesService) return {};
|
182
180
|
const locales = await localesService.find() || [];
|
183
181
|
return locales.reduce(
|
184
182
|
(acc, locale) => {
|
@@ -202,6 +200,17 @@ const createServiceUtils = ({ strapi: strapi2 }) => {
|
|
202
200
|
const meta = await documentMetadataService.getMetadata(contentTypeUid, document);
|
203
201
|
return documentMetadataService.getStatus(document, meta.availableStatus);
|
204
202
|
};
|
203
|
+
const getComponentFields = (componentUID) => {
|
204
|
+
return Object.entries(strapi2.getModel(componentUID).attributes).reduce(
|
205
|
+
(fieldsAcc, [key, attribute]) => {
|
206
|
+
if (!["relation", "media", "component", "dynamiczone"].includes(attribute.type)) {
|
207
|
+
fieldsAcc.push(key);
|
208
|
+
}
|
209
|
+
return fieldsAcc;
|
210
|
+
},
|
211
|
+
[]
|
212
|
+
);
|
213
|
+
};
|
205
214
|
const getDeepPopulate2 = (uid2, useDatabaseSyntax = false) => {
|
206
215
|
const model = strapi2.getModel(uid2);
|
207
216
|
const attributes = Object.entries(model.attributes);
|
@@ -225,13 +234,19 @@ const createServiceUtils = ({ strapi: strapi2 }) => {
|
|
225
234
|
}
|
226
235
|
case "component": {
|
227
236
|
const populate = getDeepPopulate2(attribute.component);
|
228
|
-
acc[attributeName] = {
|
237
|
+
acc[attributeName] = {
|
238
|
+
populate,
|
239
|
+
[fieldSelector]: getComponentFields(attribute.component)
|
240
|
+
};
|
229
241
|
break;
|
230
242
|
}
|
231
243
|
case "dynamiczone": {
|
232
244
|
const populatedComponents = (attribute.components || []).reduce(
|
233
245
|
(acc2, componentUID) => {
|
234
|
-
acc2[componentUID] = {
|
246
|
+
acc2[componentUID] = {
|
247
|
+
populate: getDeepPopulate2(componentUID),
|
248
|
+
[fieldSelector]: getComponentFields(componentUID)
|
249
|
+
};
|
235
250
|
return acc2;
|
236
251
|
},
|
237
252
|
{}
|
@@ -344,7 +359,7 @@ const createHistoryService = ({ strapi: strapi2 }) => {
|
|
344
359
|
const attributeValue = entry.data[attributeKey];
|
345
360
|
const attributeValues = Array.isArray(attributeValue) ? attributeValue : [attributeValue];
|
346
361
|
if (attributeSchema.type === "media") {
|
347
|
-
const permissionChecker2 = getService$
|
362
|
+
const permissionChecker2 = getService$2("permission-checker").create({
|
348
363
|
userAbility: params.state.userAbility,
|
349
364
|
model: "plugin::upload.file"
|
350
365
|
});
|
@@ -385,7 +400,7 @@ const createHistoryService = ({ strapi: strapi2 }) => {
|
|
385
400
|
[attributeKey]: adminUsers
|
386
401
|
};
|
387
402
|
}
|
388
|
-
const permissionChecker2 = getService$
|
403
|
+
const permissionChecker2 = getService$2("permission-checker").create({
|
389
404
|
userAbility: params.state.userAbility,
|
390
405
|
model: attributeSchema.target
|
391
406
|
});
|
@@ -561,7 +576,7 @@ const createLifecyclesService = ({ strapi: strapi2 }) => {
|
|
561
576
|
onCommit(async () => {
|
562
577
|
for (const entry of localeEntries) {
|
563
578
|
const status = await serviceUtils.getVersionStatus(uid2, entry);
|
564
|
-
await getService(strapi2, "history").createVersion({
|
579
|
+
await getService$1(strapi2, "history").createVersion({
|
565
580
|
contentType: uid2,
|
566
581
|
data: omit(FIELDS_TO_IGNORE, entry),
|
567
582
|
relatedDocumentId: documentId,
|
@@ -574,15 +589,19 @@ const createLifecyclesService = ({ strapi: strapi2 }) => {
|
|
574
589
|
});
|
575
590
|
return result;
|
576
591
|
});
|
577
|
-
state.deleteExpiredJob = scheduleJob("0 0 * * *", () => {
|
592
|
+
state.deleteExpiredJob = scheduleJob("historyDaily", "0 0 * * *", () => {
|
578
593
|
const retentionDaysInMilliseconds = serviceUtils.getRetentionDays() * 24 * 60 * 60 * 1e3;
|
579
594
|
const expirationDate = new Date(Date.now() - retentionDaysInMilliseconds);
|
580
595
|
strapi2.db.query(HISTORY_VERSION_UID).deleteMany({
|
581
596
|
where: {
|
582
597
|
created_at: {
|
583
|
-
$lt: expirationDate
|
598
|
+
$lt: expirationDate
|
584
599
|
}
|
585
600
|
}
|
601
|
+
}).catch((error) => {
|
602
|
+
if (error instanceof Error) {
|
603
|
+
strapi2.log.error("Error deleting expired history versions", error.message);
|
604
|
+
}
|
586
605
|
});
|
587
606
|
});
|
588
607
|
state.isInitialized = true;
|
@@ -676,10 +695,10 @@ const getFeature$1 = () => {
|
|
676
695
|
strapi2.get("models").add(historyVersion);
|
677
696
|
},
|
678
697
|
bootstrap({ strapi: strapi2 }) {
|
679
|
-
getService(strapi2, "lifecycles").bootstrap();
|
698
|
+
getService$1(strapi2, "lifecycles").bootstrap();
|
680
699
|
},
|
681
700
|
destroy({ strapi: strapi2 }) {
|
682
|
-
getService(strapi2, "lifecycles").destroy();
|
701
|
+
getService$1(strapi2, "lifecycles").destroy();
|
683
702
|
},
|
684
703
|
controllers: controllers$2,
|
685
704
|
services: services$2,
|
@@ -693,14 +712,6 @@ const getFeature$1 = () => {
|
|
693
712
|
};
|
694
713
|
};
|
695
714
|
const history = getFeature$1();
|
696
|
-
const register = async ({ strapi: strapi2 }) => {
|
697
|
-
await history.register?.({ strapi: strapi2 });
|
698
|
-
};
|
699
|
-
const ALLOWED_WEBHOOK_EVENTS = {
|
700
|
-
ENTRY_PUBLISH: "entry.publish",
|
701
|
-
ENTRY_UNPUBLISH: "entry.unpublish"
|
702
|
-
};
|
703
|
-
const FEATURE_ID = "preview";
|
704
715
|
const info = { pluginName: "content-manager", type: "admin" };
|
705
716
|
const previewRouter = {
|
706
717
|
type: "admin",
|
@@ -709,7 +720,7 @@ const previewRouter = {
|
|
709
720
|
method: "GET",
|
710
721
|
info,
|
711
722
|
path: "/preview/url/:contentType",
|
712
|
-
handler: "preview.
|
723
|
+
handler: "preview.getPreviewUrl",
|
713
724
|
config: {
|
714
725
|
policies: ["admin::isAuthenticatedAdmin"]
|
715
726
|
}
|
@@ -719,12 +730,56 @@ const previewRouter = {
|
|
719
730
|
const routes$1 = {
|
720
731
|
preview: previewRouter
|
721
732
|
};
|
733
|
+
function getService(strapi2, name) {
|
734
|
+
return strapi2.service(`plugin::content-manager.${name}`);
|
735
|
+
}
|
736
|
+
const getPreviewUrlSchema = yup.object().shape({
|
737
|
+
// Will be undefined for single types
|
738
|
+
documentId: yup.string(),
|
739
|
+
locale: yup.string().nullable(),
|
740
|
+
status: yup.string()
|
741
|
+
}).required();
|
742
|
+
const validatePreviewUrl = async (strapi2, uid2, params) => {
|
743
|
+
await validateYupSchema(getPreviewUrlSchema)(params);
|
744
|
+
const newParams = pick(["documentId", "locale", "status"], params);
|
745
|
+
const model = strapi2.getModel(uid2);
|
746
|
+
if (!model || model.modelType !== "contentType") {
|
747
|
+
throw new errors.ValidationError("Invalid content type");
|
748
|
+
}
|
749
|
+
const isSingleType = model?.kind === "singleType";
|
750
|
+
if (!isSingleType && !params.documentId) {
|
751
|
+
throw new errors.ValidationError("documentId is required for Collection Types");
|
752
|
+
}
|
753
|
+
if (isSingleType) {
|
754
|
+
const doc = await strapi2.documents(uid2).findFirst();
|
755
|
+
if (!doc) {
|
756
|
+
throw new errors.NotFoundError("Document not found");
|
757
|
+
}
|
758
|
+
newParams.documentId = doc?.documentId;
|
759
|
+
}
|
760
|
+
if (!newParams.status) {
|
761
|
+
const isDPEnabled = model?.options?.draftAndPublish;
|
762
|
+
newParams.status = isDPEnabled ? "draft" : "published";
|
763
|
+
}
|
764
|
+
return newParams;
|
765
|
+
};
|
722
766
|
const createPreviewController = () => {
|
723
767
|
return {
|
724
|
-
|
725
|
-
|
768
|
+
/**
|
769
|
+
* Transforms an entry into a preview URL, so that it can be previewed
|
770
|
+
* in the Content Manager.
|
771
|
+
*/
|
772
|
+
async getPreviewUrl(ctx) {
|
773
|
+
const uid2 = ctx.params.contentType;
|
774
|
+
const query = ctx.request.query;
|
775
|
+
const params = await validatePreviewUrl(strapi, uid2, query);
|
776
|
+
const previewService = getService(strapi, "preview");
|
777
|
+
const url = await previewService.getPreviewUrl(uid2, params);
|
778
|
+
if (!url) {
|
779
|
+
ctx.status = 204;
|
780
|
+
}
|
726
781
|
return {
|
727
|
-
data: { url
|
782
|
+
data: { url }
|
728
783
|
};
|
729
784
|
}
|
730
785
|
};
|
@@ -736,19 +791,111 @@ const controllers$1 = {
|
|
736
791
|
* passing a controller factory as the value, instead of a controller object directly
|
737
792
|
*/
|
738
793
|
};
|
739
|
-
const createPreviewService = () => {
|
794
|
+
const createPreviewService = ({ strapi: strapi2 }) => {
|
795
|
+
const config = getService(strapi2, "preview-config");
|
796
|
+
return {
|
797
|
+
async getPreviewUrl(uid2, params) {
|
798
|
+
const handler = config.getPreviewHandler();
|
799
|
+
try {
|
800
|
+
return handler(uid2, params);
|
801
|
+
} catch (error) {
|
802
|
+
strapi2.log.error(`Failed to get preview URL: ${error}`);
|
803
|
+
throw new errors.ApplicationError("Failed to get preview URL");
|
804
|
+
}
|
805
|
+
return;
|
806
|
+
}
|
807
|
+
};
|
808
|
+
};
|
809
|
+
const extendMiddlewareConfiguration = (middleware = { name: "", config: {} }) => {
|
810
|
+
const middlewares = strapi.config.get("middlewares");
|
811
|
+
const configuredMiddlewares = middlewares.map((currentMiddleware) => {
|
812
|
+
if (currentMiddleware === middleware.name) {
|
813
|
+
return middleware;
|
814
|
+
}
|
815
|
+
if (currentMiddleware.name === middleware.name) {
|
816
|
+
return mergeWith(
|
817
|
+
(objValue, srcValue) => {
|
818
|
+
if (Array.isArray(objValue)) {
|
819
|
+
return objValue.concat(srcValue);
|
820
|
+
}
|
821
|
+
return void 0;
|
822
|
+
},
|
823
|
+
currentMiddleware,
|
824
|
+
middleware
|
825
|
+
);
|
826
|
+
}
|
827
|
+
return currentMiddleware;
|
828
|
+
});
|
829
|
+
strapi.config.set("middlewares", configuredMiddlewares);
|
830
|
+
};
|
831
|
+
const createPreviewConfigService = ({ strapi: strapi2 }) => {
|
832
|
+
return {
|
833
|
+
register() {
|
834
|
+
if (!this.isEnabled()) {
|
835
|
+
return;
|
836
|
+
}
|
837
|
+
const config = strapi2.config.get("admin.preview");
|
838
|
+
if (config.config?.allowedOrigins) {
|
839
|
+
extendMiddlewareConfiguration({
|
840
|
+
name: "strapi::security",
|
841
|
+
config: {
|
842
|
+
contentSecurityPolicy: {
|
843
|
+
directives: {
|
844
|
+
"frame-src": config.config.allowedOrigins
|
845
|
+
}
|
846
|
+
}
|
847
|
+
}
|
848
|
+
});
|
849
|
+
}
|
850
|
+
},
|
851
|
+
isEnabled() {
|
852
|
+
const config = strapi2.config.get("admin.preview");
|
853
|
+
if (!config) {
|
854
|
+
return false;
|
855
|
+
}
|
856
|
+
return config?.enabled ?? true;
|
857
|
+
},
|
858
|
+
/**
|
859
|
+
* Validate if the configuration is valid
|
860
|
+
*/
|
861
|
+
validate() {
|
862
|
+
if (!this.isEnabled()) {
|
863
|
+
return;
|
864
|
+
}
|
865
|
+
const handler = this.getPreviewHandler();
|
866
|
+
if (typeof handler !== "function") {
|
867
|
+
throw new errors.ValidationError(
|
868
|
+
"Preview configuration is invalid. Handler must be a function"
|
869
|
+
);
|
870
|
+
}
|
871
|
+
},
|
872
|
+
/**
|
873
|
+
* Utility to get the preview handler from the configuration
|
874
|
+
*/
|
875
|
+
getPreviewHandler() {
|
876
|
+
const config = strapi2.config.get("admin.preview");
|
877
|
+
const emptyHandler = () => {
|
878
|
+
return void 0;
|
879
|
+
};
|
880
|
+
if (!this.isEnabled()) {
|
881
|
+
return emptyHandler;
|
882
|
+
}
|
883
|
+
return config?.config?.handler || emptyHandler;
|
884
|
+
}
|
885
|
+
};
|
740
886
|
};
|
741
887
|
const services$1 = {
|
742
|
-
preview: createPreviewService
|
888
|
+
preview: createPreviewService,
|
889
|
+
"preview-config": createPreviewConfigService
|
743
890
|
};
|
744
891
|
const getFeature = () => {
|
745
|
-
if (!strapi.features.future.isEnabled(FEATURE_ID)) {
|
746
|
-
return {};
|
747
|
-
}
|
748
892
|
return {
|
893
|
+
register() {
|
894
|
+
const config = getService(strapi, "preview-config");
|
895
|
+
config.validate();
|
896
|
+
config.register();
|
897
|
+
},
|
749
898
|
bootstrap() {
|
750
|
-
console.log("Bootstrapping preview server");
|
751
|
-
strapi.config.get("admin.preview");
|
752
899
|
},
|
753
900
|
routes: routes$1,
|
754
901
|
controllers: controllers$1,
|
@@ -756,14 +903,22 @@ const getFeature = () => {
|
|
756
903
|
};
|
757
904
|
};
|
758
905
|
const preview = getFeature();
|
906
|
+
const register = async ({ strapi: strapi2 }) => {
|
907
|
+
await history.register?.({ strapi: strapi2 });
|
908
|
+
await preview.register?.({ strapi: strapi2 });
|
909
|
+
};
|
910
|
+
const ALLOWED_WEBHOOK_EVENTS = {
|
911
|
+
ENTRY_PUBLISH: "entry.publish",
|
912
|
+
ENTRY_UNPUBLISH: "entry.unpublish"
|
913
|
+
};
|
759
914
|
const bootstrap = async () => {
|
760
915
|
Object.entries(ALLOWED_WEBHOOK_EVENTS).forEach(([key, value]) => {
|
761
916
|
strapi.get("webhookStore").addAllowedEvent(key, value);
|
762
917
|
});
|
763
|
-
getService$
|
764
|
-
await getService$
|
765
|
-
await getService$
|
766
|
-
await getService$
|
918
|
+
getService$2("field-sizes").setCustomFieldInputSizes();
|
919
|
+
await getService$2("components").syncConfigurations();
|
920
|
+
await getService$2("content-types").syncConfigurations();
|
921
|
+
await getService$2("permission").registerPermissions();
|
767
922
|
await history.bootstrap?.({ strapi });
|
768
923
|
await preview.bootstrap?.({ strapi });
|
769
924
|
};
|
@@ -1319,8 +1474,7 @@ const isSortable = (schema, name) => {
|
|
1319
1474
|
if (!_.has(schema.attributes, name)) {
|
1320
1475
|
return false;
|
1321
1476
|
}
|
1322
|
-
if (schema.modelType === "component" && name === "id")
|
1323
|
-
return false;
|
1477
|
+
if (schema.modelType === "component" && name === "id") return false;
|
1324
1478
|
const attribute = schema.attributes[name];
|
1325
1479
|
if (NON_SORTABLES.includes(attribute.type)) {
|
1326
1480
|
return false;
|
@@ -1465,8 +1619,7 @@ const createDefaultSettings = async (schema) => {
|
|
1465
1619
|
};
|
1466
1620
|
};
|
1467
1621
|
const syncSettings = async (configuration, schema) => {
|
1468
|
-
if (isEmpty(configuration.settings))
|
1469
|
-
return createDefaultSettings(schema);
|
1622
|
+
if (isEmpty(configuration.settings)) return createDefaultSettings(schema);
|
1470
1623
|
const defaultField = getDefaultMainField(schema);
|
1471
1624
|
const { mainField = defaultField, defaultSortBy = defaultField } = configuration.settings || {};
|
1472
1625
|
return {
|
@@ -1513,7 +1666,7 @@ const createMetadasSchema = (schema) => {
|
|
1513
1666
|
if (!value) {
|
1514
1667
|
return yup$1.string();
|
1515
1668
|
}
|
1516
|
-
const targetSchema = getService$
|
1669
|
+
const targetSchema = getService$2("content-types").findContentType(
|
1517
1670
|
schema.attributes[key].targetModel
|
1518
1671
|
);
|
1519
1672
|
if (!targetSchema) {
|
@@ -1642,8 +1795,7 @@ const excludeNotCreatableFields = (uid2, permissionChecker2) => (body, path = []
|
|
1642
1795
|
}
|
1643
1796
|
switch (attribute.type) {
|
1644
1797
|
case "relation": {
|
1645
|
-
if (canCreate(attributePath))
|
1646
|
-
return body2;
|
1798
|
+
if (canCreate(attributePath)) return body2;
|
1647
1799
|
return set(attributePath, { set: [] }, body2);
|
1648
1800
|
}
|
1649
1801
|
case "component": {
|
@@ -1653,8 +1805,7 @@ const excludeNotCreatableFields = (uid2, permissionChecker2) => (body, path = []
|
|
1653
1805
|
]);
|
1654
1806
|
}
|
1655
1807
|
default: {
|
1656
|
-
if (canCreate(attributePath))
|
1657
|
-
return body2;
|
1808
|
+
if (canCreate(attributePath)) return body2;
|
1658
1809
|
return set(attributePath, null, body2);
|
1659
1810
|
}
|
1660
1811
|
}
|
@@ -1682,7 +1833,7 @@ const getDocumentLocaleAndStatus = async (request, model, opts = { allowMultiple
|
|
1682
1833
|
}
|
1683
1834
|
};
|
1684
1835
|
const formatDocumentWithMetadata = async (permissionChecker2, uid2, document, opts = {}) => {
|
1685
|
-
const documentMetadata2 = getService$
|
1836
|
+
const documentMetadata2 = getService$2("document-metadata");
|
1686
1837
|
const serviceOutput = await documentMetadata2.formatDocumentWithMetadata(uid2, document, opts);
|
1687
1838
|
let {
|
1688
1839
|
meta: { availableLocales, availableStatus }
|
@@ -1708,8 +1859,8 @@ const createDocument = async (ctx, opts) => {
|
|
1708
1859
|
const { userAbility, user } = ctx.state;
|
1709
1860
|
const { model } = ctx.params;
|
1710
1861
|
const { body } = ctx.request;
|
1711
|
-
const documentManager2 = getService$
|
1712
|
-
const permissionChecker2 = getService$
|
1862
|
+
const documentManager2 = getService$2("document-manager");
|
1863
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
1713
1864
|
if (permissionChecker2.cannot.create()) {
|
1714
1865
|
throw new errors.ForbiddenError();
|
1715
1866
|
}
|
@@ -1729,13 +1880,13 @@ const updateDocument = async (ctx, opts) => {
|
|
1729
1880
|
const { userAbility, user } = ctx.state;
|
1730
1881
|
const { id, model } = ctx.params;
|
1731
1882
|
const { body } = ctx.request;
|
1732
|
-
const documentManager2 = getService$
|
1733
|
-
const permissionChecker2 = getService$
|
1883
|
+
const documentManager2 = getService$2("document-manager");
|
1884
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
1734
1885
|
if (permissionChecker2.cannot.update()) {
|
1735
1886
|
throw new errors.ForbiddenError();
|
1736
1887
|
}
|
1737
1888
|
const permissionQuery = await permissionChecker2.sanitizedQuery.update(ctx.query);
|
1738
|
-
const populate = await getService$
|
1889
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
|
1739
1890
|
const { locale } = await getDocumentLocaleAndStatus(body, model);
|
1740
1891
|
const [documentVersion, documentExists] = await Promise.all([
|
1741
1892
|
documentManager2.findOne(id, model, { populate, locale, status: "draft" }),
|
@@ -1766,14 +1917,14 @@ const collectionTypes = {
|
|
1766
1917
|
const { userAbility } = ctx.state;
|
1767
1918
|
const { model } = ctx.params;
|
1768
1919
|
const { query } = ctx.request;
|
1769
|
-
const documentMetadata2 = getService$
|
1770
|
-
const documentManager2 = getService$
|
1771
|
-
const permissionChecker2 = getService$
|
1920
|
+
const documentMetadata2 = getService$2("document-metadata");
|
1921
|
+
const documentManager2 = getService$2("document-manager");
|
1922
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
1772
1923
|
if (permissionChecker2.cannot.read()) {
|
1773
1924
|
return ctx.forbidden();
|
1774
1925
|
}
|
1775
1926
|
const permissionQuery = await permissionChecker2.sanitizedQuery.read(query);
|
1776
|
-
const populate = await getService$
|
1927
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(1).countRelations({ toOne: false, toMany: true }).build();
|
1777
1928
|
const { locale, status } = await getDocumentLocaleAndStatus(query, model);
|
1778
1929
|
const { results: documents, pagination: pagination2 } = await documentManager2.findPage(
|
1779
1930
|
{ ...permissionQuery, populate, locale, status },
|
@@ -1802,13 +1953,13 @@ const collectionTypes = {
|
|
1802
1953
|
async findOne(ctx) {
|
1803
1954
|
const { userAbility } = ctx.state;
|
1804
1955
|
const { model, id } = ctx.params;
|
1805
|
-
const documentManager2 = getService$
|
1806
|
-
const permissionChecker2 = getService$
|
1956
|
+
const documentManager2 = getService$2("document-manager");
|
1957
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
1807
1958
|
if (permissionChecker2.cannot.read()) {
|
1808
1959
|
return ctx.forbidden();
|
1809
1960
|
}
|
1810
1961
|
const permissionQuery = await permissionChecker2.sanitizedQuery.read(ctx.query);
|
1811
|
-
const populate = await getService$
|
1962
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(Infinity).countRelations().build();
|
1812
1963
|
const { locale, status } = await getDocumentLocaleAndStatus(ctx.query, model);
|
1813
1964
|
const version = await documentManager2.findOne(id, model, {
|
1814
1965
|
populate,
|
@@ -1839,7 +1990,7 @@ const collectionTypes = {
|
|
1839
1990
|
async create(ctx) {
|
1840
1991
|
const { userAbility } = ctx.state;
|
1841
1992
|
const { model } = ctx.params;
|
1842
|
-
const permissionChecker2 = getService$
|
1993
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
1843
1994
|
const [totalEntries, document] = await Promise.all([
|
1844
1995
|
strapi.db.query(model).count(),
|
1845
1996
|
createDocument(ctx)
|
@@ -1860,7 +2011,7 @@ const collectionTypes = {
|
|
1860
2011
|
async update(ctx) {
|
1861
2012
|
const { userAbility } = ctx.state;
|
1862
2013
|
const { model } = ctx.params;
|
1863
|
-
const permissionChecker2 = getService$
|
2014
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
1864
2015
|
const updatedVersion = await updateDocument(ctx);
|
1865
2016
|
const sanitizedVersion = await permissionChecker2.sanitizeOutput(updatedVersion);
|
1866
2017
|
ctx.body = await formatDocumentWithMetadata(permissionChecker2, model, sanitizedVersion);
|
@@ -1869,13 +2020,13 @@ const collectionTypes = {
|
|
1869
2020
|
const { userAbility, user } = ctx.state;
|
1870
2021
|
const { model, sourceId: id } = ctx.params;
|
1871
2022
|
const { body } = ctx.request;
|
1872
|
-
const documentManager2 = getService$
|
1873
|
-
const permissionChecker2 = getService$
|
2023
|
+
const documentManager2 = getService$2("document-manager");
|
2024
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
1874
2025
|
if (permissionChecker2.cannot.create()) {
|
1875
2026
|
return ctx.forbidden();
|
1876
2027
|
}
|
1877
2028
|
const permissionQuery = await permissionChecker2.sanitizedQuery.create(ctx.query);
|
1878
|
-
const populate = await getService$
|
2029
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
|
1879
2030
|
const { locale } = await getDocumentLocaleAndStatus(body, model);
|
1880
2031
|
const document = await documentManager2.findOne(id, model, {
|
1881
2032
|
populate,
|
@@ -1914,13 +2065,13 @@ const collectionTypes = {
|
|
1914
2065
|
async delete(ctx) {
|
1915
2066
|
const { userAbility } = ctx.state;
|
1916
2067
|
const { id, model } = ctx.params;
|
1917
|
-
const documentManager2 = getService$
|
1918
|
-
const permissionChecker2 = getService$
|
2068
|
+
const documentManager2 = getService$2("document-manager");
|
2069
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
1919
2070
|
if (permissionChecker2.cannot.delete()) {
|
1920
2071
|
return ctx.forbidden();
|
1921
2072
|
}
|
1922
2073
|
const permissionQuery = await permissionChecker2.sanitizedQuery.delete(ctx.query);
|
1923
|
-
const populate = await getService$
|
2074
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
|
1924
2075
|
const { locale } = await getDocumentLocaleAndStatus(ctx.query, model);
|
1925
2076
|
const documentLocales = await documentManager2.findLocales(id, model, { populate, locale });
|
1926
2077
|
if (documentLocales.length === 0) {
|
@@ -1942,14 +2093,14 @@ const collectionTypes = {
|
|
1942
2093
|
const { userAbility } = ctx.state;
|
1943
2094
|
const { id, model } = ctx.params;
|
1944
2095
|
const { body } = ctx.request;
|
1945
|
-
const documentManager2 = getService$
|
1946
|
-
const permissionChecker2 = getService$
|
2096
|
+
const documentManager2 = getService$2("document-manager");
|
2097
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
1947
2098
|
if (permissionChecker2.cannot.publish()) {
|
1948
2099
|
return ctx.forbidden();
|
1949
2100
|
}
|
1950
2101
|
const publishedDocument = await strapi.db.transaction(async () => {
|
1951
2102
|
const permissionQuery = await permissionChecker2.sanitizedQuery.publish(ctx.query);
|
1952
|
-
const populate = await getService$
|
2103
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(Infinity).countRelations().build();
|
1953
2104
|
let document;
|
1954
2105
|
const { locale } = await getDocumentLocaleAndStatus(body, model);
|
1955
2106
|
const isCreate = isNil$1(id);
|
@@ -1997,13 +2148,13 @@ const collectionTypes = {
|
|
1997
2148
|
const { body } = ctx.request;
|
1998
2149
|
const { documentIds } = body;
|
1999
2150
|
await validateBulkActionInput(body);
|
2000
|
-
const documentManager2 = getService$
|
2001
|
-
const permissionChecker2 = getService$
|
2151
|
+
const documentManager2 = getService$2("document-manager");
|
2152
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2002
2153
|
if (permissionChecker2.cannot.publish()) {
|
2003
2154
|
return ctx.forbidden();
|
2004
2155
|
}
|
2005
2156
|
const permissionQuery = await permissionChecker2.sanitizedQuery.publish(ctx.query);
|
2006
|
-
const populate = await getService$
|
2157
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(Infinity).countRelations().build();
|
2007
2158
|
const { locale } = await getDocumentLocaleAndStatus(body, model, {
|
2008
2159
|
allowMultipleLocales: true
|
2009
2160
|
});
|
@@ -2028,8 +2179,8 @@ const collectionTypes = {
|
|
2028
2179
|
const { body } = ctx.request;
|
2029
2180
|
const { documentIds } = body;
|
2030
2181
|
await validateBulkActionInput(body);
|
2031
|
-
const documentManager2 = getService$
|
2032
|
-
const permissionChecker2 = getService$
|
2182
|
+
const documentManager2 = getService$2("document-manager");
|
2183
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2033
2184
|
if (permissionChecker2.cannot.unpublish()) {
|
2034
2185
|
return ctx.forbidden();
|
2035
2186
|
}
|
@@ -2058,8 +2209,8 @@ const collectionTypes = {
|
|
2058
2209
|
const {
|
2059
2210
|
body: { discardDraft, ...body }
|
2060
2211
|
} = ctx.request;
|
2061
|
-
const documentManager2 = getService$
|
2062
|
-
const permissionChecker2 = getService$
|
2212
|
+
const documentManager2 = getService$2("document-manager");
|
2213
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2063
2214
|
if (permissionChecker2.cannot.unpublish()) {
|
2064
2215
|
return ctx.forbidden();
|
2065
2216
|
}
|
@@ -2067,7 +2218,7 @@ const collectionTypes = {
|
|
2067
2218
|
return ctx.forbidden();
|
2068
2219
|
}
|
2069
2220
|
const permissionQuery = await permissionChecker2.sanitizedQuery.unpublish(ctx.query);
|
2070
|
-
const populate = await getService$
|
2221
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
|
2071
2222
|
const { locale } = await getDocumentLocaleAndStatus(body, model);
|
2072
2223
|
const document = await documentManager2.findOne(id, model, {
|
2073
2224
|
populate,
|
@@ -2098,13 +2249,13 @@ const collectionTypes = {
|
|
2098
2249
|
const { userAbility } = ctx.state;
|
2099
2250
|
const { id, model } = ctx.params;
|
2100
2251
|
const { body } = ctx.request;
|
2101
|
-
const documentManager2 = getService$
|
2102
|
-
const permissionChecker2 = getService$
|
2252
|
+
const documentManager2 = getService$2("document-manager");
|
2253
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2103
2254
|
if (permissionChecker2.cannot.discard()) {
|
2104
2255
|
return ctx.forbidden();
|
2105
2256
|
}
|
2106
2257
|
const permissionQuery = await permissionChecker2.sanitizedQuery.discard(ctx.query);
|
2107
|
-
const populate = await getService$
|
2258
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
|
2108
2259
|
const { locale } = await getDocumentLocaleAndStatus(body, model);
|
2109
2260
|
const document = await documentManager2.findOne(id, model, {
|
2110
2261
|
populate,
|
@@ -2129,13 +2280,13 @@ const collectionTypes = {
|
|
2129
2280
|
const { query, body } = ctx.request;
|
2130
2281
|
const { documentIds } = body;
|
2131
2282
|
await validateBulkActionInput(body);
|
2132
|
-
const documentManager2 = getService$
|
2133
|
-
const permissionChecker2 = getService$
|
2283
|
+
const documentManager2 = getService$2("document-manager");
|
2284
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2134
2285
|
if (permissionChecker2.cannot.delete()) {
|
2135
2286
|
return ctx.forbidden();
|
2136
2287
|
}
|
2137
2288
|
const permissionQuery = await permissionChecker2.sanitizedQuery.delete(query);
|
2138
|
-
const populate = await getService$
|
2289
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
|
2139
2290
|
const { locale } = await getDocumentLocaleAndStatus(body, model);
|
2140
2291
|
const documentLocales = await documentManager2.findLocales(documentIds, model, {
|
2141
2292
|
populate,
|
@@ -2156,13 +2307,13 @@ const collectionTypes = {
|
|
2156
2307
|
async countDraftRelations(ctx) {
|
2157
2308
|
const { userAbility } = ctx.state;
|
2158
2309
|
const { model, id } = ctx.params;
|
2159
|
-
const documentManager2 = getService$
|
2160
|
-
const permissionChecker2 = getService$
|
2310
|
+
const documentManager2 = getService$2("document-manager");
|
2311
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2161
2312
|
if (permissionChecker2.cannot.read()) {
|
2162
2313
|
return ctx.forbidden();
|
2163
2314
|
}
|
2164
2315
|
const permissionQuery = await permissionChecker2.sanitizedQuery.read(ctx.query);
|
2165
|
-
const populate = await getService$
|
2316
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
|
2166
2317
|
const { locale, status } = await getDocumentLocaleAndStatus(ctx.query, model);
|
2167
2318
|
const entity = await documentManager2.findOne(id, model, { populate, locale, status });
|
2168
2319
|
if (!entity) {
|
@@ -2181,8 +2332,8 @@ const collectionTypes = {
|
|
2181
2332
|
const ids = ctx.request.query.documentIds;
|
2182
2333
|
const locale = ctx.request.query.locale;
|
2183
2334
|
const { model } = ctx.params;
|
2184
|
-
const documentManager2 = getService$
|
2185
|
-
const permissionChecker2 = getService$
|
2335
|
+
const documentManager2 = getService$2("document-manager");
|
2336
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2186
2337
|
if (permissionChecker2.cannot.read()) {
|
2187
2338
|
return ctx.forbidden();
|
2188
2339
|
}
|
@@ -2206,13 +2357,13 @@ const collectionTypes = {
|
|
2206
2357
|
};
|
2207
2358
|
const components$1 = {
|
2208
2359
|
findComponents(ctx) {
|
2209
|
-
const components2 = getService$
|
2210
|
-
const { toDto } = getService$
|
2360
|
+
const components2 = getService$2("components").findAllComponents();
|
2361
|
+
const { toDto } = getService$2("data-mapper");
|
2211
2362
|
ctx.body = { data: components2.map(toDto) };
|
2212
2363
|
},
|
2213
2364
|
async findComponentConfiguration(ctx) {
|
2214
2365
|
const { uid: uid2 } = ctx.params;
|
2215
|
-
const componentService = getService$
|
2366
|
+
const componentService = getService$2("components");
|
2216
2367
|
const component = componentService.findComponent(uid2);
|
2217
2368
|
if (!component) {
|
2218
2369
|
return ctx.notFound("component.notFound");
|
@@ -2229,7 +2380,7 @@ const components$1 = {
|
|
2229
2380
|
async updateComponentConfiguration(ctx) {
|
2230
2381
|
const { uid: uid2 } = ctx.params;
|
2231
2382
|
const { body } = ctx.request;
|
2232
|
-
const componentService = getService$
|
2383
|
+
const componentService = getService$2("components");
|
2233
2384
|
const component = componentService.findComponent(uid2);
|
2234
2385
|
if (!component) {
|
2235
2386
|
return ctx.notFound("component.notFound");
|
@@ -2263,12 +2414,12 @@ const contentTypes = {
|
|
2263
2414
|
} catch (error) {
|
2264
2415
|
return ctx.send({ error }, 400);
|
2265
2416
|
}
|
2266
|
-
const contentTypes2 = getService$
|
2267
|
-
const { toDto } = getService$
|
2417
|
+
const contentTypes2 = getService$2("content-types").findContentTypesByKind(kind);
|
2418
|
+
const { toDto } = getService$2("data-mapper");
|
2268
2419
|
ctx.body = { data: contentTypes2.map(toDto) };
|
2269
2420
|
},
|
2270
2421
|
async findContentTypesSettings(ctx) {
|
2271
|
-
const { findAllContentTypes, findConfiguration } = getService$
|
2422
|
+
const { findAllContentTypes, findConfiguration } = getService$2("content-types");
|
2272
2423
|
const contentTypes2 = await findAllContentTypes();
|
2273
2424
|
const configurations = await Promise.all(
|
2274
2425
|
contentTypes2.map(async (contentType) => {
|
@@ -2282,7 +2433,7 @@ const contentTypes = {
|
|
2282
2433
|
},
|
2283
2434
|
async findContentTypeConfiguration(ctx) {
|
2284
2435
|
const { uid: uid2 } = ctx.params;
|
2285
|
-
const contentTypeService = getService$
|
2436
|
+
const contentTypeService = getService$2("content-types");
|
2286
2437
|
const contentType = await contentTypeService.findContentType(uid2);
|
2287
2438
|
if (!contentType) {
|
2288
2439
|
return ctx.notFound("contentType.notFound");
|
@@ -2304,13 +2455,13 @@ const contentTypes = {
|
|
2304
2455
|
const { userAbility } = ctx.state;
|
2305
2456
|
const { uid: uid2 } = ctx.params;
|
2306
2457
|
const { body } = ctx.request;
|
2307
|
-
const contentTypeService = getService$
|
2308
|
-
const metricsService = getService$
|
2458
|
+
const contentTypeService = getService$2("content-types");
|
2459
|
+
const metricsService = getService$2("metrics");
|
2309
2460
|
const contentType = await contentTypeService.findContentType(uid2);
|
2310
2461
|
if (!contentType) {
|
2311
2462
|
return ctx.notFound("contentType.notFound");
|
2312
2463
|
}
|
2313
|
-
if (!getService$
|
2464
|
+
if (!getService$2("permission").canConfigureContentType({ userAbility, contentType })) {
|
2314
2465
|
return ctx.forbidden();
|
2315
2466
|
}
|
2316
2467
|
let input;
|
@@ -2343,10 +2494,10 @@ const contentTypes = {
|
|
2343
2494
|
};
|
2344
2495
|
const init = {
|
2345
2496
|
getInitData(ctx) {
|
2346
|
-
const { toDto } = getService$
|
2347
|
-
const { findAllComponents } = getService$
|
2348
|
-
const { getAllFieldSizes } = getService$
|
2349
|
-
const { findAllContentTypes } = getService$
|
2497
|
+
const { toDto } = getService$2("data-mapper");
|
2498
|
+
const { findAllComponents } = getService$2("components");
|
2499
|
+
const { getAllFieldSizes } = getService$2("field-sizes");
|
2500
|
+
const { findAllContentTypes } = getService$2("content-types");
|
2350
2501
|
ctx.body = {
|
2351
2502
|
data: {
|
2352
2503
|
fieldSizes: getAllFieldSizes(),
|
@@ -2382,7 +2533,7 @@ const addFiltersClause = (params, filtersClause) => {
|
|
2382
2533
|
params.filters.$and.push(filtersClause);
|
2383
2534
|
};
|
2384
2535
|
const sanitizeMainField = (model, mainField, userAbility) => {
|
2385
|
-
const permissionChecker2 = getService$
|
2536
|
+
const permissionChecker2 = getService$2("permission-checker").create({
|
2386
2537
|
userAbility,
|
2387
2538
|
model: model.uid
|
2388
2539
|
});
|
@@ -2400,7 +2551,7 @@ const addStatusToRelations = async (targetUid, relations2) => {
|
|
2400
2551
|
if (!contentTypes$1.hasDraftAndPublish(strapi.getModel(targetUid))) {
|
2401
2552
|
return relations2;
|
2402
2553
|
}
|
2403
|
-
const documentMetadata2 = getService$
|
2554
|
+
const documentMetadata2 = getService$2("document-metadata");
|
2404
2555
|
if (!relations2.length) {
|
2405
2556
|
return relations2;
|
2406
2557
|
}
|
@@ -2447,8 +2598,7 @@ const validateStatus = (sourceUid, status) => {
|
|
2447
2598
|
const sourceModel = strapi.getModel(sourceUid);
|
2448
2599
|
const isDP = contentTypes$1.hasDraftAndPublish;
|
2449
2600
|
const isSourceDP = isDP(sourceModel);
|
2450
|
-
if (!isSourceDP)
|
2451
|
-
return { status: void 0 };
|
2601
|
+
if (!isSourceDP) return { status: void 0 };
|
2452
2602
|
switch (status) {
|
2453
2603
|
case "published":
|
2454
2604
|
return { status: "published" };
|
@@ -2478,7 +2628,7 @@ const relations = {
|
|
2478
2628
|
ctx.request?.query?.locale
|
2479
2629
|
);
|
2480
2630
|
const { status } = validateStatus(sourceUid, ctx.request?.query?.status);
|
2481
|
-
const permissionChecker2 = getService$
|
2631
|
+
const permissionChecker2 = getService$2("permission-checker").create({
|
2482
2632
|
userAbility,
|
2483
2633
|
model
|
2484
2634
|
});
|
@@ -2503,7 +2653,7 @@ const relations = {
|
|
2503
2653
|
where.id = id;
|
2504
2654
|
}
|
2505
2655
|
const permissionQuery = await permissionChecker2.sanitizedQuery.read(ctx.query);
|
2506
|
-
const populate = await getService$
|
2656
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
|
2507
2657
|
const currentEntity = await strapi.db.query(model).findOne({
|
2508
2658
|
where,
|
2509
2659
|
populate
|
@@ -2518,7 +2668,7 @@ const relations = {
|
|
2518
2668
|
}
|
2519
2669
|
entryId = currentEntity.id;
|
2520
2670
|
}
|
2521
|
-
const modelConfig = isComponent2 ? await getService$
|
2671
|
+
const modelConfig = isComponent2 ? await getService$2("components").findConfiguration(sourceSchema) : await getService$2("content-types").findConfiguration(sourceSchema);
|
2522
2672
|
const targetSchema = strapi.getModel(targetUid);
|
2523
2673
|
const mainField = flow(
|
2524
2674
|
prop(`metadatas.${targetField}.edit.mainField`),
|
@@ -2572,7 +2722,7 @@ const relations = {
|
|
2572
2722
|
}
|
2573
2723
|
} = await this.extractAndValidateRequestInfo(ctx, id);
|
2574
2724
|
const { idsToOmit, idsToInclude, _q, ...query } = ctx.request.query;
|
2575
|
-
const permissionChecker2 = getService$
|
2725
|
+
const permissionChecker2 = getService$2("permission-checker").create({
|
2576
2726
|
userAbility: ctx.state.userAbility,
|
2577
2727
|
model: targetUid
|
2578
2728
|
});
|
@@ -2651,7 +2801,7 @@ const relations = {
|
|
2651
2801
|
} = await this.extractAndValidateRequestInfo(ctx, id);
|
2652
2802
|
const { uid: sourceUid } = sourceSchema;
|
2653
2803
|
const { uid: targetUid } = targetSchema;
|
2654
|
-
const permissionQuery = await getService$
|
2804
|
+
const permissionQuery = await getService$2("permission-checker").create({ userAbility, model: targetUid }).sanitizedQuery.read({ fields: fieldsToSelect });
|
2655
2805
|
const dbQuery = strapi.db.query(sourceUid);
|
2656
2806
|
const loadRelations = relations$1.isAnyToMany(attribute) ? (...args) => dbQuery.loadPages(...args) : (...args) => dbQuery.load(...args).then((res2) => ({ results: res2 ? [res2] : [] }));
|
2657
2807
|
const filters = {};
|
@@ -2692,10 +2842,10 @@ const relations = {
|
|
2692
2842
|
}
|
2693
2843
|
};
|
2694
2844
|
const buildPopulateFromQuery = async (query, model) => {
|
2695
|
-
return getService$
|
2845
|
+
return getService$2("populate-builder")(model).populateFromQuery(query).populateDeep(Infinity).countRelations().build();
|
2696
2846
|
};
|
2697
2847
|
const findDocument = async (query, uid2, opts = {}) => {
|
2698
|
-
const documentManager2 = getService$
|
2848
|
+
const documentManager2 = getService$2("document-manager");
|
2699
2849
|
const populate = await buildPopulateFromQuery(query, uid2);
|
2700
2850
|
return documentManager2.findMany({ ...opts, populate }, uid2).then((documents) => documents[0]);
|
2701
2851
|
};
|
@@ -2703,8 +2853,8 @@ const createOrUpdateDocument = async (ctx, opts) => {
|
|
2703
2853
|
const { user, userAbility } = ctx.state;
|
2704
2854
|
const { model } = ctx.params;
|
2705
2855
|
const { body, query } = ctx.request;
|
2706
|
-
const documentManager2 = getService$
|
2707
|
-
const permissionChecker2 = getService$
|
2856
|
+
const documentManager2 = getService$2("document-manager");
|
2857
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2708
2858
|
if (permissionChecker2.cannot.create() && permissionChecker2.cannot.update()) {
|
2709
2859
|
throw new errors.ForbiddenError();
|
2710
2860
|
}
|
@@ -2745,7 +2895,7 @@ const singleTypes = {
|
|
2745
2895
|
const { userAbility } = ctx.state;
|
2746
2896
|
const { model } = ctx.params;
|
2747
2897
|
const { query = {} } = ctx.request;
|
2748
|
-
const permissionChecker2 = getService$
|
2898
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2749
2899
|
if (permissionChecker2.cannot.read()) {
|
2750
2900
|
return ctx.forbidden();
|
2751
2901
|
}
|
@@ -2779,7 +2929,7 @@ const singleTypes = {
|
|
2779
2929
|
async createOrUpdate(ctx) {
|
2780
2930
|
const { userAbility } = ctx.state;
|
2781
2931
|
const { model } = ctx.params;
|
2782
|
-
const permissionChecker2 = getService$
|
2932
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2783
2933
|
const document = await createOrUpdateDocument(ctx);
|
2784
2934
|
const sanitizedDocument = await permissionChecker2.sanitizeOutput(document);
|
2785
2935
|
ctx.body = await formatDocumentWithMetadata(permissionChecker2, model, sanitizedDocument);
|
@@ -2788,8 +2938,8 @@ const singleTypes = {
|
|
2788
2938
|
const { userAbility } = ctx.state;
|
2789
2939
|
const { model } = ctx.params;
|
2790
2940
|
const { query = {} } = ctx.request;
|
2791
|
-
const documentManager2 = getService$
|
2792
|
-
const permissionChecker2 = getService$
|
2941
|
+
const documentManager2 = getService$2("document-manager");
|
2942
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2793
2943
|
if (permissionChecker2.cannot.delete()) {
|
2794
2944
|
return ctx.forbidden();
|
2795
2945
|
}
|
@@ -2817,8 +2967,8 @@ const singleTypes = {
|
|
2817
2967
|
const { userAbility } = ctx.state;
|
2818
2968
|
const { model } = ctx.params;
|
2819
2969
|
const { query = {} } = ctx.request;
|
2820
|
-
const documentManager2 = getService$
|
2821
|
-
const permissionChecker2 = getService$
|
2970
|
+
const documentManager2 = getService$2("document-manager");
|
2971
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2822
2972
|
if (permissionChecker2.cannot.publish()) {
|
2823
2973
|
return ctx.forbidden();
|
2824
2974
|
}
|
@@ -2846,8 +2996,8 @@ const singleTypes = {
|
|
2846
2996
|
body: { discardDraft, ...body },
|
2847
2997
|
query = {}
|
2848
2998
|
} = ctx.request;
|
2849
|
-
const documentManager2 = getService$
|
2850
|
-
const permissionChecker2 = getService$
|
2999
|
+
const documentManager2 = getService$2("document-manager");
|
3000
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2851
3001
|
if (permissionChecker2.cannot.unpublish()) {
|
2852
3002
|
return ctx.forbidden();
|
2853
3003
|
}
|
@@ -2881,8 +3031,8 @@ const singleTypes = {
|
|
2881
3031
|
const { userAbility } = ctx.state;
|
2882
3032
|
const { model } = ctx.params;
|
2883
3033
|
const { body, query = {} } = ctx.request;
|
2884
|
-
const documentManager2 = getService$
|
2885
|
-
const permissionChecker2 = getService$
|
3034
|
+
const documentManager2 = getService$2("document-manager");
|
3035
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2886
3036
|
if (permissionChecker2.cannot.discard()) {
|
2887
3037
|
return ctx.forbidden();
|
2888
3038
|
}
|
@@ -2905,8 +3055,8 @@ const singleTypes = {
|
|
2905
3055
|
const { userAbility } = ctx.state;
|
2906
3056
|
const { model } = ctx.params;
|
2907
3057
|
const { query } = ctx.request;
|
2908
|
-
const documentManager2 = getService$
|
2909
|
-
const permissionChecker2 = getService$
|
3058
|
+
const documentManager2 = getService$2("document-manager");
|
3059
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2910
3060
|
const { locale } = await getDocumentLocaleAndStatus(query, model);
|
2911
3061
|
if (permissionChecker2.cannot.read()) {
|
2912
3062
|
return ctx.forbidden();
|
@@ -2930,7 +3080,7 @@ const uid$1 = {
|
|
2930
3080
|
const { query = {} } = ctx.request;
|
2931
3081
|
const { locale } = await getDocumentLocaleAndStatus(query, contentTypeUID);
|
2932
3082
|
await validateUIDField(contentTypeUID, field);
|
2933
|
-
const uidService = getService$
|
3083
|
+
const uidService = getService$2("uid");
|
2934
3084
|
ctx.body = {
|
2935
3085
|
data: await uidService.generateUIDField({ contentTypeUID, field, data, locale })
|
2936
3086
|
};
|
@@ -2942,7 +3092,7 @@ const uid$1 = {
|
|
2942
3092
|
const { query = {} } = ctx.request;
|
2943
3093
|
const { locale } = await getDocumentLocaleAndStatus(query, contentTypeUID);
|
2944
3094
|
await validateUIDField(contentTypeUID, field);
|
2945
|
-
const uidService = getService$
|
3095
|
+
const uidService = getService$2("uid");
|
2946
3096
|
const isAvailable = await uidService.checkUIDAvailability({
|
2947
3097
|
contentTypeUID,
|
2948
3098
|
field,
|
@@ -3093,18 +3243,15 @@ async function syncMetadatas(configuration, schema) {
|
|
3093
3243
|
_.set(updatedMeta, ["list", "searchable"], false);
|
3094
3244
|
_.set(acc, [key], updatedMeta);
|
3095
3245
|
}
|
3096
|
-
if (!_.has(edit, "mainField"))
|
3097
|
-
return acc;
|
3246
|
+
if (!_.has(edit, "mainField")) return acc;
|
3098
3247
|
if (!isRelation$1(attr)) {
|
3099
3248
|
_.set(updatedMeta, "edit", _.omit(edit, ["mainField"]));
|
3100
3249
|
_.set(acc, [key], updatedMeta);
|
3101
3250
|
return acc;
|
3102
3251
|
}
|
3103
|
-
if (edit.mainField === "id")
|
3104
|
-
return acc;
|
3252
|
+
if (edit.mainField === "id") return acc;
|
3105
3253
|
const targetSchema = getTargetSchema(attr.targetModel);
|
3106
|
-
if (!targetSchema)
|
3107
|
-
return acc;
|
3254
|
+
if (!targetSchema) return acc;
|
3108
3255
|
if (!isSortable(targetSchema, edit.mainField) && !isListable(targetSchema, edit.mainField)) {
|
3109
3256
|
_.set(updatedMeta, ["edit", "mainField"], getDefaultMainField(targetSchema));
|
3110
3257
|
_.set(acc, [key], updatedMeta);
|
@@ -3115,12 +3262,12 @@ async function syncMetadatas(configuration, schema) {
|
|
3115
3262
|
return _.assign(metasWithDefaults, updatedMetas);
|
3116
3263
|
}
|
3117
3264
|
const getTargetSchema = (targetModel) => {
|
3118
|
-
return getService$
|
3265
|
+
return getService$2("content-types").findContentType(targetModel);
|
3119
3266
|
};
|
3120
3267
|
const DEFAULT_LIST_LENGTH = 4;
|
3121
3268
|
const MAX_ROW_SIZE = 12;
|
3122
3269
|
const isAllowedFieldSize = (type, size) => {
|
3123
|
-
const { getFieldSize } = getService$
|
3270
|
+
const { getFieldSize } = getService$2("field-sizes");
|
3124
3271
|
const fieldSize = getFieldSize(type);
|
3125
3272
|
if (!fieldSize.isResizable && size !== fieldSize.default) {
|
3126
3273
|
return false;
|
@@ -3128,7 +3275,7 @@ const isAllowedFieldSize = (type, size) => {
|
|
3128
3275
|
return size <= MAX_ROW_SIZE;
|
3129
3276
|
};
|
3130
3277
|
const getDefaultFieldSize = (attribute) => {
|
3131
|
-
const { hasFieldSize, getFieldSize } = getService$
|
3278
|
+
const { hasFieldSize, getFieldSize } = getService$2("field-sizes");
|
3132
3279
|
return getFieldSize(hasFieldSize(attribute.customField) ? attribute.customField : attribute.type).default;
|
3133
3280
|
};
|
3134
3281
|
async function createDefaultLayouts(schema) {
|
@@ -3149,8 +3296,7 @@ function createDefaultEditLayout(schema) {
|
|
3149
3296
|
return appendToEditLayout([], keys2, schema);
|
3150
3297
|
}
|
3151
3298
|
function syncLayouts(configuration, schema) {
|
3152
|
-
if (_.isEmpty(configuration.layouts))
|
3153
|
-
return createDefaultLayouts(schema);
|
3299
|
+
if (_.isEmpty(configuration.layouts)) return createDefaultLayouts(schema);
|
3154
3300
|
const { list = [], editRelations = [], edit = [] } = configuration.layouts || {};
|
3155
3301
|
let cleanList = list.filter((attr) => isListable(schema, attr));
|
3156
3302
|
const cleanEditRelations = editRelations.filter(
|
@@ -3161,9 +3307,8 @@ function syncLayouts(configuration, schema) {
|
|
3161
3307
|
for (const row of edit) {
|
3162
3308
|
const newRow = [];
|
3163
3309
|
for (const el of row) {
|
3164
|
-
if (!hasEditableAttribute(schema, el.name))
|
3165
|
-
|
3166
|
-
const { hasFieldSize } = getService$1("field-sizes");
|
3310
|
+
if (!hasEditableAttribute(schema, el.name)) continue;
|
3311
|
+
const { hasFieldSize } = getService$2("field-sizes");
|
3167
3312
|
const fieldType = hasFieldSize(schema.attributes[el.name].customField) ? schema.attributes[el.name].customField : schema.attributes[el.name].type;
|
3168
3313
|
if (!isAllowedFieldSize(fieldType, el.size)) {
|
3169
3314
|
elementsToReAppend.push(el.name);
|
@@ -3193,8 +3338,7 @@ function syncLayouts(configuration, schema) {
|
|
3193
3338
|
};
|
3194
3339
|
}
|
3195
3340
|
const appendToEditLayout = (layout = [], keysToAppend, schema) => {
|
3196
|
-
if (keysToAppend.length === 0)
|
3197
|
-
return layout;
|
3341
|
+
if (keysToAppend.length === 0) return layout;
|
3198
3342
|
let currentRowIndex = Math.max(layout.length - 1, 0);
|
3199
3343
|
if (!layout[currentRowIndex]) {
|
3200
3344
|
layout[currentRowIndex] = [];
|
@@ -3303,17 +3447,17 @@ const configurationService$1 = createConfigurationService({
|
|
3303
3447
|
isComponent: true,
|
3304
3448
|
prefix: STORE_KEY_PREFIX,
|
3305
3449
|
getModels() {
|
3306
|
-
const { toContentManagerModel } = getService$
|
3450
|
+
const { toContentManagerModel } = getService$2("data-mapper");
|
3307
3451
|
return mapValues(toContentManagerModel, strapi.components);
|
3308
3452
|
}
|
3309
3453
|
});
|
3310
3454
|
const components = ({ strapi: strapi2 }) => ({
|
3311
3455
|
findAllComponents() {
|
3312
|
-
const { toContentManagerModel } = getService$
|
3456
|
+
const { toContentManagerModel } = getService$2("data-mapper");
|
3313
3457
|
return Object.values(strapi2.components).map(toContentManagerModel);
|
3314
3458
|
},
|
3315
3459
|
findComponent(uid2) {
|
3316
|
-
const { toContentManagerModel } = getService$
|
3460
|
+
const { toContentManagerModel } = getService$2("data-mapper");
|
3317
3461
|
const component = strapi2.components[uid2];
|
3318
3462
|
return isNil$1(component) ? component : toContentManagerModel(component);
|
3319
3463
|
},
|
@@ -3364,17 +3508,17 @@ const configurationService = createConfigurationService({
|
|
3364
3508
|
storeUtils,
|
3365
3509
|
prefix: "content_types",
|
3366
3510
|
getModels() {
|
3367
|
-
const { toContentManagerModel } = getService$
|
3511
|
+
const { toContentManagerModel } = getService$2("data-mapper");
|
3368
3512
|
return mapValues(toContentManagerModel, strapi.contentTypes);
|
3369
3513
|
}
|
3370
3514
|
});
|
3371
3515
|
const service = ({ strapi: strapi2 }) => ({
|
3372
3516
|
findAllContentTypes() {
|
3373
|
-
const { toContentManagerModel } = getService$
|
3517
|
+
const { toContentManagerModel } = getService$2("data-mapper");
|
3374
3518
|
return Object.values(strapi2.contentTypes).map(toContentManagerModel);
|
3375
3519
|
},
|
3376
3520
|
findContentType(uid2) {
|
3377
|
-
const { toContentManagerModel } = getService$
|
3521
|
+
const { toContentManagerModel } = getService$2("data-mapper");
|
3378
3522
|
const contentType = strapi2.contentTypes[uid2];
|
3379
3523
|
return isNil$1(contentType) ? contentType : toContentManagerModel(contentType);
|
3380
3524
|
},
|
@@ -3403,7 +3547,7 @@ const service = ({ strapi: strapi2 }) => ({
|
|
3403
3547
|
return this.findConfiguration(contentType);
|
3404
3548
|
},
|
3405
3549
|
findComponentsConfigurations(contentType) {
|
3406
|
-
return getService$
|
3550
|
+
return getService$2("components").findComponentsConfigurations(contentType);
|
3407
3551
|
},
|
3408
3552
|
syncConfigurations() {
|
3409
3553
|
return configurationService.syncConfigurations();
|
@@ -3675,7 +3819,7 @@ const permission = ({ strapi: strapi2 }) => ({
|
|
3675
3819
|
return userAbility.can(action);
|
3676
3820
|
},
|
3677
3821
|
async registerPermissions() {
|
3678
|
-
const displayedContentTypes = getService$
|
3822
|
+
const displayedContentTypes = getService$2("content-types").findDisplayedContentTypes();
|
3679
3823
|
const contentTypesUids = displayedContentTypes.map(prop("uid"));
|
3680
3824
|
const actions = [
|
3681
3825
|
{
|
@@ -3760,6 +3904,12 @@ function getPopulateForRelation(attribute, model, attributeName, { countMany, co
|
|
3760
3904
|
if (initialPopulate) {
|
3761
3905
|
return initialPopulate;
|
3762
3906
|
}
|
3907
|
+
if (attributeName === "localizations") {
|
3908
|
+
const validationPopulate = getPopulateForValidation(model.uid);
|
3909
|
+
return {
|
3910
|
+
populate: validationPopulate.populate
|
3911
|
+
};
|
3912
|
+
}
|
3763
3913
|
if (!isVisibleAttribute$1(model, attributeName)) {
|
3764
3914
|
return true;
|
3765
3915
|
}
|
@@ -3819,6 +3969,9 @@ const getDeepPopulate = (uid2, {
|
|
3819
3969
|
return {};
|
3820
3970
|
}
|
3821
3971
|
const model = strapi.getModel(uid2);
|
3972
|
+
if (!model) {
|
3973
|
+
return {};
|
3974
|
+
}
|
3822
3975
|
return Object.keys(model.attributes).reduce(
|
3823
3976
|
(populateAcc, attributeName) => merge(
|
3824
3977
|
populateAcc,
|
@@ -3838,40 +3991,46 @@ const getDeepPopulate = (uid2, {
|
|
3838
3991
|
{}
|
3839
3992
|
);
|
3840
3993
|
};
|
3841
|
-
const
|
3842
|
-
|
3843
|
-
|
3844
|
-
countOne = false,
|
3845
|
-
maxLevel = Infinity
|
3846
|
-
} = {}, level = 1) => {
|
3847
|
-
if (level > maxLevel) {
|
3994
|
+
const getPopulateForValidation = (uid2) => {
|
3995
|
+
const model = strapi.getModel(uid2);
|
3996
|
+
if (!model) {
|
3848
3997
|
return {};
|
3849
3998
|
}
|
3850
|
-
const model = strapi.getModel(uid2);
|
3851
3999
|
return Object.entries(model.attributes).reduce((populateAcc, [attributeName, attribute]) => {
|
3852
|
-
if (
|
4000
|
+
if (isScalarAttribute(attribute)) {
|
4001
|
+
if (getDoesAttributeRequireValidation(attribute)) {
|
4002
|
+
populateAcc.fields = populateAcc.fields || [];
|
4003
|
+
populateAcc.fields.push(attributeName);
|
4004
|
+
}
|
3853
4005
|
return populateAcc;
|
3854
4006
|
}
|
3855
|
-
if (
|
3856
|
-
|
3857
|
-
|
3858
|
-
|
4007
|
+
if (isComponent(attribute)) {
|
4008
|
+
const component = attribute.component;
|
4009
|
+
const componentResult = getPopulateForValidation(component);
|
4010
|
+
if (Object.keys(componentResult).length > 0) {
|
4011
|
+
populateAcc.populate = populateAcc.populate || {};
|
4012
|
+
populateAcc.populate[attributeName] = componentResult;
|
4013
|
+
}
|
4014
|
+
return populateAcc;
|
3859
4015
|
}
|
3860
|
-
|
3861
|
-
|
3862
|
-
|
3863
|
-
|
3864
|
-
|
3865
|
-
|
3866
|
-
|
3867
|
-
|
3868
|
-
|
3869
|
-
countOne,
|
3870
|
-
maxLevel
|
4016
|
+
if (isDynamicZone(attribute)) {
|
4017
|
+
const components2 = attribute.components;
|
4018
|
+
const componentsResult = (components2 || []).reduce(
|
4019
|
+
(acc, componentUID) => {
|
4020
|
+
const componentResult = getPopulateForValidation(componentUID);
|
4021
|
+
if (Object.keys(componentResult).length > 0) {
|
4022
|
+
acc[componentUID] = componentResult;
|
4023
|
+
}
|
4024
|
+
return acc;
|
3871
4025
|
},
|
3872
|
-
|
3873
|
-
)
|
3874
|
-
|
4026
|
+
{}
|
4027
|
+
);
|
4028
|
+
if (Object.keys(componentsResult).length > 0) {
|
4029
|
+
populateAcc.populate = populateAcc.populate || {};
|
4030
|
+
populateAcc.populate[attributeName] = { on: componentsResult };
|
4031
|
+
}
|
4032
|
+
}
|
4033
|
+
return populateAcc;
|
3875
4034
|
}, {});
|
3876
4035
|
};
|
3877
4036
|
const getDeepPopulateDraftCount = (uid2) => {
|
@@ -3951,7 +4110,7 @@ const getQueryPopulate = async (uid2, query) => {
|
|
3951
4110
|
return populateQuery;
|
3952
4111
|
};
|
3953
4112
|
const buildDeepPopulate = (uid2) => {
|
3954
|
-
return getService$
|
4113
|
+
return getService$2("populate-builder")(uid2).populateDeep(Infinity).countRelations().build();
|
3955
4114
|
};
|
3956
4115
|
const populateBuilder = (uid2) => {
|
3957
4116
|
let getInitialPopulate = async () => {
|
@@ -4113,7 +4272,6 @@ const AVAILABLE_LOCALES_FIELDS = [
|
|
4113
4272
|
"locale",
|
4114
4273
|
"updatedAt",
|
4115
4274
|
"createdAt",
|
4116
|
-
"status",
|
4117
4275
|
"publishedAt",
|
4118
4276
|
"documentId"
|
4119
4277
|
];
|
@@ -4134,36 +4292,20 @@ const documentMetadata = ({ strapi: strapi2 }) => ({
|
|
4134
4292
|
/**
|
4135
4293
|
* Returns available locales of a document for the current status
|
4136
4294
|
*/
|
4137
|
-
async getAvailableLocales(uid2, version, allVersions
|
4295
|
+
async getAvailableLocales(uid2, version, allVersions) {
|
4138
4296
|
const versionsByLocale = groupBy("locale", allVersions);
|
4139
4297
|
if (version.locale) {
|
4140
4298
|
delete versionsByLocale[version.locale];
|
4141
4299
|
}
|
4142
4300
|
const model = strapi2.getModel(uid2);
|
4143
|
-
const keysToKeep = [...AVAILABLE_LOCALES_FIELDS, ...validatableFields];
|
4144
|
-
const traversalFunction = async (localeVersion) => traverseEntity(
|
4145
|
-
({ key }, { remove }) => {
|
4146
|
-
if (keysToKeep.includes(key)) {
|
4147
|
-
return;
|
4148
|
-
}
|
4149
|
-
remove(key);
|
4150
|
-
},
|
4151
|
-
{ schema: model, getModel: strapi2.getModel.bind(strapi2) },
|
4152
|
-
// @ts-expect-error fix types DocumentVersion incompatible with Data
|
4153
|
-
localeVersion
|
4154
|
-
);
|
4155
4301
|
const mappingResult = await async.map(
|
4156
4302
|
Object.values(versionsByLocale),
|
4157
4303
|
async (localeVersions) => {
|
4158
|
-
const mappedLocaleVersions = await async.map(
|
4159
|
-
localeVersions,
|
4160
|
-
traversalFunction
|
4161
|
-
);
|
4162
4304
|
if (!contentTypes$1.hasDraftAndPublish(model)) {
|
4163
|
-
return
|
4305
|
+
return localeVersions[0];
|
4164
4306
|
}
|
4165
|
-
const draftVersion =
|
4166
|
-
const otherVersions =
|
4307
|
+
const draftVersion = localeVersions.find((v) => v.publishedAt === null);
|
4308
|
+
const otherVersions = localeVersions.filter((v) => v.id !== draftVersion?.id);
|
4167
4309
|
if (!draftVersion) {
|
4168
4310
|
return;
|
4169
4311
|
}
|
@@ -4185,8 +4327,7 @@ const documentMetadata = ({ strapi: strapi2 }) => ({
|
|
4185
4327
|
const matchStatus = status === "published" ? v.publishedAt !== null : v.publishedAt === null;
|
4186
4328
|
return matchLocale && matchStatus;
|
4187
4329
|
});
|
4188
|
-
if (!availableStatus)
|
4189
|
-
return availableStatus;
|
4330
|
+
if (!availableStatus) return availableStatus;
|
4190
4331
|
return pick(AVAILABLE_STATUS_FIELDS, availableStatus);
|
4191
4332
|
},
|
4192
4333
|
/**
|
@@ -4196,18 +4337,17 @@ const documentMetadata = ({ strapi: strapi2 }) => ({
|
|
4196
4337
|
* @returns
|
4197
4338
|
*/
|
4198
4339
|
async getManyAvailableStatus(uid2, documents) {
|
4199
|
-
if (!documents.length)
|
4200
|
-
return [];
|
4340
|
+
if (!documents.length) return [];
|
4201
4341
|
const status = documents[0].publishedAt !== null ? "published" : "draft";
|
4202
|
-
const
|
4203
|
-
|
4204
|
-
|
4205
|
-
|
4206
|
-
|
4342
|
+
const locales = documents.map((d) => d.locale).filter(Boolean);
|
4343
|
+
return strapi2.query(uid2).findMany({
|
4344
|
+
where: {
|
4345
|
+
documentId: { $in: documents.map((d) => d.documentId).filter(Boolean) },
|
4346
|
+
// NOTE: find the "opposite" status
|
4347
|
+
publishedAt: { $null: status === "published" },
|
4348
|
+
locale: { $in: locales }
|
4207
4349
|
},
|
4208
|
-
|
4209
|
-
locale,
|
4210
|
-
fields: ["documentId", "locale", "updatedAt", "createdAt", "publishedAt"]
|
4350
|
+
select: ["id", "documentId", "locale", "updatedAt", "createdAt", "publishedAt"]
|
4211
4351
|
});
|
4212
4352
|
},
|
4213
4353
|
getStatus(version, otherDocumentStatuses) {
|
@@ -4224,10 +4364,8 @@ const documentMetadata = ({ strapi: strapi2 }) => ({
|
|
4224
4364
|
} else if (otherVersion) {
|
4225
4365
|
draftVersion = otherVersion;
|
4226
4366
|
}
|
4227
|
-
if (!draftVersion)
|
4228
|
-
|
4229
|
-
if (!publishedVersion)
|
4230
|
-
return CONTENT_MANAGER_STATUS.DRAFT;
|
4367
|
+
if (!draftVersion) return CONTENT_MANAGER_STATUS.PUBLISHED;
|
4368
|
+
if (!publishedVersion) return CONTENT_MANAGER_STATUS.DRAFT;
|
4231
4369
|
const isDraftModified = getIsVersionLatestModification(draftVersion, publishedVersion);
|
4232
4370
|
return isDraftModified ? CONTENT_MANAGER_STATUS.MODIFIED : CONTENT_MANAGER_STATUS.PUBLISHED;
|
4233
4371
|
},
|
@@ -4235,11 +4373,9 @@ const documentMetadata = ({ strapi: strapi2 }) => ({
|
|
4235
4373
|
// We could refactor this so the locales are only loaded when they're
|
4236
4374
|
// needed. e.g. in the bulk locale action modal.
|
4237
4375
|
async getMetadata(uid2, version, { availableLocales = true, availableStatus = true } = {}) {
|
4238
|
-
const populate =
|
4239
|
-
const
|
4240
|
-
where: { documentId: version.documentId },
|
4376
|
+
const { populate = {}, fields = [] } = getPopulateForValidation(uid2);
|
4377
|
+
const params = {
|
4241
4378
|
populate: {
|
4242
|
-
// Populate only fields that require validation for bulk locale actions
|
4243
4379
|
...populate,
|
4244
4380
|
// NOTE: creator fields are selected in this way to avoid exposing sensitive data
|
4245
4381
|
createdBy: {
|
@@ -4248,9 +4384,15 @@ const documentMetadata = ({ strapi: strapi2 }) => ({
|
|
4248
4384
|
updatedBy: {
|
4249
4385
|
select: ["id", "firstname", "lastname", "email"]
|
4250
4386
|
}
|
4387
|
+
},
|
4388
|
+
fields: uniq([...AVAILABLE_LOCALES_FIELDS, ...fields]),
|
4389
|
+
filters: {
|
4390
|
+
documentId: version.documentId
|
4251
4391
|
}
|
4252
|
-
}
|
4253
|
-
const
|
4392
|
+
};
|
4393
|
+
const dbParams = strapi2.get("query-params").transform(uid2, params);
|
4394
|
+
const versions = await strapi2.db.query(uid2).findMany(dbParams);
|
4395
|
+
const availableLocalesResult = availableLocales ? await this.getAvailableLocales(uid2, version, versions) : [];
|
4254
4396
|
const availableStatusResult = availableStatus ? this.getAvailableStatus(version, versions) : null;
|
4255
4397
|
return {
|
4256
4398
|
availableLocales: availableLocalesResult,
|
@@ -4277,6 +4419,16 @@ const documentMetadata = ({ strapi: strapi2 }) => ({
|
|
4277
4419
|
opts.availableStatus = false;
|
4278
4420
|
}
|
4279
4421
|
const meta = await this.getMetadata(uid2, document, opts);
|
4422
|
+
if (document.localizations) {
|
4423
|
+
const otherStatus = await this.getManyAvailableStatus(uid2, document.localizations);
|
4424
|
+
document.localizations = document.localizations.map((d) => {
|
4425
|
+
const status = otherStatus.find((s) => s.documentId === d.documentId);
|
4426
|
+
return {
|
4427
|
+
...d,
|
4428
|
+
status: this.getStatus(d, status ? [status] : [])
|
4429
|
+
};
|
4430
|
+
});
|
4431
|
+
}
|
4280
4432
|
return {
|
4281
4433
|
data: {
|
4282
4434
|
...document,
|