@strapi/review-workflows 0.0.0-experimental.f75e3c6d67cc47c64ab37479efdbb7b43be50b78 → 0.0.0-experimental.f9cac24ba3b2f6acb12d0fb5669106e5a134174e

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/LICENSE +12 -17
  2. package/dist/_chunks/{Layout-lg3hbwGL.mjs → Layout-CJZ4iUxI.mjs} +8 -9
  3. package/dist/_chunks/Layout-CJZ4iUxI.mjs.map +1 -0
  4. package/dist/_chunks/{Layout-BMqtFafC.js → Layout-D7wwT4c7.js} +8 -9
  5. package/dist/_chunks/Layout-D7wwT4c7.js.map +1 -0
  6. package/dist/_chunks/{_id-B3jMqqMH.mjs → _id-DA44l-QM.mjs} +131 -165
  7. package/dist/_chunks/_id-DA44l-QM.mjs.map +1 -0
  8. package/dist/_chunks/{_id-B853wt9z.js → _id-DgUOk637.js} +130 -164
  9. package/dist/_chunks/_id-DgUOk637.js.map +1 -0
  10. package/dist/_chunks/{index-lebOqdrv.mjs → index-C33Q2-Fc.mjs} +108 -92
  11. package/dist/_chunks/index-C33Q2-Fc.mjs.map +1 -0
  12. package/dist/_chunks/{index-BhJmjDbj.mjs → index-CnyO97Gi.mjs} +16 -44
  13. package/dist/_chunks/index-CnyO97Gi.mjs.map +1 -0
  14. package/dist/_chunks/{index-CdU1x9cZ.js → index-DL9odlOl.js} +14 -42
  15. package/dist/_chunks/index-DL9odlOl.js.map +1 -0
  16. package/dist/_chunks/{index-Ujtj1Rcp.js → index-mQar1hfK.js} +106 -90
  17. package/dist/_chunks/index-mQar1hfK.js.map +1 -0
  18. package/dist/_chunks/{router-BboD243b.js → router-B1YtLp6u.js} +3 -3
  19. package/dist/_chunks/{router-BboD243b.js.map → router-B1YtLp6u.js.map} +1 -1
  20. package/dist/_chunks/{router-CvMnSjb9.mjs → router-BFv8U71z.mjs} +3 -3
  21. package/dist/_chunks/{router-CvMnSjb9.mjs.map → router-BFv8U71z.mjs.map} +1 -1
  22. package/dist/admin/index.js +1 -1
  23. package/dist/admin/index.mjs +1 -1
  24. package/dist/admin/src/components/LimitsModal.d.ts +2 -4
  25. package/dist/admin/src/services/admin.d.ts +1 -1
  26. package/dist/admin/src/services/api.d.ts +1 -1
  27. package/dist/admin/src/services/content-manager.d.ts +4 -4
  28. package/dist/admin/src/services/settings.d.ts +1733 -7
  29. package/dist/server/index.js +41 -62
  30. package/dist/server/index.js.map +1 -1
  31. package/dist/server/index.mjs +41 -62
  32. package/dist/server/index.mjs.map +1 -1
  33. package/dist/server/src/controllers/assignees.d.ts.map +1 -1
  34. package/dist/server/src/controllers/index.d.ts +0 -1
  35. package/dist/server/src/controllers/index.d.ts.map +1 -1
  36. package/dist/server/src/controllers/stages.d.ts.map +1 -1
  37. package/dist/server/src/controllers/workflows.d.ts +0 -7
  38. package/dist/server/src/controllers/workflows.d.ts.map +1 -1
  39. package/dist/server/src/index.d.ts +1 -2
  40. package/dist/server/src/index.d.ts.map +1 -1
  41. package/dist/server/src/routes/review-workflows.d.ts.map +1 -1
  42. package/dist/server/src/services/document-service-middleware.d.ts.map +1 -1
  43. package/dist/server/src/services/index.d.ts +1 -1
  44. package/dist/server/src/services/metrics/weekly-metrics.d.ts.map +1 -1
  45. package/dist/server/src/services/stages.d.ts +2 -7
  46. package/dist/server/src/services/stages.d.ts.map +1 -1
  47. package/dist/shared/contracts/review-workflows.d.ts +1 -14
  48. package/dist/shared/contracts/review-workflows.d.ts.map +1 -1
  49. package/package.json +10 -10
  50. package/dist/_chunks/Layout-BMqtFafC.js.map +0 -1
  51. package/dist/_chunks/Layout-lg3hbwGL.mjs.map +0 -1
  52. package/dist/_chunks/_id-B3jMqqMH.mjs.map +0 -1
  53. package/dist/_chunks/_id-B853wt9z.js.map +0 -1
  54. package/dist/_chunks/index-BhJmjDbj.mjs.map +0 -1
  55. package/dist/_chunks/index-CdU1x9cZ.js.map +0 -1
  56. package/dist/_chunks/index-Ujtj1Rcp.js.map +0 -1
  57. package/dist/_chunks/index-lebOqdrv.mjs.map +0 -1
  58. package/strapi-server.js +0 -3
