@strapi/content-manager 0.0.0-experimental.5691f94a497e119f564a7f60ce0830bf4c875eb9 → 0.0.0-experimental.58c6b635911a7cb83cd165b4e5abd75b8ec30893
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-qemkOlnj.mjs → ComponentConfigurationPage-BpM_Hc7r.mjs} +4 -4
- package/dist/_chunks/{ComponentConfigurationPage-qemkOlnj.mjs.map → ComponentConfigurationPage-BpM_Hc7r.mjs.map} +1 -1
- package/dist/_chunks/{ComponentConfigurationPage-D_M8iBw5.js → ComponentConfigurationPage-CL9CAMaL.js} +4 -4
- package/dist/_chunks/{ComponentConfigurationPage-D_M8iBw5.js.map → ComponentConfigurationPage-CL9CAMaL.js.map} +1 -1
- package/dist/_chunks/{EditConfigurationPage-BePwPuHy.js → EditConfigurationPage-ILWo0h1e.js} +4 -4
- package/dist/_chunks/{EditConfigurationPage-BePwPuHy.js.map → EditConfigurationPage-ILWo0h1e.js.map} +1 -1
- package/dist/_chunks/{EditConfigurationPage-CjUrEewK.mjs → EditConfigurationPage-_prbqpTM.mjs} +4 -4
- package/dist/_chunks/{EditConfigurationPage-CjUrEewK.mjs.map → EditConfigurationPage-_prbqpTM.mjs.map} +1 -1
- package/dist/_chunks/{EditViewPage-B-RJeiJD.js → EditViewPage-BqZvBN4s.js} +15 -5
- package/dist/_chunks/EditViewPage-BqZvBN4s.js.map +1 -0
- package/dist/_chunks/{EditViewPage-De8GyU8P.mjs → EditViewPage-DAtscabN.mjs} +15 -5
- package/dist/_chunks/EditViewPage-DAtscabN.mjs.map +1 -0
- package/dist/_chunks/{Field-dq8Tg1M_.js → Field-CcoQiiz1.js} +92 -86
- package/dist/_chunks/Field-CcoQiiz1.js.map +1 -0
- package/dist/_chunks/{Field-pb2o8uBe.mjs → Field-D-mgn1tH.mjs} +88 -82
- package/dist/_chunks/Field-D-mgn1tH.mjs.map +1 -0
- package/dist/_chunks/{Form-DJn0Dxha.mjs → Form-BxyeWiXW.mjs} +16 -8
- package/dist/_chunks/Form-BxyeWiXW.mjs.map +1 -0
- package/dist/_chunks/{Form-DGIf4jQU.js → Form-CmLbZDfi.js} +16 -8
- package/dist/_chunks/Form-CmLbZDfi.js.map +1 -0
- package/dist/_chunks/{History-BowL3JKP.mjs → History-BOhLaq_g.mjs} +38 -41
- package/dist/_chunks/History-BOhLaq_g.mjs.map +1 -0
- package/dist/_chunks/{History-Dh2NEHnR.js → History-uECUbCZB.js} +37 -40
- package/dist/_chunks/History-uECUbCZB.js.map +1 -0
- package/dist/_chunks/{ListConfigurationPage-BpVOB-hn.mjs → ListConfigurationPage-D0vQez6F.mjs} +3 -3
- package/dist/_chunks/{ListConfigurationPage-BpVOB-hn.mjs.map → ListConfigurationPage-D0vQez6F.mjs.map} +1 -1
- package/dist/_chunks/{ListConfigurationPage-BxYCWz9e.js → ListConfigurationPage-D_bBSFNW.js} +3 -3
- package/dist/_chunks/{ListConfigurationPage-BxYCWz9e.js.map → ListConfigurationPage-D_bBSFNW.js.map} +1 -1
- package/dist/_chunks/{ListViewPage-4XsciqHZ.js → ListViewPage-BkZ83b1A.js} +55 -40
- package/dist/_chunks/ListViewPage-BkZ83b1A.js.map +1 -0
- package/dist/_chunks/{ListViewPage-CXFUjZQC.mjs → ListViewPage-ns-bmy5C.mjs} +52 -37
- package/dist/_chunks/ListViewPage-ns-bmy5C.mjs.map +1 -0
- package/dist/_chunks/{NoContentTypePage-DuhOTp3x.mjs → NoContentTypePage-BA5ZKMDR.mjs} +2 -2
- package/dist/_chunks/{NoContentTypePage-DuhOTp3x.mjs.map → NoContentTypePage-BA5ZKMDR.mjs.map} +1 -1
- package/dist/_chunks/{NoContentTypePage-C8OpoHeU.js → NoContentTypePage-C1439s4s.js} +2 -2
- package/dist/_chunks/{NoContentTypePage-C8OpoHeU.js.map → NoContentTypePage-C1439s4s.js.map} +1 -1
- package/dist/_chunks/{NoPermissionsPage-DVz3mzDz.mjs → NoPermissionsPage-B0GdMw1Q.mjs} +2 -2
- package/dist/_chunks/{NoPermissionsPage-DVz3mzDz.mjs.map → NoPermissionsPage-B0GdMw1Q.mjs.map} +1 -1
- package/dist/_chunks/{NoPermissionsPage-y_r7DVA2.js → NoPermissionsPage-CPGwsVfb.js} +2 -2
- package/dist/_chunks/{NoPermissionsPage-y_r7DVA2.js.map → NoPermissionsPage-CPGwsVfb.js.map} +1 -1
- package/dist/_chunks/{Relations-CVNLrn1Y.mjs → Relations-BIGPMSW4.mjs} +72 -36
- package/dist/_chunks/Relations-BIGPMSW4.mjs.map +1 -0
- package/dist/_chunks/{Relations-DPFCAa7b.js → Relations-d-8Uef_-.js} +71 -35
- package/dist/_chunks/Relations-d-8Uef_-.js.map +1 -0
- package/dist/_chunks/{en-uOUIxfcQ.js → en-Bdpa50w3.js} +18 -13
- package/dist/_chunks/{en-uOUIxfcQ.js.map → en-Bdpa50w3.js.map} +1 -1
- package/dist/_chunks/{en-BrCTWlZv.mjs → en-CZw4xdPY.mjs} +18 -13
- package/dist/_chunks/{en-BrCTWlZv.mjs.map → en-CZw4xdPY.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-DiMrfcfy.mjs → index-3_WeHXYp.mjs} +898 -698
- package/dist/_chunks/index-3_WeHXYp.mjs.map +1 -0
- package/dist/_chunks/{index-C3fJE-1-.js → index-BgaeYWIy.js} +895 -694
- package/dist/_chunks/index-BgaeYWIy.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-C788OmNr.js → layout-ByFyQRDH.js} +5 -4
- package/dist/_chunks/{layout-C788OmNr.js.map → layout-ByFyQRDH.js.map} +1 -1
- package/dist/_chunks/{layout-ls3gxfpH.mjs → layout-CrTxOnCy.mjs} +5 -4
- package/dist/_chunks/{layout-ls3gxfpH.mjs.map → layout-CrTxOnCy.mjs.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-CLcOmGO0.mjs → relations-BlpLgngh.mjs} +3 -7
- package/dist/_chunks/relations-BlpLgngh.mjs.map +1 -0
- package/dist/_chunks/{relations-DYeotliT.js → relations-C5RSW926.js} +3 -7
- package/dist/_chunks/relations-C5RSW926.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 +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/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/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/services/preview.d.ts +3 -0
- package/dist/admin/src/services/documents.d.ts +3 -1
- package/dist/server/index.js +392 -165
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +392 -165
- 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 +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-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 +13 -13
- 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/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
|
@@ -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
|
|
@@ -173,7 +173,9 @@ const createServiceUtils = ({ strapi: strapi2 }) => {
|
|
|
173
173
|
return strapi2.db.query("plugin::upload.file").findOne({ where: { id: versionRelationData.id } });
|
|
174
174
|
};
|
|
175
175
|
const localesService = strapi2.plugin("i18n")?.service("locales");
|
|
176
|
+
const i18nContentTypeService = strapi2.plugin("i18n")?.service("content-types");
|
|
176
177
|
const getDefaultLocale = async () => localesService ? localesService.getDefaultLocale() : null;
|
|
178
|
+
const isLocalizedContentType = (model) => i18nContentTypeService ? i18nContentTypeService.isLocalizedContentType(model) : false;
|
|
177
179
|
const getLocaleDictionary = async () => {
|
|
178
180
|
if (!localesService)
|
|
179
181
|
return {};
|
|
@@ -200,6 +202,17 @@ const createServiceUtils = ({ strapi: strapi2 }) => {
|
|
|
200
202
|
const meta = await documentMetadataService.getMetadata(contentTypeUid, document);
|
|
201
203
|
return documentMetadataService.getStatus(document, meta.availableStatus);
|
|
202
204
|
};
|
|
205
|
+
const getComponentFields = (componentUID) => {
|
|
206
|
+
return Object.entries(strapi2.getModel(componentUID).attributes).reduce(
|
|
207
|
+
(fieldsAcc, [key, attribute]) => {
|
|
208
|
+
if (!["relation", "media", "component", "dynamiczone"].includes(attribute.type)) {
|
|
209
|
+
fieldsAcc.push(key);
|
|
210
|
+
}
|
|
211
|
+
return fieldsAcc;
|
|
212
|
+
},
|
|
213
|
+
[]
|
|
214
|
+
);
|
|
215
|
+
};
|
|
203
216
|
const getDeepPopulate2 = (uid2, useDatabaseSyntax = false) => {
|
|
204
217
|
const model = strapi2.getModel(uid2);
|
|
205
218
|
const attributes = Object.entries(model.attributes);
|
|
@@ -223,13 +236,19 @@ const createServiceUtils = ({ strapi: strapi2 }) => {
|
|
|
223
236
|
}
|
|
224
237
|
case "component": {
|
|
225
238
|
const populate = getDeepPopulate2(attribute.component);
|
|
226
|
-
acc[attributeName] = {
|
|
239
|
+
acc[attributeName] = {
|
|
240
|
+
populate,
|
|
241
|
+
[fieldSelector]: getComponentFields(attribute.component)
|
|
242
|
+
};
|
|
227
243
|
break;
|
|
228
244
|
}
|
|
229
245
|
case "dynamiczone": {
|
|
230
246
|
const populatedComponents = (attribute.components || []).reduce(
|
|
231
247
|
(acc2, componentUID) => {
|
|
232
|
-
acc2[componentUID] = {
|
|
248
|
+
acc2[componentUID] = {
|
|
249
|
+
populate: getDeepPopulate2(componentUID),
|
|
250
|
+
[fieldSelector]: getComponentFields(componentUID)
|
|
251
|
+
};
|
|
233
252
|
return acc2;
|
|
234
253
|
},
|
|
235
254
|
{}
|
|
@@ -291,6 +310,7 @@ const createServiceUtils = ({ strapi: strapi2 }) => {
|
|
|
291
310
|
getRelationRestoreValue,
|
|
292
311
|
getMediaRestoreValue,
|
|
293
312
|
getDefaultLocale,
|
|
313
|
+
isLocalizedContentType,
|
|
294
314
|
getLocaleDictionary,
|
|
295
315
|
getRetentionDays,
|
|
296
316
|
getVersionStatus,
|
|
@@ -313,7 +333,13 @@ const createHistoryService = ({ strapi: strapi2 }) => {
|
|
|
313
333
|
});
|
|
314
334
|
},
|
|
315
335
|
async findVersionsPage(params) {
|
|
316
|
-
const
|
|
336
|
+
const model = strapi2.getModel(params.query.contentType);
|
|
337
|
+
const isLocalizedContentType = serviceUtils.isLocalizedContentType(model);
|
|
338
|
+
const defaultLocale = await serviceUtils.getDefaultLocale();
|
|
339
|
+
let locale = null;
|
|
340
|
+
if (isLocalizedContentType) {
|
|
341
|
+
locale = params.query.locale || defaultLocale;
|
|
342
|
+
}
|
|
317
343
|
const [{ results, pagination: pagination2 }, localeDictionary] = await Promise.all([
|
|
318
344
|
query.findPage({
|
|
319
345
|
...params.query,
|
|
@@ -335,7 +361,7 @@ const createHistoryService = ({ strapi: strapi2 }) => {
|
|
|
335
361
|
const attributeValue = entry.data[attributeKey];
|
|
336
362
|
const attributeValues = Array.isArray(attributeValue) ? attributeValue : [attributeValue];
|
|
337
363
|
if (attributeSchema.type === "media") {
|
|
338
|
-
const permissionChecker2 = getService$
|
|
364
|
+
const permissionChecker2 = getService$2("permission-checker").create({
|
|
339
365
|
userAbility: params.state.userAbility,
|
|
340
366
|
model: "plugin::upload.file"
|
|
341
367
|
});
|
|
@@ -358,7 +384,12 @@ const createHistoryService = ({ strapi: strapi2 }) => {
|
|
|
358
384
|
if (userToPopulate == null) {
|
|
359
385
|
return null;
|
|
360
386
|
}
|
|
361
|
-
return strapi2.query("admin::user").findOne({
|
|
387
|
+
return strapi2.query("admin::user").findOne({
|
|
388
|
+
where: {
|
|
389
|
+
...userToPopulate.id ? { id: userToPopulate.id } : {},
|
|
390
|
+
...userToPopulate.documentId ? { documentId: userToPopulate.documentId } : {}
|
|
391
|
+
}
|
|
392
|
+
});
|
|
362
393
|
})
|
|
363
394
|
);
|
|
364
395
|
return {
|
|
@@ -371,7 +402,7 @@ const createHistoryService = ({ strapi: strapi2 }) => {
|
|
|
371
402
|
[attributeKey]: adminUsers
|
|
372
403
|
};
|
|
373
404
|
}
|
|
374
|
-
const permissionChecker2 = getService$
|
|
405
|
+
const permissionChecker2 = getService$2("permission-checker").create({
|
|
375
406
|
userAbility: params.state.userAbility,
|
|
376
407
|
model: attributeSchema.target
|
|
377
408
|
});
|
|
@@ -529,11 +560,13 @@ const createLifecyclesService = ({ strapi: strapi2 }) => {
|
|
|
529
560
|
}
|
|
530
561
|
const uid2 = context.contentType.uid;
|
|
531
562
|
const schemas = getSchemas(uid2);
|
|
563
|
+
const model = strapi2.getModel(uid2);
|
|
564
|
+
const isLocalizedContentType = serviceUtils.isLocalizedContentType(model);
|
|
532
565
|
const localeEntries = await strapi2.db.query(uid2).findMany({
|
|
533
566
|
where: {
|
|
534
567
|
documentId,
|
|
535
|
-
locale: { $in: locales },
|
|
536
|
-
publishedAt: null
|
|
568
|
+
...isLocalizedContentType ? { locale: { $in: locales } } : {},
|
|
569
|
+
...contentTypes$1.hasDraftAndPublish(strapi2.contentTypes[uid2]) ? { publishedAt: null } : {}
|
|
537
570
|
},
|
|
538
571
|
populate: serviceUtils.getDeepPopulate(
|
|
539
572
|
uid2,
|
|
@@ -545,7 +578,7 @@ const createLifecyclesService = ({ strapi: strapi2 }) => {
|
|
|
545
578
|
onCommit(async () => {
|
|
546
579
|
for (const entry of localeEntries) {
|
|
547
580
|
const status = await serviceUtils.getVersionStatus(uid2, entry);
|
|
548
|
-
await getService(strapi2, "history").createVersion({
|
|
581
|
+
await getService$1(strapi2, "history").createVersion({
|
|
549
582
|
contentType: uid2,
|
|
550
583
|
data: omit(FIELDS_TO_IGNORE, entry),
|
|
551
584
|
relatedDocumentId: documentId,
|
|
@@ -558,15 +591,19 @@ const createLifecyclesService = ({ strapi: strapi2 }) => {
|
|
|
558
591
|
});
|
|
559
592
|
return result;
|
|
560
593
|
});
|
|
561
|
-
state.deleteExpiredJob = scheduleJob("0 0 * * *", () => {
|
|
594
|
+
state.deleteExpiredJob = scheduleJob("historyDaily", "0 0 * * *", () => {
|
|
562
595
|
const retentionDaysInMilliseconds = serviceUtils.getRetentionDays() * 24 * 60 * 60 * 1e3;
|
|
563
596
|
const expirationDate = new Date(Date.now() - retentionDaysInMilliseconds);
|
|
564
597
|
strapi2.db.query(HISTORY_VERSION_UID).deleteMany({
|
|
565
598
|
where: {
|
|
566
599
|
created_at: {
|
|
567
|
-
$lt: expirationDate
|
|
600
|
+
$lt: expirationDate
|
|
568
601
|
}
|
|
569
602
|
}
|
|
603
|
+
}).catch((error) => {
|
|
604
|
+
if (error instanceof Error) {
|
|
605
|
+
strapi2.log.error("Error deleting expired history versions", error.message);
|
|
606
|
+
}
|
|
570
607
|
});
|
|
571
608
|
});
|
|
572
609
|
state.isInitialized = true;
|
|
@@ -578,17 +615,17 @@ const createLifecyclesService = ({ strapi: strapi2 }) => {
|
|
|
578
615
|
}
|
|
579
616
|
};
|
|
580
617
|
};
|
|
581
|
-
const services$
|
|
618
|
+
const services$2 = {
|
|
582
619
|
history: createHistoryService,
|
|
583
620
|
lifecycles: createLifecyclesService
|
|
584
621
|
};
|
|
585
|
-
const info = { pluginName: "content-manager", type: "admin" };
|
|
622
|
+
const info$1 = { pluginName: "content-manager", type: "admin" };
|
|
586
623
|
const historyVersionRouter = {
|
|
587
624
|
type: "admin",
|
|
588
625
|
routes: [
|
|
589
626
|
{
|
|
590
627
|
method: "GET",
|
|
591
|
-
info,
|
|
628
|
+
info: info$1,
|
|
592
629
|
path: "/history-versions",
|
|
593
630
|
handler: "history-version.findMany",
|
|
594
631
|
config: {
|
|
@@ -597,7 +634,7 @@ const historyVersionRouter = {
|
|
|
597
634
|
},
|
|
598
635
|
{
|
|
599
636
|
method: "PUT",
|
|
600
|
-
info,
|
|
637
|
+
info: info$1,
|
|
601
638
|
path: "/history-versions/:versionId/restore",
|
|
602
639
|
handler: "history-version.restoreVersion",
|
|
603
640
|
config: {
|
|
@@ -606,7 +643,7 @@ const historyVersionRouter = {
|
|
|
606
643
|
}
|
|
607
644
|
]
|
|
608
645
|
};
|
|
609
|
-
const routes$
|
|
646
|
+
const routes$2 = {
|
|
610
647
|
"history-version": historyVersionRouter
|
|
611
648
|
};
|
|
612
649
|
const historyVersion = {
|
|
@@ -653,21 +690,21 @@ const historyVersion = {
|
|
|
653
690
|
}
|
|
654
691
|
}
|
|
655
692
|
};
|
|
656
|
-
const getFeature = () => {
|
|
693
|
+
const getFeature$1 = () => {
|
|
657
694
|
if (strapi.ee.features.isEnabled("cms-content-history")) {
|
|
658
695
|
return {
|
|
659
696
|
register({ strapi: strapi2 }) {
|
|
660
697
|
strapi2.get("models").add(historyVersion);
|
|
661
698
|
},
|
|
662
699
|
bootstrap({ strapi: strapi2 }) {
|
|
663
|
-
getService(strapi2, "lifecycles").bootstrap();
|
|
700
|
+
getService$1(strapi2, "lifecycles").bootstrap();
|
|
664
701
|
},
|
|
665
702
|
destroy({ strapi: strapi2 }) {
|
|
666
|
-
getService(strapi2, "lifecycles").destroy();
|
|
703
|
+
getService$1(strapi2, "lifecycles").destroy();
|
|
667
704
|
},
|
|
668
|
-
controllers: controllers$
|
|
669
|
-
services: services$
|
|
670
|
-
routes: routes$
|
|
705
|
+
controllers: controllers$2,
|
|
706
|
+
services: services$2,
|
|
707
|
+
routes: routes$2
|
|
671
708
|
};
|
|
672
709
|
}
|
|
673
710
|
return {
|
|
@@ -676,7 +713,7 @@ const getFeature = () => {
|
|
|
676
713
|
}
|
|
677
714
|
};
|
|
678
715
|
};
|
|
679
|
-
const history = getFeature();
|
|
716
|
+
const history = getFeature$1();
|
|
680
717
|
const register = async ({ strapi: strapi2 }) => {
|
|
681
718
|
await history.register?.({ strapi: strapi2 });
|
|
682
719
|
};
|
|
@@ -684,15 +721,165 @@ const ALLOWED_WEBHOOK_EVENTS = {
|
|
|
684
721
|
ENTRY_PUBLISH: "entry.publish",
|
|
685
722
|
ENTRY_UNPUBLISH: "entry.unpublish"
|
|
686
723
|
};
|
|
724
|
+
const FEATURE_ID = "preview";
|
|
725
|
+
const info = { pluginName: "content-manager", type: "admin" };
|
|
726
|
+
const previewRouter = {
|
|
727
|
+
type: "admin",
|
|
728
|
+
routes: [
|
|
729
|
+
{
|
|
730
|
+
method: "GET",
|
|
731
|
+
info,
|
|
732
|
+
path: "/preview/url/:contentType",
|
|
733
|
+
handler: "preview.getPreviewUrl",
|
|
734
|
+
config: {
|
|
735
|
+
policies: ["admin::isAuthenticatedAdmin"]
|
|
736
|
+
}
|
|
737
|
+
}
|
|
738
|
+
]
|
|
739
|
+
};
|
|
740
|
+
const routes$1 = {
|
|
741
|
+
preview: previewRouter
|
|
742
|
+
};
|
|
743
|
+
function getService(strapi2, name) {
|
|
744
|
+
return strapi2.service(`plugin::content-manager.${name}`);
|
|
745
|
+
}
|
|
746
|
+
const getPreviewUrlSchema = yup.object().shape({
|
|
747
|
+
// Will be undefined for single types
|
|
748
|
+
documentId: yup.string(),
|
|
749
|
+
locale: yup.string().nullable(),
|
|
750
|
+
status: yup.string()
|
|
751
|
+
}).required();
|
|
752
|
+
const validatePreviewUrl = async (strapi2, uid2, params) => {
|
|
753
|
+
await validateYupSchema(getPreviewUrlSchema)(params);
|
|
754
|
+
const newParams = pick(["documentId", "locale", "status"], params);
|
|
755
|
+
const model = strapi2.getModel(uid2);
|
|
756
|
+
if (!model || model.modelType !== "contentType") {
|
|
757
|
+
throw new errors.ValidationError("Invalid content type");
|
|
758
|
+
}
|
|
759
|
+
const isSingleType = model?.kind === "singleType";
|
|
760
|
+
if (!isSingleType && !params.documentId) {
|
|
761
|
+
throw new errors.ValidationError("documentId is required for Collection Types");
|
|
762
|
+
}
|
|
763
|
+
if (isSingleType) {
|
|
764
|
+
const doc = await strapi2.documents(uid2).findFirst();
|
|
765
|
+
if (!doc) {
|
|
766
|
+
throw new errors.NotFoundError("Document not found");
|
|
767
|
+
}
|
|
768
|
+
newParams.documentId = doc?.documentId;
|
|
769
|
+
}
|
|
770
|
+
return newParams;
|
|
771
|
+
};
|
|
772
|
+
const createPreviewController = () => {
|
|
773
|
+
return {
|
|
774
|
+
/**
|
|
775
|
+
* Transforms an entry into a preview URL, so that it can be previewed
|
|
776
|
+
* in the Content Manager.
|
|
777
|
+
*/
|
|
778
|
+
async getPreviewUrl(ctx) {
|
|
779
|
+
const uid2 = ctx.params.contentType;
|
|
780
|
+
const query = ctx.request.query;
|
|
781
|
+
const params = await validatePreviewUrl(strapi, uid2, query);
|
|
782
|
+
const previewService = getService(strapi, "preview");
|
|
783
|
+
const url = await previewService.getPreviewUrl(uid2, params);
|
|
784
|
+
if (!url) {
|
|
785
|
+
ctx.status = 204;
|
|
786
|
+
}
|
|
787
|
+
return {
|
|
788
|
+
data: { url }
|
|
789
|
+
};
|
|
790
|
+
}
|
|
791
|
+
};
|
|
792
|
+
};
|
|
793
|
+
const controllers$1 = {
|
|
794
|
+
preview: createPreviewController
|
|
795
|
+
/**
|
|
796
|
+
* Casting is needed because the types aren't aware that Strapi supports
|
|
797
|
+
* passing a controller factory as the value, instead of a controller object directly
|
|
798
|
+
*/
|
|
799
|
+
};
|
|
800
|
+
const createPreviewService = ({ strapi: strapi2 }) => {
|
|
801
|
+
const config = getService(strapi2, "preview-config");
|
|
802
|
+
return {
|
|
803
|
+
async getPreviewUrl(uid2, params) {
|
|
804
|
+
const handler = config.getPreviewHandler();
|
|
805
|
+
try {
|
|
806
|
+
return handler(uid2, params);
|
|
807
|
+
} catch (error) {
|
|
808
|
+
strapi2.log.error(`Failed to get preview URL: ${error}`);
|
|
809
|
+
throw new errors.ApplicationError("Failed to get preview URL");
|
|
810
|
+
}
|
|
811
|
+
return;
|
|
812
|
+
}
|
|
813
|
+
};
|
|
814
|
+
};
|
|
815
|
+
const createPreviewConfigService = ({ strapi: strapi2 }) => {
|
|
816
|
+
return {
|
|
817
|
+
isEnabled() {
|
|
818
|
+
const config = strapi2.config.get("admin.preview");
|
|
819
|
+
if (!config) {
|
|
820
|
+
return false;
|
|
821
|
+
}
|
|
822
|
+
return config?.enabled ?? true;
|
|
823
|
+
},
|
|
824
|
+
/**
|
|
825
|
+
* Validate if the configuration is valid
|
|
826
|
+
*/
|
|
827
|
+
validate() {
|
|
828
|
+
if (!this.isEnabled()) {
|
|
829
|
+
return;
|
|
830
|
+
}
|
|
831
|
+
const handler = this.getPreviewHandler();
|
|
832
|
+
if (typeof handler !== "function") {
|
|
833
|
+
throw new errors.ValidationError(
|
|
834
|
+
"Preview configuration is invalid. Handler must be a function"
|
|
835
|
+
);
|
|
836
|
+
}
|
|
837
|
+
},
|
|
838
|
+
/**
|
|
839
|
+
* Utility to get the preview handler from the configuration
|
|
840
|
+
*/
|
|
841
|
+
getPreviewHandler() {
|
|
842
|
+
const config = strapi2.config.get("admin.preview");
|
|
843
|
+
const emptyHandler = () => {
|
|
844
|
+
return void 0;
|
|
845
|
+
};
|
|
846
|
+
if (!this.isEnabled()) {
|
|
847
|
+
return emptyHandler;
|
|
848
|
+
}
|
|
849
|
+
return config?.config?.handler || emptyHandler;
|
|
850
|
+
}
|
|
851
|
+
};
|
|
852
|
+
};
|
|
853
|
+
const services$1 = {
|
|
854
|
+
preview: createPreviewService,
|
|
855
|
+
"preview-config": createPreviewConfigService
|
|
856
|
+
};
|
|
857
|
+
const getFeature = () => {
|
|
858
|
+
if (!strapi.features.future.isEnabled(FEATURE_ID)) {
|
|
859
|
+
return {};
|
|
860
|
+
}
|
|
861
|
+
return {
|
|
862
|
+
bootstrap() {
|
|
863
|
+
console.log("Bootstrapping preview server");
|
|
864
|
+
const config = getService(strapi, "preview-config");
|
|
865
|
+
config.validate();
|
|
866
|
+
},
|
|
867
|
+
routes: routes$1,
|
|
868
|
+
controllers: controllers$1,
|
|
869
|
+
services: services$1
|
|
870
|
+
};
|
|
871
|
+
};
|
|
872
|
+
const preview = getFeature();
|
|
687
873
|
const bootstrap = async () => {
|
|
688
874
|
Object.entries(ALLOWED_WEBHOOK_EVENTS).forEach(([key, value]) => {
|
|
689
875
|
strapi.get("webhookStore").addAllowedEvent(key, value);
|
|
690
876
|
});
|
|
691
|
-
getService$
|
|
692
|
-
await getService$
|
|
693
|
-
await getService$
|
|
694
|
-
await getService$
|
|
877
|
+
getService$2("field-sizes").setCustomFieldInputSizes();
|
|
878
|
+
await getService$2("components").syncConfigurations();
|
|
879
|
+
await getService$2("content-types").syncConfigurations();
|
|
880
|
+
await getService$2("permission").registerPermissions();
|
|
695
881
|
await history.bootstrap?.({ strapi });
|
|
882
|
+
await preview.bootstrap?.({ strapi });
|
|
696
883
|
};
|
|
697
884
|
const destroy = async ({ strapi: strapi2 }) => {
|
|
698
885
|
await history.destroy?.({ strapi: strapi2 });
|
|
@@ -1182,7 +1369,8 @@ const admin = {
|
|
|
1182
1369
|
};
|
|
1183
1370
|
const routes = {
|
|
1184
1371
|
admin,
|
|
1185
|
-
...history.routes ? history.routes : {}
|
|
1372
|
+
...history.routes ? history.routes : {},
|
|
1373
|
+
...preview.routes ? preview.routes : {}
|
|
1186
1374
|
};
|
|
1187
1375
|
const hasPermissionsSchema = yup$1.object({
|
|
1188
1376
|
actions: yup$1.array().of(yup$1.string()),
|
|
@@ -1439,7 +1627,7 @@ const createMetadasSchema = (schema) => {
|
|
|
1439
1627
|
if (!value) {
|
|
1440
1628
|
return yup$1.string();
|
|
1441
1629
|
}
|
|
1442
|
-
const targetSchema = getService$
|
|
1630
|
+
const targetSchema = getService$2("content-types").findContentType(
|
|
1443
1631
|
schema.attributes[key].targetModel
|
|
1444
1632
|
);
|
|
1445
1633
|
if (!targetSchema) {
|
|
@@ -1608,7 +1796,7 @@ const getDocumentLocaleAndStatus = async (request, model, opts = { allowMultiple
|
|
|
1608
1796
|
}
|
|
1609
1797
|
};
|
|
1610
1798
|
const formatDocumentWithMetadata = async (permissionChecker2, uid2, document, opts = {}) => {
|
|
1611
|
-
const documentMetadata2 = getService$
|
|
1799
|
+
const documentMetadata2 = getService$2("document-metadata");
|
|
1612
1800
|
const serviceOutput = await documentMetadata2.formatDocumentWithMetadata(uid2, document, opts);
|
|
1613
1801
|
let {
|
|
1614
1802
|
meta: { availableLocales, availableStatus }
|
|
@@ -1634,8 +1822,8 @@ const createDocument = async (ctx, opts) => {
|
|
|
1634
1822
|
const { userAbility, user } = ctx.state;
|
|
1635
1823
|
const { model } = ctx.params;
|
|
1636
1824
|
const { body } = ctx.request;
|
|
1637
|
-
const documentManager2 = getService$
|
|
1638
|
-
const permissionChecker2 = getService$
|
|
1825
|
+
const documentManager2 = getService$2("document-manager");
|
|
1826
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
|
1639
1827
|
if (permissionChecker2.cannot.create()) {
|
|
1640
1828
|
throw new errors.ForbiddenError();
|
|
1641
1829
|
}
|
|
@@ -1655,13 +1843,13 @@ const updateDocument = async (ctx, opts) => {
|
|
|
1655
1843
|
const { userAbility, user } = ctx.state;
|
|
1656
1844
|
const { id, model } = ctx.params;
|
|
1657
1845
|
const { body } = ctx.request;
|
|
1658
|
-
const documentManager2 = getService$
|
|
1659
|
-
const permissionChecker2 = getService$
|
|
1846
|
+
const documentManager2 = getService$2("document-manager");
|
|
1847
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
|
1660
1848
|
if (permissionChecker2.cannot.update()) {
|
|
1661
1849
|
throw new errors.ForbiddenError();
|
|
1662
1850
|
}
|
|
1663
1851
|
const permissionQuery = await permissionChecker2.sanitizedQuery.update(ctx.query);
|
|
1664
|
-
const populate = await getService$
|
|
1852
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
|
|
1665
1853
|
const { locale } = await getDocumentLocaleAndStatus(body, model);
|
|
1666
1854
|
const [documentVersion, documentExists] = await Promise.all([
|
|
1667
1855
|
documentManager2.findOne(id, model, { populate, locale, status: "draft" }),
|
|
@@ -1678,7 +1866,7 @@ const updateDocument = async (ctx, opts) => {
|
|
|
1678
1866
|
throw new errors.ForbiddenError();
|
|
1679
1867
|
}
|
|
1680
1868
|
const pickPermittedFields = documentVersion ? permissionChecker2.sanitizeUpdateInput(documentVersion) : permissionChecker2.sanitizeCreateInput;
|
|
1681
|
-
const setCreator = setCreatorFields({ user, isEdition: true });
|
|
1869
|
+
const setCreator = documentVersion ? setCreatorFields({ user, isEdition: true }) : setCreatorFields({ user });
|
|
1682
1870
|
const sanitizeFn = async.pipe(pickPermittedFields, setCreator);
|
|
1683
1871
|
const sanitizedBody = await sanitizeFn(body);
|
|
1684
1872
|
return documentManager2.update(documentVersion?.documentId || id, model, {
|
|
@@ -1692,14 +1880,14 @@ const collectionTypes = {
|
|
|
1692
1880
|
const { userAbility } = ctx.state;
|
|
1693
1881
|
const { model } = ctx.params;
|
|
1694
1882
|
const { query } = ctx.request;
|
|
1695
|
-
const documentMetadata2 = getService$
|
|
1696
|
-
const documentManager2 = getService$
|
|
1697
|
-
const permissionChecker2 = getService$
|
|
1883
|
+
const documentMetadata2 = getService$2("document-metadata");
|
|
1884
|
+
const documentManager2 = getService$2("document-manager");
|
|
1885
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
|
1698
1886
|
if (permissionChecker2.cannot.read()) {
|
|
1699
1887
|
return ctx.forbidden();
|
|
1700
1888
|
}
|
|
1701
1889
|
const permissionQuery = await permissionChecker2.sanitizedQuery.read(query);
|
|
1702
|
-
const populate = await getService$
|
|
1890
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(1).countRelations({ toOne: false, toMany: true }).build();
|
|
1703
1891
|
const { locale, status } = await getDocumentLocaleAndStatus(query, model);
|
|
1704
1892
|
const { results: documents, pagination: pagination2 } = await documentManager2.findPage(
|
|
1705
1893
|
{ ...permissionQuery, populate, locale, status },
|
|
@@ -1728,13 +1916,13 @@ const collectionTypes = {
|
|
|
1728
1916
|
async findOne(ctx) {
|
|
1729
1917
|
const { userAbility } = ctx.state;
|
|
1730
1918
|
const { model, id } = ctx.params;
|
|
1731
|
-
const documentManager2 = getService$
|
|
1732
|
-
const permissionChecker2 = getService$
|
|
1919
|
+
const documentManager2 = getService$2("document-manager");
|
|
1920
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
|
1733
1921
|
if (permissionChecker2.cannot.read()) {
|
|
1734
1922
|
return ctx.forbidden();
|
|
1735
1923
|
}
|
|
1736
1924
|
const permissionQuery = await permissionChecker2.sanitizedQuery.read(ctx.query);
|
|
1737
|
-
const populate = await getService$
|
|
1925
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(Infinity).countRelations().build();
|
|
1738
1926
|
const { locale, status } = await getDocumentLocaleAndStatus(ctx.query, model);
|
|
1739
1927
|
const version = await documentManager2.findOne(id, model, {
|
|
1740
1928
|
populate,
|
|
@@ -1750,7 +1938,7 @@ const collectionTypes = {
|
|
|
1750
1938
|
permissionChecker2,
|
|
1751
1939
|
model,
|
|
1752
1940
|
// @ts-expect-error TODO: fix
|
|
1753
|
-
{ id, locale, publishedAt: null },
|
|
1941
|
+
{ documentId: id, locale, publishedAt: null },
|
|
1754
1942
|
{ availableLocales: true, availableStatus: false }
|
|
1755
1943
|
);
|
|
1756
1944
|
ctx.body = { data: {}, meta };
|
|
@@ -1765,7 +1953,7 @@ const collectionTypes = {
|
|
|
1765
1953
|
async create(ctx) {
|
|
1766
1954
|
const { userAbility } = ctx.state;
|
|
1767
1955
|
const { model } = ctx.params;
|
|
1768
|
-
const permissionChecker2 = getService$
|
|
1956
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
|
1769
1957
|
const [totalEntries, document] = await Promise.all([
|
|
1770
1958
|
strapi.db.query(model).count(),
|
|
1771
1959
|
createDocument(ctx)
|
|
@@ -1786,7 +1974,7 @@ const collectionTypes = {
|
|
|
1786
1974
|
async update(ctx) {
|
|
1787
1975
|
const { userAbility } = ctx.state;
|
|
1788
1976
|
const { model } = ctx.params;
|
|
1789
|
-
const permissionChecker2 = getService$
|
|
1977
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
|
1790
1978
|
const updatedVersion = await updateDocument(ctx);
|
|
1791
1979
|
const sanitizedVersion = await permissionChecker2.sanitizeOutput(updatedVersion);
|
|
1792
1980
|
ctx.body = await formatDocumentWithMetadata(permissionChecker2, model, sanitizedVersion);
|
|
@@ -1795,13 +1983,13 @@ const collectionTypes = {
|
|
|
1795
1983
|
const { userAbility, user } = ctx.state;
|
|
1796
1984
|
const { model, sourceId: id } = ctx.params;
|
|
1797
1985
|
const { body } = ctx.request;
|
|
1798
|
-
const documentManager2 = getService$
|
|
1799
|
-
const permissionChecker2 = getService$
|
|
1986
|
+
const documentManager2 = getService$2("document-manager");
|
|
1987
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
|
1800
1988
|
if (permissionChecker2.cannot.create()) {
|
|
1801
1989
|
return ctx.forbidden();
|
|
1802
1990
|
}
|
|
1803
1991
|
const permissionQuery = await permissionChecker2.sanitizedQuery.create(ctx.query);
|
|
1804
|
-
const populate = await getService$
|
|
1992
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
|
|
1805
1993
|
const { locale } = await getDocumentLocaleAndStatus(body, model);
|
|
1806
1994
|
const document = await documentManager2.findOne(id, model, {
|
|
1807
1995
|
populate,
|
|
@@ -1840,13 +2028,13 @@ const collectionTypes = {
|
|
|
1840
2028
|
async delete(ctx) {
|
|
1841
2029
|
const { userAbility } = ctx.state;
|
|
1842
2030
|
const { id, model } = ctx.params;
|
|
1843
|
-
const documentManager2 = getService$
|
|
1844
|
-
const permissionChecker2 = getService$
|
|
2031
|
+
const documentManager2 = getService$2("document-manager");
|
|
2032
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
|
1845
2033
|
if (permissionChecker2.cannot.delete()) {
|
|
1846
2034
|
return ctx.forbidden();
|
|
1847
2035
|
}
|
|
1848
2036
|
const permissionQuery = await permissionChecker2.sanitizedQuery.delete(ctx.query);
|
|
1849
|
-
const populate = await getService$
|
|
2037
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
|
|
1850
2038
|
const { locale } = await getDocumentLocaleAndStatus(ctx.query, model);
|
|
1851
2039
|
const documentLocales = await documentManager2.findLocales(id, model, { populate, locale });
|
|
1852
2040
|
if (documentLocales.length === 0) {
|
|
@@ -1868,14 +2056,14 @@ const collectionTypes = {
|
|
|
1868
2056
|
const { userAbility } = ctx.state;
|
|
1869
2057
|
const { id, model } = ctx.params;
|
|
1870
2058
|
const { body } = ctx.request;
|
|
1871
|
-
const documentManager2 = getService$
|
|
1872
|
-
const permissionChecker2 = getService$
|
|
2059
|
+
const documentManager2 = getService$2("document-manager");
|
|
2060
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
|
1873
2061
|
if (permissionChecker2.cannot.publish()) {
|
|
1874
2062
|
return ctx.forbidden();
|
|
1875
2063
|
}
|
|
1876
2064
|
const publishedDocument = await strapi.db.transaction(async () => {
|
|
1877
2065
|
const permissionQuery = await permissionChecker2.sanitizedQuery.publish(ctx.query);
|
|
1878
|
-
const populate = await getService$
|
|
2066
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(Infinity).countRelations().build();
|
|
1879
2067
|
let document;
|
|
1880
2068
|
const { locale } = await getDocumentLocaleAndStatus(body, model);
|
|
1881
2069
|
const isCreate = isNil$1(id);
|
|
@@ -1887,11 +2075,17 @@ const collectionTypes = {
|
|
|
1887
2075
|
}
|
|
1888
2076
|
const isUpdate = !isCreate;
|
|
1889
2077
|
if (isUpdate) {
|
|
1890
|
-
|
|
1891
|
-
if (!
|
|
2078
|
+
const documentExists = documentManager2.exists(model, id);
|
|
2079
|
+
if (!documentExists) {
|
|
1892
2080
|
throw new errors.NotFoundError("Document not found");
|
|
1893
2081
|
}
|
|
1894
|
-
|
|
2082
|
+
document = await documentManager2.findOne(id, model, { populate, locale });
|
|
2083
|
+
if (!document) {
|
|
2084
|
+
if (permissionChecker2.cannot.create({ locale }) || permissionChecker2.cannot.publish({ locale })) {
|
|
2085
|
+
throw new errors.ForbiddenError();
|
|
2086
|
+
}
|
|
2087
|
+
document = await updateDocument(ctx);
|
|
2088
|
+
} else if (permissionChecker2.can.update(document)) {
|
|
1895
2089
|
await updateDocument(ctx);
|
|
1896
2090
|
}
|
|
1897
2091
|
}
|
|
@@ -1917,13 +2111,13 @@ const collectionTypes = {
|
|
|
1917
2111
|
const { body } = ctx.request;
|
|
1918
2112
|
const { documentIds } = body;
|
|
1919
2113
|
await validateBulkActionInput(body);
|
|
1920
|
-
const documentManager2 = getService$
|
|
1921
|
-
const permissionChecker2 = getService$
|
|
2114
|
+
const documentManager2 = getService$2("document-manager");
|
|
2115
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
|
1922
2116
|
if (permissionChecker2.cannot.publish()) {
|
|
1923
2117
|
return ctx.forbidden();
|
|
1924
2118
|
}
|
|
1925
2119
|
const permissionQuery = await permissionChecker2.sanitizedQuery.publish(ctx.query);
|
|
1926
|
-
const populate = await getService$
|
|
2120
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(Infinity).countRelations().build();
|
|
1927
2121
|
const { locale } = await getDocumentLocaleAndStatus(body, model, {
|
|
1928
2122
|
allowMultipleLocales: true
|
|
1929
2123
|
});
|
|
@@ -1948,12 +2142,14 @@ const collectionTypes = {
|
|
|
1948
2142
|
const { body } = ctx.request;
|
|
1949
2143
|
const { documentIds } = body;
|
|
1950
2144
|
await validateBulkActionInput(body);
|
|
1951
|
-
const documentManager2 = getService$
|
|
1952
|
-
const permissionChecker2 = getService$
|
|
2145
|
+
const documentManager2 = getService$2("document-manager");
|
|
2146
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
|
1953
2147
|
if (permissionChecker2.cannot.unpublish()) {
|
|
1954
2148
|
return ctx.forbidden();
|
|
1955
2149
|
}
|
|
1956
|
-
const { locale } = await getDocumentLocaleAndStatus(body, model
|
|
2150
|
+
const { locale } = await getDocumentLocaleAndStatus(body, model, {
|
|
2151
|
+
allowMultipleLocales: true
|
|
2152
|
+
});
|
|
1957
2153
|
const entityPromises = documentIds.map(
|
|
1958
2154
|
(documentId) => documentManager2.findLocales(documentId, model, { locale, isPublished: true })
|
|
1959
2155
|
);
|
|
@@ -1976,8 +2172,8 @@ const collectionTypes = {
|
|
|
1976
2172
|
const {
|
|
1977
2173
|
body: { discardDraft, ...body }
|
|
1978
2174
|
} = ctx.request;
|
|
1979
|
-
const documentManager2 = getService$
|
|
1980
|
-
const permissionChecker2 = getService$
|
|
2175
|
+
const documentManager2 = getService$2("document-manager");
|
|
2176
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
|
1981
2177
|
if (permissionChecker2.cannot.unpublish()) {
|
|
1982
2178
|
return ctx.forbidden();
|
|
1983
2179
|
}
|
|
@@ -1985,7 +2181,7 @@ const collectionTypes = {
|
|
|
1985
2181
|
return ctx.forbidden();
|
|
1986
2182
|
}
|
|
1987
2183
|
const permissionQuery = await permissionChecker2.sanitizedQuery.unpublish(ctx.query);
|
|
1988
|
-
const populate = await getService$
|
|
2184
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
|
|
1989
2185
|
const { locale } = await getDocumentLocaleAndStatus(body, model);
|
|
1990
2186
|
const document = await documentManager2.findOne(id, model, {
|
|
1991
2187
|
populate,
|
|
@@ -2016,13 +2212,13 @@ const collectionTypes = {
|
|
|
2016
2212
|
const { userAbility } = ctx.state;
|
|
2017
2213
|
const { id, model } = ctx.params;
|
|
2018
2214
|
const { body } = ctx.request;
|
|
2019
|
-
const documentManager2 = getService$
|
|
2020
|
-
const permissionChecker2 = getService$
|
|
2215
|
+
const documentManager2 = getService$2("document-manager");
|
|
2216
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
|
2021
2217
|
if (permissionChecker2.cannot.discard()) {
|
|
2022
2218
|
return ctx.forbidden();
|
|
2023
2219
|
}
|
|
2024
2220
|
const permissionQuery = await permissionChecker2.sanitizedQuery.discard(ctx.query);
|
|
2025
|
-
const populate = await getService$
|
|
2221
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
|
|
2026
2222
|
const { locale } = await getDocumentLocaleAndStatus(body, model);
|
|
2027
2223
|
const document = await documentManager2.findOne(id, model, {
|
|
2028
2224
|
populate,
|
|
@@ -2047,13 +2243,13 @@ const collectionTypes = {
|
|
|
2047
2243
|
const { query, body } = ctx.request;
|
|
2048
2244
|
const { documentIds } = body;
|
|
2049
2245
|
await validateBulkActionInput(body);
|
|
2050
|
-
const documentManager2 = getService$
|
|
2051
|
-
const permissionChecker2 = getService$
|
|
2246
|
+
const documentManager2 = getService$2("document-manager");
|
|
2247
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
|
2052
2248
|
if (permissionChecker2.cannot.delete()) {
|
|
2053
2249
|
return ctx.forbidden();
|
|
2054
2250
|
}
|
|
2055
2251
|
const permissionQuery = await permissionChecker2.sanitizedQuery.delete(query);
|
|
2056
|
-
const populate = await getService$
|
|
2252
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
|
|
2057
2253
|
const { locale } = await getDocumentLocaleAndStatus(body, model);
|
|
2058
2254
|
const documentLocales = await documentManager2.findLocales(documentIds, model, {
|
|
2059
2255
|
populate,
|
|
@@ -2074,13 +2270,13 @@ const collectionTypes = {
|
|
|
2074
2270
|
async countDraftRelations(ctx) {
|
|
2075
2271
|
const { userAbility } = ctx.state;
|
|
2076
2272
|
const { model, id } = ctx.params;
|
|
2077
|
-
const documentManager2 = getService$
|
|
2078
|
-
const permissionChecker2 = getService$
|
|
2273
|
+
const documentManager2 = getService$2("document-manager");
|
|
2274
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
|
2079
2275
|
if (permissionChecker2.cannot.read()) {
|
|
2080
2276
|
return ctx.forbidden();
|
|
2081
2277
|
}
|
|
2082
2278
|
const permissionQuery = await permissionChecker2.sanitizedQuery.read(ctx.query);
|
|
2083
|
-
const populate = await getService$
|
|
2279
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
|
|
2084
2280
|
const { locale, status } = await getDocumentLocaleAndStatus(ctx.query, model);
|
|
2085
2281
|
const entity = await documentManager2.findOne(id, model, { populate, locale, status });
|
|
2086
2282
|
if (!entity) {
|
|
@@ -2099,8 +2295,8 @@ const collectionTypes = {
|
|
|
2099
2295
|
const ids = ctx.request.query.documentIds;
|
|
2100
2296
|
const locale = ctx.request.query.locale;
|
|
2101
2297
|
const { model } = ctx.params;
|
|
2102
|
-
const documentManager2 = getService$
|
|
2103
|
-
const permissionChecker2 = getService$
|
|
2298
|
+
const documentManager2 = getService$2("document-manager");
|
|
2299
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
|
2104
2300
|
if (permissionChecker2.cannot.read()) {
|
|
2105
2301
|
return ctx.forbidden();
|
|
2106
2302
|
}
|
|
@@ -2124,13 +2320,13 @@ const collectionTypes = {
|
|
|
2124
2320
|
};
|
|
2125
2321
|
const components$1 = {
|
|
2126
2322
|
findComponents(ctx) {
|
|
2127
|
-
const components2 = getService$
|
|
2128
|
-
const { toDto } = getService$
|
|
2323
|
+
const components2 = getService$2("components").findAllComponents();
|
|
2324
|
+
const { toDto } = getService$2("data-mapper");
|
|
2129
2325
|
ctx.body = { data: components2.map(toDto) };
|
|
2130
2326
|
},
|
|
2131
2327
|
async findComponentConfiguration(ctx) {
|
|
2132
2328
|
const { uid: uid2 } = ctx.params;
|
|
2133
|
-
const componentService = getService$
|
|
2329
|
+
const componentService = getService$2("components");
|
|
2134
2330
|
const component = componentService.findComponent(uid2);
|
|
2135
2331
|
if (!component) {
|
|
2136
2332
|
return ctx.notFound("component.notFound");
|
|
@@ -2147,7 +2343,7 @@ const components$1 = {
|
|
|
2147
2343
|
async updateComponentConfiguration(ctx) {
|
|
2148
2344
|
const { uid: uid2 } = ctx.params;
|
|
2149
2345
|
const { body } = ctx.request;
|
|
2150
|
-
const componentService = getService$
|
|
2346
|
+
const componentService = getService$2("components");
|
|
2151
2347
|
const component = componentService.findComponent(uid2);
|
|
2152
2348
|
if (!component) {
|
|
2153
2349
|
return ctx.notFound("component.notFound");
|
|
@@ -2181,12 +2377,12 @@ const contentTypes = {
|
|
|
2181
2377
|
} catch (error) {
|
|
2182
2378
|
return ctx.send({ error }, 400);
|
|
2183
2379
|
}
|
|
2184
|
-
const contentTypes2 = getService$
|
|
2185
|
-
const { toDto } = getService$
|
|
2380
|
+
const contentTypes2 = getService$2("content-types").findContentTypesByKind(kind);
|
|
2381
|
+
const { toDto } = getService$2("data-mapper");
|
|
2186
2382
|
ctx.body = { data: contentTypes2.map(toDto) };
|
|
2187
2383
|
},
|
|
2188
2384
|
async findContentTypesSettings(ctx) {
|
|
2189
|
-
const { findAllContentTypes, findConfiguration } = getService$
|
|
2385
|
+
const { findAllContentTypes, findConfiguration } = getService$2("content-types");
|
|
2190
2386
|
const contentTypes2 = await findAllContentTypes();
|
|
2191
2387
|
const configurations = await Promise.all(
|
|
2192
2388
|
contentTypes2.map(async (contentType) => {
|
|
@@ -2200,7 +2396,7 @@ const contentTypes = {
|
|
|
2200
2396
|
},
|
|
2201
2397
|
async findContentTypeConfiguration(ctx) {
|
|
2202
2398
|
const { uid: uid2 } = ctx.params;
|
|
2203
|
-
const contentTypeService = getService$
|
|
2399
|
+
const contentTypeService = getService$2("content-types");
|
|
2204
2400
|
const contentType = await contentTypeService.findContentType(uid2);
|
|
2205
2401
|
if (!contentType) {
|
|
2206
2402
|
return ctx.notFound("contentType.notFound");
|
|
@@ -2222,13 +2418,13 @@ const contentTypes = {
|
|
|
2222
2418
|
const { userAbility } = ctx.state;
|
|
2223
2419
|
const { uid: uid2 } = ctx.params;
|
|
2224
2420
|
const { body } = ctx.request;
|
|
2225
|
-
const contentTypeService = getService$
|
|
2226
|
-
const metricsService = getService$
|
|
2421
|
+
const contentTypeService = getService$2("content-types");
|
|
2422
|
+
const metricsService = getService$2("metrics");
|
|
2227
2423
|
const contentType = await contentTypeService.findContentType(uid2);
|
|
2228
2424
|
if (!contentType) {
|
|
2229
2425
|
return ctx.notFound("contentType.notFound");
|
|
2230
2426
|
}
|
|
2231
|
-
if (!getService$
|
|
2427
|
+
if (!getService$2("permission").canConfigureContentType({ userAbility, contentType })) {
|
|
2232
2428
|
return ctx.forbidden();
|
|
2233
2429
|
}
|
|
2234
2430
|
let input;
|
|
@@ -2261,10 +2457,10 @@ const contentTypes = {
|
|
|
2261
2457
|
};
|
|
2262
2458
|
const init = {
|
|
2263
2459
|
getInitData(ctx) {
|
|
2264
|
-
const { toDto } = getService$
|
|
2265
|
-
const { findAllComponents } = getService$
|
|
2266
|
-
const { getAllFieldSizes } = getService$
|
|
2267
|
-
const { findAllContentTypes } = getService$
|
|
2460
|
+
const { toDto } = getService$2("data-mapper");
|
|
2461
|
+
const { findAllComponents } = getService$2("components");
|
|
2462
|
+
const { getAllFieldSizes } = getService$2("field-sizes");
|
|
2463
|
+
const { findAllContentTypes } = getService$2("content-types");
|
|
2268
2464
|
ctx.body = {
|
|
2269
2465
|
data: {
|
|
2270
2466
|
fieldSizes: getAllFieldSizes(),
|
|
@@ -2300,7 +2496,7 @@ const addFiltersClause = (params, filtersClause) => {
|
|
|
2300
2496
|
params.filters.$and.push(filtersClause);
|
|
2301
2497
|
};
|
|
2302
2498
|
const sanitizeMainField = (model, mainField, userAbility) => {
|
|
2303
|
-
const permissionChecker2 = getService$
|
|
2499
|
+
const permissionChecker2 = getService$2("permission-checker").create({
|
|
2304
2500
|
userAbility,
|
|
2305
2501
|
model: model.uid
|
|
2306
2502
|
});
|
|
@@ -2314,15 +2510,27 @@ const sanitizeMainField = (model, mainField, userAbility) => {
|
|
|
2314
2510
|
}
|
|
2315
2511
|
return mainField;
|
|
2316
2512
|
};
|
|
2317
|
-
const addStatusToRelations = async (
|
|
2318
|
-
if (!contentTypes$1.hasDraftAndPublish(strapi.
|
|
2513
|
+
const addStatusToRelations = async (targetUid, relations2) => {
|
|
2514
|
+
if (!contentTypes$1.hasDraftAndPublish(strapi.getModel(targetUid))) {
|
|
2319
2515
|
return relations2;
|
|
2320
2516
|
}
|
|
2321
|
-
const documentMetadata2 = getService$
|
|
2322
|
-
|
|
2517
|
+
const documentMetadata2 = getService$2("document-metadata");
|
|
2518
|
+
if (!relations2.length) {
|
|
2519
|
+
return relations2;
|
|
2520
|
+
}
|
|
2521
|
+
const firstRelation = relations2[0];
|
|
2522
|
+
const filters = {
|
|
2523
|
+
documentId: { $in: relations2.map((r) => r.documentId) },
|
|
2524
|
+
// NOTE: find the "opposite" status
|
|
2525
|
+
publishedAt: firstRelation.publishedAt !== null ? { $null: true } : { $notNull: true }
|
|
2526
|
+
};
|
|
2527
|
+
const availableStatus = await strapi.query(targetUid).findMany({
|
|
2528
|
+
select: ["id", "documentId", "locale", "updatedAt", "createdAt", "publishedAt"],
|
|
2529
|
+
filters
|
|
2530
|
+
});
|
|
2323
2531
|
return relations2.map((relation) => {
|
|
2324
|
-
const availableStatuses =
|
|
2325
|
-
(availableDocument) => availableDocument.documentId === relation.documentId
|
|
2532
|
+
const availableStatuses = availableStatus.filter(
|
|
2533
|
+
(availableDocument) => availableDocument.documentId === relation.documentId && (relation.locale ? availableDocument.locale === relation.locale : true)
|
|
2326
2534
|
);
|
|
2327
2535
|
return {
|
|
2328
2536
|
...relation,
|
|
@@ -2343,11 +2551,8 @@ const validateLocale = (sourceUid, targetUid, locale) => {
|
|
|
2343
2551
|
const isLocalized = strapi.plugin("i18n").service("content-types").isLocalizedContentType;
|
|
2344
2552
|
const isSourceLocalized = isLocalized(sourceModel);
|
|
2345
2553
|
const isTargetLocalized = isLocalized(targetModel);
|
|
2346
|
-
let validatedLocale = locale;
|
|
2347
|
-
if (!targetModel || !isTargetLocalized)
|
|
2348
|
-
validatedLocale = void 0;
|
|
2349
2554
|
return {
|
|
2350
|
-
locale
|
|
2555
|
+
locale,
|
|
2351
2556
|
isSourceLocalized,
|
|
2352
2557
|
isTargetLocalized
|
|
2353
2558
|
};
|
|
@@ -2387,7 +2592,7 @@ const relations = {
|
|
|
2387
2592
|
ctx.request?.query?.locale
|
|
2388
2593
|
);
|
|
2389
2594
|
const { status } = validateStatus(sourceUid, ctx.request?.query?.status);
|
|
2390
|
-
const permissionChecker2 = getService$
|
|
2595
|
+
const permissionChecker2 = getService$2("permission-checker").create({
|
|
2391
2596
|
userAbility,
|
|
2392
2597
|
model
|
|
2393
2598
|
});
|
|
@@ -2412,7 +2617,7 @@ const relations = {
|
|
|
2412
2617
|
where.id = id;
|
|
2413
2618
|
}
|
|
2414
2619
|
const permissionQuery = await permissionChecker2.sanitizedQuery.read(ctx.query);
|
|
2415
|
-
const populate = await getService$
|
|
2620
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
|
|
2416
2621
|
const currentEntity = await strapi.db.query(model).findOne({
|
|
2417
2622
|
where,
|
|
2418
2623
|
populate
|
|
@@ -2427,7 +2632,7 @@ const relations = {
|
|
|
2427
2632
|
}
|
|
2428
2633
|
entryId = currentEntity.id;
|
|
2429
2634
|
}
|
|
2430
|
-
const modelConfig = isComponent2 ? await getService$
|
|
2635
|
+
const modelConfig = isComponent2 ? await getService$2("components").findConfiguration(sourceSchema) : await getService$2("content-types").findConfiguration(sourceSchema);
|
|
2431
2636
|
const targetSchema = strapi.getModel(targetUid);
|
|
2432
2637
|
const mainField = flow(
|
|
2433
2638
|
prop(`metadatas.${targetField}.edit.mainField`),
|
|
@@ -2450,7 +2655,7 @@ const relations = {
|
|
|
2450
2655
|
attribute,
|
|
2451
2656
|
fieldsToSelect,
|
|
2452
2657
|
mainField,
|
|
2453
|
-
source: { schema: sourceSchema },
|
|
2658
|
+
source: { schema: sourceSchema, isLocalized: isSourceLocalized },
|
|
2454
2659
|
target: { schema: targetSchema, isLocalized: isTargetLocalized },
|
|
2455
2660
|
sourceSchema,
|
|
2456
2661
|
targetSchema,
|
|
@@ -2472,7 +2677,8 @@ const relations = {
|
|
|
2472
2677
|
fieldsToSelect,
|
|
2473
2678
|
mainField,
|
|
2474
2679
|
source: {
|
|
2475
|
-
schema: { uid: sourceUid, modelType: sourceModelType }
|
|
2680
|
+
schema: { uid: sourceUid, modelType: sourceModelType },
|
|
2681
|
+
isLocalized: isSourceLocalized
|
|
2476
2682
|
},
|
|
2477
2683
|
target: {
|
|
2478
2684
|
schema: { uid: targetUid },
|
|
@@ -2480,7 +2686,7 @@ const relations = {
|
|
|
2480
2686
|
}
|
|
2481
2687
|
} = await this.extractAndValidateRequestInfo(ctx, id);
|
|
2482
2688
|
const { idsToOmit, idsToInclude, _q, ...query } = ctx.request.query;
|
|
2483
|
-
const permissionChecker2 = getService$
|
|
2689
|
+
const permissionChecker2 = getService$2("permission-checker").create({
|
|
2484
2690
|
userAbility: ctx.state.userAbility,
|
|
2485
2691
|
model: targetUid
|
|
2486
2692
|
});
|
|
@@ -2510,12 +2716,16 @@ const relations = {
|
|
|
2510
2716
|
} else {
|
|
2511
2717
|
where.id = id;
|
|
2512
2718
|
}
|
|
2513
|
-
|
|
2514
|
-
|
|
2719
|
+
const publishedAt = getPublishedAtClause(status, targetUid);
|
|
2720
|
+
if (!isEmpty(publishedAt)) {
|
|
2721
|
+
where[`${alias}.published_at`] = publishedAt;
|
|
2515
2722
|
}
|
|
2516
|
-
if (
|
|
2723
|
+
if (isTargetLocalized && locale) {
|
|
2517
2724
|
where[`${alias}.locale`] = locale;
|
|
2518
2725
|
}
|
|
2726
|
+
if (isSourceLocalized && locale) {
|
|
2727
|
+
where.locale = locale;
|
|
2728
|
+
}
|
|
2519
2729
|
if ((idsToInclude?.length ?? 0) !== 0) {
|
|
2520
2730
|
where[`${alias}.id`].$notIn = idsToInclude;
|
|
2521
2731
|
}
|
|
@@ -2533,7 +2743,8 @@ const relations = {
|
|
|
2533
2743
|
id: { $notIn: uniq(idsToOmit) }
|
|
2534
2744
|
});
|
|
2535
2745
|
}
|
|
2536
|
-
const
|
|
2746
|
+
const dbQuery = strapi.get("query-params").transform(targetUid, queryParams);
|
|
2747
|
+
const res = await strapi.db.query(targetUid).findPage(dbQuery);
|
|
2537
2748
|
ctx.body = {
|
|
2538
2749
|
...res,
|
|
2539
2750
|
results: await addStatusToRelations(targetUid, res.results)
|
|
@@ -2548,21 +2759,33 @@ const relations = {
|
|
|
2548
2759
|
attribute,
|
|
2549
2760
|
targetField,
|
|
2550
2761
|
fieldsToSelect,
|
|
2551
|
-
|
|
2552
|
-
|
|
2553
|
-
}
|
|
2554
|
-
target: {
|
|
2555
|
-
schema: { uid: targetUid }
|
|
2556
|
-
}
|
|
2762
|
+
status,
|
|
2763
|
+
source: { schema: sourceSchema },
|
|
2764
|
+
target: { schema: targetSchema }
|
|
2557
2765
|
} = await this.extractAndValidateRequestInfo(ctx, id);
|
|
2558
|
-
const
|
|
2766
|
+
const { uid: sourceUid } = sourceSchema;
|
|
2767
|
+
const { uid: targetUid } = targetSchema;
|
|
2768
|
+
const permissionQuery = await getService$2("permission-checker").create({ userAbility, model: targetUid }).sanitizedQuery.read({ fields: fieldsToSelect });
|
|
2559
2769
|
const dbQuery = strapi.db.query(sourceUid);
|
|
2560
2770
|
const loadRelations = relations$1.isAnyToMany(attribute) ? (...args) => dbQuery.loadPages(...args) : (...args) => dbQuery.load(...args).then((res2) => ({ results: res2 ? [res2] : [] }));
|
|
2771
|
+
const filters = {};
|
|
2772
|
+
if (sourceSchema?.options?.draftAndPublish) {
|
|
2773
|
+
if (targetSchema?.options?.draftAndPublish) {
|
|
2774
|
+
if (status === "published") {
|
|
2775
|
+
filters.publishedAt = { $notNull: true };
|
|
2776
|
+
} else {
|
|
2777
|
+
filters.publishedAt = { $null: true };
|
|
2778
|
+
}
|
|
2779
|
+
}
|
|
2780
|
+
} else if (targetSchema?.options?.draftAndPublish) {
|
|
2781
|
+
filters.publishedAt = { $null: true };
|
|
2782
|
+
}
|
|
2561
2783
|
const res = await loadRelations({ id: entryId }, targetField, {
|
|
2562
|
-
select: ["id", "documentId", "locale", "publishedAt"],
|
|
2784
|
+
select: ["id", "documentId", "locale", "publishedAt", "updatedAt"],
|
|
2563
2785
|
ordering: "desc",
|
|
2564
2786
|
page: ctx.request.query.page,
|
|
2565
|
-
pageSize: ctx.request.query.pageSize
|
|
2787
|
+
pageSize: ctx.request.query.pageSize,
|
|
2788
|
+
filters
|
|
2566
2789
|
});
|
|
2567
2790
|
const loadedIds = res.results.map((item) => item.id);
|
|
2568
2791
|
addFiltersClause(permissionQuery, { id: { $in: loadedIds } });
|
|
@@ -2583,10 +2806,10 @@ const relations = {
|
|
|
2583
2806
|
}
|
|
2584
2807
|
};
|
|
2585
2808
|
const buildPopulateFromQuery = async (query, model) => {
|
|
2586
|
-
return getService$
|
|
2809
|
+
return getService$2("populate-builder")(model).populateFromQuery(query).populateDeep(Infinity).countRelations().build();
|
|
2587
2810
|
};
|
|
2588
2811
|
const findDocument = async (query, uid2, opts = {}) => {
|
|
2589
|
-
const documentManager2 = getService$
|
|
2812
|
+
const documentManager2 = getService$2("document-manager");
|
|
2590
2813
|
const populate = await buildPopulateFromQuery(query, uid2);
|
|
2591
2814
|
return documentManager2.findMany({ ...opts, populate }, uid2).then((documents) => documents[0]);
|
|
2592
2815
|
};
|
|
@@ -2594,8 +2817,8 @@ const createOrUpdateDocument = async (ctx, opts) => {
|
|
|
2594
2817
|
const { user, userAbility } = ctx.state;
|
|
2595
2818
|
const { model } = ctx.params;
|
|
2596
2819
|
const { body, query } = ctx.request;
|
|
2597
|
-
const documentManager2 = getService$
|
|
2598
|
-
const permissionChecker2 = getService$
|
|
2820
|
+
const documentManager2 = getService$2("document-manager");
|
|
2821
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
|
2599
2822
|
if (permissionChecker2.cannot.create() && permissionChecker2.cannot.update()) {
|
|
2600
2823
|
throw new errors.ForbiddenError();
|
|
2601
2824
|
}
|
|
@@ -2636,7 +2859,7 @@ const singleTypes = {
|
|
|
2636
2859
|
const { userAbility } = ctx.state;
|
|
2637
2860
|
const { model } = ctx.params;
|
|
2638
2861
|
const { query = {} } = ctx.request;
|
|
2639
|
-
const permissionChecker2 = getService$
|
|
2862
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
|
2640
2863
|
if (permissionChecker2.cannot.read()) {
|
|
2641
2864
|
return ctx.forbidden();
|
|
2642
2865
|
}
|
|
@@ -2655,7 +2878,7 @@ const singleTypes = {
|
|
|
2655
2878
|
permissionChecker2,
|
|
2656
2879
|
model,
|
|
2657
2880
|
// @ts-expect-error - fix types
|
|
2658
|
-
{
|
|
2881
|
+
{ documentId: document.documentId, locale, publishedAt: null },
|
|
2659
2882
|
{ availableLocales: true, availableStatus: false }
|
|
2660
2883
|
);
|
|
2661
2884
|
ctx.body = { data: {}, meta };
|
|
@@ -2670,7 +2893,7 @@ const singleTypes = {
|
|
|
2670
2893
|
async createOrUpdate(ctx) {
|
|
2671
2894
|
const { userAbility } = ctx.state;
|
|
2672
2895
|
const { model } = ctx.params;
|
|
2673
|
-
const permissionChecker2 = getService$
|
|
2896
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
|
2674
2897
|
const document = await createOrUpdateDocument(ctx);
|
|
2675
2898
|
const sanitizedDocument = await permissionChecker2.sanitizeOutput(document);
|
|
2676
2899
|
ctx.body = await formatDocumentWithMetadata(permissionChecker2, model, sanitizedDocument);
|
|
@@ -2679,8 +2902,8 @@ const singleTypes = {
|
|
|
2679
2902
|
const { userAbility } = ctx.state;
|
|
2680
2903
|
const { model } = ctx.params;
|
|
2681
2904
|
const { query = {} } = ctx.request;
|
|
2682
|
-
const documentManager2 = getService$
|
|
2683
|
-
const permissionChecker2 = getService$
|
|
2905
|
+
const documentManager2 = getService$2("document-manager");
|
|
2906
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
|
2684
2907
|
if (permissionChecker2.cannot.delete()) {
|
|
2685
2908
|
return ctx.forbidden();
|
|
2686
2909
|
}
|
|
@@ -2708,8 +2931,8 @@ const singleTypes = {
|
|
|
2708
2931
|
const { userAbility } = ctx.state;
|
|
2709
2932
|
const { model } = ctx.params;
|
|
2710
2933
|
const { query = {} } = ctx.request;
|
|
2711
|
-
const documentManager2 = getService$
|
|
2712
|
-
const permissionChecker2 = getService$
|
|
2934
|
+
const documentManager2 = getService$2("document-manager");
|
|
2935
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
|
2713
2936
|
if (permissionChecker2.cannot.publish()) {
|
|
2714
2937
|
return ctx.forbidden();
|
|
2715
2938
|
}
|
|
@@ -2737,8 +2960,8 @@ const singleTypes = {
|
|
|
2737
2960
|
body: { discardDraft, ...body },
|
|
2738
2961
|
query = {}
|
|
2739
2962
|
} = ctx.request;
|
|
2740
|
-
const documentManager2 = getService$
|
|
2741
|
-
const permissionChecker2 = getService$
|
|
2963
|
+
const documentManager2 = getService$2("document-manager");
|
|
2964
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
|
2742
2965
|
if (permissionChecker2.cannot.unpublish()) {
|
|
2743
2966
|
return ctx.forbidden();
|
|
2744
2967
|
}
|
|
@@ -2772,8 +2995,8 @@ const singleTypes = {
|
|
|
2772
2995
|
const { userAbility } = ctx.state;
|
|
2773
2996
|
const { model } = ctx.params;
|
|
2774
2997
|
const { body, query = {} } = ctx.request;
|
|
2775
|
-
const documentManager2 = getService$
|
|
2776
|
-
const permissionChecker2 = getService$
|
|
2998
|
+
const documentManager2 = getService$2("document-manager");
|
|
2999
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
|
2777
3000
|
if (permissionChecker2.cannot.discard()) {
|
|
2778
3001
|
return ctx.forbidden();
|
|
2779
3002
|
}
|
|
@@ -2796,8 +3019,8 @@ const singleTypes = {
|
|
|
2796
3019
|
const { userAbility } = ctx.state;
|
|
2797
3020
|
const { model } = ctx.params;
|
|
2798
3021
|
const { query } = ctx.request;
|
|
2799
|
-
const documentManager2 = getService$
|
|
2800
|
-
const permissionChecker2 = getService$
|
|
3022
|
+
const documentManager2 = getService$2("document-manager");
|
|
3023
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
|
2801
3024
|
const { locale } = await getDocumentLocaleAndStatus(query, model);
|
|
2802
3025
|
if (permissionChecker2.cannot.read()) {
|
|
2803
3026
|
return ctx.forbidden();
|
|
@@ -2821,7 +3044,7 @@ const uid$1 = {
|
|
|
2821
3044
|
const { query = {} } = ctx.request;
|
|
2822
3045
|
const { locale } = await getDocumentLocaleAndStatus(query, contentTypeUID);
|
|
2823
3046
|
await validateUIDField(contentTypeUID, field);
|
|
2824
|
-
const uidService = getService$
|
|
3047
|
+
const uidService = getService$2("uid");
|
|
2825
3048
|
ctx.body = {
|
|
2826
3049
|
data: await uidService.generateUIDField({ contentTypeUID, field, data, locale })
|
|
2827
3050
|
};
|
|
@@ -2833,7 +3056,7 @@ const uid$1 = {
|
|
|
2833
3056
|
const { query = {} } = ctx.request;
|
|
2834
3057
|
const { locale } = await getDocumentLocaleAndStatus(query, contentTypeUID);
|
|
2835
3058
|
await validateUIDField(contentTypeUID, field);
|
|
2836
|
-
const uidService = getService$
|
|
3059
|
+
const uidService = getService$2("uid");
|
|
2837
3060
|
const isAvailable = await uidService.checkUIDAvailability({
|
|
2838
3061
|
contentTypeUID,
|
|
2839
3062
|
field,
|
|
@@ -2854,7 +3077,8 @@ const controllers = {
|
|
|
2854
3077
|
relations,
|
|
2855
3078
|
"single-types": singleTypes,
|
|
2856
3079
|
uid: uid$1,
|
|
2857
|
-
...history.controllers ? history.controllers : {}
|
|
3080
|
+
...history.controllers ? history.controllers : {},
|
|
3081
|
+
...preview.controllers ? preview.controllers : {}
|
|
2858
3082
|
};
|
|
2859
3083
|
const keys = {
|
|
2860
3084
|
CONFIGURATION: "configuration"
|
|
@@ -3005,12 +3229,12 @@ async function syncMetadatas(configuration, schema) {
|
|
|
3005
3229
|
return _.assign(metasWithDefaults, updatedMetas);
|
|
3006
3230
|
}
|
|
3007
3231
|
const getTargetSchema = (targetModel) => {
|
|
3008
|
-
return getService$
|
|
3232
|
+
return getService$2("content-types").findContentType(targetModel);
|
|
3009
3233
|
};
|
|
3010
3234
|
const DEFAULT_LIST_LENGTH = 4;
|
|
3011
3235
|
const MAX_ROW_SIZE = 12;
|
|
3012
3236
|
const isAllowedFieldSize = (type, size) => {
|
|
3013
|
-
const { getFieldSize } = getService$
|
|
3237
|
+
const { getFieldSize } = getService$2("field-sizes");
|
|
3014
3238
|
const fieldSize = getFieldSize(type);
|
|
3015
3239
|
if (!fieldSize.isResizable && size !== fieldSize.default) {
|
|
3016
3240
|
return false;
|
|
@@ -3018,7 +3242,7 @@ const isAllowedFieldSize = (type, size) => {
|
|
|
3018
3242
|
return size <= MAX_ROW_SIZE;
|
|
3019
3243
|
};
|
|
3020
3244
|
const getDefaultFieldSize = (attribute) => {
|
|
3021
|
-
const { hasFieldSize, getFieldSize } = getService$
|
|
3245
|
+
const { hasFieldSize, getFieldSize } = getService$2("field-sizes");
|
|
3022
3246
|
return getFieldSize(hasFieldSize(attribute.customField) ? attribute.customField : attribute.type).default;
|
|
3023
3247
|
};
|
|
3024
3248
|
async function createDefaultLayouts(schema) {
|
|
@@ -3053,7 +3277,7 @@ function syncLayouts(configuration, schema) {
|
|
|
3053
3277
|
for (const el of row) {
|
|
3054
3278
|
if (!hasEditableAttribute(schema, el.name))
|
|
3055
3279
|
continue;
|
|
3056
|
-
const { hasFieldSize } = getService$
|
|
3280
|
+
const { hasFieldSize } = getService$2("field-sizes");
|
|
3057
3281
|
const fieldType = hasFieldSize(schema.attributes[el.name].customField) ? schema.attributes[el.name].customField : schema.attributes[el.name].type;
|
|
3058
3282
|
if (!isAllowedFieldSize(fieldType, el.size)) {
|
|
3059
3283
|
elementsToReAppend.push(el.name);
|
|
@@ -3193,17 +3417,17 @@ const configurationService$1 = createConfigurationService({
|
|
|
3193
3417
|
isComponent: true,
|
|
3194
3418
|
prefix: STORE_KEY_PREFIX,
|
|
3195
3419
|
getModels() {
|
|
3196
|
-
const { toContentManagerModel } = getService$
|
|
3420
|
+
const { toContentManagerModel } = getService$2("data-mapper");
|
|
3197
3421
|
return mapValues(toContentManagerModel, strapi.components);
|
|
3198
3422
|
}
|
|
3199
3423
|
});
|
|
3200
3424
|
const components = ({ strapi: strapi2 }) => ({
|
|
3201
3425
|
findAllComponents() {
|
|
3202
|
-
const { toContentManagerModel } = getService$
|
|
3426
|
+
const { toContentManagerModel } = getService$2("data-mapper");
|
|
3203
3427
|
return Object.values(strapi2.components).map(toContentManagerModel);
|
|
3204
3428
|
},
|
|
3205
3429
|
findComponent(uid2) {
|
|
3206
|
-
const { toContentManagerModel } = getService$
|
|
3430
|
+
const { toContentManagerModel } = getService$2("data-mapper");
|
|
3207
3431
|
const component = strapi2.components[uid2];
|
|
3208
3432
|
return isNil$1(component) ? component : toContentManagerModel(component);
|
|
3209
3433
|
},
|
|
@@ -3254,17 +3478,17 @@ const configurationService = createConfigurationService({
|
|
|
3254
3478
|
storeUtils,
|
|
3255
3479
|
prefix: "content_types",
|
|
3256
3480
|
getModels() {
|
|
3257
|
-
const { toContentManagerModel } = getService$
|
|
3481
|
+
const { toContentManagerModel } = getService$2("data-mapper");
|
|
3258
3482
|
return mapValues(toContentManagerModel, strapi.contentTypes);
|
|
3259
3483
|
}
|
|
3260
3484
|
});
|
|
3261
3485
|
const service = ({ strapi: strapi2 }) => ({
|
|
3262
3486
|
findAllContentTypes() {
|
|
3263
|
-
const { toContentManagerModel } = getService$
|
|
3487
|
+
const { toContentManagerModel } = getService$2("data-mapper");
|
|
3264
3488
|
return Object.values(strapi2.contentTypes).map(toContentManagerModel);
|
|
3265
3489
|
},
|
|
3266
3490
|
findContentType(uid2) {
|
|
3267
|
-
const { toContentManagerModel } = getService$
|
|
3491
|
+
const { toContentManagerModel } = getService$2("data-mapper");
|
|
3268
3492
|
const contentType = strapi2.contentTypes[uid2];
|
|
3269
3493
|
return isNil$1(contentType) ? contentType : toContentManagerModel(contentType);
|
|
3270
3494
|
},
|
|
@@ -3293,7 +3517,7 @@ const service = ({ strapi: strapi2 }) => ({
|
|
|
3293
3517
|
return this.findConfiguration(contentType);
|
|
3294
3518
|
},
|
|
3295
3519
|
findComponentsConfigurations(contentType) {
|
|
3296
|
-
return getService$
|
|
3520
|
+
return getService$2("components").findComponentsConfigurations(contentType);
|
|
3297
3521
|
},
|
|
3298
3522
|
syncConfigurations() {
|
|
3299
3523
|
return configurationService.syncConfigurations();
|
|
@@ -3565,7 +3789,7 @@ const permission = ({ strapi: strapi2 }) => ({
|
|
|
3565
3789
|
return userAbility.can(action);
|
|
3566
3790
|
},
|
|
3567
3791
|
async registerPermissions() {
|
|
3568
|
-
const displayedContentTypes = getService$
|
|
3792
|
+
const displayedContentTypes = getService$2("content-types").findDisplayedContentTypes();
|
|
3569
3793
|
const contentTypesUids = displayedContentTypes.map(prop("uid"));
|
|
3570
3794
|
const actions = [
|
|
3571
3795
|
{
|
|
@@ -3841,7 +4065,7 @@ const getQueryPopulate = async (uid2, query) => {
|
|
|
3841
4065
|
return populateQuery;
|
|
3842
4066
|
};
|
|
3843
4067
|
const buildDeepPopulate = (uid2) => {
|
|
3844
|
-
return getService$
|
|
4068
|
+
return getService$2("populate-builder")(uid2).populateDeep(Infinity).countRelations().build();
|
|
3845
4069
|
};
|
|
3846
4070
|
const populateBuilder = (uid2) => {
|
|
3847
4071
|
let getInitialPopulate = async () => {
|
|
@@ -4026,7 +4250,9 @@ const documentMetadata = ({ strapi: strapi2 }) => ({
|
|
|
4026
4250
|
*/
|
|
4027
4251
|
async getAvailableLocales(uid2, version, allVersions, validatableFields = []) {
|
|
4028
4252
|
const versionsByLocale = groupBy("locale", allVersions);
|
|
4029
|
-
|
|
4253
|
+
if (version.locale) {
|
|
4254
|
+
delete versionsByLocale[version.locale];
|
|
4255
|
+
}
|
|
4030
4256
|
const model = strapi2.getModel(uid2);
|
|
4031
4257
|
const keysToKeep = [...AVAILABLE_LOCALES_FIELDS, ...validatableFields];
|
|
4032
4258
|
const traversalFunction = async (localeVersion) => traverseEntity(
|
|
@@ -4382,7 +4608,8 @@ const services = {
|
|
|
4382
4608
|
permission,
|
|
4383
4609
|
"populate-builder": populateBuilder$1,
|
|
4384
4610
|
uid,
|
|
4385
|
-
...history.services ? history.services : {}
|
|
4611
|
+
...history.services ? history.services : {},
|
|
4612
|
+
...preview.services ? preview.services : {}
|
|
4386
4613
|
};
|
|
4387
4614
|
const index = () => {
|
|
4388
4615
|
return {
|