@strapi/content-releases 0.0.0-experimental.ec089c69ff953942fb39de032c12daafaf7176e6 → 0.0.0-experimental.f75e3c6d67cc47c64ab37479efdbb7b43be50b78
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-HjWtUYmc.js → App-DUmziQ17.js} +401 -388
- package/dist/_chunks/App-DUmziQ17.js.map +1 -0
- package/dist/_chunks/{App-gu1aiP6i.mjs → App-D_6Y9N2F.mjs} +378 -364
- package/dist/_chunks/App-D_6Y9N2F.mjs.map +1 -0
- package/dist/_chunks/{PurchaseContentReleases-bpIYXOfu.js → PurchaseContentReleases-Be3acS2L.js} +7 -6
- package/dist/_chunks/PurchaseContentReleases-Be3acS2L.js.map +1 -0
- package/dist/_chunks/{PurchaseContentReleases-3tRbmbY3.mjs → PurchaseContentReleases-_MxP6-Dt.mjs} +8 -7
- package/dist/_chunks/PurchaseContentReleases-_MxP6-Dt.mjs.map +1 -0
- 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-mvj9PSKd.mjs → index-BomF0-yY.mjs} +180 -476
- package/dist/_chunks/index-BomF0-yY.mjs.map +1 -0
- package/dist/_chunks/{index-ZNwxYN8H.js → index-C5Hc767q.js} +177 -475
- package/dist/_chunks/index-C5Hc767q.js.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/release.d.ts +105 -0
- package/dist/admin/src/store/hooks.d.ts +7 -0
- package/dist/admin/src/utils/api.d.ts +6 -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 +29 -36
- package/dist/_chunks/App-HjWtUYmc.js.map +0 -1
- package/dist/_chunks/App-gu1aiP6i.mjs.map +0 -1
- package/dist/_chunks/PurchaseContentReleases-3tRbmbY3.mjs.map +0 -1
- package/dist/_chunks/PurchaseContentReleases-bpIYXOfu.js.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.mjs
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import { contentTypes as contentTypes$1,
|
|
1
|
+
import { contentTypes as contentTypes$1, async, setCreatorFields, errors, validateYupSchema, yup as yup$1 } from "@strapi/utils";
|
|
2
2
|
import isEqual from "lodash/isEqual";
|
|
3
3
|
import { difference, keys } from "lodash";
|
|
4
4
|
import _ from "lodash/fp";
|
|
5
|
-
import EE from "@strapi/strapi/dist/utils/ee";
|
|
6
5
|
import { scheduleJob } from "node-schedule";
|
|
7
6
|
import * as yup from "yup";
|
|
8
7
|
const RELEASE_MODEL_UID = "plugin::content-releases.release";
|
|
@@ -54,16 +53,19 @@ const ACTIONS = [
|
|
|
54
53
|
const ALLOWED_WEBHOOK_EVENTS = {
|
|
55
54
|
RELEASES_PUBLISH: "releases.publish"
|
|
56
55
|
};
|
|
57
|
-
const getService = (name, { strapi: strapi2 }
|
|
56
|
+
const getService = (name, { strapi: strapi2 }) => {
|
|
58
57
|
return strapi2.plugin("content-releases").service(name);
|
|
59
58
|
};
|
|
60
|
-
const getPopulatedEntry = async (contentTypeUid, entryId, { strapi: strapi2 }
|
|
59
|
+
const getPopulatedEntry = async (contentTypeUid, entryId, { strapi: strapi2 }) => {
|
|
61
60
|
const populateBuilderService = strapi2.plugin("content-manager").service("populate-builder");
|
|
62
61
|
const populate = await populateBuilderService(contentTypeUid).populateDeep(Infinity).build();
|
|
63
|
-
const entry = await strapi2.
|
|
62
|
+
const entry = await strapi2.db.query(contentTypeUid).findOne({
|
|
63
|
+
where: { id: entryId },
|
|
64
|
+
populate
|
|
65
|
+
});
|
|
64
66
|
return entry;
|
|
65
67
|
};
|
|
66
|
-
const getEntryValidStatus = async (contentTypeUid, entry, { strapi: strapi2 }
|
|
68
|
+
const getEntryValidStatus = async (contentTypeUid, entry, { strapi: strapi2 }) => {
|
|
67
69
|
try {
|
|
68
70
|
await strapi2.entityValidator.validateEntityCreation(
|
|
69
71
|
strapi2.getModel(contentTypeUid),
|
|
@@ -98,7 +100,7 @@ async function deleteActionsOnDisableDraftAndPublish({
|
|
|
98
100
|
async function deleteActionsOnDeleteContentType({ oldContentTypes, contentTypes: contentTypes2 }) {
|
|
99
101
|
const deletedContentTypes = difference(keys(oldContentTypes), keys(contentTypes2)) ?? [];
|
|
100
102
|
if (deletedContentTypes.length) {
|
|
101
|
-
await
|
|
103
|
+
await async.map(deletedContentTypes, async (deletedContentTypeUID) => {
|
|
102
104
|
return strapi.db?.queryBuilder(RELEASE_ACTION_MODEL_UID).delete().where({ contentType: deletedContentTypeUID }).execute();
|
|
103
105
|
});
|
|
104
106
|
}
|
|
@@ -117,7 +119,7 @@ async function migrateIsValidAndStatusReleases() {
|
|
|
117
119
|
}
|
|
118
120
|
}
|
|
119
121
|
});
|
|
120
|
-
|
|
122
|
+
async.map(releasesWithoutStatus, async (release2) => {
|
|
121
123
|
const actions = release2.actions;
|
|
122
124
|
const notValidatedActions = actions.filter((action) => action.isEntryValid === null);
|
|
123
125
|
for (const action of notValidatedActions) {
|
|
@@ -148,7 +150,7 @@ async function migrateIsValidAndStatusReleases() {
|
|
|
148
150
|
}
|
|
149
151
|
}
|
|
150
152
|
});
|
|
151
|
-
|
|
153
|
+
async.map(publishedReleases, async (release2) => {
|
|
152
154
|
return strapi.db.query(RELEASE_MODEL_UID).update({
|
|
153
155
|
where: {
|
|
154
156
|
id: release2.id
|
|
@@ -165,7 +167,7 @@ async function revalidateChangedContentTypes({ oldContentTypes, contentTypes: co
|
|
|
165
167
|
(uid) => oldContentTypes[uid]?.options?.draftAndPublish
|
|
166
168
|
);
|
|
167
169
|
const releasesAffected = /* @__PURE__ */ new Set();
|
|
168
|
-
|
|
170
|
+
async.map(contentTypesWithDraftAndPublish, async (contentTypeUID) => {
|
|
169
171
|
const oldContentType = oldContentTypes[contentTypeUID];
|
|
170
172
|
const contentType = contentTypes2[contentTypeUID];
|
|
171
173
|
if (!isEqual(oldContentType?.attributes, contentType?.attributes)) {
|
|
@@ -178,7 +180,7 @@ async function revalidateChangedContentTypes({ oldContentTypes, contentTypes: co
|
|
|
178
180
|
release: true
|
|
179
181
|
}
|
|
180
182
|
});
|
|
181
|
-
await
|
|
183
|
+
await async.map(actions, async (action) => {
|
|
182
184
|
if (action.entry && action.release) {
|
|
183
185
|
const populatedEntry = await getPopulatedEntry(contentTypeUID, action.entry.id, {
|
|
184
186
|
strapi
|
|
@@ -201,7 +203,7 @@ async function revalidateChangedContentTypes({ oldContentTypes, contentTypes: co
|
|
|
201
203
|
});
|
|
202
204
|
}
|
|
203
205
|
}).then(() => {
|
|
204
|
-
|
|
206
|
+
async.map(releasesAffected, async (releaseId) => {
|
|
205
207
|
return getService("release", { strapi }).updateReleaseStatus(releaseId);
|
|
206
208
|
});
|
|
207
209
|
});
|
|
@@ -253,11 +255,10 @@ async function enableContentTypeLocalized({ oldContentTypes, contentTypes: conte
|
|
|
253
255
|
}
|
|
254
256
|
}
|
|
255
257
|
}
|
|
256
|
-
const { features: features$2 } = require("@strapi/strapi/dist/utils/ee");
|
|
257
258
|
const register = async ({ strapi: strapi2 }) => {
|
|
258
|
-
if (features
|
|
259
|
-
await strapi2.admin
|
|
260
|
-
strapi2.hook("strapi::content-types.beforeSync").register(
|
|
259
|
+
if (strapi2.ee.features.isEnabled("cms-content-releases")) {
|
|
260
|
+
await strapi2.service("admin::permission").actionProvider.registerMany(ACTIONS);
|
|
261
|
+
strapi2.hook("strapi::content-types.beforeSync").register(disableContentTypeLocalized).register(deleteActionsOnDisableDraftAndPublish);
|
|
261
262
|
strapi2.hook("strapi::content-types.afterSync").register(deleteActionsOnDeleteContentType).register(enableContentTypeLocalized).register(revalidateChangedContentTypes).register(migrateIsValidAndStatusReleases);
|
|
262
263
|
}
|
|
263
264
|
if (strapi2.plugin("graphql")) {
|
|
@@ -266,9 +267,8 @@ const register = async ({ strapi: strapi2 }) => {
|
|
|
266
267
|
graphqlExtensionService.shadowCRUD(RELEASE_ACTION_MODEL_UID).disable();
|
|
267
268
|
}
|
|
268
269
|
};
|
|
269
|
-
const { features: features$1 } = require("@strapi/strapi/dist/utils/ee");
|
|
270
270
|
const bootstrap = async ({ strapi: strapi2 }) => {
|
|
271
|
-
if (features
|
|
271
|
+
if (strapi2.ee.features.isEnabled("cms-content-releases")) {
|
|
272
272
|
const contentTypesWithDraftAndPublish = Object.keys(strapi2.contentTypes).filter(
|
|
273
273
|
(uid) => strapi2.contentTypes[uid]?.options?.draftAndPublish
|
|
274
274
|
);
|
|
@@ -327,9 +327,7 @@ const bootstrap = async ({ strapi: strapi2 }) => {
|
|
|
327
327
|
actions: {
|
|
328
328
|
target_type: model.uid,
|
|
329
329
|
target_id: {
|
|
330
|
-
$in: entriesToDelete.map(
|
|
331
|
-
(entry) => entry.id
|
|
332
|
-
)
|
|
330
|
+
$in: entriesToDelete.map((entry) => entry.id)
|
|
333
331
|
}
|
|
334
332
|
}
|
|
335
333
|
}
|
|
@@ -356,13 +354,9 @@ const bootstrap = async ({ strapi: strapi2 }) => {
|
|
|
356
354
|
try {
|
|
357
355
|
const { model, result } = event;
|
|
358
356
|
if (model.kind === "collectionType" && model.options?.draftAndPublish) {
|
|
359
|
-
const isEntryValid = await getEntryValidStatus(
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
{
|
|
363
|
-
strapi: strapi2
|
|
364
|
-
}
|
|
365
|
-
);
|
|
357
|
+
const isEntryValid = await getEntryValidStatus(model.uid, result, {
|
|
358
|
+
strapi: strapi2
|
|
359
|
+
});
|
|
366
360
|
await strapi2.db.query(RELEASE_ACTION_MODEL_UID).update({
|
|
367
361
|
where: {
|
|
368
362
|
target_type: model.uid,
|
|
@@ -396,7 +390,7 @@ const bootstrap = async ({ strapi: strapi2 }) => {
|
|
|
396
390
|
throw err;
|
|
397
391
|
});
|
|
398
392
|
Object.entries(ALLOWED_WEBHOOK_EVENTS).forEach(([key, value]) => {
|
|
399
|
-
strapi2.webhookStore.addAllowedEvent(key, value);
|
|
393
|
+
strapi2.get("webhookStore").addAllowedEvent(key, value);
|
|
400
394
|
});
|
|
401
395
|
}
|
|
402
396
|
};
|
|
@@ -631,7 +625,7 @@ const createReleaseService = ({ strapi: strapi2 }) => {
|
|
|
631
625
|
validateUniqueNameForPendingRelease(releaseWithCreatorFields.name),
|
|
632
626
|
validateScheduledAtIsLaterThanNow(releaseWithCreatorFields.scheduledAt)
|
|
633
627
|
]);
|
|
634
|
-
const release2 = await strapi2.
|
|
628
|
+
const release2 = await strapi2.db.query(RELEASE_MODEL_UID).create({
|
|
635
629
|
data: {
|
|
636
630
|
...releaseWithCreatorFields,
|
|
637
631
|
status: "empty"
|
|
@@ -645,17 +639,19 @@ const createReleaseService = ({ strapi: strapi2 }) => {
|
|
|
645
639
|
return release2;
|
|
646
640
|
},
|
|
647
641
|
async findOne(id, query = {}) {
|
|
648
|
-
const
|
|
649
|
-
|
|
642
|
+
const dbQuery = strapi2.get("query-params").transform(RELEASE_MODEL_UID, query);
|
|
643
|
+
const release2 = await strapi2.db.query(RELEASE_MODEL_UID).findOne({
|
|
644
|
+
...dbQuery,
|
|
645
|
+
where: { id }
|
|
650
646
|
});
|
|
651
647
|
return release2;
|
|
652
648
|
},
|
|
653
649
|
findPage(query) {
|
|
654
|
-
|
|
655
|
-
|
|
650
|
+
const dbQuery = strapi2.get("query-params").transform(RELEASE_MODEL_UID, query ?? {});
|
|
651
|
+
return strapi2.db.query(RELEASE_MODEL_UID).findPage({
|
|
652
|
+
...dbQuery,
|
|
656
653
|
populate: {
|
|
657
654
|
actions: {
|
|
658
|
-
// @ts-expect-error Ignore missing properties
|
|
659
655
|
count: true
|
|
660
656
|
}
|
|
661
657
|
}
|
|
@@ -760,19 +756,15 @@ const createReleaseService = ({ strapi: strapi2 }) => {
|
|
|
760
756
|
validateUniqueNameForPendingRelease(releaseWithCreatorFields.name, id),
|
|
761
757
|
validateScheduledAtIsLaterThanNow(releaseWithCreatorFields.scheduledAt)
|
|
762
758
|
]);
|
|
763
|
-
const release2 = await strapi2.
|
|
759
|
+
const release2 = await strapi2.db.query(RELEASE_MODEL_UID).findOne({ where: { id } });
|
|
764
760
|
if (!release2) {
|
|
765
761
|
throw new errors.NotFoundError(`No release found for id ${id}`);
|
|
766
762
|
}
|
|
767
763
|
if (release2.releasedAt) {
|
|
768
764
|
throw new errors.ValidationError("Release already published");
|
|
769
765
|
}
|
|
770
|
-
const updatedRelease = await strapi2.
|
|
771
|
-
|
|
772
|
-
* The type returned from the entity service: Partial<Input<"plugin::content-releases.release">>
|
|
773
|
-
* is not compatible with the type we are passing here: UpdateRelease.Request['body']
|
|
774
|
-
*/
|
|
775
|
-
// @ts-expect-error see above
|
|
766
|
+
const updatedRelease = await strapi2.db.query(RELEASE_MODEL_UID).update({
|
|
767
|
+
where: { id },
|
|
776
768
|
data: releaseWithCreatorFields
|
|
777
769
|
});
|
|
778
770
|
const schedulingService = getService("scheduling", { strapi: strapi2 });
|
|
@@ -793,7 +785,7 @@ const createReleaseService = ({ strapi: strapi2 }) => {
|
|
|
793
785
|
validateEntryContentType(action.entry.contentType),
|
|
794
786
|
validateUniqueEntry(releaseId, action)
|
|
795
787
|
]);
|
|
796
|
-
const release2 = await strapi2.
|
|
788
|
+
const release2 = await strapi2.db.query(RELEASE_MODEL_UID).findOne({ where: { id: releaseId } });
|
|
797
789
|
if (!release2) {
|
|
798
790
|
throw new errors.NotFoundError(`No release found for id ${releaseId}`);
|
|
799
791
|
}
|
|
@@ -803,7 +795,7 @@ const createReleaseService = ({ strapi: strapi2 }) => {
|
|
|
803
795
|
const { entry, type } = action;
|
|
804
796
|
const populatedEntry = await getPopulatedEntry(entry.contentType, entry.id, { strapi: strapi2 });
|
|
805
797
|
const isEntryValid = await getEntryValidStatus(entry.contentType, populatedEntry, { strapi: strapi2 });
|
|
806
|
-
const releaseAction2 = await strapi2.
|
|
798
|
+
const releaseAction2 = await strapi2.db.query(RELEASE_ACTION_MODEL_UID).create({
|
|
807
799
|
data: {
|
|
808
800
|
type,
|
|
809
801
|
contentType: entry.contentType,
|
|
@@ -816,32 +808,35 @@ const createReleaseService = ({ strapi: strapi2 }) => {
|
|
|
816
808
|
},
|
|
817
809
|
release: releaseId
|
|
818
810
|
},
|
|
819
|
-
populate: { release: {
|
|
811
|
+
populate: { release: { select: ["id"] }, entry: { select: ["id"] } }
|
|
820
812
|
});
|
|
821
813
|
this.updateReleaseStatus(releaseId);
|
|
822
814
|
return releaseAction2;
|
|
823
815
|
},
|
|
824
816
|
async findActions(releaseId, query) {
|
|
825
|
-
const release2 = await strapi2.
|
|
826
|
-
|
|
817
|
+
const release2 = await strapi2.db.query(RELEASE_MODEL_UID).findOne({
|
|
818
|
+
where: { id: releaseId },
|
|
819
|
+
select: ["id"]
|
|
827
820
|
});
|
|
828
821
|
if (!release2) {
|
|
829
822
|
throw new errors.NotFoundError(`No release found for id ${releaseId}`);
|
|
830
823
|
}
|
|
831
|
-
|
|
832
|
-
|
|
824
|
+
const dbQuery = strapi2.get("query-params").transform(RELEASE_ACTION_MODEL_UID, query ?? {});
|
|
825
|
+
return strapi2.db.query(RELEASE_ACTION_MODEL_UID).findPage({
|
|
826
|
+
...dbQuery,
|
|
833
827
|
populate: {
|
|
834
828
|
entry: {
|
|
835
829
|
populate: "*"
|
|
836
830
|
}
|
|
837
831
|
},
|
|
838
|
-
|
|
832
|
+
where: {
|
|
839
833
|
release: releaseId
|
|
840
834
|
}
|
|
841
835
|
});
|
|
842
836
|
},
|
|
843
837
|
async countActions(query) {
|
|
844
|
-
|
|
838
|
+
const dbQuery = strapi2.get("query-params").transform(RELEASE_ACTION_MODEL_UID, query ?? {});
|
|
839
|
+
return strapi2.db.query(RELEASE_ACTION_MODEL_UID).count(dbQuery);
|
|
845
840
|
},
|
|
846
841
|
async groupActions(actions, groupBy) {
|
|
847
842
|
const contentTypeUids = actions.reduce((acc, action) => {
|
|
@@ -850,9 +845,7 @@ const createReleaseService = ({ strapi: strapi2 }) => {
|
|
|
850
845
|
}
|
|
851
846
|
return acc;
|
|
852
847
|
}, []);
|
|
853
|
-
const allReleaseContentTypesDictionary = await this.getContentTypesDataForActions(
|
|
854
|
-
contentTypeUids
|
|
855
|
-
);
|
|
848
|
+
const allReleaseContentTypesDictionary = await this.getContentTypesDataForActions(contentTypeUids);
|
|
856
849
|
const allLocalesDictionary = await this.getLocalesDataForActions();
|
|
857
850
|
const formattedData = actions.map((action) => {
|
|
858
851
|
const { mainField, displayName } = allReleaseContentTypesDictionary[action.contentType];
|
|
@@ -922,10 +915,11 @@ const createReleaseService = ({ strapi: strapi2 }) => {
|
|
|
922
915
|
return componentsMap;
|
|
923
916
|
},
|
|
924
917
|
async delete(releaseId) {
|
|
925
|
-
const release2 = await strapi2.
|
|
918
|
+
const release2 = await strapi2.db.query(RELEASE_MODEL_UID).findOne({
|
|
919
|
+
where: { id: releaseId },
|
|
926
920
|
populate: {
|
|
927
921
|
actions: {
|
|
928
|
-
|
|
922
|
+
select: ["id"]
|
|
929
923
|
}
|
|
930
924
|
}
|
|
931
925
|
});
|
|
@@ -943,7 +937,11 @@ const createReleaseService = ({ strapi: strapi2 }) => {
|
|
|
943
937
|
}
|
|
944
938
|
}
|
|
945
939
|
});
|
|
946
|
-
await strapi2.
|
|
940
|
+
await strapi2.db.query(RELEASE_MODEL_UID).delete({
|
|
941
|
+
where: {
|
|
942
|
+
id: releaseId
|
|
943
|
+
}
|
|
944
|
+
});
|
|
947
945
|
});
|
|
948
946
|
if (release2.scheduledAt) {
|
|
949
947
|
const schedulingService = getService("scheduling", { strapi: strapi2 });
|
|
@@ -969,9 +967,7 @@ const createReleaseService = ({ strapi: strapi2 }) => {
|
|
|
969
967
|
}
|
|
970
968
|
try {
|
|
971
969
|
strapi2.log.info(`[Content Releases] Starting to publish release ${lockedRelease.name}`);
|
|
972
|
-
const { collectionTypeActions, singleTypeActions } = await getFormattedActions(
|
|
973
|
-
releaseId
|
|
974
|
-
);
|
|
970
|
+
const { collectionTypeActions, singleTypeActions } = await getFormattedActions(releaseId);
|
|
975
971
|
await strapi2.db.transaction(async () => {
|
|
976
972
|
for (const { uid, action, id } of singleTypeActions) {
|
|
977
973
|
await publishSingleTypeAction(uid, action, id);
|
|
@@ -1014,7 +1010,7 @@ const createReleaseService = ({ strapi: strapi2 }) => {
|
|
|
1014
1010
|
};
|
|
1015
1011
|
}
|
|
1016
1012
|
});
|
|
1017
|
-
if (error) {
|
|
1013
|
+
if (error instanceof Error) {
|
|
1018
1014
|
throw error;
|
|
1019
1015
|
}
|
|
1020
1016
|
return release2;
|
|
@@ -1112,8 +1108,11 @@ class AlreadyOnReleaseError extends errors.ApplicationError {
|
|
|
1112
1108
|
}
|
|
1113
1109
|
const createReleaseValidationService = ({ strapi: strapi2 }) => ({
|
|
1114
1110
|
async validateUniqueEntry(releaseId, releaseActionArgs) {
|
|
1115
|
-
const release2 = await strapi2.
|
|
1116
|
-
|
|
1111
|
+
const release2 = await strapi2.db.query(RELEASE_MODEL_UID).findOne({
|
|
1112
|
+
where: {
|
|
1113
|
+
id: releaseId
|
|
1114
|
+
},
|
|
1115
|
+
populate: { actions: { populate: { entry: { select: ["id"] } } } }
|
|
1117
1116
|
});
|
|
1118
1117
|
if (!release2) {
|
|
1119
1118
|
throw new errors.NotFoundError(`No release found for id ${releaseId}`);
|
|
@@ -1139,10 +1138,8 @@ const createReleaseValidationService = ({ strapi: strapi2 }) => ({
|
|
|
1139
1138
|
}
|
|
1140
1139
|
},
|
|
1141
1140
|
async validatePendingReleasesLimit() {
|
|
1142
|
-
const
|
|
1143
|
-
|
|
1144
|
-
EE.features.get("cms-content-releases")?.options?.maximumReleases || 3
|
|
1145
|
-
);
|
|
1141
|
+
const featureCfg = strapi2.ee.features.get("cms-content-releases");
|
|
1142
|
+
const maximumPendingReleases = typeof featureCfg === "object" && featureCfg?.options?.maximumReleases || 3;
|
|
1146
1143
|
const [, pendingReleasesCount] = await strapi2.db.query(RELEASE_MODEL_UID).findWithCount({
|
|
1147
1144
|
filters: {
|
|
1148
1145
|
releasedAt: {
|
|
@@ -1155,8 +1152,8 @@ const createReleaseValidationService = ({ strapi: strapi2 }) => ({
|
|
|
1155
1152
|
}
|
|
1156
1153
|
},
|
|
1157
1154
|
async validateUniqueNameForPendingRelease(name, id) {
|
|
1158
|
-
const pendingReleases = await strapi2.
|
|
1159
|
-
|
|
1155
|
+
const pendingReleases = await strapi2.db.query(RELEASE_MODEL_UID).findMany({
|
|
1156
|
+
where: {
|
|
1160
1157
|
releasedAt: {
|
|
1161
1158
|
$null: true
|
|
1162
1159
|
},
|
|
@@ -1185,7 +1182,7 @@ const createSchedulingService = ({ strapi: strapi2 }) => {
|
|
|
1185
1182
|
}
|
|
1186
1183
|
const job = scheduleJob(scheduleDate, async () => {
|
|
1187
1184
|
try {
|
|
1188
|
-
await getService("release").publish(releaseId);
|
|
1185
|
+
await getService("release", { strapi: strapi2 }).publish(releaseId);
|
|
1189
1186
|
} catch (error) {
|
|
1190
1187
|
}
|
|
1191
1188
|
this.cancel(releaseId);
|
|
@@ -1255,7 +1252,7 @@ const RELEASE_SCHEMA = yup.object().shape({
|
|
|
1255
1252
|
const validateRelease = validateYupSchema(RELEASE_SCHEMA);
|
|
1256
1253
|
const releaseController = {
|
|
1257
1254
|
async findMany(ctx) {
|
|
1258
|
-
const permissionsManager = strapi.admin
|
|
1255
|
+
const permissionsManager = strapi.service("admin::permission").createPermissionsManager({
|
|
1259
1256
|
ability: ctx.state.userAbility,
|
|
1260
1257
|
model: RELEASE_MODEL_UID
|
|
1261
1258
|
});
|
|
@@ -1283,7 +1280,7 @@ const releaseController = {
|
|
|
1283
1280
|
}
|
|
1284
1281
|
};
|
|
1285
1282
|
});
|
|
1286
|
-
const pendingReleasesCount = await strapi.query(RELEASE_MODEL_UID).count({
|
|
1283
|
+
const pendingReleasesCount = await strapi.db.query(RELEASE_MODEL_UID).count({
|
|
1287
1284
|
where: {
|
|
1288
1285
|
releasedAt: null
|
|
1289
1286
|
}
|
|
@@ -1305,7 +1302,7 @@ const releaseController = {
|
|
|
1305
1302
|
});
|
|
1306
1303
|
const sanitizedRelease = {
|
|
1307
1304
|
...release2,
|
|
1308
|
-
createdBy: release2.createdBy ? strapi.admin
|
|
1305
|
+
createdBy: release2.createdBy ? strapi.service("admin::user").sanitizeUser(release2.createdBy) : null
|
|
1309
1306
|
};
|
|
1310
1307
|
const data = {
|
|
1311
1308
|
...sanitizedRelease,
|
|
@@ -1328,6 +1325,7 @@ const releaseController = {
|
|
|
1328
1325
|
entriesIds
|
|
1329
1326
|
);
|
|
1330
1327
|
const mappedEntriesInReleases = releasesWithActions.reduce(
|
|
1328
|
+
// TODO: Fix for v5 removed mappedEntriedToRelease
|
|
1331
1329
|
(acc, release2) => {
|
|
1332
1330
|
release2.actions.forEach((action) => {
|
|
1333
1331
|
if (!acc[action.entry.id]) {
|
|
@@ -1338,6 +1336,7 @@ const releaseController = {
|
|
|
1338
1336
|
});
|
|
1339
1337
|
return acc;
|
|
1340
1338
|
},
|
|
1339
|
+
// TODO: Fix for v5 removed mappedEntriedToRelease
|
|
1341
1340
|
{}
|
|
1342
1341
|
);
|
|
1343
1342
|
ctx.body = {
|
|
@@ -1350,13 +1349,13 @@ const releaseController = {
|
|
|
1350
1349
|
await validateRelease(releaseArgs);
|
|
1351
1350
|
const releaseService = getService("release", { strapi });
|
|
1352
1351
|
const release2 = await releaseService.create(releaseArgs, { user });
|
|
1353
|
-
const permissionsManager = strapi.admin
|
|
1352
|
+
const permissionsManager = strapi.service("admin::permission").createPermissionsManager({
|
|
1354
1353
|
ability: ctx.state.userAbility,
|
|
1355
1354
|
model: RELEASE_MODEL_UID
|
|
1356
1355
|
});
|
|
1357
|
-
ctx.
|
|
1356
|
+
ctx.created({
|
|
1358
1357
|
data: await permissionsManager.sanitizeOutput(release2)
|
|
1359
|
-
};
|
|
1358
|
+
});
|
|
1360
1359
|
},
|
|
1361
1360
|
async update(ctx) {
|
|
1362
1361
|
const user = ctx.state.user;
|
|
@@ -1365,7 +1364,7 @@ const releaseController = {
|
|
|
1365
1364
|
await validateRelease(releaseArgs);
|
|
1366
1365
|
const releaseService = getService("release", { strapi });
|
|
1367
1366
|
const release2 = await releaseService.update(id, releaseArgs, { user });
|
|
1368
|
-
const permissionsManager = strapi.admin
|
|
1367
|
+
const permissionsManager = strapi.service("admin::permission").createPermissionsManager({
|
|
1369
1368
|
ability: ctx.state.userAbility,
|
|
1370
1369
|
model: RELEASE_MODEL_UID
|
|
1371
1370
|
});
|
|
@@ -1429,9 +1428,9 @@ const releaseActionController = {
|
|
|
1429
1428
|
await validateReleaseAction(releaseActionArgs);
|
|
1430
1429
|
const releaseService = getService("release", { strapi });
|
|
1431
1430
|
const releaseAction2 = await releaseService.createAction(releaseId, releaseActionArgs);
|
|
1432
|
-
ctx.
|
|
1431
|
+
ctx.created({
|
|
1433
1432
|
data: releaseAction2
|
|
1434
|
-
};
|
|
1433
|
+
});
|
|
1435
1434
|
},
|
|
1436
1435
|
async createMany(ctx) {
|
|
1437
1436
|
const releaseId = ctx.params.releaseId;
|
|
@@ -1457,17 +1456,17 @@ const releaseActionController = {
|
|
|
1457
1456
|
return releaseActions2;
|
|
1458
1457
|
});
|
|
1459
1458
|
const newReleaseActions = releaseActions.filter((action) => action !== null);
|
|
1460
|
-
ctx.
|
|
1459
|
+
ctx.created({
|
|
1461
1460
|
data: newReleaseActions,
|
|
1462
1461
|
meta: {
|
|
1463
1462
|
entriesAlreadyInRelease: releaseActions.length - newReleaseActions.length,
|
|
1464
1463
|
totalEntries: releaseActions.length
|
|
1465
1464
|
}
|
|
1466
|
-
};
|
|
1465
|
+
});
|
|
1467
1466
|
},
|
|
1468
1467
|
async findMany(ctx) {
|
|
1469
1468
|
const releaseId = ctx.params.releaseId;
|
|
1470
|
-
const permissionsManager = strapi.admin
|
|
1469
|
+
const permissionsManager = strapi.service("admin::permission").createPermissionsManager({
|
|
1471
1470
|
ability: ctx.state.userAbility,
|
|
1472
1471
|
model: RELEASE_ACTION_MODEL_UID
|
|
1473
1472
|
});
|
|
@@ -1481,14 +1480,14 @@ const releaseActionController = {
|
|
|
1481
1480
|
if (acc[action.contentType]) {
|
|
1482
1481
|
return acc;
|
|
1483
1482
|
}
|
|
1484
|
-
const contentTypePermissionsManager = strapi.admin
|
|
1483
|
+
const contentTypePermissionsManager = strapi.service("admin::permission").createPermissionsManager({
|
|
1485
1484
|
ability: ctx.state.userAbility,
|
|
1486
1485
|
model: action.contentType
|
|
1487
1486
|
});
|
|
1488
1487
|
acc[action.contentType] = contentTypePermissionsManager.sanitizeOutput;
|
|
1489
1488
|
return acc;
|
|
1490
1489
|
}, {});
|
|
1491
|
-
const sanitizedResults = await
|
|
1490
|
+
const sanitizedResults = await async.map(results, async (action) => ({
|
|
1492
1491
|
...action,
|
|
1493
1492
|
entry: await contentTypeOutputSanitizers[action.contentType](action.entry)
|
|
1494
1493
|
}));
|
|
@@ -1736,9 +1735,8 @@ const routes = {
|
|
|
1736
1735
|
release,
|
|
1737
1736
|
"release-action": releaseAction
|
|
1738
1737
|
};
|
|
1739
|
-
const { features } = require("@strapi/strapi/dist/utils/ee");
|
|
1740
1738
|
const getPlugin = () => {
|
|
1741
|
-
if (features.isEnabled("cms-content-releases")) {
|
|
1739
|
+
if (strapi.ee.features.isEnabled("cms-content-releases")) {
|
|
1742
1740
|
return {
|
|
1743
1741
|
register,
|
|
1744
1742
|
bootstrap,
|