@strapi/review-workflows 5.59.0 → 5.61.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 (61) hide show
  1. package/dist/admin/components/Widgets.js +5 -1
  2. package/dist/admin/components/Widgets.js.map +1 -1
  3. package/dist/admin/components/Widgets.mjs +5 -1
  4. package/dist/admin/components/Widgets.mjs.map +1 -1
  5. package/dist/admin/routes/content-manager/model/components/StageFilter.js +1 -1
  6. package/dist/admin/routes/content-manager/model/components/StageFilter.js.map +1 -1
  7. package/dist/admin/routes/content-manager/model/components/StageFilter.mjs +1 -1
  8. package/dist/admin/routes/content-manager/model/components/StageFilter.mjs.map +1 -1
  9. package/dist/admin/routes/content-manager/model/components/TableColumns.js.map +1 -1
  10. package/dist/admin/routes/content-manager/model/components/TableColumns.mjs.map +1 -1
  11. package/dist/admin/routes/content-manager/model/constants.js +2 -2
  12. package/dist/admin/routes/content-manager/model/constants.js.map +1 -1
  13. package/dist/admin/routes/content-manager/model/constants.mjs +2 -2
  14. package/dist/admin/routes/content-manager/model/constants.mjs.map +1 -1
  15. package/dist/admin/routes/settings/index.js +1 -1
  16. package/dist/admin/routes/settings/index.js.map +1 -1
  17. package/dist/admin/routes/settings/index.mjs +1 -1
  18. package/dist/admin/routes/settings/index.mjs.map +1 -1
  19. package/dist/admin/src/routes/content-manager/model/components/TableColumns.d.ts +1 -6
  20. package/dist/server/constants/workflows.js +2 -1
  21. package/dist/server/constants/workflows.js.map +1 -1
  22. package/dist/server/constants/workflows.mjs +2 -1
  23. package/dist/server/constants/workflows.mjs.map +1 -1
  24. package/dist/server/controllers/stages.js +3 -0
  25. package/dist/server/controllers/stages.js.map +1 -1
  26. package/dist/server/controllers/stages.mjs +3 -0
  27. package/dist/server/controllers/stages.mjs.map +1 -1
  28. package/dist/server/services/document-service-middleware.js +29 -2
  29. package/dist/server/services/document-service-middleware.js.map +1 -1
  30. package/dist/server/services/document-service-middleware.mjs +29 -2
  31. package/dist/server/services/document-service-middleware.mjs.map +1 -1
  32. package/dist/server/services/stages.js +32 -14
  33. package/dist/server/services/stages.js.map +1 -1
  34. package/dist/server/services/stages.mjs +32 -14
  35. package/dist/server/services/stages.mjs.map +1 -1
  36. package/dist/server/services/workflow-content-types.js +7 -1
  37. package/dist/server/services/workflow-content-types.js.map +1 -1
  38. package/dist/server/services/workflow-content-types.mjs +7 -1
  39. package/dist/server/services/workflow-content-types.mjs.map +1 -1
  40. package/dist/server/services/workflows.js +48 -4
  41. package/dist/server/services/workflows.js.map +1 -1
  42. package/dist/server/services/workflows.mjs +49 -5
  43. package/dist/server/services/workflows.mjs.map +1 -1
  44. package/dist/server/src/constants/workflows.d.ts +1 -0
  45. package/dist/server/src/constants/workflows.d.ts.map +1 -1
  46. package/dist/server/src/controllers/index.d.ts +1 -1
  47. package/dist/server/src/controllers/stages.d.ts +1 -1
  48. package/dist/server/src/controllers/stages.d.ts.map +1 -1
  49. package/dist/server/src/index.d.ts +4 -4
  50. package/dist/server/src/index.d.ts.map +1 -1
  51. package/dist/server/src/services/document-service-middleware.d.ts.map +1 -1
  52. package/dist/server/src/services/index.d.ts +3 -3
  53. package/dist/server/src/services/index.d.ts.map +1 -1
  54. package/dist/server/src/services/stages.d.ts +3 -4
  55. package/dist/server/src/services/stages.d.ts.map +1 -1
  56. package/dist/server/src/services/workflow-content-types.d.ts.map +1 -1
  57. package/dist/server/src/services/workflows.d.ts +2 -1
  58. package/dist/server/src/services/workflows.d.ts.map +1 -1
  59. package/dist/shared/contracts/homepage.d.ts +5 -1
  60. package/dist/shared/contracts/homepage.d.ts.map +1 -1
  61. package/package.json +8 -8
