diff --git a/packages/twenty-front/src/generated-metadata/graphql.ts b/packages/twenty-front/src/generated-metadata/graphql.ts index 10dc470d11e..674c39389a2 100644 --- a/packages/twenty-front/src/generated-metadata/graphql.ts +++ b/packages/twenty-front/src/generated-metadata/graphql.ts @@ -838,6 +838,8 @@ export type CreateWebhookDto = { export type CreateWorkflowVersionEdgeInput = { /** Workflow version source step ID */ source: Scalars['String']; + /** Workflow version source step connection options */ + sourceConnectionOptions?: InputMaybe; /** Workflow version target step ID */ target: Scalars['String']; /** Workflow version ID */ @@ -847,10 +849,10 @@ export type CreateWorkflowVersionEdgeInput = { export type CreateWorkflowVersionStepInput = { /** Next step ID */ nextStepId?: InputMaybe; + /** Parent step connection options */ + parentStepConnectionOptions?: InputMaybe; /** Parent step ID */ parentStepId?: InputMaybe; - /** Step creation options */ - parentStepOptions?: InputMaybe; /** Step position */ position?: InputMaybe; /** New step type */ diff --git a/packages/twenty-front/src/generated/graphql.ts b/packages/twenty-front/src/generated/graphql.ts index b83e7578fa7..de3f663dd1f 100644 --- a/packages/twenty-front/src/generated/graphql.ts +++ b/packages/twenty-front/src/generated/graphql.ts @@ -802,6 +802,8 @@ export type CreateWebhookDto = { export type CreateWorkflowVersionEdgeInput = { /** Workflow version source step ID */ source: Scalars['String']; + /** Workflow version source step connection options */ + sourceConnectionOptions?: InputMaybe; /** Workflow version target step ID */ target: Scalars['String']; /** Workflow version ID */ @@ -811,10 +813,10 @@ export type CreateWorkflowVersionEdgeInput = { export type CreateWorkflowVersionStepInput = { /** Next step ID */ nextStepId?: InputMaybe; + /** Parent step connection options */ + parentStepConnectionOptions?: InputMaybe; /** Parent step ID */ parentStepId?: InputMaybe; - /** Step creation options */ - parentStepOptions?: InputMaybe; /** Step position */ position?: InputMaybe; /** New step type */ diff --git a/packages/twenty-server/src/engine/core-modules/workflow/dtos/create-workflow-version-edge-input.dto.ts b/packages/twenty-server/src/engine/core-modules/workflow/dtos/create-workflow-version-edge-input.dto.ts index e7a21a3a1da..6ed0b0f95ba 100644 --- a/packages/twenty-server/src/engine/core-modules/workflow/dtos/create-workflow-version-edge-input.dto.ts +++ b/packages/twenty-server/src/engine/core-modules/workflow/dtos/create-workflow-version-edge-input.dto.ts @@ -1,5 +1,9 @@ import { Field, InputType } from '@nestjs/graphql'; +import graphqlTypeJson from 'graphql-type-json'; + +import { WorkflowStepConnectionOptions } from 'src/modules/workflow/workflow-builder/workflow-version-step/types/WorkflowStepCreationOptions'; + @InputType() export class CreateWorkflowVersionEdgeInput { @Field(() => String, { @@ -19,4 +23,10 @@ export class CreateWorkflowVersionEdgeInput { nullable: false, }) target: string; + + @Field(() => graphqlTypeJson, { + description: 'Workflow version source step connection options', + nullable: true, + }) + sourceConnectionOptions?: WorkflowStepConnectionOptions; } diff --git a/packages/twenty-server/src/engine/core-modules/workflow/dtos/create-workflow-version-step-input.dto.ts b/packages/twenty-server/src/engine/core-modules/workflow/dtos/create-workflow-version-step-input.dto.ts index 036289ac013..e181fcd5734 100644 --- a/packages/twenty-server/src/engine/core-modules/workflow/dtos/create-workflow-version-step-input.dto.ts +++ b/packages/twenty-server/src/engine/core-modules/workflow/dtos/create-workflow-version-step-input.dto.ts @@ -4,7 +4,7 @@ import graphqlTypeJson from 'graphql-type-json'; import { UUIDScalarType } from 'src/engine/api/graphql/workspace-schema-builder/graphql-types/scalars'; import { WorkflowStepPositionInput } from 'src/engine/core-modules/workflow/dtos/update-workflow-step-position-input.dto'; -import { WorkflowStepCreationOptions } from 'src/modules/workflow/workflow-builder/workflow-version-step/types/WorkflowStepCreationOptions'; +import { WorkflowStepConnectionOptions } from 'src/modules/workflow/workflow-builder/workflow-version-step/types/WorkflowStepCreationOptions'; import { WorkflowActionType } from 'src/modules/workflow/workflow-executor/workflow-actions/types/workflow-action.type'; @InputType() @@ -29,10 +29,10 @@ export class CreateWorkflowVersionStepInput { parentStepId?: string; @Field(() => graphqlTypeJson, { - description: 'Step creation options', + description: 'Parent step connection options', nullable: true, }) - parentStepOptions?: WorkflowStepCreationOptions; + parentStepConnectionOptions?: WorkflowStepConnectionOptions; @Field(() => UUIDScalarType, { description: 'Next step ID', diff --git a/packages/twenty-server/src/engine/core-modules/workflow/filters/workflow-version-edge-graphql-api-exception.filter.ts b/packages/twenty-server/src/engine/core-modules/workflow/filters/workflow-version-edge-graphql-api-exception.filter.ts index 2f4d520047b..651ab3cd5c8 100644 --- a/packages/twenty-server/src/engine/core-modules/workflow/filters/workflow-version-edge-graphql-api-exception.filter.ts +++ b/packages/twenty-server/src/engine/core-modules/workflow/filters/workflow-version-edge-graphql-api-exception.filter.ts @@ -2,7 +2,10 @@ import { Catch, type ExceptionFilter } from '@nestjs/common'; import { assertUnreachable } from 'twenty-shared/utils'; -import { NotFoundError } from 'src/engine/core-modules/graphql/utils/graphql-errors.util'; +import { + NotFoundError, + UserInputError, +} from 'src/engine/core-modules/graphql/utils/graphql-errors.util'; import { WorkflowVersionEdgeException, WorkflowVersionEdgeExceptionCode, @@ -14,6 +17,8 @@ export const handleWorkflowVersionEdgeException = ( switch (exception.code) { case WorkflowVersionEdgeExceptionCode.NOT_FOUND: throw new NotFoundError(exception); + case WorkflowVersionEdgeExceptionCode.INVALID_REQUEST: + throw new UserInputError(exception); default: { assertUnreachable(exception.code); } diff --git a/packages/twenty-server/src/engine/core-modules/workflow/resolvers/workflow-version-edge.resolver.ts b/packages/twenty-server/src/engine/core-modules/workflow/resolvers/workflow-version-edge.resolver.ts index 995647238ca..f3094b19aa2 100644 --- a/packages/twenty-server/src/engine/core-modules/workflow/resolvers/workflow-version-edge.resolver.ts +++ b/packages/twenty-server/src/engine/core-modules/workflow/resolvers/workflow-version-edge.resolver.ts @@ -36,13 +36,19 @@ export class WorkflowVersionEdgeResolver { async createWorkflowVersionEdge( @AuthWorkspace() { id: workspaceId }: Workspace, @Args('input') - { source, target, workflowVersionId }: CreateWorkflowVersionEdgeInput, + { + source, + target, + workflowVersionId, + sourceConnectionOptions, + }: CreateWorkflowVersionEdgeInput, ): Promise { return this.workflowVersionEdgeWorkspaceService.createWorkflowVersionEdge({ source, target, workflowVersionId, workspaceId, + sourceConnectionOptions, }); } diff --git a/packages/twenty-server/src/modules/workflow/common/exceptions/workflow-version-edge.exception.ts b/packages/twenty-server/src/modules/workflow/common/exceptions/workflow-version-edge.exception.ts index 2764ef024bf..4f7954d37c5 100644 --- a/packages/twenty-server/src/modules/workflow/common/exceptions/workflow-version-edge.exception.ts +++ b/packages/twenty-server/src/modules/workflow/common/exceptions/workflow-version-edge.exception.ts @@ -4,4 +4,5 @@ export class WorkflowVersionEdgeException extends CustomException { ); }); + it('should throw if trigger is not found', async () => { + const mockWorkflowVersionWithoutTrigger = { + ...mockWorkflowVersion, + trigger: null, + } as WorkflowVersionWorkspaceEntity; + + workflowCommonWorkspaceService.getWorkflowVersionOrFail.mockResolvedValue( + mockWorkflowVersionWithoutTrigger, + ); + + const call = async () => + await service.createWorkflowVersionEdge({ + source: TRIGGER_STEP_ID, + target: 'step-1', + workflowVersionId: mockWorkflowVersionId, + workspaceId: mockWorkspaceId, + }); + + await expect(call).rejects.toThrow( + `Trigger not found in workflowVersion '${mockWorkflowVersionId}'`, + ); + }); + describe('with source is the trigger', () => { it('should create an edge between trigger and step-1', async () => { const result = await service.createWorkflowVersionEdge({ @@ -191,6 +214,160 @@ describe('WorkflowVersionEdgeWorkspaceService', () => { }); describe('with source is a step', () => { + describe('with iterator step', () => { + const mockIteratorStep = { + id: 'iterator-step', + type: WorkflowActionType.ITERATOR, + settings: { + errorHandlingOptions: { + continueOnFailure: { value: false }, + retryOnFailure: { value: false }, + }, + input: { + initialLoopStepIds: ['step-1'], + }, + }, + nextStepIds: ['step-2'], + } as WorkflowAction; + + beforeEach(() => { + const mockStepsWithIterator = [...mockSteps, mockIteratorStep]; + const mockWorkflowVersionWithIterator = { + ...mockWorkflowVersion, + steps: mockStepsWithIterator, + } as WorkflowVersionWorkspaceEntity; + + workflowCommonWorkspaceService.getWorkflowVersionOrFail.mockResolvedValue( + mockWorkflowVersionWithIterator, + ); + }); + + it('should add target to initialLoopStepIds when shouldInsertToLoop is true', async () => { + const result = await service.createWorkflowVersionEdge({ + source: 'iterator-step', + target: 'step-3', + workflowVersionId: mockWorkflowVersionId, + workspaceId: mockWorkspaceId, + sourceConnectionOptions: { + connectedStepType: WorkflowActionType.ITERATOR, + settings: { + shouldInsertToLoop: true, + }, + }, + }); + + expect( + mockWorkflowVersionWorkspaceRepository.update, + ).toHaveBeenCalledWith(mockWorkflowVersionId, { + steps: expect.arrayContaining([ + expect.objectContaining({ + id: 'iterator-step', + settings: expect.objectContaining({ + input: expect.objectContaining({ + initialLoopStepIds: ['step-1', 'step-3'], + }), + }), + }), + ]), + }); + + expect(result).toEqual({ + triggerNextStepIds: ['step-1'], + stepsNextStepIds: { + 'step-1': ['step-2'], + 'step-2': [], + 'step-3': [], + 'iterator-step': ['step-2'], + }, + }); + }); + + it('should not duplicate target in initialLoopStepIds when it already exists', async () => { + const result = await service.createWorkflowVersionEdge({ + source: 'iterator-step', + target: 'step-1', + workflowVersionId: mockWorkflowVersionId, + workspaceId: mockWorkspaceId, + sourceConnectionOptions: { + connectedStepType: WorkflowActionType.ITERATOR, + settings: { + shouldInsertToLoop: true, + }, + }, + }); + + expect( + mockWorkflowVersionWorkspaceRepository.update, + ).not.toHaveBeenCalled(); + + expect(result).toEqual({ + triggerNextStepIds: ['step-1'], + stepsNextStepIds: { + 'step-1': ['step-2'], + 'step-2': [], + 'step-3': [], + 'iterator-step': ['step-2'], + }, + }); + }); + + it('should throw if source is not an iterator but connection options are for iterator', async () => { + const call = async () => + await service.createWorkflowVersionEdge({ + source: 'step-1', + target: 'step-3', + workflowVersionId: mockWorkflowVersionId, + workspaceId: mockWorkspaceId, + sourceConnectionOptions: { + connectedStepType: WorkflowActionType.ITERATOR, + settings: { + shouldInsertToLoop: true, + }, + }, + }); + + await expect(call).rejects.toThrow( + `Source step 'step-1' is not an iterator`, + ); + }); + + it('should create normal edge when shouldInsertToLoop is false', async () => { + const result = await service.createWorkflowVersionEdge({ + source: 'iterator-step', + target: 'step-3', + workflowVersionId: mockWorkflowVersionId, + workspaceId: mockWorkspaceId, + sourceConnectionOptions: { + connectedStepType: WorkflowActionType.ITERATOR, + settings: { + shouldInsertToLoop: false, + }, + }, + }); + + expect( + mockWorkflowVersionWorkspaceRepository.update, + ).toHaveBeenCalledWith(mockWorkflowVersionId, { + steps: expect.arrayContaining([ + expect.objectContaining({ + id: 'iterator-step', + nextStepIds: ['step-2', 'step-3'], + }), + ]), + }); + + expect(result).toEqual({ + triggerNextStepIds: ['step-1'], + stepsNextStepIds: { + 'step-1': ['step-2'], + 'step-2': [], + 'step-3': [], + 'iterator-step': ['step-2', 'step-3'], + }, + }); + }); + }); + it('should create an edge between step-2 and step-3', async () => { const result = await service.createWorkflowVersionEdge({ source: 'step-2', diff --git a/packages/twenty-server/src/modules/workflow/workflow-builder/workflow-version-edge/workflow-version-edge.workspace-service.ts b/packages/twenty-server/src/modules/workflow/workflow-builder/workflow-version-edge/workflow-version-edge.workspace-service.ts index 541b90ad176..05422efe88c 100644 --- a/packages/twenty-server/src/modules/workflow/workflow-builder/workflow-version-edge/workflow-version-edge.workspace-service.ts +++ b/packages/twenty-server/src/modules/workflow/workflow-builder/workflow-version-edge/workflow-version-edge.workspace-service.ts @@ -14,6 +14,7 @@ import { type WorkflowVersionWorkspaceEntity } from 'src/modules/workflow/common import { assertWorkflowVersionIsDraft } from 'src/modules/workflow/common/utils/assert-workflow-version-is-draft.util'; import { WorkflowCommonWorkspaceService } from 'src/modules/workflow/common/workspace-services/workflow-common.workspace-service'; import { computeWorkflowVersionStepChanges } from 'src/modules/workflow/workflow-builder/utils/compute-workflow-version-step-updates.util'; +import { WorkflowStepConnectionOptions } from 'src/modules/workflow/workflow-builder/workflow-version-step/types/WorkflowStepCreationOptions'; import { type WorkflowAction, WorkflowActionType, @@ -32,11 +33,13 @@ export class WorkflowVersionEdgeWorkspaceService { target, workflowVersionId, workspaceId, + sourceConnectionOptions, }: { source: string; target: string; workflowVersionId: string; workspaceId: string; + sourceConnectionOptions?: WorkflowStepConnectionOptions; }): Promise { const workflowVersionRepository = await this.twentyORMGlobalManager.getRepositoryForWorkspace( @@ -81,6 +84,7 @@ export class WorkflowVersionEdgeWorkspaceService { steps, source, target, + sourceConnectionOptions, workflowVersion, workflowVersionRepository, }); @@ -196,6 +200,7 @@ export class WorkflowVersionEdgeWorkspaceService { target, workflowVersion, workflowVersionRepository, + sourceConnectionOptions, }: { trigger: WorkflowTrigger | null; steps: WorkflowAction[]; @@ -203,6 +208,7 @@ export class WorkflowVersionEdgeWorkspaceService { target: string; workflowVersion: WorkflowVersionWorkspaceEntity; workflowVersionRepository: WorkspaceRepository; + sourceConnectionOptions?: WorkflowStepConnectionOptions; }): Promise { const sourceStep = steps.find((step) => step.id === source); @@ -213,17 +219,15 @@ export class WorkflowVersionEdgeWorkspaceService { ); } - if (sourceStep.nextStepIds?.includes(target)) { - return computeWorkflowVersionStepChanges({ - trigger, - steps, - }); - } - - const updatedSourceStep = { - ...sourceStep, - nextStepIds: [...(sourceStep.nextStepIds ?? []), target], - }; + const { updatedSourceStep, shouldPersist } = isDefined( + sourceConnectionOptions, + ) + ? this.buildUpdatedSourceStepWithConnectionOptions({ + sourceStep, + target, + sourceConnectionOptions, + }) + : this.buildUpdatedSourceStep({ sourceStep, target }); const updatedSteps = steps.map((step) => { if (step.id === source) { @@ -233,9 +237,11 @@ export class WorkflowVersionEdgeWorkspaceService { return step; }); - await workflowVersionRepository.update(workflowVersion.id, { - steps: updatedSteps, - }); + if (shouldPersist) { + await workflowVersionRepository.update(workflowVersion.id, { + steps: updatedSteps, + }); + } return computeWorkflowVersionStepChanges({ trigger, @@ -243,6 +249,97 @@ export class WorkflowVersionEdgeWorkspaceService { }); } + private buildUpdatedSourceStepWithConnectionOptions({ + sourceStep, + target, + sourceConnectionOptions, + }: { + sourceStep: WorkflowAction; + target: string; + sourceConnectionOptions: WorkflowStepConnectionOptions; + }): { + updatedSourceStep: WorkflowAction; + shouldPersist: boolean; + } { + switch (sourceConnectionOptions.connectedStepType) { + case WorkflowActionType.ITERATOR: + if (sourceStep.type !== WorkflowActionType.ITERATOR) { + throw new WorkflowVersionEdgeException( + `Source step '${sourceStep.id}' is not an iterator`, + WorkflowVersionEdgeExceptionCode.INVALID_REQUEST, + ); + } + + if (sourceConnectionOptions.settings.shouldInsertToLoop) { + const currentInitialLoopStepIds = + sourceStep.settings.input.initialLoopStepIds; + + if (currentInitialLoopStepIds?.includes(target)) { + return { + updatedSourceStep: sourceStep, + shouldPersist: false, + }; + } + + return { + updatedSourceStep: { + ...sourceStep, + settings: { + ...sourceStep.settings, + input: { + ...sourceStep.settings.input, + initialLoopStepIds: [ + ...(currentInitialLoopStepIds ?? []), + target, + ], + }, + }, + }, + shouldPersist: true, + }; + } else { + return this.buildUpdatedSourceStep({ + sourceStep, + target, + }); + } + + default: + return this.buildUpdatedSourceStep({ + sourceStep, + target, + }); + } + } + + private buildUpdatedSourceStep({ + sourceStep, + target, + }: { + sourceStep: WorkflowAction; + target: string; + }): { + updatedSourceStep: WorkflowAction; + shouldPersist: boolean; + } { + if (sourceStep.nextStepIds?.includes(target)) { + return { + updatedSourceStep: sourceStep, + shouldPersist: false, + }; + } + + const updatedSourceStep = { + ...sourceStep, + nextStepIds: [...(sourceStep.nextStepIds ?? []), target], + }; + + return { + updatedSourceStep, + shouldPersist: true, + }; + } + private async deleteTriggerEdge({ trigger, steps, diff --git a/packages/twenty-server/src/modules/workflow/workflow-builder/workflow-version-step/types/WorkflowStepCreationOptions.ts b/packages/twenty-server/src/modules/workflow/workflow-builder/workflow-version-step/types/WorkflowStepCreationOptions.ts index 4d4cd57e558..088c15b0001 100644 --- a/packages/twenty-server/src/modules/workflow/workflow-builder/workflow-version-step/types/WorkflowStepCreationOptions.ts +++ b/packages/twenty-server/src/modules/workflow/workflow-builder/workflow-version-step/types/WorkflowStepCreationOptions.ts @@ -1,10 +1,11 @@ import { type WorkflowActionType } from 'src/modules/workflow/workflow-executor/workflow-actions/types/workflow-action.type'; -type WorkflowIteratorStepCreationOptions = { - parentStepType: WorkflowActionType.ITERATOR; +type WorkflowIteratorStepConnectionOptions = { + connectedStepType: WorkflowActionType.ITERATOR; settings: { shouldInsertToLoop: boolean; }; }; -export type WorkflowStepCreationOptions = WorkflowIteratorStepCreationOptions; +export type WorkflowStepConnectionOptions = + WorkflowIteratorStepConnectionOptions; diff --git a/packages/twenty-server/src/modules/workflow/workflow-builder/workflow-version-step/utils/__tests__/insert-step.spec.ts b/packages/twenty-server/src/modules/workflow/workflow-builder/workflow-version-step/utils/__tests__/insert-step.spec.ts index 1c2bbce629d..0d81832d596 100644 --- a/packages/twenty-server/src/modules/workflow/workflow-builder/workflow-version-step/utils/__tests__/insert-step.spec.ts +++ b/packages/twenty-server/src/modules/workflow/workflow-builder/workflow-version-step/utils/__tests__/insert-step.spec.ts @@ -187,8 +187,8 @@ describe('insertStep', () => { existingSteps: [mockIteratorStep], insertedStep: newStep, parentStepId: '1', - parentStepOptions: { - parentStepType: WorkflowActionType.ITERATOR, + parentStepConnectionOptions: { + connectedStepType: WorkflowActionType.ITERATOR, settings: { shouldInsertToLoop: true, }, @@ -213,8 +213,8 @@ describe('insertStep', () => { existingSteps: [mockIteratorStep], insertedStep: newStep, parentStepId: '1', - parentStepOptions: { - parentStepType: WorkflowActionType.ITERATOR, + parentStepConnectionOptions: { + connectedStepType: WorkflowActionType.ITERATOR, settings: { shouldInsertToLoop: false, }, diff --git a/packages/twenty-server/src/modules/workflow/workflow-builder/workflow-version-step/utils/insert-step.ts b/packages/twenty-server/src/modules/workflow/workflow-builder/workflow-version-step/utils/insert-step.ts index 3d3cdee62d8..3b316a3225a 100644 --- a/packages/twenty-server/src/modules/workflow/workflow-builder/workflow-version-step/utils/insert-step.ts +++ b/packages/twenty-server/src/modules/workflow/workflow-builder/workflow-version-step/utils/insert-step.ts @@ -5,11 +5,11 @@ import { WorkflowVersionStepException, WorkflowVersionStepExceptionCode, } from 'src/modules/workflow/common/exceptions/workflow-version-step.exception'; -import { type WorkflowStepCreationOptions } from 'src/modules/workflow/workflow-builder/workflow-version-step/types/WorkflowStepCreationOptions'; +import { type WorkflowStepConnectionOptions } from 'src/modules/workflow/workflow-builder/workflow-version-step/types/WorkflowStepCreationOptions'; import { type WorkflowIteratorActionSettings } from 'src/modules/workflow/workflow-executor/workflow-actions/iterator/types/workflow-iterator-action-settings.type'; import { - WorkflowActionType, type WorkflowAction, + WorkflowActionType, } from 'src/modules/workflow/workflow-executor/workflow-actions/types/workflow-action.type'; import { type WorkflowTrigger } from 'src/modules/workflow/workflow-trigger/types/workflow-trigger.type'; @@ -19,14 +19,14 @@ export const insertStep = ({ insertedStep, nextStepId, parentStepId, - parentStepOptions, + parentStepConnectionOptions, }: { existingSteps: WorkflowAction[]; existingTrigger: WorkflowTrigger | null; insertedStep: WorkflowAction; nextStepId?: string; parentStepId?: string; - parentStepOptions?: WorkflowStepCreationOptions; + parentStepConnectionOptions?: WorkflowStepConnectionOptions; }): { updatedSteps: WorkflowAction[]; updatedInsertedStep: WorkflowAction; @@ -39,7 +39,7 @@ export const insertStep = ({ parentStepId, insertedStepId: insertedStep.id, nextStepId, - parentStepOptions, + parentStepConnectionOptions, }) : { updatedSteps: existingSteps, @@ -64,24 +64,24 @@ const updateParentStep = ({ parentStepId, insertedStepId, nextStepId, - parentStepOptions, + parentStepConnectionOptions, }: { steps: WorkflowAction[]; trigger: WorkflowTrigger | null; parentStepId: string; insertedStepId: string; nextStepId?: string; - parentStepOptions?: WorkflowStepCreationOptions; + parentStepConnectionOptions?: WorkflowStepConnectionOptions; }): { updatedSteps: WorkflowAction[]; updatedTrigger: WorkflowTrigger | null; } => { - if (isDefined(parentStepOptions)) { + if (isDefined(parentStepConnectionOptions)) { return updateStepsWithOptions({ steps, parentStepId, insertedStepId, - parentStepOptions, + parentStepConnectionOptions, trigger, }); } else { @@ -160,20 +160,20 @@ const updateStepsWithOptions = ({ parentStepId, insertedStepId, steps, - parentStepOptions, + parentStepConnectionOptions, trigger, }: { parentStepId: string; insertedStepId: string; steps: WorkflowAction[]; - parentStepOptions: WorkflowStepCreationOptions; + parentStepConnectionOptions: WorkflowStepConnectionOptions; trigger: WorkflowTrigger | null; }) => { let updatedSteps = steps; - switch (parentStepOptions.parentStepType) { + switch (parentStepConnectionOptions.connectedStepType) { case WorkflowActionType.ITERATOR: - if (!parentStepOptions.settings.shouldInsertToLoop) { + if (!parentStepConnectionOptions.settings.shouldInsertToLoop) { break; } diff --git a/packages/twenty-server/src/modules/workflow/workflow-builder/workflow-version-step/workflow-version-step.workspace-service.ts b/packages/twenty-server/src/modules/workflow/workflow-builder/workflow-version-step/workflow-version-step.workspace-service.ts index 4957aec0abe..cb2eb3c756c 100644 --- a/packages/twenty-server/src/modules/workflow/workflow-builder/workflow-version-step/workflow-version-step.workspace-service.ts +++ b/packages/twenty-server/src/modules/workflow/workflow-builder/workflow-version-step/workflow-version-step.workspace-service.ts @@ -79,7 +79,7 @@ export class WorkflowVersionStepWorkspaceService { parentStepId, nextStepId, position, - parentStepOptions, + parentStepConnectionOptions, } = input; const newStep = await this.runStepCreationSideEffectsAndBuildStep({ @@ -126,7 +126,7 @@ export class WorkflowVersionStepWorkspaceService { insertedStep: enrichedNewStep, parentStepId, nextStepId, - parentStepOptions, + parentStepConnectionOptions, }); await workflowVersionRepository.update(workflowVersion.id, {