@strapi/content-releases 5.0.0-rc.3 → 5.0.0-rc.30

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 (58) hide show
  1. package/dist/_chunks/{App-UQxgTJY5.mjs → App-BA2xDdy0.mjs} +43 -20
  2. package/dist/_chunks/App-BA2xDdy0.mjs.map +1 -0
  3. package/dist/_chunks/{App-D-lWdVb2.js → App-D4Wira1X.js} +42 -19
  4. package/dist/_chunks/App-D4Wira1X.js.map +1 -0
  5. package/dist/_chunks/{ReleasesSettingsPage-CuUXvABk.mjs → ReleasesSettingsPage-BAlbMWpw.mjs} +4 -4
  6. package/dist/_chunks/ReleasesSettingsPage-BAlbMWpw.mjs.map +1 -0
  7. package/dist/_chunks/{ReleasesSettingsPage-xfAoY8N3.js → ReleasesSettingsPage-xhFyRXCM.js} +4 -4
  8. package/dist/_chunks/ReleasesSettingsPage-xhFyRXCM.js.map +1 -0
  9. package/dist/_chunks/{en-BCDLTJn3.js → en-CmYoEnA7.js} +2 -1
  10. package/dist/_chunks/en-CmYoEnA7.js.map +1 -0
  11. package/dist/_chunks/{en-CGXIF4vQ.mjs → en-D0yVZFqf.mjs} +2 -1
  12. package/dist/_chunks/en-D0yVZFqf.mjs.map +1 -0
  13. package/dist/_chunks/{index-b3Ej95H7.mjs → index-CCFFG3Zs.mjs} +289 -23
  14. package/dist/_chunks/index-CCFFG3Zs.mjs.map +1 -0
  15. package/dist/_chunks/{index-jnv9zdcE.js → index-DxkQGp4N.js} +286 -20
  16. package/dist/_chunks/index-DxkQGp4N.js.map +1 -0
  17. package/dist/_chunks/{schemas-z5zp-_Gd.js → schemas-BE1LxE9J.js} +2 -2
  18. package/dist/_chunks/schemas-BE1LxE9J.js.map +1 -0
  19. package/dist/_chunks/{schemas-63pFihNF.mjs → schemas-DdA2ic2U.mjs} +2 -2
  20. package/dist/_chunks/schemas-DdA2ic2U.mjs.map +1 -0
  21. package/dist/admin/index.js +1 -1
  22. package/dist/admin/index.mjs +1 -1
  23. package/dist/admin/src/components/ReleaseListCell.d.ts +28 -0
  24. package/dist/admin/src/services/release.d.ts +34 -32
  25. package/dist/server/index.js +108 -79
  26. package/dist/server/index.js.map +1 -1
  27. package/dist/server/index.mjs +108 -79
  28. package/dist/server/index.mjs.map +1 -1
  29. package/dist/server/src/controllers/index.d.ts +2 -0
  30. package/dist/server/src/controllers/index.d.ts.map +1 -1
  31. package/dist/server/src/controllers/release-action.d.ts +1 -0
  32. package/dist/server/src/controllers/release-action.d.ts.map +1 -1
  33. package/dist/server/src/controllers/release.d.ts +1 -0
  34. package/dist/server/src/controllers/release.d.ts.map +1 -1
  35. package/dist/server/src/index.d.ts +4 -0
  36. package/dist/server/src/index.d.ts.map +1 -1
  37. package/dist/server/src/routes/release-action.d.ts.map +1 -1
  38. package/dist/server/src/routes/release.d.ts.map +1 -1
  39. package/dist/server/src/services/index.d.ts +2 -0
  40. package/dist/server/src/services/index.d.ts.map +1 -1
  41. package/dist/server/src/services/release-action.d.ts +3 -1
  42. package/dist/server/src/services/release-action.d.ts.map +1 -1
  43. package/dist/shared/contracts/release-actions.d.ts +3 -5
  44. package/dist/shared/contracts/release-actions.d.ts.map +1 -1
  45. package/dist/shared/contracts/releases.d.ts +3 -2
  46. package/dist/shared/contracts/releases.d.ts.map +1 -1
  47. package/package.json +12 -11
  48. package/dist/_chunks/App-D-lWdVb2.js.map +0 -1
  49. package/dist/_chunks/App-UQxgTJY5.mjs.map +0 -1
  50. package/dist/_chunks/ReleasesSettingsPage-CuUXvABk.mjs.map +0 -1
  51. package/dist/_chunks/ReleasesSettingsPage-xfAoY8N3.js.map +0 -1
  52. package/dist/_chunks/en-BCDLTJn3.js.map +0 -1
  53. package/dist/_chunks/en-CGXIF4vQ.mjs.map +0 -1
  54. package/dist/_chunks/index-b3Ej95H7.mjs.map +0 -1
  55. package/dist/_chunks/index-jnv9zdcE.js.map +0 -1
  56. package/dist/_chunks/schemas-63pFihNF.mjs.map +0 -1
  57. package/dist/_chunks/schemas-z5zp-_Gd.js.map +0 -1
  58. package/strapi-server.js +0 -3
