@strapi/content-releases 0.0.0-next.4052765aa209dd4f3d92b81baee295fc0213c04c → 0.0.0-next.40d132bcf8139c1d691684ec83a5834c98dfd41f

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 (49) hide show
  1. package/dist/_chunks/{App-BA2xDdy0.mjs → App-CiZCkScI.mjs} +299 -115
  2. package/dist/_chunks/App-CiZCkScI.mjs.map +1 -0
  3. package/dist/_chunks/{App-D4Wira1X.js → App-SGjO5UPV.js} +340 -157
  4. package/dist/_chunks/App-SGjO5UPV.js.map +1 -0
  5. package/dist/_chunks/{PurchaseContentReleases-Be3acS2L.js → PurchaseContentReleases--qQepXpP.js} +2 -2
  6. package/dist/_chunks/PurchaseContentReleases--qQepXpP.js.map +1 -0
  7. package/dist/_chunks/{PurchaseContentReleases-_MxP6-Dt.mjs → PurchaseContentReleases-D-n-w-st.mjs} +2 -2
  8. package/dist/_chunks/{PurchaseContentReleases-_MxP6-Dt.mjs.map → PurchaseContentReleases-D-n-w-st.mjs.map} +1 -1
  9. package/dist/_chunks/{ReleasesSettingsPage-xhFyRXCM.js → ReleasesSettingsPage-Cto_NLUd.js} +3 -3
  10. package/dist/_chunks/{ReleasesSettingsPage-xhFyRXCM.js.map → ReleasesSettingsPage-Cto_NLUd.js.map} +1 -1
  11. package/dist/_chunks/{ReleasesSettingsPage-BAlbMWpw.mjs → ReleasesSettingsPage-DQT8N3A-.mjs} +2 -2
  12. package/dist/_chunks/{ReleasesSettingsPage-BAlbMWpw.mjs.map → ReleasesSettingsPage-DQT8N3A-.mjs.map} +1 -1
  13. package/dist/_chunks/{en-CmYoEnA7.js → en-BWPPsSH-.js} +11 -2
  14. package/dist/_chunks/en-BWPPsSH-.js.map +1 -0
  15. package/dist/_chunks/{en-D0yVZFqf.mjs → en-D9Q4YW03.mjs} +11 -2
  16. package/dist/_chunks/en-D9Q4YW03.mjs.map +1 -0
  17. package/dist/_chunks/{index-CCFFG3Zs.mjs → index-BjvFfTtA.mjs} +33 -12
  18. package/dist/_chunks/index-BjvFfTtA.mjs.map +1 -0
  19. package/dist/_chunks/{index-DxkQGp4N.js → index-CyU534vL.js} +34 -14
  20. package/dist/_chunks/index-CyU534vL.js.map +1 -0
  21. package/dist/_chunks/{schemas-BE1LxE9J.js → schemas-DBYv9gK8.js} +2 -3
  22. package/dist/_chunks/{schemas-BE1LxE9J.js.map → schemas-DBYv9gK8.js.map} +1 -1
  23. package/dist/_chunks/schemas-DdA2ic2U.mjs.map +1 -1
  24. package/dist/admin/index.js +1 -1
  25. package/dist/admin/index.mjs +1 -1
  26. package/dist/admin/src/components/EntryValidationPopover.d.ts +13 -0
  27. package/dist/server/index.js +84 -11
  28. package/dist/server/index.js.map +1 -1
  29. package/dist/server/index.mjs +83 -9
  30. package/dist/server/index.mjs.map +1 -1
  31. package/dist/server/src/index.d.ts +2 -6
  32. package/dist/server/src/index.d.ts.map +1 -1
  33. package/dist/server/src/middlewares/documents.d.ts.map +1 -1
  34. package/dist/server/src/migrations/database/5.0.0-document-id-in-actions.d.ts.map +1 -1
  35. package/dist/server/src/services/index.d.ts +2 -6
  36. package/dist/server/src/services/index.d.ts.map +1 -1
  37. package/dist/server/src/services/release-action.d.ts +3 -7
  38. package/dist/server/src/services/release-action.d.ts.map +1 -1
  39. package/dist/server/src/utils/index.d.ts.map +1 -1
  40. package/dist/shared/contracts/release-actions.d.ts +8 -1
  41. package/dist/shared/contracts/release-actions.d.ts.map +1 -1
  42. package/package.json +16 -15
  43. package/dist/_chunks/App-BA2xDdy0.mjs.map +0 -1
  44. package/dist/_chunks/App-D4Wira1X.js.map +0 -1
  45. package/dist/_chunks/PurchaseContentReleases-Be3acS2L.js.map +0 -1
  46. package/dist/_chunks/en-CmYoEnA7.js.map +0 -1
  47. package/dist/_chunks/en-D0yVZFqf.mjs.map +0 -1
  48. package/dist/_chunks/index-CCFFG3Zs.mjs.map +0 -1
  49. package/dist/_chunks/index-DxkQGp4N.js.map +0 -1
