@strapi/review-workflows 5.56.0 → 5.57.0

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 (88) hide show
  1. package/dist/server/audit-logs.js +123 -0
  2. package/dist/server/audit-logs.js.map +1 -0
  3. package/dist/server/audit-logs.mjs +116 -0
  4. package/dist/server/audit-logs.mjs.map +1 -0
  5. package/dist/server/bootstrap.js +7 -0
  6. package/dist/server/bootstrap.js.map +1 -1
  7. package/dist/server/bootstrap.mjs +7 -0
  8. package/dist/server/bootstrap.mjs.map +1 -1
  9. package/dist/server/controllers/workflows.js +8 -6
  10. package/dist/server/controllers/workflows.js.map +1 -1
  11. package/dist/server/controllers/workflows.mjs +8 -6
  12. package/dist/server/controllers/workflows.mjs.map +1 -1
  13. package/dist/server/middlewares/review-workflows.js +7 -3
  14. package/dist/server/middlewares/review-workflows.js.map +1 -1
  15. package/dist/server/middlewares/review-workflows.mjs +7 -3
  16. package/dist/server/middlewares/review-workflows.mjs.map +1 -1
  17. package/dist/server/migrations/handle-deleted-ct-in-workflows.js +2 -2
  18. package/dist/server/migrations/handle-deleted-ct-in-workflows.js.map +1 -1
  19. package/dist/server/migrations/handle-deleted-ct-in-workflows.mjs +2 -2
  20. package/dist/server/migrations/handle-deleted-ct-in-workflows.mjs.map +1 -1
  21. package/dist/server/migrations/multiple-workflows.js +2 -5
  22. package/dist/server/migrations/multiple-workflows.js.map +1 -1
  23. package/dist/server/migrations/multiple-workflows.mjs +2 -5
  24. package/dist/server/migrations/multiple-workflows.mjs.map +1 -1
  25. package/dist/server/register.js +4 -7
  26. package/dist/server/register.js.map +1 -1
  27. package/dist/server/register.mjs +4 -7
  28. package/dist/server/register.mjs.map +1 -1
  29. package/dist/server/services/assignees.js +18 -2
  30. package/dist/server/services/assignees.js.map +1 -1
  31. package/dist/server/services/assignees.mjs +19 -3
  32. package/dist/server/services/assignees.mjs.map +1 -1
  33. package/dist/server/services/document-service-middleware.js +2 -3
  34. package/dist/server/services/document-service-middleware.js.map +1 -1
  35. package/dist/server/services/document-service-middleware.mjs +2 -3
  36. package/dist/server/services/document-service-middleware.mjs.map +1 -1
  37. package/dist/server/services/metrics/weekly-metrics.js +8 -8
  38. package/dist/server/services/metrics/weekly-metrics.js.map +1 -1
  39. package/dist/server/services/metrics/weekly-metrics.mjs +4 -4
  40. package/dist/server/services/metrics/weekly-metrics.mjs.map +1 -1
  41. package/dist/server/services/stage-permissions.js +1 -2
  42. package/dist/server/services/stage-permissions.js.map +1 -1
  43. package/dist/server/services/stage-permissions.mjs +1 -2
  44. package/dist/server/services/stage-permissions.mjs.map +1 -1
  45. package/dist/server/services/stages.js +8 -8
  46. package/dist/server/services/stages.js.map +1 -1
  47. package/dist/server/services/stages.mjs +7 -7
  48. package/dist/server/services/stages.mjs.map +1 -1
  49. package/dist/server/services/validation.js +1 -2
  50. package/dist/server/services/validation.js.map +1 -1
  51. package/dist/server/services/validation.mjs +1 -2
  52. package/dist/server/services/validation.mjs.map +1 -1
  53. package/dist/server/services/workflow-content-types.js +23 -6
  54. package/dist/server/services/workflow-content-types.js.map +1 -1
  55. package/dist/server/services/workflow-content-types.mjs +21 -4
  56. package/dist/server/services/workflow-content-types.mjs.map +1 -1
  57. package/dist/server/services/workflows.js +91 -13
  58. package/dist/server/services/workflows.js.map +1 -1
  59. package/dist/server/services/workflows.mjs +91 -13
  60. package/dist/server/services/workflows.mjs.map +1 -1
  61. package/dist/server/src/audit-logs.d.ts +112 -0
  62. package/dist/server/src/audit-logs.d.ts.map +1 -0
  63. package/dist/server/src/bootstrap.d.ts.map +1 -1
  64. package/dist/server/src/controllers/workflows.d.ts.map +1 -1
  65. package/dist/server/src/index.d.ts +1 -1
  66. package/dist/server/src/index.d.ts.map +1 -1
  67. package/dist/server/src/middlewares/review-workflows.d.ts.map +1 -1
  68. package/dist/server/src/migrations/handle-deleted-ct-in-workflows.d.ts.map +1 -1
  69. package/dist/server/src/migrations/multiple-workflows.d.ts.map +1 -1
  70. package/dist/server/src/register.d.ts.map +1 -1
  71. package/dist/server/src/services/assignees.d.ts.map +1 -1
  72. package/dist/server/src/services/document-service-middleware.d.ts.map +1 -1
  73. package/dist/server/src/services/index.d.ts +1 -1
  74. package/dist/server/src/services/index.d.ts.map +1 -1
  75. package/dist/server/src/services/metrics/weekly-metrics.d.ts +1 -1
  76. package/dist/server/src/services/metrics/weekly-metrics.d.ts.map +1 -1
  77. package/dist/server/src/services/stage-permissions.d.ts.map +1 -1
  78. package/dist/server/src/services/validation.d.ts.map +1 -1
  79. package/dist/server/src/services/workflow-content-types.d.ts +10 -3
  80. package/dist/server/src/services/workflow-content-types.d.ts.map +1 -1
  81. package/dist/server/src/services/workflows.d.ts.map +1 -1
  82. package/dist/server/src/utils/review-workflows.d.ts +12 -8
  83. package/dist/server/src/utils/review-workflows.d.ts.map +1 -1
  84. package/dist/server/utils/review-workflows.js +8 -13
  85. package/dist/server/utils/review-workflows.js.map +1 -1
  86. package/dist/server/utils/review-workflows.mjs +8 -13
  87. package/dist/server/utils/review-workflows.mjs.map +1 -1
  88. package/package.json +5 -5
@@ -1,8 +1,9 @@
1
1
  'use strict';
2
2
 
3
- var fp = require('lodash/fp');
3
+ var lodash = require('lodash');
4
4
  var utils = require('@strapi/utils');
5
5
  var workflows$1 = require('../constants/workflows.js');
6
+ var auditLogs = require('../audit-logs.js');
6
7
  var index = require('../utils/index.js');
7
8
  var reviewWorkflows = require('../utils/review-workflows.js');
8
9
  var workflowContentTypes = require('./workflow-content-types.js');