@@ -1 +1 @@
1
- {"version":3,"file":"workflow-content-types.mjs","sources":["../../../server/src/services/workflow-content-types.ts"],"sourcesContent":["import type { Core, Data } from '@strapi/types';\nimport { async } from '@strapi/utils';\nimport { merge, difference } from 'lodash';\nimport { getService } from '../utils';\nimport { WORKFLOW_MODEL_UID } from '../constants/workflows';\n\n/** A workflow that lost content types to another one, as read after the write. */\nexport interface ContentTypeTransfer {\n workflowId: Data.ID;\n name: string;\n before: string[];\n after: string[];\n}\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n const contentManagerContentTypeService = strapi\n .plugin('content-manager')\n .service('content-types');\n const stagesService = getService('stages', { strapi });\n\n const updateContentTypeConfig = async (uid: any, reviewWorkflowOption: any) => {\n // Merge options in the configuration as the configuration service use a destructuration merge which doesn't include nested objects\n const modelConfig = await contentManagerContentTypeService.findConfiguration(uid);\n\n await contentManagerContentTypeService.updateConfiguration(\n { uid },\n { options: merge({}, modelConfig.options, { reviewWorkflows: reviewWorkflowOption }) }\n );\n };\n\n return {\n /**\n * Migrates entities stages. Used when a content type is assigned to a workflow.\n * @param {*} options\n * @param {Array<string>} options.srcContentTypes - The content types assigned to the previous workflow\n * @param {Array<string>} options.destContentTypes - The content types assigned to the new workflow\n * @param {Workflow.Stage} options.stageId - The new stage to assign the entities to\n */\n async migrate({\n srcContentTypes = [],\n destContentTypes,\n stageId,\n }: any): Promise<ContentTypeTransfer[]> {\n const workflowsService = getService('workflows', { strapi });\n const { created, deleted } = diffContentTypes(srcContentTypes, destContentTypes);\n const transfers = new Map<Data.ID, ContentTypeTransfer>();\n\n await async.map(\n created,\n async (uid: any) => {\n // Content Types should only be assigned to one workflow\n // However, edge cases can happen, and this handles them\n const srcWorkflows = await workflowsService._getAssignedWorkflows(uid, {});\n\n if (srcWorkflows.length) {\n // Updates all existing entities stages links to the new stage\n await stagesService.updateEntitiesStage(uid, { toStageId: stageId });\n // Transfer content types from the previous workflow(s)\n await async.map(srcWorkflows, async (srcWorkflow: any) => {\n const transfer = await this.transferContentTypes(srcWorkflow, uid);\n const previous = transfers.get(transfer.workflowId);\n transfers.set(transfer.workflowId, {\n ...transfer,\n before: previous?.before ?? transfer.before,\n });\n });\n }\n await updateContentTypeConfig(uid, true);\n\n // Create new stages links to the new stage\n return stagesService.updateEntitiesStage(uid, {\n fromStageId: null,\n toStageId: stageId,\n });\n },\n // transferContentTypes can cause race conditions if called in parallel when updating the same workflow\n { concurrency: 1 }\n );\n\n await async.map(deleted, async (uid: any) => {\n await updateContentTypeConfig(uid, false);\n await stagesService.deleteAllEntitiesStage(uid, {});\n });\n\n return [...transfers.values()];\n },\n\n /**\n * Filters the content types assigned to a workflow\n * @param {Workflow} srcWorkflow - The workflow to transfer from\n * @param {string} uid - The content type uid\n */\n async transferContentTypes(srcWorkflow: any, uid: any): Promise<ContentTypeTransfer> {\n // Update assignedContentTypes of the previous workflow\n const updated = await strapi.db.query(WORKFLOW_MODEL_UID).update({\n where: {\n id: srcWorkflow.id,\n },\n data: {\n contentTypes: srcWorkflow.contentTypes.filter((contentType: any) => contentType !== uid),\n },\n });\n\n return {\n workflowId: updated.id,\n name: updated.name,\n before: srcWorkflow.contentTypes,\n after: updated.contentTypes,\n };\n },\n };\n};\n\nconst diffContentTypes = (srcContentTypes: any, destContentTypes: any) => {\n const created = difference(destContentTypes, srcContentTypes);\n const deleted = difference(srcContentTypes, destContentTypes);\n return { created, deleted };\n};\n"],"names":["strapi","contentManagerContentTypeService","plugin","service","stagesService","getService","updateContentTypeConfig","uid","reviewWorkflowOption","modelConfig","findConfiguration","updateConfiguration","options","merge","reviewWorkflows","migrate","srcContentTypes","destContentTypes","stageId","workflowsService","created","deleted","diffContentTypes","transfers","Map","async","map","srcWorkflows","_getAssignedWorkflows","length","updateEntitiesStage","toStageId","srcWorkflow","transfer","transferContentTypes","previous","get","workflowId","set","before","fromStageId","concurrency","deleteAllEntitiesStage","values","updated","db","query","WORKFLOW_MODEL_UID","update","where","id","data","contentTypes","filter","contentType","name","after","difference"],"mappings":"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"}
1
+ {"version":3,"file":"workflow-content-types.mjs","sources":["../../../server/src/services/workflow-content-types.ts"],"sourcesContent":["import type { Core, Data, UID } from '@strapi/types';\nimport { async } from '@strapi/utils';\nimport { merge, difference } from 'lodash';\nimport { getService } from '../utils';\nimport { WORKFLOW_MODEL_UID } from '../constants/workflows';\n\n/** A workflow that lost content types to another one, as read after the write. */\nexport interface ContentTypeTransfer {\n workflowId: Data.ID;\n name: string;\n before: string[];\n after: string[];\n}\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n const contentManagerContentTypeService = strapi\n .plugin('content-manager')\n .service('content-types');\n const stagesService = getService('stages', { strapi });\n\n const updateContentTypeConfig = async (uid: UID.ContentType, reviewWorkflowOption: boolean) => {\n // Merge options in the configuration as the configuration service use a destructuration merge which doesn't include nested objects\n const modelConfig = await contentManagerContentTypeService.findConfiguration({ uid });\n\n await contentManagerContentTypeService.updateConfiguration(\n { uid },\n { options: merge({}, modelConfig.options, { reviewWorkflows: reviewWorkflowOption }) }\n );\n };\n\n return {\n /**\n * Migrates entities stages. Used when a content type is assigned to a workflow.\n * @param {*} options\n * @param {Array<string>} options.srcContentTypes - The content types assigned to the previous workflow\n * @param {Array<string>} options.destContentTypes - The content types assigned to the new workflow\n * @param {Workflow.Stage} options.stageId - The new stage to assign the entities to\n */\n async migrate({\n srcContentTypes = [],\n destContentTypes,\n stageId,\n }: any): Promise<ContentTypeTransfer[]> {\n const workflowsService = getService('workflows', { strapi });\n const { created, deleted } = diffContentTypes(srcContentTypes, destContentTypes);\n const transfers = new Map<Data.ID, ContentTypeTransfer>();\n\n await async.map(\n created,\n async (uid: any) => {\n // Content Types should only be assigned to one workflow\n // However, edge cases can happen, and this handles them\n const srcWorkflows = await workflowsService._getAssignedWorkflows(uid, {});\n\n if (srcWorkflows.length) {\n // Updates all existing entities stages links to the new stage\n await stagesService.updateEntitiesStage(uid, { toStageId: stageId });\n // Transfer content types from the previous workflow(s)\n await async.map(srcWorkflows, async (srcWorkflow: any) => {\n const transfer = await this.transferContentTypes(srcWorkflow, uid);\n const previous = transfers.get(transfer.workflowId);\n transfers.set(transfer.workflowId, {\n ...transfer,\n before: previous?.before ?? transfer.before,\n });\n });\n }\n await updateContentTypeConfig(uid, true);\n\n // Create new stages links to the new stage\n return stagesService.updateEntitiesStage(uid, {\n fromStageId: null,\n toStageId: stageId,\n });\n },\n // transferContentTypes can cause race conditions if called in parallel when updating the same workflow\n { concurrency: 1 }\n );\n\n await async.map(deleted, async (uid: any) => {\n // A stored UID can outlive its model, which leaves no configuration or stage links to clean up\n if (strapi.db.metadata.has(uid) === false) {\n return;\n }\n\n await updateContentTypeConfig(uid, false);\n await stagesService.deleteAllEntitiesStage(uid, {});\n });\n\n return [...transfers.values()];\n },\n\n /**\n * Filters the content types assigned to a workflow\n * @param {Workflow} srcWorkflow - The workflow to transfer from\n * @param {string} uid - The content type uid\n */\n async transferContentTypes(srcWorkflow: any, uid: any): Promise<ContentTypeTransfer> {\n // Update assignedContentTypes of the previous workflow\n const updated = await strapi.db.query(WORKFLOW_MODEL_UID).update({\n where: {\n id: srcWorkflow.id,\n },\n data: {\n contentTypes: srcWorkflow.contentTypes.filter((contentType: any) => contentType !== uid),\n },\n });\n\n return {\n workflowId: updated.id,\n name: updated.name,\n before: srcWorkflow.contentTypes,\n after: updated.contentTypes,\n };\n },\n };\n};\n\nconst diffContentTypes = (srcContentTypes: any, destContentTypes: any) => {\n const created = difference(destContentTypes, srcContentTypes);\n const deleted = difference(srcContentTypes, destContentTypes);\n return { created, deleted };\n};\n"],"names":["strapi","contentManagerContentTypeService","plugin","service","stagesService","getService","updateContentTypeConfig","uid","reviewWorkflowOption","modelConfig","findConfiguration","updateConfiguration","options","merge","reviewWorkflows","migrate","srcContentTypes","destContentTypes","stageId","workflowsService","created","deleted","diffContentTypes","transfers","Map","async","map","srcWorkflows","_getAssignedWorkflows","length","updateEntitiesStage","toStageId","srcWorkflow","transfer","transferContentTypes","previous","get","workflowId","set","before","fromStageId","concurrency","db","metadata","has","deleteAllEntitiesStage","values","updated","query","WORKFLOW_MODEL_UID","update","where","id","data","contentTypes","filter","contentType","name","after","difference"],"mappings":"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"}
@@ -57,6 +57,42 @@ var workflows = (({ strapi })=>{
57
57
  }
58
58
  }