@@ -929,7 +929,7 @@ const createReleaseActionService = ({ strapi: strapi2 }) => {
929
929
  return contentTypesData;
930
930
  };
931
931
  return {
932
- async create(releaseId, action) {
932
+ async create(releaseId, action, { disableUpdateReleaseStatus = false } = {}) {
933
933
  const { validateEntryData, validateUniqueEntry } = getService("release-validation", {
934
934
  strapi: strapi2
935
935
  });
@@ -937,6 +937,14 @@ const createReleaseActionService = ({ strapi: strapi2 }) => {
937
937
  validateEntryData(action.contentType, action.entryDocumentId),
938
938
  validateUniqueEntry(releaseId, action)
939
939
  ]);
940
+ const model = strapi2.contentType(action.contentType);
941
+ if (model.kind === "singleType") {
942
+ const document = await strapi2.db.query(model.uid).findOne({ select: ["documentId"] });
943
+ if (!document) {
944
+ throw new utils.errors.NotFoundError(`No entry found for contentType ${action.contentType}`);
945
+ }
946
+ action.entryDocumentId = document.documentId;
947
+ }
940
948
  const release2 = await strapi2.db.query(RELEASE_MODEL_UID).findOne({ where: { id: releaseId } });
941
949
  if (!release2) {
942
950
  throw new utils.errors.NotFoundError(`No release found for id ${releaseId}`);
@@ -962,7 +970,9 @@ const createReleaseActionService = ({ strapi: strapi2 }) => {
962
970
  },
963
971
  populate: { release: { select: ["id"] } }
964
972
  });
965
- getService("release", { strapi: strapi2 }).updateReleaseStatus(release2.id);
973
+ if (!disableUpdateReleaseStatus) {
974
+ getService("release", { strapi: strapi2 }).updateReleaseStatus(release2.id);
975
+ }
966
976
  return releaseAction2;
967
977
  },
968
978
  async findPage(releaseId, query) {
@@ -1065,7 +1075,7 @@ const createReleaseActionService = ({ strapi: strapi2 }) => {
1065
1075
  `Action with id ${actionId} not found in release with id ${releaseId} or it is already published`
1066
1076
  );
1067
1077
  }
