@strapi/content-releases 0.0.0-experimental.d954d57341a6623992a0d211daaec8e245c3517d → 0.0.0-experimental.d9f9f725e07a329ca272ecedef7bd85fa74dd661
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/LICENSE +17 -1
- package/dist/_chunks/{App-CqbuK4M6.js → App-dLXY5ei3.js} +439 -431
- package/dist/_chunks/App-dLXY5ei3.js.map +1 -0
- package/dist/_chunks/{App-Do-Rnv0A.mjs → App-jrh58sXY.mjs} +416 -409
- package/dist/_chunks/App-jrh58sXY.mjs.map +1 -0
- package/dist/_chunks/{PurchaseContentReleases-_MxP6-Dt.mjs → PurchaseContentReleases-3tRbmbY3.mjs} +7 -8
- package/dist/_chunks/PurchaseContentReleases-3tRbmbY3.mjs.map +1 -0
- package/dist/_chunks/{PurchaseContentReleases-Be3acS2L.js → PurchaseContentReleases-bpIYXOfu.js} +6 -7
- package/dist/_chunks/PurchaseContentReleases-bpIYXOfu.js.map +1 -0
- package/dist/_chunks/{en-DtFJ5ViE.js → en-HrREghh3.js} +1 -1
- package/dist/_chunks/en-HrREghh3.js.map +1 -0
- package/dist/_chunks/{en-B9Ur3VsE.mjs → en-ltT1TlKQ.mjs} +1 -1
- package/dist/_chunks/en-ltT1TlKQ.mjs.map +1 -0
- package/dist/_chunks/{index-Tedsw4GC.js → index-CVO0Rqdm.js} +504 -197
- package/dist/_chunks/index-CVO0Rqdm.js.map +1 -0
- package/dist/_chunks/{index-D_pgdqQL.mjs → index-PiOGBETy.mjs} +503 -198
- package/dist/_chunks/index-PiOGBETy.mjs.map +1 -0
- package/dist/admin/index.js +15 -1
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +16 -2
- package/dist/admin/index.mjs.map +1 -1
- package/dist/server/index.js +86 -83
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +86 -84
- package/dist/server/index.mjs.map +1 -1
- package/package.json +36 -29
- package/dist/_chunks/App-CqbuK4M6.js.map +0 -1
- package/dist/_chunks/App-Do-Rnv0A.mjs.map +0 -1
- package/dist/_chunks/PurchaseContentReleases-Be3acS2L.js.map +0 -1
- package/dist/_chunks/PurchaseContentReleases-_MxP6-Dt.mjs.map +0 -1
- package/dist/_chunks/en-B9Ur3VsE.mjs.map +0 -1
- package/dist/_chunks/en-DtFJ5ViE.js.map +0 -1
- package/dist/_chunks/index-D_pgdqQL.mjs.map +0 -1
- package/dist/_chunks/index-Tedsw4GC.js.map +0 -1
- package/dist/admin/src/components/CMReleasesContainer.d.ts +0 -22
- package/dist/admin/src/components/RelativeTime.d.ts +0 -28
- package/dist/admin/src/components/ReleaseAction.d.ts +0 -3
- package/dist/admin/src/components/ReleaseActionMenu.d.ts +0 -26
- package/dist/admin/src/components/ReleaseActionOptions.d.ts +0 -9
- package/dist/admin/src/components/ReleaseListCell.d.ts +0 -0
- package/dist/admin/src/components/ReleaseModal.d.ts +0 -17
- package/dist/admin/src/constants.d.ts +0 -58
- package/dist/admin/src/index.d.ts +0 -3
- package/dist/admin/src/pages/App.d.ts +0 -1
- package/dist/admin/src/pages/PurchaseContentReleases.d.ts +0 -2
- package/dist/admin/src/pages/ReleaseDetailsPage.d.ts +0 -2
- package/dist/admin/src/pages/ReleasesPage.d.ts +0 -8
- package/dist/admin/src/pages/tests/mockReleaseDetailsPageData.d.ts +0 -181
- package/dist/admin/src/pages/tests/mockReleasesPageData.d.ts +0 -39
- package/dist/admin/src/pluginId.d.ts +0 -1
- package/dist/admin/src/services/release.d.ts +0 -105
- package/dist/admin/src/store/hooks.d.ts +0 -7
- package/dist/admin/src/utils/api.d.ts +0 -6
- package/dist/admin/src/utils/prefixPluginTranslations.d.ts +0 -3
- package/dist/admin/src/utils/time.d.ts +0 -1
- package/dist/server/src/bootstrap.d.ts +0 -5
- package/dist/server/src/bootstrap.d.ts.map +0 -1
- package/dist/server/src/constants.d.ts +0 -12
- package/dist/server/src/constants.d.ts.map +0 -1
- package/dist/server/src/content-types/index.d.ts +0 -99
- package/dist/server/src/content-types/index.d.ts.map +0 -1
- package/dist/server/src/content-types/release/index.d.ts +0 -48
- package/dist/server/src/content-types/release/index.d.ts.map +0 -1
- package/dist/server/src/content-types/release/schema.d.ts +0 -47
- package/dist/server/src/content-types/release/schema.d.ts.map +0 -1
- package/dist/server/src/content-types/release-action/index.d.ts +0 -50
- package/dist/server/src/content-types/release-action/index.d.ts.map +0 -1
- package/dist/server/src/content-types/release-action/schema.d.ts +0 -49
- package/dist/server/src/content-types/release-action/schema.d.ts.map +0 -1
- package/dist/server/src/controllers/index.d.ts +0 -20
- package/dist/server/src/controllers/index.d.ts.map +0 -1
- package/dist/server/src/controllers/release-action.d.ts +0 -10
- package/dist/server/src/controllers/release-action.d.ts.map +0 -1
- package/dist/server/src/controllers/release.d.ts +0 -12
- package/dist/server/src/controllers/release.d.ts.map +0 -1
- package/dist/server/src/controllers/validation/release-action.d.ts +0 -8
- package/dist/server/src/controllers/validation/release-action.d.ts.map +0 -1
- package/dist/server/src/controllers/validation/release.d.ts +0 -2
- package/dist/server/src/controllers/validation/release.d.ts.map +0 -1
- package/dist/server/src/destroy.d.ts +0 -5
- package/dist/server/src/destroy.d.ts.map +0 -1
- package/dist/server/src/index.d.ts +0 -2096
- package/dist/server/src/index.d.ts.map +0 -1
- package/dist/server/src/migrations/index.d.ts +0 -13
- package/dist/server/src/migrations/index.d.ts.map +0 -1
- package/dist/server/src/register.d.ts +0 -5
- package/dist/server/src/register.d.ts.map +0 -1
- package/dist/server/src/routes/index.d.ts +0 -35
- package/dist/server/src/routes/index.d.ts.map +0 -1
- package/dist/server/src/routes/release-action.d.ts +0 -18
- package/dist/server/src/routes/release-action.d.ts.map +0 -1
- package/dist/server/src/routes/release.d.ts +0 -18
- package/dist/server/src/routes/release.d.ts.map +0 -1
- package/dist/server/src/services/index.d.ts +0 -1826
- package/dist/server/src/services/index.d.ts.map +0 -1
- package/dist/server/src/services/release.d.ts +0 -66
- package/dist/server/src/services/release.d.ts.map +0 -1
- package/dist/server/src/services/scheduling.d.ts +0 -18
- package/dist/server/src/services/scheduling.d.ts.map +0 -1
- package/dist/server/src/services/validation.d.ts +0 -18
- package/dist/server/src/services/validation.d.ts.map +0 -1
- package/dist/server/src/utils/index.d.ts +0 -14
- package/dist/server/src/utils/index.d.ts.map +0 -1
- package/dist/shared/contracts/release-actions.d.ts +0 -131
- package/dist/shared/contracts/release-actions.d.ts.map +0 -1
- package/dist/shared/contracts/releases.d.ts +0 -182
- package/dist/shared/contracts/releases.d.ts.map +0 -1
- package/dist/shared/types.d.ts +0 -24
- package/dist/shared/types.d.ts.map +0 -1
- package/dist/shared/validation-schemas.d.ts +0 -2
- package/dist/shared/validation-schemas.d.ts.map +0 -1
package/dist/server/index.js
CHANGED
|
@@ -3,6 +3,7 @@ const utils = require("@strapi/utils");
|
|
|
3
3
|
const isEqual = require("lodash/isEqual");
|
|
4
4
|
const lodash = require("lodash");
|
|
5
5
|
const _ = require("lodash/fp");
|
|
6
|
+
const EE = require("@strapi/strapi/dist/utils/ee");
|
|
6
7
|
const nodeSchedule = require("node-schedule");
|
|
7
8
|
const yup = require("yup");
|
|
8
9
|
const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
|
|
@@ -26,6 +27,7 @@ function _interopNamespace(e) {
|
|
|
26
27
|
}
|
|
27
28
|
const isEqual__default = /* @__PURE__ */ _interopDefault(isEqual);
|
|
28
29
|
const ___default = /* @__PURE__ */ _interopDefault(_);
|
|
30
|
+
const EE__default = /* @__PURE__ */ _interopDefault(EE);
|
|
29
31
|
const yup__namespace = /* @__PURE__ */ _interopNamespace(yup);
|
|
30
32
|
const RELEASE_MODEL_UID = "plugin::content-releases.release";
|
|
31
33
|
const RELEASE_ACTION_MODEL_UID = "plugin::content-releases.release-action";
|
|
@@ -76,19 +78,16 @@ const ACTIONS = [
|
|
|
76
78
|
const ALLOWED_WEBHOOK_EVENTS = {
|
|
77
79
|
RELEASES_PUBLISH: "releases.publish"
|
|
78
80
|
};
|
|
79
|
-
const getService = (name, { strapi: strapi2 }) => {
|
|
81
|
+
const getService = (name, { strapi: strapi2 } = { strapi: global.strapi }) => {
|
|
80
82
|
return strapi2.plugin("content-releases").service(name);
|
|
81
83
|
};
|
|
82
|
-
const getPopulatedEntry = async (contentTypeUid, entryId, { strapi: strapi2 }) => {
|
|
84
|
+
const getPopulatedEntry = async (contentTypeUid, entryId, { strapi: strapi2 } = { strapi: global.strapi }) => {
|
|
83
85
|
const populateBuilderService = strapi2.plugin("content-manager").service("populate-builder");
|
|
84
86
|
const populate = await populateBuilderService(contentTypeUid).populateDeep(Infinity).build();
|
|
85
|
-
const entry = await strapi2.
|
|
86
|
-
where: { id: entryId },
|
|
87
|
-
populate
|
|
88
|
-
});
|
|
87
|
+
const entry = await strapi2.entityService.findOne(contentTypeUid, entryId, { populate });
|
|
89
88
|
return entry;
|
|
90
89
|
};
|
|
91
|
-
const getEntryValidStatus = async (contentTypeUid, entry, { strapi: strapi2 }) => {
|
|
90
|
+
const getEntryValidStatus = async (contentTypeUid, entry, { strapi: strapi2 } = { strapi: global.strapi }) => {
|
|
92
91
|
try {
|
|
93
92
|
await strapi2.entityValidator.validateEntityCreation(
|
|
94
93
|
strapi2.getModel(contentTypeUid),
|
|
@@ -123,7 +122,7 @@ async function deleteActionsOnDisableDraftAndPublish({
|
|
|
123
122
|
async function deleteActionsOnDeleteContentType({ oldContentTypes, contentTypes: contentTypes2 }) {
|
|
124
123
|
const deletedContentTypes = lodash.difference(lodash.keys(oldContentTypes), lodash.keys(contentTypes2)) ?? [];
|
|
125
124
|
if (deletedContentTypes.length) {
|
|
126
|
-
await utils.
|
|
125
|
+
await utils.mapAsync(deletedContentTypes, async (deletedContentTypeUID) => {
|
|
127
126
|
return strapi.db?.queryBuilder(RELEASE_ACTION_MODEL_UID).delete().where({ contentType: deletedContentTypeUID }).execute();
|
|
128
127
|
});
|
|
129
128
|
}
|
|
@@ -142,7 +141,7 @@ async function migrateIsValidAndStatusReleases() {
|
|
|
142
141
|
}
|
|
143
142
|
}
|
|
144
143
|
});
|
|
145
|
-
utils.
|
|
144
|
+
utils.mapAsync(releasesWithoutStatus, async (release2) => {
|
|
146
145
|
const actions = release2.actions;
|
|
147
146
|
const notValidatedActions = actions.filter((action) => action.isEntryValid === null);
|
|
148
147
|
for (const action of notValidatedActions) {
|
|
@@ -173,7 +172,7 @@ async function migrateIsValidAndStatusReleases() {
|
|
|
173
172
|
}
|
|
174
173
|
}
|
|
175
174
|
});
|
|
176
|
-
utils.
|
|
175
|
+
utils.mapAsync(publishedReleases, async (release2) => {
|
|
177
176
|
return strapi.db.query(RELEASE_MODEL_UID).update({
|
|
178
177
|
where: {
|
|
179
178
|
id: release2.id
|
|
@@ -190,7 +189,7 @@ async function revalidateChangedContentTypes({ oldContentTypes, contentTypes: co
|
|
|
190
189
|
(uid) => oldContentTypes[uid]?.options?.draftAndPublish
|
|
191
190
|
);
|
|
192
191
|
const releasesAffected = /* @__PURE__ */ new Set();
|
|
193
|
-
utils.
|
|
192
|
+
utils.mapAsync(contentTypesWithDraftAndPublish, async (contentTypeUID) => {
|
|
194
193
|
const oldContentType = oldContentTypes[contentTypeUID];
|
|
195
194
|
const contentType = contentTypes2[contentTypeUID];
|
|
196
195
|
if (!isEqual__default.default(oldContentType?.attributes, contentType?.attributes)) {
|
|
@@ -203,7 +202,7 @@ async function revalidateChangedContentTypes({ oldContentTypes, contentTypes: co
|
|
|
203
202
|
release: true
|
|
204
203
|
}
|
|
205
204
|
});
|
|
206
|
-
await utils.
|
|
205
|
+
await utils.mapAsync(actions, async (action) => {
|
|
207
206
|
if (action.entry && action.release) {
|
|
208
207
|
const populatedEntry = await getPopulatedEntry(contentTypeUID, action.entry.id, {
|
|
209
208
|
strapi
|
|
@@ -226,7 +225,7 @@ async function revalidateChangedContentTypes({ oldContentTypes, contentTypes: co
|
|
|
226
225
|
});
|
|
227
226
|
}
|
|
228
227
|
}).then(() => {
|
|
229
|
-
utils.
|
|
228
|
+
utils.mapAsync(releasesAffected, async (releaseId) => {
|
|
230
229
|
return getService("release", { strapi }).updateReleaseStatus(releaseId);
|
|
231
230
|
});
|
|
232
231
|
});
|
|
@@ -278,10 +277,11 @@ async function enableContentTypeLocalized({ oldContentTypes, contentTypes: conte
|
|
|
278
277
|
}
|
|
279
278
|
}
|
|
280
279
|
}
|
|
280
|
+
const { features: features$2 } = require("@strapi/strapi/dist/utils/ee");
|
|
281
281
|
const register = async ({ strapi: strapi2 }) => {
|
|
282
|
-
if (
|
|
283
|
-
await strapi2.
|
|
284
|
-
strapi2.hook("strapi::content-types.beforeSync").register(
|
|
282
|
+
if (features$2.isEnabled("cms-content-releases")) {
|
|
283
|
+
await strapi2.admin.services.permission.actionProvider.registerMany(ACTIONS);
|
|
284
|
+
strapi2.hook("strapi::content-types.beforeSync").register(deleteActionsOnDisableDraftAndPublish).register(disableContentTypeLocalized);
|
|
285
285
|
strapi2.hook("strapi::content-types.afterSync").register(deleteActionsOnDeleteContentType).register(enableContentTypeLocalized).register(revalidateChangedContentTypes).register(migrateIsValidAndStatusReleases);
|
|
286
286
|
}
|
|
287
287
|
if (strapi2.plugin("graphql")) {
|
|
@@ -290,8 +290,9 @@ const register = async ({ strapi: strapi2 }) => {
|
|
|
290
290
|
graphqlExtensionService.shadowCRUD(RELEASE_ACTION_MODEL_UID).disable();
|
|
291
291
|
}
|
|
292
292
|
};
|
|
293
|
+
const { features: features$1 } = require("@strapi/strapi/dist/utils/ee");
|
|
293
294
|
const bootstrap = async ({ strapi: strapi2 }) => {
|
|
294
|
-
if (
|
|
295
|
+
if (features$1.isEnabled("cms-content-releases")) {
|
|
295
296
|
const contentTypesWithDraftAndPublish = Object.keys(strapi2.contentTypes).filter(
|
|
296
297
|
(uid) => strapi2.contentTypes[uid]?.options?.draftAndPublish
|
|
297
298
|
);
|
|
@@ -350,7 +351,9 @@ const bootstrap = async ({ strapi: strapi2 }) => {
|
|
|
350
351
|
actions: {
|
|
351
352
|
target_type: model.uid,
|
|
352
353
|
target_id: {
|
|
353
|
-
$in: entriesToDelete.map(
|
|
354
|
+
$in: entriesToDelete.map(
|
|
355
|
+
(entry) => entry.id
|
|
356
|
+
)
|
|
354
357
|
}
|
|
355
358
|
}
|
|
356
359
|
}
|
|
@@ -377,9 +380,13 @@ const bootstrap = async ({ strapi: strapi2 }) => {
|
|
|
377
380
|
try {
|
|
378
381
|
const { model, result } = event;
|
|
379
382
|
if (model.kind === "collectionType" && model.options?.draftAndPublish) {
|
|
380
|
-
const isEntryValid = await getEntryValidStatus(
|
|
381
|
-
|
|
382
|
-
|
|
383
|
+
const isEntryValid = await getEntryValidStatus(
|
|
384
|
+
model.uid,
|
|
385
|
+
result,
|
|
386
|
+
{
|
|
387
|
+
strapi: strapi2
|
|
388
|
+
}
|
|
389
|
+
);
|
|
383
390
|
await strapi2.db.query(RELEASE_ACTION_MODEL_UID).update({
|
|
384
391
|
where: {
|
|
385
392
|
target_type: model.uid,
|
|
@@ -413,7 +420,7 @@ const bootstrap = async ({ strapi: strapi2 }) => {
|
|
|
413
420
|
throw err;
|
|
414
421
|
});
|
|
415
422
|
Object.entries(ALLOWED_WEBHOOK_EVENTS).forEach(([key, value]) => {
|
|
416
|
-
strapi2.
|
|
423
|
+
strapi2.webhookStore.addAllowedEvent(key, value);
|
|
417
424
|
});
|
|
418
425
|
}
|
|
419
426
|
};
|
|
@@ -648,7 +655,7 @@ const createReleaseService = ({ strapi: strapi2 }) => {
|
|
|
648
655
|
validateUniqueNameForPendingRelease(releaseWithCreatorFields.name),
|
|
649
656
|
validateScheduledAtIsLaterThanNow(releaseWithCreatorFields.scheduledAt)
|
|
650
657
|
]);
|
|
651
|
-
const release2 = await strapi2.
|
|
658
|
+
const release2 = await strapi2.entityService.create(RELEASE_MODEL_UID, {
|
|
652
659
|
data: {
|
|
653
660
|
...releaseWithCreatorFields,
|
|
654
661
|
status: "empty"
|
|
@@ -662,19 +669,17 @@ const createReleaseService = ({ strapi: strapi2 }) => {
|
|
|
662
669
|
return release2;
|
|
663
670
|
},
|
|
664
671
|
async findOne(id, query = {}) {
|
|
665
|
-
const
|
|
666
|
-
|
|
667
|
-
...dbQuery,
|
|
668
|
-
where: { id }
|
|
672
|
+
const release2 = await strapi2.entityService.findOne(RELEASE_MODEL_UID, id, {
|
|
673
|
+
...query
|
|
669
674
|
});
|
|
670
675
|
return release2;
|
|
671
676
|
},
|
|
672
677
|
findPage(query) {
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
...dbQuery,
|
|
678
|
+
return strapi2.entityService.findPage(RELEASE_MODEL_UID, {
|
|
679
|
+
...query,
|
|
676
680
|
populate: {
|
|
677
681
|
actions: {
|
|
682
|
+
// @ts-expect-error Ignore missing properties
|
|
678
683
|
count: true
|
|
679
684
|
}
|
|
680
685
|
}
|
|
@@ -779,15 +784,19 @@ const createReleaseService = ({ strapi: strapi2 }) => {
|
|
|
779
784
|
validateUniqueNameForPendingRelease(releaseWithCreatorFields.name, id),
|
|
780
785
|
validateScheduledAtIsLaterThanNow(releaseWithCreatorFields.scheduledAt)
|
|
781
786
|
]);
|
|
782
|
-
const release2 = await strapi2.
|
|
787
|
+
const release2 = await strapi2.entityService.findOne(RELEASE_MODEL_UID, id);
|
|
783
788
|
if (!release2) {
|
|
784
789
|
throw new utils.errors.NotFoundError(`No release found for id ${id}`);
|
|
785
790
|
}
|
|
786
791
|
if (release2.releasedAt) {
|
|
787
792
|
throw new utils.errors.ValidationError("Release already published");
|
|
788
793
|
}
|
|
789
|
-
const updatedRelease = await strapi2.
|
|
790
|
-
|
|
794
|
+
const updatedRelease = await strapi2.entityService.update(RELEASE_MODEL_UID, id, {
|
|
795
|
+
/*
|
|
796
|
+
* The type returned from the entity service: Partial<Input<"plugin::content-releases.release">>
|
|
797
|
+
* is not compatible with the type we are passing here: UpdateRelease.Request['body']
|
|
798
|
+
*/
|
|
799
|
+
// @ts-expect-error see above
|
|
791
800
|
data: releaseWithCreatorFields
|
|
792
801
|
});
|
|
793
802
|
const schedulingService = getService("scheduling", { strapi: strapi2 });
|
|
@@ -808,7 +817,7 @@ const createReleaseService = ({ strapi: strapi2 }) => {
|
|
|
808
817
|
validateEntryContentType(action.entry.contentType),
|
|
809
818
|
validateUniqueEntry(releaseId, action)
|
|
810
819
|
]);
|
|
811
|
-
const release2 = await strapi2.
|
|
820
|
+
const release2 = await strapi2.entityService.findOne(RELEASE_MODEL_UID, releaseId);
|
|
812
821
|
if (!release2) {
|
|
813
822
|
throw new utils.errors.NotFoundError(`No release found for id ${releaseId}`);
|
|
814
823
|
}
|
|
@@ -818,7 +827,7 @@ const createReleaseService = ({ strapi: strapi2 }) => {
|
|
|
818
827
|
const { entry, type } = action;
|
|
819
828
|
const populatedEntry = await getPopulatedEntry(entry.contentType, entry.id, { strapi: strapi2 });
|
|
820
829
|
const isEntryValid = await getEntryValidStatus(entry.contentType, populatedEntry, { strapi: strapi2 });
|
|
821
|
-
const releaseAction2 = await strapi2.
|
|
830
|
+
const releaseAction2 = await strapi2.entityService.create(RELEASE_ACTION_MODEL_UID, {
|
|
822
831
|
data: {
|
|
823
832
|
type,
|
|
824
833
|
contentType: entry.contentType,
|
|
@@ -831,35 +840,32 @@ const createReleaseService = ({ strapi: strapi2 }) => {
|
|
|
831
840
|
},
|
|
832
841
|
release: releaseId
|
|
833
842
|
},
|
|
834
|
-
populate: { release: {
|
|
843
|
+
populate: { release: { fields: ["id"] }, entry: { fields: ["id"] } }
|
|
835
844
|
});
|
|
836
845
|
this.updateReleaseStatus(releaseId);
|
|
837
846
|
return releaseAction2;
|
|
838
847
|
},
|
|
839
848
|
async findActions(releaseId, query) {
|
|
840
|
-
const release2 = await strapi2.
|
|
841
|
-
|
|
842
|
-
select: ["id"]
|
|
849
|
+
const release2 = await strapi2.entityService.findOne(RELEASE_MODEL_UID, releaseId, {
|
|
850
|
+
fields: ["id"]
|
|
843
851
|
});
|
|
844
852
|
if (!release2) {
|
|
845
853
|
throw new utils.errors.NotFoundError(`No release found for id ${releaseId}`);
|
|
846
854
|
}
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
...dbQuery,
|
|
855
|
+
return strapi2.entityService.findPage(RELEASE_ACTION_MODEL_UID, {
|
|
856
|
+
...query,
|
|
850
857
|
populate: {
|
|
851
858
|
entry: {
|
|
852
859
|
populate: "*"
|
|
853
860
|
}
|
|
854
861
|
},
|
|
855
|
-
|
|
862
|
+
filters: {
|
|
856
863
|
release: releaseId
|
|
857
864
|
}
|
|
858
865
|
});
|
|
859
866
|
},
|
|
860
867
|
async countActions(query) {
|
|
861
|
-
|
|
862
|
-
return strapi2.db.query(RELEASE_ACTION_MODEL_UID).count(dbQuery);
|
|
868
|
+
return strapi2.entityService.count(RELEASE_ACTION_MODEL_UID, query);
|
|
863
869
|
},
|
|
864
870
|
async groupActions(actions, groupBy) {
|
|
865
871
|
const contentTypeUids = actions.reduce((acc, action) => {
|
|
@@ -868,7 +874,9 @@ const createReleaseService = ({ strapi: strapi2 }) => {
|
|
|
868
874
|
}
|
|
869
875
|
return acc;
|
|
870
876
|
}, []);
|
|
871
|
-
const allReleaseContentTypesDictionary = await this.getContentTypesDataForActions(
|
|
877
|
+
const allReleaseContentTypesDictionary = await this.getContentTypesDataForActions(
|
|
878
|
+
contentTypeUids
|
|
879
|
+
);
|
|
872
880
|
const allLocalesDictionary = await this.getLocalesDataForActions();
|
|
873
881
|
const formattedData = actions.map((action) => {
|
|
874
882
|
const { mainField, displayName } = allReleaseContentTypesDictionary[action.contentType];
|
|
@@ -938,11 +946,10 @@ const createReleaseService = ({ strapi: strapi2 }) => {
|
|
|
938
946
|
return componentsMap;
|
|
939
947
|
},
|
|
940
948
|
async delete(releaseId) {
|
|
941
|
-
const release2 = await strapi2.
|
|
942
|
-
where: { id: releaseId },
|
|
949
|
+
const release2 = await strapi2.entityService.findOne(RELEASE_MODEL_UID, releaseId, {
|
|
943
950
|
populate: {
|
|
944
951
|
actions: {
|
|
945
|
-
|
|
952
|
+
fields: ["id"]
|
|
946
953
|
}
|
|
947
954
|
}
|
|
948
955
|
});
|
|
@@ -960,11 +967,7 @@ const createReleaseService = ({ strapi: strapi2 }) => {
|
|
|
960
967
|
}
|
|
961
968
|
}
|
|
962
969
|
});
|
|
963
|
-
await strapi2.
|
|
964
|
-
where: {
|
|
965
|
-
id: releaseId
|
|
966
|
-
}
|
|
967
|
-
});
|
|
970
|
+
await strapi2.entityService.delete(RELEASE_MODEL_UID, releaseId);
|
|
968
971
|
});
|
|
969
972
|
if (release2.scheduledAt) {
|
|
970
973
|
const schedulingService = getService("scheduling", { strapi: strapi2 });
|
|
@@ -990,7 +993,9 @@ const createReleaseService = ({ strapi: strapi2 }) => {
|
|
|
990
993
|
}
|
|
991
994
|
try {
|
|
992
995
|
strapi2.log.info(`[Content Releases] Starting to publish release ${lockedRelease.name}`);
|
|
993
|
-
const { collectionTypeActions, singleTypeActions } = await getFormattedActions(
|
|
996
|
+
const { collectionTypeActions, singleTypeActions } = await getFormattedActions(
|
|
997
|
+
releaseId
|
|
998
|
+
);
|
|
994
999
|
await strapi2.db.transaction(async () => {
|
|
995
1000
|
for (const { uid, action, id } of singleTypeActions) {
|
|
996
1001
|
await publishSingleTypeAction(uid, action, id);
|
|
@@ -1033,7 +1038,7 @@ const createReleaseService = ({ strapi: strapi2 }) => {
|
|
|
1033
1038
|
};
|
|
1034
1039
|
}
|
|
1035
1040
|
});
|
|
1036
|
-
if (error
|
|
1041
|
+
if (error) {
|
|
1037
1042
|
throw error;
|
|
1038
1043
|
}
|
|
1039
1044
|
return release2;
|
|
@@ -1131,11 +1136,8 @@ class AlreadyOnReleaseError extends utils.errors.ApplicationError {
|
|
|
1131
1136
|
}
|
|
1132
1137
|
const createReleaseValidationService = ({ strapi: strapi2 }) => ({
|
|
1133
1138
|
async validateUniqueEntry(releaseId, releaseActionArgs) {
|
|
1134
|
-
const release2 = await strapi2.
|
|
1135
|
-
|
|
1136
|
-
id: releaseId
|
|
1137
|
-
},
|
|
1138
|
-
populate: { actions: { populate: { entry: { select: ["id"] } } } }
|
|
1139
|
+
const release2 = await strapi2.entityService.findOne(RELEASE_MODEL_UID, releaseId, {
|
|
1140
|
+
populate: { actions: { populate: { entry: { fields: ["id"] } } } }
|
|
1139
1141
|
});
|
|
1140
1142
|
if (!release2) {
|
|
1141
1143
|
throw new utils.errors.NotFoundError(`No release found for id ${releaseId}`);
|
|
@@ -1161,8 +1163,10 @@ const createReleaseValidationService = ({ strapi: strapi2 }) => ({
|
|
|
1161
1163
|
}
|
|
1162
1164
|
},
|
|
1163
1165
|
async validatePendingReleasesLimit() {
|
|
1164
|
-
const
|
|
1165
|
-
|
|
1166
|
+
const maximumPendingReleases = (
|
|
1167
|
+
// @ts-expect-error - options is not typed into features
|
|
1168
|
+
EE__default.default.features.get("cms-content-releases")?.options?.maximumReleases || 3
|
|
1169
|
+
);
|
|
1166
1170
|
const [, pendingReleasesCount] = await strapi2.db.query(RELEASE_MODEL_UID).findWithCount({
|
|
1167
1171
|
filters: {
|
|
1168
1172
|
releasedAt: {
|
|
@@ -1175,8 +1179,8 @@ const createReleaseValidationService = ({ strapi: strapi2 }) => ({
|
|
|
1175
1179
|
}
|
|
1176
1180
|
},
|
|
1177
1181
|
async validateUniqueNameForPendingRelease(name, id) {
|
|
1178
|
-
const pendingReleases = await strapi2.
|
|
1179
|
-
|
|
1182
|
+
const pendingReleases = await strapi2.entityService.findMany(RELEASE_MODEL_UID, {
|
|
1183
|
+
filters: {
|
|
1180
1184
|
releasedAt: {
|
|
1181
1185
|
$null: true
|
|
1182
1186
|
},
|
|
@@ -1205,7 +1209,7 @@ const createSchedulingService = ({ strapi: strapi2 }) => {
|
|
|
1205
1209
|
}
|
|
1206
1210
|
const job = nodeSchedule.scheduleJob(scheduleDate, async () => {
|
|
1207
1211
|
try {
|
|
1208
|
-
await getService("release"
|
|
1212
|
+
await getService("release").publish(releaseId);
|
|
1209
1213
|
} catch (error) {
|
|
1210
1214
|
}
|
|
1211
1215
|
this.cancel(releaseId);
|
|
@@ -1275,7 +1279,7 @@ const RELEASE_SCHEMA = yup__namespace.object().shape({
|
|
|
1275
1279
|
const validateRelease = utils.validateYupSchema(RELEASE_SCHEMA);
|
|
1276
1280
|
const releaseController = {
|
|
1277
1281
|
async findMany(ctx) {
|
|
1278
|
-
const permissionsManager = strapi.
|
|
1282
|
+
const permissionsManager = strapi.admin.services.permission.createPermissionsManager({
|
|
1279
1283
|
ability: ctx.state.userAbility,
|
|
1280
1284
|
model: RELEASE_MODEL_UID
|
|
1281
1285
|
});
|
|
@@ -1303,7 +1307,7 @@ const releaseController = {
|
|
|
1303
1307
|
}
|
|
1304
1308
|
};
|
|
1305
1309
|
});
|
|
1306
|
-
const pendingReleasesCount = await strapi.
|
|
1310
|
+
const pendingReleasesCount = await strapi.query(RELEASE_MODEL_UID).count({
|
|
1307
1311
|
where: {
|
|
1308
1312
|
releasedAt: null
|
|
1309
1313
|
}
|
|
@@ -1325,7 +1329,7 @@ const releaseController = {
|
|
|
1325
1329
|
});
|
|
1326
1330
|
const sanitizedRelease = {
|
|
1327
1331
|
...release2,
|
|
1328
|
-
createdBy: release2.createdBy ? strapi.
|
|
1332
|
+
createdBy: release2.createdBy ? strapi.admin.services.user.sanitizeUser(release2.createdBy) : null
|
|
1329
1333
|
};
|
|
1330
1334
|
const data = {
|
|
1331
1335
|
...sanitizedRelease,
|
|
@@ -1348,7 +1352,6 @@ const releaseController = {
|
|
|
1348
1352
|
entriesIds
|
|
1349
1353
|
);
|
|
1350
1354
|
const mappedEntriesInReleases = releasesWithActions.reduce(
|
|
1351
|
-
// TODO: Fix for v5 removed mappedEntriedToRelease
|
|
1352
1355
|
(acc, release2) => {
|
|
1353
1356
|
release2.actions.forEach((action) => {
|
|
1354
1357
|
if (!acc[action.entry.id]) {
|
|
@@ -1359,7 +1362,6 @@ const releaseController = {
|
|
|
1359
1362
|
});
|
|
1360
1363
|
return acc;
|
|
1361
1364
|
},
|
|
1362
|
-
// TODO: Fix for v5 removed mappedEntriedToRelease
|
|
1363
1365
|
{}
|
|
1364
1366
|
);
|
|
1365
1367
|
ctx.body = {
|
|
@@ -1372,13 +1374,13 @@ const releaseController = {
|
|
|
1372
1374
|
await validateRelease(releaseArgs);
|
|
1373
1375
|
const releaseService = getService("release", { strapi });
|
|
1374
1376
|
const release2 = await releaseService.create(releaseArgs, { user });
|
|
1375
|
-
const permissionsManager = strapi.
|
|
1377
|
+
const permissionsManager = strapi.admin.services.permission.createPermissionsManager({
|
|
1376
1378
|
ability: ctx.state.userAbility,
|
|
1377
1379
|
model: RELEASE_MODEL_UID
|
|
1378
1380
|
});
|
|
1379
|
-
ctx.
|
|
1381
|
+
ctx.body = {
|
|
1380
1382
|
data: await permissionsManager.sanitizeOutput(release2)
|
|
1381
|
-
}
|
|
1383
|
+
};
|
|
1382
1384
|
},
|
|
1383
1385
|
async update(ctx) {
|
|
1384
1386
|
const user = ctx.state.user;
|
|
@@ -1387,7 +1389,7 @@ const releaseController = {
|
|
|
1387
1389
|
await validateRelease(releaseArgs);
|
|
1388
1390
|
const releaseService = getService("release", { strapi });
|
|
1389
1391
|
const release2 = await releaseService.update(id, releaseArgs, { user });
|
|
1390
|
-
const permissionsManager = strapi.
|
|
1392
|
+
const permissionsManager = strapi.admin.services.permission.createPermissionsManager({
|
|
1391
1393
|
ability: ctx.state.userAbility,
|
|
1392
1394
|
model: RELEASE_MODEL_UID
|
|
1393
1395
|
});
|
|
@@ -1451,9 +1453,9 @@ const releaseActionController = {
|
|
|
1451
1453
|
await validateReleaseAction(releaseActionArgs);
|
|
1452
1454
|
const releaseService = getService("release", { strapi });
|
|
1453
1455
|
const releaseAction2 = await releaseService.createAction(releaseId, releaseActionArgs);
|
|
1454
|
-
ctx.
|
|
1456
|
+
ctx.body = {
|
|
1455
1457
|
data: releaseAction2
|
|
1456
|
-
}
|
|
1458
|
+
};
|
|
1457
1459
|
},
|
|
1458
1460
|
async createMany(ctx) {
|
|
1459
1461
|
const releaseId = ctx.params.releaseId;
|
|
@@ -1479,17 +1481,17 @@ const releaseActionController = {
|
|
|
1479
1481
|
return releaseActions2;
|
|
1480
1482
|
});
|
|
1481
1483
|
const newReleaseActions = releaseActions.filter((action) => action !== null);
|
|
1482
|
-
ctx.
|
|
1484
|
+
ctx.body = {
|
|
1483
1485
|
data: newReleaseActions,
|
|
1484
1486
|
meta: {
|
|
1485
1487
|
entriesAlreadyInRelease: releaseActions.length - newReleaseActions.length,
|
|
1486
1488
|
totalEntries: releaseActions.length
|
|
1487
1489
|
}
|
|
1488
|
-
}
|
|
1490
|
+
};
|
|
1489
1491
|
},
|
|
1490
1492
|
async findMany(ctx) {
|
|
1491
1493
|
const releaseId = ctx.params.releaseId;
|
|
1492
|
-
const permissionsManager = strapi.
|
|
1494
|
+
const permissionsManager = strapi.admin.services.permission.createPermissionsManager({
|
|
1493
1495
|
ability: ctx.state.userAbility,
|
|
1494
1496
|
model: RELEASE_ACTION_MODEL_UID
|
|
1495
1497
|
});
|
|
@@ -1503,14 +1505,14 @@ const releaseActionController = {
|
|
|
1503
1505
|
if (acc[action.contentType]) {
|
|
1504
1506
|
return acc;
|
|
1505
1507
|
}
|
|
1506
|
-
const contentTypePermissionsManager = strapi.
|
|
1508
|
+
const contentTypePermissionsManager = strapi.admin.services.permission.createPermissionsManager({
|
|
1507
1509
|
ability: ctx.state.userAbility,
|
|
1508
1510
|
model: action.contentType
|
|
1509
1511
|
});
|
|
1510
1512
|
acc[action.contentType] = contentTypePermissionsManager.sanitizeOutput;
|
|
1511
1513
|
return acc;
|
|
1512
1514
|
}, {});
|
|
1513
|
-
const sanitizedResults = await utils.
|
|
1515
|
+
const sanitizedResults = await utils.mapAsync(results, async (action) => ({
|
|
1514
1516
|
...action,
|
|
1515
1517
|
entry: await contentTypeOutputSanitizers[action.contentType](action.entry)
|
|
1516
1518
|
}));
|
|
@@ -1758,8 +1760,9 @@ const routes = {
|
|
|
1758
1760
|
release,
|
|
1759
1761
|
"release-action": releaseAction
|
|
1760
1762
|
};
|
|
1763
|
+
const { features } = require("@strapi/strapi/dist/utils/ee");
|
|
1761
1764
|
const getPlugin = () => {
|
|
1762
|
-
if (
|
|
1765
|
+
if (features.isEnabled("cms-content-releases")) {
|
|
1763
1766
|
return {
|
|
1764
1767
|
register,
|
|
1765
1768
|
bootstrap,
|