diff --git a/packages/cli/src/workflows/workflowStaticData.service.ts b/packages/cli/src/workflows/workflowStaticData.service.ts index b77d1b716c3d8..fad35a14a3a3e 100644 --- a/packages/cli/src/workflows/workflowStaticData.service.ts +++ b/packages/cli/src/workflows/workflowStaticData.service.ts @@ -3,6 +3,7 @@ import { type IDataObject, type Workflow, ErrorReporterProxy as ErrorReporter } import { Logger } from '@/Logger'; import { WorkflowRepository } from '@db/repositories/workflow.repository'; import { isWorkflowIdValid } from '@/utils'; +import config from '@/config'; @Service() export class WorkflowStaticDataService { @@ -43,8 +44,19 @@ export class WorkflowStaticDataService { /** Saves the given static data on workflow */ async saveStaticDataById(workflowId: string, newStaticData: IDataObject): Promise { - await this.workflowRepository.update(workflowId, { - staticData: newStaticData, - }); + const qb = this.workflowRepository.createQueryBuilder('workflow'); + await qb + .update() + .set({ + staticData: newStaticData, + updatedAt: () => { + if (['mysqldb', 'mariadb'].includes(config.getEnv('database.type'))) { + return 'updatedAt'; + } + return '"updatedAt"'; + }, + }) + .where('id = :id', { id: workflowId }) + .execute(); } } diff --git a/packages/cli/test/integration/services/workflowStaticData.service.test.ts b/packages/cli/test/integration/services/workflowStaticData.service.test.ts new file mode 100644 index 0000000000000..353639bcc2f6c --- /dev/null +++ b/packages/cli/test/integration/services/workflowStaticData.service.test.ts @@ -0,0 +1,62 @@ +import { WorkflowStaticDataService } from '@/workflows/workflowStaticData.service'; +import * as testDb from '@test-integration/testDb'; +import Container from 'typedi'; +import { createWorkflow } from '@test-integration/db/workflows'; +import { Workflow } from 'n8n-workflow'; +import { mockInstance } from '@test/mocking'; +import { NodeTypes } from '@/NodeTypes'; +import { WorkflowRepository } from '@/databases/repositories/workflow.repository'; + +const nodeTypes = mockInstance(NodeTypes); +let workflowStaticDataService: WorkflowStaticDataService; +let workflowRepository: WorkflowRepository; + +beforeAll(async () => { + await testDb.init(); + + workflowStaticDataService = Container.get(WorkflowStaticDataService); + workflowRepository = Container.get(WorkflowRepository); +}); + +afterAll(async () => { + await testDb.terminate(); +}); + +describe('WorkflowStaticDataService', () => { + it('should not change workflow updatedAt when calling saveStaticData', async () => { + const workflowEntityOriginal = await createWorkflow(); + + const workflow = new Workflow({ + id: workflowEntityOriginal.id, + active: false, + connections: {}, + nodeTypes, + nodes: [], + }); + + workflow.staticData.testValue = 1; + + await workflowStaticDataService.saveStaticData(workflow); + + const workflowEntityNew = await workflowRepository.get({ + id: workflowEntityOriginal.id, + }); + + expect(workflowEntityNew?.staticData).toEqual(workflow.staticData); + expect(workflowEntityNew?.updatedAt).toEqual(workflowEntityOriginal.updatedAt); + }); + + it('should not change workflow updatedAt when calling saveStaticDataById', async () => { + const workflowEntityOriginal = await createWorkflow(); + const staticData = { testValue: 1 }; + + await workflowStaticDataService.saveStaticDataById(workflowEntityOriginal.id, staticData); + + const workflowEntityNew = await workflowRepository.get({ + id: workflowEntityOriginal.id, + }); + + expect(workflowEntityNew?.staticData).toEqual(staticData); + expect(workflowEntityNew?.updatedAt).toEqual(workflowEntityOriginal.updatedAt); + }); +});