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