1068
- const actionStatus = update.type === "publish" ? getDraftEntryValidStatus(
1078
+ const actionStatus = update.type === "publish" ? await getDraftEntryValidStatus(
1069
1079
  {
1070
1080
  contentType: action.contentType,
1071
1081
  documentId: action.entryDocumentId,
@@ -1135,11 +1145,11 @@ const createReleaseValidationService = ({ strapi: strapi2 }) => ({
1135
1145
  throw new utils.errors.NotFoundError(`No release found for id ${releaseId}`);
1136
1146
  }
1137
1147
  const isEntryInRelease = release2.actions.some(
1138
- (action) => Number(action.entryDocumentId) === Number(releaseActionArgs.entryDocumentId) && action.contentType === releaseActionArgs.contentType && action.locale === releaseActionArgs.locale
1148
+ (action) => action.entryDocumentId === releaseActionArgs.entryDocumentId && action.contentType === releaseActionArgs.contentType && (releaseActionArgs.locale ? action.locale === releaseActionArgs.locale : true)
1139
1149
  );
1140
1150
  if (isEntryInRelease) {
1141
1151
  throw new AlreadyOnReleaseError(
1142
- `Entry with documentId ${releaseActionArgs.entryDocumentId} ${releaseActionArgs.locale ? `(${releaseActionArgs.locale})` : ""} and contentType ${releaseActionArgs.contentType} already exists in release with id ${releaseId}`
1152
+ `Entry with documentId ${releaseActionArgs.entryDocumentId}${releaseActionArgs.locale ? `( ${releaseActionArgs.locale})` : ""} and contentType ${releaseActionArgs.contentType} already exists in release with id ${releaseId}`
1143
1153
  );
1144
1154
  }
1145
1155
  },
@@ -1306,7 +1316,15 @@ const releaseController = {
1306
1316
  const releaseService = getService("release", { strapi });
1307
1317
  const query = await permissionsManager.sanitizeQuery(ctx.query);
1308
1318
  await validatefindByDocumentAttachedParams(query);
1309
- const { contentType, entryDocumentId, hasEntryAttached, locale } = query;
1319
+ const model = strapi.getModel(query.contentType);
1320
+ if (model.kind && model.kind === "singleType") {
1321
+ const document = await strapi.db.query(model.uid).findOne({ select: ["documentId"] });
1322
+ if (!document) {
1323
+ throw new utils.errors.NotFoundError(`No entry found for contentType ${query.contentType}`);
1324
+ }
1325
+ query.entryDocumentId = document.documentId;
1326
+ }
1327
+ const { contentType, hasEntryAttached, entryDocumentId, locale } = query;
1310
1328
  const isEntryAttached = typeof hasEntryAttached === "string" ? Boolean(JSON.parse(hasEntryAttached)) : false;
1311
1329
  if (isEntryAttached) {
1312
1330
  const releases = await releaseService.findMany({
@@ -1320,7 +1338,12 @@ const releaseController = {
1320
1338
  },
1321
1339
  populate: {
1322
1340
  actions: {
1323
- fields: ["type"]
1341
+ fields: ["type"],
1342
+ filters: {
1343
+ contentType,
1344
+ entryDocumentId: entryDocumentId ?? null,
1345
+ locale: locale ?? null
1346
+ }
1324
1347
  }
1325
1348
  }
1326
1349
  });
@@ -1408,43 +1431,50 @@ const releaseController = {
1408
1431
  };
1409
1432
  ctx.body = { data };
1410
1433
  },
1411
- /* @TODO: Migrate to new api
1412
- async mapEntriesToReleases(ctx: Koa.Context) {
1413
- const { contentTypeUid, entriesIds } = ctx.query;
1414
-
1415
- if (!contentTypeUid || !entriesIds) {
1416
- throw new errors.ValidationError('Missing required query parameters');
1434
+ async mapEntriesToReleases(ctx) {
1435
+ const { contentTypeUid, documentIds, locale } = ctx.query;
1436
+ if (!contentTypeUid || !documentIds) {
1437
+ throw new utils.errors.ValidationError("Missing required query parameters");
1438
+ }
1439
+ const releaseService = getService("release", { strapi });
1440
+ const releasesWithActions = await releaseService.findMany({
1441
+ where: {
1442
+ releasedAt: null,
1443
+ actions: {
1444
+ contentType: contentTypeUid,
1445
+ entryDocumentId: {
1446
+ $in: documentIds
1447
+ },
1448
+ locale
1449
+ }
1450
+ },
1451
+ populate: {
1452
+ actions: true
1417
1453
  }
1418
-
1419
- const releaseService = getService('release', { strapi });
1420
-
1421
- const releasesWithActions = await releaseService.findMany(
1422
- contentTypeUid,
1423
- entriesIds
1424
- );
1425
-
1426
- const mappedEntriesInReleases = releasesWithActions.reduce(
1427
- // TODO: Fix for v5 removed mappedEntriedToRelease
1428
- (acc: MapEntriesToReleases.Response['data'], release: Release) => {
1429
- release.actions.forEach((action) => {
1430
- if (!acc[action.entry.id]) {
1431
- acc[action.entry.id] = [{ id: release.id, name: release.name }];
1432
- } else {
1433
- acc[action.entry.id].push({ id: release.id, name: release.name });
1434
- }
1435
- });
1436
-
1437
- return acc;
1438
- },
1439
- // TODO: Fix for v5 removed mappedEntriedToRelease
1440
- {} as MapEntriesToReleases.Response['data']
1441
- );
1442
-
1443
- ctx.body = {
1444
- data: mappedEntriesInReleases,
1445
- };
1446
- },
1447
- */
1454
+ });
1455
+ const mappedEntriesInReleases = releasesWithActions.reduce(
1456
+ (acc, release2) => {
1457
+ release2.actions.forEach((action) => {
1458
+ if (action.contentType !== contentTypeUid) {
1459
+ return;
1460
+ }
1461
+ if (locale && action.locale !== locale) {
1462
+ return;
1463
+ }
1464
+ if (!acc[action.entryDocumentId]) {
1465
+ acc[action.entryDocumentId] = [{ id: release2.id, name: release2.name }];
1466
+ } else {
1467
+ acc[action.entryDocumentId].push({ id: release2.id, name: release2.name });
1468
+ }
1469
+ });
1470
+ return acc;
1471
+ },
1472
+ {}
1473
+ );
1474
+ ctx.body = {
1475
+ data: mappedEntriesInReleases
1476
+ };
1477
+ },
1448
1478
  async create(ctx) {
1449
1479
  const user = ctx.state.user;
1450
1480
  const releaseArgs = ctx.request.body;
@@ -1537,22 +1567,23 @@ const releaseActionController = {
1537
1567
  data: releaseAction2
1538
1568
  });
1539
1569
  },