59
59
  };
60
+ /**
61
+ * The `unique` attribute option is not enforced by `db.query`, so the name is checked here.
62
+ * @param {string} name - Workflow name to check.
63
+ * @param {number} [workflowId] - ID of the workflow being updated, excluded from the check.
64
+ * @throws {ValidationError} - If another workflow already uses the name.
65
+ */ const assertWorkflowNameIsUnique = async (name, workflowId)=>{
66
+ const where = workflowId === undefined ? {
67
+ name
68
+ } : {
69
+ name,
70
+ id: {
71
+ $ne: workflowId
72
+ }
73
+ };
74
+ const existingWorkflow = await strapi.db.query(workflows$1.WORKFLOW_MODEL_UID).findOne({
75
+ select: [
76
+ 'id'
77
+ ],
78
+ where
79
+ });
80
+ if (existingWorkflow !== null) {
81
+ // Same details shape as a yup error, so the admin form shows the message on the name field
82
+ throw new utils.errors.ValidationError(workflows$1.ERRORS.DUPLICATED_WORKFLOW_NAME, {
83
+ errors: [
84
+ {
85
+ path: [
86
+ 'name'
87
+ ],
88
+ message: workflows$1.ERRORS.DUPLICATED_WORKFLOW_NAME,
89
+ name: 'ValidationError',
90
+ value: name
91
+ }
92
+ ]
93
+ });
94
+ }
95
+ };
60
96
  return {
61
97
  /**
62
98
  * Returns all the workflows matching the user-defined filters.
@@ -96,7 +132,7 @@ var workflows = (({ strapi })=>{
96
132
  * Creates a new workflow.
97
133
  * @param {object} opts - Options for creating the new workflow.
98
134
  * @returns {Promise<object>} - Workflow object that was just created, populated with `WORKFLOW_POPULATE`.
99
- * @throws {ValidationError} - If the workflow has no stages.
135
+ * @throws {ValidationError} - If the workflow has no stages or its name is already used.
100
136
  */ async create (opts) {
101
137
  let createOpts = {
102
138
  ...opts,
@@ -104,6 +140,9 @@ var workflows = (({ strapi })=>{
104
140
  };
105
141
  workflowValidator.validateWorkflowStages(opts.data.stages);
106
142
  await workflowValidator.validateWorkflowCount(1);
143
+ if (opts.data.name !== undefined) {
144
+ await assertWorkflowNameIsUnique(opts.data.name);
145
+ }
107
146
  let transfers = [];
108
147
  const createdWorkflow = await strapi.db.transaction(async ()=>{
109
148
  // Create stages
@@ -163,6 +202,7 @@ var workflows = (({ strapi })=>{
163
202
  * @param {object} opts - Options for updating the workflow.
164
203
  * @returns {Promise<object>} - Workflow object that was just updated, populated with `WORKFLOW_POPULATE`.
165
204
  * @throws {ApplicationError} - If the supplied stage ID does not belong to the workflow.
205
+ * @throws {ValidationError} - If the new name is already used by another workflow.
166
206
  */ async update (workflow, opts) {
167
207
  const stageService = index.getService('stages', {
168
208
  strapi
@@ -173,17 +213,21 @@ var workflows = (({ strapi })=>{
173
213
  ...workflows$1.WORKFLOW_POPULATE
174
214
  }
175
215
  };
176
- let updatedStages = [];
216
+ let updatedStages;
177
217
  let updatedStageIds;
178
218
  await workflowValidator.validateWorkflowCount();
219
+ if (opts.data.name !== undefined && opts.data.name !== workflow.name) {
220
+ await assertWorkflowNameIsUnique(opts.data.name, workflow.id);
221
+ }
179
222
  let transfers = [];
180
223
  const updatedWorkflow = await strapi.db.transaction(async ()=>{
181
224
  // Update stages
182
225
  if (opts.data.stages) {
183
226
  workflowValidator.validateWorkflowStages(opts.data.stages);
184
227
  opts.data.stages.forEach((stage)=>this.assertStageBelongsToWorkflow(stage.id, workflow));
185
- updatedStages = await stageService.replaceStages(workflow.stages, opts.data.stages, workflow.contentTypes);
186
- updatedStageIds = updatedStages.map((stage)=>stage.id);
228
+ const replacedStages = await stageService.replaceStages(workflow.stages, opts.data.stages, workflow.contentTypes);
229
+ updatedStages = replacedStages;
230
+ updatedStageIds = replacedStages.map((stage)=>stage.id);
187
231
  updateOpts = {
188
232
  ...updateOpts,
189
233
  data: {
@@ -1 +1 @@
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, populated with `WORKFLOW_POPULATE`.\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, populated with `WORKFLOW_POPULATE`.\n * @throws {ApplicationError} - If the supplied stage ID does not belong to the workflow.\n */\n async update(workflow: any, opts: { data: 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
+ {"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 { ERRORS, WORKFLOW_MODEL_UID, WORKFLOW_POPULATE } from '../constants/workflows';\nimport {\n AUDITED_EVENTS,\n getWorkflowChanges,\n toWorkflowEvent,\n toWorkflowSnapshot,\n} from '../audit-logs';\nimport type { Stage } from '../../../shared/contracts/review-workflows';\nimport { getService } from '../utils';\nimport { getWorkflowContentTypeFilter } from '../utils/review-workflows';\nimport workflowsContentTypesFactory, { type ContentTypeTransfer } from './workflow-content-types';\n\n// `replaceStages` returns the input stages with their ids filled in, not full stage entities\ntype ReplacedStage = Pick<Stage, 'id' | 'name'>;\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 /**\n * The `unique` attribute option is not enforced by `db.query`, so the name is checked here.\n * @param {string} name - Workflow name to check.\n * @param {number} [workflowId] - ID of the workflow being updated, excluded from the check.\n * @throws {ValidationError} - If another workflow already uses the name.\n */\n const assertWorkflowNameIsUnique = async (name: string, workflowId?: number) => {\n const where = workflowId === undefined ? { name } : { name, id: { $ne: workflowId } };\n const existingWorkflow = await strapi.db\n .query(WORKFLOW_MODEL_UID)\n .findOne({ select: ['id'], where });\n\n if (existingWorkflow !== null) {\n // Same details shape as a yup error, so the admin form shows the message on the name field\n throw new errors.ValidationError(ERRORS.DUPLICATED_WORKFLOW_NAME, {\n errors: [\n {\n path: ['name'],\n message: ERRORS.DUPLICATED_WORKFLOW_NAME,\n name: 'ValidationError',\n value: name,\n },\n ],\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, populated with `WORKFLOW_POPULATE`.\n * @throws {ValidationError} - If the workflow has no stages or its name is already used.\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 if (opts.data.name !== undefined) {\n await assertWorkflowNameIsUnique(opts.data.name);\n }\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, populated with `WORKFLOW_POPULATE`.\n * @throws {ApplicationError} - If the supplied stage ID does not belong to the workflow.\n * @throws {ValidationError} - If the new name is already used by another workflow.\n */\n async update(workflow: any, opts: { data: any }) {\n const stageService = getService('stages', { strapi });\n let updateOpts = { ...opts, populate: { ...WORKFLOW_POPULATE } };\n let updatedStages: ReplacedStage[] | undefined;\n let updatedStageIds: any;\n\n await workflowValidator.validateWorkflowCount();\n\n if (opts.data.name !== undefined && opts.data.name !== workflow.name) {\n await assertWorkflowNameIsUnique(opts.data.name, workflow.id);\n }\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 const replacedStages: ReplacedStage[] = await stageService.replaceStages(\n workflow.stages,\n opts.data.stages,\n workflow.contentTypes\n );\n updatedStages = replacedStages;\n updatedStageIds = replacedStages.map((stage) => 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","assertWorkflowNameIsUnique","where","undefined","id","$ne","existingWorkflow","db","query","WORKFLOW_MODEL_UID","findOne","select","errors","ValidationError","ERRORS","DUPLICATED_WORKFLOW_NAME","path","message","value","find","opts","get","transform","findMany","findById","create","createOpts","validateWorkflowStages","data","stages","validateWorkflowCount","createdWorkflow","transaction","createMany","map","stageRequiredToPublishName","stageRequiredToPublish","stage","ApplicationError","migrate","destContentTypes","stageId","sendDidCreateWorkflow","plugin","service","validateActionsByContentTypes","WORKFLOW_CREATE","toWorkflowEvent","update","workflow","stageService","updateOpts","updatedStages","updatedStageIds","updatedWorkflow","forEach","assertStageBelongsToWorkflow","replacedStages","replaceStages","srcContentTypes","sendDidEditWorkflow","delete","workflowCount","count","deletedWorkflow","deleteMany","WORKFLOW_DELETE","getAssignedWorkflow","uid","workflows","_getAssignedWorkflows","assertContentTypeBelongsToWorkflow","belongs","some"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { map, isString } from 'lodash';
2
2
  import { errors, emitAudit } from '@strapi/utils';
3
- import { WORKFLOW_MODEL_UID, WORKFLOW_POPULATE } from '../constants/workflows.mjs';
3
+ import { WORKFLOW_MODEL_UID, WORKFLOW_POPULATE, ERRORS } from '../constants/workflows.mjs';
4
4
  import { AUDITED_EVENTS, toWorkflowEvent, getWorkflowChanges, toWorkflowSnapshot } from '../audit-logs.mjs';
5
5
  import { getService } from '../utils/index.mjs';
6
6
  import { getWorkflowContentTypeFilter } from '../utils/review-workflows.mjs';
@@ -55,6 +55,42 @@ var workflows = (({ strapi })=>{
55
55
  }
56
56
  }
57
57
  };
58
+ /**
59
+ * The `unique` attribute option is not enforced by `db.query`, so the name is checked here.
60
+ * @param {string} name - Workflow name to check.
61
+ * @param {number} [workflowId] - ID of the workflow being updated, excluded from the check.
62
+ * @throws {ValidationError} - If another workflow already uses the name.
63
+ */ const assertWorkflowNameIsUnique = async (name, workflowId)=>{
64
+ const where = workflowId === undefined ? {
65
+ name
66
+ } : {
67
+ name,
68
+ id: {
69
+ $ne: workflowId
70
+ }
71
+ };
72
+ const existingWorkflow = await strapi.db.query(WORKFLOW_MODEL_UID).findOne({
73
+ select: [
74
+ 'id'
75
+ ],
76
+ where
77
+ });
78
+ if (existingWorkflow !== null) {
79
+ // Same details shape as a yup error, so the admin form shows the message on the name field
80
+ throw new errors.ValidationError(ERRORS.DUPLICATED_WORKFLOW_NAME, {
81
+ errors: [
82
+ {
83
+ path: [
84
+ 'name'
85
+ ],
86
+ message: ERRORS.DUPLICATED_WORKFLOW_NAME,
87
+ name: 'ValidationError',
88
+ value: name
89
+ }
90
+ ]
91
+ });
92
+ }
93
+ };
58
94
  return {
59
95
  /**
60
96
  * Returns all the workflows matching the user-defined filters.
@@ -94,7 +130,7 @@ var workflows = (({ strapi })=>{
94
130
  * Creates a new workflow.
95
131
  * @param {object} opts - Options for creating the new workflow.
96
132
  * @returns {Promise<object>} - Workflow object that was just created, populated with `WORKFLOW_POPULATE`.
97
- * @throws {ValidationError} - If the workflow has no stages.
133
+ * @throws {ValidationError} - If the workflow has no stages or its name is already used.
98
134
  */ async create (opts) {
99
135
  let createOpts = {
100
136
  ...opts,
@@ -102,6 +138,9 @@ var workflows = (({ strapi })=>{
102
138
  };
103
139
  workflowValidator.validateWorkflowStages(opts.data.stages);
104
140
  await workflowValidator.validateWorkflowCount(1);
141
+ if (opts.data.name !== undefined) {
142
+ await assertWorkflowNameIsUnique(opts.data.name);
143
+ }
105
144
  let transfers = [];
106
145
  const createdWorkflow = await strapi.db.transaction(async ()=>{
107
146
  // Create stages
@@ -161,6 +200,7 @@ var workflows = (({ strapi })=>{
161
200
  * @param {object} opts - Options for updating the workflow.
162
201
  * @returns {Promise<object>} - Workflow object that was just updated, populated with `WORKFLOW_POPULATE`.
163
202
  * @throws {ApplicationError} - If the supplied stage ID does not belong to the workflow.
203
+ * @throws {ValidationError} - If the new name is already used by another workflow.
164
204
  */ async update (workflow, opts) {
165
205
  const stageService = getService('stages', {
166
206
  strapi
@@ -171,17 +211,21 @@ var workflows = (({ strapi })=>{
171
211
  ...WORKFLOW_POPULATE
172
212
  }
173
213
  };
174
- let updatedStages = [];
214
+ let updatedStages;
175
215
  let updatedStageIds;
176
216
  await workflowValidator.validateWorkflowCount();
217
+ if (opts.data.name !== undefined && opts.data.name !== workflow.name) {
218
+ await assertWorkflowNameIsUnique(opts.data.name, workflow.id);
219
+ }
177
220
  let transfers = [];
178
221
  const updatedWorkflow = await strapi.db.transaction(async ()=>{
179
222
  // Update stages
180
223
  if (opts.data.stages) {
181
224
  workflowValidator.validateWorkflowStages(opts.data.stages);
182
225
  opts.data.stages.forEach((stage)=>this.assertStageBelongsToWorkflow(stage.id, workflow));
183
- updatedStages = await stageService.replaceStages(workflow.stages, opts.data.stages, workflow.contentTypes);
184
- updatedStageIds = updatedStages.map((stage)=>stage.id);
226
+ const replacedStages = await stageService.replaceStages(workflow.stages, opts.data.stages, workflow.contentTypes);
227
+ updatedStages = replacedStages;
228
+ updatedStageIds = replacedStages.map((stage)=>stage.id);
185
229
  updateOpts = {
186
230
  ...updateOpts,
187
231
  data: {
@@ -1 +1 @@
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, populated with `WORKFLOW_POPULATE`.\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, populated with `WORKFLOW_POPULATE`.\n * @throws {ApplicationError} - If the supplied stage ID does not belong to the workflow.\n */\n async update(workflow: any, opts: { data: 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
+ {"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 { ERRORS, WORKFLOW_MODEL_UID, WORKFLOW_POPULATE } from '../constants/workflows';\nimport {\n AUDITED_EVENTS,\n getWorkflowChanges,\n toWorkflowEvent,\n toWorkflowSnapshot,\n} from '../audit-logs';\nimport type { Stage } from '../../../shared/contracts/review-workflows';\nimport { getService } from '../utils';\nimport { getWorkflowContentTypeFilter } from '../utils/review-workflows';\nimport workflowsContentTypesFactory, { type ContentTypeTransfer } from './workflow-content-types';\n\n// `replaceStages` returns the input stages with their ids filled in, not full stage entities\ntype ReplacedStage = Pick<Stage, 'id' | 'name'>;\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 /**\n * The `unique` attribute option is not enforced by `db.query`, so the name is checked here.\n * @param {string} name - Workflow name to check.\n * @param {number} [workflowId] - ID of the workflow being updated, excluded from the check.\n * @throws {ValidationError} - If another workflow already uses the name.\n */\n const assertWorkflowNameIsUnique = async (name: string, workflowId?: number) => {\n const where = workflowId === undefined ? { name } : { name, id: { $ne: workflowId } };\n const existingWorkflow = await strapi.db\n .query(WORKFLOW_MODEL_UID)\n .findOne({ select: ['id'], where });\n\n if (existingWorkflow !== null) {\n // Same details shape as a yup error, so the admin form shows the message on the name field\n throw new errors.ValidationError(ERRORS.DUPLICATED_WORKFLOW_NAME, {\n errors: [\n {\n path: ['name'],\n message: ERRORS.DUPLICATED_WORKFLOW_NAME,\n name: 'ValidationError',\n value: name,\n },\n ],\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, populated with `WORKFLOW_POPULATE`.\n * @throws {ValidationError} - If the workflow has no stages or its name is already used.\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 if (opts.data.name !== undefined) {\n await assertWorkflowNameIsUnique(opts.data.name);\n }\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, populated with `WORKFLOW_POPULATE`.\n * @throws {ApplicationError} - If the supplied stage ID does not belong to the workflow.\n * @throws {ValidationError} - If the new name is already used by another workflow.\n */\n async update(workflow: any, opts: { data: any }) {\n const stageService = getService('stages', { strapi });\n let updateOpts = { ...opts, populate: { ...WORKFLOW_POPULATE } };\n let updatedStages: ReplacedStage[] | undefined;\n let updatedStageIds: any;\n\n await workflowValidator.validateWorkflowCount();\n\n if (opts.data.name !== undefined && opts.data.name !== workflow.name) {\n await assertWorkflowNameIsUnique(opts.data.name, workflow.id);\n }\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 const replacedStages: ReplacedStage[] = await stageService.replaceStages(\n workflow.stages,\n opts.data.stages,\n workflow.contentTypes\n );\n updatedStages = replacedStages;\n updatedStageIds = replacedStages.map((stage) => 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","assertWorkflowNameIsUnique","where","undefined","id","$ne","existingWorkflow","db","query","WORKFLOW_MODEL_UID","findOne","select","errors","ValidationError","ERRORS","DUPLICATED_WORKFLOW_NAME","path","message","value","find","opts","get","transform","findMany","findById","create","createOpts","validateWorkflowStages","data","stages","validateWorkflowCount","createdWorkflow","transaction","createMany","map","stageRequiredToPublishName","stageRequiredToPublish","stage","ApplicationError","migrate","destContentTypes","stageId","sendDidCreateWorkflow","plugin","service","validateActionsByContentTypes","WORKFLOW_CREATE","toWorkflowEvent","update","workflow","stageService","updateOpts","updatedStages","updatedStageIds","updatedWorkflow","forEach","assertStageBelongsToWorkflow","replacedStages","replaceStages","srcContentTypes","sendDidEditWorkflow","delete","workflowCount","count","deletedWorkflow","deleteMany","WORKFLOW_DELETE","getAssignedWorkflow","uid","workflows","_getAssignedWorkflows","assertContentTypeBelongsToWorkflow","belongs","some"],"mappings":"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"}
@@ -16,6 +16,7 @@ export declare const ERRORS: {
16
16
  WORKFLOWS_LIMIT: string;
17
17
  STAGES_LIMIT: string;
18
18
  DUPLICATED_STAGE_NAME: string;
19
+ DUPLICATED_WORKFLOW_NAME: string;
19
20
  };
20
21
  export declare const WORKFLOW_POPULATE: {
21
22
  stages: {
@@ -1 +1 @@
1
- {"version":3,"file":"workflows.d.ts","sourceRoot":"","sources":["../../../../server/src/constants/workflows.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,sCAAsC,CAAC;AACtE,eAAO,MAAM,eAAe,4CAA4C,CAAC;AACzE;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,6CAA6C,CAAC;AAE/E,eAAO,MAAM,mBAAmB,YAAY,CAAC;AAC7C,eAAO,MAAM,sBAAsB,iBAAiB,CAAC;AACrD,eAAO,MAAM,yBAAyB,oBAAoB,CAAC;AAE3D,eAAO,MAAM,aAAa,MAAM,CAAC;AACjC,eAAO,MAAM,uBAAuB,MAAM,CAAC;AAE3C,eAAO,MAAM,MAAM;;;;;CAOlB,CAAC;AAEF,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;CAY7B,CAAC"}
1
+ {"version":3,"file":"workflows.d.ts","sourceRoot":"","sources":["../../../../server/src/constants/workflows.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,sCAAsC,CAAC;AACtE,eAAO,MAAM,eAAe,4CAA4C,CAAC;AACzE;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,6CAA6C,CAAC;AAE/E,eAAO,MAAM,mBAAmB,YAAY,CAAC;AAC7C,eAAO,MAAM,sBAAsB,iBAAiB,CAAC;AACrD,eAAO,MAAM,yBAAyB,oBAAoB,CAAC;AAE3D,eAAO,MAAM,aAAa,MAAM,CAAC;AACjC,eAAO,MAAM,uBAAuB,MAAM,CAAC;AAE3C,eAAO,MAAM,MAAM;;;;;;CAQlB,CAAC;AAEF,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;CAY7B,CAAC"}
@@ -7,7 +7,7 @@ declare const _default: {
7
7
  };
8
8
  stages: {
9
9
  find(ctx: import("koa").Context): Promise<void>;
10
- findById(ctx: import("koa").Context): Promise<void>;
10
+ findById(ctx: import("koa").Context): Promise<any>;
11
11
  updateEntity(ctx: import("koa").Context): Promise<void>;
12
12
  listAvailableStages(ctx: import("koa").Context): Promise<any>;
13
13
  };
@@ -7,7 +7,7 @@ declare const _default: {
7
7
  /**
8
8
  * Get one stage
9
9
  */
10
- findById(ctx: Context): Promise<void>;
10
+ findById(ctx: Context): Promise<any>;
11
11
  /**
12
12
  * Updates an entity's stage.
13
13
  * @async
@@ -1 +1 @@
1
- {"version":3,"file":"stages.d.ts","sourceRoot":"","sources":["../../../../server/src/controllers/stages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;;IA4BjC;;OAEG;cACa,OAAO;IAevB;;OAEG;kBACiB,OAAO;IAgB3B;;;;;;;;;;;;OAYG;sBACqB,OAAO;IAsD/B;;;;;;;;OAQG;6BAC4B,OAAO;;AAlHxC,wBAgME"}
1
+ {"version":3,"file":"stages.d.ts","sourceRoot":"","sources":["../../../../server/src/controllers/stages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;;IA4BjC;;OAEG;cACa,OAAO;IAevB;;OAEG;kBACiB,OAAO;IAoB3B;;;;;;;;;;;;OAYG;sBACqB,OAAO;IAsD/B;;;;;;;;OAQG;6BAC4B,OAAO;;AAtHxC,wBAoME"}
@@ -131,7 +131,7 @@ declare const _default: {
131
131
  strapi: Core.Strapi;
132
132
  }) => {
133
133
  find({ workflowId, populate }: any): Promise<any[]>;
134
- findById(id: string | number, { populate }?: any): Promise<any>;
134
+ findById(id: string | number, { workflowId, populate }?: any): Promise<any>;
135
135
  createMany(stagesList: any, { fields }?: any): Promise<any[]>;
136
136
  update(srcStage: any, destStage: any): Promise<any>;
137
137
  delete(stage: any): Promise<any>;
@@ -145,8 +145,8 @@ declare const _default: {
145
145
  locale: string;
146
146
  updatedAt: string;
147
147
  }, model: import("@strapi/types/dist/uid/index.js").ContentType, stageId: any): Promise<import("@strapi/types/dist/modules/documents/index.js").AnyDocument | null>;
148
- updateEntitiesStage(contentTypeUID: any, { fromStageId, toStageId }: any): Promise<number | number[]>;
149
- deleteAllEntitiesStage(contentTypeUID: any): Promise<number>;
148
+ updateEntitiesStage(contentTypeUID: any, { fromStageId, toStageId }: any): Promise<number | number[] | undefined>;
149
+ deleteAllEntitiesStage(contentTypeUID: any): Promise<number | undefined>;
150
150
  };
151
151
  'stage-permissions': ({ strapi }: {
152
152
  strapi: Core.Strapi;
@@ -243,7 +243,7 @@ declare const _default: {
243
243
  };
244
244
  stages: {
245
245
  find(ctx: import("koa").Context): Promise<void>;
246
- findById(ctx: import("koa").Context): Promise<void>;
246
+ findById(ctx: import("koa").Context): Promise<any>;
247
247
  updateEntity(ctx: import("koa").Context): Promise<void>;
248
248
  listAvailableStages(ctx: import("koa").Context): Promise<any>;
249
249
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../server/src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBAoCuzD,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BAA8pB,CAAC;oCAAoB,CAAC;0BAAM,CAAC;;wBAAgB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBAVrhF;QAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAA;KAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAShD,wBAA2B"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../server/src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBAoCwjG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BAAnmB,CAAC;oCAAoB,CAAC;0BAAM,CAAC;;wBAAgB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBAVrhF;QAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAA;KAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAShD,wBAA2B"}
@@ -1 +1 @@
1
- {"version":3,"file":"document-service-middleware.d.ts","sourceRoot":"","sources":["../../../../server/src/services/document-service-middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;;;;;;AAsJ7C,wBAIG"}
1
+ {"version":3,"file":"document-service-middleware.d.ts","sourceRoot":"","sources":["../../../../server/src/services/document-service-middleware.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;;;;;;AAuL7C,wBAIG"}
@@ -28,7 +28,7 @@ declare const _default: {
28
28
  strapi: import("@strapi/types/dist/core/strapi.js").Strapi;
29
29
  }) => {
30
30
  find({ workflowId, populate }: any): Promise<any[]>;
31
- findById(id: string | number, { populate }?: any): Promise<any>;
31
+ findById(id: string | number, { workflowId, populate }?: any): Promise<any>;
32
32
  createMany(stagesList: any, { fields }?: any): Promise<any[]>;
33
33
  update(srcStage: any, destStage: any): Promise<any>;
34
34
  delete(stage: any): Promise<any>;
@@ -42,8 +42,8 @@ declare const _default: {
42
42
  locale: string;
43
43
  updatedAt: string;
44
44
  }, model: import("@strapi/types/dist/uid/index.js").ContentType, stageId: any): Promise<import("@strapi/types/dist/modules/documents/index.js").AnyDocument | null>;
45
- updateEntitiesStage(contentTypeUID: any, { fromStageId, toStageId }: any): Promise<number | number[]>;
46
- deleteAllEntitiesStage(contentTypeUID: any): Promise<number>;
45
+ updateEntitiesStage(contentTypeUID: any, { fromStageId, toStageId }: any): Promise<number | number[] | undefined>;
46
+ deleteAllEntitiesStage(contentTypeUID: any): Promise<number | undefined>;
47
47
  };
48
48
  'stage-permissions': ({ strapi }: {
49
49
  strapi: import("@strapi/types/dist/core/strapi.js").Strapi;