From 72ce761fd1a47215bdc1c51ce7a9e3b74abb4637 Mon Sep 17 00:00:00 2001 From: Junyi Date: Thu, 8 Aug 2024 09:40:47 +0800 Subject: [PATCH] fix(plugin-workflow): fix event key in date field schedule mode (#5010) --- .../triggers/schedule/mode-date-field.test.ts | 38 +++++++++++++++++++ .../DateFieldScheduleTrigger.ts | 8 ++-- 2 files changed, 41 insertions(+), 5 deletions(-) diff --git a/packages/plugins/@nocobase/plugin-workflow/src/server/__tests__/triggers/schedule/mode-date-field.test.ts b/packages/plugins/@nocobase/plugin-workflow/src/server/__tests__/triggers/schedule/mode-date-field.test.ts index b4a052111d..3ea030986d 100644 --- a/packages/plugins/@nocobase/plugin-workflow/src/server/__tests__/triggers/schedule/mode-date-field.test.ts +++ b/packages/plugins/@nocobase/plugin-workflow/src/server/__tests__/triggers/schedule/mode-date-field.test.ts @@ -403,4 +403,42 @@ describe('workflow > triggers > schedule > date field mode', () => { expect(e1c).toBe(2); }); }); + + describe('status', () => { + it('toggle off', async () => { + const workflow = await WorkflowModel.create({ + enabled: true, + type: 'schedule', + config: { + mode: 1, + collection: 'posts', + startsOn: { + field: 'createdAt', + }, + }, + }); + + const now = await sleepToEvenSecond(); + + const p1 = await PostRepo.create({ values: { title: 't1' } }); + + await sleep(1500); + + const executions = await workflow.getExecutions(); + expect(executions.length).toBe(1); + expect(executions[0].context.data.id).toBe(p1.id); + const triggerTime = new Date(p1.createdAt); + triggerTime.setMilliseconds(0); + expect(executions[0].context.date).toBe(triggerTime.toISOString()); + + await workflow.update({ enabled: false }); + + const p2 = await PostRepo.create({ values: { title: 't2' } }); + + await sleep(1500); + + const e2s = await workflow.getExecutions({ order: [['createdAt', 'ASC']] }); + expect(e2s.length).toBe(1); + }); + }); }); diff --git a/packages/plugins/@nocobase/plugin-workflow/src/server/triggers/ScheduleTrigger/DateFieldScheduleTrigger.ts b/packages/plugins/@nocobase/plugin-workflow/src/server/triggers/ScheduleTrigger/DateFieldScheduleTrigger.ts index 5c60ccbb5b..f87c99b3d1 100644 --- a/packages/plugins/@nocobase/plugin-workflow/src/server/triggers/ScheduleTrigger/DateFieldScheduleTrigger.ts +++ b/packages/plugins/@nocobase/plugin-workflow/src/server/triggers/ScheduleTrigger/DateFieldScheduleTrigger.ts @@ -357,7 +357,6 @@ export default class ScheduleTrigger { const { collection } = workflow.config; const [dataSourceName, collectionName] = parseCollectionName(collection); const event = `${collectionName}.afterSaveWithAssociations`; - const eventKey = `${collection}.afterSaveWithAssociations`; const name = getHookId(workflow, event); if (this.events.has(name)) { return; @@ -384,14 +383,13 @@ export default class ScheduleTrigger { const { collection } = workflow.config; const [dataSourceName, collectionName] = parseCollectionName(collection); const event = `${collectionName}.afterSaveWithAssociations`; - const eventKey = `${collection}.afterSaveWithAssociations`; const name = getHookId(workflow, event); - if (this.events.has(eventKey)) { - const listener = this.events.get(name); + const listener = this.events.get(name); + if (listener) { // @ts-ignore const { db } = this.workflow.app.dataSourceManager.dataSources.get(dataSourceName).collectionManager; db.off(event, listener); - this.events.delete(eventKey); + this.events.delete(name); } } }