@strapi/content-manager 0.0.0-experimental.bd712ad3930045f4a5d2144c119e0b7856e97fc4 → 0.0.0-experimental.c222e1c4de12dd05c26938a605a1128fb3481d1d
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/{ComponentConfigurationPage-BWQv6yRj.js → ComponentConfigurationPage--MCP7Aew.js} +4 -4
- package/dist/_chunks/{ComponentConfigurationPage-BWQv6yRj.js.map → ComponentConfigurationPage--MCP7Aew.js.map} +1 -1
- package/dist/_chunks/{ComponentConfigurationPage-C7ImeKGM.mjs → ComponentConfigurationPage-DT41asyM.mjs} +4 -4
- package/dist/_chunks/{ComponentConfigurationPage-C7ImeKGM.mjs.map → ComponentConfigurationPage-DT41asyM.mjs.map} +1 -1
- package/dist/_chunks/{EditConfigurationPage-MItFGzT9.mjs → EditConfigurationPage-DznPxn9p.mjs} +4 -4
- package/dist/_chunks/{EditConfigurationPage-MItFGzT9.mjs.map → EditConfigurationPage-DznPxn9p.mjs.map} +1 -1
- package/dist/_chunks/{EditConfigurationPage-CEGwxV-L.js → EditConfigurationPage-qgnNvv_u.js} +4 -4
- package/dist/_chunks/{EditConfigurationPage-CEGwxV-L.js.map → EditConfigurationPage-qgnNvv_u.js.map} +1 -1
- package/dist/_chunks/{EditViewPage-DhmAg0NK.mjs → EditViewPage-B_k7z288.mjs} +33 -11
- package/dist/_chunks/EditViewPage-B_k7z288.mjs.map +1 -0
- package/dist/_chunks/{EditViewPage-CmMi2Xsn.js → EditViewPage-Bb4S7p8c.js} +32 -10
- package/dist/_chunks/EditViewPage-Bb4S7p8c.js.map +1 -0
- package/dist/_chunks/{Field-1DLtcLAI.js → Field-ByR1mllE.js} +181 -109
- package/dist/_chunks/Field-ByR1mllE.js.map +1 -0
- package/dist/_chunks/{Field-Cs62u5pl.mjs → Field-DmwbE0TL.mjs} +179 -107
- package/dist/_chunks/Field-DmwbE0TL.mjs.map +1 -0
- package/dist/_chunks/{Form-CqFA7F_V.js → Form-BpeyAyS1.js} +36 -17
- package/dist/_chunks/Form-BpeyAyS1.js.map +1 -0
- package/dist/_chunks/{Form-zYHtzGUX.mjs → Form-Dvt5eouJ.mjs} +36 -17
- package/dist/_chunks/Form-Dvt5eouJ.mjs.map +1 -0
- package/dist/_chunks/{History-DalgFQ3D.mjs → History-CAERKpYl.mjs} +54 -54
- package/dist/_chunks/History-CAERKpYl.mjs.map +1 -0
- package/dist/_chunks/{History-BblwXv7-.js → History-d-IgDGPl.js} +53 -53
- package/dist/_chunks/History-d-IgDGPl.js.map +1 -0
- package/dist/_chunks/{ListConfigurationPage-DWy-vRzs.mjs → ListConfigurationPage-CVVT45M8.mjs} +15 -5
- package/dist/_chunks/ListConfigurationPage-CVVT45M8.mjs.map +1 -0
- package/dist/_chunks/{ListConfigurationPage-Cpy4QqNd.js → ListConfigurationPage-DSX98CYb.js} +15 -5
- package/dist/_chunks/ListConfigurationPage-DSX98CYb.js.map +1 -0
- package/dist/_chunks/{ListViewPage-DFjn1DNW.js → ListViewPage-C9gPPp-V.js} +61 -41
- package/dist/_chunks/ListViewPage-C9gPPp-V.js.map +1 -0
- package/dist/_chunks/{ListViewPage-BkAwIW9s.mjs → ListViewPage-Q4g6kHDl.mjs} +59 -39
- package/dist/_chunks/ListViewPage-Q4g6kHDl.mjs.map +1 -0
- package/dist/_chunks/{NoContentTypePage-B9BCNNdL.mjs → NoContentTypePage-BY4YRGs0.mjs} +2 -2
- package/dist/_chunks/{NoContentTypePage-B9BCNNdL.mjs.map → NoContentTypePage-BY4YRGs0.mjs.map} +1 -1
- package/dist/_chunks/{NoContentTypePage-C-3ykoxs.js → NoContentTypePage-D09gppmy.js} +2 -2
- package/dist/_chunks/{NoContentTypePage-C-3ykoxs.js.map → NoContentTypePage-D09gppmy.js.map} +1 -1
- package/dist/_chunks/{NoPermissionsPage-DKLmDZnZ.js → NoPermissionsPage-32WgThJG.js} +2 -2
- package/dist/_chunks/{NoPermissionsPage-DKLmDZnZ.js.map → NoPermissionsPage-32WgThJG.js.map} +1 -1
- package/dist/_chunks/{NoPermissionsPage-Bt_HWGat.mjs → NoPermissionsPage-CyM16RKL.mjs} +2 -2
- package/dist/_chunks/{NoPermissionsPage-Bt_HWGat.mjs.map → NoPermissionsPage-CyM16RKL.mjs.map} +1 -1
- package/dist/_chunks/Preview-C2WFq4S8.mjs +267 -0
- package/dist/_chunks/Preview-C2WFq4S8.mjs.map +1 -0
- package/dist/_chunks/Preview-PpV3g9wJ.js +286 -0
- package/dist/_chunks/Preview-PpV3g9wJ.js.map +1 -0
- package/dist/_chunks/{Relations-CJmTbZ8T.mjs → Relations-B_Yn9xGB.mjs} +73 -37
- package/dist/_chunks/Relations-B_Yn9xGB.mjs.map +1 -0
- package/dist/_chunks/{Relations-CrxfoH2n.js → Relations-mWaebC5t.js} +72 -36
- package/dist/_chunks/Relations-mWaebC5t.js.map +1 -0
- package/dist/_chunks/{en-fbKQxLGn.js → en-CHOp_xJv.js} +27 -16
- package/dist/_chunks/{en-fbKQxLGn.js.map → en-CHOp_xJv.js.map} +1 -1
- package/dist/_chunks/{en-Ux26r5pl.mjs → en-D_BMf0hT.mjs} +27 -16
- package/dist/_chunks/{en-Ux26r5pl.mjs.map → en-D_BMf0hT.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/{index-D1344xdw.mjs → index-CbytGVdz.mjs} +1070 -698
- package/dist/_chunks/index-CbytGVdz.mjs.map +1 -0
- package/dist/_chunks/{index-Buwn78Rt.js → index-iun2i4xv.js} +1052 -679
- package/dist/_chunks/index-iun2i4xv.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-ChVuUpa1.mjs → layout-Btu_cMRF.mjs} +22 -9
- package/dist/_chunks/layout-Btu_cMRF.mjs.map +1 -0
- package/dist/_chunks/{layout-DRuJUpas.js → layout-CkaP4K5_.js} +21 -8
- package/dist/_chunks/layout-CkaP4K5_.js.map +1 -0
- package/dist/_chunks/{objects-gigeqt7s.js → objects-BcXOv6_9.js} +2 -4
- package/dist/_chunks/{objects-gigeqt7s.js.map → objects-BcXOv6_9.js.map} +1 -1
- package/dist/_chunks/{objects-mKMAmfec.mjs → objects-D6yBsdmx.mjs} +2 -4
- package/dist/_chunks/{objects-mKMAmfec.mjs.map → objects-D6yBsdmx.mjs.map} +1 -1
- package/dist/_chunks/{relations-B-deMCy4.mjs → relations-Cn5re8ia.mjs} +6 -7
- package/dist/_chunks/relations-Cn5re8ia.mjs.map +1 -0
- package/dist/_chunks/{relations-DuoUwyJr.js → relations-O_v9g0v_.js} +6 -7
- package/dist/_chunks/relations-O_v9g0v_.js.map +1 -0
- package/dist/_chunks/{usePrev-B9w_-eYc.js → useDebounce-CtcjDB3L.js} +14 -1
- package/dist/_chunks/useDebounce-CtcjDB3L.js.map +1 -0
- package/dist/_chunks/useDebounce-DmuSJIF3.mjs +29 -0
- package/dist/_chunks/useDebounce-DmuSJIF3.mjs.map +1 -0
- package/dist/admin/index.js +2 -1
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +5 -4
- package/dist/admin/src/exports.d.ts +1 -1
- package/dist/admin/src/history/index.d.ts +3 -0
- package/dist/admin/src/history/services/historyVersion.d.ts +1 -1
- package/dist/admin/src/hooks/useDocument.d.ts +32 -1
- package/dist/admin/src/index.d.ts +1 -0
- package/dist/admin/src/pages/EditView/EditViewPage.d.ts +9 -1
- package/dist/admin/src/pages/EditView/components/DocumentActions.d.ts +1 -0
- package/dist/admin/src/pages/EditView/components/FormInputs/Relations.d.ts +20 -0
- package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.d.ts +2 -2
- package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/WysiwygFooter.d.ts +2 -2
- package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/WysiwygStyles.d.ts +4 -48
- package/dist/admin/src/pages/EditView/components/Header.d.ts +11 -11
- 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/constants.d.ts +1 -0
- package/dist/admin/src/preview/index.d.ts +4 -0
- package/dist/admin/src/preview/pages/Preview.d.ts +11 -0
- package/dist/admin/src/preview/routes.d.ts +3 -0
- package/dist/admin/src/preview/services/preview.d.ts +3 -0
- package/dist/admin/src/services/api.d.ts +1 -1
- package/dist/admin/src/services/components.d.ts +2 -2
- package/dist/admin/src/services/contentTypes.d.ts +3 -3
- package/dist/admin/src/services/documents.d.ts +19 -17
- package/dist/admin/src/services/init.d.ts +1 -1
- package/dist/admin/src/services/relations.d.ts +2 -2
- package/dist/admin/src/services/uid.d.ts +3 -3
- package/dist/admin/src/utils/validation.d.ts +4 -1
- package/dist/server/index.js +544 -261
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +545 -262
- package/dist/server/index.mjs.map +1 -1
- package/dist/server/src/bootstrap.d.ts.map +1 -1
- package/dist/server/src/controllers/collection-types.d.ts.map +1 -1
- package/dist/server/src/controllers/index.d.ts.map +1 -1
- package/dist/server/src/controllers/relations.d.ts.map +1 -1
- package/dist/server/src/controllers/uid.d.ts.map +1 -1
- package/dist/server/src/controllers/utils/metadata.d.ts +15 -1
- package/dist/server/src/controllers/utils/metadata.d.ts.map +1 -1
- package/dist/server/src/controllers/validation/dimensions.d.ts +4 -2
- package/dist/server/src/controllers/validation/dimensions.d.ts.map +1 -1
- package/dist/server/src/history/services/history.d.ts.map +1 -1
- package/dist/server/src/history/services/lifecycles.d.ts.map +1 -1
- package/dist/server/src/history/services/utils.d.ts +4 -4
- package/dist/server/src/history/services/utils.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +4 -4
- package/dist/server/src/policies/hasPermissions.d.ts.map +1 -1
- package/dist/server/src/preview/constants.d.ts +2 -0
- package/dist/server/src/preview/constants.d.ts.map +1 -0
- package/dist/server/src/preview/controllers/index.d.ts +2 -0
- package/dist/server/src/preview/controllers/index.d.ts.map +1 -0
- package/dist/server/src/preview/controllers/preview.d.ts +13 -0
- package/dist/server/src/preview/controllers/preview.d.ts.map +1 -0
- package/dist/server/src/preview/controllers/validation/preview.d.ts +6 -0
- package/dist/server/src/preview/controllers/validation/preview.d.ts.map +1 -0
- package/dist/server/src/preview/index.d.ts +4 -0
- package/dist/server/src/preview/index.d.ts.map +1 -0
- package/dist/server/src/preview/routes/index.d.ts +8 -0
- package/dist/server/src/preview/routes/index.d.ts.map +1 -0
- package/dist/server/src/preview/routes/preview.d.ts +4 -0
- package/dist/server/src/preview/routes/preview.d.ts.map +1 -0
- package/dist/server/src/preview/services/index.d.ts +15 -0
- package/dist/server/src/preview/services/index.d.ts.map +1 -0
- package/dist/server/src/preview/services/preview-config.d.ts +30 -0
- package/dist/server/src/preview/services/preview-config.d.ts.map +1 -0
- package/dist/server/src/preview/services/preview.d.ts +12 -0
- package/dist/server/src/preview/services/preview.d.ts.map +1 -0
- package/dist/server/src/preview/utils.d.ts +18 -0
- package/dist/server/src/preview/utils.d.ts.map +1 -0
- package/dist/server/src/routes/index.d.ts.map +1 -1
- package/dist/server/src/services/document-manager.d.ts.map +1 -1
- package/dist/server/src/services/document-metadata.d.ts +8 -8
- package/dist/server/src/services/document-metadata.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +4 -4
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/services/permission-checker.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.map +1 -1
- package/dist/server/src/utils/index.d.ts +2 -0
- package/dist/server/src/utils/index.d.ts.map +1 -1
- package/dist/shared/contracts/collection-types.d.ts +3 -1
- package/dist/shared/contracts/collection-types.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 -13
- package/dist/_chunks/EditViewPage-CmMi2Xsn.js.map +0 -1
- package/dist/_chunks/EditViewPage-DhmAg0NK.mjs.map +0 -1
- package/dist/_chunks/Field-1DLtcLAI.js.map +0 -1
- package/dist/_chunks/Field-Cs62u5pl.mjs.map +0 -1
- package/dist/_chunks/Form-CqFA7F_V.js.map +0 -1
- package/dist/_chunks/Form-zYHtzGUX.mjs.map +0 -1
- package/dist/_chunks/History-BblwXv7-.js.map +0 -1
- package/dist/_chunks/History-DalgFQ3D.mjs.map +0 -1
- package/dist/_chunks/ListConfigurationPage-Cpy4QqNd.js.map +0 -1
- package/dist/_chunks/ListConfigurationPage-DWy-vRzs.mjs.map +0 -1
- package/dist/_chunks/ListViewPage-BkAwIW9s.mjs.map +0 -1
- package/dist/_chunks/ListViewPage-DFjn1DNW.js.map +0 -1
- package/dist/_chunks/Relations-CJmTbZ8T.mjs.map +0 -1
- package/dist/_chunks/Relations-CrxfoH2n.js.map +0 -1
- package/dist/_chunks/index-Buwn78Rt.js.map +0 -1
- package/dist/_chunks/index-D1344xdw.mjs.map +0 -1
- package/dist/_chunks/layout-ChVuUpa1.mjs.map +0 -1
- package/dist/_chunks/layout-DRuJUpas.js.map +0 -1
- package/dist/_chunks/relations-B-deMCy4.mjs.map +0 -1
- package/dist/_chunks/relations-DuoUwyJr.js.map +0 -1
- package/dist/_chunks/usePrev-B9w_-eYc.js.map +0 -1
- package/dist/_chunks/usePrev-DH6iah0A.mjs +0 -16
- package/dist/_chunks/usePrev-DH6iah0A.mjs.map +0 -1
- package/strapi-server.js +0 -3
package/dist/server/index.js
CHANGED
@@ -33,10 +33,10 @@ const isNil__default = /* @__PURE__ */ _interopDefault(isNil);
|
|
33
33
|
const ___default = /* @__PURE__ */ _interopDefault(_);
|
34
34
|
const qs__default = /* @__PURE__ */ _interopDefault(qs);
|
35
35
|
const slugify__default = /* @__PURE__ */ _interopDefault(slugify);
|
36
|
-
const getService$
|
36
|
+
const getService$2 = (name) => {
|
37
37
|
return strapi.plugin("content-manager").service(name);
|
38
38
|
};
|
39
|
-
function getService(strapi2, name) {
|
39
|
+
function getService$1(strapi2, name) {
|
40
40
|
return strapi2.service(`plugin::content-manager.${name}`);
|
41
41
|
}
|
42
42
|
const historyRestoreVersionSchema = yup__namespace.object().shape({
|
@@ -72,7 +72,7 @@ const createHistoryVersionController = ({ strapi: strapi2 }) => {
|
|
72
72
|
if (!isSingleType && (!contentTypeUid || !ctx.query.documentId)) {
|
73
73
|
throw new strapiUtils.errors.ForbiddenError("contentType and documentId are required");
|
74
74
|
}
|
75
|
-
const permissionChecker2 = getService$
|
75
|
+
const permissionChecker2 = getService$2("permission-checker").create({
|
76
76
|
userAbility: ctx.state.userAbility,
|
77
77
|
model: ctx.query.contentType
|
78
78
|
});
|
@@ -80,7 +80,7 @@ const createHistoryVersionController = ({ strapi: strapi2 }) => {
|
|
80
80
|
return ctx.forbidden();
|
81
81
|
}
|
82
82
|
const query = await permissionChecker2.sanitizeQuery(ctx.query);
|
83
|
-
const { results, pagination } = await getService(strapi2, "history").findVersionsPage({
|
83
|
+
const { results, pagination } = await getService$1(strapi2, "history").findVersionsPage({
|
84
84
|
query: {
|
85
85
|
...query,
|
86
86
|
...getValidPagination({ page: query.page, pageSize: query.pageSize })
|
@@ -105,14 +105,14 @@ const createHistoryVersionController = ({ strapi: strapi2 }) => {
|
|
105
105
|
async restoreVersion(ctx) {
|
106
106
|
const request = ctx.request;
|
107
107
|
await validateRestoreVersion(request.body, "contentType is required");
|
108
|
-
const permissionChecker2 = getService$
|
108
|
+
const permissionChecker2 = getService$2("permission-checker").create({
|
109
109
|
userAbility: ctx.state.userAbility,
|
110
110
|
model: request.body.contentType
|
111
111
|
});
|
112
112
|
if (permissionChecker2.cannot.update()) {
|
113
113
|
throw new strapiUtils.errors.ForbiddenError();
|
114
114
|
}
|
115
|
-
const restoredDocument = await getService(strapi2, "history").restoreVersion(
|
115
|
+
const restoredDocument = await getService$1(strapi2, "history").restoreVersion(
|
116
116
|
request.params.versionId
|
117
117
|
);
|
118
118
|
return {
|
@@ -121,7 +121,7 @@ const createHistoryVersionController = ({ strapi: strapi2 }) => {
|
|
121
121
|
}
|
122
122
|
};
|
123
123
|
};
|
124
|
-
const controllers$
|
124
|
+
const controllers$2 = {
|
125
125
|
"history-version": createHistoryVersionController
|
126
126
|
/**
|
127
127
|
* Casting is needed because the types aren't aware that Strapi supports
|
@@ -199,7 +199,9 @@ const createServiceUtils = ({ strapi: strapi2 }) => {
|
|
199
199
|
return strapi2.db.query("plugin::upload.file").findOne({ where: { id: versionRelationData.id } });
|
200
200
|
};
|
201
201
|
const localesService = strapi2.plugin("i18n")?.service("locales");
|
202
|
+
const i18nContentTypeService = strapi2.plugin("i18n")?.service("content-types");
|
202
203
|
const getDefaultLocale = async () => localesService ? localesService.getDefaultLocale() : null;
|
204
|
+
const isLocalizedContentType = (model) => i18nContentTypeService ? i18nContentTypeService.isLocalizedContentType(model) : false;
|
203
205
|
const getLocaleDictionary = async () => {
|
204
206
|
if (!localesService)
|
205
207
|
return {};
|
@@ -226,9 +228,21 @@ const createServiceUtils = ({ strapi: strapi2 }) => {
|
|
226
228
|
const meta = await documentMetadataService.getMetadata(contentTypeUid, document);
|
227
229
|
return documentMetadataService.getStatus(document, meta.availableStatus);
|
228
230
|
};
|
229
|
-
const
|
231
|
+
const getComponentFields = (componentUID) => {
|
232
|
+
return Object.entries(strapi2.getModel(componentUID).attributes).reduce(
|
233
|
+
(fieldsAcc, [key, attribute]) => {
|
234
|
+
if (!["relation", "media", "component", "dynamiczone"].includes(attribute.type)) {
|
235
|
+
fieldsAcc.push(key);
|
236
|
+
}
|
237
|
+
return fieldsAcc;
|
238
|
+
},
|
239
|
+
[]
|
240
|
+
);
|
241
|
+
};
|
242
|
+
const getDeepPopulate2 = (uid2, useDatabaseSyntax = false) => {
|
230
243
|
const model = strapi2.getModel(uid2);
|
231
244
|
const attributes = Object.entries(model.attributes);
|
245
|
+
const fieldSelector = useDatabaseSyntax ? "select" : "fields";
|
232
246
|
return attributes.reduce((acc, [attributeName, attribute]) => {
|
233
247
|
switch (attribute.type) {
|
234
248
|
case "relation": {
|
@@ -238,23 +252,29 @@ const createServiceUtils = ({ strapi: strapi2 }) => {
|
|
238
252
|
}
|
239
253
|
const isVisible2 = strapiUtils.contentTypes.isVisibleAttribute(model, attributeName);
|
240
254
|
if (isVisible2) {
|
241
|
-
acc[attributeName] = {
|
255
|
+
acc[attributeName] = { [fieldSelector]: ["documentId", "locale", "publishedAt"] };
|
242
256
|
}
|
243
257
|
break;
|
244
258
|
}
|
245
259
|
case "media": {
|
246
|
-
acc[attributeName] = {
|
260
|
+
acc[attributeName] = { [fieldSelector]: ["id"] };
|
247
261
|
break;
|
248
262
|
}
|
249
263
|
case "component": {
|
250
264
|
const populate = getDeepPopulate2(attribute.component);
|
251
|
-
acc[attributeName] = {
|
265
|
+
acc[attributeName] = {
|
266
|
+
populate,
|
267
|
+
[fieldSelector]: getComponentFields(attribute.component)
|
268
|
+
};
|
252
269
|
break;
|
253
270
|
}
|
254
271
|
case "dynamiczone": {
|
255
272
|
const populatedComponents = (attribute.components || []).reduce(
|
256
273
|
(acc2, componentUID) => {
|
257
|
-
acc2[componentUID] = {
|
274
|
+
acc2[componentUID] = {
|
275
|
+
populate: getDeepPopulate2(componentUID),
|
276
|
+
[fieldSelector]: getComponentFields(componentUID)
|
277
|
+
};
|
258
278
|
return acc2;
|
259
279
|
},
|
260
280
|
{}
|
@@ -316,6 +336,7 @@ const createServiceUtils = ({ strapi: strapi2 }) => {
|
|
316
336
|
getRelationRestoreValue,
|
317
337
|
getMediaRestoreValue,
|
318
338
|
getDefaultLocale,
|
339
|
+
isLocalizedContentType,
|
319
340
|
getLocaleDictionary,
|
320
341
|
getRetentionDays,
|
321
342
|
getVersionStatus,
|
@@ -338,7 +359,13 @@ const createHistoryService = ({ strapi: strapi2 }) => {
|
|
338
359
|
});
|
339
360
|
},
|
340
361
|
async findVersionsPage(params) {
|
341
|
-
const
|
362
|
+
const model = strapi2.getModel(params.query.contentType);
|
363
|
+
const isLocalizedContentType = serviceUtils.isLocalizedContentType(model);
|
364
|
+
const defaultLocale = await serviceUtils.getDefaultLocale();
|
365
|
+
let locale = null;
|
366
|
+
if (isLocalizedContentType) {
|
367
|
+
locale = params.query.locale || defaultLocale;
|
368
|
+
}
|
342
369
|
const [{ results, pagination }, localeDictionary] = await Promise.all([
|
343
370
|
query.findPage({
|
344
371
|
...params.query,
|
@@ -360,7 +387,7 @@ const createHistoryService = ({ strapi: strapi2 }) => {
|
|
360
387
|
const attributeValue = entry.data[attributeKey];
|
361
388
|
const attributeValues = Array.isArray(attributeValue) ? attributeValue : [attributeValue];
|
362
389
|
if (attributeSchema.type === "media") {
|
363
|
-
const permissionChecker2 = getService$
|
390
|
+
const permissionChecker2 = getService$2("permission-checker").create({
|
364
391
|
userAbility: params.state.userAbility,
|
365
392
|
model: "plugin::upload.file"
|
366
393
|
});
|
@@ -383,7 +410,12 @@ const createHistoryService = ({ strapi: strapi2 }) => {
|
|
383
410
|
if (userToPopulate == null) {
|
384
411
|
return null;
|
385
412
|
}
|
386
|
-
return strapi2.query("admin::user").findOne({
|
413
|
+
return strapi2.query("admin::user").findOne({
|
414
|
+
where: {
|
415
|
+
...userToPopulate.id ? { id: userToPopulate.id } : {},
|
416
|
+
...userToPopulate.documentId ? { documentId: userToPopulate.documentId } : {}
|
417
|
+
}
|
418
|
+
});
|
387
419
|
})
|
388
420
|
);
|
389
421
|
return {
|
@@ -396,7 +428,7 @@ const createHistoryService = ({ strapi: strapi2 }) => {
|
|
396
428
|
[attributeKey]: adminUsers
|
397
429
|
};
|
398
430
|
}
|
399
|
-
const permissionChecker2 = getService$
|
431
|
+
const permissionChecker2 = getService$2("permission-checker").create({
|
400
432
|
userAbility: params.state.userAbility,
|
401
433
|
model: attributeSchema.target
|
402
434
|
});
|
@@ -494,6 +526,42 @@ const createHistoryService = ({ strapi: strapi2 }) => {
|
|
494
526
|
}
|
495
527
|
};
|
496
528
|
};
|
529
|
+
const shouldCreateHistoryVersion = (context) => {
|
530
|
+
if (!strapi.requestContext.get()?.request.url.startsWith("/content-manager")) {
|
531
|
+
return false;
|
532
|
+
}
|
533
|
+
if (context.action !== "create" && context.action !== "update" && context.action !== "clone" && context.action !== "publish" && context.action !== "unpublish" && context.action !== "discardDraft") {
|
534
|
+
return false;
|
535
|
+
}
|
536
|
+
if (context.action === "update" && strapi.requestContext.get()?.request.url.endsWith("/actions/publish")) {
|
537
|
+
return false;
|
538
|
+
}
|
539
|
+
if (!context.contentType.uid.startsWith("api::")) {
|
540
|
+
return false;
|
541
|
+
}
|
542
|
+
return true;
|
543
|
+
};
|
544
|
+
const getSchemas = (uid2) => {
|
545
|
+
const attributesSchema = strapi.getModel(uid2).attributes;
|
546
|
+
const componentsSchemas = Object.keys(attributesSchema).reduce(
|
547
|
+
(currentComponentSchemas, key) => {
|
548
|
+
const fieldSchema = attributesSchema[key];
|
549
|
+
if (fieldSchema.type === "component") {
|
550
|
+
const componentSchema = strapi.getModel(fieldSchema.component).attributes;
|
551
|
+
return {
|
552
|
+
...currentComponentSchemas,
|
553
|
+
[fieldSchema.component]: componentSchema
|
554
|
+
};
|
555
|
+
}
|
556
|
+
return currentComponentSchemas;
|
557
|
+
},
|
558
|
+
{}
|
559
|
+
);
|
560
|
+
return {
|
561
|
+
schema: fp.omit(FIELDS_TO_IGNORE, attributesSchema),
|
562
|
+
componentsSchemas
|
563
|
+
};
|
564
|
+
};
|
497
565
|
const createLifecyclesService = ({ strapi: strapi2 }) => {
|
498
566
|
const state = {
|
499
567
|
deleteExpiredJob: null,
|
@@ -506,76 +574,62 @@ const createLifecyclesService = ({ strapi: strapi2 }) => {
|
|
506
574
|
return;
|
507
575
|
}
|
508
576
|
strapi2.documents.use(async (context, next) => {
|
509
|
-
if (!strapi2.requestContext.get()?.request.url.startsWith("/content-manager")) {
|
510
|
-
return next();
|
511
|
-
}
|
512
|
-
if (context.action !== "create" && context.action !== "update" && context.action !== "clone" && context.action !== "publish" && context.action !== "unpublish" && context.action !== "discardDraft") {
|
513
|
-
return next();
|
514
|
-
}
|
515
|
-
if (context.action === "update" && strapi2.requestContext.get()?.request.url.endsWith("/actions/publish")) {
|
516
|
-
return next();
|
517
|
-
}
|
518
|
-
const contentTypeUid = context.contentType.uid;
|
519
|
-
if (!contentTypeUid.startsWith("api::")) {
|
520
|
-
return next();
|
521
|
-
}
|
522
577
|
const result = await next();
|
523
|
-
|
524
|
-
|
525
|
-
|
526
|
-
|
578
|
+
if (!shouldCreateHistoryVersion(context)) {
|
579
|
+
return result;
|
580
|
+
}
|
581
|
+
const documentId = context.action === "create" || context.action === "clone" ? result.documentId : context.params.documentId;
|
527
582
|
const defaultLocale = await serviceUtils.getDefaultLocale();
|
528
|
-
const
|
529
|
-
if (
|
530
|
-
|
531
|
-
"[Content manager history middleware]: An array of locales was provided, but only a single locale is supported for the findOne operation."
|
532
|
-
);
|
533
|
-
return next();
|
583
|
+
const locales = fp.castArray(context.params?.locale || defaultLocale);
|
584
|
+
if (!locales.length) {
|
585
|
+
return result;
|
534
586
|
}
|
535
|
-
const
|
536
|
-
|
537
|
-
|
538
|
-
|
587
|
+
const uid2 = context.contentType.uid;
|
588
|
+
const schemas = getSchemas(uid2);
|
589
|
+
const model = strapi2.getModel(uid2);
|
590
|
+
const isLocalizedContentType = serviceUtils.isLocalizedContentType(model);
|
591
|
+
const localeEntries = await strapi2.db.query(uid2).findMany({
|
592
|
+
where: {
|
593
|
+
documentId,
|
594
|
+
...isLocalizedContentType ? { locale: { $in: locales } } : {},
|
595
|
+
...strapiUtils.contentTypes.hasDraftAndPublish(strapi2.contentTypes[uid2]) ? { publishedAt: null } : {}
|
596
|
+
},
|
597
|
+
populate: serviceUtils.getDeepPopulate(
|
598
|
+
uid2,
|
599
|
+
true
|
600
|
+
/* use database syntax */
|
601
|
+
)
|
539
602
|
});
|
540
|
-
const status = await serviceUtils.getVersionStatus(contentTypeUid, document);
|
541
|
-
const attributesSchema = strapi2.getModel(contentTypeUid).attributes;
|
542
|
-
const componentsSchemas = Object.keys(
|
543
|
-
attributesSchema
|
544
|
-
).reduce((currentComponentSchemas, key) => {
|
545
|
-
const fieldSchema = attributesSchema[key];
|
546
|
-
if (fieldSchema.type === "component") {
|
547
|
-
const componentSchema = strapi2.getModel(fieldSchema.component).attributes;
|
548
|
-
return {
|
549
|
-
...currentComponentSchemas,
|
550
|
-
[fieldSchema.component]: componentSchema
|
551
|
-
};
|
552
|
-
}
|
553
|
-
return currentComponentSchemas;
|
554
|
-
}, {});
|
555
603
|
await strapi2.db.transaction(async ({ onCommit }) => {
|
556
|
-
onCommit(() => {
|
557
|
-
|
558
|
-
|
559
|
-
|
560
|
-
|
561
|
-
|
562
|
-
|
563
|
-
|
564
|
-
|
565
|
-
|
604
|
+
onCommit(async () => {
|
605
|
+
for (const entry of localeEntries) {
|
606
|
+
const status = await serviceUtils.getVersionStatus(uid2, entry);
|
607
|
+
await getService$1(strapi2, "history").createVersion({
|
608
|
+
contentType: uid2,
|
609
|
+
data: fp.omit(FIELDS_TO_IGNORE, entry),
|
610
|
+
relatedDocumentId: documentId,
|
611
|
+
locale: entry.locale,
|
612
|
+
status,
|
613
|
+
...schemas
|
614
|
+
});
|
615
|
+
}
|
566
616
|
});
|
567
617
|
});
|
568
618
|
return result;
|
569
619
|
});
|
570
|
-
state.deleteExpiredJob = nodeSchedule.scheduleJob("0 0 * * *", () => {
|
620
|
+
state.deleteExpiredJob = nodeSchedule.scheduleJob("historyDaily", "0 0 * * *", () => {
|
571
621
|
const retentionDaysInMilliseconds = serviceUtils.getRetentionDays() * 24 * 60 * 60 * 1e3;
|
572
622
|
const expirationDate = new Date(Date.now() - retentionDaysInMilliseconds);
|
573
623
|
strapi2.db.query(HISTORY_VERSION_UID).deleteMany({
|
574
624
|
where: {
|
575
625
|
created_at: {
|
576
|
-
$lt: expirationDate
|
626
|
+
$lt: expirationDate
|
577
627
|
}
|
578
628
|
}
|
629
|
+
}).catch((error) => {
|
630
|
+
if (error instanceof Error) {
|
631
|
+
strapi2.log.error("Error deleting expired history versions", error.message);
|
632
|
+
}
|
579
633
|
});
|
580
634
|
});
|
581
635
|
state.isInitialized = true;
|
@@ -587,17 +641,17 @@ const createLifecyclesService = ({ strapi: strapi2 }) => {
|
|
587
641
|
}
|
588
642
|
};
|
589
643
|
};
|
590
|
-
const services$
|
644
|
+
const services$2 = {
|
591
645
|
history: createHistoryService,
|
592
646
|
lifecycles: createLifecyclesService
|
593
647
|
};
|
594
|
-
const info = { pluginName: "content-manager", type: "admin" };
|
648
|
+
const info$1 = { pluginName: "content-manager", type: "admin" };
|
595
649
|
const historyVersionRouter = {
|
596
650
|
type: "admin",
|
597
651
|
routes: [
|
598
652
|
{
|
599
653
|
method: "GET",
|
600
|
-
info,
|
654
|
+
info: info$1,
|
601
655
|
path: "/history-versions",
|
602
656
|
handler: "history-version.findMany",
|
603
657
|
config: {
|
@@ -606,7 +660,7 @@ const historyVersionRouter = {
|
|
606
660
|
},
|
607
661
|
{
|
608
662
|
method: "PUT",
|
609
|
-
info,
|
663
|
+
info: info$1,
|
610
664
|
path: "/history-versions/:versionId/restore",
|
611
665
|
handler: "history-version.restoreVersion",
|
612
666
|
config: {
|
@@ -615,7 +669,7 @@ const historyVersionRouter = {
|
|
615
669
|
}
|
616
670
|
]
|
617
671
|
};
|
618
|
-
const routes$
|
672
|
+
const routes$2 = {
|
619
673
|
"history-version": historyVersionRouter
|
620
674
|
};
|
621
675
|
const historyVersion = {
|
@@ -662,21 +716,21 @@ const historyVersion = {
|
|
662
716
|
}
|
663
717
|
}
|
664
718
|
};
|
665
|
-
const getFeature = () => {
|
719
|
+
const getFeature$1 = () => {
|
666
720
|
if (strapi.ee.features.isEnabled("cms-content-history")) {
|
667
721
|
return {
|
668
722
|
register({ strapi: strapi2 }) {
|
669
723
|
strapi2.get("models").add(historyVersion);
|
670
724
|
},
|
671
725
|
bootstrap({ strapi: strapi2 }) {
|
672
|
-
getService(strapi2, "lifecycles").bootstrap();
|
726
|
+
getService$1(strapi2, "lifecycles").bootstrap();
|
673
727
|
},
|
674
728
|
destroy({ strapi: strapi2 }) {
|
675
|
-
getService(strapi2, "lifecycles").destroy();
|
729
|
+
getService$1(strapi2, "lifecycles").destroy();
|
676
730
|
},
|
677
|
-
controllers: controllers$
|
678
|
-
services: services$
|
679
|
-
routes: routes$
|
731
|
+
controllers: controllers$2,
|
732
|
+
services: services$2,
|
733
|
+
routes: routes$2
|
680
734
|
};
|
681
735
|
}
|
682
736
|
return {
|
@@ -685,7 +739,7 @@ const getFeature = () => {
|
|
685
739
|
}
|
686
740
|
};
|
687
741
|
};
|
688
|
-
const history = getFeature();
|
742
|
+
const history = getFeature$1();
|
689
743
|
const register = async ({ strapi: strapi2 }) => {
|
690
744
|
await history.register?.({ strapi: strapi2 });
|
691
745
|
};
|
@@ -693,15 +747,165 @@ const ALLOWED_WEBHOOK_EVENTS = {
|
|
693
747
|
ENTRY_PUBLISH: "entry.publish",
|
694
748
|
ENTRY_UNPUBLISH: "entry.unpublish"
|
695
749
|
};
|
750
|
+
const FEATURE_ID = "preview";
|
751
|
+
const info = { pluginName: "content-manager", type: "admin" };
|
752
|
+
const previewRouter = {
|
753
|
+
type: "admin",
|
754
|
+
routes: [
|
755
|
+
{
|
756
|
+
method: "GET",
|
757
|
+
info,
|
758
|
+
path: "/preview/url/:contentType",
|
759
|
+
handler: "preview.getPreviewUrl",
|
760
|
+
config: {
|
761
|
+
policies: ["admin::isAuthenticatedAdmin"]
|
762
|
+
}
|
763
|
+
}
|
764
|
+
]
|
765
|
+
};
|
766
|
+
const routes$1 = {
|
767
|
+
preview: previewRouter
|
768
|
+
};
|
769
|
+
function getService(strapi2, name) {
|
770
|
+
return strapi2.service(`plugin::content-manager.${name}`);
|
771
|
+
}
|
772
|
+
const getPreviewUrlSchema = yup__namespace.object().shape({
|
773
|
+
// Will be undefined for single types
|
774
|
+
documentId: yup__namespace.string(),
|
775
|
+
locale: yup__namespace.string().nullable(),
|
776
|
+
status: yup__namespace.string()
|
777
|
+
}).required();
|
778
|
+
const validatePreviewUrl = async (strapi2, uid2, params) => {
|
779
|
+
await strapiUtils.validateYupSchema(getPreviewUrlSchema)(params);
|
780
|
+
const newParams = fp.pick(["documentId", "locale", "status"], params);
|
781
|
+
const model = strapi2.getModel(uid2);
|
782
|
+
if (!model || model.modelType !== "contentType") {
|
783
|
+
throw new strapiUtils.errors.ValidationError("Invalid content type");
|
784
|
+
}
|
785
|
+
const isSingleType = model?.kind === "singleType";
|
786
|
+
if (!isSingleType && !params.documentId) {
|
787
|
+
throw new strapiUtils.errors.ValidationError("documentId is required for Collection Types");
|
788
|
+
}
|
789
|
+
if (isSingleType) {
|
790
|
+
const doc = await strapi2.documents(uid2).findFirst();
|
791
|
+
if (!doc) {
|
792
|
+
throw new strapiUtils.errors.NotFoundError("Document not found");
|
793
|
+
}
|
794
|
+
newParams.documentId = doc?.documentId;
|
795
|
+
}
|
796
|
+
return newParams;
|
797
|
+
};
|
798
|
+
const createPreviewController = () => {
|
799
|
+
return {
|
800
|
+
/**
|
801
|
+
* Transforms an entry into a preview URL, so that it can be previewed
|
802
|
+
* in the Content Manager.
|
803
|
+
*/
|
804
|
+
async getPreviewUrl(ctx) {
|
805
|
+
const uid2 = ctx.params.contentType;
|
806
|
+
const query = ctx.request.query;
|
807
|
+
const params = await validatePreviewUrl(strapi, uid2, query);
|
808
|
+
const previewService = getService(strapi, "preview");
|
809
|
+
const url = await previewService.getPreviewUrl(uid2, params);
|
810
|
+
if (!url) {
|
811
|
+
ctx.status = 204;
|
812
|
+
}
|
813
|
+
return {
|
814
|
+
data: { url }
|
815
|
+
};
|
816
|
+
}
|
817
|
+
};
|
818
|
+
};
|
819
|
+
const controllers$1 = {
|
820
|
+
preview: createPreviewController
|
821
|
+
/**
|
822
|
+
* Casting is needed because the types aren't aware that Strapi supports
|
823
|
+
* passing a controller factory as the value, instead of a controller object directly
|
824
|
+
*/
|
825
|
+
};
|
826
|
+
const createPreviewService = ({ strapi: strapi2 }) => {
|
827
|
+
const config = getService(strapi2, "preview-config");
|
828
|
+
return {
|
829
|
+
async getPreviewUrl(uid2, params) {
|
830
|
+
const handler = config.getPreviewHandler();
|
831
|
+
try {
|
832
|
+
return handler(uid2, params);
|
833
|
+
} catch (error) {
|
834
|
+
strapi2.log.error(`Failed to get preview URL: ${error}`);
|
835
|
+
throw new strapiUtils.errors.ApplicationError("Failed to get preview URL");
|
836
|
+
}
|
837
|
+
return;
|
838
|
+
}
|
839
|
+
};
|
840
|
+
};
|
841
|
+
const createPreviewConfigService = ({ strapi: strapi2 }) => {
|
842
|
+
return {
|
843
|
+
isEnabled() {
|
844
|
+
const config = strapi2.config.get("admin.preview");
|
845
|
+
if (!config) {
|
846
|
+
return false;
|
847
|
+
}
|
848
|
+
return config?.enabled ?? true;
|
849
|
+
},
|
850
|
+
/**
|
851
|
+
* Validate if the configuration is valid
|
852
|
+
*/
|
853
|
+
validate() {
|
854
|
+
if (!this.isEnabled()) {
|
855
|
+
return;
|
856
|
+
}
|
857
|
+
const handler = this.getPreviewHandler();
|
858
|
+
if (typeof handler !== "function") {
|
859
|
+
throw new strapiUtils.errors.ValidationError(
|
860
|
+
"Preview configuration is invalid. Handler must be a function"
|
861
|
+
);
|
862
|
+
}
|
863
|
+
},
|
864
|
+
/**
|
865
|
+
* Utility to get the preview handler from the configuration
|
866
|
+
*/
|
867
|
+
getPreviewHandler() {
|
868
|
+
const config = strapi2.config.get("admin.preview");
|
869
|
+
const emptyHandler = () => {
|
870
|
+
return void 0;
|
871
|
+
};
|
872
|
+
if (!this.isEnabled()) {
|
873
|
+
return emptyHandler;
|
874
|
+
}
|
875
|
+
return config?.config?.handler || emptyHandler;
|
876
|
+
}
|
877
|
+
};
|
878
|
+
};
|
879
|
+
const services$1 = {
|
880
|
+
preview: createPreviewService,
|
881
|
+
"preview-config": createPreviewConfigService
|
882
|
+
};
|
883
|
+
const getFeature = () => {
|
884
|
+
if (!strapi.features.future.isEnabled(FEATURE_ID)) {
|
885
|
+
return {};
|
886
|
+
}
|
887
|
+
return {
|
888
|
+
bootstrap() {
|
889
|
+
console.log("Bootstrapping preview server");
|
890
|
+
const config = getService(strapi, "preview-config");
|
891
|
+
config.validate();
|
892
|
+
},
|
893
|
+
routes: routes$1,
|
894
|
+
controllers: controllers$1,
|
895
|
+
services: services$1
|
896
|
+
};
|
897
|
+
};
|
898
|
+
const preview = getFeature();
|
696
899
|
const bootstrap = async () => {
|
697
900
|
Object.entries(ALLOWED_WEBHOOK_EVENTS).forEach(([key, value]) => {
|
698
901
|
strapi.get("webhookStore").addAllowedEvent(key, value);
|
699
902
|
});
|
700
|
-
getService$
|
701
|
-
await getService$
|
702
|
-
await getService$
|
703
|
-
await getService$
|
903
|
+
getService$2("field-sizes").setCustomFieldInputSizes();
|
904
|
+
await getService$2("components").syncConfigurations();
|
905
|
+
await getService$2("content-types").syncConfigurations();
|
906
|
+
await getService$2("permission").registerPermissions();
|
704
907
|
await history.bootstrap?.({ strapi });
|
908
|
+
await preview.bootstrap?.({ strapi });
|
705
909
|
};
|
706
910
|
const destroy = async ({ strapi: strapi2 }) => {
|
707
911
|
await history.destroy?.({ strapi: strapi2 });
|
@@ -1191,7 +1395,8 @@ const admin = {
|
|
1191
1395
|
};
|
1192
1396
|
const routes = {
|
1193
1397
|
admin,
|
1194
|
-
...history.routes ? history.routes : {}
|
1398
|
+
...history.routes ? history.routes : {},
|
1399
|
+
...preview.routes ? preview.routes : {}
|
1195
1400
|
};
|
1196
1401
|
const hasPermissionsSchema = strapiUtils.yup.object({
|
1197
1402
|
actions: strapiUtils.yup.array().of(strapiUtils.yup.string()),
|
@@ -1202,6 +1407,11 @@ const { createPolicy } = strapiUtils.policy;
|
|
1202
1407
|
const hasPermissions = createPolicy({
|
1203
1408
|
name: "plugin::content-manager.hasPermissions",
|
1204
1409
|
validator: validateHasPermissionsInput,
|
1410
|
+
/**
|
1411
|
+
* NOTE: Action aliases are currently not checked at this level (policy).
|
1412
|
+
* This is currently the intended behavior to avoid changing the behavior of API related permissions.
|
1413
|
+
* If you want to add support for it, please create a dedicated RFC with a list of potential side effect this could have.
|
1414
|
+
*/
|
1205
1415
|
handler(ctx, config = {}) {
|
1206
1416
|
const { actions = [], hasAtLeastOne = false } = config;
|
1207
1417
|
const { userAbility } = ctx.state;
|
@@ -1443,7 +1653,7 @@ const createMetadasSchema = (schema) => {
|
|
1443
1653
|
if (!value) {
|
1444
1654
|
return strapiUtils.yup.string();
|
1445
1655
|
}
|
1446
|
-
const targetSchema = getService$
|
1656
|
+
const targetSchema = getService$2("content-types").findContentType(
|
1447
1657
|
schema.attributes[key].targetModel
|
1448
1658
|
);
|
1449
1659
|
if (!targetSchema) {
|
@@ -1595,9 +1805,11 @@ const multipleLocaleSchema = strapiUtils.yup.lazy(
|
|
1595
1805
|
(value) => Array.isArray(value) ? strapiUtils.yup.array().of(singleLocaleSchema.required()) : singleLocaleSchema
|
1596
1806
|
);
|
1597
1807
|
const statusSchema = strapiUtils.yup.mixed().oneOf(["draft", "published"], "Invalid status");
|
1598
|
-
const getDocumentLocaleAndStatus = async (request, opts = { allowMultipleLocales: false }) => {
|
1808
|
+
const getDocumentLocaleAndStatus = async (request, model, opts = { allowMultipleLocales: false }) => {
|
1599
1809
|
const { allowMultipleLocales } = opts;
|
1600
|
-
const { locale, status, ...rest } = request || {};
|
1810
|
+
const { locale, status: providedStatus, ...rest } = request || {};
|
1811
|
+
const defaultStatus = strapiUtils.contentTypes.hasDraftAndPublish(strapi.getModel(model)) ? void 0 : "published";
|
1812
|
+
const status = providedStatus !== void 0 ? providedStatus : defaultStatus;
|
1601
1813
|
const schema = strapiUtils.yup.object().shape({
|
1602
1814
|
locale: allowMultipleLocales ? multipleLocaleSchema : singleLocaleSchema,
|
1603
1815
|
status: statusSchema
|
@@ -1610,7 +1822,7 @@ const getDocumentLocaleAndStatus = async (request, opts = { allowMultipleLocales
|
|
1610
1822
|
}
|
1611
1823
|
};
|
1612
1824
|
const formatDocumentWithMetadata = async (permissionChecker2, uid2, document, opts = {}) => {
|
1613
|
-
const documentMetadata2 = getService$
|
1825
|
+
const documentMetadata2 = getService$2("document-metadata");
|
1614
1826
|
const serviceOutput = await documentMetadata2.formatDocumentWithMetadata(uid2, document, opts);
|
1615
1827
|
let {
|
1616
1828
|
meta: { availableLocales, availableStatus }
|
@@ -1636,8 +1848,8 @@ const createDocument = async (ctx, opts) => {
|
|
1636
1848
|
const { userAbility, user } = ctx.state;
|
1637
1849
|
const { model } = ctx.params;
|
1638
1850
|
const { body } = ctx.request;
|
1639
|
-
const documentManager2 = getService$
|
1640
|
-
const permissionChecker2 = getService$
|
1851
|
+
const documentManager2 = getService$2("document-manager");
|
1852
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
1641
1853
|
if (permissionChecker2.cannot.create()) {
|
1642
1854
|
throw new strapiUtils.errors.ForbiddenError();
|
1643
1855
|
}
|
@@ -1645,7 +1857,7 @@ const createDocument = async (ctx, opts) => {
|
|
1645
1857
|
const setCreator = strapiUtils.setCreatorFields({ user });
|
1646
1858
|
const sanitizeFn = strapiUtils.async.pipe(pickPermittedFields, setCreator);
|
1647
1859
|
const sanitizedBody = await sanitizeFn(body);
|
1648
|
-
const { locale, status
|
1860
|
+
const { locale, status } = await getDocumentLocaleAndStatus(body, model);
|
1649
1861
|
return documentManager2.create(model, {
|
1650
1862
|
data: sanitizedBody,
|
1651
1863
|
locale,
|
@@ -1657,14 +1869,14 @@ const updateDocument = async (ctx, opts) => {
|
|
1657
1869
|
const { userAbility, user } = ctx.state;
|
1658
1870
|
const { id, model } = ctx.params;
|
1659
1871
|
const { body } = ctx.request;
|
1660
|
-
const documentManager2 = getService$
|
1661
|
-
const permissionChecker2 = getService$
|
1872
|
+
const documentManager2 = getService$2("document-manager");
|
1873
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
1662
1874
|
if (permissionChecker2.cannot.update()) {
|
1663
1875
|
throw new strapiUtils.errors.ForbiddenError();
|
1664
1876
|
}
|
1665
1877
|
const permissionQuery = await permissionChecker2.sanitizedQuery.update(ctx.query);
|
1666
|
-
const populate = await getService$
|
1667
|
-
const { locale } = await getDocumentLocaleAndStatus(body);
|
1878
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
|
1879
|
+
const { locale } = await getDocumentLocaleAndStatus(body, model);
|
1668
1880
|
const [documentVersion, documentExists] = await Promise.all([
|
1669
1881
|
documentManager2.findOne(id, model, { populate, locale, status: "draft" }),
|
1670
1882
|
documentManager2.exists(model, id)
|
@@ -1680,7 +1892,7 @@ const updateDocument = async (ctx, opts) => {
|
|
1680
1892
|
throw new strapiUtils.errors.ForbiddenError();
|
1681
1893
|
}
|
1682
1894
|
const pickPermittedFields = documentVersion ? permissionChecker2.sanitizeUpdateInput(documentVersion) : permissionChecker2.sanitizeCreateInput;
|
1683
|
-
const setCreator = strapiUtils.setCreatorFields({ user, isEdition: true });
|
1895
|
+
const setCreator = documentVersion ? strapiUtils.setCreatorFields({ user, isEdition: true }) : strapiUtils.setCreatorFields({ user });
|
1684
1896
|
const sanitizeFn = strapiUtils.async.pipe(pickPermittedFields, setCreator);
|
1685
1897
|
const sanitizedBody = await sanitizeFn(body);
|
1686
1898
|
return documentManager2.update(documentVersion?.documentId || id, model, {
|
@@ -1694,15 +1906,15 @@ const collectionTypes = {
|
|
1694
1906
|
const { userAbility } = ctx.state;
|
1695
1907
|
const { model } = ctx.params;
|
1696
1908
|
const { query } = ctx.request;
|
1697
|
-
const documentMetadata2 = getService$
|
1698
|
-
const documentManager2 = getService$
|
1699
|
-
const permissionChecker2 = getService$
|
1909
|
+
const documentMetadata2 = getService$2("document-metadata");
|
1910
|
+
const documentManager2 = getService$2("document-manager");
|
1911
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
1700
1912
|
if (permissionChecker2.cannot.read()) {
|
1701
1913
|
return ctx.forbidden();
|
1702
1914
|
}
|
1703
1915
|
const permissionQuery = await permissionChecker2.sanitizedQuery.read(query);
|
1704
|
-
const populate = await getService$
|
1705
|
-
const { locale, status } = await getDocumentLocaleAndStatus(query);
|
1916
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(1).countRelations({ toOne: false, toMany: true }).build();
|
1917
|
+
const { locale, status } = await getDocumentLocaleAndStatus(query, model);
|
1706
1918
|
const { results: documents, pagination } = await documentManager2.findPage(
|
1707
1919
|
{ ...permissionQuery, populate, locale, status },
|
1708
1920
|
model
|
@@ -1730,14 +1942,14 @@ const collectionTypes = {
|
|
1730
1942
|
async findOne(ctx) {
|
1731
1943
|
const { userAbility } = ctx.state;
|
1732
1944
|
const { model, id } = ctx.params;
|
1733
|
-
const documentManager2 = getService$
|
1734
|
-
const permissionChecker2 = getService$
|
1945
|
+
const documentManager2 = getService$2("document-manager");
|
1946
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
1735
1947
|
if (permissionChecker2.cannot.read()) {
|
1736
1948
|
return ctx.forbidden();
|
1737
1949
|
}
|
1738
1950
|
const permissionQuery = await permissionChecker2.sanitizedQuery.read(ctx.query);
|
1739
|
-
const populate = await getService$
|
1740
|
-
const { locale, status
|
1951
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(Infinity).countRelations().build();
|
1952
|
+
const { locale, status } = await getDocumentLocaleAndStatus(ctx.query, model);
|
1741
1953
|
const version = await documentManager2.findOne(id, model, {
|
1742
1954
|
populate,
|
1743
1955
|
locale,
|
@@ -1752,7 +1964,7 @@ const collectionTypes = {
|
|
1752
1964
|
permissionChecker2,
|
1753
1965
|
model,
|
1754
1966
|
// @ts-expect-error TODO: fix
|
1755
|
-
{ id, locale, publishedAt: null },
|
1967
|
+
{ documentId: id, locale, publishedAt: null },
|
1756
1968
|
{ availableLocales: true, availableStatus: false }
|
1757
1969
|
);
|
1758
1970
|
ctx.body = { data: {}, meta };
|
@@ -1767,7 +1979,7 @@ const collectionTypes = {
|
|
1767
1979
|
async create(ctx) {
|
1768
1980
|
const { userAbility } = ctx.state;
|
1769
1981
|
const { model } = ctx.params;
|
1770
|
-
const permissionChecker2 = getService$
|
1982
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
1771
1983
|
const [totalEntries, document] = await Promise.all([
|
1772
1984
|
strapi.db.query(model).count(),
|
1773
1985
|
createDocument(ctx)
|
@@ -1788,7 +2000,7 @@ const collectionTypes = {
|
|
1788
2000
|
async update(ctx) {
|
1789
2001
|
const { userAbility } = ctx.state;
|
1790
2002
|
const { model } = ctx.params;
|
1791
|
-
const permissionChecker2 = getService$
|
2003
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
1792
2004
|
const updatedVersion = await updateDocument(ctx);
|
1793
2005
|
const sanitizedVersion = await permissionChecker2.sanitizeOutput(updatedVersion);
|
1794
2006
|
ctx.body = await formatDocumentWithMetadata(permissionChecker2, model, sanitizedVersion);
|
@@ -1797,14 +2009,14 @@ const collectionTypes = {
|
|
1797
2009
|
const { userAbility, user } = ctx.state;
|
1798
2010
|
const { model, sourceId: id } = ctx.params;
|
1799
2011
|
const { body } = ctx.request;
|
1800
|
-
const documentManager2 = getService$
|
1801
|
-
const permissionChecker2 = getService$
|
2012
|
+
const documentManager2 = getService$2("document-manager");
|
2013
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
1802
2014
|
if (permissionChecker2.cannot.create()) {
|
1803
2015
|
return ctx.forbidden();
|
1804
2016
|
}
|
1805
2017
|
const permissionQuery = await permissionChecker2.sanitizedQuery.create(ctx.query);
|
1806
|
-
const populate = await getService$
|
1807
|
-
const { locale } = await getDocumentLocaleAndStatus(body);
|
2018
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
|
2019
|
+
const { locale } = await getDocumentLocaleAndStatus(body, model);
|
1808
2020
|
const document = await documentManager2.findOne(id, model, {
|
1809
2021
|
populate,
|
1810
2022
|
locale,
|
@@ -1842,14 +2054,14 @@ const collectionTypes = {
|
|
1842
2054
|
async delete(ctx) {
|
1843
2055
|
const { userAbility } = ctx.state;
|
1844
2056
|
const { id, model } = ctx.params;
|
1845
|
-
const documentManager2 = getService$
|
1846
|
-
const permissionChecker2 = getService$
|
2057
|
+
const documentManager2 = getService$2("document-manager");
|
2058
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
1847
2059
|
if (permissionChecker2.cannot.delete()) {
|
1848
2060
|
return ctx.forbidden();
|
1849
2061
|
}
|
1850
2062
|
const permissionQuery = await permissionChecker2.sanitizedQuery.delete(ctx.query);
|
1851
|
-
const populate = await getService$
|
1852
|
-
const { locale } = await getDocumentLocaleAndStatus(ctx.query);
|
2063
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
|
2064
|
+
const { locale } = await getDocumentLocaleAndStatus(ctx.query, model);
|
1853
2065
|
const documentLocales = await documentManager2.findLocales(id, model, { populate, locale });
|
1854
2066
|
if (documentLocales.length === 0) {
|
1855
2067
|
return ctx.notFound();
|
@@ -1870,19 +2082,42 @@ const collectionTypes = {
|
|
1870
2082
|
const { userAbility } = ctx.state;
|
1871
2083
|
const { id, model } = ctx.params;
|
1872
2084
|
const { body } = ctx.request;
|
1873
|
-
const documentManager2 = getService$
|
1874
|
-
const permissionChecker2 = getService$
|
2085
|
+
const documentManager2 = getService$2("document-manager");
|
2086
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
1875
2087
|
if (permissionChecker2.cannot.publish()) {
|
1876
2088
|
return ctx.forbidden();
|
1877
2089
|
}
|
1878
2090
|
const publishedDocument = await strapi.db.transaction(async () => {
|
1879
2091
|
const permissionQuery = await permissionChecker2.sanitizedQuery.publish(ctx.query);
|
1880
|
-
const populate = await getService$
|
1881
|
-
|
2092
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(Infinity).countRelations().build();
|
2093
|
+
let document;
|
2094
|
+
const { locale } = await getDocumentLocaleAndStatus(body, model);
|
2095
|
+
const isCreate = fp.isNil(id);
|
2096
|
+
if (isCreate) {
|
2097
|
+
if (permissionChecker2.cannot.create()) {
|
2098
|
+
throw new strapiUtils.errors.ForbiddenError();
|
2099
|
+
}
|
2100
|
+
document = await createDocument(ctx, { populate });
|
2101
|
+
}
|
2102
|
+
const isUpdate = !isCreate;
|
2103
|
+
if (isUpdate) {
|
2104
|
+
const documentExists = documentManager2.exists(model, id);
|
2105
|
+
if (!documentExists) {
|
2106
|
+
throw new strapiUtils.errors.NotFoundError("Document not found");
|
2107
|
+
}
|
2108
|
+
document = await documentManager2.findOne(id, model, { populate, locale });
|
2109
|
+
if (!document) {
|
2110
|
+
if (permissionChecker2.cannot.create({ locale }) || permissionChecker2.cannot.publish({ locale })) {
|
2111
|
+
throw new strapiUtils.errors.ForbiddenError();
|
2112
|
+
}
|
2113
|
+
document = await updateDocument(ctx);
|
2114
|
+
} else if (permissionChecker2.can.update(document)) {
|
2115
|
+
await updateDocument(ctx);
|
2116
|
+
}
|
2117
|
+
}
|
1882
2118
|
if (permissionChecker2.cannot.publish(document)) {
|
1883
2119
|
throw new strapiUtils.errors.ForbiddenError();
|
1884
2120
|
}
|
1885
|
-
const { locale } = await getDocumentLocaleAndStatus(body);
|
1886
2121
|
const publishResult = await documentManager2.publish(document.documentId, model, {
|
1887
2122
|
locale
|
1888
2123
|
// TODO: Allow setting creator fields on publish
|
@@ -1902,14 +2137,16 @@ const collectionTypes = {
|
|
1902
2137
|
const { body } = ctx.request;
|
1903
2138
|
const { documentIds } = body;
|
1904
2139
|
await validateBulkActionInput(body);
|
1905
|
-
const documentManager2 = getService$
|
1906
|
-
const permissionChecker2 = getService$
|
2140
|
+
const documentManager2 = getService$2("document-manager");
|
2141
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
1907
2142
|
if (permissionChecker2.cannot.publish()) {
|
1908
2143
|
return ctx.forbidden();
|
1909
2144
|
}
|
1910
2145
|
const permissionQuery = await permissionChecker2.sanitizedQuery.publish(ctx.query);
|
1911
|
-
const populate = await getService$
|
1912
|
-
const { locale } = await getDocumentLocaleAndStatus(body, {
|
2146
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(Infinity).countRelations().build();
|
2147
|
+
const { locale } = await getDocumentLocaleAndStatus(body, model, {
|
2148
|
+
allowMultipleLocales: true
|
2149
|
+
});
|
1913
2150
|
const entityPromises = documentIds.map(
|
1914
2151
|
(documentId) => documentManager2.findLocales(documentId, model, { populate, locale, isPublished: false })
|
1915
2152
|
);
|
@@ -1931,12 +2168,14 @@ const collectionTypes = {
|
|
1931
2168
|
const { body } = ctx.request;
|
1932
2169
|
const { documentIds } = body;
|
1933
2170
|
await validateBulkActionInput(body);
|
1934
|
-
const documentManager2 = getService$
|
1935
|
-
const permissionChecker2 = getService$
|
2171
|
+
const documentManager2 = getService$2("document-manager");
|
2172
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
1936
2173
|
if (permissionChecker2.cannot.unpublish()) {
|
1937
2174
|
return ctx.forbidden();
|
1938
2175
|
}
|
1939
|
-
const { locale } = await getDocumentLocaleAndStatus(body
|
2176
|
+
const { locale } = await getDocumentLocaleAndStatus(body, model, {
|
2177
|
+
allowMultipleLocales: true
|
2178
|
+
});
|
1940
2179
|
const entityPromises = documentIds.map(
|
1941
2180
|
(documentId) => documentManager2.findLocales(documentId, model, { locale, isPublished: true })
|
1942
2181
|
);
|
@@ -1959,8 +2198,8 @@ const collectionTypes = {
|
|
1959
2198
|
const {
|
1960
2199
|
body: { discardDraft, ...body }
|
1961
2200
|
} = ctx.request;
|
1962
|
-
const documentManager2 = getService$
|
1963
|
-
const permissionChecker2 = getService$
|
2201
|
+
const documentManager2 = getService$2("document-manager");
|
2202
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
1964
2203
|
if (permissionChecker2.cannot.unpublish()) {
|
1965
2204
|
return ctx.forbidden();
|
1966
2205
|
}
|
@@ -1968,8 +2207,8 @@ const collectionTypes = {
|
|
1968
2207
|
return ctx.forbidden();
|
1969
2208
|
}
|
1970
2209
|
const permissionQuery = await permissionChecker2.sanitizedQuery.unpublish(ctx.query);
|
1971
|
-
const populate = await getService$
|
1972
|
-
const { locale } = await getDocumentLocaleAndStatus(body);
|
2210
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
|
2211
|
+
const { locale } = await getDocumentLocaleAndStatus(body, model);
|
1973
2212
|
const document = await documentManager2.findOne(id, model, {
|
1974
2213
|
populate,
|
1975
2214
|
locale,
|
@@ -1999,14 +2238,14 @@ const collectionTypes = {
|
|
1999
2238
|
const { userAbility } = ctx.state;
|
2000
2239
|
const { id, model } = ctx.params;
|
2001
2240
|
const { body } = ctx.request;
|
2002
|
-
const documentManager2 = getService$
|
2003
|
-
const permissionChecker2 = getService$
|
2241
|
+
const documentManager2 = getService$2("document-manager");
|
2242
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2004
2243
|
if (permissionChecker2.cannot.discard()) {
|
2005
2244
|
return ctx.forbidden();
|
2006
2245
|
}
|
2007
2246
|
const permissionQuery = await permissionChecker2.sanitizedQuery.discard(ctx.query);
|
2008
|
-
const populate = await getService$
|
2009
|
-
const { locale } = await getDocumentLocaleAndStatus(body);
|
2247
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
|
2248
|
+
const { locale } = await getDocumentLocaleAndStatus(body, model);
|
2010
2249
|
const document = await documentManager2.findOne(id, model, {
|
2011
2250
|
populate,
|
2012
2251
|
locale,
|
@@ -2030,14 +2269,14 @@ const collectionTypes = {
|
|
2030
2269
|
const { query, body } = ctx.request;
|
2031
2270
|
const { documentIds } = body;
|
2032
2271
|
await validateBulkActionInput(body);
|
2033
|
-
const documentManager2 = getService$
|
2034
|
-
const permissionChecker2 = getService$
|
2272
|
+
const documentManager2 = getService$2("document-manager");
|
2273
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2035
2274
|
if (permissionChecker2.cannot.delete()) {
|
2036
2275
|
return ctx.forbidden();
|
2037
2276
|
}
|
2038
2277
|
const permissionQuery = await permissionChecker2.sanitizedQuery.delete(query);
|
2039
|
-
const populate = await getService$
|
2040
|
-
const { locale } = await getDocumentLocaleAndStatus(body);
|
2278
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
|
2279
|
+
const { locale } = await getDocumentLocaleAndStatus(body, model);
|
2041
2280
|
const documentLocales = await documentManager2.findLocales(documentIds, model, {
|
2042
2281
|
populate,
|
2043
2282
|
locale
|
@@ -2057,14 +2296,14 @@ const collectionTypes = {
|
|
2057
2296
|
async countDraftRelations(ctx) {
|
2058
2297
|
const { userAbility } = ctx.state;
|
2059
2298
|
const { model, id } = ctx.params;
|
2060
|
-
const documentManager2 = getService$
|
2061
|
-
const permissionChecker2 = getService$
|
2299
|
+
const documentManager2 = getService$2("document-manager");
|
2300
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2062
2301
|
if (permissionChecker2.cannot.read()) {
|
2063
2302
|
return ctx.forbidden();
|
2064
2303
|
}
|
2065
2304
|
const permissionQuery = await permissionChecker2.sanitizedQuery.read(ctx.query);
|
2066
|
-
const populate = await getService$
|
2067
|
-
const { locale, status
|
2305
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
|
2306
|
+
const { locale, status } = await getDocumentLocaleAndStatus(ctx.query, model);
|
2068
2307
|
const entity = await documentManager2.findOne(id, model, { populate, locale, status });
|
2069
2308
|
if (!entity) {
|
2070
2309
|
return ctx.notFound();
|
@@ -2082,8 +2321,8 @@ const collectionTypes = {
|
|
2082
2321
|
const ids = ctx.request.query.documentIds;
|
2083
2322
|
const locale = ctx.request.query.locale;
|
2084
2323
|
const { model } = ctx.params;
|
2085
|
-
const documentManager2 = getService$
|
2086
|
-
const permissionChecker2 = getService$
|
2324
|
+
const documentManager2 = getService$2("document-manager");
|
2325
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2087
2326
|
if (permissionChecker2.cannot.read()) {
|
2088
2327
|
return ctx.forbidden();
|
2089
2328
|
}
|
@@ -2107,13 +2346,13 @@ const collectionTypes = {
|
|
2107
2346
|
};
|
2108
2347
|
const components$1 = {
|
2109
2348
|
findComponents(ctx) {
|
2110
|
-
const components2 = getService$
|
2111
|
-
const { toDto } = getService$
|
2349
|
+
const components2 = getService$2("components").findAllComponents();
|
2350
|
+
const { toDto } = getService$2("data-mapper");
|
2112
2351
|
ctx.body = { data: components2.map(toDto) };
|
2113
2352
|
},
|
2114
2353
|
async findComponentConfiguration(ctx) {
|
2115
2354
|
const { uid: uid2 } = ctx.params;
|
2116
|
-
const componentService = getService$
|
2355
|
+
const componentService = getService$2("components");
|
2117
2356
|
const component = componentService.findComponent(uid2);
|
2118
2357
|
if (!component) {
|
2119
2358
|
return ctx.notFound("component.notFound");
|
@@ -2130,7 +2369,7 @@ const components$1 = {
|
|
2130
2369
|
async updateComponentConfiguration(ctx) {
|
2131
2370
|
const { uid: uid2 } = ctx.params;
|
2132
2371
|
const { body } = ctx.request;
|
2133
|
-
const componentService = getService$
|
2372
|
+
const componentService = getService$2("components");
|
2134
2373
|
const component = componentService.findComponent(uid2);
|
2135
2374
|
if (!component) {
|
2136
2375
|
return ctx.notFound("component.notFound");
|
@@ -2164,12 +2403,12 @@ const contentTypes = {
|
|
2164
2403
|
} catch (error) {
|
2165
2404
|
return ctx.send({ error }, 400);
|
2166
2405
|
}
|
2167
|
-
const contentTypes2 = getService$
|
2168
|
-
const { toDto } = getService$
|
2406
|
+
const contentTypes2 = getService$2("content-types").findContentTypesByKind(kind);
|
2407
|
+
const { toDto } = getService$2("data-mapper");
|
2169
2408
|
ctx.body = { data: contentTypes2.map(toDto) };
|
2170
2409
|
},
|
2171
2410
|
async findContentTypesSettings(ctx) {
|
2172
|
-
const { findAllContentTypes, findConfiguration } = getService$
|
2411
|
+
const { findAllContentTypes, findConfiguration } = getService$2("content-types");
|
2173
2412
|
const contentTypes2 = await findAllContentTypes();
|
2174
2413
|
const configurations = await Promise.all(
|
2175
2414
|
contentTypes2.map(async (contentType) => {
|
@@ -2183,7 +2422,7 @@ const contentTypes = {
|
|
2183
2422
|
},
|
2184
2423
|
async findContentTypeConfiguration(ctx) {
|
2185
2424
|
const { uid: uid2 } = ctx.params;
|
2186
|
-
const contentTypeService = getService$
|
2425
|
+
const contentTypeService = getService$2("content-types");
|
2187
2426
|
const contentType = await contentTypeService.findContentType(uid2);
|
2188
2427
|
if (!contentType) {
|
2189
2428
|
return ctx.notFound("contentType.notFound");
|
@@ -2205,13 +2444,13 @@ const contentTypes = {
|
|
2205
2444
|
const { userAbility } = ctx.state;
|
2206
2445
|
const { uid: uid2 } = ctx.params;
|
2207
2446
|
const { body } = ctx.request;
|
2208
|
-
const contentTypeService = getService$
|
2209
|
-
const metricsService = getService$
|
2447
|
+
const contentTypeService = getService$2("content-types");
|
2448
|
+
const metricsService = getService$2("metrics");
|
2210
2449
|
const contentType = await contentTypeService.findContentType(uid2);
|
2211
2450
|
if (!contentType) {
|
2212
2451
|
return ctx.notFound("contentType.notFound");
|
2213
2452
|
}
|
2214
|
-
if (!getService$
|
2453
|
+
if (!getService$2("permission").canConfigureContentType({ userAbility, contentType })) {
|
2215
2454
|
return ctx.forbidden();
|
2216
2455
|
}
|
2217
2456
|
let input;
|
@@ -2244,10 +2483,10 @@ const contentTypes = {
|
|
2244
2483
|
};
|
2245
2484
|
const init = {
|
2246
2485
|
getInitData(ctx) {
|
2247
|
-
const { toDto } = getService$
|
2248
|
-
const { findAllComponents } = getService$
|
2249
|
-
const { getAllFieldSizes } = getService$
|
2250
|
-
const { findAllContentTypes } = getService$
|
2486
|
+
const { toDto } = getService$2("data-mapper");
|
2487
|
+
const { findAllComponents } = getService$2("components");
|
2488
|
+
const { getAllFieldSizes } = getService$2("field-sizes");
|
2489
|
+
const { findAllContentTypes } = getService$2("content-types");
|
2251
2490
|
ctx.body = {
|
2252
2491
|
data: {
|
2253
2492
|
fieldSizes: getAllFieldSizes(),
|
@@ -2283,36 +2522,41 @@ const addFiltersClause = (params, filtersClause) => {
|
|
2283
2522
|
params.filters.$and.push(filtersClause);
|
2284
2523
|
};
|
2285
2524
|
const sanitizeMainField = (model, mainField, userAbility) => {
|
2286
|
-
const permissionChecker2 = getService$
|
2525
|
+
const permissionChecker2 = getService$2("permission-checker").create({
|
2287
2526
|
userAbility,
|
2288
2527
|
model: model.uid
|
2289
2528
|
});
|
2290
|
-
|
2529
|
+
const isMainFieldListable = isListable(model, mainField);
|
2530
|
+
const canReadMainField = permissionChecker2.can.read(null, mainField);
|
2531
|
+
if (!isMainFieldListable || !canReadMainField) {
|
2291
2532
|
return "id";
|
2292
2533
|
}
|
2293
|
-
if (
|
2294
|
-
|
2295
|
-
const userPermissionChecker = getService$1("permission-checker").create({
|
2296
|
-
userAbility,
|
2297
|
-
model: "plugin::users-permissions.user"
|
2298
|
-
});
|
2299
|
-
if (userPermissionChecker.can.read()) {
|
2300
|
-
return "name";
|
2301
|
-
}
|
2302
|
-
}
|
2303
|
-
return "id";
|
2534
|
+
if (model.uid === "plugin::users-permissions.role") {
|
2535
|
+
return "name";
|
2304
2536
|
}
|
2305
2537
|
return mainField;
|
2306
2538
|
};
|
2307
|
-
const addStatusToRelations = async (
|
2308
|
-
if (!strapiUtils.contentTypes.hasDraftAndPublish(strapi.
|
2539
|
+
const addStatusToRelations = async (targetUid, relations2) => {
|
2540
|
+
if (!strapiUtils.contentTypes.hasDraftAndPublish(strapi.getModel(targetUid))) {
|
2309
2541
|
return relations2;
|
2310
2542
|
}
|
2311
|
-
const documentMetadata2 = getService$
|
2312
|
-
|
2543
|
+
const documentMetadata2 = getService$2("document-metadata");
|
2544
|
+
if (!relations2.length) {
|
2545
|
+
return relations2;
|
2546
|
+
}
|
2547
|
+
const firstRelation = relations2[0];
|
2548
|
+
const filters = {
|
2549
|
+
documentId: { $in: relations2.map((r) => r.documentId) },
|
2550
|
+
// NOTE: find the "opposite" status
|
2551
|
+
publishedAt: firstRelation.publishedAt !== null ? { $null: true } : { $notNull: true }
|
2552
|
+
};
|
2553
|
+
const availableStatus = await strapi.query(targetUid).findMany({
|
2554
|
+
select: ["id", "documentId", "locale", "updatedAt", "createdAt", "publishedAt"],
|
2555
|
+
filters
|
2556
|
+
});
|
2313
2557
|
return relations2.map((relation) => {
|
2314
|
-
const availableStatuses =
|
2315
|
-
(availableDocument) => availableDocument.documentId === relation.documentId
|
2558
|
+
const availableStatuses = availableStatus.filter(
|
2559
|
+
(availableDocument) => availableDocument.documentId === relation.documentId && (relation.locale ? availableDocument.locale === relation.locale : true)
|
2316
2560
|
);
|
2317
2561
|
return {
|
2318
2562
|
...relation,
|
@@ -2333,11 +2577,8 @@ const validateLocale = (sourceUid, targetUid, locale) => {
|
|
2333
2577
|
const isLocalized = strapi.plugin("i18n").service("content-types").isLocalizedContentType;
|
2334
2578
|
const isSourceLocalized = isLocalized(sourceModel);
|
2335
2579
|
const isTargetLocalized = isLocalized(targetModel);
|
2336
|
-
let validatedLocale = locale;
|
2337
|
-
if (!targetModel || !isTargetLocalized)
|
2338
|
-
validatedLocale = void 0;
|
2339
2580
|
return {
|
2340
|
-
locale
|
2581
|
+
locale,
|
2341
2582
|
isSourceLocalized,
|
2342
2583
|
isTargetLocalized
|
2343
2584
|
};
|
@@ -2377,7 +2618,7 @@ const relations = {
|
|
2377
2618
|
ctx.request?.query?.locale
|
2378
2619
|
);
|
2379
2620
|
const { status } = validateStatus(sourceUid, ctx.request?.query?.status);
|
2380
|
-
const permissionChecker2 = getService$
|
2621
|
+
const permissionChecker2 = getService$2("permission-checker").create({
|
2381
2622
|
userAbility,
|
2382
2623
|
model
|
2383
2624
|
});
|
@@ -2402,7 +2643,7 @@ const relations = {
|
|
2402
2643
|
where.id = id;
|
2403
2644
|
}
|
2404
2645
|
const permissionQuery = await permissionChecker2.sanitizedQuery.read(ctx.query);
|
2405
|
-
const populate = await getService$
|
2646
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
|
2406
2647
|
const currentEntity = await strapi.db.query(model).findOne({
|
2407
2648
|
where,
|
2408
2649
|
populate
|
@@ -2417,7 +2658,7 @@ const relations = {
|
|
2417
2658
|
}
|
2418
2659
|
entryId = currentEntity.id;
|
2419
2660
|
}
|
2420
|
-
const modelConfig = isComponent2 ? await getService$
|
2661
|
+
const modelConfig = isComponent2 ? await getService$2("components").findConfiguration(sourceSchema) : await getService$2("content-types").findConfiguration(sourceSchema);
|
2421
2662
|
const targetSchema = strapi.getModel(targetUid);
|
2422
2663
|
const mainField = fp.flow(
|
2423
2664
|
fp.prop(`metadatas.${targetField}.edit.mainField`),
|
@@ -2440,7 +2681,7 @@ const relations = {
|
|
2440
2681
|
attribute,
|
2441
2682
|
fieldsToSelect,
|
2442
2683
|
mainField,
|
2443
|
-
source: { schema: sourceSchema },
|
2684
|
+
source: { schema: sourceSchema, isLocalized: isSourceLocalized },
|
2444
2685
|
target: { schema: targetSchema, isLocalized: isTargetLocalized },
|
2445
2686
|
sourceSchema,
|
2446
2687
|
targetSchema,
|
@@ -2462,7 +2703,8 @@ const relations = {
|
|
2462
2703
|
fieldsToSelect,
|
2463
2704
|
mainField,
|
2464
2705
|
source: {
|
2465
|
-
schema: { uid: sourceUid, modelType: sourceModelType }
|
2706
|
+
schema: { uid: sourceUid, modelType: sourceModelType },
|
2707
|
+
isLocalized: isSourceLocalized
|
2466
2708
|
},
|
2467
2709
|
target: {
|
2468
2710
|
schema: { uid: targetUid },
|
@@ -2470,7 +2712,7 @@ const relations = {
|
|
2470
2712
|
}
|
2471
2713
|
} = await this.extractAndValidateRequestInfo(ctx, id);
|
2472
2714
|
const { idsToOmit, idsToInclude, _q, ...query } = ctx.request.query;
|
2473
|
-
const permissionChecker2 = getService$
|
2715
|
+
const permissionChecker2 = getService$2("permission-checker").create({
|
2474
2716
|
userAbility: ctx.state.userAbility,
|
2475
2717
|
model: targetUid
|
2476
2718
|
});
|
@@ -2500,12 +2742,16 @@ const relations = {
|
|
2500
2742
|
} else {
|
2501
2743
|
where.id = id;
|
2502
2744
|
}
|
2503
|
-
|
2504
|
-
|
2745
|
+
const publishedAt = getPublishedAtClause(status, targetUid);
|
2746
|
+
if (!fp.isEmpty(publishedAt)) {
|
2747
|
+
where[`${alias}.published_at`] = publishedAt;
|
2505
2748
|
}
|
2506
|
-
if (
|
2749
|
+
if (isTargetLocalized && locale) {
|
2507
2750
|
where[`${alias}.locale`] = locale;
|
2508
2751
|
}
|
2752
|
+
if (isSourceLocalized && locale) {
|
2753
|
+
where.locale = locale;
|
2754
|
+
}
|
2509
2755
|
if ((idsToInclude?.length ?? 0) !== 0) {
|
2510
2756
|
where[`${alias}.id`].$notIn = idsToInclude;
|
2511
2757
|
}
|
@@ -2523,7 +2769,8 @@ const relations = {
|
|
2523
2769
|
id: { $notIn: fp.uniq(idsToOmit) }
|
2524
2770
|
});
|
2525
2771
|
}
|
2526
|
-
const
|
2772
|
+
const dbQuery = strapi.get("query-params").transform(targetUid, queryParams);
|
2773
|
+
const res = await strapi.db.query(targetUid).findPage(dbQuery);
|
2527
2774
|
ctx.body = {
|
2528
2775
|
...res,
|
2529
2776
|
results: await addStatusToRelations(targetUid, res.results)
|
@@ -2538,29 +2785,39 @@ const relations = {
|
|
2538
2785
|
attribute,
|
2539
2786
|
targetField,
|
2540
2787
|
fieldsToSelect,
|
2541
|
-
|
2542
|
-
|
2543
|
-
}
|
2544
|
-
target: {
|
2545
|
-
schema: { uid: targetUid }
|
2546
|
-
}
|
2788
|
+
status,
|
2789
|
+
source: { schema: sourceSchema },
|
2790
|
+
target: { schema: targetSchema }
|
2547
2791
|
} = await this.extractAndValidateRequestInfo(ctx, id);
|
2548
|
-
const
|
2792
|
+
const { uid: sourceUid } = sourceSchema;
|
2793
|
+
const { uid: targetUid } = targetSchema;
|
2794
|
+
const permissionQuery = await getService$2("permission-checker").create({ userAbility, model: targetUid }).sanitizedQuery.read({ fields: fieldsToSelect });
|
2549
2795
|
const dbQuery = strapi.db.query(sourceUid);
|
2550
2796
|
const loadRelations = strapiUtils.relations.isAnyToMany(attribute) ? (...args) => dbQuery.loadPages(...args) : (...args) => dbQuery.load(...args).then((res2) => ({ results: res2 ? [res2] : [] }));
|
2797
|
+
const filters = {};
|
2798
|
+
if (sourceSchema?.options?.draftAndPublish) {
|
2799
|
+
if (targetSchema?.options?.draftAndPublish) {
|
2800
|
+
if (status === "published") {
|
2801
|
+
filters.publishedAt = { $notNull: true };
|
2802
|
+
} else {
|
2803
|
+
filters.publishedAt = { $null: true };
|
2804
|
+
}
|
2805
|
+
}
|
2806
|
+
} else if (targetSchema?.options?.draftAndPublish) {
|
2807
|
+
filters.publishedAt = { $null: true };
|
2808
|
+
}
|
2551
2809
|
const res = await loadRelations({ id: entryId }, targetField, {
|
2552
|
-
select: ["id", "documentId", "locale", "publishedAt"],
|
2810
|
+
select: ["id", "documentId", "locale", "publishedAt", "updatedAt"],
|
2553
2811
|
ordering: "desc",
|
2554
2812
|
page: ctx.request.query.page,
|
2555
|
-
pageSize: ctx.request.query.pageSize
|
2813
|
+
pageSize: ctx.request.query.pageSize,
|
2814
|
+
filters
|
2556
2815
|
});
|
2557
2816
|
const loadedIds = res.results.map((item) => item.id);
|
2558
2817
|
addFiltersClause(permissionQuery, { id: { $in: loadedIds } });
|
2559
2818
|
const sanitizedRes = await loadRelations({ id: entryId }, targetField, {
|
2560
2819
|
...strapi.get("query-params").transform(targetUid, permissionQuery),
|
2561
|
-
ordering: "desc"
|
2562
|
-
page: ctx.request.query.page,
|
2563
|
-
pageSize: ctx.request.query.pageSize
|
2820
|
+
ordering: "desc"
|
2564
2821
|
});
|
2565
2822
|
const relationsUnion = fp.uniqBy("id", fp.concat(sanitizedRes.results, res.results));
|
2566
2823
|
ctx.body = {
|
@@ -2575,10 +2832,10 @@ const relations = {
|
|
2575
2832
|
}
|
2576
2833
|
};
|
2577
2834
|
const buildPopulateFromQuery = async (query, model) => {
|
2578
|
-
return getService$
|
2835
|
+
return getService$2("populate-builder")(model).populateFromQuery(query).populateDeep(Infinity).countRelations().build();
|
2579
2836
|
};
|
2580
2837
|
const findDocument = async (query, uid2, opts = {}) => {
|
2581
|
-
const documentManager2 = getService$
|
2838
|
+
const documentManager2 = getService$2("document-manager");
|
2582
2839
|
const populate = await buildPopulateFromQuery(query, uid2);
|
2583
2840
|
return documentManager2.findMany({ ...opts, populate }, uid2).then((documents) => documents[0]);
|
2584
2841
|
};
|
@@ -2586,13 +2843,13 @@ const createOrUpdateDocument = async (ctx, opts) => {
|
|
2586
2843
|
const { user, userAbility } = ctx.state;
|
2587
2844
|
const { model } = ctx.params;
|
2588
2845
|
const { body, query } = ctx.request;
|
2589
|
-
const documentManager2 = getService$
|
2590
|
-
const permissionChecker2 = getService$
|
2846
|
+
const documentManager2 = getService$2("document-manager");
|
2847
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2591
2848
|
if (permissionChecker2.cannot.create() && permissionChecker2.cannot.update()) {
|
2592
2849
|
throw new strapiUtils.errors.ForbiddenError();
|
2593
2850
|
}
|
2594
2851
|
const sanitizedQuery = await permissionChecker2.sanitizedQuery.update(query);
|
2595
|
-
const { locale } = await getDocumentLocaleAndStatus(body);
|
2852
|
+
const { locale } = await getDocumentLocaleAndStatus(body, model);
|
2596
2853
|
const [documentVersion, otherDocumentVersion] = await Promise.all([
|
2597
2854
|
findDocument(sanitizedQuery, model, { locale, status: "draft" }),
|
2598
2855
|
// Find the first document to check if it exists
|
@@ -2628,12 +2885,12 @@ const singleTypes = {
|
|
2628
2885
|
const { userAbility } = ctx.state;
|
2629
2886
|
const { model } = ctx.params;
|
2630
2887
|
const { query = {} } = ctx.request;
|
2631
|
-
const permissionChecker2 = getService$
|
2888
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2632
2889
|
if (permissionChecker2.cannot.read()) {
|
2633
2890
|
return ctx.forbidden();
|
2634
2891
|
}
|
2635
2892
|
const permissionQuery = await permissionChecker2.sanitizedQuery.read(query);
|
2636
|
-
const { locale, status } = await getDocumentLocaleAndStatus(query);
|
2893
|
+
const { locale, status } = await getDocumentLocaleAndStatus(query, model);
|
2637
2894
|
const version = await findDocument(permissionQuery, model, { locale, status });
|
2638
2895
|
if (!version) {
|
2639
2896
|
if (permissionChecker2.cannot.create()) {
|
@@ -2647,7 +2904,7 @@ const singleTypes = {
|
|
2647
2904
|
permissionChecker2,
|
2648
2905
|
model,
|
2649
2906
|
// @ts-expect-error - fix types
|
2650
|
-
{
|
2907
|
+
{ documentId: document.documentId, locale, publishedAt: null },
|
2651
2908
|
{ availableLocales: true, availableStatus: false }
|
2652
2909
|
);
|
2653
2910
|
ctx.body = { data: {}, meta };
|
@@ -2662,7 +2919,7 @@ const singleTypes = {
|
|
2662
2919
|
async createOrUpdate(ctx) {
|
2663
2920
|
const { userAbility } = ctx.state;
|
2664
2921
|
const { model } = ctx.params;
|
2665
|
-
const permissionChecker2 = getService$
|
2922
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2666
2923
|
const document = await createOrUpdateDocument(ctx);
|
2667
2924
|
const sanitizedDocument = await permissionChecker2.sanitizeOutput(document);
|
2668
2925
|
ctx.body = await formatDocumentWithMetadata(permissionChecker2, model, sanitizedDocument);
|
@@ -2671,14 +2928,14 @@ const singleTypes = {
|
|
2671
2928
|
const { userAbility } = ctx.state;
|
2672
2929
|
const { model } = ctx.params;
|
2673
2930
|
const { query = {} } = ctx.request;
|
2674
|
-
const documentManager2 = getService$
|
2675
|
-
const permissionChecker2 = getService$
|
2931
|
+
const documentManager2 = getService$2("document-manager");
|
2932
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2676
2933
|
if (permissionChecker2.cannot.delete()) {
|
2677
2934
|
return ctx.forbidden();
|
2678
2935
|
}
|
2679
2936
|
const sanitizedQuery = await permissionChecker2.sanitizedQuery.delete(query);
|
2680
2937
|
const populate = await buildPopulateFromQuery(sanitizedQuery, model);
|
2681
|
-
const { locale } = await getDocumentLocaleAndStatus(query);
|
2938
|
+
const { locale } = await getDocumentLocaleAndStatus(query, model);
|
2682
2939
|
const documentLocales = await documentManager2.findLocales(void 0, model, {
|
2683
2940
|
populate,
|
2684
2941
|
locale
|
@@ -2700,8 +2957,8 @@ const singleTypes = {
|
|
2700
2957
|
const { userAbility } = ctx.state;
|
2701
2958
|
const { model } = ctx.params;
|
2702
2959
|
const { query = {} } = ctx.request;
|
2703
|
-
const documentManager2 = getService$
|
2704
|
-
const permissionChecker2 = getService$
|
2960
|
+
const documentManager2 = getService$2("document-manager");
|
2961
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2705
2962
|
if (permissionChecker2.cannot.publish()) {
|
2706
2963
|
return ctx.forbidden();
|
2707
2964
|
}
|
@@ -2715,7 +2972,7 @@ const singleTypes = {
|
|
2715
2972
|
if (permissionChecker2.cannot.publish(document)) {
|
2716
2973
|
throw new strapiUtils.errors.ForbiddenError();
|
2717
2974
|
}
|
2718
|
-
const { locale } = await getDocumentLocaleAndStatus(document);
|
2975
|
+
const { locale } = await getDocumentLocaleAndStatus(document, model);
|
2719
2976
|
const publishResult = await documentManager2.publish(document.documentId, model, { locale });
|
2720
2977
|
return publishResult.at(0);
|
2721
2978
|
});
|
@@ -2729,8 +2986,8 @@ const singleTypes = {
|
|
2729
2986
|
body: { discardDraft, ...body },
|
2730
2987
|
query = {}
|
2731
2988
|
} = ctx.request;
|
2732
|
-
const documentManager2 = getService$
|
2733
|
-
const permissionChecker2 = getService$
|
2989
|
+
const documentManager2 = getService$2("document-manager");
|
2990
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2734
2991
|
if (permissionChecker2.cannot.unpublish()) {
|
2735
2992
|
return ctx.forbidden();
|
2736
2993
|
}
|
@@ -2738,7 +2995,7 @@ const singleTypes = {
|
|
2738
2995
|
return ctx.forbidden();
|
2739
2996
|
}
|
2740
2997
|
const sanitizedQuery = await permissionChecker2.sanitizedQuery.unpublish(query);
|
2741
|
-
const { locale } = await getDocumentLocaleAndStatus(body);
|
2998
|
+
const { locale } = await getDocumentLocaleAndStatus(body, model);
|
2742
2999
|
const document = await findDocument(sanitizedQuery, model, { locale });
|
2743
3000
|
if (!document) {
|
2744
3001
|
return ctx.notFound();
|
@@ -2764,13 +3021,13 @@ const singleTypes = {
|
|
2764
3021
|
const { userAbility } = ctx.state;
|
2765
3022
|
const { model } = ctx.params;
|
2766
3023
|
const { body, query = {} } = ctx.request;
|
2767
|
-
const documentManager2 = getService$
|
2768
|
-
const permissionChecker2 = getService$
|
3024
|
+
const documentManager2 = getService$2("document-manager");
|
3025
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2769
3026
|
if (permissionChecker2.cannot.discard()) {
|
2770
3027
|
return ctx.forbidden();
|
2771
3028
|
}
|
2772
3029
|
const sanitizedQuery = await permissionChecker2.sanitizedQuery.discard(query);
|
2773
|
-
const { locale } = await getDocumentLocaleAndStatus(body);
|
3030
|
+
const { locale } = await getDocumentLocaleAndStatus(body, model);
|
2774
3031
|
const document = await findDocument(sanitizedQuery, model, { locale, status: "published" });
|
2775
3032
|
if (!document) {
|
2776
3033
|
return ctx.notFound();
|
@@ -2788,9 +3045,9 @@ const singleTypes = {
|
|
2788
3045
|
const { userAbility } = ctx.state;
|
2789
3046
|
const { model } = ctx.params;
|
2790
3047
|
const { query } = ctx.request;
|
2791
|
-
const documentManager2 = getService$
|
2792
|
-
const permissionChecker2 = getService$
|
2793
|
-
const { locale } = await getDocumentLocaleAndStatus(query);
|
3048
|
+
const documentManager2 = getService$2("document-manager");
|
3049
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
3050
|
+
const { locale } = await getDocumentLocaleAndStatus(query, model);
|
2794
3051
|
if (permissionChecker2.cannot.read()) {
|
2795
3052
|
return ctx.forbidden();
|
2796
3053
|
}
|
@@ -2811,9 +3068,9 @@ const uid$1 = {
|
|
2811
3068
|
async generateUID(ctx) {
|
2812
3069
|
const { contentTypeUID, field, data } = await validateGenerateUIDInput(ctx.request.body);
|
2813
3070
|
const { query = {} } = ctx.request;
|
2814
|
-
const { locale } = await getDocumentLocaleAndStatus(query);
|
3071
|
+
const { locale } = await getDocumentLocaleAndStatus(query, contentTypeUID);
|
2815
3072
|
await validateUIDField(contentTypeUID, field);
|
2816
|
-
const uidService = getService$
|
3073
|
+
const uidService = getService$2("uid");
|
2817
3074
|
ctx.body = {
|
2818
3075
|
data: await uidService.generateUIDField({ contentTypeUID, field, data, locale })
|
2819
3076
|
};
|
@@ -2823,9 +3080,9 @@ const uid$1 = {
|
|
2823
3080
|
ctx.request.body
|
2824
3081
|
);
|
2825
3082
|
const { query = {} } = ctx.request;
|
2826
|
-
const { locale } = await getDocumentLocaleAndStatus(query);
|
3083
|
+
const { locale } = await getDocumentLocaleAndStatus(query, contentTypeUID);
|
2827
3084
|
await validateUIDField(contentTypeUID, field);
|
2828
|
-
const uidService = getService$
|
3085
|
+
const uidService = getService$2("uid");
|
2829
3086
|
const isAvailable = await uidService.checkUIDAvailability({
|
2830
3087
|
contentTypeUID,
|
2831
3088
|
field,
|
@@ -2846,7 +3103,8 @@ const controllers = {
|
|
2846
3103
|
relations,
|
2847
3104
|
"single-types": singleTypes,
|
2848
3105
|
uid: uid$1,
|
2849
|
-
...history.controllers ? history.controllers : {}
|
3106
|
+
...history.controllers ? history.controllers : {},
|
3107
|
+
...preview.controllers ? preview.controllers : {}
|
2850
3108
|
};
|
2851
3109
|
const keys = {
|
2852
3110
|
CONFIGURATION: "configuration"
|
@@ -2997,12 +3255,12 @@ async function syncMetadatas(configuration, schema) {
|
|
2997
3255
|
return ___default.default.assign(metasWithDefaults, updatedMetas);
|
2998
3256
|
}
|
2999
3257
|
const getTargetSchema = (targetModel) => {
|
3000
|
-
return getService$
|
3258
|
+
return getService$2("content-types").findContentType(targetModel);
|
3001
3259
|
};
|
3002
3260
|
const DEFAULT_LIST_LENGTH = 4;
|
3003
3261
|
const MAX_ROW_SIZE = 12;
|
3004
3262
|
const isAllowedFieldSize = (type, size) => {
|
3005
|
-
const { getFieldSize } = getService$
|
3263
|
+
const { getFieldSize } = getService$2("field-sizes");
|
3006
3264
|
const fieldSize = getFieldSize(type);
|
3007
3265
|
if (!fieldSize.isResizable && size !== fieldSize.default) {
|
3008
3266
|
return false;
|
@@ -3010,7 +3268,7 @@ const isAllowedFieldSize = (type, size) => {
|
|
3010
3268
|
return size <= MAX_ROW_SIZE;
|
3011
3269
|
};
|
3012
3270
|
const getDefaultFieldSize = (attribute) => {
|
3013
|
-
const { hasFieldSize, getFieldSize } = getService$
|
3271
|
+
const { hasFieldSize, getFieldSize } = getService$2("field-sizes");
|
3014
3272
|
return getFieldSize(hasFieldSize(attribute.customField) ? attribute.customField : attribute.type).default;
|
3015
3273
|
};
|
3016
3274
|
async function createDefaultLayouts(schema) {
|
@@ -3045,7 +3303,7 @@ function syncLayouts(configuration, schema) {
|
|
3045
3303
|
for (const el of row) {
|
3046
3304
|
if (!hasEditableAttribute(schema, el.name))
|
3047
3305
|
continue;
|
3048
|
-
const { hasFieldSize } = getService$
|
3306
|
+
const { hasFieldSize } = getService$2("field-sizes");
|
3049
3307
|
const fieldType = hasFieldSize(schema.attributes[el.name].customField) ? schema.attributes[el.name].customField : schema.attributes[el.name].type;
|
3050
3308
|
if (!isAllowedFieldSize(fieldType, el.size)) {
|
3051
3309
|
elementsToReAppend.push(el.name);
|
@@ -3185,17 +3443,17 @@ const configurationService$1 = createConfigurationService({
|
|
3185
3443
|
isComponent: true,
|
3186
3444
|
prefix: STORE_KEY_PREFIX,
|
3187
3445
|
getModels() {
|
3188
|
-
const { toContentManagerModel } = getService$
|
3446
|
+
const { toContentManagerModel } = getService$2("data-mapper");
|
3189
3447
|
return fp.mapValues(toContentManagerModel, strapi.components);
|
3190
3448
|
}
|
3191
3449
|
});
|
3192
3450
|
const components = ({ strapi: strapi2 }) => ({
|
3193
3451
|
findAllComponents() {
|
3194
|
-
const { toContentManagerModel } = getService$
|
3452
|
+
const { toContentManagerModel } = getService$2("data-mapper");
|
3195
3453
|
return Object.values(strapi2.components).map(toContentManagerModel);
|
3196
3454
|
},
|
3197
3455
|
findComponent(uid2) {
|
3198
|
-
const { toContentManagerModel } = getService$
|
3456
|
+
const { toContentManagerModel } = getService$2("data-mapper");
|
3199
3457
|
const component = strapi2.components[uid2];
|
3200
3458
|
return fp.isNil(component) ? component : toContentManagerModel(component);
|
3201
3459
|
},
|
@@ -3246,17 +3504,17 @@ const configurationService = createConfigurationService({
|
|
3246
3504
|
storeUtils,
|
3247
3505
|
prefix: "content_types",
|
3248
3506
|
getModels() {
|
3249
|
-
const { toContentManagerModel } = getService$
|
3507
|
+
const { toContentManagerModel } = getService$2("data-mapper");
|
3250
3508
|
return fp.mapValues(toContentManagerModel, strapi.contentTypes);
|
3251
3509
|
}
|
3252
3510
|
});
|
3253
3511
|
const service = ({ strapi: strapi2 }) => ({
|
3254
3512
|
findAllContentTypes() {
|
3255
|
-
const { toContentManagerModel } = getService$
|
3513
|
+
const { toContentManagerModel } = getService$2("data-mapper");
|
3256
3514
|
return Object.values(strapi2.contentTypes).map(toContentManagerModel);
|
3257
3515
|
},
|
3258
3516
|
findContentType(uid2) {
|
3259
|
-
const { toContentManagerModel } = getService$
|
3517
|
+
const { toContentManagerModel } = getService$2("data-mapper");
|
3260
3518
|
const contentType = strapi2.contentTypes[uid2];
|
3261
3519
|
return fp.isNil(contentType) ? contentType : toContentManagerModel(contentType);
|
3262
3520
|
},
|
@@ -3285,7 +3543,7 @@ const service = ({ strapi: strapi2 }) => ({
|
|
3285
3543
|
return this.findConfiguration(contentType);
|
3286
3544
|
},
|
3287
3545
|
findComponentsConfigurations(contentType) {
|
3288
|
-
return getService$
|
3546
|
+
return getService$2("components").findComponentsConfigurations(contentType);
|
3289
3547
|
},
|
3290
3548
|
syncConfigurations() {
|
3291
3549
|
return configurationService.syncConfigurations();
|
@@ -3466,12 +3724,27 @@ const createPermissionChecker = (strapi2) => ({ userAbility, model }) => {
|
|
3466
3724
|
ability: userAbility,
|
3467
3725
|
model
|
3468
3726
|
});
|
3469
|
-
const
|
3727
|
+
const { actionProvider } = strapi2.service("admin::permission");
|
3728
|
+
const toSubject = (entity) => {
|
3729
|
+
return entity ? permissionsManager.toSubject(entity, model) : model;
|
3730
|
+
};
|
3470
3731
|
const can = (action, entity, field) => {
|
3471
|
-
|
3732
|
+
const subject = toSubject(entity);
|
3733
|
+
const aliases = actionProvider.unstable_aliases(action, model);
|
3734
|
+
return (
|
3735
|
+
// Test the original action to see if it passes
|
3736
|
+
userAbility.can(action, subject, field) || // Else try every known alias if at least one of them succeed, then the user "can"
|
3737
|
+
aliases.some((alias) => userAbility.can(alias, subject, field))
|
3738
|
+
);
|
3472
3739
|
};
|
3473
3740
|
const cannot = (action, entity, field) => {
|
3474
|
-
|
3741
|
+
const subject = toSubject(entity);
|
3742
|
+
const aliases = actionProvider.unstable_aliases(action, model);
|
3743
|
+
return (
|
3744
|
+
// Test both the original action
|
3745
|
+
userAbility.cannot(action, subject, field) && // and every known alias, if all of them fail (cannot), then the user truly "cannot"
|
3746
|
+
aliases.every((alias) => userAbility.cannot(alias, subject, field))
|
3747
|
+
);
|
3475
3748
|
};
|
3476
3749
|
const sanitizeOutput = (data, { action = ACTIONS.read } = {}) => {
|
3477
3750
|
return permissionsManager.sanitizeOutput(data, { subject: toSubject(data), action });
|
@@ -3542,7 +3815,7 @@ const permission = ({ strapi: strapi2 }) => ({
|
|
3542
3815
|
return userAbility.can(action);
|
3543
3816
|
},
|
3544
3817
|
async registerPermissions() {
|
3545
|
-
const displayedContentTypes = getService$
|
3818
|
+
const displayedContentTypes = getService$2("content-types").findDisplayedContentTypes();
|
3546
3819
|
const contentTypesUids = displayedContentTypes.map(fp.prop("uid"));
|
3547
3820
|
const actions = [
|
3548
3821
|
{
|
@@ -3748,6 +4021,10 @@ const getDeepPopulateDraftCount = (uid2) => {
|
|
3748
4021
|
const attribute = model.attributes[attributeName];
|
3749
4022
|
switch (attribute.type) {
|
3750
4023
|
case "relation": {
|
4024
|
+
const isMorphRelation = attribute.relation.toLowerCase().startsWith("morph");
|
4025
|
+
if (isMorphRelation) {
|
4026
|
+
break;
|
4027
|
+
}
|
3751
4028
|
if (isVisibleAttribute$1(model, attributeName)) {
|
3752
4029
|
populateAcc[attributeName] = {
|
3753
4030
|
count: true,
|
@@ -3814,7 +4091,7 @@ const getQueryPopulate = async (uid2, query) => {
|
|
3814
4091
|
return populateQuery;
|
3815
4092
|
};
|
3816
4093
|
const buildDeepPopulate = (uid2) => {
|
3817
|
-
return getService$
|
4094
|
+
return getService$2("populate-builder")(uid2).populateDeep(Infinity).countRelations().build();
|
3818
4095
|
};
|
3819
4096
|
const populateBuilder = (uid2) => {
|
3820
4097
|
let getInitialPopulate = async () => {
|
@@ -3999,7 +4276,9 @@ const documentMetadata = ({ strapi: strapi2 }) => ({
|
|
3999
4276
|
*/
|
4000
4277
|
async getAvailableLocales(uid2, version, allVersions, validatableFields = []) {
|
4001
4278
|
const versionsByLocale = fp.groupBy("locale", allVersions);
|
4002
|
-
|
4279
|
+
if (version.locale) {
|
4280
|
+
delete versionsByLocale[version.locale];
|
4281
|
+
}
|
4003
4282
|
const model = strapi2.getModel(uid2);
|
4004
4283
|
const keysToKeep = [...AVAILABLE_LOCALES_FIELDS, ...validatableFields];
|
4005
4284
|
const traversalFunction = async (localeVersion) => strapiUtils.traverseEntity(
|
@@ -4125,7 +4404,13 @@ const documentMetadata = ({ strapi: strapi2 }) => ({
|
|
4125
4404
|
*/
|
4126
4405
|
async formatDocumentWithMetadata(uid2, document, opts = {}) {
|
4127
4406
|
if (!document) {
|
4128
|
-
return
|
4407
|
+
return {
|
4408
|
+
data: document,
|
4409
|
+
meta: {
|
4410
|
+
availableLocales: [],
|
4411
|
+
availableStatus: []
|
4412
|
+
}
|
4413
|
+
};
|
4129
4414
|
}
|
4130
4415
|
const hasDraftAndPublish = strapiUtils.contentTypes.hasDraftAndPublish(strapi2.getModel(uid2));
|
4131
4416
|
if (!hasDraftAndPublish) {
|
@@ -4233,10 +4518,7 @@ const documentManager = ({ strapi: strapi2 }) => {
|
|
4233
4518
|
async clone(id, body, uid2) {
|
4234
4519
|
const populate = await buildDeepPopulate(uid2);
|
4235
4520
|
const params = {
|
4236
|
-
data:
|
4237
|
-
...omitIdField(body),
|
4238
|
-
[PUBLISHED_AT_ATTRIBUTE]: null
|
4239
|
-
},
|
4521
|
+
data: omitIdField(body),
|
4240
4522
|
populate
|
4241
4523
|
};
|
4242
4524
|
return strapi2.documents(uid2).clone({ ...params, documentId: id }).then((result) => result?.entries.at(0));
|
@@ -4352,7 +4634,8 @@ const services = {
|
|
4352
4634
|
permission,
|
4353
4635
|
"populate-builder": populateBuilder$1,
|
4354
4636
|
uid,
|
4355
|
-
...history.services ? history.services : {}
|
4637
|
+
...history.services ? history.services : {},
|
4638
|
+
...preview.services ? preview.services : {}
|
4356
4639
|
};
|
4357
4640
|
const index = () => {
|
4358
4641
|
return {
|