From df516a904b5a057fc8254858dde5cb50c8e7bad3 Mon Sep 17 00:00:00 2001 From: Thomas Trompette Date: Thu, 5 Feb 2026 15:01:21 +0100 Subject: [PATCH] Add lock on version creation (#17740) Should avoid duplicates we have sometimes --- .../workflow-version/workflow-version.module.ts | 4 +++- .../workflow-version/workflow-version.workspace-service.ts | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/twenty-server/src/modules/workflow/workflow-builder/workflow-version/workflow-version.module.ts b/packages/twenty-server/src/modules/workflow/workflow-builder/workflow-version/workflow-version.module.ts index 2fdf9fe155..76a35bbb5e 100644 --- a/packages/twenty-server/src/modules/workflow/workflow-builder/workflow-version/workflow-version.module.ts +++ b/packages/twenty-server/src/modules/workflow/workflow-builder/workflow-version/workflow-version.module.ts @@ -2,9 +2,10 @@ import { Module } from '@nestjs/common'; import { NestjsQueryTypeOrmModule } from '@ptc-org/nestjs-query-typeorm'; +import { CacheLockModule } from 'src/engine/core-modules/cache-lock/cache-lock.module'; import { RecordPositionModule } from 'src/engine/core-modules/record-position/record-position.module'; -import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; import { LogicFunctionModule } from 'src/engine/metadata-modules/logic-function/logic-function.module'; +import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; import { WorkflowSchemaModule } from 'src/modules/workflow/workflow-builder/workflow-schema/workflow-schema.module'; import { WorkflowVersionStepModule } from 'src/modules/workflow/workflow-builder/workflow-version-step/workflow-version-step.module'; import { WorkflowVersionWorkspaceService } from 'src/modules/workflow/workflow-builder/workflow-version/workflow-version.workspace-service'; @@ -16,6 +17,7 @@ import { WorkflowVersionWorkspaceService } from 'src/modules/workflow/workflow-b WorkflowVersionStepModule, NestjsQueryTypeOrmModule.forFeature([ObjectMetadataEntity]), RecordPositionModule, + CacheLockModule, ], providers: [WorkflowVersionWorkspaceService], exports: [WorkflowVersionWorkspaceService], diff --git a/packages/twenty-server/src/modules/workflow/workflow-builder/workflow-version/workflow-version.workspace-service.ts b/packages/twenty-server/src/modules/workflow/workflow-builder/workflow-version/workflow-version.workspace-service.ts index 8e1e4bb3ee..3ce13136c8 100644 --- a/packages/twenty-server/src/modules/workflow/workflow-builder/workflow-version/workflow-version.workspace-service.ts +++ b/packages/twenty-server/src/modules/workflow/workflow-builder/workflow-version/workflow-version.workspace-service.ts @@ -3,6 +3,7 @@ import { Injectable } from '@nestjs/common'; import { isDefined } from 'twenty-shared/utils'; import { TRIGGER_STEP_ID } from 'twenty-shared/workflow'; +import { WithLock } from 'src/engine/core-modules/cache-lock/with-lock.decorator'; import { RecordPositionService } from 'src/engine/core-modules/record-position/services/record-position.service'; import { type WorkflowStepPositionUpdateInput } from 'src/engine/core-modules/workflow/dtos/update-workflow-step-position-update-input.dto'; import { GlobalWorkspaceOrmManager } from 'src/engine/twenty-orm/global-workspace-datasource/global-workspace-orm.manager'; @@ -38,6 +39,7 @@ export class WorkflowVersionWorkspaceService { private readonly recordPositionService: RecordPositionService, ) {} + @WithLock('workflowId') async createDraftFromWorkflowVersion({ workspaceId, workflowId,