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