@strapi/content-releases 5.0.0-beta.1 → 5.0.0-beta.10

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 (65) hide show
  1. package/dist/_chunks/{App-X01LBg5V.mjs → App-B2R2exNT.mjs} +245 -251
  2. package/dist/_chunks/App-B2R2exNT.mjs.map +1 -0
  3. package/dist/_chunks/{App-1LckaIGY.js → App-CEwOQkKT.js} +253 -260
  4. package/dist/_chunks/App-CEwOQkKT.js.map +1 -0
  5. package/dist/_chunks/{PurchaseContentReleases-YhAPgpG9.js → PurchaseContentReleases-Be3acS2L.js} +8 -7
  6. package/dist/_chunks/PurchaseContentReleases-Be3acS2L.js.map +1 -0
  7. package/dist/_chunks/{PurchaseContentReleases-Clm0iACO.mjs → PurchaseContentReleases-_MxP6-Dt.mjs} +9 -8
  8. package/dist/_chunks/PurchaseContentReleases-_MxP6-Dt.mjs.map +1 -0
  9. package/dist/_chunks/{en-RdapH-9X.mjs → en-B9Ur3VsE.mjs} +11 -2
  10. package/dist/_chunks/en-B9Ur3VsE.mjs.map +1 -0
  11. package/dist/_chunks/{en-faJDuv3q.js → en-DtFJ5ViE.js} +11 -2
  12. package/dist/_chunks/en-DtFJ5ViE.js.map +1 -0
  13. package/dist/_chunks/{index-cYWov2wa.js → index-BrWv-zV4.js} +167 -192
  14. package/dist/_chunks/index-BrWv-zV4.js.map +1 -0
  15. package/dist/_chunks/{index-OD9AlD-6.mjs → index-DbmynICx.mjs} +168 -191
  16. package/dist/_chunks/index-DbmynICx.mjs.map +1 -0
  17. package/dist/admin/index.js +1 -1
  18. package/dist/admin/index.mjs +2 -2
  19. package/dist/admin/src/components/CMReleasesContainer.d.ts +21 -0
  20. package/dist/admin/src/components/ReleaseAction.d.ts +3 -0
  21. package/dist/admin/src/components/ReleaseActionMenu.d.ts +1 -1
  22. package/dist/admin/src/components/ReleaseListCell.d.ts +0 -0
  23. package/dist/admin/src/components/ReleaseModal.d.ts +3 -2
  24. package/dist/admin/src/services/release.d.ts +44 -308
  25. package/dist/admin/src/utils/api.d.ts +6 -0
  26. package/dist/server/index.js +93 -32
  27. package/dist/server/index.js.map +1 -1
  28. package/dist/server/index.mjs +93 -32
  29. package/dist/server/index.mjs.map +1 -1
  30. package/dist/server/src/bootstrap.d.ts +1 -1
  31. package/dist/server/src/bootstrap.d.ts.map +1 -1
  32. package/dist/server/src/controllers/index.d.ts +1 -0
  33. package/dist/server/src/controllers/index.d.ts.map +1 -1
  34. package/dist/server/src/controllers/release-action.d.ts.map +1 -1
  35. package/dist/server/src/controllers/release.d.ts +1 -0
  36. package/dist/server/src/controllers/release.d.ts.map +1 -1
  37. package/dist/server/src/destroy.d.ts +1 -1
  38. package/dist/server/src/destroy.d.ts.map +1 -1
  39. package/dist/server/src/index.d.ts +9 -8
  40. package/dist/server/src/index.d.ts.map +1 -1
  41. package/dist/server/src/migrations/index.d.ts.map +1 -1
  42. package/dist/server/src/register.d.ts +1 -1
  43. package/dist/server/src/register.d.ts.map +1 -1
  44. package/dist/server/src/routes/release.d.ts.map +1 -1
  45. package/dist/server/src/services/index.d.ts +4 -4
  46. package/dist/server/src/services/release.d.ts +3 -3
  47. package/dist/server/src/services/release.d.ts.map +1 -1
  48. package/dist/server/src/services/scheduling.d.ts +1 -1
  49. package/dist/server/src/services/scheduling.d.ts.map +1 -1
  50. package/dist/server/src/services/validation.d.ts +1 -1
  51. package/dist/server/src/services/validation.d.ts.map +1 -1
  52. package/dist/server/src/utils/index.d.ts +9 -9
  53. package/dist/server/src/utils/index.d.ts.map +1 -1
  54. package/dist/shared/contracts/releases.d.ts +17 -1
  55. package/dist/shared/contracts/releases.d.ts.map +1 -1
  56. package/package.json +18 -18
  57. package/dist/_chunks/App-1LckaIGY.js.map +0 -1
  58. package/dist/_chunks/App-X01LBg5V.mjs.map +0 -1
  59. package/dist/_chunks/PurchaseContentReleases-Clm0iACO.mjs.map +0 -1
  60. package/dist/_chunks/PurchaseContentReleases-YhAPgpG9.js.map +0 -1
  61. package/dist/_chunks/en-RdapH-9X.mjs.map +0 -1
  62. package/dist/_chunks/en-faJDuv3q.js.map +0 -1
  63. package/dist/_chunks/index-OD9AlD-6.mjs.map +0 -1
  64. package/dist/_chunks/index-cYWov2wa.js.map +0 -1
  65. package/dist/admin/src/services/axios.d.ts +0 -29
