diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/0-52/0-52-backfill-workflow-next-step-ids.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/0-52/0-52-backfill-workflow-next-step-ids.command.ts new file mode 100644 index 000000000..25f088cb9 --- /dev/null +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/0-52/0-52-backfill-workflow-next-step-ids.command.ts @@ -0,0 +1,117 @@ +import { InjectRepository } from '@nestjs/typeorm'; + +import { Command } from 'nest-commander'; +import { Repository } from 'typeorm'; + +import { + ActiveOrSuspendedWorkspacesMigrationCommandRunner, + RunOnWorkspaceArgs, +} from 'src/database/commands/command-runners/active-or-suspended-workspaces-migration.command-runner'; +import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; +import { TwentyORMGlobalManager } from 'src/engine/twenty-orm/twenty-orm-global.manager'; +import { WorkflowRunWorkspaceEntity } from 'src/modules/workflow/common/standard-objects/workflow-run.workspace-entity'; +import { WorkflowVersionWorkspaceEntity } from 'src/modules/workflow/common/standard-objects/workflow-version.workspace-entity'; + +@Command({ + name: 'upgrade:0-52:backfill-workflow-next-step-ids', + description: 'Backfill workflow next step ids', +}) +export class BackfillWorkflowNextStepIdsCommand extends ActiveOrSuspendedWorkspacesMigrationCommandRunner { + constructor( + @InjectRepository(Workspace, 'core') + protected readonly workspaceRepository: Repository, + protected readonly twentyORMGlobalManager: TwentyORMGlobalManager, + ) { + super(workspaceRepository, twentyORMGlobalManager); + } + + override async runOnWorkspace({ + index, + total, + workspaceId, + }: RunOnWorkspaceArgs): Promise { + this.logger.log( + `Running command for workspace ${workspaceId} ${index + 1}/${total}`, + ); + + const workflowVersionRepository = + await this.twentyORMGlobalManager.getRepositoryForWorkspace( + workspaceId, + 'workflowVersion', + ); + + const workflowRunRepository = + await this.twentyORMGlobalManager.getRepositoryForWorkspace( + workspaceId, + 'workflowRun', + ); + + const workflowVersions = await workflowVersionRepository.find(); + + for (const workflowVersion of workflowVersions) { + const updatedSteps: WorkflowVersionWorkspaceEntity['steps'] = []; + const workflowSteps = workflowVersion.steps; + + if (!workflowSteps) { + continue; + } + + // for each step, add the next step id which is the next index + for (let i = 0; i < workflowSteps.length; i++) { + const updatedStep = { + ...workflowSteps[i], + nextStepIds: + i < workflowSteps.length - 1 && workflowSteps[i + 1]?.id + ? [workflowSteps[i + 1].id] + : undefined, + }; + + updatedSteps.push(updatedStep); + } + + // update workflow run flows + const workflowRuns = await workflowRunRepository.find({ + where: { + workflowVersionId: workflowVersion.id, + }, + }); + + for (const workflowRun of workflowRuns) { + const flow = workflowRun.output?.flow; + + if (!flow?.steps) { + continue; + } + + const updatedFlow = flow.steps.map((step) => { + const updatedStep = updatedSteps.find((s) => s.id === step.id); + + return { + ...step, + nextStepIds: updatedStep?.nextStepIds, + }; + }); + + await workflowRunRepository.save({ + ...workflowRun, + output: { + ...workflowRun.output, + flow: { + ...workflowRun.output?.flow, + steps: updatedFlow, + }, + }, + }); + } + + await workflowVersionRepository.save({ + ...workflowVersion, + steps: updatedSteps, + }); + + this.logger.log( + `Updated workflow version ${workflowVersion.id} for workspace ${workspaceId}`, + ); + } + } +} diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/0-52/0-52-upgrade-version-command.module.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/0-52/0-52-upgrade-version-command.module.ts new file mode 100644 index 000000000..459f1b509 --- /dev/null +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/0-52/0-52-upgrade-version-command.module.ts @@ -0,0 +1,12 @@ +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; + +import { BackfillWorkflowNextStepIdsCommand } from 'src/database/commands/upgrade-version-command/0-52/0-52-backfill-workflow-next-step-ids.command'; +import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; + +@Module({ + imports: [TypeOrmModule.forFeature([Workspace], 'core')], + providers: [BackfillWorkflowNextStepIdsCommand], + exports: [BackfillWorkflowNextStepIdsCommand], +}) +export class V0_52_UpgradeVersionCommandModule {} diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/upgrade-version-command.module.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/upgrade-version-command.module.ts index 64630fbe7..c23a37e21 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/upgrade-version-command.module.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/upgrade-version-command.module.ts @@ -4,10 +4,11 @@ import { TypeOrmModule } from '@nestjs/typeorm'; import { V0_43_UpgradeVersionCommandModule } from 'src/database/commands/upgrade-version-command/0-43/0-43-upgrade-version-command.module'; import { V0_44_UpgradeVersionCommandModule } from 'src/database/commands/upgrade-version-command/0-44/0-44-upgrade-version-command.module'; import { V0_50_UpgradeVersionCommandModule } from 'src/database/commands/upgrade-version-command/0-50/0-50-upgrade-version-command.module'; +import { V0_51_UpgradeVersionCommandModule } from 'src/database/commands/upgrade-version-command/0-51/0-51-upgrade-version-command.module'; +import { V0_52_UpgradeVersionCommandModule } from 'src/database/commands/upgrade-version-command/0-52/0-52-upgrade-version-command.module'; import { UpgradeCommand } from 'src/database/commands/upgrade-version-command/upgrade.command'; import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; import { WorkspaceSyncMetadataModule } from 'src/engine/workspace-manager/workspace-sync-metadata/workspace-sync-metadata.module'; -import { V0_51_UpgradeVersionCommandModule } from 'src/database/commands/upgrade-version-command/0-51/0-51-upgrade-version-command.module'; @Module({ imports: [ @@ -16,6 +17,7 @@ import { V0_51_UpgradeVersionCommandModule } from 'src/database/commands/upgrade V0_44_UpgradeVersionCommandModule, V0_50_UpgradeVersionCommandModule, V0_51_UpgradeVersionCommandModule, + V0_52_UpgradeVersionCommandModule, WorkspaceSyncMetadataModule, ], providers: [UpgradeCommand], diff --git a/packages/twenty-server/src/modules/workflow/workflow-executor/workflow-actions/types/workflow-action.type.ts b/packages/twenty-server/src/modules/workflow/workflow-executor/workflow-actions/types/workflow-action.type.ts index 0a1757ec8..14bfa14cb 100644 --- a/packages/twenty-server/src/modules/workflow/workflow-executor/workflow-actions/types/workflow-action.type.ts +++ b/packages/twenty-server/src/modules/workflow/workflow-executor/workflow-actions/types/workflow-action.type.ts @@ -25,6 +25,7 @@ type BaseWorkflowAction = { type: WorkflowActionType; settings: WorkflowActionSettings; valid: boolean; + nextStepIds?: string[]; }; export type WorkflowCodeAction = BaseWorkflowAction & {