diff --git a/apps/api/v2/src/modules/organizations/teams/workflows/controllers/org-team-workflows.controller.e2e-spec.ts b/apps/api/v2/src/modules/organizations/teams/workflows/controllers/org-team-workflows.controller.e2e-spec.ts index 27adea6639..44b1af297b 100644 --- a/apps/api/v2/src/modules/organizations/teams/workflows/controllers/org-team-workflows.controller.e2e-spec.ts +++ b/apps/api/v2/src/modules/organizations/teams/workflows/controllers/org-team-workflows.controller.e2e-spec.ts @@ -12,7 +12,12 @@ import { EMAIL, WorkflowEmailAttendeeStepDto, } from "@/modules/workflows/inputs/workflow-step.input"; -import { BEFORE_EVENT, DAY } from "@/modules/workflows/inputs/workflow-trigger.input"; +import { + BEFORE_EVENT, + DAY, + OnAfterEventTriggerDto, + OnBeforeEventTriggerDto, +} from "@/modules/workflows/inputs/workflow-trigger.input"; // Adjust path if needed import { GetWorkflowOutput, GetWorkflowsOutput } from "@/modules/workflows/outputs/workflow.output"; import { INestApplication } from "@nestjs/common"; @@ -255,6 +260,10 @@ describe("OrganizationsTeamsWorkflowsController (E2E)", () => { "+37255555555" ); expect(responseBody.data.steps.find((step) => step.stepNumber === 3)?.email).toEqual(authEmail); + const trigger = sampleCreateWorkflowDto.trigger as OnBeforeEventTriggerDto; + expect(responseBody.data.trigger?.offset?.value).toEqual(trigger.offset.value); + expect(responseBody.data.trigger?.offset?.unit).toEqual(trigger.offset.unit); + createdWorkflowId = responseBody.data.id; createdWorkflow = responseBody.data; }); @@ -330,6 +339,13 @@ describe("OrganizationsTeamsWorkflowsController (E2E)", () => { expect(step1).toBeDefined(); const partialUpdateDto: Partial = { name: updatedName, + trigger: { + type: "afterEvent", + offset: { + unit: "minute", + value: 10, + }, + }, steps: step1 ? [{ ...step1, sender: "updatedSender" } as WorkflowEmailAttendeeStepDto] : [], }; expect(createdWorkflowId).toBeDefined(); @@ -348,6 +364,10 @@ describe("OrganizationsTeamsWorkflowsController (E2E)", () => { step1 && expect(responseBody.data.steps[0].id).toEqual(step1.id); expect(responseBody.data.steps[0].sender).toEqual("updatedSender"); expect(responseBody.data.steps[1]?.id).toBeUndefined(); + const trigger = partialUpdateDto.trigger as OnAfterEventTriggerDto; + expect(responseBody.data.trigger?.type).toEqual(trigger.type); + expect(responseBody.data.trigger?.offset?.value).toEqual(trigger.offset.value); + expect(responseBody.data.trigger?.offset?.unit).toEqual(trigger.offset.unit); }); }); diff --git a/apps/api/v2/src/modules/workflows/inputs/workflow-trigger.input.ts b/apps/api/v2/src/modules/workflows/inputs/workflow-trigger.input.ts index 08d3bdfdb6..84d3d8152b 100644 --- a/apps/api/v2/src/modules/workflows/inputs/workflow-trigger.input.ts +++ b/apps/api/v2/src/modules/workflows/inputs/workflow-trigger.input.ts @@ -1,7 +1,7 @@ import { ApiProperty } from "@nestjs/swagger"; import { TimeUnit, WorkflowTriggerEvents } from "@prisma/client"; import { Type } from "class-transformer"; -import { IsNumber, ValidateNested } from "class-validator"; +import { IsIn, IsNumber, IsString, ValidateNested } from "class-validator"; export const BEFORE_EVENT = "beforeEvent"; export const EVENT_CANCELLED = "eventCancelled"; @@ -68,6 +68,8 @@ export class WorkflowTriggerOffsetDto { value!: number; @ApiProperty({ description: "Unit for the offset time", example: HOUR }) + @IsString() + @IsIn(TIME_UNITS) unit!: TimeUnitType; } @@ -75,6 +77,8 @@ export class BaseWorkflowTriggerDto { @ApiProperty({ description: "Trigger type for the workflow", }) + @IsString() + @IsIn([WORKFLOW_TRIGGER_TYPES]) type!: WorkflowTriggerType; } @@ -82,6 +86,8 @@ export class OnCreationTriggerDto { @ApiProperty({ description: "Trigger type for the workflow", }) + @IsString() + @IsIn([NEW_EVENT]) type: typeof NEW_EVENT = NEW_EVENT; } @@ -89,12 +95,16 @@ export class OnRescheduleTriggerDto { @ApiProperty({ description: "Trigger type for the workflow", }) + @IsString() + @IsIn([RESCHEDULE_EVENT]) type: typeof RESCHEDULE_EVENT = RESCHEDULE_EVENT; } export class OnCancelTriggerDto { @ApiProperty({ description: "Trigger type for the workflow", }) + @IsString() + @IsIn([EVENT_CANCELLED]) type: typeof EVENT_CANCELLED = EVENT_CANCELLED; } @@ -113,6 +123,8 @@ export class OnBeforeEventTriggerDto extends TriggerOffsetDTO { description: "Trigger type for the workflow", example: BEFORE_EVENT, }) + @IsString() + @IsIn([BEFORE_EVENT]) type: typeof BEFORE_EVENT = BEFORE_EVENT; } @@ -121,6 +133,8 @@ export class OnAfterEventTriggerDto extends TriggerOffsetDTO { description: "Trigger type for the workflow", example: AFTER_EVENT, }) + @IsString() + @IsIn([AFTER_EVENT]) type: typeof AFTER_EVENT = AFTER_EVENT; } @@ -129,6 +143,8 @@ export class OnAfterCalVideoGuestsNoShowTriggerDto extends TriggerOffsetDTO { description: "Trigger type for the workflow", example: AFTER_GUESTS_CAL_VIDEO_NO_SHOW, }) + @IsString() + @IsIn([AFTER_GUESTS_CAL_VIDEO_NO_SHOW]) type: typeof AFTER_GUESTS_CAL_VIDEO_NO_SHOW = AFTER_GUESTS_CAL_VIDEO_NO_SHOW; } @@ -137,5 +153,7 @@ export class OnAfterCalVideoHostsNoShowTriggerDto extends TriggerOffsetDTO { description: "Trigger type for the workflow", example: AFTER_HOSTS_CAL_VIDEO_NO_SHOW, }) + @IsString() + @IsIn([AFTER_HOSTS_CAL_VIDEO_NO_SHOW]) type: typeof AFTER_HOSTS_CAL_VIDEO_NO_SHOW = AFTER_HOSTS_CAL_VIDEO_NO_SHOW; }