From b80e83b6fc723aa1770b1e3995349ae2010cec7f Mon Sep 17 00:00:00 2001 From: Thomas Trompette Date: Wed, 14 Aug 2024 17:56:37 +0200 Subject: [PATCH] Throw errors instead of returning --- .../workflow-run.workspace-entity.ts | 2 +- .../workflow-runner.exception.ts | 11 ++++++++ .../workflow-runner/workflow-runner.job.ts | 27 ++++++++++++------- .../workflow-runner.service.ts | 16 ++++++++--- .../workflow-status/workflow-status.module.ts | 3 --- .../jobs/workflow-trigger-job.module.ts | 8 +----- .../workflow-trigger.exception.ts | 1 + .../workflow-trigger.service.ts | 17 ++++++++---- 8 files changed, 56 insertions(+), 29 deletions(-) create mode 100644 packages/twenty-server/src/modules/workflow/workflow-runner/workflow-runner.exception.ts diff --git a/packages/twenty-server/src/modules/workflow/common/standard-objects/workflow-run.workspace-entity.ts b/packages/twenty-server/src/modules/workflow/common/standard-objects/workflow-run.workspace-entity.ts index 28b2ae26ea25..6ab23b22c8e9 100644 --- a/packages/twenty-server/src/modules/workflow/common/standard-objects/workflow-run.workspace-entity.ts +++ b/packages/twenty-server/src/modules/workflow/common/standard-objects/workflow-run.workspace-entity.ts @@ -60,7 +60,7 @@ export class WorkflowRunWorkspaceEntity extends BaseWorkspaceEntity { @WorkspaceField({ standardId: WORKFLOW_RUN_STANDARD_FIELD_IDS.status, - type: FieldMetadataType.TEXT, + type: FieldMetadataType.SELECT, label: 'Workflow run status', description: 'Workflow run status', icon: 'IconHistory', diff --git a/packages/twenty-server/src/modules/workflow/workflow-runner/workflow-runner.exception.ts b/packages/twenty-server/src/modules/workflow/workflow-runner/workflow-runner.exception.ts new file mode 100644 index 000000000000..1bab0da515ee --- /dev/null +++ b/packages/twenty-server/src/modules/workflow/workflow-runner/workflow-runner.exception.ts @@ -0,0 +1,11 @@ +import { CustomException } from 'src/utils/custom-exception'; + +export class WorkflowRunnerException extends CustomException { + constructor(message: string, code: string) { + super(message, code); + } +} + +export enum WorkflowRunnerExceptionCode { + WORKFLOW_FAILED = 'WORKFLOW_FAILED', +} diff --git a/packages/twenty-server/src/modules/workflow/workflow-runner/workflow-runner.job.ts b/packages/twenty-server/src/modules/workflow/workflow-runner/workflow-runner.job.ts index 176418b6b46e..ab3d13d1a7e8 100644 --- a/packages/twenty-server/src/modules/workflow/workflow-runner/workflow-runner.job.ts +++ b/packages/twenty-server/src/modules/workflow/workflow-runner/workflow-runner.job.ts @@ -37,15 +37,24 @@ export class WorkflowRunnerJob { workflowVersionId, ); - const output = await this.workflowRunnerService.run({ - action: workflowVersion.trigger.nextAction, - workspaceId, - payload, - }); + try { + await this.workflowRunnerService.run({ + action: workflowVersion.trigger.nextAction, + workspaceId, + payload, + }); - await this.workflowStatusWorkspaceService.endWorkflowRun( - workflowRunId, - output.error ? WorkflowRunStatus.FAILED : WorkflowRunStatus.COMPLETED, - ); + await this.workflowStatusWorkspaceService.endWorkflowRun( + workflowRunId, + WorkflowRunStatus.COMPLETED, + ); + } catch (error) { + await this.workflowStatusWorkspaceService.endWorkflowRun( + workflowRunId, + WorkflowRunStatus.FAILED, + ); + + throw error; + } } } diff --git a/packages/twenty-server/src/modules/workflow/workflow-runner/workflow-runner.service.ts b/packages/twenty-server/src/modules/workflow/workflow-runner/workflow-runner.service.ts index 15454e4cdf3b..e8d37e85dfca 100644 --- a/packages/twenty-server/src/modules/workflow/workflow-runner/workflow-runner.service.ts +++ b/packages/twenty-server/src/modules/workflow/workflow-runner/workflow-runner.service.ts @@ -2,6 +2,10 @@ import { Injectable } from '@nestjs/common'; import { WorkflowAction } from 'src/modules/workflow/common/types/workflow-action.type'; import { WorkflowActionRunnerFactory } from 'src/modules/workflow/workflow-action-runner/workflow-action-runner.factory'; +import { + WorkflowRunnerException, + WorkflowRunnerExceptionCode, +} from 'src/modules/workflow/workflow-runner/workflow-runner.exception'; const MAX_RETRIES_ON_FAILURE = 3; @@ -52,7 +56,10 @@ export class WorkflowRunnerService { } if (!result.error) { - throw new Error('Execution result error, no data or error'); + throw new WorkflowRunnerException( + 'Execution result error, no data or error', + WorkflowRunnerExceptionCode.WORKFLOW_FAILED, + ); } if (action.settings.errorHandlingOptions.continueOnFailure.value) { @@ -75,8 +82,9 @@ export class WorkflowRunnerService { }); } - return { - error: result.error, - }; + throw new WorkflowRunnerException( + `Workflow failed: ${result.error}`, + WorkflowRunnerExceptionCode.WORKFLOW_FAILED, + ); } } diff --git a/packages/twenty-server/src/modules/workflow/workflow-status/workflow-status.module.ts b/packages/twenty-server/src/modules/workflow/workflow-status/workflow-status.module.ts index e27b5441df45..14eec4fb10c7 100644 --- a/packages/twenty-server/src/modules/workflow/workflow-status/workflow-status.module.ts +++ b/packages/twenty-server/src/modules/workflow/workflow-status/workflow-status.module.ts @@ -1,11 +1,8 @@ import { Module } from '@nestjs/common'; -import { TwentyORMModule } from 'src/engine/twenty-orm/twenty-orm.module'; -import { WorkflowRunWorkspaceEntity } from 'src/modules/workflow/common/standard-objects/workflow-run.workspace-entity'; import { WorkflowStatusWorkspaceService } from 'src/modules/workflow/workflow-status/workflow-status.workspace-service'; @Module({ - imports: [TwentyORMModule.forFeature([WorkflowRunWorkspaceEntity])], providers: [WorkflowStatusWorkspaceService], exports: [WorkflowStatusWorkspaceService], }) diff --git a/packages/twenty-server/src/modules/workflow/workflow-trigger/jobs/workflow-trigger-job.module.ts b/packages/twenty-server/src/modules/workflow/workflow-trigger/jobs/workflow-trigger-job.module.ts index 4fb310d85a91..4f03c12fd958 100644 --- a/packages/twenty-server/src/modules/workflow/workflow-trigger/jobs/workflow-trigger-job.module.ts +++ b/packages/twenty-server/src/modules/workflow/workflow-trigger/jobs/workflow-trigger-job.module.ts @@ -1,17 +1,11 @@ import { Module } from '@nestjs/common'; -import { TwentyORMModule } from 'src/engine/twenty-orm/twenty-orm.module'; -import { WorkflowWorkspaceEntity } from 'src/modules/workflow/common/standard-objects/workflow.workspace-entity'; import { WorkflowRunnerModule } from 'src/modules/workflow/workflow-runner/workflow-runner.module'; import { WorkflowStatusModule } from 'src/modules/workflow/workflow-status/workflow-status.module'; import { WorkflowEventTriggerJob } from 'src/modules/workflow/workflow-trigger/jobs/workflow-event-trigger.job'; @Module({ - imports: [ - WorkflowRunnerModule, - WorkflowStatusModule, - TwentyORMModule.forFeature([WorkflowWorkspaceEntity]), - ], + imports: [WorkflowRunnerModule, WorkflowStatusModule], providers: [WorkflowEventTriggerJob], }) export class WorkflowTriggerJobModule {} diff --git a/packages/twenty-server/src/modules/workflow/workflow-trigger/workflow-trigger.exception.ts b/packages/twenty-server/src/modules/workflow/workflow-trigger/workflow-trigger.exception.ts index 2f4621095065..dd15486857ee 100644 --- a/packages/twenty-server/src/modules/workflow/workflow-trigger/workflow-trigger.exception.ts +++ b/packages/twenty-server/src/modules/workflow/workflow-trigger/workflow-trigger.exception.ts @@ -12,4 +12,5 @@ export enum WorkflowTriggerExceptionCode { INVALID_WORKFLOW_TRIGGER = 'INVALID_WORKFLOW_TRIGGER', INVALID_WORKFLOW_VERSION = 'INVALID_WORKFLOW_VERSION', INVALID_ACTION_TYPE = 'INVALID_ACTION_TYPE', + INTERNAL_ERROR = 'INTERNAL_ERROR', } diff --git a/packages/twenty-server/src/modules/workflow/workflow-trigger/workflow-trigger.service.ts b/packages/twenty-server/src/modules/workflow/workflow-trigger/workflow-trigger.service.ts index 94b1720884ff..8cc8bc606609 100644 --- a/packages/twenty-server/src/modules/workflow/workflow-trigger/workflow-trigger.service.ts +++ b/packages/twenty-server/src/modules/workflow/workflow-trigger/workflow-trigger.service.ts @@ -32,11 +32,18 @@ export class WorkflowTriggerService { workflowVersionId, ); - return await this.workflowRunnerService.run({ - action: workflowVersion.trigger.nextAction, - workspaceId, - payload, - }); + try { + return await this.workflowRunnerService.run({ + action: workflowVersion.trigger.nextAction, + workspaceId, + payload, + }); + } catch (error) { + throw new WorkflowTriggerException( + `Error running workflow version ${error}`, + WorkflowTriggerExceptionCode.INTERNAL_ERROR, + ); + } } async enableWorkflowTrigger(workspaceId: string, workflowVersionId: string) {