@strapi/content-manager 0.0.0-experimental.81dfdf02b1367004c7deed9e01afa9d3a15d0fa5 → 0.0.0-experimental.820adfc37c687bbcc4a213ae6929c541358b71e8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_chunks/CardDragPreview-C0QyJgRA.js.map +1 -1
- package/dist/_chunks/CardDragPreview-DOxamsuj.mjs.map +1 -1
- package/dist/_chunks/{ComponentConfigurationPage-qemkOlnj.mjs → ComponentConfigurationPage-CzVt9QCC.mjs} +4 -4
- package/dist/_chunks/{ComponentConfigurationPage-qemkOlnj.mjs.map → ComponentConfigurationPage-CzVt9QCC.mjs.map} +1 -1
- package/dist/_chunks/{ComponentConfigurationPage-D_M8iBw5.js → ComponentConfigurationPage-DYq8aqos.js} +5 -6
- package/dist/_chunks/{ComponentConfigurationPage-D_M8iBw5.js.map → ComponentConfigurationPage-DYq8aqos.js.map} +1 -1
- package/dist/_chunks/{ComponentIcon-BXdiCGQp.js → ComponentIcon-CRbtQEUV.js} +2 -3
- package/dist/_chunks/{ComponentIcon-BXdiCGQp.js.map → ComponentIcon-CRbtQEUV.js.map} +1 -1
- package/dist/_chunks/ComponentIcon-u4bIXTFY.mjs.map +1 -1
- package/dist/_chunks/{EditConfigurationPage-BePwPuHy.js → EditConfigurationPage-C9IATpr0.js} +5 -6
- package/dist/_chunks/{EditConfigurationPage-BePwPuHy.js.map → EditConfigurationPage-C9IATpr0.js.map} +1 -1
- package/dist/_chunks/{EditConfigurationPage-CjUrEewK.mjs → EditConfigurationPage-CLDwrUv5.mjs} +4 -4
- package/dist/_chunks/{EditConfigurationPage-CjUrEewK.mjs.map → EditConfigurationPage-CLDwrUv5.mjs.map} +1 -1
- package/dist/_chunks/{EditViewPage-B-RJeiJD.js → EditViewPage-Ch-uBvbv.js} +50 -11
- package/dist/_chunks/EditViewPage-Ch-uBvbv.js.map +1 -0
- package/dist/_chunks/{EditViewPage-De8GyU8P.mjs → EditViewPage-DtKM7Jgw.mjs} +50 -10
- package/dist/_chunks/EditViewPage-DtKM7Jgw.mjs.map +1 -0
- package/dist/_chunks/{Field-dq8Tg1M_.js → Field-B9ADaInZ.js} +153 -148
- package/dist/_chunks/Field-B9ADaInZ.js.map +1 -0
- package/dist/_chunks/{Field-pb2o8uBe.mjs → Field-Bn1jgMeF.mjs} +148 -142
- package/dist/_chunks/Field-Bn1jgMeF.mjs.map +1 -0
- package/dist/_chunks/FieldTypeIcon-CMlNO8PE.mjs.map +1 -1
- package/dist/_chunks/FieldTypeIcon-Dnwq_IRF.js.map +1 -1
- package/dist/_chunks/{Form-DJn0Dxha.mjs → Form-BB5i9Pxl.mjs} +17 -9
- package/dist/_chunks/Form-BB5i9Pxl.mjs.map +1 -0
- package/dist/_chunks/{Form-DGIf4jQU.js → Form-C3kjKrPw.js} +19 -12
- package/dist/_chunks/Form-C3kjKrPw.js.map +1 -0
- package/dist/_chunks/{History-Dh2NEHnR.js → History-AwrK0-SA.js} +42 -100
- package/dist/_chunks/History-AwrK0-SA.js.map +1 -0
- package/dist/_chunks/{History-BowL3JKP.mjs → History-Cw2Q7OQL.mjs} +43 -100
- package/dist/_chunks/History-Cw2Q7OQL.mjs.map +1 -0
- package/dist/_chunks/{ListConfigurationPage-BpVOB-hn.mjs → ListConfigurationPage-B47JIu1e.mjs} +7 -6
- package/dist/_chunks/ListConfigurationPage-B47JIu1e.mjs.map +1 -0
- package/dist/_chunks/{ListConfigurationPage-BxYCWz9e.js → ListConfigurationPage-CNTJ0DBm.js} +7 -7
- package/dist/_chunks/ListConfigurationPage-CNTJ0DBm.js.map +1 -0
- package/dist/_chunks/{ListViewPage-4XsciqHZ.js → ListViewPage-Be_UEBar.js} +103 -77
- package/dist/_chunks/ListViewPage-Be_UEBar.js.map +1 -0
- package/dist/_chunks/{ListViewPage-CXFUjZQC.mjs → ListViewPage-DuvjX6ra.mjs} +99 -72
- package/dist/_chunks/ListViewPage-DuvjX6ra.mjs.map +1 -0
- package/dist/_chunks/{NoContentTypePage-C8OpoHeU.js → NoContentTypePage-B1J0KUCO.js} +2 -2
- package/dist/_chunks/{NoContentTypePage-C8OpoHeU.js.map → NoContentTypePage-B1J0KUCO.js.map} +1 -1
- package/dist/_chunks/{NoContentTypePage-DuhOTp3x.mjs → NoContentTypePage-C6M-Q0Tv.mjs} +2 -2
- package/dist/_chunks/{NoContentTypePage-DuhOTp3x.mjs.map → NoContentTypePage-C6M-Q0Tv.mjs.map} +1 -1
- package/dist/_chunks/{NoPermissionsPage-DVz3mzDz.mjs → NoPermissionsPage-CAi3zCAD.mjs} +2 -2
- package/dist/_chunks/{NoPermissionsPage-DVz3mzDz.mjs.map → NoPermissionsPage-CAi3zCAD.mjs.map} +1 -1
- package/dist/_chunks/{NoPermissionsPage-y_r7DVA2.js → NoPermissionsPage-CN34TlEE.js} +2 -2
- package/dist/_chunks/{NoPermissionsPage-y_r7DVA2.js.map → NoPermissionsPage-CN34TlEE.js.map} +1 -1
- package/dist/_chunks/Preview-BrBRcL10.mjs +293 -0
- package/dist/_chunks/Preview-BrBRcL10.mjs.map +1 -0
- package/dist/_chunks/Preview-DOqm5jcJ.js +311 -0
- package/dist/_chunks/Preview-DOqm5jcJ.js.map +1 -0
- package/dist/_chunks/{Relations-CVNLrn1Y.mjs → Relations-_K-HYOiM.mjs} +75 -41
- package/dist/_chunks/Relations-_K-HYOiM.mjs.map +1 -0
- package/dist/_chunks/{Relations-DPFCAa7b.js → Relations-xtKZHtTN.js} +75 -42
- package/dist/_chunks/Relations-xtKZHtTN.js.map +1 -0
- package/dist/_chunks/{en-uOUIxfcQ.js → en-BK8Xyl5I.js} +28 -15
- package/dist/_chunks/{en-uOUIxfcQ.js.map → en-BK8Xyl5I.js.map} +1 -1
- package/dist/_chunks/{en-BrCTWlZv.mjs → en-Dtk_ot79.mjs} +28 -15
- package/dist/_chunks/{en-BrCTWlZv.mjs.map → en-Dtk_ot79.mjs.map} +1 -1
- package/dist/_chunks/{es-EUonQTon.js → es-9K52xZIr.js} +2 -2
- package/dist/_chunks/{ja-CcFe8diO.js.map → es-9K52xZIr.js.map} +1 -1
- package/dist/_chunks/{es-CeXiYflN.mjs → es-D34tqjMw.mjs} +2 -2
- package/dist/_chunks/{es-CeXiYflN.mjs.map → es-D34tqjMw.mjs.map} +1 -1
- package/dist/_chunks/{fr-CD9VFbPM.mjs → fr--pg5jUbt.mjs} +13 -3
- package/dist/_chunks/{fr-CD9VFbPM.mjs.map → fr--pg5jUbt.mjs.map} +1 -1
- package/dist/_chunks/{fr-B7kGGg3E.js → fr-B2Kyv8Z9.js} +13 -3
- package/dist/_chunks/{fr-B7kGGg3E.js.map → fr-B2Kyv8Z9.js.map} +1 -1
- package/dist/_chunks/hooks-BAaaKPS_.js.map +1 -1
- package/dist/_chunks/{index-C3fJE-1-.js → index-BlX-OdHL.js} +1276 -995
- package/dist/_chunks/index-BlX-OdHL.js.map +1 -0
- package/dist/_chunks/{index-DiMrfcfy.mjs → index-tETMKK2G.mjs} +1279 -998
- package/dist/_chunks/index-tETMKK2G.mjs.map +1 -0
- package/dist/_chunks/{ja-CcFe8diO.js → ja-7sfIbjxE.js} +2 -2
- package/dist/_chunks/{es-EUonQTon.js.map → ja-7sfIbjxE.js.map} +1 -1
- package/dist/_chunks/{ja-CtsUxOvk.mjs → ja-BHqhDq4V.mjs} +2 -2
- package/dist/_chunks/{ja-CtsUxOvk.mjs.map → ja-BHqhDq4V.mjs.map} +1 -1
- package/dist/_chunks/{layout-ls3gxfpH.mjs → layout-BaQBaz56.mjs} +6 -5
- package/dist/_chunks/{layout-ls3gxfpH.mjs.map → layout-BaQBaz56.mjs.map} +1 -1
- package/dist/_chunks/{layout-C788OmNr.js → layout-D8Sz3KxF.js} +7 -7
- package/dist/_chunks/{layout-C788OmNr.js.map → layout-D8Sz3KxF.js.map} +1 -1
- package/dist/_chunks/{objects-gigeqt7s.js → objects-BcXOv6_9.js} +2 -4
- package/dist/_chunks/{objects-gigeqt7s.js.map → objects-BcXOv6_9.js.map} +1 -1
- package/dist/_chunks/{objects-mKMAmfec.mjs → objects-D6yBsdmx.mjs} +2 -4
- package/dist/_chunks/{objects-mKMAmfec.mjs.map → objects-D6yBsdmx.mjs.map} +1 -1
- package/dist/_chunks/{relations-DYeotliT.js → relations-CAbbX8Sa.js} +6 -7
- package/dist/_chunks/relations-CAbbX8Sa.js.map +1 -0
- package/dist/_chunks/{relations-CLcOmGO0.mjs → relations-CsfmCqOU.mjs} +6 -7
- package/dist/_chunks/relations-CsfmCqOU.mjs.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/_chunks/{useDragAndDrop-J0TUUbR6.js → useDragAndDrop-BMtgCYzL.js} +5 -9
- package/dist/_chunks/{useDragAndDrop-J0TUUbR6.js.map → useDragAndDrop-BMtgCYzL.js.map} +1 -1
- package/dist/_chunks/{useDragAndDrop-DdHgKsqq.mjs → useDragAndDrop-DJ6jqvZN.mjs} +4 -7
- package/dist/_chunks/{useDragAndDrop-DdHgKsqq.mjs.map → useDragAndDrop-DJ6jqvZN.mjs.map} +1 -1
- package/dist/admin/index.js +2 -1
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +4 -3
- package/dist/admin/src/content-manager.d.ts +3 -2
- package/dist/admin/src/exports.d.ts +1 -1
- package/dist/admin/src/hooks/useDocument.d.ts +32 -1
- package/dist/admin/src/pages/EditView/EditViewPage.d.ts +9 -1
- package/dist/admin/src/pages/EditView/components/DocumentActions.d.ts +1 -1
- package/dist/admin/src/pages/EditView/components/DocumentStatus.d.ts +2 -2
- package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/WysiwygStyles.d.ts +0 -32
- package/dist/admin/src/pages/EditView/components/Header.d.ts +11 -11
- package/dist/admin/src/preview/components/PreviewContent.d.ts +2 -0
- package/dist/admin/src/preview/components/PreviewHeader.d.ts +2 -0
- package/dist/admin/src/preview/components/PreviewSidePanel.d.ts +3 -0
- package/dist/admin/src/preview/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/router.d.ts +1 -1
- package/dist/admin/src/services/documents.d.ts +3 -4
- package/dist/server/index.js +457 -201
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +457 -200
- 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/utils/metadata.d.ts +15 -1
- package/dist/server/src/controllers/utils/metadata.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 +3 -3
- 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/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 +16 -0
- package/dist/server/src/preview/services/index.d.ts.map +1 -0
- package/dist/server/src/preview/services/preview-config.d.ts +32 -0
- package/dist/server/src/preview/services/preview-config.d.ts.map +1 -0
- package/dist/server/src/preview/services/preview.d.ts +12 -0
- package/dist/server/src/preview/services/preview.d.ts.map +1 -0
- package/dist/server/src/preview/utils.d.ts +19 -0
- package/dist/server/src/preview/utils.d.ts.map +1 -0
- package/dist/server/src/register.d.ts.map +1 -1
- package/dist/server/src/routes/index.d.ts.map +1 -1
- package/dist/server/src/services/document-manager.d.ts.map +1 -1
- package/dist/server/src/services/document-metadata.d.ts +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/utils/configuration/index.d.ts +2 -2
- package/dist/server/src/services/utils/configuration/layouts.d.ts +2 -2
- 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 +15 -15
- package/dist/_chunks/EditViewPage-B-RJeiJD.js.map +0 -1
- package/dist/_chunks/EditViewPage-De8GyU8P.mjs.map +0 -1
- package/dist/_chunks/Field-dq8Tg1M_.js.map +0 -1
- package/dist/_chunks/Field-pb2o8uBe.mjs.map +0 -1
- package/dist/_chunks/Form-DGIf4jQU.js.map +0 -1
- package/dist/_chunks/Form-DJn0Dxha.mjs.map +0 -1
- package/dist/_chunks/History-BowL3JKP.mjs.map +0 -1
- package/dist/_chunks/History-Dh2NEHnR.js.map +0 -1
- package/dist/_chunks/ListConfigurationPage-BpVOB-hn.mjs.map +0 -1
- package/dist/_chunks/ListConfigurationPage-BxYCWz9e.js.map +0 -1
- package/dist/_chunks/ListViewPage-4XsciqHZ.js.map +0 -1
- package/dist/_chunks/ListViewPage-CXFUjZQC.mjs.map +0 -1
- package/dist/_chunks/Relations-CVNLrn1Y.mjs.map +0 -1
- package/dist/_chunks/Relations-DPFCAa7b.js.map +0 -1
- package/dist/_chunks/index-C3fJE-1-.js.map +0 -1
- package/dist/_chunks/index-DiMrfcfy.mjs.map +0 -1
- package/dist/_chunks/relations-CLcOmGO0.mjs.map +0 -1
- package/dist/_chunks/relations-DYeotliT.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.mjs
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
import strapiUtils, { validateYupSchema, errors, async, contentTypes as contentTypes$1, yup as yup$1, validateYupSchemaSync, policy, traverse, setCreatorFields, isOperatorOfType, relations as relations$1, traverseEntity, pagination } from "@strapi/utils";
|
2
|
-
import { pick, omit, difference, castArray, intersection, pipe, propOr, isEqual, isEmpty, set, isNil as isNil$1, has, prop, assoc, mapValues, flow, uniq, uniqBy, concat, getOr, propEq, merge, groupBy } from "lodash/fp";
|
2
|
+
import { pick, omit, difference, castArray, mergeWith, intersection, pipe, propOr, isEqual, isEmpty, set, isNil as isNil$1, has, prop, assoc, mapValues, flow, uniq, uniqBy, concat, getOr, propEq, merge, groupBy } from "lodash/fp";
|
3
3
|
import "@strapi/types";
|
4
4
|
import * as yup from "yup";
|
5
5
|
import { scheduleJob } from "node-schedule";
|
@@ -7,10 +7,10 @@ import isNil from "lodash/isNil";
|
|
7
7
|
import _, { intersection as intersection$1, difference as difference$1 } from "lodash";
|
8
8
|
import qs from "qs";
|
9
9
|
import slugify from "@sindresorhus/slugify";
|
10
|
-
const getService$
|
10
|
+
const getService$2 = (name) => {
|
11
11
|
return strapi.plugin("content-manager").service(name);
|
12
12
|
};
|
13
|
-
function getService(strapi2, name) {
|
13
|
+
function getService$1(strapi2, name) {
|
14
14
|
return strapi2.service(`plugin::content-manager.${name}`);
|
15
15
|
}
|
16
16
|
const historyRestoreVersionSchema = yup.object().shape({
|
@@ -46,7 +46,7 @@ const createHistoryVersionController = ({ strapi: strapi2 }) => {
|
|
46
46
|
if (!isSingleType && (!contentTypeUid || !ctx.query.documentId)) {
|
47
47
|
throw new errors.ForbiddenError("contentType and documentId are required");
|
48
48
|
}
|
49
|
-
const permissionChecker2 = getService$
|
49
|
+
const permissionChecker2 = getService$2("permission-checker").create({
|
50
50
|
userAbility: ctx.state.userAbility,
|
51
51
|
model: ctx.query.contentType
|
52
52
|
});
|
@@ -54,7 +54,7 @@ const createHistoryVersionController = ({ strapi: strapi2 }) => {
|
|
54
54
|
return ctx.forbidden();
|
55
55
|
}
|
56
56
|
const query = await permissionChecker2.sanitizeQuery(ctx.query);
|
57
|
-
const { results, pagination: pagination2 } = await getService(strapi2, "history").findVersionsPage({
|
57
|
+
const { results, pagination: pagination2 } = await getService$1(strapi2, "history").findVersionsPage({
|
58
58
|
query: {
|
59
59
|
...query,
|
60
60
|
...getValidPagination({ page: query.page, pageSize: query.pageSize })
|
@@ -79,14 +79,14 @@ const createHistoryVersionController = ({ strapi: strapi2 }) => {
|
|
79
79
|
async restoreVersion(ctx) {
|
80
80
|
const request = ctx.request;
|
81
81
|
await validateRestoreVersion(request.body, "contentType is required");
|
82
|
-
const permissionChecker2 = getService$
|
82
|
+
const permissionChecker2 = getService$2("permission-checker").create({
|
83
83
|
userAbility: ctx.state.userAbility,
|
84
84
|
model: request.body.contentType
|
85
85
|
});
|
86
86
|
if (permissionChecker2.cannot.update()) {
|
87
87
|
throw new errors.ForbiddenError();
|
88
88
|
}
|
89
|
-
const restoredDocument = await getService(strapi2, "history").restoreVersion(
|
89
|
+
const restoredDocument = await getService$1(strapi2, "history").restoreVersion(
|
90
90
|
request.params.versionId
|
91
91
|
);
|
92
92
|
return {
|
@@ -95,7 +95,7 @@ const createHistoryVersionController = ({ strapi: strapi2 }) => {
|
|
95
95
|
}
|
96
96
|
};
|
97
97
|
};
|
98
|
-
const controllers$
|
98
|
+
const controllers$2 = {
|
99
99
|
"history-version": createHistoryVersionController
|
100
100
|
/**
|
101
101
|
* Casting is needed because the types aren't aware that Strapi supports
|
@@ -141,8 +141,7 @@ const createServiceUtils = ({ strapi: strapi2 }) => {
|
|
141
141
|
};
|
142
142
|
const getRelationRestoreValue = async (versionRelationData, attribute) => {
|
143
143
|
if (Array.isArray(versionRelationData)) {
|
144
|
-
if (versionRelationData.length === 0)
|
145
|
-
return versionRelationData;
|
144
|
+
if (versionRelationData.length === 0) return versionRelationData;
|
146
145
|
const existingAndMissingRelations = await Promise.all(
|
147
146
|
versionRelationData.map((relation) => {
|
148
147
|
return strapi2.documents(attribute.target).findOne({
|
@@ -173,10 +172,11 @@ const createServiceUtils = ({ strapi: strapi2 }) => {
|
|
173
172
|
return strapi2.db.query("plugin::upload.file").findOne({ where: { id: versionRelationData.id } });
|
174
173
|
};
|
175
174
|
const localesService = strapi2.plugin("i18n")?.service("locales");
|
175
|
+
const i18nContentTypeService = strapi2.plugin("i18n")?.service("content-types");
|
176
176
|
const getDefaultLocale = async () => localesService ? localesService.getDefaultLocale() : null;
|
177
|
+
const isLocalizedContentType = (model) => i18nContentTypeService ? i18nContentTypeService.isLocalizedContentType(model) : false;
|
177
178
|
const getLocaleDictionary = async () => {
|
178
|
-
if (!localesService)
|
179
|
-
return {};
|
179
|
+
if (!localesService) return {};
|
180
180
|
const locales = await localesService.find() || [];
|
181
181
|
return locales.reduce(
|
182
182
|
(acc, locale) => {
|
@@ -200,6 +200,17 @@ const createServiceUtils = ({ strapi: strapi2 }) => {
|
|
200
200
|
const meta = await documentMetadataService.getMetadata(contentTypeUid, document);
|
201
201
|
return documentMetadataService.getStatus(document, meta.availableStatus);
|
202
202
|
};
|
203
|
+
const getComponentFields = (componentUID) => {
|
204
|
+
return Object.entries(strapi2.getModel(componentUID).attributes).reduce(
|
205
|
+
(fieldsAcc, [key, attribute]) => {
|
206
|
+
if (!["relation", "media", "component", "dynamiczone"].includes(attribute.type)) {
|
207
|
+
fieldsAcc.push(key);
|
208
|
+
}
|
209
|
+
return fieldsAcc;
|
210
|
+
},
|
211
|
+
[]
|
212
|
+
);
|
213
|
+
};
|
203
214
|
const getDeepPopulate2 = (uid2, useDatabaseSyntax = false) => {
|
204
215
|
const model = strapi2.getModel(uid2);
|
205
216
|
const attributes = Object.entries(model.attributes);
|
@@ -223,13 +234,19 @@ const createServiceUtils = ({ strapi: strapi2 }) => {
|
|
223
234
|
}
|
224
235
|
case "component": {
|
225
236
|
const populate = getDeepPopulate2(attribute.component);
|
226
|
-
acc[attributeName] = {
|
237
|
+
acc[attributeName] = {
|
238
|
+
populate,
|
239
|
+
[fieldSelector]: getComponentFields(attribute.component)
|
240
|
+
};
|
227
241
|
break;
|
228
242
|
}
|
229
243
|
case "dynamiczone": {
|
230
244
|
const populatedComponents = (attribute.components || []).reduce(
|
231
245
|
(acc2, componentUID) => {
|
232
|
-
acc2[componentUID] = {
|
246
|
+
acc2[componentUID] = {
|
247
|
+
populate: getDeepPopulate2(componentUID),
|
248
|
+
[fieldSelector]: getComponentFields(componentUID)
|
249
|
+
};
|
233
250
|
return acc2;
|
234
251
|
},
|
235
252
|
{}
|
@@ -291,6 +308,7 @@ const createServiceUtils = ({ strapi: strapi2 }) => {
|
|
291
308
|
getRelationRestoreValue,
|
292
309
|
getMediaRestoreValue,
|
293
310
|
getDefaultLocale,
|
311
|
+
isLocalizedContentType,
|
294
312
|
getLocaleDictionary,
|
295
313
|
getRetentionDays,
|
296
314
|
getVersionStatus,
|
@@ -313,7 +331,13 @@ const createHistoryService = ({ strapi: strapi2 }) => {
|
|
313
331
|
});
|
314
332
|
},
|
315
333
|
async findVersionsPage(params) {
|
316
|
-
const
|
334
|
+
const model = strapi2.getModel(params.query.contentType);
|
335
|
+
const isLocalizedContentType = serviceUtils.isLocalizedContentType(model);
|
336
|
+
const defaultLocale = await serviceUtils.getDefaultLocale();
|
337
|
+
let locale = null;
|
338
|
+
if (isLocalizedContentType) {
|
339
|
+
locale = params.query.locale || defaultLocale;
|
340
|
+
}
|
317
341
|
const [{ results, pagination: pagination2 }, localeDictionary] = await Promise.all([
|
318
342
|
query.findPage({
|
319
343
|
...params.query,
|
@@ -335,7 +359,7 @@ const createHistoryService = ({ strapi: strapi2 }) => {
|
|
335
359
|
const attributeValue = entry.data[attributeKey];
|
336
360
|
const attributeValues = Array.isArray(attributeValue) ? attributeValue : [attributeValue];
|
337
361
|
if (attributeSchema.type === "media") {
|
338
|
-
const permissionChecker2 = getService$
|
362
|
+
const permissionChecker2 = getService$2("permission-checker").create({
|
339
363
|
userAbility: params.state.userAbility,
|
340
364
|
model: "plugin::upload.file"
|
341
365
|
});
|
@@ -358,7 +382,12 @@ const createHistoryService = ({ strapi: strapi2 }) => {
|
|
358
382
|
if (userToPopulate == null) {
|
359
383
|
return null;
|
360
384
|
}
|
361
|
-
return strapi2.query("admin::user").findOne({
|
385
|
+
return strapi2.query("admin::user").findOne({
|
386
|
+
where: {
|
387
|
+
...userToPopulate.id ? { id: userToPopulate.id } : {},
|
388
|
+
...userToPopulate.documentId ? { documentId: userToPopulate.documentId } : {}
|
389
|
+
}
|
390
|
+
});
|
362
391
|
})
|
363
392
|
);
|
364
393
|
return {
|
@@ -371,7 +400,7 @@ const createHistoryService = ({ strapi: strapi2 }) => {
|
|
371
400
|
[attributeKey]: adminUsers
|
372
401
|
};
|
373
402
|
}
|
374
|
-
const permissionChecker2 = getService$
|
403
|
+
const permissionChecker2 = getService$2("permission-checker").create({
|
375
404
|
userAbility: params.state.userAbility,
|
376
405
|
model: attributeSchema.target
|
377
406
|
});
|
@@ -529,11 +558,13 @@ const createLifecyclesService = ({ strapi: strapi2 }) => {
|
|
529
558
|
}
|
530
559
|
const uid2 = context.contentType.uid;
|
531
560
|
const schemas = getSchemas(uid2);
|
561
|
+
const model = strapi2.getModel(uid2);
|
562
|
+
const isLocalizedContentType = serviceUtils.isLocalizedContentType(model);
|
532
563
|
const localeEntries = await strapi2.db.query(uid2).findMany({
|
533
564
|
where: {
|
534
565
|
documentId,
|
535
|
-
locale: { $in: locales },
|
536
|
-
publishedAt: null
|
566
|
+
...isLocalizedContentType ? { locale: { $in: locales } } : {},
|
567
|
+
...contentTypes$1.hasDraftAndPublish(strapi2.contentTypes[uid2]) ? { publishedAt: null } : {}
|
537
568
|
},
|
538
569
|
populate: serviceUtils.getDeepPopulate(
|
539
570
|
uid2,
|
@@ -545,7 +576,7 @@ const createLifecyclesService = ({ strapi: strapi2 }) => {
|
|
545
576
|
onCommit(async () => {
|
546
577
|
for (const entry of localeEntries) {
|
547
578
|
const status = await serviceUtils.getVersionStatus(uid2, entry);
|
548
|
-
await getService(strapi2, "history").createVersion({
|
579
|
+
await getService$1(strapi2, "history").createVersion({
|
549
580
|
contentType: uid2,
|
550
581
|
data: omit(FIELDS_TO_IGNORE, entry),
|
551
582
|
relatedDocumentId: documentId,
|
@@ -558,15 +589,19 @@ const createLifecyclesService = ({ strapi: strapi2 }) => {
|
|
558
589
|
});
|
559
590
|
return result;
|
560
591
|
});
|
561
|
-
state.deleteExpiredJob = scheduleJob("0 0 * * *", () => {
|
592
|
+
state.deleteExpiredJob = scheduleJob("historyDaily", "0 0 * * *", () => {
|
562
593
|
const retentionDaysInMilliseconds = serviceUtils.getRetentionDays() * 24 * 60 * 60 * 1e3;
|
563
594
|
const expirationDate = new Date(Date.now() - retentionDaysInMilliseconds);
|
564
595
|
strapi2.db.query(HISTORY_VERSION_UID).deleteMany({
|
565
596
|
where: {
|
566
597
|
created_at: {
|
567
|
-
$lt: expirationDate
|
598
|
+
$lt: expirationDate
|
568
599
|
}
|
569
600
|
}
|
601
|
+
}).catch((error) => {
|
602
|
+
if (error instanceof Error) {
|
603
|
+
strapi2.log.error("Error deleting expired history versions", error.message);
|
604
|
+
}
|
570
605
|
});
|
571
606
|
});
|
572
607
|
state.isInitialized = true;
|
@@ -578,17 +613,17 @@ const createLifecyclesService = ({ strapi: strapi2 }) => {
|
|
578
613
|
}
|
579
614
|
};
|
580
615
|
};
|
581
|
-
const services$
|
616
|
+
const services$2 = {
|
582
617
|
history: createHistoryService,
|
583
618
|
lifecycles: createLifecyclesService
|
584
619
|
};
|
585
|
-
const info = { pluginName: "content-manager", type: "admin" };
|
620
|
+
const info$1 = { pluginName: "content-manager", type: "admin" };
|
586
621
|
const historyVersionRouter = {
|
587
622
|
type: "admin",
|
588
623
|
routes: [
|
589
624
|
{
|
590
625
|
method: "GET",
|
591
|
-
info,
|
626
|
+
info: info$1,
|
592
627
|
path: "/history-versions",
|
593
628
|
handler: "history-version.findMany",
|
594
629
|
config: {
|
@@ -597,7 +632,7 @@ const historyVersionRouter = {
|
|
597
632
|
},
|
598
633
|
{
|
599
634
|
method: "PUT",
|
600
|
-
info,
|
635
|
+
info: info$1,
|
601
636
|
path: "/history-versions/:versionId/restore",
|
602
637
|
handler: "history-version.restoreVersion",
|
603
638
|
config: {
|
@@ -606,7 +641,7 @@ const historyVersionRouter = {
|
|
606
641
|
}
|
607
642
|
]
|
608
643
|
};
|
609
|
-
const routes$
|
644
|
+
const routes$2 = {
|
610
645
|
"history-version": historyVersionRouter
|
611
646
|
};
|
612
647
|
const historyVersion = {
|
@@ -653,21 +688,21 @@ const historyVersion = {
|
|
653
688
|
}
|
654
689
|
}
|
655
690
|
};
|
656
|
-
const getFeature = () => {
|
691
|
+
const getFeature$1 = () => {
|
657
692
|
if (strapi.ee.features.isEnabled("cms-content-history")) {
|
658
693
|
return {
|
659
694
|
register({ strapi: strapi2 }) {
|
660
695
|
strapi2.get("models").add(historyVersion);
|
661
696
|
},
|
662
697
|
bootstrap({ strapi: strapi2 }) {
|
663
|
-
getService(strapi2, "lifecycles").bootstrap();
|
698
|
+
getService$1(strapi2, "lifecycles").bootstrap();
|
664
699
|
},
|
665
700
|
destroy({ strapi: strapi2 }) {
|
666
|
-
getService(strapi2, "lifecycles").destroy();
|
701
|
+
getService$1(strapi2, "lifecycles").destroy();
|
667
702
|
},
|
668
|
-
controllers: controllers$
|
669
|
-
services: services$
|
670
|
-
routes: routes$
|
703
|
+
controllers: controllers$2,
|
704
|
+
services: services$2,
|
705
|
+
routes: routes$2
|
671
706
|
};
|
672
707
|
}
|
673
708
|
return {
|
@@ -676,9 +711,205 @@ const getFeature = () => {
|
|
676
711
|
}
|
677
712
|
};
|
678
713
|
};
|
679
|
-
const history = getFeature();
|
714
|
+
const history = getFeature$1();
|
715
|
+
const FEATURE_ID = "preview";
|
716
|
+
const info = { pluginName: "content-manager", type: "admin" };
|
717
|
+
const previewRouter = {
|
718
|
+
type: "admin",
|
719
|
+
routes: [
|
720
|
+
{
|
721
|
+
method: "GET",
|
722
|
+
info,
|
723
|
+
path: "/preview/url/:contentType",
|
724
|
+
handler: "preview.getPreviewUrl",
|
725
|
+
config: {
|
726
|
+
policies: ["admin::isAuthenticatedAdmin"]
|
727
|
+
}
|
728
|
+
}
|
729
|
+
]
|
730
|
+
};
|
731
|
+
const routes$1 = {
|
732
|
+
preview: previewRouter
|
733
|
+
};
|
734
|
+
function getService(strapi2, name) {
|
735
|
+
return strapi2.service(`plugin::content-manager.${name}`);
|
736
|
+
}
|
737
|
+
const getPreviewUrlSchema = yup.object().shape({
|
738
|
+
// Will be undefined for single types
|
739
|
+
documentId: yup.string(),
|
740
|
+
locale: yup.string().nullable(),
|
741
|
+
status: yup.string()
|
742
|
+
}).required();
|
743
|
+
const validatePreviewUrl = async (strapi2, uid2, params) => {
|
744
|
+
await validateYupSchema(getPreviewUrlSchema)(params);
|
745
|
+
const newParams = pick(["documentId", "locale", "status"], params);
|
746
|
+
const model = strapi2.getModel(uid2);
|
747
|
+
if (!model || model.modelType !== "contentType") {
|
748
|
+
throw new errors.ValidationError("Invalid content type");
|
749
|
+
}
|
750
|
+
const isSingleType = model?.kind === "singleType";
|
751
|
+
if (!isSingleType && !params.documentId) {
|
752
|
+
throw new errors.ValidationError("documentId is required for Collection Types");
|
753
|
+
}
|
754
|
+
if (isSingleType) {
|
755
|
+
const doc = await strapi2.documents(uid2).findFirst();
|
756
|
+
if (!doc) {
|
757
|
+
throw new errors.NotFoundError("Document not found");
|
758
|
+
}
|
759
|
+
newParams.documentId = doc?.documentId;
|
760
|
+
}
|
761
|
+
if (!newParams.status) {
|
762
|
+
const isDPEnabled = model?.options?.draftAndPublish;
|
763
|
+
newParams.status = isDPEnabled ? "draft" : "published";
|
764
|
+
}
|
765
|
+
return newParams;
|
766
|
+
};
|
767
|
+
const createPreviewController = () => {
|
768
|
+
return {
|
769
|
+
/**
|
770
|
+
* Transforms an entry into a preview URL, so that it can be previewed
|
771
|
+
* in the Content Manager.
|
772
|
+
*/
|
773
|
+
async getPreviewUrl(ctx) {
|
774
|
+
const uid2 = ctx.params.contentType;
|
775
|
+
const query = ctx.request.query;
|
776
|
+
const params = await validatePreviewUrl(strapi, uid2, query);
|
777
|
+
const previewService = getService(strapi, "preview");
|
778
|
+
const url = await previewService.getPreviewUrl(uid2, params);
|
779
|
+
if (!url) {
|
780
|
+
ctx.status = 204;
|
781
|
+
}
|
782
|
+
return {
|
783
|
+
data: { url }
|
784
|
+
};
|
785
|
+
}
|
786
|
+
};
|
787
|
+
};
|
788
|
+
const controllers$1 = {
|
789
|
+
preview: createPreviewController
|
790
|
+
/**
|
791
|
+
* Casting is needed because the types aren't aware that Strapi supports
|
792
|
+
* passing a controller factory as the value, instead of a controller object directly
|
793
|
+
*/
|
794
|
+
};
|
795
|
+
const createPreviewService = ({ strapi: strapi2 }) => {
|
796
|
+
const config = getService(strapi2, "preview-config");
|
797
|
+
return {
|
798
|
+
async getPreviewUrl(uid2, params) {
|
799
|
+
const handler = config.getPreviewHandler();
|
800
|
+
try {
|
801
|
+
return handler(uid2, params);
|
802
|
+
} catch (error) {
|
803
|
+
strapi2.log.error(`Failed to get preview URL: ${error}`);
|
804
|
+
throw new errors.ApplicationError("Failed to get preview URL");
|
805
|
+
}
|
806
|
+
return;
|
807
|
+
}
|
808
|
+
};
|
809
|
+
};
|
810
|
+
const extendMiddlewareConfiguration = (middleware = { name: "", config: {} }) => {
|
811
|
+
const middlewares = strapi.config.get("middlewares");
|
812
|
+
const configuredMiddlewares = middlewares.map((currentMiddleware) => {
|
813
|
+
if (currentMiddleware === middleware.name) {
|
814
|
+
return middleware;
|
815
|
+
}
|
816
|
+
if (currentMiddleware.name === middleware.name) {
|
817
|
+
return mergeWith(
|
818
|
+
(objValue, srcValue) => {
|
819
|
+
if (Array.isArray(objValue)) {
|
820
|
+
return objValue.concat(srcValue);
|
821
|
+
}
|
822
|
+
return void 0;
|
823
|
+
},
|
824
|
+
currentMiddleware,
|
825
|
+
middleware
|
826
|
+
);
|
827
|
+
}
|
828
|
+
return currentMiddleware;
|
829
|
+
});
|
830
|
+
strapi.config.set("middlewares", configuredMiddlewares);
|
831
|
+
};
|
832
|
+
const createPreviewConfigService = ({ strapi: strapi2 }) => {
|
833
|
+
return {
|
834
|
+
register() {
|
835
|
+
if (!this.isEnabled()) {
|
836
|
+
return;
|
837
|
+
}
|
838
|
+
const config = strapi2.config.get("admin.preview");
|
839
|
+
if (config.config?.allowedOrigins) {
|
840
|
+
extendMiddlewareConfiguration({
|
841
|
+
name: "strapi::security",
|
842
|
+
config: {
|
843
|
+
contentSecurityPolicy: {
|
844
|
+
directives: {
|
845
|
+
"frame-src": config.config.allowedOrigins
|
846
|
+
}
|
847
|
+
}
|
848
|
+
}
|
849
|
+
});
|
850
|
+
}
|
851
|
+
},
|
852
|
+
isEnabled() {
|
853
|
+
const config = strapi2.config.get("admin.preview");
|
854
|
+
if (!config) {
|
855
|
+
return false;
|
856
|
+
}
|
857
|
+
return config?.enabled ?? true;
|
858
|
+
},
|
859
|
+
/**
|
860
|
+
* Validate if the configuration is valid
|
861
|
+
*/
|
862
|
+
validate() {
|
863
|
+
if (!this.isEnabled()) {
|
864
|
+
return;
|
865
|
+
}
|
866
|
+
const handler = this.getPreviewHandler();
|
867
|
+
if (typeof handler !== "function") {
|
868
|
+
throw new errors.ValidationError(
|
869
|
+
"Preview configuration is invalid. Handler must be a function"
|
870
|
+
);
|
871
|
+
}
|
872
|
+
},
|
873
|
+
/**
|
874
|
+
* Utility to get the preview handler from the configuration
|
875
|
+
*/
|
876
|
+
getPreviewHandler() {
|
877
|
+
const config = strapi2.config.get("admin.preview");
|
878
|
+
const emptyHandler = () => {
|
879
|
+
return void 0;
|
880
|
+
};
|
881
|
+
if (!this.isEnabled()) {
|
882
|
+
return emptyHandler;
|
883
|
+
}
|
884
|
+
return config?.config?.handler || emptyHandler;
|
885
|
+
}
|
886
|
+
};
|
887
|
+
};
|
888
|
+
const services$1 = {
|
889
|
+
preview: createPreviewService,
|
890
|
+
"preview-config": createPreviewConfigService
|
891
|
+
};
|
892
|
+
const getFeature = () => {
|
893
|
+
if (!strapi.features.future.isEnabled(FEATURE_ID)) {
|
894
|
+
return {};
|
895
|
+
}
|
896
|
+
return {
|
897
|
+
register() {
|
898
|
+
const config = getService(strapi, "preview-config");
|
899
|
+
config.validate();
|
900
|
+
config.register();
|
901
|
+
},
|
902
|
+
bootstrap() {
|
903
|
+
},
|
904
|
+
routes: routes$1,
|
905
|
+
controllers: controllers$1,
|
906
|
+
services: services$1
|
907
|
+
};
|
908
|
+
};
|
909
|
+
const preview = getFeature();
|
680
910
|
const register = async ({ strapi: strapi2 }) => {
|
681
911
|
await history.register?.({ strapi: strapi2 });
|
912
|
+
await preview.register?.({ strapi: strapi2 });
|
682
913
|
};
|
683
914
|
const ALLOWED_WEBHOOK_EVENTS = {
|
684
915
|
ENTRY_PUBLISH: "entry.publish",
|
@@ -688,11 +919,12 @@ const bootstrap = async () => {
|
|
688
919
|
Object.entries(ALLOWED_WEBHOOK_EVENTS).forEach(([key, value]) => {
|
689
920
|
strapi.get("webhookStore").addAllowedEvent(key, value);
|
690
921
|
});
|
691
|
-
getService$
|
692
|
-
await getService$
|
693
|
-
await getService$
|
694
|
-
await getService$
|
922
|
+
getService$2("field-sizes").setCustomFieldInputSizes();
|
923
|
+
await getService$2("components").syncConfigurations();
|
924
|
+
await getService$2("content-types").syncConfigurations();
|
925
|
+
await getService$2("permission").registerPermissions();
|
695
926
|
await history.bootstrap?.({ strapi });
|
927
|
+
await preview.bootstrap?.({ strapi });
|
696
928
|
};
|
697
929
|
const destroy = async ({ strapi: strapi2 }) => {
|
698
930
|
await history.destroy?.({ strapi: strapi2 });
|
@@ -1182,7 +1414,8 @@ const admin = {
|
|
1182
1414
|
};
|
1183
1415
|
const routes = {
|
1184
1416
|
admin,
|
1185
|
-
...history.routes ? history.routes : {}
|
1417
|
+
...history.routes ? history.routes : {},
|
1418
|
+
...preview.routes ? preview.routes : {}
|
1186
1419
|
};
|
1187
1420
|
const hasPermissionsSchema = yup$1.object({
|
1188
1421
|
actions: yup$1.array().of(yup$1.string()),
|
@@ -1245,8 +1478,7 @@ const isSortable = (schema, name) => {
|
|
1245
1478
|
if (!_.has(schema.attributes, name)) {
|
1246
1479
|
return false;
|
1247
1480
|
}
|
1248
|
-
if (schema.modelType === "component" && name === "id")
|
1249
|
-
return false;
|
1481
|
+
if (schema.modelType === "component" && name === "id") return false;
|
1250
1482
|
const attribute = schema.attributes[name];
|
1251
1483
|
if (NON_SORTABLES.includes(attribute.type)) {
|
1252
1484
|
return false;
|
@@ -1391,8 +1623,7 @@ const createDefaultSettings = async (schema) => {
|
|
1391
1623
|
};
|
1392
1624
|
};
|
1393
1625
|
const syncSettings = async (configuration, schema) => {
|
1394
|
-
if (isEmpty(configuration.settings))
|
1395
|
-
return createDefaultSettings(schema);
|
1626
|
+
if (isEmpty(configuration.settings)) return createDefaultSettings(schema);
|
1396
1627
|
const defaultField = getDefaultMainField(schema);
|
1397
1628
|
const { mainField = defaultField, defaultSortBy = defaultField } = configuration.settings || {};
|
1398
1629
|
return {
|
@@ -1439,7 +1670,7 @@ const createMetadasSchema = (schema) => {
|
|
1439
1670
|
if (!value) {
|
1440
1671
|
return yup$1.string();
|
1441
1672
|
}
|
1442
|
-
const targetSchema = getService$
|
1673
|
+
const targetSchema = getService$2("content-types").findContentType(
|
1443
1674
|
schema.attributes[key].targetModel
|
1444
1675
|
);
|
1445
1676
|
if (!targetSchema) {
|
@@ -1568,8 +1799,7 @@ const excludeNotCreatableFields = (uid2, permissionChecker2) => (body, path = []
|
|
1568
1799
|
}
|
1569
1800
|
switch (attribute.type) {
|
1570
1801
|
case "relation": {
|
1571
|
-
if (canCreate(attributePath))
|
1572
|
-
return body2;
|
1802
|
+
if (canCreate(attributePath)) return body2;
|
1573
1803
|
return set(attributePath, { set: [] }, body2);
|
1574
1804
|
}
|
1575
1805
|
case "component": {
|
@@ -1579,8 +1809,7 @@ const excludeNotCreatableFields = (uid2, permissionChecker2) => (body, path = []
|
|
1579
1809
|
]);
|
1580
1810
|
}
|
1581
1811
|
default: {
|
1582
|
-
if (canCreate(attributePath))
|
1583
|
-
return body2;
|
1812
|
+
if (canCreate(attributePath)) return body2;
|
1584
1813
|
return set(attributePath, null, body2);
|
1585
1814
|
}
|
1586
1815
|
}
|
@@ -1608,7 +1837,7 @@ const getDocumentLocaleAndStatus = async (request, model, opts = { allowMultiple
|
|
1608
1837
|
}
|
1609
1838
|
};
|
1610
1839
|
const formatDocumentWithMetadata = async (permissionChecker2, uid2, document, opts = {}) => {
|
1611
|
-
const documentMetadata2 = getService$
|
1840
|
+
const documentMetadata2 = getService$2("document-metadata");
|
1612
1841
|
const serviceOutput = await documentMetadata2.formatDocumentWithMetadata(uid2, document, opts);
|
1613
1842
|
let {
|
1614
1843
|
meta: { availableLocales, availableStatus }
|
@@ -1634,8 +1863,8 @@ const createDocument = async (ctx, opts) => {
|
|
1634
1863
|
const { userAbility, user } = ctx.state;
|
1635
1864
|
const { model } = ctx.params;
|
1636
1865
|
const { body } = ctx.request;
|
1637
|
-
const documentManager2 = getService$
|
1638
|
-
const permissionChecker2 = getService$
|
1866
|
+
const documentManager2 = getService$2("document-manager");
|
1867
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
1639
1868
|
if (permissionChecker2.cannot.create()) {
|
1640
1869
|
throw new errors.ForbiddenError();
|
1641
1870
|
}
|
@@ -1655,13 +1884,13 @@ const updateDocument = async (ctx, opts) => {
|
|
1655
1884
|
const { userAbility, user } = ctx.state;
|
1656
1885
|
const { id, model } = ctx.params;
|
1657
1886
|
const { body } = ctx.request;
|
1658
|
-
const documentManager2 = getService$
|
1659
|
-
const permissionChecker2 = getService$
|
1887
|
+
const documentManager2 = getService$2("document-manager");
|
1888
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
1660
1889
|
if (permissionChecker2.cannot.update()) {
|
1661
1890
|
throw new errors.ForbiddenError();
|
1662
1891
|
}
|
1663
1892
|
const permissionQuery = await permissionChecker2.sanitizedQuery.update(ctx.query);
|
1664
|
-
const populate = await getService$
|
1893
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
|
1665
1894
|
const { locale } = await getDocumentLocaleAndStatus(body, model);
|
1666
1895
|
const [documentVersion, documentExists] = await Promise.all([
|
1667
1896
|
documentManager2.findOne(id, model, { populate, locale, status: "draft" }),
|
@@ -1678,7 +1907,7 @@ const updateDocument = async (ctx, opts) => {
|
|
1678
1907
|
throw new errors.ForbiddenError();
|
1679
1908
|
}
|
1680
1909
|
const pickPermittedFields = documentVersion ? permissionChecker2.sanitizeUpdateInput(documentVersion) : permissionChecker2.sanitizeCreateInput;
|
1681
|
-
const setCreator = setCreatorFields({ user, isEdition: true });
|
1910
|
+
const setCreator = documentVersion ? setCreatorFields({ user, isEdition: true }) : setCreatorFields({ user });
|
1682
1911
|
const sanitizeFn = async.pipe(pickPermittedFields, setCreator);
|
1683
1912
|
const sanitizedBody = await sanitizeFn(body);
|
1684
1913
|
return documentManager2.update(documentVersion?.documentId || id, model, {
|
@@ -1692,14 +1921,14 @@ const collectionTypes = {
|
|
1692
1921
|
const { userAbility } = ctx.state;
|
1693
1922
|
const { model } = ctx.params;
|
1694
1923
|
const { query } = ctx.request;
|
1695
|
-
const documentMetadata2 = getService$
|
1696
|
-
const documentManager2 = getService$
|
1697
|
-
const permissionChecker2 = getService$
|
1924
|
+
const documentMetadata2 = getService$2("document-metadata");
|
1925
|
+
const documentManager2 = getService$2("document-manager");
|
1926
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
1698
1927
|
if (permissionChecker2.cannot.read()) {
|
1699
1928
|
return ctx.forbidden();
|
1700
1929
|
}
|
1701
1930
|
const permissionQuery = await permissionChecker2.sanitizedQuery.read(query);
|
1702
|
-
const populate = await getService$
|
1931
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(1).countRelations({ toOne: false, toMany: true }).build();
|
1703
1932
|
const { locale, status } = await getDocumentLocaleAndStatus(query, model);
|
1704
1933
|
const { results: documents, pagination: pagination2 } = await documentManager2.findPage(
|
1705
1934
|
{ ...permissionQuery, populate, locale, status },
|
@@ -1728,13 +1957,13 @@ const collectionTypes = {
|
|
1728
1957
|
async findOne(ctx) {
|
1729
1958
|
const { userAbility } = ctx.state;
|
1730
1959
|
const { model, id } = ctx.params;
|
1731
|
-
const documentManager2 = getService$
|
1732
|
-
const permissionChecker2 = getService$
|
1960
|
+
const documentManager2 = getService$2("document-manager");
|
1961
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
1733
1962
|
if (permissionChecker2.cannot.read()) {
|
1734
1963
|
return ctx.forbidden();
|
1735
1964
|
}
|
1736
1965
|
const permissionQuery = await permissionChecker2.sanitizedQuery.read(ctx.query);
|
1737
|
-
const populate = await getService$
|
1966
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(Infinity).countRelations().build();
|
1738
1967
|
const { locale, status } = await getDocumentLocaleAndStatus(ctx.query, model);
|
1739
1968
|
const version = await documentManager2.findOne(id, model, {
|
1740
1969
|
populate,
|
@@ -1750,7 +1979,7 @@ const collectionTypes = {
|
|
1750
1979
|
permissionChecker2,
|
1751
1980
|
model,
|
1752
1981
|
// @ts-expect-error TODO: fix
|
1753
|
-
{ id, locale, publishedAt: null },
|
1982
|
+
{ documentId: id, locale, publishedAt: null },
|
1754
1983
|
{ availableLocales: true, availableStatus: false }
|
1755
1984
|
);
|
1756
1985
|
ctx.body = { data: {}, meta };
|
@@ -1765,7 +1994,7 @@ const collectionTypes = {
|
|
1765
1994
|
async create(ctx) {
|
1766
1995
|
const { userAbility } = ctx.state;
|
1767
1996
|
const { model } = ctx.params;
|
1768
|
-
const permissionChecker2 = getService$
|
1997
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
1769
1998
|
const [totalEntries, document] = await Promise.all([
|
1770
1999
|
strapi.db.query(model).count(),
|
1771
2000
|
createDocument(ctx)
|
@@ -1786,7 +2015,7 @@ const collectionTypes = {
|
|
1786
2015
|
async update(ctx) {
|
1787
2016
|
const { userAbility } = ctx.state;
|
1788
2017
|
const { model } = ctx.params;
|
1789
|
-
const permissionChecker2 = getService$
|
2018
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
1790
2019
|
const updatedVersion = await updateDocument(ctx);
|
1791
2020
|
const sanitizedVersion = await permissionChecker2.sanitizeOutput(updatedVersion);
|
1792
2021
|
ctx.body = await formatDocumentWithMetadata(permissionChecker2, model, sanitizedVersion);
|
@@ -1795,13 +2024,13 @@ const collectionTypes = {
|
|
1795
2024
|
const { userAbility, user } = ctx.state;
|
1796
2025
|
const { model, sourceId: id } = ctx.params;
|
1797
2026
|
const { body } = ctx.request;
|
1798
|
-
const documentManager2 = getService$
|
1799
|
-
const permissionChecker2 = getService$
|
2027
|
+
const documentManager2 = getService$2("document-manager");
|
2028
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
1800
2029
|
if (permissionChecker2.cannot.create()) {
|
1801
2030
|
return ctx.forbidden();
|
1802
2031
|
}
|
1803
2032
|
const permissionQuery = await permissionChecker2.sanitizedQuery.create(ctx.query);
|
1804
|
-
const populate = await getService$
|
2033
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
|
1805
2034
|
const { locale } = await getDocumentLocaleAndStatus(body, model);
|
1806
2035
|
const document = await documentManager2.findOne(id, model, {
|
1807
2036
|
populate,
|
@@ -1840,13 +2069,13 @@ const collectionTypes = {
|
|
1840
2069
|
async delete(ctx) {
|
1841
2070
|
const { userAbility } = ctx.state;
|
1842
2071
|
const { id, model } = ctx.params;
|
1843
|
-
const documentManager2 = getService$
|
1844
|
-
const permissionChecker2 = getService$
|
2072
|
+
const documentManager2 = getService$2("document-manager");
|
2073
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
1845
2074
|
if (permissionChecker2.cannot.delete()) {
|
1846
2075
|
return ctx.forbidden();
|
1847
2076
|
}
|
1848
2077
|
const permissionQuery = await permissionChecker2.sanitizedQuery.delete(ctx.query);
|
1849
|
-
const populate = await getService$
|
2078
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
|
1850
2079
|
const { locale } = await getDocumentLocaleAndStatus(ctx.query, model);
|
1851
2080
|
const documentLocales = await documentManager2.findLocales(id, model, { populate, locale });
|
1852
2081
|
if (documentLocales.length === 0) {
|
@@ -1868,14 +2097,14 @@ const collectionTypes = {
|
|
1868
2097
|
const { userAbility } = ctx.state;
|
1869
2098
|
const { id, model } = ctx.params;
|
1870
2099
|
const { body } = ctx.request;
|
1871
|
-
const documentManager2 = getService$
|
1872
|
-
const permissionChecker2 = getService$
|
2100
|
+
const documentManager2 = getService$2("document-manager");
|
2101
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
1873
2102
|
if (permissionChecker2.cannot.publish()) {
|
1874
2103
|
return ctx.forbidden();
|
1875
2104
|
}
|
1876
2105
|
const publishedDocument = await strapi.db.transaction(async () => {
|
1877
2106
|
const permissionQuery = await permissionChecker2.sanitizedQuery.publish(ctx.query);
|
1878
|
-
const populate = await getService$
|
2107
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(Infinity).countRelations().build();
|
1879
2108
|
let document;
|
1880
2109
|
const { locale } = await getDocumentLocaleAndStatus(body, model);
|
1881
2110
|
const isCreate = isNil$1(id);
|
@@ -1887,11 +2116,17 @@ const collectionTypes = {
|
|
1887
2116
|
}
|
1888
2117
|
const isUpdate = !isCreate;
|
1889
2118
|
if (isUpdate) {
|
1890
|
-
|
1891
|
-
if (!
|
2119
|
+
const documentExists = documentManager2.exists(model, id);
|
2120
|
+
if (!documentExists) {
|
1892
2121
|
throw new errors.NotFoundError("Document not found");
|
1893
2122
|
}
|
1894
|
-
|
2123
|
+
document = await documentManager2.findOne(id, model, { populate, locale });
|
2124
|
+
if (!document) {
|
2125
|
+
if (permissionChecker2.cannot.create({ locale }) || permissionChecker2.cannot.publish({ locale })) {
|
2126
|
+
throw new errors.ForbiddenError();
|
2127
|
+
}
|
2128
|
+
document = await updateDocument(ctx);
|
2129
|
+
} else if (permissionChecker2.can.update(document)) {
|
1895
2130
|
await updateDocument(ctx);
|
1896
2131
|
}
|
1897
2132
|
}
|
@@ -1917,13 +2152,13 @@ const collectionTypes = {
|
|
1917
2152
|
const { body } = ctx.request;
|
1918
2153
|
const { documentIds } = body;
|
1919
2154
|
await validateBulkActionInput(body);
|
1920
|
-
const documentManager2 = getService$
|
1921
|
-
const permissionChecker2 = getService$
|
2155
|
+
const documentManager2 = getService$2("document-manager");
|
2156
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
1922
2157
|
if (permissionChecker2.cannot.publish()) {
|
1923
2158
|
return ctx.forbidden();
|
1924
2159
|
}
|
1925
2160
|
const permissionQuery = await permissionChecker2.sanitizedQuery.publish(ctx.query);
|
1926
|
-
const populate = await getService$
|
2161
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(Infinity).countRelations().build();
|
1927
2162
|
const { locale } = await getDocumentLocaleAndStatus(body, model, {
|
1928
2163
|
allowMultipleLocales: true
|
1929
2164
|
});
|
@@ -1948,12 +2183,14 @@ const collectionTypes = {
|
|
1948
2183
|
const { body } = ctx.request;
|
1949
2184
|
const { documentIds } = body;
|
1950
2185
|
await validateBulkActionInput(body);
|
1951
|
-
const documentManager2 = getService$
|
1952
|
-
const permissionChecker2 = getService$
|
2186
|
+
const documentManager2 = getService$2("document-manager");
|
2187
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
1953
2188
|
if (permissionChecker2.cannot.unpublish()) {
|
1954
2189
|
return ctx.forbidden();
|
1955
2190
|
}
|
1956
|
-
const { locale } = await getDocumentLocaleAndStatus(body, model
|
2191
|
+
const { locale } = await getDocumentLocaleAndStatus(body, model, {
|
2192
|
+
allowMultipleLocales: true
|
2193
|
+
});
|
1957
2194
|
const entityPromises = documentIds.map(
|
1958
2195
|
(documentId) => documentManager2.findLocales(documentId, model, { locale, isPublished: true })
|
1959
2196
|
);
|
@@ -1976,8 +2213,8 @@ const collectionTypes = {
|
|
1976
2213
|
const {
|
1977
2214
|
body: { discardDraft, ...body }
|
1978
2215
|
} = ctx.request;
|
1979
|
-
const documentManager2 = getService$
|
1980
|
-
const permissionChecker2 = getService$
|
2216
|
+
const documentManager2 = getService$2("document-manager");
|
2217
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
1981
2218
|
if (permissionChecker2.cannot.unpublish()) {
|
1982
2219
|
return ctx.forbidden();
|
1983
2220
|
}
|
@@ -1985,7 +2222,7 @@ const collectionTypes = {
|
|
1985
2222
|
return ctx.forbidden();
|
1986
2223
|
}
|
1987
2224
|
const permissionQuery = await permissionChecker2.sanitizedQuery.unpublish(ctx.query);
|
1988
|
-
const populate = await getService$
|
2225
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
|
1989
2226
|
const { locale } = await getDocumentLocaleAndStatus(body, model);
|
1990
2227
|
const document = await documentManager2.findOne(id, model, {
|
1991
2228
|
populate,
|
@@ -2016,13 +2253,13 @@ const collectionTypes = {
|
|
2016
2253
|
const { userAbility } = ctx.state;
|
2017
2254
|
const { id, model } = ctx.params;
|
2018
2255
|
const { body } = ctx.request;
|
2019
|
-
const documentManager2 = getService$
|
2020
|
-
const permissionChecker2 = getService$
|
2256
|
+
const documentManager2 = getService$2("document-manager");
|
2257
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2021
2258
|
if (permissionChecker2.cannot.discard()) {
|
2022
2259
|
return ctx.forbidden();
|
2023
2260
|
}
|
2024
2261
|
const permissionQuery = await permissionChecker2.sanitizedQuery.discard(ctx.query);
|
2025
|
-
const populate = await getService$
|
2262
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
|
2026
2263
|
const { locale } = await getDocumentLocaleAndStatus(body, model);
|
2027
2264
|
const document = await documentManager2.findOne(id, model, {
|
2028
2265
|
populate,
|
@@ -2047,13 +2284,13 @@ const collectionTypes = {
|
|
2047
2284
|
const { query, body } = ctx.request;
|
2048
2285
|
const { documentIds } = body;
|
2049
2286
|
await validateBulkActionInput(body);
|
2050
|
-
const documentManager2 = getService$
|
2051
|
-
const permissionChecker2 = getService$
|
2287
|
+
const documentManager2 = getService$2("document-manager");
|
2288
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2052
2289
|
if (permissionChecker2.cannot.delete()) {
|
2053
2290
|
return ctx.forbidden();
|
2054
2291
|
}
|
2055
2292
|
const permissionQuery = await permissionChecker2.sanitizedQuery.delete(query);
|
2056
|
-
const populate = await getService$
|
2293
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
|
2057
2294
|
const { locale } = await getDocumentLocaleAndStatus(body, model);
|
2058
2295
|
const documentLocales = await documentManager2.findLocales(documentIds, model, {
|
2059
2296
|
populate,
|
@@ -2074,13 +2311,13 @@ const collectionTypes = {
|
|
2074
2311
|
async countDraftRelations(ctx) {
|
2075
2312
|
const { userAbility } = ctx.state;
|
2076
2313
|
const { model, id } = ctx.params;
|
2077
|
-
const documentManager2 = getService$
|
2078
|
-
const permissionChecker2 = getService$
|
2314
|
+
const documentManager2 = getService$2("document-manager");
|
2315
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2079
2316
|
if (permissionChecker2.cannot.read()) {
|
2080
2317
|
return ctx.forbidden();
|
2081
2318
|
}
|
2082
2319
|
const permissionQuery = await permissionChecker2.sanitizedQuery.read(ctx.query);
|
2083
|
-
const populate = await getService$
|
2320
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
|
2084
2321
|
const { locale, status } = await getDocumentLocaleAndStatus(ctx.query, model);
|
2085
2322
|
const entity = await documentManager2.findOne(id, model, { populate, locale, status });
|
2086
2323
|
if (!entity) {
|
@@ -2099,8 +2336,8 @@ const collectionTypes = {
|
|
2099
2336
|
const ids = ctx.request.query.documentIds;
|
2100
2337
|
const locale = ctx.request.query.locale;
|
2101
2338
|
const { model } = ctx.params;
|
2102
|
-
const documentManager2 = getService$
|
2103
|
-
const permissionChecker2 = getService$
|
2339
|
+
const documentManager2 = getService$2("document-manager");
|
2340
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2104
2341
|
if (permissionChecker2.cannot.read()) {
|
2105
2342
|
return ctx.forbidden();
|
2106
2343
|
}
|
@@ -2124,13 +2361,13 @@ const collectionTypes = {
|
|
2124
2361
|
};
|
2125
2362
|
const components$1 = {
|
2126
2363
|
findComponents(ctx) {
|
2127
|
-
const components2 = getService$
|
2128
|
-
const { toDto } = getService$
|
2364
|
+
const components2 = getService$2("components").findAllComponents();
|
2365
|
+
const { toDto } = getService$2("data-mapper");
|
2129
2366
|
ctx.body = { data: components2.map(toDto) };
|
2130
2367
|
},
|
2131
2368
|
async findComponentConfiguration(ctx) {
|
2132
2369
|
const { uid: uid2 } = ctx.params;
|
2133
|
-
const componentService = getService$
|
2370
|
+
const componentService = getService$2("components");
|
2134
2371
|
const component = componentService.findComponent(uid2);
|
2135
2372
|
if (!component) {
|
2136
2373
|
return ctx.notFound("component.notFound");
|
@@ -2147,7 +2384,7 @@ const components$1 = {
|
|
2147
2384
|
async updateComponentConfiguration(ctx) {
|
2148
2385
|
const { uid: uid2 } = ctx.params;
|
2149
2386
|
const { body } = ctx.request;
|
2150
|
-
const componentService = getService$
|
2387
|
+
const componentService = getService$2("components");
|
2151
2388
|
const component = componentService.findComponent(uid2);
|
2152
2389
|
if (!component) {
|
2153
2390
|
return ctx.notFound("component.notFound");
|
@@ -2181,12 +2418,12 @@ const contentTypes = {
|
|
2181
2418
|
} catch (error) {
|
2182
2419
|
return ctx.send({ error }, 400);
|
2183
2420
|
}
|
2184
|
-
const contentTypes2 = getService$
|
2185
|
-
const { toDto } = getService$
|
2421
|
+
const contentTypes2 = getService$2("content-types").findContentTypesByKind(kind);
|
2422
|
+
const { toDto } = getService$2("data-mapper");
|
2186
2423
|
ctx.body = { data: contentTypes2.map(toDto) };
|
2187
2424
|
},
|
2188
2425
|
async findContentTypesSettings(ctx) {
|
2189
|
-
const { findAllContentTypes, findConfiguration } = getService$
|
2426
|
+
const { findAllContentTypes, findConfiguration } = getService$2("content-types");
|
2190
2427
|
const contentTypes2 = await findAllContentTypes();
|
2191
2428
|
const configurations = await Promise.all(
|
2192
2429
|
contentTypes2.map(async (contentType) => {
|
@@ -2200,7 +2437,7 @@ const contentTypes = {
|
|
2200
2437
|
},
|
2201
2438
|
async findContentTypeConfiguration(ctx) {
|
2202
2439
|
const { uid: uid2 } = ctx.params;
|
2203
|
-
const contentTypeService = getService$
|
2440
|
+
const contentTypeService = getService$2("content-types");
|
2204
2441
|
const contentType = await contentTypeService.findContentType(uid2);
|
2205
2442
|
if (!contentType) {
|
2206
2443
|
return ctx.notFound("contentType.notFound");
|
@@ -2222,13 +2459,13 @@ const contentTypes = {
|
|
2222
2459
|
const { userAbility } = ctx.state;
|
2223
2460
|
const { uid: uid2 } = ctx.params;
|
2224
2461
|
const { body } = ctx.request;
|
2225
|
-
const contentTypeService = getService$
|
2226
|
-
const metricsService = getService$
|
2462
|
+
const contentTypeService = getService$2("content-types");
|
2463
|
+
const metricsService = getService$2("metrics");
|
2227
2464
|
const contentType = await contentTypeService.findContentType(uid2);
|
2228
2465
|
if (!contentType) {
|
2229
2466
|
return ctx.notFound("contentType.notFound");
|
2230
2467
|
}
|
2231
|
-
if (!getService$
|
2468
|
+
if (!getService$2("permission").canConfigureContentType({ userAbility, contentType })) {
|
2232
2469
|
return ctx.forbidden();
|
2233
2470
|
}
|
2234
2471
|
let input;
|
@@ -2261,10 +2498,10 @@ const contentTypes = {
|
|
2261
2498
|
};
|
2262
2499
|
const init = {
|
2263
2500
|
getInitData(ctx) {
|
2264
|
-
const { toDto } = getService$
|
2265
|
-
const { findAllComponents } = getService$
|
2266
|
-
const { getAllFieldSizes } = getService$
|
2267
|
-
const { findAllContentTypes } = getService$
|
2501
|
+
const { toDto } = getService$2("data-mapper");
|
2502
|
+
const { findAllComponents } = getService$2("components");
|
2503
|
+
const { getAllFieldSizes } = getService$2("field-sizes");
|
2504
|
+
const { findAllContentTypes } = getService$2("content-types");
|
2268
2505
|
ctx.body = {
|
2269
2506
|
data: {
|
2270
2507
|
fieldSizes: getAllFieldSizes(),
|
@@ -2300,7 +2537,7 @@ const addFiltersClause = (params, filtersClause) => {
|
|
2300
2537
|
params.filters.$and.push(filtersClause);
|
2301
2538
|
};
|
2302
2539
|
const sanitizeMainField = (model, mainField, userAbility) => {
|
2303
|
-
const permissionChecker2 = getService$
|
2540
|
+
const permissionChecker2 = getService$2("permission-checker").create({
|
2304
2541
|
userAbility,
|
2305
2542
|
model: model.uid
|
2306
2543
|
});
|
@@ -2314,15 +2551,27 @@ const sanitizeMainField = (model, mainField, userAbility) => {
|
|
2314
2551
|
}
|
2315
2552
|
return mainField;
|
2316
2553
|
};
|
2317
|
-
const addStatusToRelations = async (
|
2318
|
-
if (!contentTypes$1.hasDraftAndPublish(strapi.
|
2554
|
+
const addStatusToRelations = async (targetUid, relations2) => {
|
2555
|
+
if (!contentTypes$1.hasDraftAndPublish(strapi.getModel(targetUid))) {
|
2556
|
+
return relations2;
|
2557
|
+
}
|
2558
|
+
const documentMetadata2 = getService$2("document-metadata");
|
2559
|
+
if (!relations2.length) {
|
2319
2560
|
return relations2;
|
2320
2561
|
}
|
2321
|
-
const
|
2322
|
-
const
|
2562
|
+
const firstRelation = relations2[0];
|
2563
|
+
const filters = {
|
2564
|
+
documentId: { $in: relations2.map((r) => r.documentId) },
|
2565
|
+
// NOTE: find the "opposite" status
|
2566
|
+
publishedAt: firstRelation.publishedAt !== null ? { $null: true } : { $notNull: true }
|
2567
|
+
};
|
2568
|
+
const availableStatus = await strapi.query(targetUid).findMany({
|
2569
|
+
select: ["id", "documentId", "locale", "updatedAt", "createdAt", "publishedAt"],
|
2570
|
+
filters
|
2571
|
+
});
|
2323
2572
|
return relations2.map((relation) => {
|
2324
|
-
const availableStatuses =
|
2325
|
-
(availableDocument) => availableDocument.documentId === relation.documentId
|
2573
|
+
const availableStatuses = availableStatus.filter(
|
2574
|
+
(availableDocument) => availableDocument.documentId === relation.documentId && (relation.locale ? availableDocument.locale === relation.locale : true)
|
2326
2575
|
);
|
2327
2576
|
return {
|
2328
2577
|
...relation,
|
@@ -2343,11 +2592,8 @@ const validateLocale = (sourceUid, targetUid, locale) => {
|
|
2343
2592
|
const isLocalized = strapi.plugin("i18n").service("content-types").isLocalizedContentType;
|
2344
2593
|
const isSourceLocalized = isLocalized(sourceModel);
|
2345
2594
|
const isTargetLocalized = isLocalized(targetModel);
|
2346
|
-
let validatedLocale = locale;
|
2347
|
-
if (!targetModel || !isTargetLocalized)
|
2348
|
-
validatedLocale = void 0;
|
2349
2595
|
return {
|
2350
|
-
locale
|
2596
|
+
locale,
|
2351
2597
|
isSourceLocalized,
|
2352
2598
|
isTargetLocalized
|
2353
2599
|
};
|
@@ -2356,8 +2602,7 @@ const validateStatus = (sourceUid, status) => {
|
|
2356
2602
|
const sourceModel = strapi.getModel(sourceUid);
|
2357
2603
|
const isDP = contentTypes$1.hasDraftAndPublish;
|
2358
2604
|
const isSourceDP = isDP(sourceModel);
|
2359
|
-
if (!isSourceDP)
|
2360
|
-
return { status: void 0 };
|
2605
|
+
if (!isSourceDP) return { status: void 0 };
|
2361
2606
|
switch (status) {
|
2362
2607
|
case "published":
|
2363
2608
|
return { status: "published" };
|
@@ -2387,7 +2632,7 @@ const relations = {
|
|
2387
2632
|
ctx.request?.query?.locale
|
2388
2633
|
);
|
2389
2634
|
const { status } = validateStatus(sourceUid, ctx.request?.query?.status);
|
2390
|
-
const permissionChecker2 = getService$
|
2635
|
+
const permissionChecker2 = getService$2("permission-checker").create({
|
2391
2636
|
userAbility,
|
2392
2637
|
model
|
2393
2638
|
});
|
@@ -2412,7 +2657,7 @@ const relations = {
|
|
2412
2657
|
where.id = id;
|
2413
2658
|
}
|
2414
2659
|
const permissionQuery = await permissionChecker2.sanitizedQuery.read(ctx.query);
|
2415
|
-
const populate = await getService$
|
2660
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
|
2416
2661
|
const currentEntity = await strapi.db.query(model).findOne({
|
2417
2662
|
where,
|
2418
2663
|
populate
|
@@ -2427,7 +2672,7 @@ const relations = {
|
|
2427
2672
|
}
|
2428
2673
|
entryId = currentEntity.id;
|
2429
2674
|
}
|
2430
|
-
const modelConfig = isComponent2 ? await getService$
|
2675
|
+
const modelConfig = isComponent2 ? await getService$2("components").findConfiguration(sourceSchema) : await getService$2("content-types").findConfiguration(sourceSchema);
|
2431
2676
|
const targetSchema = strapi.getModel(targetUid);
|
2432
2677
|
const mainField = flow(
|
2433
2678
|
prop(`metadatas.${targetField}.edit.mainField`),
|
@@ -2450,7 +2695,7 @@ const relations = {
|
|
2450
2695
|
attribute,
|
2451
2696
|
fieldsToSelect,
|
2452
2697
|
mainField,
|
2453
|
-
source: { schema: sourceSchema },
|
2698
|
+
source: { schema: sourceSchema, isLocalized: isSourceLocalized },
|
2454
2699
|
target: { schema: targetSchema, isLocalized: isTargetLocalized },
|
2455
2700
|
sourceSchema,
|
2456
2701
|
targetSchema,
|
@@ -2472,7 +2717,8 @@ const relations = {
|
|
2472
2717
|
fieldsToSelect,
|
2473
2718
|
mainField,
|
2474
2719
|
source: {
|
2475
|
-
schema: { uid: sourceUid, modelType: sourceModelType }
|
2720
|
+
schema: { uid: sourceUid, modelType: sourceModelType },
|
2721
|
+
isLocalized: isSourceLocalized
|
2476
2722
|
},
|
2477
2723
|
target: {
|
2478
2724
|
schema: { uid: targetUid },
|
@@ -2480,7 +2726,7 @@ const relations = {
|
|
2480
2726
|
}
|
2481
2727
|
} = await this.extractAndValidateRequestInfo(ctx, id);
|
2482
2728
|
const { idsToOmit, idsToInclude, _q, ...query } = ctx.request.query;
|
2483
|
-
const permissionChecker2 = getService$
|
2729
|
+
const permissionChecker2 = getService$2("permission-checker").create({
|
2484
2730
|
userAbility: ctx.state.userAbility,
|
2485
2731
|
model: targetUid
|
2486
2732
|
});
|
@@ -2510,12 +2756,16 @@ const relations = {
|
|
2510
2756
|
} else {
|
2511
2757
|
where.id = id;
|
2512
2758
|
}
|
2513
|
-
|
2514
|
-
|
2759
|
+
const publishedAt = getPublishedAtClause(status, targetUid);
|
2760
|
+
if (!isEmpty(publishedAt)) {
|
2761
|
+
where[`${alias}.published_at`] = publishedAt;
|
2515
2762
|
}
|
2516
|
-
if (
|
2763
|
+
if (isTargetLocalized && locale) {
|
2517
2764
|
where[`${alias}.locale`] = locale;
|
2518
2765
|
}
|
2766
|
+
if (isSourceLocalized && locale) {
|
2767
|
+
where.locale = locale;
|
2768
|
+
}
|
2519
2769
|
if ((idsToInclude?.length ?? 0) !== 0) {
|
2520
2770
|
where[`${alias}.id`].$notIn = idsToInclude;
|
2521
2771
|
}
|
@@ -2533,7 +2783,8 @@ const relations = {
|
|
2533
2783
|
id: { $notIn: uniq(idsToOmit) }
|
2534
2784
|
});
|
2535
2785
|
}
|
2536
|
-
const
|
2786
|
+
const dbQuery = strapi.get("query-params").transform(targetUid, queryParams);
|
2787
|
+
const res = await strapi.db.query(targetUid).findPage(dbQuery);
|
2537
2788
|
ctx.body = {
|
2538
2789
|
...res,
|
2539
2790
|
results: await addStatusToRelations(targetUid, res.results)
|
@@ -2548,21 +2799,33 @@ const relations = {
|
|
2548
2799
|
attribute,
|
2549
2800
|
targetField,
|
2550
2801
|
fieldsToSelect,
|
2551
|
-
|
2552
|
-
|
2553
|
-
}
|
2554
|
-
target: {
|
2555
|
-
schema: { uid: targetUid }
|
2556
|
-
}
|
2802
|
+
status,
|
2803
|
+
source: { schema: sourceSchema },
|
2804
|
+
target: { schema: targetSchema }
|
2557
2805
|
} = await this.extractAndValidateRequestInfo(ctx, id);
|
2558
|
-
const
|
2806
|
+
const { uid: sourceUid } = sourceSchema;
|
2807
|
+
const { uid: targetUid } = targetSchema;
|
2808
|
+
const permissionQuery = await getService$2("permission-checker").create({ userAbility, model: targetUid }).sanitizedQuery.read({ fields: fieldsToSelect });
|
2559
2809
|
const dbQuery = strapi.db.query(sourceUid);
|
2560
2810
|
const loadRelations = relations$1.isAnyToMany(attribute) ? (...args) => dbQuery.loadPages(...args) : (...args) => dbQuery.load(...args).then((res2) => ({ results: res2 ? [res2] : [] }));
|
2811
|
+
const filters = {};
|
2812
|
+
if (sourceSchema?.options?.draftAndPublish) {
|
2813
|
+
if (targetSchema?.options?.draftAndPublish) {
|
2814
|
+
if (status === "published") {
|
2815
|
+
filters.publishedAt = { $notNull: true };
|
2816
|
+
} else {
|
2817
|
+
filters.publishedAt = { $null: true };
|
2818
|
+
}
|
2819
|
+
}
|
2820
|
+
} else if (targetSchema?.options?.draftAndPublish) {
|
2821
|
+
filters.publishedAt = { $null: true };
|
2822
|
+
}
|
2561
2823
|
const res = await loadRelations({ id: entryId }, targetField, {
|
2562
|
-
select: ["id", "documentId", "locale", "publishedAt"],
|
2824
|
+
select: ["id", "documentId", "locale", "publishedAt", "updatedAt"],
|
2563
2825
|
ordering: "desc",
|
2564
2826
|
page: ctx.request.query.page,
|
2565
|
-
pageSize: ctx.request.query.pageSize
|
2827
|
+
pageSize: ctx.request.query.pageSize,
|
2828
|
+
filters
|
2566
2829
|
});
|
2567
2830
|
const loadedIds = res.results.map((item) => item.id);
|
2568
2831
|
addFiltersClause(permissionQuery, { id: { $in: loadedIds } });
|
@@ -2583,10 +2846,10 @@ const relations = {
|
|
2583
2846
|
}
|
2584
2847
|
};
|
2585
2848
|
const buildPopulateFromQuery = async (query, model) => {
|
2586
|
-
return getService$
|
2849
|
+
return getService$2("populate-builder")(model).populateFromQuery(query).populateDeep(Infinity).countRelations().build();
|
2587
2850
|
};
|
2588
2851
|
const findDocument = async (query, uid2, opts = {}) => {
|
2589
|
-
const documentManager2 = getService$
|
2852
|
+
const documentManager2 = getService$2("document-manager");
|
2590
2853
|
const populate = await buildPopulateFromQuery(query, uid2);
|
2591
2854
|
return documentManager2.findMany({ ...opts, populate }, uid2).then((documents) => documents[0]);
|
2592
2855
|
};
|
@@ -2594,8 +2857,8 @@ const createOrUpdateDocument = async (ctx, opts) => {
|
|
2594
2857
|
const { user, userAbility } = ctx.state;
|
2595
2858
|
const { model } = ctx.params;
|
2596
2859
|
const { body, query } = ctx.request;
|
2597
|
-
const documentManager2 = getService$
|
2598
|
-
const permissionChecker2 = getService$
|
2860
|
+
const documentManager2 = getService$2("document-manager");
|
2861
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2599
2862
|
if (permissionChecker2.cannot.create() && permissionChecker2.cannot.update()) {
|
2600
2863
|
throw new errors.ForbiddenError();
|
2601
2864
|
}
|
@@ -2636,7 +2899,7 @@ const singleTypes = {
|
|
2636
2899
|
const { userAbility } = ctx.state;
|
2637
2900
|
const { model } = ctx.params;
|
2638
2901
|
const { query = {} } = ctx.request;
|
2639
|
-
const permissionChecker2 = getService$
|
2902
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2640
2903
|
if (permissionChecker2.cannot.read()) {
|
2641
2904
|
return ctx.forbidden();
|
2642
2905
|
}
|
@@ -2655,7 +2918,7 @@ const singleTypes = {
|
|
2655
2918
|
permissionChecker2,
|
2656
2919
|
model,
|
2657
2920
|
// @ts-expect-error - fix types
|
2658
|
-
{
|
2921
|
+
{ documentId: document.documentId, locale, publishedAt: null },
|
2659
2922
|
{ availableLocales: true, availableStatus: false }
|
2660
2923
|
);
|
2661
2924
|
ctx.body = { data: {}, meta };
|
@@ -2670,7 +2933,7 @@ const singleTypes = {
|
|
2670
2933
|
async createOrUpdate(ctx) {
|
2671
2934
|
const { userAbility } = ctx.state;
|
2672
2935
|
const { model } = ctx.params;
|
2673
|
-
const permissionChecker2 = getService$
|
2936
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2674
2937
|
const document = await createOrUpdateDocument(ctx);
|
2675
2938
|
const sanitizedDocument = await permissionChecker2.sanitizeOutput(document);
|
2676
2939
|
ctx.body = await formatDocumentWithMetadata(permissionChecker2, model, sanitizedDocument);
|
@@ -2679,8 +2942,8 @@ const singleTypes = {
|
|
2679
2942
|
const { userAbility } = ctx.state;
|
2680
2943
|
const { model } = ctx.params;
|
2681
2944
|
const { query = {} } = ctx.request;
|
2682
|
-
const documentManager2 = getService$
|
2683
|
-
const permissionChecker2 = getService$
|
2945
|
+
const documentManager2 = getService$2("document-manager");
|
2946
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2684
2947
|
if (permissionChecker2.cannot.delete()) {
|
2685
2948
|
return ctx.forbidden();
|
2686
2949
|
}
|
@@ -2708,8 +2971,8 @@ const singleTypes = {
|
|
2708
2971
|
const { userAbility } = ctx.state;
|
2709
2972
|
const { model } = ctx.params;
|
2710
2973
|
const { query = {} } = ctx.request;
|
2711
|
-
const documentManager2 = getService$
|
2712
|
-
const permissionChecker2 = getService$
|
2974
|
+
const documentManager2 = getService$2("document-manager");
|
2975
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2713
2976
|
if (permissionChecker2.cannot.publish()) {
|
2714
2977
|
return ctx.forbidden();
|
2715
2978
|
}
|
@@ -2737,8 +3000,8 @@ const singleTypes = {
|
|
2737
3000
|
body: { discardDraft, ...body },
|
2738
3001
|
query = {}
|
2739
3002
|
} = ctx.request;
|
2740
|
-
const documentManager2 = getService$
|
2741
|
-
const permissionChecker2 = getService$
|
3003
|
+
const documentManager2 = getService$2("document-manager");
|
3004
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2742
3005
|
if (permissionChecker2.cannot.unpublish()) {
|
2743
3006
|
return ctx.forbidden();
|
2744
3007
|
}
|
@@ -2772,8 +3035,8 @@ const singleTypes = {
|
|
2772
3035
|
const { userAbility } = ctx.state;
|
2773
3036
|
const { model } = ctx.params;
|
2774
3037
|
const { body, query = {} } = ctx.request;
|
2775
|
-
const documentManager2 = getService$
|
2776
|
-
const permissionChecker2 = getService$
|
3038
|
+
const documentManager2 = getService$2("document-manager");
|
3039
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2777
3040
|
if (permissionChecker2.cannot.discard()) {
|
2778
3041
|
return ctx.forbidden();
|
2779
3042
|
}
|
@@ -2796,8 +3059,8 @@ const singleTypes = {
|
|
2796
3059
|
const { userAbility } = ctx.state;
|
2797
3060
|
const { model } = ctx.params;
|
2798
3061
|
const { query } = ctx.request;
|
2799
|
-
const documentManager2 = getService$
|
2800
|
-
const permissionChecker2 = getService$
|
3062
|
+
const documentManager2 = getService$2("document-manager");
|
3063
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
2801
3064
|
const { locale } = await getDocumentLocaleAndStatus(query, model);
|
2802
3065
|
if (permissionChecker2.cannot.read()) {
|
2803
3066
|
return ctx.forbidden();
|
@@ -2821,7 +3084,7 @@ const uid$1 = {
|
|
2821
3084
|
const { query = {} } = ctx.request;
|
2822
3085
|
const { locale } = await getDocumentLocaleAndStatus(query, contentTypeUID);
|
2823
3086
|
await validateUIDField(contentTypeUID, field);
|
2824
|
-
const uidService = getService$
|
3087
|
+
const uidService = getService$2("uid");
|
2825
3088
|
ctx.body = {
|
2826
3089
|
data: await uidService.generateUIDField({ contentTypeUID, field, data, locale })
|
2827
3090
|
};
|
@@ -2833,7 +3096,7 @@ const uid$1 = {
|
|
2833
3096
|
const { query = {} } = ctx.request;
|
2834
3097
|
const { locale } = await getDocumentLocaleAndStatus(query, contentTypeUID);
|
2835
3098
|
await validateUIDField(contentTypeUID, field);
|
2836
|
-
const uidService = getService$
|
3099
|
+
const uidService = getService$2("uid");
|
2837
3100
|
const isAvailable = await uidService.checkUIDAvailability({
|
2838
3101
|
contentTypeUID,
|
2839
3102
|
field,
|
@@ -2854,7 +3117,8 @@ const controllers = {
|
|
2854
3117
|
relations,
|
2855
3118
|
"single-types": singleTypes,
|
2856
3119
|
uid: uid$1,
|
2857
|
-
...history.controllers ? history.controllers : {}
|
3120
|
+
...history.controllers ? history.controllers : {},
|
3121
|
+
...preview.controllers ? preview.controllers : {}
|
2858
3122
|
};
|
2859
3123
|
const keys = {
|
2860
3124
|
CONFIGURATION: "configuration"
|
@@ -2983,18 +3247,15 @@ async function syncMetadatas(configuration, schema) {
|
|
2983
3247
|
_.set(updatedMeta, ["list", "searchable"], false);
|
2984
3248
|
_.set(acc, [key], updatedMeta);
|
2985
3249
|
}
|
2986
|
-
if (!_.has(edit, "mainField"))
|
2987
|
-
return acc;
|
3250
|
+
if (!_.has(edit, "mainField")) return acc;
|
2988
3251
|
if (!isRelation$1(attr)) {
|
2989
3252
|
_.set(updatedMeta, "edit", _.omit(edit, ["mainField"]));
|
2990
3253
|
_.set(acc, [key], updatedMeta);
|
2991
3254
|
return acc;
|
2992
3255
|
}
|
2993
|
-
if (edit.mainField === "id")
|
2994
|
-
return acc;
|
3256
|
+
if (edit.mainField === "id") return acc;
|
2995
3257
|
const targetSchema = getTargetSchema(attr.targetModel);
|
2996
|
-
if (!targetSchema)
|
2997
|
-
return acc;
|
3258
|
+
if (!targetSchema) return acc;
|
2998
3259
|
if (!isSortable(targetSchema, edit.mainField) && !isListable(targetSchema, edit.mainField)) {
|
2999
3260
|
_.set(updatedMeta, ["edit", "mainField"], getDefaultMainField(targetSchema));
|
3000
3261
|
_.set(acc, [key], updatedMeta);
|
@@ -3005,12 +3266,12 @@ async function syncMetadatas(configuration, schema) {
|
|
3005
3266
|
return _.assign(metasWithDefaults, updatedMetas);
|
3006
3267
|
}
|
3007
3268
|
const getTargetSchema = (targetModel) => {
|
3008
|
-
return getService$
|
3269
|
+
return getService$2("content-types").findContentType(targetModel);
|
3009
3270
|
};
|
3010
3271
|
const DEFAULT_LIST_LENGTH = 4;
|
3011
3272
|
const MAX_ROW_SIZE = 12;
|
3012
3273
|
const isAllowedFieldSize = (type, size) => {
|
3013
|
-
const { getFieldSize } = getService$
|
3274
|
+
const { getFieldSize } = getService$2("field-sizes");
|
3014
3275
|
const fieldSize = getFieldSize(type);
|
3015
3276
|
if (!fieldSize.isResizable && size !== fieldSize.default) {
|
3016
3277
|
return false;
|
@@ -3018,7 +3279,7 @@ const isAllowedFieldSize = (type, size) => {
|
|
3018
3279
|
return size <= MAX_ROW_SIZE;
|
3019
3280
|
};
|
3020
3281
|
const getDefaultFieldSize = (attribute) => {
|
3021
|
-
const { hasFieldSize, getFieldSize } = getService$
|
3282
|
+
const { hasFieldSize, getFieldSize } = getService$2("field-sizes");
|
3022
3283
|
return getFieldSize(hasFieldSize(attribute.customField) ? attribute.customField : attribute.type).default;
|
3023
3284
|
};
|
3024
3285
|
async function createDefaultLayouts(schema) {
|
@@ -3039,8 +3300,7 @@ function createDefaultEditLayout(schema) {
|
|
3039
3300
|
return appendToEditLayout([], keys2, schema);
|
3040
3301
|
}
|
3041
3302
|
function syncLayouts(configuration, schema) {
|
3042
|
-
if (_.isEmpty(configuration.layouts))
|
3043
|
-
return createDefaultLayouts(schema);
|
3303
|
+
if (_.isEmpty(configuration.layouts)) return createDefaultLayouts(schema);
|
3044
3304
|
const { list = [], editRelations = [], edit = [] } = configuration.layouts || {};
|
3045
3305
|
let cleanList = list.filter((attr) => isListable(schema, attr));
|
3046
3306
|
const cleanEditRelations = editRelations.filter(
|
@@ -3051,9 +3311,8 @@ function syncLayouts(configuration, schema) {
|
|
3051
3311
|
for (const row of edit) {
|
3052
3312
|
const newRow = [];
|
3053
3313
|
for (const el of row) {
|
3054
|
-
if (!hasEditableAttribute(schema, el.name))
|
3055
|
-
|
3056
|
-
const { hasFieldSize } = getService$1("field-sizes");
|
3314
|
+
if (!hasEditableAttribute(schema, el.name)) continue;
|
3315
|
+
const { hasFieldSize } = getService$2("field-sizes");
|
3057
3316
|
const fieldType = hasFieldSize(schema.attributes[el.name].customField) ? schema.attributes[el.name].customField : schema.attributes[el.name].type;
|
3058
3317
|
if (!isAllowedFieldSize(fieldType, el.size)) {
|
3059
3318
|
elementsToReAppend.push(el.name);
|
@@ -3083,8 +3342,7 @@ function syncLayouts(configuration, schema) {
|
|
3083
3342
|
};
|
3084
3343
|
}
|
3085
3344
|
const appendToEditLayout = (layout = [], keysToAppend, schema) => {
|
3086
|
-
if (keysToAppend.length === 0)
|
3087
|
-
return layout;
|
3345
|
+
if (keysToAppend.length === 0) return layout;
|
3088
3346
|
let currentRowIndex = Math.max(layout.length - 1, 0);
|
3089
3347
|
if (!layout[currentRowIndex]) {
|
3090
3348
|
layout[currentRowIndex] = [];
|
@@ -3193,17 +3451,17 @@ const configurationService$1 = createConfigurationService({
|
|
3193
3451
|
isComponent: true,
|
3194
3452
|
prefix: STORE_KEY_PREFIX,
|
3195
3453
|
getModels() {
|
3196
|
-
const { toContentManagerModel } = getService$
|
3454
|
+
const { toContentManagerModel } = getService$2("data-mapper");
|
3197
3455
|
return mapValues(toContentManagerModel, strapi.components);
|
3198
3456
|
}
|
3199
3457
|
});
|
3200
3458
|
const components = ({ strapi: strapi2 }) => ({
|
3201
3459
|
findAllComponents() {
|
3202
|
-
const { toContentManagerModel } = getService$
|
3460
|
+
const { toContentManagerModel } = getService$2("data-mapper");
|
3203
3461
|
return Object.values(strapi2.components).map(toContentManagerModel);
|
3204
3462
|
},
|
3205
3463
|
findComponent(uid2) {
|
3206
|
-
const { toContentManagerModel } = getService$
|
3464
|
+
const { toContentManagerModel } = getService$2("data-mapper");
|
3207
3465
|
const component = strapi2.components[uid2];
|
3208
3466
|
return isNil$1(component) ? component : toContentManagerModel(component);
|
3209
3467
|
},
|
@@ -3254,17 +3512,17 @@ const configurationService = createConfigurationService({
|
|
3254
3512
|
storeUtils,
|
3255
3513
|
prefix: "content_types",
|
3256
3514
|
getModels() {
|
3257
|
-
const { toContentManagerModel } = getService$
|
3515
|
+
const { toContentManagerModel } = getService$2("data-mapper");
|
3258
3516
|
return mapValues(toContentManagerModel, strapi.contentTypes);
|
3259
3517
|
}
|
3260
3518
|
});
|
3261
3519
|
const service = ({ strapi: strapi2 }) => ({
|
3262
3520
|
findAllContentTypes() {
|
3263
|
-
const { toContentManagerModel } = getService$
|
3521
|
+
const { toContentManagerModel } = getService$2("data-mapper");
|
3264
3522
|
return Object.values(strapi2.contentTypes).map(toContentManagerModel);
|
3265
3523
|
},
|
3266
3524
|
findContentType(uid2) {
|
3267
|
-
const { toContentManagerModel } = getService$
|
3525
|
+
const { toContentManagerModel } = getService$2("data-mapper");
|
3268
3526
|
const contentType = strapi2.contentTypes[uid2];
|
3269
3527
|
return isNil$1(contentType) ? contentType : toContentManagerModel(contentType);
|
3270
3528
|
},
|
@@ -3293,7 +3551,7 @@ const service = ({ strapi: strapi2 }) => ({
|
|
3293
3551
|
return this.findConfiguration(contentType);
|
3294
3552
|
},
|
3295
3553
|
findComponentsConfigurations(contentType) {
|
3296
|
-
return getService$
|
3554
|
+
return getService$2("components").findComponentsConfigurations(contentType);
|
3297
3555
|
},
|
3298
3556
|
syncConfigurations() {
|
3299
3557
|
return configurationService.syncConfigurations();
|
@@ -3565,7 +3823,7 @@ const permission = ({ strapi: strapi2 }) => ({
|
|
3565
3823
|
return userAbility.can(action);
|
3566
3824
|
},
|
3567
3825
|
async registerPermissions() {
|
3568
|
-
const displayedContentTypes = getService$
|
3826
|
+
const displayedContentTypes = getService$2("content-types").findDisplayedContentTypes();
|
3569
3827
|
const contentTypesUids = displayedContentTypes.map(prop("uid"));
|
3570
3828
|
const actions = [
|
3571
3829
|
{
|
@@ -3841,7 +4099,7 @@ const getQueryPopulate = async (uid2, query) => {
|
|
3841
4099
|
return populateQuery;
|
3842
4100
|
};
|
3843
4101
|
const buildDeepPopulate = (uid2) => {
|
3844
|
-
return getService$
|
4102
|
+
return getService$2("populate-builder")(uid2).populateDeep(Infinity).countRelations().build();
|
3845
4103
|
};
|
3846
4104
|
const populateBuilder = (uid2) => {
|
3847
4105
|
let getInitialPopulate = async () => {
|
@@ -4026,7 +4284,9 @@ const documentMetadata = ({ strapi: strapi2 }) => ({
|
|
4026
4284
|
*/
|
4027
4285
|
async getAvailableLocales(uid2, version, allVersions, validatableFields = []) {
|
4028
4286
|
const versionsByLocale = groupBy("locale", allVersions);
|
4029
|
-
|
4287
|
+
if (version.locale) {
|
4288
|
+
delete versionsByLocale[version.locale];
|
4289
|
+
}
|
4030
4290
|
const model = strapi2.getModel(uid2);
|
4031
4291
|
const keysToKeep = [...AVAILABLE_LOCALES_FIELDS, ...validatableFields];
|
4032
4292
|
const traversalFunction = async (localeVersion) => traverseEntity(
|
@@ -4073,8 +4333,7 @@ const documentMetadata = ({ strapi: strapi2 }) => ({
|
|
4073
4333
|
const matchStatus = status === "published" ? v.publishedAt !== null : v.publishedAt === null;
|
4074
4334
|
return matchLocale && matchStatus;
|
4075
4335
|
});
|
4076
|
-
if (!availableStatus)
|
4077
|
-
return availableStatus;
|
4336
|
+
if (!availableStatus) return availableStatus;
|
4078
4337
|
return pick(AVAILABLE_STATUS_FIELDS, availableStatus);
|
4079
4338
|
},
|
4080
4339
|
/**
|
@@ -4084,8 +4343,7 @@ const documentMetadata = ({ strapi: strapi2 }) => ({
|
|
4084
4343
|
* @returns
|
4085
4344
|
*/
|
4086
4345
|
async getManyAvailableStatus(uid2, documents) {
|
4087
|
-
if (!documents.length)
|
4088
|
-
return [];
|
4346
|
+
if (!documents.length) return [];
|
4089
4347
|
const status = documents[0].publishedAt !== null ? "published" : "draft";
|
4090
4348
|
const locale = documents[0]?.locale;
|
4091
4349
|
const otherStatus = status === "published" ? "draft" : "published";
|
@@ -4112,10 +4370,8 @@ const documentMetadata = ({ strapi: strapi2 }) => ({
|
|
4112
4370
|
} else if (otherVersion) {
|
4113
4371
|
draftVersion = otherVersion;
|
4114
4372
|
}
|
4115
|
-
if (!draftVersion)
|
4116
|
-
|
4117
|
-
if (!publishedVersion)
|
4118
|
-
return CONTENT_MANAGER_STATUS.DRAFT;
|
4373
|
+
if (!draftVersion) return CONTENT_MANAGER_STATUS.PUBLISHED;
|
4374
|
+
if (!publishedVersion) return CONTENT_MANAGER_STATUS.DRAFT;
|
4119
4375
|
const isDraftModified = getIsVersionLatestModification(draftVersion, publishedVersion);
|
4120
4376
|
return isDraftModified ? CONTENT_MANAGER_STATUS.MODIFIED : CONTENT_MANAGER_STATUS.PUBLISHED;
|
4121
4377
|
},
|
@@ -4382,7 +4638,8 @@ const services = {
|
|
4382
4638
|
permission,
|
4383
4639
|
"populate-builder": populateBuilder$1,
|
4384
4640
|
uid,
|
4385
|
-
...history.services ? history.services : {}
|
4641
|
+
...history.services ? history.services : {},
|
4642
|
+
...preview.services ? preview.services : {}
|
4386
4643
|
};
|
4387
4644
|
const index = () => {
|
4388
4645
|
return {
|