@@ -53,10 +53,10 @@ const ACTIONS = [
53
53
  const ALLOWED_WEBHOOK_EVENTS = {
54
54
  RELEASES_PUBLISH: "releases.publish"
55
55
  };
56
- const getService = (name, { strapi: strapi2 } = { strapi: global.strapi }) => {
56
+ const getService = (name, { strapi: strapi2 }) => {
57
57
  return strapi2.plugin("content-releases").service(name);
58
58
  };
59
- const getPopulatedEntry = async (contentTypeUid, entryId, { strapi: strapi2 } = { strapi: global.strapi }) => {
59
+ const getPopulatedEntry = async (contentTypeUid, entryId, { strapi: strapi2 }) => {
60
60
  const populateBuilderService = strapi2.plugin("content-manager").service("populate-builder");
61
61
  const populate = await populateBuilderService(contentTypeUid).populateDeep(Infinity).build();
62
62
  const entry = await strapi2.db.query(contentTypeUid).findOne({
@@ -65,7 +65,7 @@ const getPopulatedEntry = async (contentTypeUid, entryId, { strapi: strapi2 } =
65
65
  });
66
66
  return entry;
67
67
  };
68
- const getEntryValidStatus = async (contentTypeUid, entry, { strapi: strapi2 } = { strapi: global.strapi }) => {
68
+ const getEntryValidStatus = async (contentTypeUid, entry, { strapi: strapi2 }) => {
69
69
  try {
70
70
  await strapi2.entityValidator.validateEntityCreation(
71
71
  strapi2.getModel(contentTypeUid),
@@ -213,13 +213,16 @@ async function disableContentTypeLocalized({ oldContentTypes, contentTypes: cont
213
213
  if (!oldContentTypes) {
214
214
  return;
215
215
  }
216
+ const i18nPlugin = strapi.plugin("i18n");
217
+ if (!i18nPlugin) {
218
+ return;
219
+ }
216
220
  for (const uid in contentTypes2) {
217
221
  if (!oldContentTypes[uid]) {
218
222
  continue;
219
223
  }
220
224
  const oldContentType = oldContentTypes[uid];
221
225
  const contentType = contentTypes2[uid];
222
- const i18nPlugin = strapi.plugin("i18n");
223
226
  const { isLocalizedContentType } = i18nPlugin.service("content-types");
224
227
  if (isLocalizedContentType(oldContentType) && !isLocalizedContentType(contentType)) {
225
228
  await strapi.db.queryBuilder(RELEASE_ACTION_MODEL_UID).update({
@@ -232,13 +235,16 @@ async function enableContentTypeLocalized({ oldContentTypes, contentTypes: conte
232
235
  if (!oldContentTypes) {
233
236
  return;
234
237
  }
238
+ const i18nPlugin = strapi.plugin("i18n");
239
+ if (!i18nPlugin) {
240
+ return;
241
+ }
235
242
  for (const uid in contentTypes2) {
236
243
  if (!oldContentTypes[uid]) {
237
244
  continue;
238
245
  }
239
246
  const oldContentType = oldContentTypes[uid];
240
247
  const contentType = contentTypes2[uid];
241
- const i18nPlugin = strapi.plugin("i18n");
242
248
  const { isLocalizedContentType } = i18nPlugin.service("content-types");
243
249
  const { getDefaultLocale } = i18nPlugin.service("locales");
244
250
  if (!isLocalizedContentType(oldContentType) && isLocalizedContentType(contentType)) {
@@ -251,7 +257,7 @@ async function enableContentTypeLocalized({ oldContentTypes, contentTypes: conte
251
257
  }
252
258
  const register = async ({ strapi: strapi2 }) => {
253
259
  if (strapi2.ee.features.isEnabled("cms-content-releases")) {
254
- await strapi2.admin.services.permission.actionProvider.registerMany(ACTIONS);
260
+ await strapi2.service("admin::permission").actionProvider.registerMany(ACTIONS);
255
261
  strapi2.hook("strapi::content-types.beforeSync").register(disableContentTypeLocalized).register(deleteActionsOnDisableDraftAndPublish);
256
262
  strapi2.hook("strapi::content-types.afterSync").register(deleteActionsOnDeleteContentType).register(enableContentTypeLocalized).register(revalidateChangedContentTypes).register(migrateIsValidAndStatusReleases);
257
263
  }
@@ -384,7 +390,7 @@ const bootstrap = async ({ strapi: strapi2 }) => {
384
390
  throw err;
385
391
  });
386
392
  Object.entries(ALLOWED_WEBHOOK_EVENTS).forEach(([key, value]) => {
387
- strapi2.webhookStore.addAllowedEvent(key, value);
393
+ strapi2.get("webhookStore").addAllowedEvent(key, value);
388
394
  });
389
395
  }
390
396
  };
@@ -651,12 +657,18 @@ const createReleaseService = ({ strapi: strapi2 }) => {
651
657
  }
652
658
  });
653
659
  },
654
- async findManyWithContentTypeEntryAttached(contentTypeUid, entryId) {
660
+ async findManyWithContentTypeEntryAttached(contentTypeUid, entriesIds) {
661
+ let entries = entriesIds;
662
+ if (!Array.isArray(entriesIds)) {
663
+ entries = [entriesIds];
664
+ }
655
665
  const releases = await strapi2.db.query(RELEASE_MODEL_UID).findMany({
656
666
  where: {
657
667
  actions: {
658
668
  target_type: contentTypeUid,
659
- target_id: entryId
669
+ target_id: {
670
+ $in: entries
671
+ }
660
672
  },
661
673
  releasedAt: {
662
674
  $null: true
@@ -667,18 +679,25 @@ const createReleaseService = ({ strapi: strapi2 }) => {
667
679
  actions: {
668
680
  where: {
669
681
  target_type: contentTypeUid,
670
- target_id: entryId
682
+ target_id: {
683
+ $in: entries
684
+ }
685
+ },
686
+ populate: {
687
+ entry: {
688
+ select: ["id"]
689
+ }
671
690
  }
672
691
  }
673
692
  }
674
693
  });
675
694
  return releases.map((release2) => {
676
695
  if (release2.actions?.length) {
677
- const [actionForEntry] = release2.actions;
696
+ const actionsForEntry = release2.actions;
678
697
  delete release2.actions;
679
698
  return {
680
699
  ...release2,
681
- action: actionForEntry
700
+ actions: actionsForEntry
682
701
  };
683
702
  }
684
703
  return release2;
@@ -826,9 +845,7 @@ const createReleaseService = ({ strapi: strapi2 }) => {
826
845
  }
827
846
  return acc;
828
847
  }, []);
829
- const allReleaseContentTypesDictionary = await this.getContentTypesDataForActions(
830
- contentTypeUids
831
- );
848
+ const allReleaseContentTypesDictionary = await this.getContentTypesDataForActions(contentTypeUids);
832
849
  const allLocalesDictionary = await this.getLocalesDataForActions();
833
850
  const formattedData = actions.map((action) => {
834
851
  const { mainField, displayName } = allReleaseContentTypesDictionary[action.contentType];
@@ -950,9 +967,7 @@ const createReleaseService = ({ strapi: strapi2 }) => {
950
967
  }
951
968
  try {
952
969
  strapi2.log.info(`[Content Releases] Starting to publish release ${lockedRelease.name}`);
953
- const { collectionTypeActions, singleTypeActions } = await getFormattedActions(
954
- releaseId
955
- );
970
+ const { collectionTypeActions, singleTypeActions } = await getFormattedActions(releaseId);
956
971
  await strapi2.db.transaction(async () => {
957
972
  for (const { uid, action, id } of singleTypeActions) {
958
973
  await publishSingleTypeAction(uid, action, id);
@@ -1123,7 +1138,8 @@ const createReleaseValidationService = ({ strapi: strapi2 }) => ({
1123
1138
  }
1124
1139
  },
1125
1140
  async validatePendingReleasesLimit() {
1126
- const maximumPendingReleases = strapi2.ee.features.get("cms-content-releases")?.options?.maximumReleases || 3;
1141
+ const featureCfg = strapi2.ee.features.get("cms-content-releases");
1142
+ const maximumPendingReleases = typeof featureCfg === "object" && featureCfg?.options?.maximumReleases || 3;
1127
1143
  const [, pendingReleasesCount] = await strapi2.db.query(RELEASE_MODEL_UID).findWithCount({
1128
1144
  filters: {
1129
1145
  releasedAt: {
@@ -1166,7 +1182,7 @@ const createSchedulingService = ({ strapi: strapi2 }) => {
1166
1182
  }
1167
1183
  const job = scheduleJob(scheduleDate, async () => {
1168
1184
  try {
1169
- await getService("release").publish(releaseId);
1185
+ await getService("release", { strapi: strapi2 }).publish(releaseId);
1170
1186
  } catch (error) {
1171
1187
  }
1172
1188
  this.cancel(releaseId);
@@ -1236,7 +1252,7 @@ const RELEASE_SCHEMA = yup.object().shape({
1236
1252
  const validateRelease = validateYupSchema(RELEASE_SCHEMA);
1237
1253
  const releaseController = {
1238
1254
  async findMany(ctx) {
1239
- const permissionsManager = strapi.admin.services.permission.createPermissionsManager({
1255
+ const permissionsManager = strapi.service("admin::permission").createPermissionsManager({
1240
1256
  ability: ctx.state.userAbility,
1241
1257
  model: RELEASE_MODEL_UID
1242
1258
  });
@@ -1286,7 +1302,7 @@ const releaseController = {
1286
1302
  });
1287
1303
  const sanitizedRelease = {
1288
1304
  ...release2,
1289
- createdBy: release2.createdBy ? strapi.admin.services.user.sanitizeUser(release2.createdBy) : null
1305
+ createdBy: release2.createdBy ? strapi.service("admin::user").sanitizeUser(release2.createdBy) : null
1290
1306
  };
1291
1307
  const data = {
1292
1308
  ...sanitizedRelease,
@@ -1298,19 +1314,48 @@ const releaseController = {
1298
1314
  };
1299
1315
  ctx.body = { data };
1300
1316
  },
1317
+ async mapEntriesToReleases(ctx) {
1318
+ const { contentTypeUid, entriesIds } = ctx.query;
1319
+ if (!contentTypeUid || !entriesIds) {
1320
+ throw new errors.ValidationError("Missing required query parameters");
1321
+ }
1322
+ const releaseService = getService("release", { strapi });
1323
+ const releasesWithActions = await releaseService.findManyWithContentTypeEntryAttached(
1324
+ contentTypeUid,
1325
+ entriesIds
1326
+ );
1327
+ const mappedEntriesInReleases = releasesWithActions.reduce(
1328
+ // TODO: Fix for v5 removed mappedEntriedToRelease
1329
+ (acc, release2) => {
1330
+ release2.actions.forEach((action) => {
1331
+ if (!acc[action.entry.id]) {
1332
+ acc[action.entry.id] = [{ id: release2.id, name: release2.name }];
1333
+ } else {
1334
+ acc[action.entry.id].push({ id: release2.id, name: release2.name });
1335
+ }
1336
+ });
1337
+ return acc;
1338
+ },
1339
+ // TODO: Fix for v5 removed mappedEntriedToRelease
1340
+ {}
1341
+ );
1342
+ ctx.body = {
1343
+ data: mappedEntriesInReleases
1344
+ };
1345
+ },
1301
1346
  async create(ctx) {
1302
1347
  const user = ctx.state.user;
1303
1348
  const releaseArgs = ctx.request.body;
1304
1349
  await validateRelease(releaseArgs);
1305
1350
  const releaseService = getService("release", { strapi });
1306
1351
  const release2 = await releaseService.create(releaseArgs, { user });
1307
- const permissionsManager = strapi.admin.services.permission.createPermissionsManager({
1352
+ const permissionsManager = strapi.service("admin::permission").createPermissionsManager({
1308
1353
  ability: ctx.state.userAbility,
1309
1354
  model: RELEASE_MODEL_UID
1310
1355
  });
1311
- ctx.body = {
1356
+ ctx.created({
1312
1357
  data: await permissionsManager.sanitizeOutput(release2)
1313
- };
1358
+ });
1314
1359
  },
1315
1360
  async update(ctx) {
1316
1361
  const user = ctx.state.user;
@@ -1319,7 +1364,7 @@ const releaseController = {
1319
1364
  await validateRelease(releaseArgs);
1320
1365
  const releaseService = getService("release", { strapi });
1321
1366
  const release2 = await releaseService.update(id, releaseArgs, { user });
1322
- const permissionsManager = strapi.admin.services.permission.createPermissionsManager({
1367
+ const permissionsManager = strapi.service("admin::permission").createPermissionsManager({
1323
1368
  ability: ctx.state.userAbility,
1324
1369
  model: RELEASE_MODEL_UID
1325
1370
  });
@@ -1383,9 +1428,9 @@ const releaseActionController = {
1383
1428
  await validateReleaseAction(releaseActionArgs);
1384
1429
  const releaseService = getService("release", { strapi });
1385
1430
  const releaseAction2 = await releaseService.createAction(releaseId, releaseActionArgs);
1386
- ctx.body = {
1431
+ ctx.created({
1387
1432
  data: releaseAction2
1388
- };
1433
+ });
1389
1434
  },
1390
1435
  async createMany(ctx) {
1391
1436
  const releaseId = ctx.params.releaseId;
@@ -1411,17 +1456,17 @@ const releaseActionController = {
1411
1456
  return releaseActions2;
1412
1457
  });
1413
1458
  const newReleaseActions = releaseActions.filter((action) => action !== null);
1414
- ctx.body = {
1459
+ ctx.created({
1415
1460
  data: newReleaseActions,
1416
1461
  meta: {
1417
1462
  entriesAlreadyInRelease: releaseActions.length - newReleaseActions.length,
1418
1463
  totalEntries: releaseActions.length
1419
1464
  }
1420
- };
1465
+ });
1421
1466
  },
1422
1467
  async findMany(ctx) {
1423
1468
  const releaseId = ctx.params.releaseId;
1424
- const permissionsManager = strapi.admin.services.permission.createPermissionsManager({
1469
+ const permissionsManager = strapi.service("admin::permission").createPermissionsManager({
1425
1470
  ability: ctx.state.userAbility,
1426
1471
  model: RELEASE_ACTION_MODEL_UID
1427
1472
  });
@@ -1435,7 +1480,7 @@ const releaseActionController = {
1435
1480
  if (acc[action.contentType]) {
1436
1481
  return acc;
1437
1482
  }
1438
- const contentTypePermissionsManager = strapi.admin.services.permission.createPermissionsManager({
1483
+ const contentTypePermissionsManager = strapi.service("admin::permission").createPermissionsManager({
1439
1484
  ability: ctx.state.userAbility,
1440
1485
  model: action.contentType
1441
1486
  });
@@ -1487,6 +1532,22 @@ const controllers = { release: releaseController, "release-action": releaseActio
1487
1532
  const release = {
1488
1533
  type: "admin",
1489
1534
  routes: [
1535
+ {
1536
+ method: "GET",
1537
+ path: "/mapEntriesToReleases",
1538
+ handler: "release.mapEntriesToReleases",
1539
+ config: {
1540
+ policies: [
1541
+ "admin::isAuthenticatedAdmin",
1542
+ {
1543
+ name: "admin::hasPermissions",
1544
+ config: {
1545
+ actions: ["plugin::content-releases.read"]
1546
+ }
1547
+ }
1548
+ ]
1549
+ }
1550
+ },
1490
1551
  {
1491
1552
  method: "POST",
1492
1553
  path: "/",