From f6ec9f82b45d63f0a87ecea159894f572b04d895 Mon Sep 17 00:00:00 2001 From: Junyi Date: Fri, 7 Mar 2025 10:51:15 +0800 Subject: [PATCH] refactor(plugin-workflow): add option to skip triggering in collection event (#6379) --- .../__tests__/triggers/collection.test.ts | 17 +++++++++++++++++ .../src/server/triggers/CollectionTrigger.ts | 6 +++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/packages/plugins/@nocobase/plugin-workflow/src/server/__tests__/triggers/collection.test.ts b/packages/plugins/@nocobase/plugin-workflow/src/server/__tests__/triggers/collection.test.ts index ed9f0a0f49..f9cbbe4492 100644 --- a/packages/plugins/@nocobase/plugin-workflow/src/server/__tests__/triggers/collection.test.ts +++ b/packages/plugins/@nocobase/plugin-workflow/src/server/__tests__/triggers/collection.test.ts @@ -161,6 +161,23 @@ describe('workflow > triggers > collection', () => { expect(executions.length).toBe(1); expect(executions[0].context.data.title).toBe('c1'); }); + + it('skipWorkflow', async () => { + const workflow = await WorkflowModel.create({ + enabled: true, + sync: true, + type: 'collection', + config: { + mode: 1, + collection: 'posts', + }, + }); + + const post = await PostRepo.create({ values: { title: 't1' }, context: { skipWorkflow: true } }); + + const executions = await workflow.getExecutions(); + expect(executions.length).toBe(0); + }); }); describe('config.mode', () => { diff --git a/packages/plugins/@nocobase/plugin-workflow/src/server/triggers/CollectionTrigger.ts b/packages/plugins/@nocobase/plugin-workflow/src/server/triggers/CollectionTrigger.ts index 8442620f36..c9030cb19b 100644 --- a/packages/plugins/@nocobase/plugin-workflow/src/server/triggers/CollectionTrigger.ts +++ b/packages/plugins/@nocobase/plugin-workflow/src/server/triggers/CollectionTrigger.ts @@ -53,13 +53,17 @@ export default class CollectionTrigger extends Trigger { // async function, should return promise private static async handler(this: CollectionTrigger, workflow: WorkflowModel, data: Model, options) { + const { skipWorkflow = false, stack } = options.context ?? {}; + if (skipWorkflow) { + return; + } const [dataSourceName] = parseCollectionName(workflow.config.collection); const transaction = this.workflow.useDataSourceTransaction(dataSourceName, options.transaction); const ctx = await this.prepare(workflow, data, { ...options, transaction }); if (!ctx) { return; } - const { stack } = options.context ?? {}; + if (workflow.sync) { await this.workflow.trigger(workflow, ctx, { transaction,