@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.js
CHANGED
|
@@ -33,10 +33,10 @@ const isNil__default = /* @__PURE__ */ _interopDefault(isNil);
|
|
|
33
33
|
const ___default = /* @__PURE__ */ _interopDefault(_);
|
|
34
34
|
const qs__default = /* @__PURE__ */ _interopDefault(qs);
|
|
35
35
|
const slugify__default = /* @__PURE__ */ _interopDefault(slugify);
|
|
36
|
-
const getService$
|
|
36
|
+
const getService$2 = (name) => {
|
|
37
37
|
return strapi.plugin("content-manager").service(name);
|
|
38
38
|
};
|
|
39
|
-
function getService(strapi2, name) {
|
|
39
|
+
function getService$1(strapi2, name) {
|
|
40
40
|
return strapi2.service(`plugin::content-manager.${name}`);
|
|
41
41
|
}
|
|
42
42
|
const historyRestoreVersionSchema = yup__namespace.object().shape({
|
|
@@ -72,7 +72,7 @@ const createHistoryVersionController = ({ strapi: strapi2 }) => {
|
|
|
72
72
|
if (!isSingleType && (!contentTypeUid || !ctx.query.documentId)) {
|
|
73
73
|
throw new strapiUtils.errors.ForbiddenError("contentType and documentId are required");
|
|
74
74
|
}
|
|
75
|
-
const permissionChecker2 = getService$
|
|
75
|
+
const permissionChecker2 = getService$2("permission-checker").create({
|
|
76
76
|
userAbility: ctx.state.userAbility,
|
|
77
77
|
model: ctx.query.contentType
|
|
78
78
|
});
|
|
@@ -80,7 +80,7 @@ const createHistoryVersionController = ({ strapi: strapi2 }) => {
|
|
|
80
80
|
return ctx.forbidden();
|
|
81
81
|
}
|
|
82
82
|
const query = await permissionChecker2.sanitizeQuery(ctx.query);
|
|
83
|
-
const { results, pagination } = await getService(strapi2, "history").findVersionsPage({
|
|
83
|
+
const { results, pagination } = await getService$1(strapi2, "history").findVersionsPage({
|
|
84
84
|
query: {
|
|
85
85
|
...query,
|
|
86
86
|
...getValidPagination({ page: query.page, pageSize: query.pageSize })
|
|
@@ -105,14 +105,14 @@ const createHistoryVersionController = ({ strapi: strapi2 }) => {
|
|
|
105
105
|
async restoreVersion(ctx) {
|
|
106
106
|
const request = ctx.request;
|
|
107
107
|
await validateRestoreVersion(request.body, "contentType is required");
|
|
108
|
-
const permissionChecker2 = getService$
|
|
108
|
+
const permissionChecker2 = getService$2("permission-checker").create({
|
|
109
109
|
userAbility: ctx.state.userAbility,
|
|
110
110
|
model: request.body.contentType
|
|
111
111
|
});
|
|
112
112
|
if (permissionChecker2.cannot.update()) {
|
|
113
113
|
throw new strapiUtils.errors.ForbiddenError();
|
|
114
114
|
}
|
|
115
|
-
const restoredDocument = await getService(strapi2, "history").restoreVersion(
|
|
115
|
+
const restoredDocument = await getService$1(strapi2, "history").restoreVersion(
|
|
116
116
|
request.params.versionId
|
|
117
117
|
);
|
|
118
118
|
return {
|
|
@@ -121,7 +121,7 @@ const createHistoryVersionController = ({ strapi: strapi2 }) => {
|
|
|
121
121
|
}
|
|
122
122
|
};
|
|
123
123
|
};
|
|
124
|
-
const controllers$
|
|
124
|
+
const controllers$2 = {
|
|
125
125
|
"history-version": createHistoryVersionController
|
|
126
126
|
/**
|
|
127
127
|
* Casting is needed because the types aren't aware that Strapi supports
|
|
@@ -199,7 +199,9 @@ const createServiceUtils = ({ strapi: strapi2 }) => {
|
|
|
199
199
|
return strapi2.db.query("plugin::upload.file").findOne({ where: { id: versionRelationData.id } });
|
|
200
200
|
};
|
|
201
201
|
const localesService = strapi2.plugin("i18n")?.service("locales");
|
|
202
|
+
const i18nContentTypeService = strapi2.plugin("i18n")?.service("content-types");
|
|
202
203
|
const getDefaultLocale = async () => localesService ? localesService.getDefaultLocale() : null;
|
|
204
|
+
const isLocalizedContentType = (model) => i18nContentTypeService ? i18nContentTypeService.isLocalizedContentType(model) : false;
|
|
203
205
|
const getLocaleDictionary = async () => {
|
|
204
206
|
if (!localesService)
|
|
205
207
|
return {};
|
|
@@ -226,6 +228,17 @@ const createServiceUtils = ({ strapi: strapi2 }) => {
|
|
|
226
228
|
const meta = await documentMetadataService.getMetadata(contentTypeUid, document);
|
|
227
229
|
return documentMetadataService.getStatus(document, meta.availableStatus);
|
|
228
230
|
};
|
|
231
|
+
const getComponentFields = (componentUID) => {
|
|
232
|
+
return Object.entries(strapi2.getModel(componentUID).attributes).reduce(
|
|
233
|
+
(fieldsAcc, [key, attribute]) => {
|
|
234
|
+
if (!["relation", "media", "component", "dynamiczone"].includes(attribute.type)) {
|
|
235
|
+
fieldsAcc.push(key);
|
|
236
|
+
}
|
|
237
|
+
return fieldsAcc;
|
|
238
|
+
},
|
|
239
|
+
[]
|
|
240
|
+
);
|
|
241
|
+
};
|
|
229
242
|
const getDeepPopulate2 = (uid2, useDatabaseSyntax = false) => {
|
|
230
243
|
const model = strapi2.getModel(uid2);
|
|
231
244
|
const attributes = Object.entries(model.attributes);
|
|
@@ -249,13 +262,19 @@ const createServiceUtils = ({ strapi: strapi2 }) => {
|
|
|
249
262
|
}
|
|
250
263
|
case "component": {
|
|
251
264
|
const populate = getDeepPopulate2(attribute.component);
|
|
252
|
-
acc[attributeName] = {
|
|
265
|
+
acc[attributeName] = {
|
|
266
|
+
populate,
|
|
267
|
+
[fieldSelector]: getComponentFields(attribute.component)
|
|
268
|
+
};
|
|
253
269
|
break;
|
|
254
270
|
}
|
|
255
271
|
case "dynamiczone": {
|
|
256
272
|
const populatedComponents = (attribute.components || []).reduce(
|
|
257
273
|
(acc2, componentUID) => {
|
|
258
|
-
acc2[componentUID] = {
|
|
274
|
+
acc2[componentUID] = {
|
|
275
|
+
populate: getDeepPopulate2(componentUID),
|
|
276
|
+
[fieldSelector]: getComponentFields(componentUID)
|
|
277
|
+
};
|
|
259
278
|
return acc2;
|
|
260
279
|
},
|
|
261
280
|
{}
|
|
@@ -317,6 +336,7 @@ const createServiceUtils = ({ strapi: strapi2 }) => {
|
|
|
317
336
|
getRelationRestoreValue,
|
|
318
337
|
getMediaRestoreValue,
|
|
319
338
|
getDefaultLocale,
|
|
339
|
+
isLocalizedContentType,
|
|
320
340
|
getLocaleDictionary,
|
|
321
341
|
getRetentionDays,
|
|
322
342
|
getVersionStatus,
|
|
@@ -339,7 +359,13 @@ const createHistoryService = ({ strapi: strapi2 }) => {
|
|
|
339
359
|
});
|
|
340
360
|
},
|
|
341
361
|
async findVersionsPage(params) {
|
|
342
|
-
const
|
|
362
|
+
const model = strapi2.getModel(params.query.contentType);
|
|
363
|
+
const isLocalizedContentType = serviceUtils.isLocalizedContentType(model);
|
|
364
|
+
const defaultLocale = await serviceUtils.getDefaultLocale();
|
|
365
|
+
let locale = null;
|
|
366
|
+
if (isLocalizedContentType) {
|
|
367
|
+
locale = params.query.locale || defaultLocale;
|
|
368
|
+
}
|
|
343
369
|
const [{ results, pagination }, localeDictionary] = await Promise.all([
|
|
344
370
|
query.findPage({
|
|
345
371
|
...params.query,
|
|
@@ -361,7 +387,7 @@ const createHistoryService = ({ strapi: strapi2 }) => {
|
|
|
361
387
|
const attributeValue = entry.data[attributeKey];
|
|
362
388
|
const attributeValues = Array.isArray(attributeValue) ? attributeValue : [attributeValue];
|
|
363
389
|
if (attributeSchema.type === "media") {
|
|
364
|
-
const permissionChecker2 = getService$
|
|
390
|
+
const permissionChecker2 = getService$2("permission-checker").create({
|
|
365
391
|
userAbility: params.state.userAbility,
|
|
366
392
|
model: "plugin::upload.file"
|
|
367
393
|
});
|
|
@@ -384,7 +410,12 @@ const createHistoryService = ({ strapi: strapi2 }) => {
|
|
|
384
410
|
if (userToPopulate == null) {
|
|
385
411
|
return null;
|
|
386
412
|
}
|
|
387
|
-
return strapi2.query("admin::user").findOne({
|
|
413
|
+
return strapi2.query("admin::user").findOne({
|
|
414
|
+
where: {
|
|
415
|
+
...userToPopulate.id ? { id: userToPopulate.id } : {},
|
|
416
|
+
...userToPopulate.documentId ? { documentId: userToPopulate.documentId } : {}
|
|
417
|
+
}
|
|
418
|
+
});
|
|
388
419
|
})
|
|
389
420
|
);
|
|
390
421
|
return {
|
|
@@ -397,7 +428,7 @@ const createHistoryService = ({ strapi: strapi2 }) => {
|
|
|
397
428
|
[attributeKey]: adminUsers
|
|
398
429
|
};
|
|
399
430
|
}
|
|
400
|
-
const permissionChecker2 = getService$
|
|
431
|
+
const permissionChecker2 = getService$2("permission-checker").create({
|
|
401
432
|
userAbility: params.state.userAbility,
|
|
402
433
|
model: attributeSchema.target
|
|
403
434
|
});
|
|
@@ -555,11 +586,13 @@ const createLifecyclesService = ({ strapi: strapi2 }) => {
|
|
|
555
586
|
}
|
|
556
587
|
const uid2 = context.contentType.uid;
|
|
557
588
|
const schemas = getSchemas(uid2);
|
|
589
|
+
const model = strapi2.getModel(uid2);
|
|
590
|
+
const isLocalizedContentType = serviceUtils.isLocalizedContentType(model);
|
|
558
591
|
const localeEntries = await strapi2.db.query(uid2).findMany({
|
|
559
592
|
where: {
|
|
560
593
|
documentId,
|
|
561
|
-
locale: { $in: locales },
|
|
562
|
-
publishedAt: null
|
|
594
|
+
...isLocalizedContentType ? { locale: { $in: locales } } : {},
|
|
595
|
+
...strapiUtils.contentTypes.hasDraftAndPublish(strapi2.contentTypes[uid2]) ? { publishedAt: null } : {}
|
|
563
596
|
},
|
|
564
597
|
populate: serviceUtils.getDeepPopulate(
|
|
565
598
|
uid2,
|
|
@@ -571,7 +604,7 @@ const createLifecyclesService = ({ strapi: strapi2 }) => {
|
|
|
571
604
|
onCommit(async () => {
|
|
572
605
|
for (const entry of localeEntries) {
|
|
573
606
|
const status = await serviceUtils.getVersionStatus(uid2, entry);
|
|
574
|
-
await getService(strapi2, "history").createVersion({
|
|
607
|
+
await getService$1(strapi2, "history").createVersion({
|
|
575
608
|
contentType: uid2,
|
|
576
609
|
data: fp.omit(FIELDS_TO_IGNORE, entry),
|
|
577
610
|
relatedDocumentId: documentId,
|
|
@@ -584,15 +617,19 @@ const createLifecyclesService = ({ strapi: strapi2 }) => {
|
|
|
584
617
|
});
|
|
585
618
|
return result;
|
|
586
619
|
});
|
|
587
|
-
state.deleteExpiredJob = nodeSchedule.scheduleJob("0 0 * * *", () => {
|
|
620
|
+
state.deleteExpiredJob = nodeSchedule.scheduleJob("historyDaily", "0 0 * * *", () => {
|
|
588
621
|
const retentionDaysInMilliseconds = serviceUtils.getRetentionDays() * 24 * 60 * 60 * 1e3;
|
|
589
622
|
const expirationDate = new Date(Date.now() - retentionDaysInMilliseconds);
|
|
590
623
|
strapi2.db.query(HISTORY_VERSION_UID).deleteMany({
|
|
591
624
|
where: {
|
|
592
625
|
created_at: {
|
|
593
|
-
$lt: expirationDate
|
|
626
|
+
$lt: expirationDate
|
|
594
627
|
}
|
|
595
628
|
}
|
|
629
|
+
}).catch((error) => {
|
|
630
|
+
if (error instanceof Error) {
|
|
631
|
+
strapi2.log.error("Error deleting expired history versions", error.message);
|
|
632
|
+
}
|
|
596
633
|
});
|
|
597
634
|
});
|
|
598
635
|
state.isInitialized = true;
|
|
@@ -604,17 +641,17 @@ const createLifecyclesService = ({ strapi: strapi2 }) => {
|
|
|
604
641
|
}
|
|
605
642
|
};
|
|
606
643
|
};
|
|
607
|
-
const services$
|
|
644
|
+
const services$2 = {
|
|
608
645
|
history: createHistoryService,
|
|
609
646
|
lifecycles: createLifecyclesService
|
|
610
647
|
};
|
|
611
|
-
const info = { pluginName: "content-manager", type: "admin" };
|
|
648
|
+
const info$1 = { pluginName: "content-manager", type: "admin" };
|
|
612
649
|
const historyVersionRouter = {
|
|
613
650
|
type: "admin",
|
|
614
651
|
routes: [
|
|
615
652
|
{
|
|
616
653
|
method: "GET",
|
|
617
|
-
info,
|
|
654
|
+
info: info$1,
|
|
618
655
|
path: "/history-versions",
|
|
619
656
|
handler: "history-version.findMany",
|
|
620
657
|
config: {
|
|
@@ -623,7 +660,7 @@ const historyVersionRouter = {
|
|
|
623
660
|
},
|
|
624
661
|
{
|
|
625
662
|
method: "PUT",
|
|
626
|
-
info,
|
|
663
|
+
info: info$1,
|
|
627
664
|
path: "/history-versions/:versionId/restore",
|
|
628
665
|
handler: "history-version.restoreVersion",
|
|
629
666
|
config: {
|
|
@@ -632,7 +669,7 @@ const historyVersionRouter = {
|
|
|
632
669
|
}
|
|
633
670
|
]
|
|
634
671
|
};
|
|
635
|
-
const routes$
|
|
672
|
+
const routes$2 = {
|
|
636
673
|
"history-version": historyVersionRouter
|
|
637
674
|
};
|
|
638
675
|
const historyVersion = {
|
|
@@ -679,21 +716,21 @@ const historyVersion = {
|
|
|
679
716
|
}
|
|
680
717
|
}
|
|
681
718
|
};
|
|
682
|
-
const getFeature = () => {
|
|
719
|
+
const getFeature$1 = () => {
|
|
683
720
|
if (strapi.ee.features.isEnabled("cms-content-history")) {
|
|
684
721
|
return {
|
|
685
722
|
register({ strapi: strapi2 }) {
|
|
686
723
|
strapi2.get("models").add(historyVersion);
|
|
687
724
|
},
|
|
688
725
|
bootstrap({ strapi: strapi2 }) {
|
|
689
|
-
getService(strapi2, "lifecycles").bootstrap();
|
|
726
|
+
getService$1(strapi2, "lifecycles").bootstrap();
|
|
690
727
|
},
|
|
691
728
|
destroy({ strapi: strapi2 }) {
|
|
692
|
-
getService(strapi2, "lifecycles").destroy();
|
|
729
|
+
getService$1(strapi2, "lifecycles").destroy();
|
|
693
730
|
},
|
|
694
|
-
controllers: controllers$
|
|
695
|
-
services: services$
|
|
696
|
-
routes: routes$
|
|
731
|
+
controllers: controllers$2,
|
|
732
|
+
services: services$2,
|
|
733
|
+
routes: routes$2
|
|
697
734
|
};
|
|
698
735
|
}
|
|
699
736
|
return {
|
|
@@ -702,7 +739,7 @@ const getFeature = () => {
|
|
|
702
739
|
}
|
|
703
740
|
};
|
|
704
741
|
};
|
|
705
|
-
const history = getFeature();
|
|
742
|
+
const history = getFeature$1();
|
|
706
743
|
const register = async ({ strapi: strapi2 }) => {
|
|
707
744
|
await history.register?.({ strapi: strapi2 });
|
|
708
745
|
};
|
|
@@ -710,15 +747,165 @@ const ALLOWED_WEBHOOK_EVENTS = {
|
|
|
710
747
|
ENTRY_PUBLISH: "entry.publish",
|
|
711
748
|
ENTRY_UNPUBLISH: "entry.unpublish"
|
|
712
749
|
};
|
|
750
|
+
const FEATURE_ID = "preview";
|
|
751
|
+
const info = { pluginName: "content-manager", type: "admin" };
|
|
752
|
+
const previewRouter = {
|
|
753
|
+
type: "admin",
|
|
754
|
+
routes: [
|
|
755
|
+
{
|
|
756
|
+
method: "GET",
|
|
757
|
+
info,
|
|
758
|
+
path: "/preview/url/:contentType",
|
|
759
|
+
handler: "preview.getPreviewUrl",
|
|
760
|
+
config: {
|
|
761
|
+
policies: ["admin::isAuthenticatedAdmin"]
|
|
762
|
+
}
|
|
763
|
+
}
|
|
764
|
+
]
|
|
765
|
+
};
|
|
766
|
+
const routes$1 = {
|
|
767
|
+
preview: previewRouter
|
|
768
|
+
};
|
|
769
|
+
function getService(strapi2, name) {
|
|
770
|
+
return strapi2.service(`plugin::content-manager.${name}`);
|
|
771
|
+
}
|
|
772
|
+
const getPreviewUrlSchema = yup__namespace.object().shape({
|
|
773
|
+
// Will be undefined for single types
|
|
774
|
+
documentId: yup__namespace.string(),
|
|
775
|
+
locale: yup__namespace.string().nullable(),
|
|
776
|
+
status: yup__namespace.string()
|
|
777
|
+
}).required();
|
|
778
|
+
const validatePreviewUrl = async (strapi2, uid2, params) => {
|
|
779
|
+
await strapiUtils.validateYupSchema(getPreviewUrlSchema)(params);
|
|
780
|
+
const newParams = fp.pick(["documentId", "locale", "status"], params);
|
|
781
|
+
const model = strapi2.getModel(uid2);
|
|
782
|
+
if (!model || model.modelType !== "contentType") {
|
|
783
|
+
throw new strapiUtils.errors.ValidationError("Invalid content type");
|
|
784
|
+
}
|
|
785
|
+
const isSingleType = model?.kind === "singleType";
|
|
786
|
+
if (!isSingleType && !params.documentId) {
|
|
787
|
+
throw new strapiUtils.errors.ValidationError("documentId is required for Collection Types");
|
|
788
|
+
}
|
|
789
|
+
if (isSingleType) {
|
|
790
|
+
const doc = await strapi2.documents(uid2).findFirst();
|
|
791
|
+
if (!doc) {
|
|
792
|
+
throw new strapiUtils.errors.NotFoundError("Document not found");
|
|
793
|
+
}
|
|
794
|
+
newParams.documentId = doc?.documentId;
|
|
795
|
+
}
|
|
796
|
+
return newParams;
|
|
797
|
+
};
|
|
798
|
+
const createPreviewController = () => {
|
|
799
|
+
return {
|
|
800
|
+
/**
|
|
801
|
+
* Transforms an entry into a preview URL, so that it can be previewed
|
|
802
|
+
* in the Content Manager.
|
|
803
|
+
*/
|
|
804
|
+
async getPreviewUrl(ctx) {
|
|
805
|
+
const uid2 = ctx.params.contentType;
|
|
806
|
+
const query = ctx.request.query;
|
|
807
|
+
const params = await validatePreviewUrl(strapi, uid2, query);
|
|
808
|
+
const previewService = getService(strapi, "preview");
|
|
809
|
+
const url = await previewService.getPreviewUrl(uid2, params);
|
|
810
|
+
if (!url) {
|
|
811
|
+
ctx.status = 204;
|
|
812
|
+
}
|
|
813
|
+
return {
|
|
814
|
+
data: { url }
|
|
815
|
+
};
|
|
816
|
+
}
|
|
817
|
+
};
|
|
818
|
+
};
|
|
819
|
+
const controllers$1 = {
|
|
820
|
+
preview: createPreviewController
|
|
821
|
+
/**
|
|
822
|
+
* Casting is needed because the types aren't aware that Strapi supports
|
|
823
|
+
* passing a controller factory as the value, instead of a controller object directly
|
|
824
|
+
*/
|
|
825
|
+
};
|
|
826
|
+
const createPreviewService = ({ strapi: strapi2 }) => {
|
|
827
|
+
const config = getService(strapi2, "preview-config");
|
|
828
|
+
return {
|
|
829
|
+
async getPreviewUrl(uid2, params) {
|
|
830
|
+
const handler = config.getPreviewHandler();
|
|
831
|
+
try {
|
|
832
|
+
return handler(uid2, params);
|
|
833
|
+
} catch (error) {
|
|
834
|
+
strapi2.log.error(`Failed to get preview URL: ${error}`);
|
|
835
|
+
throw new strapiUtils.errors.ApplicationError("Failed to get preview URL");
|
|
836
|
+
}
|
|
837
|
+
return;
|
|
838
|
+
}
|
|
839
|
+
};
|
|
840
|
+
};
|
|
841
|
+
const createPreviewConfigService = ({ strapi: strapi2 }) => {
|
|
842
|
+
return {
|
|
843
|
+
isEnabled() {
|
|
844
|
+
const config = strapi2.config.get("admin.preview");
|
|
845
|
+
if (!config) {
|
|
846
|
+
return false;
|
|
847
|
+
}
|
|
848
|
+
return config?.enabled ?? true;
|
|
849
|
+
},
|
|
850
|
+
/**
|
|
851
|
+
* Validate if the configuration is valid
|
|
852
|
+
*/
|
|
853
|
+
validate() {
|
|
854
|
+
if (!this.isEnabled()) {
|
|
855
|
+
return;
|
|
856
|
+
}
|
|
857
|
+
const handler = this.getPreviewHandler();
|
|
858
|
+
if (typeof handler !== "function") {
|
|
859
|
+
throw new strapiUtils.errors.ValidationError(
|
|
860
|
+
"Preview configuration is invalid. Handler must be a function"
|
|
861
|
+
);
|
|
862
|
+
}
|
|
863
|
+
},
|
|
864
|
+
/**
|
|
865
|
+
* Utility to get the preview handler from the configuration
|
|
866
|
+
*/
|
|
867
|
+
getPreviewHandler() {
|
|
868
|
+
const config = strapi2.config.get("admin.preview");
|
|
869
|
+
const emptyHandler = () => {
|
|
870
|
+
return void 0;
|
|
871
|
+
};
|
|
872
|
+
if (!this.isEnabled()) {
|
|
873
|
+
return emptyHandler;
|
|
874
|
+
}
|
|
875
|
+
return config?.config?.handler || emptyHandler;
|
|
876
|
+
}
|
|
877
|
+
};
|
|
878
|
+
};
|
|
879
|
+
const services$1 = {
|
|
880
|
+
preview: createPreviewService,
|
|
881
|
+
"preview-config": createPreviewConfigService
|
|
882
|
+
};
|
|
883
|
+
const getFeature = () => {
|
|
884
|
+
if (!strapi.features.future.isEnabled(FEATURE_ID)) {
|
|
885
|
+
return {};
|
|
886
|
+
}
|
|
887
|
+
return {
|
|
888
|
+
bootstrap() {
|
|
889
|
+
console.log("Bootstrapping preview server");
|
|
890
|
+
const config = getService(strapi, "preview-config");
|
|
891
|
+
config.validate();
|
|
892
|
+
},
|
|
893
|
+
routes: routes$1,
|
|
894
|
+
controllers: controllers$1,
|
|
895
|
+
services: services$1
|
|
896
|
+
};
|
|
897
|
+
};
|
|
898
|
+
const preview = getFeature();
|
|
713
899
|
const bootstrap = async () => {
|
|
714
900
|
Object.entries(ALLOWED_WEBHOOK_EVENTS).forEach(([key, value]) => {
|
|
715
901
|
strapi.get("webhookStore").addAllowedEvent(key, value);
|
|
716
902
|
});
|
|
717
|
-
getService$
|
|
718
|
-
await getService$
|
|
719
|
-
await getService$
|
|
720
|
-
await getService$
|
|
903
|
+
getService$2("field-sizes").setCustomFieldInputSizes();
|
|
904
|
+
await getService$2("components").syncConfigurations();
|
|
905
|
+
await getService$2("content-types").syncConfigurations();
|
|
906
|
+
await getService$2("permission").registerPermissions();
|
|
721
907
|
await history.bootstrap?.({ strapi });
|
|
908
|
+
await preview.bootstrap?.({ strapi });
|
|
722
909
|
};
|
|
723
910
|
const destroy = async ({ strapi: strapi2 }) => {
|
|
724
911
|
await history.destroy?.({ strapi: strapi2 });
|
|
@@ -1208,7 +1395,8 @@ const admin = {
|
|
|
1208
1395
|
};
|
|
1209
1396
|
const routes = {
|
|
1210
1397
|
admin,
|
|
1211
|
-
...history.routes ? history.routes : {}
|
|
1398
|
+
...history.routes ? history.routes : {},
|
|
1399
|
+
...preview.routes ? preview.routes : {}
|
|
1212
1400
|
};
|
|
1213
1401
|
const hasPermissionsSchema = strapiUtils.yup.object({
|
|
1214
1402
|
actions: strapiUtils.yup.array().of(strapiUtils.yup.string()),
|
|
@@ -1465,7 +1653,7 @@ const createMetadasSchema = (schema) => {
|
|
|
1465
1653
|
if (!value) {
|
|
1466
1654
|
return strapiUtils.yup.string();
|
|
1467
1655
|
}
|
|
1468
|
-
const targetSchema = getService$
|
|
1656
|
+
const targetSchema = getService$2("content-types").findContentType(
|
|
1469
1657
|
schema.attributes[key].targetModel
|
|
1470
1658
|
);
|
|
1471
1659
|
if (!targetSchema) {
|
|
@@ -1634,7 +1822,7 @@ const getDocumentLocaleAndStatus = async (request, model, opts = { allowMultiple
|
|
|
1634
1822
|
}
|
|
1635
1823
|
};
|
|
1636
1824
|
const formatDocumentWithMetadata = async (permissionChecker2, uid2, document, opts = {}) => {
|
|
1637
|
-
const documentMetadata2 = getService$
|
|
1825
|
+
const documentMetadata2 = getService$2("document-metadata");
|
|
1638
1826
|
const serviceOutput = await documentMetadata2.formatDocumentWithMetadata(uid2, document, opts);
|
|
1639
1827
|
let {
|
|
1640
1828
|
meta: { availableLocales, availableStatus }
|
|
@@ -1660,8 +1848,8 @@ const createDocument = async (ctx, opts) => {
|
|
|
1660
1848
|
const { userAbility, user } = ctx.state;
|
|
1661
1849
|
const { model } = ctx.params;
|
|
1662
1850
|
const { body } = ctx.request;
|
|
1663
|
-
const documentManager2 = getService$
|
|
1664
|
-
const permissionChecker2 = getService$
|
|
1851
|
+
const documentManager2 = getService$2("document-manager");
|
|
1852
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
|
1665
1853
|
if (permissionChecker2.cannot.create()) {
|
|
1666
1854
|
throw new strapiUtils.errors.ForbiddenError();
|
|
1667
1855
|
}
|
|
@@ -1681,13 +1869,13 @@ const updateDocument = async (ctx, opts) => {
|
|
|
1681
1869
|
const { userAbility, user } = ctx.state;
|
|
1682
1870
|
const { id, model } = ctx.params;
|
|
1683
1871
|
const { body } = ctx.request;
|
|
1684
|
-
const documentManager2 = getService$
|
|
1685
|
-
const permissionChecker2 = getService$
|
|
1872
|
+
const documentManager2 = getService$2("document-manager");
|
|
1873
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
|
1686
1874
|
if (permissionChecker2.cannot.update()) {
|
|
1687
1875
|
throw new strapiUtils.errors.ForbiddenError();
|
|
1688
1876
|
}
|
|
1689
1877
|
const permissionQuery = await permissionChecker2.sanitizedQuery.update(ctx.query);
|
|
1690
|
-
const populate = await getService$
|
|
1878
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
|
|
1691
1879
|
const { locale } = await getDocumentLocaleAndStatus(body, model);
|
|
1692
1880
|
const [documentVersion, documentExists] = await Promise.all([
|
|
1693
1881
|
documentManager2.findOne(id, model, { populate, locale, status: "draft" }),
|
|
@@ -1704,7 +1892,7 @@ const updateDocument = async (ctx, opts) => {
|
|
|
1704
1892
|
throw new strapiUtils.errors.ForbiddenError();
|
|
1705
1893
|
}
|
|
1706
1894
|
const pickPermittedFields = documentVersion ? permissionChecker2.sanitizeUpdateInput(documentVersion) : permissionChecker2.sanitizeCreateInput;
|
|
1707
|
-
const setCreator = strapiUtils.setCreatorFields({ user, isEdition: true });
|
|
1895
|
+
const setCreator = documentVersion ? strapiUtils.setCreatorFields({ user, isEdition: true }) : strapiUtils.setCreatorFields({ user });
|
|
1708
1896
|
const sanitizeFn = strapiUtils.async.pipe(pickPermittedFields, setCreator);
|
|
1709
1897
|
const sanitizedBody = await sanitizeFn(body);
|
|
1710
1898
|
return documentManager2.update(documentVersion?.documentId || id, model, {
|
|
@@ -1718,14 +1906,14 @@ const collectionTypes = {
|
|
|
1718
1906
|
const { userAbility } = ctx.state;
|
|
1719
1907
|
const { model } = ctx.params;
|
|
1720
1908
|
const { query } = ctx.request;
|
|
1721
|
-
const documentMetadata2 = getService$
|
|
1722
|
-
const documentManager2 = getService$
|
|
1723
|
-
const permissionChecker2 = getService$
|
|
1909
|
+
const documentMetadata2 = getService$2("document-metadata");
|
|
1910
|
+
const documentManager2 = getService$2("document-manager");
|
|
1911
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
|
1724
1912
|
if (permissionChecker2.cannot.read()) {
|
|
1725
1913
|
return ctx.forbidden();
|
|
1726
1914
|
}
|
|
1727
1915
|
const permissionQuery = await permissionChecker2.sanitizedQuery.read(query);
|
|
1728
|
-
const populate = await getService$
|
|
1916
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(1).countRelations({ toOne: false, toMany: true }).build();
|
|
1729
1917
|
const { locale, status } = await getDocumentLocaleAndStatus(query, model);
|
|
1730
1918
|
const { results: documents, pagination } = await documentManager2.findPage(
|
|
1731
1919
|
{ ...permissionQuery, populate, locale, status },
|
|
@@ -1754,13 +1942,13 @@ const collectionTypes = {
|
|
|
1754
1942
|
async findOne(ctx) {
|
|
1755
1943
|
const { userAbility } = ctx.state;
|
|
1756
1944
|
const { model, id } = ctx.params;
|
|
1757
|
-
const documentManager2 = getService$
|
|
1758
|
-
const permissionChecker2 = getService$
|
|
1945
|
+
const documentManager2 = getService$2("document-manager");
|
|
1946
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
|
1759
1947
|
if (permissionChecker2.cannot.read()) {
|
|
1760
1948
|
return ctx.forbidden();
|
|
1761
1949
|
}
|
|
1762
1950
|
const permissionQuery = await permissionChecker2.sanitizedQuery.read(ctx.query);
|
|
1763
|
-
const populate = await getService$
|
|
1951
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(Infinity).countRelations().build();
|
|
1764
1952
|
const { locale, status } = await getDocumentLocaleAndStatus(ctx.query, model);
|
|
1765
1953
|
const version = await documentManager2.findOne(id, model, {
|
|
1766
1954
|
populate,
|
|
@@ -1776,7 +1964,7 @@ const collectionTypes = {
|
|
|
1776
1964
|
permissionChecker2,
|
|
1777
1965
|
model,
|
|
1778
1966
|
// @ts-expect-error TODO: fix
|
|
1779
|
-
{ id, locale, publishedAt: null },
|
|
1967
|
+
{ documentId: id, locale, publishedAt: null },
|
|
1780
1968
|
{ availableLocales: true, availableStatus: false }
|
|
1781
1969
|
);
|
|
1782
1970
|
ctx.body = { data: {}, meta };
|
|
@@ -1791,7 +1979,7 @@ const collectionTypes = {
|
|
|
1791
1979
|
async create(ctx) {
|
|
1792
1980
|
const { userAbility } = ctx.state;
|
|
1793
1981
|
const { model } = ctx.params;
|
|
1794
|
-
const permissionChecker2 = getService$
|
|
1982
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
|
1795
1983
|
const [totalEntries, document] = await Promise.all([
|
|
1796
1984
|
strapi.db.query(model).count(),
|
|
1797
1985
|
createDocument(ctx)
|
|
@@ -1812,7 +2000,7 @@ const collectionTypes = {
|
|
|
1812
2000
|
async update(ctx) {
|
|
1813
2001
|
const { userAbility } = ctx.state;
|
|
1814
2002
|
const { model } = ctx.params;
|
|
1815
|
-
const permissionChecker2 = getService$
|
|
2003
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
|
1816
2004
|
const updatedVersion = await updateDocument(ctx);
|
|
1817
2005
|
const sanitizedVersion = await permissionChecker2.sanitizeOutput(updatedVersion);
|
|
1818
2006
|
ctx.body = await formatDocumentWithMetadata(permissionChecker2, model, sanitizedVersion);
|
|
@@ -1821,13 +2009,13 @@ const collectionTypes = {
|
|
|
1821
2009
|
const { userAbility, user } = ctx.state;
|
|
1822
2010
|
const { model, sourceId: id } = ctx.params;
|
|
1823
2011
|
const { body } = ctx.request;
|
|
1824
|
-
const documentManager2 = getService$
|
|
1825
|
-
const permissionChecker2 = getService$
|
|
2012
|
+
const documentManager2 = getService$2("document-manager");
|
|
2013
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
|
1826
2014
|
if (permissionChecker2.cannot.create()) {
|
|
1827
2015
|
return ctx.forbidden();
|
|
1828
2016
|
}
|
|
1829
2017
|
const permissionQuery = await permissionChecker2.sanitizedQuery.create(ctx.query);
|
|
1830
|
-
const populate = await getService$
|
|
2018
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
|
|
1831
2019
|
const { locale } = await getDocumentLocaleAndStatus(body, model);
|
|
1832
2020
|
const document = await documentManager2.findOne(id, model, {
|
|
1833
2021
|
populate,
|
|
@@ -1866,13 +2054,13 @@ const collectionTypes = {
|
|
|
1866
2054
|
async delete(ctx) {
|
|
1867
2055
|
const { userAbility } = ctx.state;
|
|
1868
2056
|
const { id, model } = ctx.params;
|
|
1869
|
-
const documentManager2 = getService$
|
|
1870
|
-
const permissionChecker2 = getService$
|
|
2057
|
+
const documentManager2 = getService$2("document-manager");
|
|
2058
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
|
1871
2059
|
if (permissionChecker2.cannot.delete()) {
|
|
1872
2060
|
return ctx.forbidden();
|
|
1873
2061
|
}
|
|
1874
2062
|
const permissionQuery = await permissionChecker2.sanitizedQuery.delete(ctx.query);
|
|
1875
|
-
const populate = await getService$
|
|
2063
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
|
|
1876
2064
|
const { locale } = await getDocumentLocaleAndStatus(ctx.query, model);
|
|
1877
2065
|
const documentLocales = await documentManager2.findLocales(id, model, { populate, locale });
|
|
1878
2066
|
if (documentLocales.length === 0) {
|
|
@@ -1894,14 +2082,14 @@ const collectionTypes = {
|
|
|
1894
2082
|
const { userAbility } = ctx.state;
|
|
1895
2083
|
const { id, model } = ctx.params;
|
|
1896
2084
|
const { body } = ctx.request;
|
|
1897
|
-
const documentManager2 = getService$
|
|
1898
|
-
const permissionChecker2 = getService$
|
|
2085
|
+
const documentManager2 = getService$2("document-manager");
|
|
2086
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
|
1899
2087
|
if (permissionChecker2.cannot.publish()) {
|
|
1900
2088
|
return ctx.forbidden();
|
|
1901
2089
|
}
|
|
1902
2090
|
const publishedDocument = await strapi.db.transaction(async () => {
|
|
1903
2091
|
const permissionQuery = await permissionChecker2.sanitizedQuery.publish(ctx.query);
|
|
1904
|
-
const populate = await getService$
|
|
2092
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(Infinity).countRelations().build();
|
|
1905
2093
|
let document;
|
|
1906
2094
|
const { locale } = await getDocumentLocaleAndStatus(body, model);
|
|
1907
2095
|
const isCreate = fp.isNil(id);
|
|
@@ -1913,11 +2101,17 @@ const collectionTypes = {
|
|
|
1913
2101
|
}
|
|
1914
2102
|
const isUpdate = !isCreate;
|
|
1915
2103
|
if (isUpdate) {
|
|
1916
|
-
|
|
1917
|
-
if (!
|
|
2104
|
+
const documentExists = documentManager2.exists(model, id);
|
|
2105
|
+
if (!documentExists) {
|
|
1918
2106
|
throw new strapiUtils.errors.NotFoundError("Document not found");
|
|
1919
2107
|
}
|
|
1920
|
-
|
|
2108
|
+
document = await documentManager2.findOne(id, model, { populate, locale });
|
|
2109
|
+
if (!document) {
|
|
2110
|
+
if (permissionChecker2.cannot.create({ locale }) || permissionChecker2.cannot.publish({ locale })) {
|
|
2111
|
+
throw new strapiUtils.errors.ForbiddenError();
|
|
2112
|
+
}
|
|
2113
|
+
document = await updateDocument(ctx);
|
|
2114
|
+
} else if (permissionChecker2.can.update(document)) {
|
|
1921
2115
|
await updateDocument(ctx);
|
|
1922
2116
|
}
|
|
1923
2117
|
}
|
|
@@ -1943,13 +2137,13 @@ const collectionTypes = {
|
|
|
1943
2137
|
const { body } = ctx.request;
|
|
1944
2138
|
const { documentIds } = body;
|
|
1945
2139
|
await validateBulkActionInput(body);
|
|
1946
|
-
const documentManager2 = getService$
|
|
1947
|
-
const permissionChecker2 = getService$
|
|
2140
|
+
const documentManager2 = getService$2("document-manager");
|
|
2141
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
|
1948
2142
|
if (permissionChecker2.cannot.publish()) {
|
|
1949
2143
|
return ctx.forbidden();
|
|
1950
2144
|
}
|
|
1951
2145
|
const permissionQuery = await permissionChecker2.sanitizedQuery.publish(ctx.query);
|
|
1952
|
-
const populate = await getService$
|
|
2146
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(Infinity).countRelations().build();
|
|
1953
2147
|
const { locale } = await getDocumentLocaleAndStatus(body, model, {
|
|
1954
2148
|
allowMultipleLocales: true
|
|
1955
2149
|
});
|
|
@@ -1974,12 +2168,14 @@ const collectionTypes = {
|
|
|
1974
2168
|
const { body } = ctx.request;
|
|
1975
2169
|
const { documentIds } = body;
|
|
1976
2170
|
await validateBulkActionInput(body);
|
|
1977
|
-
const documentManager2 = getService$
|
|
1978
|
-
const permissionChecker2 = getService$
|
|
2171
|
+
const documentManager2 = getService$2("document-manager");
|
|
2172
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
|
1979
2173
|
if (permissionChecker2.cannot.unpublish()) {
|
|
1980
2174
|
return ctx.forbidden();
|
|
1981
2175
|
}
|
|
1982
|
-
const { locale } = await getDocumentLocaleAndStatus(body, model
|
|
2176
|
+
const { locale } = await getDocumentLocaleAndStatus(body, model, {
|
|
2177
|
+
allowMultipleLocales: true
|
|
2178
|
+
});
|
|
1983
2179
|
const entityPromises = documentIds.map(
|
|
1984
2180
|
(documentId) => documentManager2.findLocales(documentId, model, { locale, isPublished: true })
|
|
1985
2181
|
);
|
|
@@ -2002,8 +2198,8 @@ const collectionTypes = {
|
|
|
2002
2198
|
const {
|
|
2003
2199
|
body: { discardDraft, ...body }
|
|
2004
2200
|
} = ctx.request;
|
|
2005
|
-
const documentManager2 = getService$
|
|
2006
|
-
const permissionChecker2 = getService$
|
|
2201
|
+
const documentManager2 = getService$2("document-manager");
|
|
2202
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
|
2007
2203
|
if (permissionChecker2.cannot.unpublish()) {
|
|
2008
2204
|
return ctx.forbidden();
|
|
2009
2205
|
}
|
|
@@ -2011,7 +2207,7 @@ const collectionTypes = {
|
|
|
2011
2207
|
return ctx.forbidden();
|
|
2012
2208
|
}
|
|
2013
2209
|
const permissionQuery = await permissionChecker2.sanitizedQuery.unpublish(ctx.query);
|
|
2014
|
-
const populate = await getService$
|
|
2210
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
|
|
2015
2211
|
const { locale } = await getDocumentLocaleAndStatus(body, model);
|
|
2016
2212
|
const document = await documentManager2.findOne(id, model, {
|
|
2017
2213
|
populate,
|
|
@@ -2042,13 +2238,13 @@ const collectionTypes = {
|
|
|
2042
2238
|
const { userAbility } = ctx.state;
|
|
2043
2239
|
const { id, model } = ctx.params;
|
|
2044
2240
|
const { body } = ctx.request;
|
|
2045
|
-
const documentManager2 = getService$
|
|
2046
|
-
const permissionChecker2 = getService$
|
|
2241
|
+
const documentManager2 = getService$2("document-manager");
|
|
2242
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
|
2047
2243
|
if (permissionChecker2.cannot.discard()) {
|
|
2048
2244
|
return ctx.forbidden();
|
|
2049
2245
|
}
|
|
2050
2246
|
const permissionQuery = await permissionChecker2.sanitizedQuery.discard(ctx.query);
|
|
2051
|
-
const populate = await getService$
|
|
2247
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
|
|
2052
2248
|
const { locale } = await getDocumentLocaleAndStatus(body, model);
|
|
2053
2249
|
const document = await documentManager2.findOne(id, model, {
|
|
2054
2250
|
populate,
|
|
@@ -2073,13 +2269,13 @@ const collectionTypes = {
|
|
|
2073
2269
|
const { query, body } = ctx.request;
|
|
2074
2270
|
const { documentIds } = body;
|
|
2075
2271
|
await validateBulkActionInput(body);
|
|
2076
|
-
const documentManager2 = getService$
|
|
2077
|
-
const permissionChecker2 = getService$
|
|
2272
|
+
const documentManager2 = getService$2("document-manager");
|
|
2273
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
|
2078
2274
|
if (permissionChecker2.cannot.delete()) {
|
|
2079
2275
|
return ctx.forbidden();
|
|
2080
2276
|
}
|
|
2081
2277
|
const permissionQuery = await permissionChecker2.sanitizedQuery.delete(query);
|
|
2082
|
-
const populate = await getService$
|
|
2278
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
|
|
2083
2279
|
const { locale } = await getDocumentLocaleAndStatus(body, model);
|
|
2084
2280
|
const documentLocales = await documentManager2.findLocales(documentIds, model, {
|
|
2085
2281
|
populate,
|
|
@@ -2100,13 +2296,13 @@ const collectionTypes = {
|
|
|
2100
2296
|
async countDraftRelations(ctx) {
|
|
2101
2297
|
const { userAbility } = ctx.state;
|
|
2102
2298
|
const { model, id } = ctx.params;
|
|
2103
|
-
const documentManager2 = getService$
|
|
2104
|
-
const permissionChecker2 = getService$
|
|
2299
|
+
const documentManager2 = getService$2("document-manager");
|
|
2300
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
|
2105
2301
|
if (permissionChecker2.cannot.read()) {
|
|
2106
2302
|
return ctx.forbidden();
|
|
2107
2303
|
}
|
|
2108
2304
|
const permissionQuery = await permissionChecker2.sanitizedQuery.read(ctx.query);
|
|
2109
|
-
const populate = await getService$
|
|
2305
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
|
|
2110
2306
|
const { locale, status } = await getDocumentLocaleAndStatus(ctx.query, model);
|
|
2111
2307
|
const entity = await documentManager2.findOne(id, model, { populate, locale, status });
|
|
2112
2308
|
if (!entity) {
|
|
@@ -2125,8 +2321,8 @@ const collectionTypes = {
|
|
|
2125
2321
|
const ids = ctx.request.query.documentIds;
|
|
2126
2322
|
const locale = ctx.request.query.locale;
|
|
2127
2323
|
const { model } = ctx.params;
|
|
2128
|
-
const documentManager2 = getService$
|
|
2129
|
-
const permissionChecker2 = getService$
|
|
2324
|
+
const documentManager2 = getService$2("document-manager");
|
|
2325
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
|
2130
2326
|
if (permissionChecker2.cannot.read()) {
|
|
2131
2327
|
return ctx.forbidden();
|
|
2132
2328
|
}
|
|
@@ -2150,13 +2346,13 @@ const collectionTypes = {
|
|
|
2150
2346
|
};
|
|
2151
2347
|
const components$1 = {
|
|
2152
2348
|
findComponents(ctx) {
|
|
2153
|
-
const components2 = getService$
|
|
2154
|
-
const { toDto } = getService$
|
|
2349
|
+
const components2 = getService$2("components").findAllComponents();
|
|
2350
|
+
const { toDto } = getService$2("data-mapper");
|
|
2155
2351
|
ctx.body = { data: components2.map(toDto) };
|
|
2156
2352
|
},
|
|
2157
2353
|
async findComponentConfiguration(ctx) {
|
|
2158
2354
|
const { uid: uid2 } = ctx.params;
|
|
2159
|
-
const componentService = getService$
|
|
2355
|
+
const componentService = getService$2("components");
|
|
2160
2356
|
const component = componentService.findComponent(uid2);
|
|
2161
2357
|
if (!component) {
|
|
2162
2358
|
return ctx.notFound("component.notFound");
|
|
@@ -2173,7 +2369,7 @@ const components$1 = {
|
|
|
2173
2369
|
async updateComponentConfiguration(ctx) {
|
|
2174
2370
|
const { uid: uid2 } = ctx.params;
|
|
2175
2371
|
const { body } = ctx.request;
|
|
2176
|
-
const componentService = getService$
|
|
2372
|
+
const componentService = getService$2("components");
|
|
2177
2373
|
const component = componentService.findComponent(uid2);
|
|
2178
2374
|
if (!component) {
|
|
2179
2375
|
return ctx.notFound("component.notFound");
|
|
@@ -2207,12 +2403,12 @@ const contentTypes = {
|
|
|
2207
2403
|
} catch (error) {
|
|
2208
2404
|
return ctx.send({ error }, 400);
|
|
2209
2405
|
}
|
|
2210
|
-
const contentTypes2 = getService$
|
|
2211
|
-
const { toDto } = getService$
|
|
2406
|
+
const contentTypes2 = getService$2("content-types").findContentTypesByKind(kind);
|
|
2407
|
+
const { toDto } = getService$2("data-mapper");
|
|
2212
2408
|
ctx.body = { data: contentTypes2.map(toDto) };
|
|
2213
2409
|
},
|
|
2214
2410
|
async findContentTypesSettings(ctx) {
|
|
2215
|
-
const { findAllContentTypes, findConfiguration } = getService$
|
|
2411
|
+
const { findAllContentTypes, findConfiguration } = getService$2("content-types");
|
|
2216
2412
|
const contentTypes2 = await findAllContentTypes();
|
|
2217
2413
|
const configurations = await Promise.all(
|
|
2218
2414
|
contentTypes2.map(async (contentType) => {
|
|
@@ -2226,7 +2422,7 @@ const contentTypes = {
|
|
|
2226
2422
|
},
|
|
2227
2423
|
async findContentTypeConfiguration(ctx) {
|
|
2228
2424
|
const { uid: uid2 } = ctx.params;
|
|
2229
|
-
const contentTypeService = getService$
|
|
2425
|
+
const contentTypeService = getService$2("content-types");
|
|
2230
2426
|
const contentType = await contentTypeService.findContentType(uid2);
|
|
2231
2427
|
if (!contentType) {
|
|
2232
2428
|
return ctx.notFound("contentType.notFound");
|
|
@@ -2248,13 +2444,13 @@ const contentTypes = {
|
|
|
2248
2444
|
const { userAbility } = ctx.state;
|
|
2249
2445
|
const { uid: uid2 } = ctx.params;
|
|
2250
2446
|
const { body } = ctx.request;
|
|
2251
|
-
const contentTypeService = getService$
|
|
2252
|
-
const metricsService = getService$
|
|
2447
|
+
const contentTypeService = getService$2("content-types");
|
|
2448
|
+
const metricsService = getService$2("metrics");
|
|
2253
2449
|
const contentType = await contentTypeService.findContentType(uid2);
|
|
2254
2450
|
if (!contentType) {
|
|
2255
2451
|
return ctx.notFound("contentType.notFound");
|
|
2256
2452
|
}
|
|
2257
|
-
if (!getService$
|
|
2453
|
+
if (!getService$2("permission").canConfigureContentType({ userAbility, contentType })) {
|
|
2258
2454
|
return ctx.forbidden();
|
|
2259
2455
|
}
|
|
2260
2456
|
let input;
|
|
@@ -2287,10 +2483,10 @@ const contentTypes = {
|
|
|
2287
2483
|
};
|
|
2288
2484
|
const init = {
|
|
2289
2485
|
getInitData(ctx) {
|
|
2290
|
-
const { toDto } = getService$
|
|
2291
|
-
const { findAllComponents } = getService$
|
|
2292
|
-
const { getAllFieldSizes } = getService$
|
|
2293
|
-
const { findAllContentTypes } = getService$
|
|
2486
|
+
const { toDto } = getService$2("data-mapper");
|
|
2487
|
+
const { findAllComponents } = getService$2("components");
|
|
2488
|
+
const { getAllFieldSizes } = getService$2("field-sizes");
|
|
2489
|
+
const { findAllContentTypes } = getService$2("content-types");
|
|
2294
2490
|
ctx.body = {
|
|
2295
2491
|
data: {
|
|
2296
2492
|
fieldSizes: getAllFieldSizes(),
|
|
@@ -2326,7 +2522,7 @@ const addFiltersClause = (params, filtersClause) => {
|
|
|
2326
2522
|
params.filters.$and.push(filtersClause);
|
|
2327
2523
|
};
|
|
2328
2524
|
const sanitizeMainField = (model, mainField, userAbility) => {
|
|
2329
|
-
const permissionChecker2 = getService$
|
|
2525
|
+
const permissionChecker2 = getService$2("permission-checker").create({
|
|
2330
2526
|
userAbility,
|
|
2331
2527
|
model: model.uid
|
|
2332
2528
|
});
|
|
@@ -2340,15 +2536,27 @@ const sanitizeMainField = (model, mainField, userAbility) => {
|
|
|
2340
2536
|
}
|
|
2341
2537
|
return mainField;
|
|
2342
2538
|
};
|
|
2343
|
-
const addStatusToRelations = async (
|
|
2344
|
-
if (!strapiUtils.contentTypes.hasDraftAndPublish(strapi.
|
|
2539
|
+
const addStatusToRelations = async (targetUid, relations2) => {
|
|
2540
|
+
if (!strapiUtils.contentTypes.hasDraftAndPublish(strapi.getModel(targetUid))) {
|
|
2345
2541
|
return relations2;
|
|
2346
2542
|
}
|
|
2347
|
-
const documentMetadata2 = getService$
|
|
2348
|
-
|
|
2543
|
+
const documentMetadata2 = getService$2("document-metadata");
|
|
2544
|
+
if (!relations2.length) {
|
|
2545
|
+
return relations2;
|
|
2546
|
+
}
|
|
2547
|
+
const firstRelation = relations2[0];
|
|
2548
|
+
const filters = {
|
|
2549
|
+
documentId: { $in: relations2.map((r) => r.documentId) },
|
|
2550
|
+
// NOTE: find the "opposite" status
|
|
2551
|
+
publishedAt: firstRelation.publishedAt !== null ? { $null: true } : { $notNull: true }
|
|
2552
|
+
};
|
|
2553
|
+
const availableStatus = await strapi.query(targetUid).findMany({
|
|
2554
|
+
select: ["id", "documentId", "locale", "updatedAt", "createdAt", "publishedAt"],
|
|
2555
|
+
filters
|
|
2556
|
+
});
|
|
2349
2557
|
return relations2.map((relation) => {
|
|
2350
|
-
const availableStatuses =
|
|
2351
|
-
(availableDocument) => availableDocument.documentId === relation.documentId
|
|
2558
|
+
const availableStatuses = availableStatus.filter(
|
|
2559
|
+
(availableDocument) => availableDocument.documentId === relation.documentId && (relation.locale ? availableDocument.locale === relation.locale : true)
|
|
2352
2560
|
);
|
|
2353
2561
|
return {
|
|
2354
2562
|
...relation,
|
|
@@ -2369,11 +2577,8 @@ const validateLocale = (sourceUid, targetUid, locale) => {
|
|
|
2369
2577
|
const isLocalized = strapi.plugin("i18n").service("content-types").isLocalizedContentType;
|
|
2370
2578
|
const isSourceLocalized = isLocalized(sourceModel);
|
|
2371
2579
|
const isTargetLocalized = isLocalized(targetModel);
|
|
2372
|
-
let validatedLocale = locale;
|
|
2373
|
-
if (!targetModel || !isTargetLocalized)
|
|
2374
|
-
validatedLocale = void 0;
|
|
2375
2580
|
return {
|
|
2376
|
-
locale
|
|
2581
|
+
locale,
|
|
2377
2582
|
isSourceLocalized,
|
|
2378
2583
|
isTargetLocalized
|
|
2379
2584
|
};
|
|
@@ -2413,7 +2618,7 @@ const relations = {
|
|
|
2413
2618
|
ctx.request?.query?.locale
|
|
2414
2619
|
);
|
|
2415
2620
|
const { status } = validateStatus(sourceUid, ctx.request?.query?.status);
|
|
2416
|
-
const permissionChecker2 = getService$
|
|
2621
|
+
const permissionChecker2 = getService$2("permission-checker").create({
|
|
2417
2622
|
userAbility,
|
|
2418
2623
|
model
|
|
2419
2624
|
});
|
|
@@ -2438,7 +2643,7 @@ const relations = {
|
|
|
2438
2643
|
where.id = id;
|
|
2439
2644
|
}
|
|
2440
2645
|
const permissionQuery = await permissionChecker2.sanitizedQuery.read(ctx.query);
|
|
2441
|
-
const populate = await getService$
|
|
2646
|
+
const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
|
|
2442
2647
|
const currentEntity = await strapi.db.query(model).findOne({
|
|
2443
2648
|
where,
|
|
2444
2649
|
populate
|
|
@@ -2453,7 +2658,7 @@ const relations = {
|
|
|
2453
2658
|
}
|
|
2454
2659
|
entryId = currentEntity.id;
|
|
2455
2660
|
}
|
|
2456
|
-
const modelConfig = isComponent2 ? await getService$
|
|
2661
|
+
const modelConfig = isComponent2 ? await getService$2("components").findConfiguration(sourceSchema) : await getService$2("content-types").findConfiguration(sourceSchema);
|
|
2457
2662
|
const targetSchema = strapi.getModel(targetUid);
|
|
2458
2663
|
const mainField = fp.flow(
|
|
2459
2664
|
fp.prop(`metadatas.${targetField}.edit.mainField`),
|
|
@@ -2476,7 +2681,7 @@ const relations = {
|
|
|
2476
2681
|
attribute,
|
|
2477
2682
|
fieldsToSelect,
|
|
2478
2683
|
mainField,
|
|
2479
|
-
source: { schema: sourceSchema },
|
|
2684
|
+
source: { schema: sourceSchema, isLocalized: isSourceLocalized },
|
|
2480
2685
|
target: { schema: targetSchema, isLocalized: isTargetLocalized },
|
|
2481
2686
|
sourceSchema,
|
|
2482
2687
|
targetSchema,
|
|
@@ -2498,7 +2703,8 @@ const relations = {
|
|
|
2498
2703
|
fieldsToSelect,
|
|
2499
2704
|
mainField,
|
|
2500
2705
|
source: {
|
|
2501
|
-
schema: { uid: sourceUid, modelType: sourceModelType }
|
|
2706
|
+
schema: { uid: sourceUid, modelType: sourceModelType },
|
|
2707
|
+
isLocalized: isSourceLocalized
|
|
2502
2708
|
},
|
|
2503
2709
|
target: {
|
|
2504
2710
|
schema: { uid: targetUid },
|
|
@@ -2506,7 +2712,7 @@ const relations = {
|
|
|
2506
2712
|
}
|
|
2507
2713
|
} = await this.extractAndValidateRequestInfo(ctx, id);
|
|
2508
2714
|
const { idsToOmit, idsToInclude, _q, ...query } = ctx.request.query;
|
|
2509
|
-
const permissionChecker2 = getService$
|
|
2715
|
+
const permissionChecker2 = getService$2("permission-checker").create({
|
|
2510
2716
|
userAbility: ctx.state.userAbility,
|
|
2511
2717
|
model: targetUid
|
|
2512
2718
|
});
|
|
@@ -2536,12 +2742,16 @@ const relations = {
|
|
|
2536
2742
|
} else {
|
|
2537
2743
|
where.id = id;
|
|
2538
2744
|
}
|
|
2539
|
-
|
|
2540
|
-
|
|
2745
|
+
const publishedAt = getPublishedAtClause(status, targetUid);
|
|
2746
|
+
if (!fp.isEmpty(publishedAt)) {
|
|
2747
|
+
where[`${alias}.published_at`] = publishedAt;
|
|
2541
2748
|
}
|
|
2542
|
-
if (
|
|
2749
|
+
if (isTargetLocalized && locale) {
|
|
2543
2750
|
where[`${alias}.locale`] = locale;
|
|
2544
2751
|
}
|
|
2752
|
+
if (isSourceLocalized && locale) {
|
|
2753
|
+
where.locale = locale;
|
|
2754
|
+
}
|
|
2545
2755
|
if ((idsToInclude?.length ?? 0) !== 0) {
|
|
2546
2756
|
where[`${alias}.id`].$notIn = idsToInclude;
|
|
2547
2757
|
}
|
|
@@ -2559,7 +2769,8 @@ const relations = {
|
|
|
2559
2769
|
id: { $notIn: fp.uniq(idsToOmit) }
|
|
2560
2770
|
});
|
|
2561
2771
|
}
|
|
2562
|
-
const
|
|
2772
|
+
const dbQuery = strapi.get("query-params").transform(targetUid, queryParams);
|
|
2773
|
+
const res = await strapi.db.query(targetUid).findPage(dbQuery);
|
|
2563
2774
|
ctx.body = {
|
|
2564
2775
|
...res,
|
|
2565
2776
|
results: await addStatusToRelations(targetUid, res.results)
|
|
@@ -2574,21 +2785,33 @@ const relations = {
|
|
|
2574
2785
|
attribute,
|
|
2575
2786
|
targetField,
|
|
2576
2787
|
fieldsToSelect,
|
|
2577
|
-
|
|
2578
|
-
|
|
2579
|
-
}
|
|
2580
|
-
target: {
|
|
2581
|
-
schema: { uid: targetUid }
|
|
2582
|
-
}
|
|
2788
|
+
status,
|
|
2789
|
+
source: { schema: sourceSchema },
|
|
2790
|
+
target: { schema: targetSchema }
|
|
2583
2791
|
} = await this.extractAndValidateRequestInfo(ctx, id);
|
|
2584
|
-
const
|
|
2792
|
+
const { uid: sourceUid } = sourceSchema;
|
|
2793
|
+
const { uid: targetUid } = targetSchema;
|
|
2794
|
+
const permissionQuery = await getService$2("permission-checker").create({ userAbility, model: targetUid }).sanitizedQuery.read({ fields: fieldsToSelect });
|
|
2585
2795
|
const dbQuery = strapi.db.query(sourceUid);
|
|
2586
2796
|
const loadRelations = strapiUtils.relations.isAnyToMany(attribute) ? (...args) => dbQuery.loadPages(...args) : (...args) => dbQuery.load(...args).then((res2) => ({ results: res2 ? [res2] : [] }));
|
|
2797
|
+
const filters = {};
|
|
2798
|
+
if (sourceSchema?.options?.draftAndPublish) {
|
|
2799
|
+
if (targetSchema?.options?.draftAndPublish) {
|
|
2800
|
+
if (status === "published") {
|
|
2801
|
+
filters.publishedAt = { $notNull: true };
|
|
2802
|
+
} else {
|
|
2803
|
+
filters.publishedAt = { $null: true };
|
|
2804
|
+
}
|
|
2805
|
+
}
|
|
2806
|
+
} else if (targetSchema?.options?.draftAndPublish) {
|
|
2807
|
+
filters.publishedAt = { $null: true };
|
|
2808
|
+
}
|
|
2587
2809
|
const res = await loadRelations({ id: entryId }, targetField, {
|
|
2588
|
-
select: ["id", "documentId", "locale", "publishedAt"],
|
|
2810
|
+
select: ["id", "documentId", "locale", "publishedAt", "updatedAt"],
|
|
2589
2811
|
ordering: "desc",
|
|
2590
2812
|
page: ctx.request.query.page,
|
|
2591
|
-
pageSize: ctx.request.query.pageSize
|
|
2813
|
+
pageSize: ctx.request.query.pageSize,
|
|
2814
|
+
filters
|
|
2592
2815
|
});
|
|
2593
2816
|
const loadedIds = res.results.map((item) => item.id);
|
|
2594
2817
|
addFiltersClause(permissionQuery, { id: { $in: loadedIds } });
|
|
@@ -2609,10 +2832,10 @@ const relations = {
|
|
|
2609
2832
|
}
|
|
2610
2833
|
};
|
|
2611
2834
|
const buildPopulateFromQuery = async (query, model) => {
|
|
2612
|
-
return getService$
|
|
2835
|
+
return getService$2("populate-builder")(model).populateFromQuery(query).populateDeep(Infinity).countRelations().build();
|
|
2613
2836
|
};
|
|
2614
2837
|
const findDocument = async (query, uid2, opts = {}) => {
|
|
2615
|
-
const documentManager2 = getService$
|
|
2838
|
+
const documentManager2 = getService$2("document-manager");
|
|
2616
2839
|
const populate = await buildPopulateFromQuery(query, uid2);
|
|
2617
2840
|
return documentManager2.findMany({ ...opts, populate }, uid2).then((documents) => documents[0]);
|
|
2618
2841
|
};
|
|
@@ -2620,8 +2843,8 @@ const createOrUpdateDocument = async (ctx, opts) => {
|
|
|
2620
2843
|
const { user, userAbility } = ctx.state;
|
|
2621
2844
|
const { model } = ctx.params;
|
|
2622
2845
|
const { body, query } = ctx.request;
|
|
2623
|
-
const documentManager2 = getService$
|
|
2624
|
-
const permissionChecker2 = getService$
|
|
2846
|
+
const documentManager2 = getService$2("document-manager");
|
|
2847
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
|
2625
2848
|
if (permissionChecker2.cannot.create() && permissionChecker2.cannot.update()) {
|
|
2626
2849
|
throw new strapiUtils.errors.ForbiddenError();
|
|
2627
2850
|
}
|
|
@@ -2662,7 +2885,7 @@ const singleTypes = {
|
|
|
2662
2885
|
const { userAbility } = ctx.state;
|
|
2663
2886
|
const { model } = ctx.params;
|
|
2664
2887
|
const { query = {} } = ctx.request;
|
|
2665
|
-
const permissionChecker2 = getService$
|
|
2888
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
|
2666
2889
|
if (permissionChecker2.cannot.read()) {
|
|
2667
2890
|
return ctx.forbidden();
|
|
2668
2891
|
}
|
|
@@ -2681,7 +2904,7 @@ const singleTypes = {
|
|
|
2681
2904
|
permissionChecker2,
|
|
2682
2905
|
model,
|
|
2683
2906
|
// @ts-expect-error - fix types
|
|
2684
|
-
{
|
|
2907
|
+
{ documentId: document.documentId, locale, publishedAt: null },
|
|
2685
2908
|
{ availableLocales: true, availableStatus: false }
|
|
2686
2909
|
);
|
|
2687
2910
|
ctx.body = { data: {}, meta };
|
|
@@ -2696,7 +2919,7 @@ const singleTypes = {
|
|
|
2696
2919
|
async createOrUpdate(ctx) {
|
|
2697
2920
|
const { userAbility } = ctx.state;
|
|
2698
2921
|
const { model } = ctx.params;
|
|
2699
|
-
const permissionChecker2 = getService$
|
|
2922
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
|
2700
2923
|
const document = await createOrUpdateDocument(ctx);
|
|
2701
2924
|
const sanitizedDocument = await permissionChecker2.sanitizeOutput(document);
|
|
2702
2925
|
ctx.body = await formatDocumentWithMetadata(permissionChecker2, model, sanitizedDocument);
|
|
@@ -2705,8 +2928,8 @@ const singleTypes = {
|
|
|
2705
2928
|
const { userAbility } = ctx.state;
|
|
2706
2929
|
const { model } = ctx.params;
|
|
2707
2930
|
const { query = {} } = ctx.request;
|
|
2708
|
-
const documentManager2 = getService$
|
|
2709
|
-
const permissionChecker2 = getService$
|
|
2931
|
+
const documentManager2 = getService$2("document-manager");
|
|
2932
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
|
2710
2933
|
if (permissionChecker2.cannot.delete()) {
|
|
2711
2934
|
return ctx.forbidden();
|
|
2712
2935
|
}
|
|
@@ -2734,8 +2957,8 @@ const singleTypes = {
|
|
|
2734
2957
|
const { userAbility } = ctx.state;
|
|
2735
2958
|
const { model } = ctx.params;
|
|
2736
2959
|
const { query = {} } = ctx.request;
|
|
2737
|
-
const documentManager2 = getService$
|
|
2738
|
-
const permissionChecker2 = getService$
|
|
2960
|
+
const documentManager2 = getService$2("document-manager");
|
|
2961
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
|
2739
2962
|
if (permissionChecker2.cannot.publish()) {
|
|
2740
2963
|
return ctx.forbidden();
|
|
2741
2964
|
}
|
|
@@ -2763,8 +2986,8 @@ const singleTypes = {
|
|
|
2763
2986
|
body: { discardDraft, ...body },
|
|
2764
2987
|
query = {}
|
|
2765
2988
|
} = ctx.request;
|
|
2766
|
-
const documentManager2 = getService$
|
|
2767
|
-
const permissionChecker2 = getService$
|
|
2989
|
+
const documentManager2 = getService$2("document-manager");
|
|
2990
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
|
2768
2991
|
if (permissionChecker2.cannot.unpublish()) {
|
|
2769
2992
|
return ctx.forbidden();
|
|
2770
2993
|
}
|
|
@@ -2798,8 +3021,8 @@ const singleTypes = {
|
|
|
2798
3021
|
const { userAbility } = ctx.state;
|
|
2799
3022
|
const { model } = ctx.params;
|
|
2800
3023
|
const { body, query = {} } = ctx.request;
|
|
2801
|
-
const documentManager2 = getService$
|
|
2802
|
-
const permissionChecker2 = getService$
|
|
3024
|
+
const documentManager2 = getService$2("document-manager");
|
|
3025
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
|
2803
3026
|
if (permissionChecker2.cannot.discard()) {
|
|
2804
3027
|
return ctx.forbidden();
|
|
2805
3028
|
}
|
|
@@ -2822,8 +3045,8 @@ const singleTypes = {
|
|
|
2822
3045
|
const { userAbility } = ctx.state;
|
|
2823
3046
|
const { model } = ctx.params;
|
|
2824
3047
|
const { query } = ctx.request;
|
|
2825
|
-
const documentManager2 = getService$
|
|
2826
|
-
const permissionChecker2 = getService$
|
|
3048
|
+
const documentManager2 = getService$2("document-manager");
|
|
3049
|
+
const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
|
|
2827
3050
|
const { locale } = await getDocumentLocaleAndStatus(query, model);
|
|
2828
3051
|
if (permissionChecker2.cannot.read()) {
|
|
2829
3052
|
return ctx.forbidden();
|
|
@@ -2847,7 +3070,7 @@ const uid$1 = {
|
|
|
2847
3070
|
const { query = {} } = ctx.request;
|
|
2848
3071
|
const { locale } = await getDocumentLocaleAndStatus(query, contentTypeUID);
|
|
2849
3072
|
await validateUIDField(contentTypeUID, field);
|
|
2850
|
-
const uidService = getService$
|
|
3073
|
+
const uidService = getService$2("uid");
|
|
2851
3074
|
ctx.body = {
|
|
2852
3075
|
data: await uidService.generateUIDField({ contentTypeUID, field, data, locale })
|
|
2853
3076
|
};
|
|
@@ -2859,7 +3082,7 @@ const uid$1 = {
|
|
|
2859
3082
|
const { query = {} } = ctx.request;
|
|
2860
3083
|
const { locale } = await getDocumentLocaleAndStatus(query, contentTypeUID);
|
|
2861
3084
|
await validateUIDField(contentTypeUID, field);
|
|
2862
|
-
const uidService = getService$
|
|
3085
|
+
const uidService = getService$2("uid");
|
|
2863
3086
|
const isAvailable = await uidService.checkUIDAvailability({
|
|
2864
3087
|
contentTypeUID,
|
|
2865
3088
|
field,
|
|
@@ -2880,7 +3103,8 @@ const controllers = {
|
|
|
2880
3103
|
relations,
|
|
2881
3104
|
"single-types": singleTypes,
|
|
2882
3105
|
uid: uid$1,
|
|
2883
|
-
...history.controllers ? history.controllers : {}
|
|
3106
|
+
...history.controllers ? history.controllers : {},
|
|
3107
|
+
...preview.controllers ? preview.controllers : {}
|
|
2884
3108
|
};
|
|
2885
3109
|
const keys = {
|
|
2886
3110
|
CONFIGURATION: "configuration"
|
|
@@ -3031,12 +3255,12 @@ async function syncMetadatas(configuration, schema) {
|
|
|
3031
3255
|
return ___default.default.assign(metasWithDefaults, updatedMetas);
|
|
3032
3256
|
}
|
|
3033
3257
|
const getTargetSchema = (targetModel) => {
|
|
3034
|
-
return getService$
|
|
3258
|
+
return getService$2("content-types").findContentType(targetModel);
|
|
3035
3259
|
};
|
|
3036
3260
|
const DEFAULT_LIST_LENGTH = 4;
|
|
3037
3261
|
const MAX_ROW_SIZE = 12;
|
|
3038
3262
|
const isAllowedFieldSize = (type, size) => {
|
|
3039
|
-
const { getFieldSize } = getService$
|
|
3263
|
+
const { getFieldSize } = getService$2("field-sizes");
|
|
3040
3264
|
const fieldSize = getFieldSize(type);
|
|
3041
3265
|
if (!fieldSize.isResizable && size !== fieldSize.default) {
|
|
3042
3266
|
return false;
|
|
@@ -3044,7 +3268,7 @@ const isAllowedFieldSize = (type, size) => {
|
|
|
3044
3268
|
return size <= MAX_ROW_SIZE;
|
|
3045
3269
|
};
|
|
3046
3270
|
const getDefaultFieldSize = (attribute) => {
|
|
3047
|
-
const { hasFieldSize, getFieldSize } = getService$
|
|
3271
|
+
const { hasFieldSize, getFieldSize } = getService$2("field-sizes");
|
|
3048
3272
|
return getFieldSize(hasFieldSize(attribute.customField) ? attribute.customField : attribute.type).default;
|
|
3049
3273
|
};
|
|
3050
3274
|
async function createDefaultLayouts(schema) {
|
|
@@ -3079,7 +3303,7 @@ function syncLayouts(configuration, schema) {
|
|
|
3079
3303
|
for (const el of row) {
|
|
3080
3304
|
if (!hasEditableAttribute(schema, el.name))
|
|
3081
3305
|
continue;
|
|
3082
|
-
const { hasFieldSize } = getService$
|
|
3306
|
+
const { hasFieldSize } = getService$2("field-sizes");
|
|
3083
3307
|
const fieldType = hasFieldSize(schema.attributes[el.name].customField) ? schema.attributes[el.name].customField : schema.attributes[el.name].type;
|
|
3084
3308
|
if (!isAllowedFieldSize(fieldType, el.size)) {
|
|
3085
3309
|
elementsToReAppend.push(el.name);
|
|
@@ -3219,17 +3443,17 @@ const configurationService$1 = createConfigurationService({
|
|
|
3219
3443
|
isComponent: true,
|
|
3220
3444
|
prefix: STORE_KEY_PREFIX,
|
|
3221
3445
|
getModels() {
|
|
3222
|
-
const { toContentManagerModel } = getService$
|
|
3446
|
+
const { toContentManagerModel } = getService$2("data-mapper");
|
|
3223
3447
|
return fp.mapValues(toContentManagerModel, strapi.components);
|
|
3224
3448
|
}
|
|
3225
3449
|
});
|
|
3226
3450
|
const components = ({ strapi: strapi2 }) => ({
|
|
3227
3451
|
findAllComponents() {
|
|
3228
|
-
const { toContentManagerModel } = getService$
|
|
3452
|
+
const { toContentManagerModel } = getService$2("data-mapper");
|
|
3229
3453
|
return Object.values(strapi2.components).map(toContentManagerModel);
|
|
3230
3454
|
},
|
|
3231
3455
|
findComponent(uid2) {
|
|
3232
|
-
const { toContentManagerModel } = getService$
|
|
3456
|
+
const { toContentManagerModel } = getService$2("data-mapper");
|
|
3233
3457
|
const component = strapi2.components[uid2];
|
|
3234
3458
|
return fp.isNil(component) ? component : toContentManagerModel(component);
|
|
3235
3459
|
},
|
|
@@ -3280,17 +3504,17 @@ const configurationService = createConfigurationService({
|
|
|
3280
3504
|
storeUtils,
|
|
3281
3505
|
prefix: "content_types",
|
|
3282
3506
|
getModels() {
|
|
3283
|
-
const { toContentManagerModel } = getService$
|
|
3507
|
+
const { toContentManagerModel } = getService$2("data-mapper");
|
|
3284
3508
|
return fp.mapValues(toContentManagerModel, strapi.contentTypes);
|
|
3285
3509
|
}
|
|
3286
3510
|
});
|
|
3287
3511
|
const service = ({ strapi: strapi2 }) => ({
|
|
3288
3512
|
findAllContentTypes() {
|
|
3289
|
-
const { toContentManagerModel } = getService$
|
|
3513
|
+
const { toContentManagerModel } = getService$2("data-mapper");
|
|
3290
3514
|
return Object.values(strapi2.contentTypes).map(toContentManagerModel);
|
|
3291
3515
|
},
|
|
3292
3516
|
findContentType(uid2) {
|
|
3293
|
-
const { toContentManagerModel } = getService$
|
|
3517
|
+
const { toContentManagerModel } = getService$2("data-mapper");
|
|
3294
3518
|
const contentType = strapi2.contentTypes[uid2];
|
|
3295
3519
|
return fp.isNil(contentType) ? contentType : toContentManagerModel(contentType);
|
|
3296
3520
|
},
|
|
@@ -3319,7 +3543,7 @@ const service = ({ strapi: strapi2 }) => ({
|
|
|
3319
3543
|
return this.findConfiguration(contentType);
|
|
3320
3544
|
},
|
|
3321
3545
|
findComponentsConfigurations(contentType) {
|
|
3322
|
-
return getService$
|
|
3546
|
+
return getService$2("components").findComponentsConfigurations(contentType);
|
|
3323
3547
|
},
|
|
3324
3548
|
syncConfigurations() {
|
|
3325
3549
|
return configurationService.syncConfigurations();
|
|
@@ -3591,7 +3815,7 @@ const permission = ({ strapi: strapi2 }) => ({
|
|
|
3591
3815
|
return userAbility.can(action);
|
|
3592
3816
|
},
|
|
3593
3817
|
async registerPermissions() {
|
|
3594
|
-
const displayedContentTypes = getService$
|
|
3818
|
+
const displayedContentTypes = getService$2("content-types").findDisplayedContentTypes();
|
|
3595
3819
|
const contentTypesUids = displayedContentTypes.map(fp.prop("uid"));
|
|
3596
3820
|
const actions = [
|
|
3597
3821
|
{
|
|
@@ -3867,7 +4091,7 @@ const getQueryPopulate = async (uid2, query) => {
|
|
|
3867
4091
|
return populateQuery;
|
|
3868
4092
|
};
|
|
3869
4093
|
const buildDeepPopulate = (uid2) => {
|
|
3870
|
-
return getService$
|
|
4094
|
+
return getService$2("populate-builder")(uid2).populateDeep(Infinity).countRelations().build();
|
|
3871
4095
|
};
|
|
3872
4096
|
const populateBuilder = (uid2) => {
|
|
3873
4097
|
let getInitialPopulate = async () => {
|
|
@@ -4052,7 +4276,9 @@ const documentMetadata = ({ strapi: strapi2 }) => ({
|
|
|
4052
4276
|
*/
|
|
4053
4277
|
async getAvailableLocales(uid2, version, allVersions, validatableFields = []) {
|
|
4054
4278
|
const versionsByLocale = fp.groupBy("locale", allVersions);
|
|
4055
|
-
|
|
4279
|
+
if (version.locale) {
|
|
4280
|
+
delete versionsByLocale[version.locale];
|
|
4281
|
+
}
|
|
4056
4282
|
const model = strapi2.getModel(uid2);
|
|
4057
4283
|
const keysToKeep = [...AVAILABLE_LOCALES_FIELDS, ...validatableFields];
|
|
4058
4284
|
const traversalFunction = async (localeVersion) => strapiUtils.traverseEntity(
|
|
@@ -4408,7 +4634,8 @@ const services = {
|
|
|
4408
4634
|
permission,
|
|
4409
4635
|
"populate-builder": populateBuilder$1,
|
|
4410
4636
|
uid,
|
|
4411
|
-
...history.services ? history.services : {}
|
|
4637
|
+
...history.services ? history.services : {},
|
|
4638
|
+
...preview.services ? preview.services : {}
|
|
4412
4639
|
};
|
|
4413
4640
|
const index = () => {
|
|
4414
4641
|
return {
|