@@ -6837,23 +6837,6 @@ const reviewWorkflows = {
6837
6837
  ]
6838
6838
  }
6839
6839
  },
6840
- {
6841
- method: "GET",
6842
- path: "/workflows/:id",
6843
- handler: "workflows.findById",
6844
- config: {
6845
- middlewares: [enableFeatureMiddleware("review-workflows")],
6846
- policies: [
6847
- "admin::isAuthenticatedAdmin",
6848
- {
6849
- name: "admin::hasPermissions",
6850
- config: {
6851
- actions: ["admin::review-workflows.read"]
6852
- }
6853
- }
6854
- ]
6855
- }
6856
- },
6857
6840
  {
6858
6841
  method: "GET",
6859
6842
  path: "/workflows/:workflow_id/stages",
@@ -6917,7 +6900,7 @@ const reviewWorkflows = {
6917
6900
  {
6918
6901
  name: "admin::hasPermissions",
6919
6902
  config: {
6920
- actions: ["admin::users.read", "admin::review-workflows.read"]
6903
+ actions: ["admin::users.read"]
6921
6904
  }
6922
6905
  }
6923
6906
  ]
@@ -7338,23 +7321,17 @@ const stages$1 = ({ strapi: strapi2 }) => {
7338
7321
  },
7339
7322
  /**
7340
7323
  * Update the stage of an entity
7341
- *
7342
- * @param {object} entityInfo
7343
- * @param {number} entityInfo.id - Entity id
7344
- * @param {string} entityInfo.modelUID - the content-type of the entity
7345
- * @param {number} stageId - The id of the stage to assign to the entity
7346
7324
  */
7347
- async updateEntity(entityInfo, stageId) {
7325
+ async updateEntity(documentId, locale, model, stageId) {
7348
7326
  const stage = await this.findById(stageId);
7349
7327
  await workflowValidator.validateWorkflowCount();
7350
7328
  if (!stage) {
7351
7329
  throw new ApplicationError$2(`Selected stage does not exist`);
7352
7330
  }
7353
- const entity = await strapi2.db.query(entityInfo.modelUID).update({
7354
- where: {
7355
- id: entityInfo.id
7356
- },
7357
- data: { [ENTITY_STAGE_ATTRIBUTE]: stageId },
7331
+ const entity = await strapi2.documents(model).update({
7332
+ documentId,
7333
+ locale,
7334
+ data: { [ENTITY_STAGE_ATTRIBUTE]: stage },
7358
7335
  populate: [ENTITY_STAGE_ATTRIBUTE]
7359
7336
  });
7360
7337
  metrics.sendDidChangeEntryStage();
@@ -7771,7 +7748,12 @@ const reviewWorkflowsWeeklyMetrics = ({ strapi: strapi2 }) => {
7771
7748
  },
7772
7749
  async registerCron() {
7773
7750
  const weeklySchedule = await this.ensureWeeklyStoredCronSchedule();
7774
- strapi2.cron.add({ [weeklySchedule]: this.sendMetrics.bind(this) });
7751
+ strapi2.cron.add({
7752
+ reviewWorkflowsWeekly: {
7753
+ task: this.sendMetrics.bind(this),
7754
+ options: weeklySchedule
7755
+ }
7756
+ });
7775
7757
  }
7776
7758
  };
7777
7759
  };
@@ -7827,6 +7809,7 @@ const handleStageOnUpdate = async (ctx, next) => {
7827
7809
  strapi.eventHub.emit(WORKFLOW_UPDATE_STAGE, {
7828
7810
  model: model.modelName,
7829
7811
  uid: model.uid,
7812
+ // TODO v6: Rename to "entry", which is what is used for regular CRUD updates
7830
7813
  entity: {
7831
7814
  // @ts-expect-error
7832
7815
  id: result?.id,
@@ -8028,30 +8011,6 @@ const workflows = {
8028
8011
  workflowCount
8029
8012
  }
8030
8013
  };
8031
- },
8032
- /**
8033
- * Get one workflow based on its id contained in request parameters
8034
- * Returns count of workflows in meta, used to prevent workflow edition when
8035
- * max workflow count is reached for the current plan
8036
- * @param {import('koa').BaseContext} ctx - koa context
8037
- */
8038
- async findById(ctx) {
8039
- const { id } = ctx.params;
8040
- const { query } = ctx.request;
8041
- const { sanitizeOutput, sanitizedQuery } = getWorkflowsPermissionChecker(
8042
- { strapi },
8043
- ctx.state.userAbility
8044
- );
8045
- const { populate } = await sanitizedQuery.read(query);
8046
- const workflowService = getService("workflows");
8047
- const [workflow2, workflowCount] = await Promise.all([
8048
- workflowService.findById(id, { populate }).then(formatWorkflowToAdmin),
8049
- workflowService.count()
8050
- ]);
8051
- ctx.body = {
8052
- data: await sanitizeOutput(workflow2),
8053
- meta: { workflowCount }
8054
- };
8055
8014
  }
8056
8015
  };
8057
8016
  function sanitizeStage({ strapi: strapi2 }, userAbility) {
@@ -8136,7 +8095,12 @@ const stages = {
8136
8095
  );
8137
8096
  const workflow2 = await workflowService.assertContentTypeBelongsToWorkflow(modelUID);
8138
8097
  workflowService.assertStageBelongsToWorkflow(stageId, workflow2);
8139
- const updatedEntity = await stagesService.updateEntity({ id: entity.id, modelUID }, stageId);
8098
+ const updatedEntity = await stagesService.updateEntity(
8099
+ entity.documentId,
8100
+ entity.locale,
8101
+ modelUID,
8102
+ stageId
8103
+ );
8140
8104
  ctx.body = { data: await sanitizeOutput(updatedEntity) };
8141
8105
  },
8142
8106
  /**
@@ -8156,10 +8120,9 @@ const stages = {
8156
8120
  if (strapi.plugin("content-manager").service("permission-checker").create({ userAbility: ctx.state.userAbility, model: modelUID }).cannot.read()) {
8157
8121
  return ctx.forbidden();
8158
8122
  }
8159
- const locale = await validateLocale(query?.locale);
8123
+ const locale = await validateLocale(query?.locale) ?? void 0;
8160
8124
  const entity = await strapi.documents(modelUID).findOne({
8161
8125
  documentId,
8162
- // @ts-expect-error - locale should be also null in the doc service types
8163
8126
  locale,
8164
8127
  populate: [ENTITY_STAGE_ATTRIBUTE]
8165
8128
  });
@@ -8168,12 +8131,13 @@ const stages = {
8168
8131
  }
8169
8132
  const entityStageId = entity[ENTITY_STAGE_ATTRIBUTE]?.id;
8170
8133
  const canTransition = stagePermissions2.can(STAGE_TRANSITION_UID, entityStageId);
8171
- const [workflowCount, { stages: workflowStages }] = await Promise.all([
8134
+ const [workflowCount, workflowResult] = await Promise.all([
8172
8135
  workflowService.count(),
8173
8136
  workflowService.getAssignedWorkflow(modelUID, {
8174
8137
  populate: "stages"
8175
8138
  })
8176
8139
  ]);
8140
+ const workflowStages = workflowResult ? workflowResult.stages : [];
8177
8141
  const meta = {
8178
8142
  stageCount: workflowStages.length,
8179
8143
  workflowCount
@@ -8209,22 +8173,37 @@ const assignees = {
8209
8173
  async updateEntity(ctx) {
8210
8174
  const assigneeService = getService("assignees");
8211
8175
  const workflowService = getService("workflows");
8176
+ const stagePermissions2 = getService("stage-permissions");
8212
8177
  const { model_uid: model, id: documentId } = ctx.params;
8213
- const { locale } = ctx.request.query || {};
8178
+ const locale = await validateLocale(ctx.request.query?.locale) ?? void 0;
8214
8179
  const { sanitizeOutput } = strapi.plugin("content-manager").service("permission-checker").create({ userAbility: ctx.state.userAbility, model });
8180
+ const entity = await strapi.documents(model).findOne({
8181
+ documentId,
8182
+ locale,
8183
+ populate: [ENTITY_STAGE_ATTRIBUTE]
8184
+ });
8185
+ if (!entity) {
8186
+ ctx.throw(404, "Entity not found");
8187
+ }
8188
+ const canTransitionStage = stagePermissions2.can(
8189
+ STAGE_TRANSITION_UID,
8190
+ entity[ENTITY_STAGE_ATTRIBUTE]?.id
8191
+ );
8192
+ if (!canTransitionStage) {
8193
+ ctx.throw(403, "Stage transition permission is required");
8194
+ }
8215
8195
  const { id: assigneeId } = await validateUpdateAssigneeOnEntity(
8216
8196
  ctx.request?.body?.data,
8217
8197
  "You should pass a valid id to the body of the put request."
8218
8198
  );
8219
- await validateLocale(locale);
8220
8199
  await workflowService.assertContentTypeBelongsToWorkflow(model);
8221
- const entity = await assigneeService.updateEntityAssignee(
8200
+ const updatedEntity = await assigneeService.updateEntityAssignee(
8222
8201
  documentId,
8223
8202
  locale || null,
8224
8203
  model,
8225
8204
  assigneeId
8226
8205
  );
8227
- ctx.body = { data: await sanitizeOutput(entity) };
8206
+ ctx.body = { data: await sanitizeOutput(updatedEntity) };
8228
8207
  }
8229
8208
  };
8230
8209
  const controllers = {