From cc50b38a12daab0c0368bab3650969e9019f7810 Mon Sep 17 00:00:00 2001 From: Junyi Date: Fri, 24 Mar 2023 22:54:07 +0700 Subject: [PATCH] fix(plugin-workflow): use toJSON instead of get to get valid result (#1596) --- .../workflow/src/server/__tests__/index.ts | 6 +++-- .../__tests__/triggers/collection.test.ts | 22 +++++++++++++++++++ .../src/server/instructions/create.ts | 7 +++--- .../src/server/triggers/collection.ts | 5 +++-- .../workflow/src/server/triggers/schedule.ts | 2 +- 5 files changed, 34 insertions(+), 8 deletions(-) diff --git a/packages/plugins/workflow/src/server/__tests__/index.ts b/packages/plugins/workflow/src/server/__tests__/index.ts index 6d03cfd1e..a73d3bc8d 100644 --- a/packages/plugins/workflow/src/server/__tests__/index.ts +++ b/packages/plugins/workflow/src/server/__tests__/index.ts @@ -1,10 +1,12 @@ import path from 'path'; +import { get } from 'lodash'; import { ApplicationOptions } from '@nocobase/server'; import { MockServer, mockServer } from '@nocobase/test'; import Plugin from '..'; import { JOB_STATUS } from '../constants'; +import FlowNodeModel from '../models/FlowNode'; export function sleep(ms: number) { return new Promise(resolve => { @@ -23,10 +25,10 @@ export async function getApp({ manual, ...options }: MockAppOptions = {}): Promi name: 'workflow', instructions: { echo: { - run(node, { result }, processor) { + run({ config = {} }: FlowNodeModel, { result }, processor) { return { status: JOB_STATUS.RESOLVED, - result + result: config.path == null ? result : get(result, config.path) }; } }, diff --git a/packages/plugins/workflow/src/server/__tests__/triggers/collection.test.ts b/packages/plugins/workflow/src/server/__tests__/triggers/collection.test.ts index abeaf8691..87e10543b 100644 --- a/packages/plugins/workflow/src/server/__tests__/triggers/collection.test.ts +++ b/packages/plugins/workflow/src/server/__tests__/triggers/collection.test.ts @@ -54,6 +54,28 @@ describe('workflow > triggers > collection', () => { }); }); + describe('model context', () => { + it('with association', async () => { + const workflow = await WorkflowModel.create({ + enabled: true, + type: 'collection', + config: { + mode: 1, + collection: 'posts' + } + }); + + const post = await PostRepo.create({ values: { title: 't1', category: { title: 'c1' } } }); + + await sleep(500); + + const executions = await workflow.getExecutions(); + expect(executions.length).toBe(1); + expect(executions[0].context.data.title).toBe('t1'); + expect(executions[0].context.data.category.title).toBe('c1'); + }); + }); + describe('config.changed', () => { it('no changed config', async () => { const workflow = await WorkflowModel.create({ diff --git a/packages/plugins/workflow/src/server/instructions/create.ts b/packages/plugins/workflow/src/server/instructions/create.ts index 420c90db9..daf9d4bde 100644 --- a/packages/plugins/workflow/src/server/instructions/create.ts +++ b/packages/plugins/workflow/src/server/instructions/create.ts @@ -18,7 +18,7 @@ export default { transaction: processor.transaction }); - if (appends.length) { + if (result && appends.length) { const includeFields = appends.filter(field => !result.get(field) || !result[field]); const included = await model.findByPk(result[model.primaryKeyAttribute], { attributes: [model.primaryKeyAttribute], @@ -26,13 +26,14 @@ export default { transaction: processor.transaction }); includeFields.forEach(field => { - result.set(field, included!.get(field), { raw: true }); + const value = included!.get(field); + result.set(field, Array.isArray(value) ? value.map(item => item.toJSON()) : value.toJSON(), { raw: true }); }); } return { // NOTE: get() for non-proxied instance (#380) - result: result.get(), + result: result?.toJSON(), status: JOB_STATUS.RESOLVED }; } diff --git a/packages/plugins/workflow/src/server/triggers/collection.ts b/packages/plugins/workflow/src/server/triggers/collection.ts index 3da113e59..f4d22dc39 100644 --- a/packages/plugins/workflow/src/server/triggers/collection.ts +++ b/packages/plugins/workflow/src/server/triggers/collection.ts @@ -78,11 +78,12 @@ async function handler(this: CollectionTrigger, workflow: WorkflowModel, data: M transaction }); includeFields.forEach(field => { - data.set(field, included!.get(field), { raw: true }); + const value = included!.get(field); + data.set(field, Array.isArray(value) ? value.map(item => item.toJSON()) : value.toJSON(), { raw: true }); }); } - this.plugin.trigger(workflow, { data: data.get() }, { + this.plugin.trigger(workflow, { data: data.toJSON() }, { context }); } diff --git a/packages/plugins/workflow/src/server/triggers/schedule.ts b/packages/plugins/workflow/src/server/triggers/schedule.ts index d0e21dc7e..b76943591 100644 --- a/packages/plugins/workflow/src/server/triggers/schedule.ts +++ b/packages/plugins/workflow/src/server/triggers/schedule.ts @@ -344,7 +344,7 @@ ScheduleModes.set(SCHEDULE_MODE.COLLECTION_FIELD, { instances.forEach(item => { this.plugin.trigger(workflow, { date: now, - data: item.get() + data: item.toJSON() }); }); }