@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.
Files changed (110) hide show
  1. package/dist/_chunks/{App-HjWtUYmc.js → App-DUmziQ17.js} +401 -388
  2. package/dist/_chunks/App-DUmziQ17.js.map +1 -0
  3. package/dist/_chunks/{App-gu1aiP6i.mjs → App-D_6Y9N2F.mjs} +378 -364
  4. package/dist/_chunks/App-D_6Y9N2F.mjs.map +1 -0
  5. package/dist/_chunks/{PurchaseContentReleases-bpIYXOfu.js → PurchaseContentReleases-Be3acS2L.js} +7 -6
  6. package/dist/_chunks/PurchaseContentReleases-Be3acS2L.js.map +1 -0
  7. package/dist/_chunks/{PurchaseContentReleases-3tRbmbY3.mjs → PurchaseContentReleases-_MxP6-Dt.mjs} +8 -7
  8. package/dist/_chunks/PurchaseContentReleases-_MxP6-Dt.mjs.map +1 -0
  9. package/dist/_chunks/{en-ltT1TlKQ.mjs → en-B9Ur3VsE.mjs} +1 -1
  10. package/dist/_chunks/en-B9Ur3VsE.mjs.map +1 -0
  11. package/dist/_chunks/{en-HrREghh3.js → en-DtFJ5ViE.js} +1 -1
  12. package/dist/_chunks/en-DtFJ5ViE.js.map +1 -0
  13. package/dist/_chunks/{index-mvj9PSKd.mjs → index-BomF0-yY.mjs} +180 -476
  14. package/dist/_chunks/index-BomF0-yY.mjs.map +1 -0
  15. package/dist/_chunks/{index-ZNwxYN8H.js → index-C5Hc767q.js} +177 -475
  16. package/dist/_chunks/index-C5Hc767q.js.map +1 -0
  17. package/dist/admin/index.js +1 -15
  18. package/dist/admin/index.js.map +1 -1
  19. package/dist/admin/index.mjs +2 -16
  20. package/dist/admin/index.mjs.map +1 -1
  21. package/dist/admin/src/components/CMReleasesContainer.d.ts +22 -0
  22. package/dist/admin/src/components/RelativeTime.d.ts +28 -0
  23. package/dist/admin/src/components/ReleaseAction.d.ts +3 -0
  24. package/dist/admin/src/components/ReleaseActionMenu.d.ts +26 -0
  25. package/dist/admin/src/components/ReleaseActionOptions.d.ts +9 -0
  26. package/dist/admin/src/components/ReleaseListCell.d.ts +0 -0
  27. package/dist/admin/src/components/ReleaseModal.d.ts +16 -0
  28. package/dist/admin/src/constants.d.ts +58 -0
  29. package/dist/admin/src/index.d.ts +3 -0
  30. package/dist/admin/src/pages/App.d.ts +1 -0
  31. package/dist/admin/src/pages/PurchaseContentReleases.d.ts +2 -0
  32. package/dist/admin/src/pages/ReleaseDetailsPage.d.ts +2 -0
  33. package/dist/admin/src/pages/ReleasesPage.d.ts +8 -0
  34. package/dist/admin/src/pages/tests/mockReleaseDetailsPageData.d.ts +181 -0
  35. package/dist/admin/src/pages/tests/mockReleasesPageData.d.ts +39 -0
  36. package/dist/admin/src/pluginId.d.ts +1 -0
  37. package/dist/admin/src/services/release.d.ts +105 -0
  38. package/dist/admin/src/store/hooks.d.ts +7 -0
  39. package/dist/admin/src/utils/api.d.ts +6 -0
  40. package/dist/admin/src/utils/prefixPluginTranslations.d.ts +3 -0
  41. package/dist/admin/src/utils/time.d.ts +1 -0
  42. package/dist/server/index.js +83 -86
  43. package/dist/server/index.js.map +1 -1
  44. package/dist/server/index.mjs +84 -86
  45. package/dist/server/index.mjs.map +1 -1
  46. package/dist/server/src/bootstrap.d.ts +5 -0
  47. package/dist/server/src/bootstrap.d.ts.map +1 -0
  48. package/dist/server/src/constants.d.ts +12 -0
  49. package/dist/server/src/constants.d.ts.map +1 -0
  50. package/dist/server/src/content-types/index.d.ts +99 -0
  51. package/dist/server/src/content-types/index.d.ts.map +1 -0
  52. package/dist/server/src/content-types/release/index.d.ts +48 -0
  53. package/dist/server/src/content-types/release/index.d.ts.map +1 -0
  54. package/dist/server/src/content-types/release/schema.d.ts +47 -0
  55. package/dist/server/src/content-types/release/schema.d.ts.map +1 -0
  56. package/dist/server/src/content-types/release-action/index.d.ts +50 -0
  57. package/dist/server/src/content-types/release-action/index.d.ts.map +1 -0
  58. package/dist/server/src/content-types/release-action/schema.d.ts +49 -0
  59. package/dist/server/src/content-types/release-action/schema.d.ts.map +1 -0
  60. package/dist/server/src/controllers/index.d.ts +20 -0
  61. package/dist/server/src/controllers/index.d.ts.map +1 -0
  62. package/dist/server/src/controllers/release-action.d.ts +10 -0
  63. package/dist/server/src/controllers/release-action.d.ts.map +1 -0
  64. package/dist/server/src/controllers/release.d.ts +12 -0
  65. package/dist/server/src/controllers/release.d.ts.map +1 -0
  66. package/dist/server/src/controllers/validation/release-action.d.ts +8 -0
  67. package/dist/server/src/controllers/validation/release-action.d.ts.map +1 -0
  68. package/dist/server/src/controllers/validation/release.d.ts +2 -0
  69. package/dist/server/src/controllers/validation/release.d.ts.map +1 -0
  70. package/dist/server/src/destroy.d.ts +5 -0
  71. package/dist/server/src/destroy.d.ts.map +1 -0
  72. package/dist/server/src/index.d.ts +2096 -0
  73. package/dist/server/src/index.d.ts.map +1 -0
  74. package/dist/server/src/migrations/index.d.ts +13 -0
  75. package/dist/server/src/migrations/index.d.ts.map +1 -0
  76. package/dist/server/src/register.d.ts +5 -0
  77. package/dist/server/src/register.d.ts.map +1 -0
  78. package/dist/server/src/routes/index.d.ts +35 -0
  79. package/dist/server/src/routes/index.d.ts.map +1 -0
  80. package/dist/server/src/routes/release-action.d.ts +18 -0
  81. package/dist/server/src/routes/release-action.d.ts.map +1 -0
  82. package/dist/server/src/routes/release.d.ts +18 -0
  83. package/dist/server/src/routes/release.d.ts.map +1 -0
  84. package/dist/server/src/services/index.d.ts +1826 -0
  85. package/dist/server/src/services/index.d.ts.map +1 -0
  86. package/dist/server/src/services/release.d.ts +66 -0
  87. package/dist/server/src/services/release.d.ts.map +1 -0
  88. package/dist/server/src/services/scheduling.d.ts +18 -0
  89. package/dist/server/src/services/scheduling.d.ts.map +1 -0
  90. package/dist/server/src/services/validation.d.ts +18 -0
  91. package/dist/server/src/services/validation.d.ts.map +1 -0
  92. package/dist/server/src/utils/index.d.ts +14 -0
  93. package/dist/server/src/utils/index.d.ts.map +1 -0
  94. package/dist/shared/contracts/release-actions.d.ts +131 -0
  95. package/dist/shared/contracts/release-actions.d.ts.map +1 -0
  96. package/dist/shared/contracts/releases.d.ts +182 -0
  97. package/dist/shared/contracts/releases.d.ts.map +1 -0
  98. package/dist/shared/types.d.ts +24 -0
  99. package/dist/shared/types.d.ts.map +1 -0
  100. package/dist/shared/validation-schemas.d.ts +2 -0
  101. package/dist/shared/validation-schemas.d.ts.map +1 -0
  102. package/package.json +29 -36
  103. package/dist/_chunks/App-HjWtUYmc.js.map +0 -1
  104. package/dist/_chunks/App-gu1aiP6i.mjs.map +0 -1
  105. package/dist/_chunks/PurchaseContentReleases-3tRbmbY3.mjs.map +0 -1
  106. package/dist/_chunks/PurchaseContentReleases-bpIYXOfu.js.map +0 -1
  107. package/dist/_chunks/en-HrREghh3.js.map +0 -1
  108. package/dist/_chunks/en-ltT1TlKQ.mjs.map +0 -1
  109. package/dist/_chunks/index-ZNwxYN8H.js.map +0 -1
  110. package/dist/_chunks/index-mvj9PSKd.mjs.map +0 -1