@@ -88,6 +88,13 @@ const isEntryValid = async (contentTypeUid, entry, { strapi: strapi2 }) => {
88
88
  // @ts-expect-error - FIXME: entity here is unnecessary
89
89
  entry
90
90
  );
91
+ const workflowsService = strapi2.plugin("review-workflows").service("workflows");
92
+ const workflow = await workflowsService.getAssignedWorkflow(contentTypeUid, {
93
+ populate: "stageRequiredToPublish"
94
+ });
95
+ if (workflow?.stageRequiredToPublish) {
96
+ return entry.strapi_stage.id === workflow.stageRequiredToPublish.id;
97
+ }
91
98
  return true;
92
99
  } catch {
93
100
  return false;
@@ -101,7 +108,11 @@ const getEntry = async ({
101
108
  status = "draft"
102
109
  }, { strapi: strapi2 }) => {
103
110
  if (documentId) {
104
- return strapi2.documents(contentType).findOne({ documentId, locale, populate, status });
111
+ const entry = await strapi2.documents(contentType).findOne({ documentId, locale, populate, status });
112
+ if (status === "published" && !entry) {
113
+ return strapi2.documents(contentType).findOne({ documentId, locale, populate, status: "draft" });
114
+ }
115
+ return entry;
105
116
  }
106
117
  return strapi2.documents(contentType).findFirst({ locale, populate, status });
107
118
  };
@@ -306,6 +317,10 @@ async function enableContentTypeLocalized({ oldContentTypes, contentTypes: conte
306
317
  const addEntryDocumentToReleaseActions = {
307
318
  name: "content-releases::5.0.0-add-entry-document-id-to-release-actions",
308
319
  async up(trx, db) {
320
+ const hasTable = await trx.schema.hasTable("strapi_release_actions");
321
+ if (!hasTable) {
322
+ return;
323
+ }
309
324
  const hasPolymorphicColumn = await trx.schema.hasColumn("strapi_release_actions", "target_id");
310
325
  if (hasPolymorphicColumn) {
311
326
  const hasEntryDocumentIdColumn = await trx.schema.hasColumn(
@@ -347,6 +362,7 @@ const register = async ({ strapi: strapi2 }) => {
347
362
  const updateActionsStatusAndUpdateReleaseStatus = async (contentType, entry) => {
348
363
  const releases = await strapi.db.query(RELEASE_MODEL_UID).findMany({
349
364
  where: {
365
+ releasedAt: null,
350
366
  actions: {
351
367
  contentType,
352
368
  entryDocumentId: entry.documentId,
@@ -355,7 +371,7 @@ const updateActionsStatusAndUpdateReleaseStatus = async (contentType, entry) =>
355
371
  }
356
372
  });
357
373
  const entryStatus = await isEntryValid(contentType, entry, { strapi });
358
- await strapi.db.query(RELEASE_ACTION_MODEL_UID).update({
374
+ await strapi.db.query(RELEASE_ACTION_MODEL_UID).updateMany({
359
375
  where: {
360
376
  contentType,
361
377
  entryDocumentId: entry.documentId,
@@ -459,8 +475,8 @@ const bootstrap = async ({ strapi: strapi2 }) => {
459
475
  const { where } = event.params;
460
476
  deleteReleasesActionsAndUpdateReleaseStatus({
461
477
  contentType: model.uid,
462
- locale: where.locale ?? null,
463
- ...where.documentId && { entryDocumentId: where.documentId }
478
+ locale: where?.locale ?? null,
479
+ ...where?.documentId && { entryDocumentId: where.documentId }
464
480
  });
465
481
  }
466
482
  } catch (error) {
@@ -1015,16 +1031,26 @@ const createReleaseActionService = ({ strapi: strapi2 }) => {
1015
1031
  const groupName = getGroupName(groupBy);
1016
1032
  return _.groupBy(groupName)(formattedData);
1017
1033
  },
1018
- getContentTypeModelsFromActions(actions) {
1034
+ async getContentTypeModelsFromActions(actions) {
1019
1035
  const contentTypeUids = actions.reduce((acc, action) => {
1020
1036
  if (!acc.includes(action.contentType)) {
1021
1037
  acc.push(action.contentType);
1022
1038
  }
1023
1039
  return acc;
1024
1040
  }, []);
1025
- const contentTypeModelsMap = contentTypeUids.reduce(
1026
- (acc, contentTypeUid) => {
1027
- acc[contentTypeUid] = strapi2.getModel(contentTypeUid);
1041
+ const workflowsService = strapi2.plugin("review-workflows").service("workflows");
1042
+ const contentTypeModelsMap = await async.reduce(contentTypeUids)(
1043
+ async (accPromise, contentTypeUid) => {
1044
+ const acc = await accPromise;
1045
+ const contentTypeModel = strapi2.getModel(contentTypeUid);
1046
+ const workflow = await workflowsService.getAssignedWorkflow(contentTypeUid, {
1047
+ populate: "stageRequiredToPublish"
1048
+ });
1049
+ acc[contentTypeUid] = {
1050
+ ...contentTypeModel,
1051
+ hasReviewWorkflow: !!workflow,
1052
+ stageRequiredToPublish: workflow?.stageRequiredToPublish
1053
+ };
1028
1054
  return acc;
1029
1055
  },
1030
1056
  {}
@@ -1099,6 +1125,54 @@ const createReleaseActionService = ({ strapi: strapi2 }) => {
1099
1125
  }
1100
1126
  getService("release", { strapi: strapi2 }).updateReleaseStatus(releaseId);
1101
1127
  return deletedAction;
1128
+ },
1129
+ async validateActionsByContentTypes(contentTypeUids) {
1130
+ const actions = await strapi2.db.query(RELEASE_ACTION_MODEL_UID).findMany({
1131
+ where: {
1132
+ contentType: {
1133
+ $in: contentTypeUids
1134
+ },
1135
+ // We only want to validate actions that are going to be published
1136
+ type: "publish",
1137
+ release: {
1138
+ releasedAt: {
1139
+ $null: true
1140
+ }
1141
+ }
1142
+ },
1143
+ populate: { release: true }
1144
+ });
1145
+ const releasesUpdated = [];
1146
+ await async.map(actions, async (action) => {
1147
+ const isValid = await getDraftEntryValidStatus(
1148
+ {
1149
+ contentType: action.contentType,
1150
+ documentId: action.entryDocumentId,
1151
+ locale: action.locale
1152
+ },
1153
+ { strapi: strapi2 }
1154
+ );
1155
+ await strapi2.db.query(RELEASE_ACTION_MODEL_UID).update({
1156
+ where: {
1157
+ id: action.id
1158
+ },
1159
+ data: {
1160
+ isEntryValid: isValid
1161
+ }
1162
+ });
1163
+ if (!releasesUpdated.includes(action.release.id)) {
1164
+ releasesUpdated.push(action.release.id);
1165
+ }
1166
+ return {
1167
+ id: action.id,
1168
+ isEntryValid: isValid
1169
+ };
1170
+ });
1171
+ if (releasesUpdated.length > 0) {
1172
+ await async.map(releasesUpdated, async (releaseId) => {
1173
+ await getService("release", { strapi: strapi2 }).updateReleaseStatus(releaseId);
1174
+ });
1175
+ }
1102
1176
  }
1103
1177
  };
1104
1178
  };
@@ -1617,7 +1691,7 @@ const releaseActionController = {
1617
1691
  entry: action.entry ? await contentTypeOutputSanitizers[action.contentType](action.entry) : {}
1618
1692
  }));
1619
1693
  const groupedData = await releaseActionService.groupActions(sanitizedResults, query.sort);
1620
- const contentTypes2 = releaseActionService.getContentTypeModelsFromActions(results);
1694
+ const contentTypes2 = await releaseActionService.getContentTypeModelsFromActions(results);
1621
1695
  const releaseService = getService("release", { strapi });
1622
1696
  const components = await releaseService.getAllComponents();
1623
1697
  ctx.body = {