@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
@@ -76,10 +76,10 @@ const ACTIONS = [
76
76
  const ALLOWED_WEBHOOK_EVENTS = {
77
77
  RELEASES_PUBLISH: "releases.publish"
78
78
  };
79
- const getService = (name, { strapi: strapi2 } = { strapi: global.strapi }) => {
79
+ const getService = (name, { strapi: strapi2 }) => {
80
80
  return strapi2.plugin("content-releases").service(name);
81
81
  };
82
- const getPopulatedEntry = async (contentTypeUid, entryId, { strapi: strapi2 } = { strapi: global.strapi }) => {
82
+ const getPopulatedEntry = async (contentTypeUid, entryId, { strapi: strapi2 }) => {
83
83
  const populateBuilderService = strapi2.plugin("content-manager").service("populate-builder");
84
84
  const populate = await populateBuilderService(contentTypeUid).populateDeep(Infinity).build();
85
85
  const entry = await strapi2.db.query(contentTypeUid).findOne({
@@ -88,7 +88,7 @@ const getPopulatedEntry = async (contentTypeUid, entryId, { strapi: strapi2 } =
88
88
  });
89
89
  return entry;
90
90
  };
91
- const getEntryValidStatus = async (contentTypeUid, entry, { strapi: strapi2 } = { strapi: global.strapi }) => {
91
+ const getEntryValidStatus = async (contentTypeUid, entry, { strapi: strapi2 }) => {
92
92
  try {
93
93
  await strapi2.entityValidator.validateEntityCreation(
94
94
  strapi2.getModel(contentTypeUid),
@@ -236,13 +236,16 @@ async function disableContentTypeLocalized({ oldContentTypes, contentTypes: cont
236
236
  if (!oldContentTypes) {
237
237
  return;
238
238
  }
239
+ const i18nPlugin = strapi.plugin("i18n");
240
+ if (!i18nPlugin) {
241
+ return;
242
+ }
239
243
  for (const uid in contentTypes2) {
240
244
  if (!oldContentTypes[uid]) {
241
245
  continue;
242
246
  }
243
247
  const oldContentType = oldContentTypes[uid];
244
248
  const contentType = contentTypes2[uid];
245
- const i18nPlugin = strapi.plugin("i18n");
246
249
  const { isLocalizedContentType } = i18nPlugin.service("content-types");
247
250
  if (isLocalizedContentType(oldContentType) && !isLocalizedContentType(contentType)) {
248
251
  await strapi.db.queryBuilder(RELEASE_ACTION_MODEL_UID).update({
@@ -255,13 +258,16 @@ async function enableContentTypeLocalized({ oldContentTypes, contentTypes: conte
255
258
  if (!oldContentTypes) {
256
259
  return;
257
260
  }
261
+ const i18nPlugin = strapi.plugin("i18n");
262
+ if (!i18nPlugin) {
263
+ return;
264
+ }
258
265
  for (const uid in contentTypes2) {
259
266
  if (!oldContentTypes[uid]) {
260
267
  continue;
261
268
  }
262
269
  const oldContentType = oldContentTypes[uid];
263
270
  const contentType = contentTypes2[uid];
264
- const i18nPlugin = strapi.plugin("i18n");
265
271
  const { isLocalizedContentType } = i18nPlugin.service("content-types");
266
272
  const { getDefaultLocale } = i18nPlugin.service("locales");
267
273
  if (!isLocalizedContentType(oldContentType) && isLocalizedContentType(contentType)) {
@@ -274,7 +280,7 @@ async function enableContentTypeLocalized({ oldContentTypes, contentTypes: conte
274
280
  }
275
281
  const register = async ({ strapi: strapi2 }) => {
276
282
  if (strapi2.ee.features.isEnabled("cms-content-releases")) {
277
- await strapi2.admin.services.permission.actionProvider.registerMany(ACTIONS);
283
+ await strapi2.service("admin::permission").actionProvider.registerMany(ACTIONS);
278
284
  strapi2.hook("strapi::content-types.beforeSync").register(disableContentTypeLocalized).register(deleteActionsOnDisableDraftAndPublish);
279
285
  strapi2.hook("strapi::content-types.afterSync").register(deleteActionsOnDeleteContentType).register(enableContentTypeLocalized).register(revalidateChangedContentTypes).register(migrateIsValidAndStatusReleases);
280
286
  }
@@ -407,7 +413,7 @@ const bootstrap = async ({ strapi: strapi2 }) => {
407
413
  throw err;
408
414
  });
409
415
  Object.entries(ALLOWED_WEBHOOK_EVENTS).forEach(([key, value]) => {
410
- strapi2.webhookStore.addAllowedEvent(key, value);
416
+ strapi2.get("webhookStore").addAllowedEvent(key, value);
411
417
  });
412
418
  }
413
419
  };
@@ -674,12 +680,18 @@ const createReleaseService = ({ strapi: strapi2 }) => {
674
680
  }
675
681
  });
676
682
  },
677
- async findManyWithContentTypeEntryAttached(contentTypeUid, entryId) {
683
+ async findManyWithContentTypeEntryAttached(contentTypeUid, entriesIds) {
684
+ let entries = entriesIds;
685
+ if (!Array.isArray(entriesIds)) {
686
+ entries = [entriesIds];
687
+ }
678
688
  const releases = await strapi2.db.query(RELEASE_MODEL_UID).findMany({
679
689
  where: {
680
690
  actions: {
681
691
  target_type: contentTypeUid,
682
- target_id: entryId
692
+ target_id: {
693
+ $in: entries
694
+ }
683
695
  },
684
696
  releasedAt: {
685
697
  $null: true
@@ -690,18 +702,25 @@ const createReleaseService = ({ strapi: strapi2 }) => {
690
702
  actions: {
691
703
  where: {
692
704
  target_type: contentTypeUid,
693
- target_id: entryId
705
+ target_id: {
706
+ $in: entries
707
+ }
708
+ },
709
+ populate: {
710
+ entry: {
711
+ select: ["id"]
712
+ }
694
713
  }
695
714
  }
696
715
  }
697
716
  });
698
717
  return releases.map((release2) => {
699
718
  if (release2.actions?.length) {
700
- const [actionForEntry] = release2.actions;
719
+ const actionsForEntry = release2.actions;
701
720
  delete release2.actions;
702
721
  return {
703
722
  ...release2,
704
- action: actionForEntry
723
+ actions: actionsForEntry
705
724
  };
706
725
  }
707
726
  return release2;
@@ -849,9 +868,7 @@ const createReleaseService = ({ strapi: strapi2 }) => {
849
868
  }
850
869
  return acc;
851
870
  }, []);
852
- const allReleaseContentTypesDictionary = await this.getContentTypesDataForActions(
853
- contentTypeUids
854
- );
871
+ const allReleaseContentTypesDictionary = await this.getContentTypesDataForActions(contentTypeUids);
855
872
  const allLocalesDictionary = await this.getLocalesDataForActions();
856
873
  const formattedData = actions.map((action) => {
857
874
  const { mainField, displayName } = allReleaseContentTypesDictionary[action.contentType];
@@ -973,9 +990,7 @@ const createReleaseService = ({ strapi: strapi2 }) => {
973
990
  }
974
991
  try {
975
992
  strapi2.log.info(`[Content Releases] Starting to publish release ${lockedRelease.name}`);
976
- const { collectionTypeActions, singleTypeActions } = await getFormattedActions(
977
- releaseId
978
- );
993
+ const { collectionTypeActions, singleTypeActions } = await getFormattedActions(releaseId);
979
994
  await strapi2.db.transaction(async () => {
980
995
  for (const { uid, action, id } of singleTypeActions) {
981
996
  await publishSingleTypeAction(uid, action, id);
@@ -1146,7 +1161,8 @@ const createReleaseValidationService = ({ strapi: strapi2 }) => ({
1146
1161
  }
1147
1162
  },
1148
1163
  async validatePendingReleasesLimit() {
1149
- const maximumPendingReleases = strapi2.ee.features.get("cms-content-releases")?.options?.maximumReleases || 3;
1164
+ const featureCfg = strapi2.ee.features.get("cms-content-releases");
1165
+ const maximumPendingReleases = typeof featureCfg === "object" && featureCfg?.options?.maximumReleases || 3;
1150
1166
  const [, pendingReleasesCount] = await strapi2.db.query(RELEASE_MODEL_UID).findWithCount({
1151
1167
  filters: {
1152
1168
  releasedAt: {
@@ -1189,7 +1205,7 @@ const createSchedulingService = ({ strapi: strapi2 }) => {
1189
1205
  }
1190
1206
  const job = nodeSchedule.scheduleJob(scheduleDate, async () => {
1191
1207
  try {
1192
- await getService("release").publish(releaseId);
1208
+ await getService("release", { strapi: strapi2 }).publish(releaseId);
1193
1209
  } catch (error) {
1194
1210
  }
1195
1211
  this.cancel(releaseId);
@@ -1259,7 +1275,7 @@ const RELEASE_SCHEMA = yup__namespace.object().shape({
1259
1275
  const validateRelease = utils.validateYupSchema(RELEASE_SCHEMA);
1260
1276
  const releaseController = {
1261
1277
  async findMany(ctx) {
1262
- const permissionsManager = strapi.admin.services.permission.createPermissionsManager({
1278
+ const permissionsManager = strapi.service("admin::permission").createPermissionsManager({
1263
1279
  ability: ctx.state.userAbility,
1264
1280
  model: RELEASE_MODEL_UID
1265
1281
  });
@@ -1309,7 +1325,7 @@ const releaseController = {
1309
1325
  });
1310
1326
  const sanitizedRelease = {
1311
1327
  ...release2,
1312
- createdBy: release2.createdBy ? strapi.admin.services.user.sanitizeUser(release2.createdBy) : null
1328
+ createdBy: release2.createdBy ? strapi.service("admin::user").sanitizeUser(release2.createdBy) : null
1313
1329
  };
1314
1330
  const data = {
1315
1331
  ...sanitizedRelease,
@@ -1321,19 +1337,48 @@ const releaseController = {
1321
1337
  };
1322
1338
  ctx.body = { data };
1323
1339
  },
1340
+ async mapEntriesToReleases(ctx) {
1341
+ const { contentTypeUid, entriesIds } = ctx.query;
1342
+ if (!contentTypeUid || !entriesIds) {
1343
+ throw new utils.errors.ValidationError("Missing required query parameters");
1344
+ }
1345
+ const releaseService = getService("release", { strapi });
1346
+ const releasesWithActions = await releaseService.findManyWithContentTypeEntryAttached(
1347
+ contentTypeUid,
1348
+ entriesIds
1349
+ );
1350
+ const mappedEntriesInReleases = releasesWithActions.reduce(
1351
+ // TODO: Fix for v5 removed mappedEntriedToRelease
1352
+ (acc, release2) => {
1353
+ release2.actions.forEach((action) => {
1354
+ if (!acc[action.entry.id]) {
1355
+ acc[action.entry.id] = [{ id: release2.id, name: release2.name }];
1356
+ } else {
1357
+ acc[action.entry.id].push({ id: release2.id, name: release2.name });
1358
+ }
1359
+ });
1360
+ return acc;
1361
+ },
1362
+ // TODO: Fix for v5 removed mappedEntriedToRelease
1363
+ {}
1364
+ );
1365
+ ctx.body = {
1366
+ data: mappedEntriesInReleases
1367
+ };
1368
+ },
1324
1369
  async create(ctx) {
1325
1370
  const user = ctx.state.user;
1326
1371
  const releaseArgs = ctx.request.body;
1327
1372
  await validateRelease(releaseArgs);
1328
1373
  const releaseService = getService("release", { strapi });
1329
1374
  const release2 = await releaseService.create(releaseArgs, { user });
1330
- const permissionsManager = strapi.admin.services.permission.createPermissionsManager({
1375
+ const permissionsManager = strapi.service("admin::permission").createPermissionsManager({
1331
1376
  ability: ctx.state.userAbility,
1332
1377
  model: RELEASE_MODEL_UID
1333
1378
  });
1334
- ctx.body = {
1379
+ ctx.created({
1335
1380
  data: await permissionsManager.sanitizeOutput(release2)
1336
- };
1381
+ });
1337
1382
  },
1338
1383
  async update(ctx) {
1339
1384
  const user = ctx.state.user;
@@ -1342,7 +1387,7 @@ const releaseController = {
1342
1387
  await validateRelease(releaseArgs);
1343
1388
  const releaseService = getService("release", { strapi });
1344
1389
  const release2 = await releaseService.update(id, releaseArgs, { user });
1345
- const permissionsManager = strapi.admin.services.permission.createPermissionsManager({
1390
+ const permissionsManager = strapi.service("admin::permission").createPermissionsManager({
1346
1391
  ability: ctx.state.userAbility,
1347
1392
  model: RELEASE_MODEL_UID
1348
1393
  });
@@ -1406,9 +1451,9 @@ const releaseActionController = {
1406
1451
  await validateReleaseAction(releaseActionArgs);
1407
1452
  const releaseService = getService("release", { strapi });
1408
1453
  const releaseAction2 = await releaseService.createAction(releaseId, releaseActionArgs);
1409
- ctx.body = {
1454
+ ctx.created({
1410
1455
  data: releaseAction2
1411
- };
1456
+ });
1412
1457
  },
1413
1458
  async createMany(ctx) {
1414
1459
  const releaseId = ctx.params.releaseId;
@@ -1434,17 +1479,17 @@ const releaseActionController = {
1434
1479
  return releaseActions2;
1435
1480
  });
1436
1481
  const newReleaseActions = releaseActions.filter((action) => action !== null);
1437
- ctx.body = {
1482
+ ctx.created({
1438
1483
  data: newReleaseActions,
1439
1484
  meta: {
1440
1485
  entriesAlreadyInRelease: releaseActions.length - newReleaseActions.length,
1441
1486
  totalEntries: releaseActions.length
1442
1487
  }
1443
- };
1488
+ });
1444
1489
  },
1445
1490
  async findMany(ctx) {
1446
1491
  const releaseId = ctx.params.releaseId;
1447
- const permissionsManager = strapi.admin.services.permission.createPermissionsManager({
1492
+ const permissionsManager = strapi.service("admin::permission").createPermissionsManager({
1448
1493
  ability: ctx.state.userAbility,
1449
1494
  model: RELEASE_ACTION_MODEL_UID
1450
1495
  });
@@ -1458,7 +1503,7 @@ const releaseActionController = {
1458
1503
  if (acc[action.contentType]) {
1459
1504
  return acc;
1460
1505
  }
1461
- const contentTypePermissionsManager = strapi.admin.services.permission.createPermissionsManager({
1506
+ const contentTypePermissionsManager = strapi.service("admin::permission").createPermissionsManager({
1462
1507
  ability: ctx.state.userAbility,
1463
1508
  model: action.contentType
1464
1509
  });
@@ -1510,6 +1555,22 @@ const controllers = { release: releaseController, "release-action": releaseActio
1510
1555
  const release = {
1511
1556
  type: "admin",
1512
1557
  routes: [
1558
+ {
1559
+ method: "GET",
1560
+ path: "/mapEntriesToReleases",
1561
+ handler: "release.mapEntriesToReleases",
1562
+ config: {
1563
+ policies: [
1564
+ "admin::isAuthenticatedAdmin",
1565
+ {
1566
+ name: "admin::hasPermissions",
1567
+ config: {
1568
+ actions: ["plugin::content-releases.read"]
1569
+ }
1570
+ }
1571
+ ]
1572
+ }
1573
+ },
1513
1574
  {
1514
1575
  method: "POST",
1515
1576
  path: "/",