@@ -1,8 +1,7 @@
1
- import { contentTypes as contentTypes$1, mapAsync, setCreatorFields, errors, validateYupSchema, yup as yup$1 } from "@strapi/utils";
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 } = { strapi: global.strapi }) => {
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 } = { strapi: global.strapi }) => {
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.entityService.findOne(contentTypeUid, entryId, { populate });
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 } = { strapi: global.strapi }) => {
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 mapAsync(deletedContentTypes, async (deletedContentTypeUID) => {
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
- mapAsync(releasesWithoutStatus, async (release2) => {
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
- mapAsync(publishedReleases, async (release2) => {
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
- mapAsync(contentTypesWithDraftAndPublish, async (contentTypeUID) => {
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 mapAsync(actions, async (action) => {
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
- mapAsync(releasesAffected, async (releaseId) => {
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$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);
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$1.isEnabled("cms-content-releases")) {
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
- model.uid,
361
- result,
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.entityService.create(RELEASE_MODEL_UID, {
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 release2 = await strapi2.entityService.findOne(RELEASE_MODEL_UID, id, {
649
- ...query
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
- return strapi2.entityService.findPage(RELEASE_MODEL_UID, {
655
- ...query,
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.entityService.findOne(RELEASE_MODEL_UID, id);
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.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
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.entityService.findOne(RELEASE_MODEL_UID, releaseId);
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.entityService.create(RELEASE_ACTION_MODEL_UID, {
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: { fields: ["id"] }, entry: { fields: ["id"] } }
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.entityService.findOne(RELEASE_MODEL_UID, releaseId, {
826
- fields: ["id"]
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
- return strapi2.entityService.findPage(RELEASE_ACTION_MODEL_UID, {
832
- ...query,
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
- filters: {
832
+ where: {
839
833
  release: releaseId
840
834
  }
841
835
  });
842
836
  },
843
837
  async countActions(query) {
844
- return strapi2.entityService.count(RELEASE_ACTION_MODEL_UID, query);
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.entityService.findOne(RELEASE_MODEL_UID, releaseId, {
918
+ const release2 = await strapi2.db.query(RELEASE_MODEL_UID).findOne({
919
+ where: { id: releaseId },
926
920
  populate: {
927
921
  actions: {
928
- fields: ["id"]
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.entityService.delete(RELEASE_MODEL_UID, releaseId);
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.entityService.findOne(RELEASE_MODEL_UID, releaseId, {
1116
- populate: { actions: { populate: { entry: { fields: ["id"] } } } }
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 maximumPendingReleases = (
1143
- // @ts-expect-error - options is not typed into features
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.entityService.findMany(RELEASE_MODEL_UID, {
1159
- filters: {
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.services.permission.createPermissionsManager({
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.services.user.sanitizeUser(release2.createdBy) : null
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.services.permission.createPermissionsManager({
1352
+ const permissionsManager = strapi.service("admin::permission").createPermissionsManager({
1354
1353
  ability: ctx.state.userAbility,
1355
1354
  model: RELEASE_MODEL_UID
1356
1355
  });
1357
- ctx.body = {
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.services.permission.createPermissionsManager({
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.body = {
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.body = {
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.services.permission.createPermissionsManager({
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.services.permission.createPermissionsManager({
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 mapAsync(results, async (action) => ({
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,