@@ -11,7 +12,7 @@ const processFilters = ({ strapi }, filters = {})=>{
11
12
  const processedFilters = {
12
13
  ...filters
13
14
  };
14
- if (fp.isString(filters.contentTypes)) {
15
+ if (lodash.isString(filters.contentTypes)) {
15
16
  processedFilters.contentTypes = reviewWorkflows.getWorkflowContentTypeFilter({
16
17
  strapi
17
18
  }, filters.contentTypes);
@@ -36,6 +37,26 @@ var workflows = (({ strapi })=>{
36
37
  const metrics = index.getService('workflow-metrics', {
37
38
  strapi
38
39
  });
40
+ const emitContentTypeTransfers = async (transfers)=>{
41
+ for (const { workflowId, name, before, after } of transfers){
42
+ const changes = auditLogs.getWorkflowChanges(auditLogs.toWorkflowSnapshot({
43
+ name,
44
+ contentTypes: before
45
+ }), auditLogs.toWorkflowSnapshot({
46
+ name,
47
+ contentTypes: after
48
+ }));
49
+ if (Object.keys(changes).length > 0) {
50
+ await utils.emitAudit({
51
+ strapi
52
+ }, auditLogs.AUDITED_EVENTS.WORKFLOW_UPDATE, {
53
+ workflowId,
54
+ name,
55
+ changes
56
+ });
57
+ }
58
+ }
59
+ };
39
60
  return {
40
61
  /**
41
62
  * Returns all the workflows matching the user-defined filters.
@@ -83,23 +104,35 @@ var workflows = (({ strapi })=>{
83
104
  };
84
105
  workflowValidator.validateWorkflowStages(opts.data.stages);
85
106
  await workflowValidator.validateWorkflowCount(1);
86
- return strapi.db.transaction(async ()=>{
107
+ let transfers = [];
108
+ const createdWorkflow = await strapi.db.transaction(async ()=>{
87
109
  // Create stages
88
110
  const stages = await index.getService('stages', {
89
111
  strapi
90
112
  }).createMany(opts.data.stages);
91
- const mapIds = fp.map(fp.get('id'));
92
- createOpts = fp.set('data.stages', mapIds(stages), createOpts);
113
+ createOpts = {
114
+ ...createOpts,
115
+ data: {
116
+ ...createOpts.data,
117
+ stages: lodash.map(stages, 'id')
118
+ }
119
+ };
93
120
  if (opts.data.stageRequiredToPublishName) {
94
121
  const stageRequiredToPublish = stages.find((stage)=>stage.name === opts.data.stageRequiredToPublishName);
95
122
  if (!stageRequiredToPublish) {
96
123
  throw new utils.errors.ApplicationError('Stage required to publish does not exist');
97
124
  }
98
- createOpts = fp.set('data.stageRequiredToPublish', stageRequiredToPublish.id, createOpts);
125
+ createOpts = {
126
+ ...createOpts,
127
+ data: {
128
+ ...createOpts.data,
129
+ stageRequiredToPublish: stageRequiredToPublish.id
130
+ }
131
+ };
99
132
  }
100
133
  // Update (un)assigned Content Types
101
134
  if (opts.data.contentTypes) {
102
- await workflowsContentTypes.migrate({
135
+ transfers = await workflowsContentTypes.migrate({
103
136
  destContentTypes: opts.data.contentTypes,
104
137
  stageId: stages[0].id
105
138
  });
@@ -112,6 +145,17 @@ var workflows = (({ strapi })=>{
112
145
  }
113
146
  return createdWorkflow;
114
147
  });
148
+ const { contentTypes, stages, stageRequiredToPublish } = auditLogs.toWorkflowSnapshot(createdWorkflow);
149
+ await utils.emitAudit({
150
+ strapi
151
+ }, auditLogs.AUDITED_EVENTS.WORKFLOW_CREATE, {
152
+ ...auditLogs.toWorkflowEvent(createdWorkflow),
153
+ contentTypes,
154
+ stages,
155
+ stageRequiredToPublish
156
+ });
157
+ await emitContentTypeTransfers(transfers);
158
+ return createdWorkflow;
115
159
  },
116
160
  /**
117
161
  * Updates an existing workflow.
@@ -132,30 +176,49 @@ var workflows = (({ strapi })=>{
132
176
  let updatedStages = [];
133
177
  let updatedStageIds;
134
178
  await workflowValidator.validateWorkflowCount();
135
- return strapi.db.transaction(async ()=>{
179
+ let transfers = [];
180
+ const updatedWorkflow = await strapi.db.transaction(async ()=>{
136
181
  // Update stages
137
182
  if (opts.data.stages) {
138
183
  workflowValidator.validateWorkflowStages(opts.data.stages);
139
184
  opts.data.stages.forEach((stage)=>this.assertStageBelongsToWorkflow(stage.id, workflow));
140
185
  updatedStages = await stageService.replaceStages(workflow.stages, opts.data.stages, workflow.contentTypes);
141
186
  updatedStageIds = updatedStages.map((stage)=>stage.id);
142
- updateOpts = fp.set('data.stages', updatedStageIds, updateOpts);
187
+ updateOpts = {
188
+ ...updateOpts,
189
+ data: {
190
+ ...updateOpts.data,
191
+ stages: updatedStageIds
192
+ }
193
+ };
143
194
  }
144
195
  if (opts.data.stageRequiredToPublishName !== undefined) {
145
196
  const stages = updatedStages ?? workflow.stages;
146
197
  if (opts.data.stageRequiredToPublishName === null) {
147
- updateOpts = fp.set('data.stageRequiredToPublish', null, updateOpts);
198
+ updateOpts = {
199
+ ...updateOpts,
200
+ data: {
201
+ ...updateOpts.data,
202
+ stageRequiredToPublish: null
203
+ }
204
+ };
148
205
  } else {
149
206
  const stageRequiredToPublish = stages.find((stage)=>stage.name === opts.data.stageRequiredToPublishName);
150
207
  if (!stageRequiredToPublish) {
151
208
  throw new utils.errors.ApplicationError('Stage required to publish does not exist');
152
209
  }
153
- updateOpts = fp.set('data.stageRequiredToPublish', stageRequiredToPublish.id, updateOpts);
210
+ updateOpts = {
211
+ ...updateOpts,
212
+ data: {
213
+ ...updateOpts.data,
214
+ stageRequiredToPublish: stageRequiredToPublish.id
215
+ }
216
+ };
154
217
  }
155
218
  }
156
219
  // Update (un)assigned Content Types
157
220
  if (opts.data.contentTypes) {
158
- await workflowsContentTypes.migrate({
221
+ transfers = await workflowsContentTypes.migrate({
159
222
  srcContentTypes: workflow.contentTypes,
160
223
  destContentTypes: opts.data.contentTypes,
161
224
  stageId: updatedStageIds ? updatedStageIds[0] : workflow.stages[0].id
@@ -176,6 +239,17 @@ var workflows = (({ strapi })=>{
176
239
  ]);
177
240
  return updatedWorkflow;
178
241
  });
242
+ const changes = auditLogs.getWorkflowChanges(auditLogs.toWorkflowSnapshot(workflow), auditLogs.toWorkflowSnapshot(updatedWorkflow));
243
+ if (Object.keys(changes).length > 0) {
244
+ await utils.emitAudit({
245
+ strapi
246
+ }, auditLogs.AUDITED_EVENTS.WORKFLOW_UPDATE, {
247
+ ...auditLogs.toWorkflowEvent(updatedWorkflow),
248
+ changes
249
+ });
250
+ }
251
+ await emitContentTypeTransfers(transfers);
252
+ return updatedWorkflow;
179
253
  },
180
254
  /**
181
255
  * Deletes an existing workflow.
@@ -191,7 +265,7 @@ var workflows = (({ strapi })=>{
191
265
  if (workflowCount <= 1) {
192
266
  throw new utils.errors.ApplicationError('Can not delete the last workflow');
193
267
  }
194
- return strapi.db.transaction(async ()=>{
268
+ const deletedWorkflow = await strapi.db.transaction(async ()=>{
195
269
  // Delete stages
196
270
  await stageService.deleteMany(workflow.stages);
197
271
  // Unassign all content types, this will migrate the content types to null
@@ -210,6 +284,10 @@ var workflows = (({ strapi })=>{
210
284
  await strapi.plugin('content-releases').service('release-action')?.validateActionsByContentTypes(workflow.contentTypes);
211
285
  return deletedWorkflow;
212
286
  });
287
+ await utils.emitAudit({
288
+ strapi
289
+ }, auditLogs.AUDITED_EVENTS.WORKFLOW_DELETE, auditLogs.toWorkflowEvent(workflow));
290
+ return deletedWorkflow;
213
291
  },
214
292
  /**
215
293
  * Returns the total count of workflows.
@@ -1 +1 @@
1
- {"version":3,"file":"workflows.js","sources":["../../../server/src/services/workflows.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport { set, isString, map, get } from 'lodash/fp';\nimport { errors } from '@strapi/utils';\nimport { WORKFLOW_MODEL_UID, WORKFLOW_POPULATE } from '../constants/workflows';\nimport { getService } from '../utils';\nimport { getWorkflowContentTypeFilter } from '../utils/review-workflows';\nimport workflowsContentTypesFactory from './workflow-content-types';\n\nconst processFilters = ({ strapi }: { strapi: Core.Strapi }, filters: any = {}) => {\n const processedFilters = { ...filters };\n\n if (isString(filters.contentTypes)) {\n processedFilters.contentTypes = getWorkflowContentTypeFilter({ strapi }, filters.contentTypes);\n }\n\n return processedFilters;\n};\n\n// TODO: How can we improve this? Maybe using traversePopulate?\nconst processPopulate = (populate: any) => {\n // If it does not exist or it's not an object (like an array) return the default populate\n if (!populate) {\n return WORKFLOW_POPULATE;\n }\n\n return populate;\n};\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n const workflowsContentTypes = workflowsContentTypesFactory({ strapi });\n const workflowValidator = getService('validation', { strapi });\n const metrics = getService('workflow-metrics', { strapi });\n\n return {\n /**\n * Returns all the workflows matching the user-defined filters.\n * @param {object} opts - Options for the query.\n * @param {object} opts.filters - Filters object.\n * @returns {Promise<object[]>} - List of workflows that match the user's filters.\n */\n async find(opts: any = {}) {\n const filters = processFilters({ strapi }, opts.filters);\n const populate = processPopulate(opts.populate);\n\n const query = strapi.get('query-params').transform(WORKFLOW_MODEL_UID, {\n ...opts,\n filters,\n populate,\n });\n\n return strapi.db.query(WORKFLOW_MODEL_UID).findMany(query);\n },\n\n /**\n * Returns the workflow with the specified ID.\n * @param {string} id - ID of the requested workflow.\n * @param {object} opts - Options for the query.\n * @returns {Promise<object>} - Workflow object matching the requested ID.\n */\n findById(id: any, opts: { populate?: any } = {}) {\n const populate = processPopulate(opts.populate);\n\n const query = strapi.get('query-params').transform(WORKFLOW_MODEL_UID, { populate });\n\n return strapi.db.query(WORKFLOW_MODEL_UID).findOne({\n ...query,\n where: { id },\n });\n },\n\n /**\n * Creates a new workflow.\n * @param {object} opts - Options for creating the new workflow.\n * @returns {Promise<object>} - Workflow object that was just created.\n * @throws {ValidationError} - If the workflow has no stages.\n */\n async create(opts: { data: any }) {\n let createOpts = { ...opts, populate: WORKFLOW_POPULATE };\n\n workflowValidator.validateWorkflowStages(opts.data.stages);\n await workflowValidator.validateWorkflowCount(1);\n\n return strapi.db.transaction(async () => {\n // Create stages\n const stages = await getService('stages', { strapi }).createMany(opts.data.stages);\n const mapIds = map(get('id'));\n\n createOpts = set('data.stages', mapIds(stages), createOpts);\n\n if (opts.data.stageRequiredToPublishName) {\n const stageRequiredToPublish = stages.find(\n (stage: any) => stage.name === opts.data.stageRequiredToPublishName\n );\n if (!stageRequiredToPublish) {\n throw new errors.ApplicationError('Stage required to publish does not exist');\n }\n\n createOpts = set('data.stageRequiredToPublish', stageRequiredToPublish.id, createOpts);\n }\n\n // Update (un)assigned Content Types\n if (opts.data.contentTypes) {\n await workflowsContentTypes.migrate({\n destContentTypes: opts.data.contentTypes,\n stageId: stages[0].id,\n });\n }\n\n // Create Workflow\n const createdWorkflow = await strapi.db\n .query(WORKFLOW_MODEL_UID)\n .create(strapi.get('query-params').transform(WORKFLOW_MODEL_UID, createOpts));\n\n metrics.sendDidCreateWorkflow(createdWorkflow.id, !!opts.data.stageRequiredToPublishName);\n\n if (opts.data.stageRequiredToPublishName) {\n await strapi\n .plugin('content-releases')\n .service('release-action')\n ?.validateActionsByContentTypes(opts.data.contentTypes);\n }\n\n return createdWorkflow;\n });\n },\n\n /**\n * Updates an existing workflow.\n * @param {object} workflow - The existing workflow to update.\n * @param {object} opts - Options for updating the workflow.\n * @returns {Promise<object>} - Workflow object that was just updated.\n * @throws {ApplicationError} - If the supplied stage ID does not belong to the workflow.\n */\n async update(workflow: any, opts: any) {\n const stageService = getService('stages', { strapi });\n let updateOpts = { ...opts, populate: { ...WORKFLOW_POPULATE } };\n let updatedStages: any = [];\n let updatedStageIds: any;\n\n await workflowValidator.validateWorkflowCount();\n\n return strapi.db.transaction(async () => {\n // Update stages\n if (opts.data.stages) {\n workflowValidator.validateWorkflowStages(opts.data.stages);\n opts.data.stages.forEach((stage: any) =>\n this.assertStageBelongsToWorkflow(stage.id, workflow)\n );\n\n updatedStages = await stageService.replaceStages(\n workflow.stages,\n opts.data.stages,\n workflow.contentTypes\n );\n updatedStageIds = updatedStages.map((stage: any) => stage.id);\n\n updateOpts = set('data.stages', updatedStageIds, updateOpts);\n }\n\n if (opts.data.stageRequiredToPublishName !== undefined) {\n const stages = updatedStages ?? workflow.stages;\n\n if (opts.data.stageRequiredToPublishName === null) {\n updateOpts = set('data.stageRequiredToPublish', null, updateOpts);\n } else {\n const stageRequiredToPublish = stages.find(\n (stage: any) => stage.name === opts.data.stageRequiredToPublishName\n );\n\n if (!stageRequiredToPublish) {\n throw new errors.ApplicationError('Stage required to publish does not exist');\n }\n\n updateOpts = set('data.stageRequiredToPublish', stageRequiredToPublish.id, updateOpts);\n }\n }\n\n // Update (un)assigned Content Types\n if (opts.data.contentTypes) {\n await workflowsContentTypes.migrate({\n srcContentTypes: workflow.contentTypes,\n destContentTypes: opts.data.contentTypes,\n stageId: updatedStageIds ? updatedStageIds[0] : workflow.stages[0].id,\n });\n }\n\n metrics.sendDidEditWorkflow(workflow.id, !!opts.data.stageRequiredToPublishName);\n\n const query = strapi.get('query-params').transform(WORKFLOW_MODEL_UID, updateOpts);\n\n // Update Workflow\n const updatedWorkflow = await strapi.db.query(WORKFLOW_MODEL_UID).update({\n ...query,\n where: { id: workflow.id },\n });\n\n await strapi\n .plugin('content-releases')\n .service('release-action')\n ?.validateActionsByContentTypes([\n ...workflow.contentTypes,\n ...(opts.data.contentTypes || []),\n ]);\n\n return updatedWorkflow;\n });\n },\n\n /**\n * Deletes an existing workflow.\n * Also deletes all the workflow stages and migrate all assigned the content types.\n * @param {*} workflow\n * @param {*} opts\n * @returns\n */\n async delete(workflow: any, opts: any) {\n const stageService = getService('stages', { strapi });\n\n const workflowCount = await this.count();\n\n if (workflowCount <= 1) {\n throw new errors.ApplicationError('Can not delete the last workflow');\n }\n\n return strapi.db.transaction(async () => {\n // Delete stages\n await stageService.deleteMany(workflow.stages);\n\n // Unassign all content types, this will migrate the content types to null\n await workflowsContentTypes.migrate({\n srcContentTypes: workflow.contentTypes,\n destContentTypes: [],\n });\n\n const query = strapi.get('query-params').transform(WORKFLOW_MODEL_UID, opts);\n\n // Delete Workflow\n const deletedWorkflow = await strapi.db.query(WORKFLOW_MODEL_UID).delete({\n ...query,\n where: { id: workflow.id },\n });\n\n await strapi\n .plugin('content-releases')\n .service('release-action')\n ?.validateActionsByContentTypes(workflow.contentTypes);\n\n return deletedWorkflow;\n });\n },\n /**\n * Returns the total count of workflows.\n * @returns {Promise<number>} - Total count of workflows.\n */\n count() {\n return strapi.db.query(WORKFLOW_MODEL_UID).count();\n },\n\n /**\n * Finds the assigned workflow for a given content type ID.\n * @param {string} uid - Content type ID to find the assigned workflow for.\n * @param {object} opts - Options for the query.\n * @returns {Promise<object|null>} - Assigned workflow object if found, or null.\n */\n async getAssignedWorkflow(uid: any, opts: any = {}) {\n const workflows = await this._getAssignedWorkflows(uid, opts);\n\n return workflows.length > 0 ? workflows[0] : null;\n },\n\n /**\n * Finds all the assigned workflows for a given content type ID.\n * Normally, there should only be one workflow assigned to a content type.\n * However, edge cases can occur where a content type is assigned to multiple workflows.\n * @param {string} uid - Content type ID to find the assigned workflows for.\n * @param {object} opts - Options for the query.\n * @returns {Promise<object[]>} - List of assigned workflow objects.\n */\n async _getAssignedWorkflows(uid: any, opts = {}) {\n return this.find({\n ...opts,\n filters: { contentTypes: getWorkflowContentTypeFilter({ strapi }, uid) },\n });\n },\n\n /**\n * Asserts that a content type has an assigned workflow.\n * @param {string} uid - Content type ID to verify the assignment of.\n * @returns {Promise<object>} - Workflow object associated with the content type ID.\n * @throws {ApplicationError} - If no assigned workflow is found for the content type ID.\n */\n async assertContentTypeBelongsToWorkflow(uid: any) {\n const workflow = await this.getAssignedWorkflow(uid, {\n populate: 'stages',\n });\n\n if (!workflow) {\n throw new errors.ApplicationError(\n `Review workflows is not activated on Content Type ${uid}.`\n );\n }\n\n return workflow;\n },\n\n /**\n * Asserts that a stage belongs to a given workflow.\n * @param {string} stageId - ID of stage to check.\n * @param {object} workflow - Workflow object to check against.\n * @returns\n * @throws {ApplicationError} - If the stage does not belong to the specified workflow.\n */\n assertStageBelongsToWorkflow(stageId: any, workflow: any) {\n if (!stageId) {\n return;\n }\n\n const belongs = workflow.stages.some((stage: any) => stage.id === stageId);\n if (!belongs) {\n throw new errors.ApplicationError(`Stage does not belong to workflow \"${workflow.name}\"`);\n }\n },\n };\n};\n"],"names":["processFilters","strapi","filters","processedFilters","isString","contentTypes","getWorkflowContentTypeFilter","processPopulate","populate","WORKFLOW_POPULATE","workflowsContentTypes","workflowsContentTypesFactory","workflowValidator","getService","metrics","find","opts","query","get","transform","WORKFLOW_MODEL_UID","db","findMany","findById","id","findOne","where","create","createOpts","validateWorkflowStages","data","stages","validateWorkflowCount","transaction","createMany","mapIds","map","set","stageRequiredToPublishName","stageRequiredToPublish","stage","name","errors","ApplicationError","migrate","destContentTypes","stageId","createdWorkflow","sendDidCreateWorkflow","plugin","service","validateActionsByContentTypes","update","workflow","stageService","updateOpts","updatedStages","updatedStageIds","forEach","assertStageBelongsToWorkflow","replaceStages","undefined","srcContentTypes","sendDidEditWorkflow","updatedWorkflow","delete","workflowCount","count","deleteMany","deletedWorkflow","getAssignedWorkflow","uid","workflows","_getAssignedWorkflows","length","assertContentTypeBelongsToWorkflow","belongs","some"],"mappings":"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"}
1
+ {"version":3,"file":"workflows.js","sources":["../../../server/src/services/workflows.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport { isString, map } from 'lodash';\nimport { errors, emitAudit } from '@strapi/utils';\nimport { WORKFLOW_MODEL_UID, WORKFLOW_POPULATE } from '../constants/workflows';\nimport {\n AUDITED_EVENTS,\n getWorkflowChanges,\n toWorkflowEvent,\n toWorkflowSnapshot,\n} from '../audit-logs';\nimport { getService } from '../utils';\nimport { getWorkflowContentTypeFilter } from '../utils/review-workflows';\nimport workflowsContentTypesFactory, { type ContentTypeTransfer } from './workflow-content-types';\n\nconst processFilters = ({ strapi }: { strapi: Core.Strapi }, filters: any = {}) => {\n const processedFilters = { ...filters };\n\n if (isString(filters.contentTypes)) {\n processedFilters.contentTypes = getWorkflowContentTypeFilter({ strapi }, filters.contentTypes);\n }\n\n return processedFilters;\n};\n\n// TODO: How can we improve this? Maybe using traversePopulate?\nconst processPopulate = (populate: any) => {\n // If it does not exist or it's not an object (like an array) return the default populate\n if (!populate) {\n return WORKFLOW_POPULATE;\n }\n\n return populate;\n};\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n const workflowsContentTypes = workflowsContentTypesFactory({ strapi });\n const workflowValidator = getService('validation', { strapi });\n const metrics = getService('workflow-metrics', { strapi });\n\n const emitContentTypeTransfers = async (transfers: ContentTypeTransfer[]) => {\n for (const { workflowId, name, before, after } of transfers) {\n const changes = getWorkflowChanges(\n toWorkflowSnapshot({ id: workflowId, name, contentTypes: before }),\n toWorkflowSnapshot({ id: workflowId, name, contentTypes: after })\n );\n\n if (Object.keys(changes).length > 0) {\n await emitAudit({ strapi }, AUDITED_EVENTS.WORKFLOW_UPDATE, { workflowId, name, changes });\n }\n }\n };\n\n return {\n /**\n * Returns all the workflows matching the user-defined filters.\n * @param {object} opts - Options for the query.\n * @param {object} opts.filters - Filters object.\n * @returns {Promise<object[]>} - List of workflows that match the user's filters.\n */\n async find(opts: any = {}) {\n const filters = processFilters({ strapi }, opts.filters);\n const populate = processPopulate(opts.populate);\n\n const query = strapi.get('query-params').transform(WORKFLOW_MODEL_UID, {\n ...opts,\n filters,\n populate,\n });\n\n return strapi.db.query(WORKFLOW_MODEL_UID).findMany(query);\n },\n\n /**\n * Returns the workflow with the specified ID.\n * @param {string} id - ID of the requested workflow.\n * @param {object} opts - Options for the query.\n * @returns {Promise<object>} - Workflow object matching the requested ID.\n */\n findById(id: any, opts: { populate?: any } = {}) {\n const populate = processPopulate(opts.populate);\n\n const query = strapi.get('query-params').transform(WORKFLOW_MODEL_UID, { populate });\n\n return strapi.db.query(WORKFLOW_MODEL_UID).findOne({\n ...query,\n where: { id },\n });\n },\n\n /**\n * Creates a new workflow.\n * @param {object} opts - Options for creating the new workflow.\n * @returns {Promise<object>} - Workflow object that was just created.\n * @throws {ValidationError} - If the workflow has no stages.\n */\n async create(opts: { data: any }) {\n let createOpts = { ...opts, populate: WORKFLOW_POPULATE };\n\n workflowValidator.validateWorkflowStages(opts.data.stages);\n await workflowValidator.validateWorkflowCount(1);\n\n let transfers: ContentTypeTransfer[] = [];\n\n const createdWorkflow = await strapi.db.transaction(async () => {\n // Create stages\n const stages = await getService('stages', { strapi }).createMany(opts.data.stages);\n createOpts = { ...createOpts, data: { ...createOpts.data, stages: map(stages, 'id') } };\n\n if (opts.data.stageRequiredToPublishName) {\n const stageRequiredToPublish = stages.find(\n (stage: any) => stage.name === opts.data.stageRequiredToPublishName\n );\n if (!stageRequiredToPublish) {\n throw new errors.ApplicationError('Stage required to publish does not exist');\n }\n\n createOpts = {\n ...createOpts,\n data: { ...createOpts.data, stageRequiredToPublish: stageRequiredToPublish.id },\n };\n }\n\n // Update (un)assigned Content Types\n if (opts.data.contentTypes) {\n transfers = await workflowsContentTypes.migrate({\n destContentTypes: opts.data.contentTypes,\n stageId: stages[0].id,\n });\n }\n\n // Create Workflow\n const createdWorkflow = await strapi.db\n .query(WORKFLOW_MODEL_UID)\n .create(strapi.get('query-params').transform(WORKFLOW_MODEL_UID, createOpts));\n\n metrics.sendDidCreateWorkflow(createdWorkflow.id, !!opts.data.stageRequiredToPublishName);\n\n if (opts.data.stageRequiredToPublishName) {\n await strapi\n .plugin('content-releases')\n .service('release-action')\n ?.validateActionsByContentTypes(opts.data.contentTypes);\n }\n\n return createdWorkflow;\n });\n\n const { contentTypes, stages, stageRequiredToPublish } = toWorkflowSnapshot(createdWorkflow);\n await emitAudit({ strapi }, AUDITED_EVENTS.WORKFLOW_CREATE, {\n ...toWorkflowEvent(createdWorkflow),\n contentTypes,\n stages,\n stageRequiredToPublish,\n });\n await emitContentTypeTransfers(transfers);\n\n return createdWorkflow;\n },\n\n /**\n * Updates an existing workflow.\n * @param {object} workflow - The existing workflow to update.\n * @param {object} opts - Options for updating the workflow.\n * @returns {Promise<object>} - Workflow object that was just updated.\n * @throws {ApplicationError} - If the supplied stage ID does not belong to the workflow.\n */\n async update(workflow: any, opts: any) {\n const stageService = getService('stages', { strapi });\n let updateOpts = { ...opts, populate: { ...WORKFLOW_POPULATE } };\n let updatedStages: any = [];\n let updatedStageIds: any;\n\n await workflowValidator.validateWorkflowCount();\n\n let transfers: ContentTypeTransfer[] = [];\n\n const updatedWorkflow = await strapi.db.transaction(async () => {\n // Update stages\n if (opts.data.stages) {\n workflowValidator.validateWorkflowStages(opts.data.stages);\n opts.data.stages.forEach((stage: any) =>\n this.assertStageBelongsToWorkflow(stage.id, workflow)\n );\n\n updatedStages = await stageService.replaceStages(\n workflow.stages,\n opts.data.stages,\n workflow.contentTypes\n );\n updatedStageIds = updatedStages.map((stage: any) => stage.id);\n\n updateOpts = { ...updateOpts, data: { ...updateOpts.data, stages: updatedStageIds } };\n }\n\n if (opts.data.stageRequiredToPublishName !== undefined) {\n const stages = updatedStages ?? workflow.stages;\n\n if (opts.data.stageRequiredToPublishName === null) {\n updateOpts = {\n ...updateOpts,\n data: { ...updateOpts.data, stageRequiredToPublish: null },\n };\n } else {\n const stageRequiredToPublish = stages.find(\n (stage: any) => stage.name === opts.data.stageRequiredToPublishName\n );\n\n if (!stageRequiredToPublish) {\n throw new errors.ApplicationError('Stage required to publish does not exist');\n }\n\n updateOpts = {\n ...updateOpts,\n data: { ...updateOpts.data, stageRequiredToPublish: stageRequiredToPublish.id },\n };\n }\n }\n\n // Update (un)assigned Content Types\n if (opts.data.contentTypes) {\n transfers = await workflowsContentTypes.migrate({\n srcContentTypes: workflow.contentTypes,\n destContentTypes: opts.data.contentTypes,\n stageId: updatedStageIds ? updatedStageIds[0] : workflow.stages[0].id,\n });\n }\n\n metrics.sendDidEditWorkflow(workflow.id, !!opts.data.stageRequiredToPublishName);\n\n const query = strapi.get('query-params').transform(WORKFLOW_MODEL_UID, updateOpts);\n\n // Update Workflow\n const updatedWorkflow = await strapi.db.query(WORKFLOW_MODEL_UID).update({\n ...query,\n where: { id: workflow.id },\n });\n\n await strapi\n .plugin('content-releases')\n .service('release-action')\n ?.validateActionsByContentTypes([\n ...workflow.contentTypes,\n ...(opts.data.contentTypes || []),\n ]);\n\n return updatedWorkflow;\n });\n\n const changes = getWorkflowChanges(\n toWorkflowSnapshot(workflow),\n toWorkflowSnapshot(updatedWorkflow)\n );\n\n if (Object.keys(changes).length > 0) {\n await emitAudit({ strapi }, AUDITED_EVENTS.WORKFLOW_UPDATE, {\n ...toWorkflowEvent(updatedWorkflow),\n changes,\n });\n }\n await emitContentTypeTransfers(transfers);\n\n return updatedWorkflow;\n },\n\n /**\n * Deletes an existing workflow.\n * Also deletes all the workflow stages and migrate all assigned the content types.\n * @param {*} workflow\n * @param {*} opts\n * @returns\n */\n async delete(workflow: any, opts: any) {\n const stageService = getService('stages', { strapi });\n\n const workflowCount = await this.count();\n\n if (workflowCount <= 1) {\n throw new errors.ApplicationError('Can not delete the last workflow');\n }\n\n const deletedWorkflow = await strapi.db.transaction(async () => {\n // Delete stages\n await stageService.deleteMany(workflow.stages);\n\n // Unassign all content types, this will migrate the content types to null\n await workflowsContentTypes.migrate({\n srcContentTypes: workflow.contentTypes,\n destContentTypes: [],\n });\n\n const query = strapi.get('query-params').transform(WORKFLOW_MODEL_UID, opts);\n\n // Delete Workflow\n const deletedWorkflow = await strapi.db.query(WORKFLOW_MODEL_UID).delete({\n ...query,\n where: { id: workflow.id },\n });\n\n await strapi\n .plugin('content-releases')\n .service('release-action')\n ?.validateActionsByContentTypes(workflow.contentTypes);\n\n return deletedWorkflow;\n });\n\n await emitAudit({ strapi }, AUDITED_EVENTS.WORKFLOW_DELETE, toWorkflowEvent(workflow));\n\n return deletedWorkflow;\n },\n\n /**\n * Returns the total count of workflows.\n * @returns {Promise<number>} - Total count of workflows.\n */\n count() {\n return strapi.db.query(WORKFLOW_MODEL_UID).count();\n },\n\n /**\n * Finds the assigned workflow for a given content type ID.\n * @param {string} uid - Content type ID to find the assigned workflow for.\n * @param {object} opts - Options for the query.\n * @returns {Promise<object|null>} - Assigned workflow object if found, or null.\n */\n async getAssignedWorkflow(uid: any, opts: any = {}) {\n const workflows = await this._getAssignedWorkflows(uid, opts);\n\n return workflows.length > 0 ? workflows[0] : null;\n },\n\n /**\n * Finds all the assigned workflows for a given content type ID.\n * Normally, there should only be one workflow assigned to a content type.\n * However, edge cases can occur where a content type is assigned to multiple workflows.\n * @param {string} uid - Content type ID to find the assigned workflows for.\n * @param {object} opts - Options for the query.\n * @returns {Promise<object[]>} - List of assigned workflow objects.\n */\n async _getAssignedWorkflows(uid: any, opts = {}) {\n return this.find({\n ...opts,\n filters: { contentTypes: getWorkflowContentTypeFilter({ strapi }, uid) },\n });\n },\n\n /**\n * Asserts that a content type has an assigned workflow.\n * @param {string} uid - Content type ID to verify the assignment of.\n * @returns {Promise<object>} - Workflow object associated with the content type ID.\n * @throws {ApplicationError} - If no assigned workflow is found for the content type ID.\n */\n async assertContentTypeBelongsToWorkflow(uid: any) {\n const workflow = await this.getAssignedWorkflow(uid, {\n populate: 'stages',\n });\n\n if (!workflow) {\n throw new errors.ApplicationError(\n `Review workflows is not activated on Content Type ${uid}.`\n );\n }\n\n return workflow;\n },\n\n /**\n * Asserts that a stage belongs to a given workflow.\n * @param {string} stageId - ID of stage to check.\n * @param {object} workflow - Workflow object to check against.\n * @returns\n * @throws {ApplicationError} - If the stage does not belong to the specified workflow.\n */\n assertStageBelongsToWorkflow(stageId: any, workflow: any) {\n if (!stageId) {\n return;\n }\n\n const belongs = workflow.stages.some((stage: any) => stage.id === stageId);\n if (!belongs) {\n throw new errors.ApplicationError(`Stage does not belong to workflow \"${workflow.name}\"`);\n }\n },\n };\n};\n"],"names":["processFilters","strapi","filters","processedFilters","isString","contentTypes","getWorkflowContentTypeFilter","processPopulate","populate","WORKFLOW_POPULATE","workflowsContentTypes","workflowsContentTypesFactory","workflowValidator","getService","metrics","emitContentTypeTransfers","transfers","workflowId","name","before","after","changes","getWorkflowChanges","toWorkflowSnapshot","Object","keys","length","emitAudit","AUDITED_EVENTS","WORKFLOW_UPDATE","find","opts","query","get","transform","WORKFLOW_MODEL_UID","db","findMany","findById","id","findOne","where","create","createOpts","validateWorkflowStages","data","stages","validateWorkflowCount","createdWorkflow","transaction","createMany","map","stageRequiredToPublishName","stageRequiredToPublish","stage","errors","ApplicationError","migrate","destContentTypes","stageId","sendDidCreateWorkflow","plugin","service","validateActionsByContentTypes","WORKFLOW_CREATE","toWorkflowEvent","update","workflow","stageService","updateOpts","updatedStages","updatedStageIds","updatedWorkflow","forEach","assertStageBelongsToWorkflow","replaceStages","undefined","srcContentTypes","sendDidEditWorkflow","delete","workflowCount","count","deletedWorkflow","deleteMany","WORKFLOW_DELETE","getAssignedWorkflow","uid","workflows","_getAssignedWorkflows","assertContentTypeBelongsToWorkflow","belongs","some"],"mappings":"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"}
@@ -1,6 +1,7 @@
1
- import { set, map, get, isString } from 'lodash/fp';
2
- import { errors } from '@strapi/utils';
1
+ import { map, isString } from 'lodash';
2
+ import { errors, emitAudit } from '@strapi/utils';
3
3
  import { WORKFLOW_MODEL_UID, WORKFLOW_POPULATE } from '../constants/workflows.mjs';
4
+ import { AUDITED_EVENTS, toWorkflowEvent, getWorkflowChanges, toWorkflowSnapshot } from '../audit-logs.mjs';
4
5
  import { getService } from '../utils/index.mjs';
5
6
  import { getWorkflowContentTypeFilter } from '../utils/review-workflows.mjs';
6
7
  import workflowsContentTypesFactory from './workflow-content-types.mjs';
@@ -34,6 +35,26 @@ var workflows = (({ strapi })=>{
34
35
  const metrics = getService('workflow-metrics', {
35
36
  strapi
36
37
  });
38
+ const emitContentTypeTransfers = async (transfers)=>{
39
+ for (const { workflowId, name, before, after } of transfers){
40
+ const changes = getWorkflowChanges(toWorkflowSnapshot({
41
+ name,
42
+ contentTypes: before
43
+ }), toWorkflowSnapshot({
44
+ name,
45
+ contentTypes: after
46
+ }));
47
+ if (Object.keys(changes).length > 0) {
48
+ await emitAudit({
49
+ strapi
50
+ }, AUDITED_EVENTS.WORKFLOW_UPDATE, {
51
+ workflowId,
52
+ name,
53
+ changes
54
+ });
55
+ }
56
+ }
57
+ };
37
58
  return {
38
59
  /**
39
60
  * Returns all the workflows matching the user-defined filters.
@@ -81,23 +102,35 @@ var workflows = (({ strapi })=>{
81
102
  };
82
103
  workflowValidator.validateWorkflowStages(opts.data.stages);
83
104
  await workflowValidator.validateWorkflowCount(1);
84
- return strapi.db.transaction(async ()=>{
105
+ let transfers = [];
106
+ const createdWorkflow = await strapi.db.transaction(async ()=>{
85
107
  // Create stages
86
108
  const stages = await getService('stages', {
87
109
  strapi
88
110
  }).createMany(opts.data.stages);
89
- const mapIds = map(get('id'));
90
- createOpts = set('data.stages', mapIds(stages), createOpts);
111
+ createOpts = {
112
+ ...createOpts,
113
+ data: {
114
+ ...createOpts.data,
115
+ stages: map(stages, 'id')
116
+ }
117
+ };
91
118
  if (opts.data.stageRequiredToPublishName) {
92
119
  const stageRequiredToPublish = stages.find((stage)=>stage.name === opts.data.stageRequiredToPublishName);
93
120
  if (!stageRequiredToPublish) {
94
121
  throw new errors.ApplicationError('Stage required to publish does not exist');
95
122
  }
96
- createOpts = set('data.stageRequiredToPublish', stageRequiredToPublish.id, createOpts);
123
+ createOpts = {
124
+ ...createOpts,
125
+ data: {
126
+ ...createOpts.data,
127
+ stageRequiredToPublish: stageRequiredToPublish.id
128
+ }
129
+ };
97
130
  }
98
131
  // Update (un)assigned Content Types
99
132
  if (opts.data.contentTypes) {
100
- await workflowsContentTypes.migrate({
133
+ transfers = await workflowsContentTypes.migrate({
101
134
  destContentTypes: opts.data.contentTypes,
102
135
  stageId: stages[0].id
103
136
  });
@@ -110,6 +143,17 @@ var workflows = (({ strapi })=>{
110
143
  }
111
144
  return createdWorkflow;
112
145
  });
146
+ const { contentTypes, stages, stageRequiredToPublish } = toWorkflowSnapshot(createdWorkflow);
147
+ await emitAudit({
148
+ strapi
149
+ }, AUDITED_EVENTS.WORKFLOW_CREATE, {
150
+ ...toWorkflowEvent(createdWorkflow),
151
+ contentTypes,
152
+ stages,
153
+ stageRequiredToPublish
154
+ });
155
+ await emitContentTypeTransfers(transfers);
156
+ return createdWorkflow;
113
157
  },
114
158
  /**
115
159
  * Updates an existing workflow.
@@ -130,30 +174,49 @@ var workflows = (({ strapi })=>{
130
174
  let updatedStages = [];
131
175
  let updatedStageIds;
132
176
  await workflowValidator.validateWorkflowCount();
133
- return strapi.db.transaction(async ()=>{
177
+ let transfers = [];
178
+ const updatedWorkflow = await strapi.db.transaction(async ()=>{
134
179
  // Update stages
135
180
  if (opts.data.stages) {
136
181
  workflowValidator.validateWorkflowStages(opts.data.stages);
137
182
  opts.data.stages.forEach((stage)=>this.assertStageBelongsToWorkflow(stage.id, workflow));
138
183
  updatedStages = await stageService.replaceStages(workflow.stages, opts.data.stages, workflow.contentTypes);
139
184
  updatedStageIds = updatedStages.map((stage)=>stage.id);
140
- updateOpts = set('data.stages', updatedStageIds, updateOpts);
185
+ updateOpts = {
186
+ ...updateOpts,
187
+ data: {
188
+ ...updateOpts.data,
189
+ stages: updatedStageIds
190
+ }
191
+ };
141
192
  }
142
193
  if (opts.data.stageRequiredToPublishName !== undefined) {
143
194
  const stages = updatedStages ?? workflow.stages;
144
195
  if (opts.data.stageRequiredToPublishName === null) {
145
- updateOpts = set('data.stageRequiredToPublish', null, updateOpts);
196
+ updateOpts = {
197
+ ...updateOpts,
198
+ data: {
199
+ ...updateOpts.data,
200
+ stageRequiredToPublish: null
201
+ }
202
+ };
146
203
  } else {
147
204
  const stageRequiredToPublish = stages.find((stage)=>stage.name === opts.data.stageRequiredToPublishName);
148
205
  if (!stageRequiredToPublish) {
149
206
  throw new errors.ApplicationError('Stage required to publish does not exist');
150
207
  }
151
- updateOpts = set('data.stageRequiredToPublish', stageRequiredToPublish.id, updateOpts);
208
+ updateOpts = {
209
+ ...updateOpts,
210
+ data: {
211
+ ...updateOpts.data,
212
+ stageRequiredToPublish: stageRequiredToPublish.id
213
+ }
214
+ };
152
215
  }
153
216
  }
154
217
  // Update (un)assigned Content Types
155
218
  if (opts.data.contentTypes) {
156
- await workflowsContentTypes.migrate({
219
+ transfers = await workflowsContentTypes.migrate({
157
220
  srcContentTypes: workflow.contentTypes,
158
221
  destContentTypes: opts.data.contentTypes,
159
222
  stageId: updatedStageIds ? updatedStageIds[0] : workflow.stages[0].id
@@ -174,6 +237,17 @@ var workflows = (({ strapi })=>{
174
237
  ]);
175
238
  return updatedWorkflow;
176
239
  });
240
+ const changes = getWorkflowChanges(toWorkflowSnapshot(workflow), toWorkflowSnapshot(updatedWorkflow));
241
+ if (Object.keys(changes).length > 0) {
242
+ await emitAudit({
243
+ strapi
244
+ }, AUDITED_EVENTS.WORKFLOW_UPDATE, {
245
+ ...toWorkflowEvent(updatedWorkflow),
246
+ changes
247
+ });
248
+ }
249
+ await emitContentTypeTransfers(transfers);
250
+ return updatedWorkflow;
177
251
  },
178
252
  /**
179
253
  * Deletes an existing workflow.
@@ -189,7 +263,7 @@ var workflows = (({ strapi })=>{
189
263
  if (workflowCount <= 1) {
190
264
  throw new errors.ApplicationError('Can not delete the last workflow');
191
265
  }
192
- return strapi.db.transaction(async ()=>{
266
+ const deletedWorkflow = await strapi.db.transaction(async ()=>{
193
267
  // Delete stages
194
268
  await stageService.deleteMany(workflow.stages);
195
269
  // Unassign all content types, this will migrate the content types to null
@@ -208,6 +282,10 @@ var workflows = (({ strapi })=>{
208
282
  await strapi.plugin('content-releases').service('release-action')?.validateActionsByContentTypes(workflow.contentTypes);
209
283
  return deletedWorkflow;
210
284
  });
285
+ await emitAudit({
286
+ strapi
287
+ }, AUDITED_EVENTS.WORKFLOW_DELETE, toWorkflowEvent(workflow));
288
+ return deletedWorkflow;
211
289
  },
212
290
  /**
213
291
  * Returns the total count of workflows.
@@ -1 +1 @@
1
- {"version":3,"file":"workflows.mjs","sources":["../../../server/src/services/workflows.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport { set, isString, map, get } from 'lodash/fp';\nimport { errors } from '@strapi/utils';\nimport { WORKFLOW_MODEL_UID, WORKFLOW_POPULATE } from '../constants/workflows';\nimport { getService } from '../utils';\nimport { getWorkflowContentTypeFilter } from '../utils/review-workflows';\nimport workflowsContentTypesFactory from './workflow-content-types';\n\nconst processFilters = ({ strapi }: { strapi: Core.Strapi }, filters: any = {}) => {\n const processedFilters = { ...filters };\n\n if (isString(filters.contentTypes)) {\n processedFilters.contentTypes = getWorkflowContentTypeFilter({ strapi }, filters.contentTypes);\n }\n\n return processedFilters;\n};\n\n// TODO: How can we improve this? Maybe using traversePopulate?\nconst processPopulate = (populate: any) => {\n // If it does not exist or it's not an object (like an array) return the default populate\n if (!populate) {\n return WORKFLOW_POPULATE;\n }\n\n return populate;\n};\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n const workflowsContentTypes = workflowsContentTypesFactory({ strapi });\n const workflowValidator = getService('validation', { strapi });\n const metrics = getService('workflow-metrics', { strapi });\n\n return {\n /**\n * Returns all the workflows matching the user-defined filters.\n * @param {object} opts - Options for the query.\n * @param {object} opts.filters - Filters object.\n * @returns {Promise<object[]>} - List of workflows that match the user's filters.\n */\n async find(opts: any = {}) {\n const filters = processFilters({ strapi }, opts.filters);\n const populate = processPopulate(opts.populate);\n\n const query = strapi.get('query-params').transform(WORKFLOW_MODEL_UID, {\n ...opts,\n filters,\n populate,\n });\n\n return strapi.db.query(WORKFLOW_MODEL_UID).findMany(query);\n },\n\n /**\n * Returns the workflow with the specified ID.\n * @param {string} id - ID of the requested workflow.\n * @param {object} opts - Options for the query.\n * @returns {Promise<object>} - Workflow object matching the requested ID.\n */\n findById(id: any, opts: { populate?: any } = {}) {\n const populate = processPopulate(opts.populate);\n\n const query = strapi.get('query-params').transform(WORKFLOW_MODEL_UID, { populate });\n\n return strapi.db.query(WORKFLOW_MODEL_UID).findOne({\n ...query,\n where: { id },\n });\n },\n\n /**\n * Creates a new workflow.\n * @param {object} opts - Options for creating the new workflow.\n * @returns {Promise<object>} - Workflow object that was just created.\n * @throws {ValidationError} - If the workflow has no stages.\n */\n async create(opts: { data: any }) {\n let createOpts = { ...opts, populate: WORKFLOW_POPULATE };\n\n workflowValidator.validateWorkflowStages(opts.data.stages);\n await workflowValidator.validateWorkflowCount(1);\n\n return strapi.db.transaction(async () => {\n // Create stages\n const stages = await getService('stages', { strapi }).createMany(opts.data.stages);\n const mapIds = map(get('id'));\n\n createOpts = set('data.stages', mapIds(stages), createOpts);\n\n if (opts.data.stageRequiredToPublishName) {\n const stageRequiredToPublish = stages.find(\n (stage: any) => stage.name === opts.data.stageRequiredToPublishName\n );\n if (!stageRequiredToPublish) {\n throw new errors.ApplicationError('Stage required to publish does not exist');\n }\n\n createOpts = set('data.stageRequiredToPublish', stageRequiredToPublish.id, createOpts);\n }\n\n // Update (un)assigned Content Types\n if (opts.data.contentTypes) {\n await workflowsContentTypes.migrate({\n destContentTypes: opts.data.contentTypes,\n stageId: stages[0].id,\n });\n }\n\n // Create Workflow\n const createdWorkflow = await strapi.db\n .query(WORKFLOW_MODEL_UID)\n .create(strapi.get('query-params').transform(WORKFLOW_MODEL_UID, createOpts));\n\n metrics.sendDidCreateWorkflow(createdWorkflow.id, !!opts.data.stageRequiredToPublishName);\n\n if (opts.data.stageRequiredToPublishName) {\n await strapi\n .plugin('content-releases')\n .service('release-action')\n ?.validateActionsByContentTypes(opts.data.contentTypes);\n }\n\n return createdWorkflow;\n });\n },\n\n /**\n * Updates an existing workflow.\n * @param {object} workflow - The existing workflow to update.\n * @param {object} opts - Options for updating the workflow.\n * @returns {Promise<object>} - Workflow object that was just updated.\n * @throws {ApplicationError} - If the supplied stage ID does not belong to the workflow.\n */\n async update(workflow: any, opts: any) {\n const stageService = getService('stages', { strapi });\n let updateOpts = { ...opts, populate: { ...WORKFLOW_POPULATE } };\n let updatedStages: any = [];\n let updatedStageIds: any;\n\n await workflowValidator.validateWorkflowCount();\n\n return strapi.db.transaction(async () => {\n // Update stages\n if (opts.data.stages) {\n workflowValidator.validateWorkflowStages(opts.data.stages);\n opts.data.stages.forEach((stage: any) =>\n this.assertStageBelongsToWorkflow(stage.id, workflow)\n );\n\n updatedStages = await stageService.replaceStages(\n workflow.stages,\n opts.data.stages,\n workflow.contentTypes\n );\n updatedStageIds = updatedStages.map((stage: any) => stage.id);\n\n updateOpts = set('data.stages', updatedStageIds, updateOpts);\n }\n\n if (opts.data.stageRequiredToPublishName !== undefined) {\n const stages = updatedStages ?? workflow.stages;\n\n if (opts.data.stageRequiredToPublishName === null) {\n updateOpts = set('data.stageRequiredToPublish', null, updateOpts);\n } else {\n const stageRequiredToPublish = stages.find(\n (stage: any) => stage.name === opts.data.stageRequiredToPublishName\n );\n\n if (!stageRequiredToPublish) {\n throw new errors.ApplicationError('Stage required to publish does not exist');\n }\n\n updateOpts = set('data.stageRequiredToPublish', stageRequiredToPublish.id, updateOpts);\n }\n }\n\n // Update (un)assigned Content Types\n if (opts.data.contentTypes) {\n await workflowsContentTypes.migrate({\n srcContentTypes: workflow.contentTypes,\n destContentTypes: opts.data.contentTypes,\n stageId: updatedStageIds ? updatedStageIds[0] : workflow.stages[0].id,\n });\n }\n\n metrics.sendDidEditWorkflow(workflow.id, !!opts.data.stageRequiredToPublishName);\n\n const query = strapi.get('query-params').transform(WORKFLOW_MODEL_UID, updateOpts);\n\n // Update Workflow\n const updatedWorkflow = await strapi.db.query(WORKFLOW_MODEL_UID).update({\n ...query,\n where: { id: workflow.id },\n });\n\n await strapi\n .plugin('content-releases')\n .service('release-action')\n ?.validateActionsByContentTypes([\n ...workflow.contentTypes,\n ...(opts.data.contentTypes || []),\n ]);\n\n return updatedWorkflow;\n });\n },\n\n /**\n * Deletes an existing workflow.\n * Also deletes all the workflow stages and migrate all assigned the content types.\n * @param {*} workflow\n * @param {*} opts\n * @returns\n */\n async delete(workflow: any, opts: any) {\n const stageService = getService('stages', { strapi });\n\n const workflowCount = await this.count();\n\n if (workflowCount <= 1) {\n throw new errors.ApplicationError('Can not delete the last workflow');\n }\n\n return strapi.db.transaction(async () => {\n // Delete stages\n await stageService.deleteMany(workflow.stages);\n\n // Unassign all content types, this will migrate the content types to null\n await workflowsContentTypes.migrate({\n srcContentTypes: workflow.contentTypes,\n destContentTypes: [],\n });\n\n const query = strapi.get('query-params').transform(WORKFLOW_MODEL_UID, opts);\n\n // Delete Workflow\n const deletedWorkflow = await strapi.db.query(WORKFLOW_MODEL_UID).delete({\n ...query,\n where: { id: workflow.id },\n });\n\n await strapi\n .plugin('content-releases')\n .service('release-action')\n ?.validateActionsByContentTypes(workflow.contentTypes);\n\n return deletedWorkflow;\n });\n },\n /**\n * Returns the total count of workflows.\n * @returns {Promise<number>} - Total count of workflows.\n */\n count() {\n return strapi.db.query(WORKFLOW_MODEL_UID).count();\n },\n\n /**\n * Finds the assigned workflow for a given content type ID.\n * @param {string} uid - Content type ID to find the assigned workflow for.\n * @param {object} opts - Options for the query.\n * @returns {Promise<object|null>} - Assigned workflow object if found, or null.\n */\n async getAssignedWorkflow(uid: any, opts: any = {}) {\n const workflows = await this._getAssignedWorkflows(uid, opts);\n\n return workflows.length > 0 ? workflows[0] : null;\n },\n\n /**\n * Finds all the assigned workflows for a given content type ID.\n * Normally, there should only be one workflow assigned to a content type.\n * However, edge cases can occur where a content type is assigned to multiple workflows.\n * @param {string} uid - Content type ID to find the assigned workflows for.\n * @param {object} opts - Options for the query.\n * @returns {Promise<object[]>} - List of assigned workflow objects.\n */\n async _getAssignedWorkflows(uid: any, opts = {}) {\n return this.find({\n ...opts,\n filters: { contentTypes: getWorkflowContentTypeFilter({ strapi }, uid) },\n });\n },\n\n /**\n * Asserts that a content type has an assigned workflow.\n * @param {string} uid - Content type ID to verify the assignment of.\n * @returns {Promise<object>} - Workflow object associated with the content type ID.\n * @throws {ApplicationError} - If no assigned workflow is found for the content type ID.\n */\n async assertContentTypeBelongsToWorkflow(uid: any) {\n const workflow = await this.getAssignedWorkflow(uid, {\n populate: 'stages',\n });\n\n if (!workflow) {\n throw new errors.ApplicationError(\n `Review workflows is not activated on Content Type ${uid}.`\n );\n }\n\n return workflow;\n },\n\n /**\n * Asserts that a stage belongs to a given workflow.\n * @param {string} stageId - ID of stage to check.\n * @param {object} workflow - Workflow object to check against.\n * @returns\n * @throws {ApplicationError} - If the stage does not belong to the specified workflow.\n */\n assertStageBelongsToWorkflow(stageId: any, workflow: any) {\n if (!stageId) {\n return;\n }\n\n const belongs = workflow.stages.some((stage: any) => stage.id === stageId);\n if (!belongs) {\n throw new errors.ApplicationError(`Stage does not belong to workflow \"${workflow.name}\"`);\n }\n },\n };\n};\n"],"names":["processFilters","strapi","filters","processedFilters","isString","contentTypes","getWorkflowContentTypeFilter","processPopulate","populate","WORKFLOW_POPULATE","workflowsContentTypes","workflowsContentTypesFactory","workflowValidator","getService","metrics","find","opts","query","get","transform","WORKFLOW_MODEL_UID","db","findMany","findById","id","findOne","where","create","createOpts","validateWorkflowStages","data","stages","validateWorkflowCount","transaction","createMany","mapIds","map","set","stageRequiredToPublishName","stageRequiredToPublish","stage","name","errors","ApplicationError","migrate","destContentTypes","stageId","createdWorkflow","sendDidCreateWorkflow","plugin","service","validateActionsByContentTypes","update","workflow","stageService","updateOpts","updatedStages","updatedStageIds","forEach","assertStageBelongsToWorkflow","replaceStages","undefined","srcContentTypes","sendDidEditWorkflow","updatedWorkflow","delete","workflowCount","count","deleteMany","deletedWorkflow","getAssignedWorkflow","uid","workflows","_getAssignedWorkflows","length","assertContentTypeBelongsToWorkflow","belongs","some"],"mappings":"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"}
1
+ {"version":3,"file":"workflows.mjs","sources":["../../../server/src/services/workflows.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport { isString, map } from 'lodash';\nimport { errors, emitAudit } from '@strapi/utils';\nimport { WORKFLOW_MODEL_UID, WORKFLOW_POPULATE } from '../constants/workflows';\nimport {\n AUDITED_EVENTS,\n getWorkflowChanges,\n toWorkflowEvent,\n toWorkflowSnapshot,\n} from '../audit-logs';\nimport { getService } from '../utils';\nimport { getWorkflowContentTypeFilter } from '../utils/review-workflows';\nimport workflowsContentTypesFactory, { type ContentTypeTransfer } from './workflow-content-types';\n\nconst processFilters = ({ strapi }: { strapi: Core.Strapi }, filters: any = {}) => {\n const processedFilters = { ...filters };\n\n if (isString(filters.contentTypes)) {\n processedFilters.contentTypes = getWorkflowContentTypeFilter({ strapi }, filters.contentTypes);\n }\n\n return processedFilters;\n};\n\n// TODO: How can we improve this? Maybe using traversePopulate?\nconst processPopulate = (populate: any) => {\n // If it does not exist or it's not an object (like an array) return the default populate\n if (!populate) {\n return WORKFLOW_POPULATE;\n }\n\n return populate;\n};\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n const workflowsContentTypes = workflowsContentTypesFactory({ strapi });\n const workflowValidator = getService('validation', { strapi });\n const metrics = getService('workflow-metrics', { strapi });\n\n const emitContentTypeTransfers = async (transfers: ContentTypeTransfer[]) => {\n for (const { workflowId, name, before, after } of transfers) {\n const changes = getWorkflowChanges(\n toWorkflowSnapshot({ id: workflowId, name, contentTypes: before }),\n toWorkflowSnapshot({ id: workflowId, name, contentTypes: after })\n );\n\n if (Object.keys(changes).length > 0) {\n await emitAudit({ strapi }, AUDITED_EVENTS.WORKFLOW_UPDATE, { workflowId, name, changes });\n }\n }\n };\n\n return {\n /**\n * Returns all the workflows matching the user-defined filters.\n * @param {object} opts - Options for the query.\n * @param {object} opts.filters - Filters object.\n * @returns {Promise<object[]>} - List of workflows that match the user's filters.\n */\n async find(opts: any = {}) {\n const filters = processFilters({ strapi }, opts.filters);\n const populate = processPopulate(opts.populate);\n\n const query = strapi.get('query-params').transform(WORKFLOW_MODEL_UID, {\n ...opts,\n filters,\n populate,\n });\n\n return strapi.db.query(WORKFLOW_MODEL_UID).findMany(query);\n },\n\n /**\n * Returns the workflow with the specified ID.\n * @param {string} id - ID of the requested workflow.\n * @param {object} opts - Options for the query.\n * @returns {Promise<object>} - Workflow object matching the requested ID.\n */\n findById(id: any, opts: { populate?: any } = {}) {\n const populate = processPopulate(opts.populate);\n\n const query = strapi.get('query-params').transform(WORKFLOW_MODEL_UID, { populate });\n\n return strapi.db.query(WORKFLOW_MODEL_UID).findOne({\n ...query,\n where: { id },\n });\n },\n\n /**\n * Creates a new workflow.\n * @param {object} opts - Options for creating the new workflow.\n * @returns {Promise<object>} - Workflow object that was just created.\n * @throws {ValidationError} - If the workflow has no stages.\n */\n async create(opts: { data: any }) {\n let createOpts = { ...opts, populate: WORKFLOW_POPULATE };\n\n workflowValidator.validateWorkflowStages(opts.data.stages);\n await workflowValidator.validateWorkflowCount(1);\n\n let transfers: ContentTypeTransfer[] = [];\n\n const createdWorkflow = await strapi.db.transaction(async () => {\n // Create stages\n const stages = await getService('stages', { strapi }).createMany(opts.data.stages);\n createOpts = { ...createOpts, data: { ...createOpts.data, stages: map(stages, 'id') } };\n\n if (opts.data.stageRequiredToPublishName) {\n const stageRequiredToPublish = stages.find(\n (stage: any) => stage.name === opts.data.stageRequiredToPublishName\n );\n if (!stageRequiredToPublish) {\n throw new errors.ApplicationError('Stage required to publish does not exist');\n }\n\n createOpts = {\n ...createOpts,\n data: { ...createOpts.data, stageRequiredToPublish: stageRequiredToPublish.id },\n };\n }\n\n // Update (un)assigned Content Types\n if (opts.data.contentTypes) {\n transfers = await workflowsContentTypes.migrate({\n destContentTypes: opts.data.contentTypes,\n stageId: stages[0].id,\n });\n }\n\n // Create Workflow\n const createdWorkflow = await strapi.db\n .query(WORKFLOW_MODEL_UID)\n .create(strapi.get('query-params').transform(WORKFLOW_MODEL_UID, createOpts));\n\n metrics.sendDidCreateWorkflow(createdWorkflow.id, !!opts.data.stageRequiredToPublishName);\n\n if (opts.data.stageRequiredToPublishName) {\n await strapi\n .plugin('content-releases')\n .service('release-action')\n ?.validateActionsByContentTypes(opts.data.contentTypes);\n }\n\n return createdWorkflow;\n });\n\n const { contentTypes, stages, stageRequiredToPublish } = toWorkflowSnapshot(createdWorkflow);\n await emitAudit({ strapi }, AUDITED_EVENTS.WORKFLOW_CREATE, {\n ...toWorkflowEvent(createdWorkflow),\n contentTypes,\n stages,\n stageRequiredToPublish,\n });\n await emitContentTypeTransfers(transfers);\n\n return createdWorkflow;\n },\n\n /**\n * Updates an existing workflow.\n * @param {object} workflow - The existing workflow to update.\n * @param {object} opts - Options for updating the workflow.\n * @returns {Promise<object>} - Workflow object that was just updated.\n * @throws {ApplicationError} - If the supplied stage ID does not belong to the workflow.\n */\n async update(workflow: any, opts: any) {\n const stageService = getService('stages', { strapi });\n let updateOpts = { ...opts, populate: { ...WORKFLOW_POPULATE } };\n let updatedStages: any = [];\n let updatedStageIds: any;\n\n await workflowValidator.validateWorkflowCount();\n\n let transfers: ContentTypeTransfer[] = [];\n\n const updatedWorkflow = await strapi.db.transaction(async () => {\n // Update stages\n if (opts.data.stages) {\n workflowValidator.validateWorkflowStages(opts.data.stages);\n opts.data.stages.forEach((stage: any) =>\n this.assertStageBelongsToWorkflow(stage.id, workflow)\n );\n\n updatedStages = await stageService.replaceStages(\n workflow.stages,\n opts.data.stages,\n workflow.contentTypes\n );\n updatedStageIds = updatedStages.map((stage: any) => stage.id);\n\n updateOpts = { ...updateOpts, data: { ...updateOpts.data, stages: updatedStageIds } };\n }\n\n if (opts.data.stageRequiredToPublishName !== undefined) {\n const stages = updatedStages ?? workflow.stages;\n\n if (opts.data.stageRequiredToPublishName === null) {\n updateOpts = {\n ...updateOpts,\n data: { ...updateOpts.data, stageRequiredToPublish: null },\n };\n } else {\n const stageRequiredToPublish = stages.find(\n (stage: any) => stage.name === opts.data.stageRequiredToPublishName\n );\n\n if (!stageRequiredToPublish) {\n throw new errors.ApplicationError('Stage required to publish does not exist');\n }\n\n updateOpts = {\n ...updateOpts,\n data: { ...updateOpts.data, stageRequiredToPublish: stageRequiredToPublish.id },\n };\n }\n }\n\n // Update (un)assigned Content Types\n if (opts.data.contentTypes) {\n transfers = await workflowsContentTypes.migrate({\n srcContentTypes: workflow.contentTypes,\n destContentTypes: opts.data.contentTypes,\n stageId: updatedStageIds ? updatedStageIds[0] : workflow.stages[0].id,\n });\n }\n\n metrics.sendDidEditWorkflow(workflow.id, !!opts.data.stageRequiredToPublishName);\n\n const query = strapi.get('query-params').transform(WORKFLOW_MODEL_UID, updateOpts);\n\n // Update Workflow\n const updatedWorkflow = await strapi.db.query(WORKFLOW_MODEL_UID).update({\n ...query,\n where: { id: workflow.id },\n });\n\n await strapi\n .plugin('content-releases')\n .service('release-action')\n ?.validateActionsByContentTypes([\n ...workflow.contentTypes,\n ...(opts.data.contentTypes || []),\n ]);\n\n return updatedWorkflow;\n });\n\n const changes = getWorkflowChanges(\n toWorkflowSnapshot(workflow),\n toWorkflowSnapshot(updatedWorkflow)\n );\n\n if (Object.keys(changes).length > 0) {\n await emitAudit({ strapi }, AUDITED_EVENTS.WORKFLOW_UPDATE, {\n ...toWorkflowEvent(updatedWorkflow),\n changes,\n });\n }\n await emitContentTypeTransfers(transfers);\n\n return updatedWorkflow;\n },\n\n /**\n * Deletes an existing workflow.\n * Also deletes all the workflow stages and migrate all assigned the content types.\n * @param {*} workflow\n * @param {*} opts\n * @returns\n */\n async delete(workflow: any, opts: any) {\n const stageService = getService('stages', { strapi });\n\n const workflowCount = await this.count();\n\n if (workflowCount <= 1) {\n throw new errors.ApplicationError('Can not delete the last workflow');\n }\n\n const deletedWorkflow = await strapi.db.transaction(async () => {\n // Delete stages\n await stageService.deleteMany(workflow.stages);\n\n // Unassign all content types, this will migrate the content types to null\n await workflowsContentTypes.migrate({\n srcContentTypes: workflow.contentTypes,\n destContentTypes: [],\n });\n\n const query = strapi.get('query-params').transform(WORKFLOW_MODEL_UID, opts);\n\n // Delete Workflow\n const deletedWorkflow = await strapi.db.query(WORKFLOW_MODEL_UID).delete({\n ...query,\n where: { id: workflow.id },\n });\n\n await strapi\n .plugin('content-releases')\n .service('release-action')\n ?.validateActionsByContentTypes(workflow.contentTypes);\n\n return deletedWorkflow;\n });\n\n await emitAudit({ strapi }, AUDITED_EVENTS.WORKFLOW_DELETE, toWorkflowEvent(workflow));\n\n return deletedWorkflow;\n },\n\n /**\n * Returns the total count of workflows.\n * @returns {Promise<number>} - Total count of workflows.\n */\n count() {\n return strapi.db.query(WORKFLOW_MODEL_UID).count();\n },\n\n /**\n * Finds the assigned workflow for a given content type ID.\n * @param {string} uid - Content type ID to find the assigned workflow for.\n * @param {object} opts - Options for the query.\n * @returns {Promise<object|null>} - Assigned workflow object if found, or null.\n */\n async getAssignedWorkflow(uid: any, opts: any = {}) {\n const workflows = await this._getAssignedWorkflows(uid, opts);\n\n return workflows.length > 0 ? workflows[0] : null;\n },\n\n /**\n * Finds all the assigned workflows for a given content type ID.\n * Normally, there should only be one workflow assigned to a content type.\n * However, edge cases can occur where a content type is assigned to multiple workflows.\n * @param {string} uid - Content type ID to find the assigned workflows for.\n * @param {object} opts - Options for the query.\n * @returns {Promise<object[]>} - List of assigned workflow objects.\n */\n async _getAssignedWorkflows(uid: any, opts = {}) {\n return this.find({\n ...opts,\n filters: { contentTypes: getWorkflowContentTypeFilter({ strapi }, uid) },\n });\n },\n\n /**\n * Asserts that a content type has an assigned workflow.\n * @param {string} uid - Content type ID to verify the assignment of.\n * @returns {Promise<object>} - Workflow object associated with the content type ID.\n * @throws {ApplicationError} - If no assigned workflow is found for the content type ID.\n */\n async assertContentTypeBelongsToWorkflow(uid: any) {\n const workflow = await this.getAssignedWorkflow(uid, {\n populate: 'stages',\n });\n\n if (!workflow) {\n throw new errors.ApplicationError(\n `Review workflows is not activated on Content Type ${uid}.`\n );\n }\n\n return workflow;\n },\n\n /**\n * Asserts that a stage belongs to a given workflow.\n * @param {string} stageId - ID of stage to check.\n * @param {object} workflow - Workflow object to check against.\n * @returns\n * @throws {ApplicationError} - If the stage does not belong to the specified workflow.\n */\n assertStageBelongsToWorkflow(stageId: any, workflow: any) {\n if (!stageId) {\n return;\n }\n\n const belongs = workflow.stages.some((stage: any) => stage.id === stageId);\n if (!belongs) {\n throw new errors.ApplicationError(`Stage does not belong to workflow \"${workflow.name}\"`);\n }\n },\n };\n};\n"],"names":["processFilters","strapi","filters","processedFilters","isString","contentTypes","getWorkflowContentTypeFilter","processPopulate","populate","WORKFLOW_POPULATE","workflowsContentTypes","workflowsContentTypesFactory","workflowValidator","getService","metrics","emitContentTypeTransfers","transfers","workflowId","name","before","after","changes","getWorkflowChanges","toWorkflowSnapshot","Object","keys","length","emitAudit","AUDITED_EVENTS","WORKFLOW_UPDATE","find","opts","query","get","transform","WORKFLOW_MODEL_UID","db","findMany","findById","id","findOne","where","create","createOpts","validateWorkflowStages","data","stages","validateWorkflowCount","createdWorkflow","transaction","createMany","map","stageRequiredToPublishName","stageRequiredToPublish","stage","errors","ApplicationError","migrate","destContentTypes","stageId","sendDidCreateWorkflow","plugin","service","validateActionsByContentTypes","WORKFLOW_CREATE","toWorkflowEvent","update","workflow","stageService","updateOpts","updatedStages","updatedStageIds","updatedWorkflow","forEach","assertStageBelongsToWorkflow","replaceStages","undefined","srcContentTypes","sendDidEditWorkflow","delete","workflowCount","count","deletedWorkflow","deleteMany","WORKFLOW_DELETE","getAssignedWorkflow","uid","workflows","_getAssignedWorkflows","assertContentTypeBelongsToWorkflow","belongs","some"],"mappings":"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"}