1540
- /*
1541
- async createMany(ctx: Koa.Context) {
1542
- const releaseId: CreateManyReleaseActions.Request['params']['releaseId'] = ctx.params.releaseId;
1543
- const releaseActionsArgs = ctx.request.body as CreateManyReleaseActions.Request['body'];
1570
+ async createMany(ctx) {
1571
+ const releaseId = ctx.params.releaseId;
1572
+ const releaseActionsArgs = ctx.request.body;
1544
1573
  await Promise.all(
1545
1574
  releaseActionsArgs.map((releaseActionArgs) => validateReleaseAction(releaseActionArgs))
1546
1575
  );
1547
- const releaseActionService = getService('release-action', { strapi });
1576
+ const releaseActionService = getService("release-action", { strapi });
1577
+ const releaseService = getService("release", { strapi });
1548
1578
  const releaseActions = await strapi.db.transaction(async () => {
1549
- const releaseActions = await Promise.all(
1579
+ const releaseActions2 = await Promise.all(
1550
1580
  releaseActionsArgs.map(async (releaseActionArgs) => {
1551
1581
  try {
1552
- const action = await releaseActionService.create(releaseId, releaseActionArgs);
1582
+ const action = await releaseActionService.create(releaseId, releaseActionArgs, {
1583
+ disableUpdateReleaseStatus: true
1584
+ });
1553
1585
  return action;
1554
1586
  } catch (error) {
1555
- // If the entry is already in the release, we don't want to throw an error, so we catch and ignore it
1556
1587
  if (error instanceof AlreadyOnReleaseError) {
1557
1588
  return null;
1558
1589
  }
@@ -1560,18 +1591,20 @@ const releaseActionController = {
1560
1591
  }
1561
1592
  })
1562
1593
  );
1563
- return releaseActions;
1594
+ return releaseActions2;
1564
1595
  });
1565
1596
  const newReleaseActions = releaseActions.filter((action) => action !== null);
1597
+ if (newReleaseActions.length > 0) {
1598
+ releaseService.updateReleaseStatus(releaseId);
1599
+ }
1566
1600
  ctx.created({
1567
1601
  data: newReleaseActions,
1568
1602
  meta: {
1569
1603
  entriesAlreadyInRelease: releaseActions.length - newReleaseActions.length,
1570
- totalEntries: releaseActions.length,
1571
- },
1604
+ totalEntries: releaseActions.length
1605
+ }
1572
1606
  });
1573
1607
  },
1574
- */
1575
1608
  async findMany(ctx) {
1576
1609
  const releaseId = ctx.params.releaseId;
1577
1610
  const permissionsManager = strapi.service("admin::permission").createPermissionsManager({
@@ -1670,24 +1703,22 @@ const controllers = {
1670
1703
  const release = {
1671
1704
  type: "admin",
1672
1705
  routes: [
1673
- /*
1674
1706
  {
1675
- method: 'GET',
1676
- path: '/mapEntriesToReleases',
1677
- handler: 'release.mapEntriesToReleases',
1707
+ method: "GET",
1708
+ path: "/mapEntriesToReleases",
1709
+ handler: "release.mapEntriesToReleases",
1678
1710
  config: {
1679
1711
  policies: [
1680
- 'admin::isAuthenticatedAdmin',
1712
+ "admin::isAuthenticatedAdmin",
1681
1713
  {
1682
- name: 'admin::hasPermissions',
1714
+ name: "admin::hasPermissions",
1683
1715
  config: {
1684
- actions: ['plugin::content-releases.read'],
1685
- },
1686
- },
1687
- ],
1688
- },
1716
+ actions: ["plugin::content-releases.read"]
1717
+ }
1718
+ }
1719
+ ]
1720
+ }
1689
1721
  },
1690
- */
1691
1722
  {
1692
1723
  method: "GET",
1693
1724
  path: "/getByDocumentAttached",
@@ -1821,24 +1852,22 @@ const releaseAction = {
1821
1852
  ]
1822
1853
  }
1823
1854
  },
1824
- /*
1825
1855
  {
1826
- method: 'POST',
1827
- path: '/:releaseId/actions/bulk',
1828
- handler: 'release-action.createMany',
1856
+ method: "POST",
1857
+ path: "/:releaseId/actions/bulk",
1858
+ handler: "release-action.createMany",
1829
1859
  config: {
1830
1860
  policies: [
1831
- 'admin::isAuthenticatedAdmin',
1861
+ "admin::isAuthenticatedAdmin",
1832
1862
  {
1833
- name: 'admin::hasPermissions',
1863
+ name: "admin::hasPermissions",
1834
1864
  config: {
1835
- actions: ['plugin::content-releases.create-action'],
1836
- },
1837
- },
1838
- ],
1839
- },
1865
+ actions: ["plugin::content-releases.create-action"]
1866
+ }
1867
+ }
1868
+ ]
1869
+ }
1840
1870
  },
1841
- */
1842
1871
  {
1843
1872
  method: "GET",
1844
1873
  path: "/:releaseId/actions",