Skip to content

Commit e5f14c9

Browse files
CarinaWollidevin-ai-integration[bot]Amit91848CarinaWollicoderabbitai[bot]
authored
feat: form submitted no event booked workflow trigger #2 (calcom#23716)
* refactor: improve _scheduleWorkflowReminders readability and add missing booking trigger events - Extract complex conditional logic into helper functions (isImmediateTrigger, isTimeBased, shouldProcessWorkflow) - Add missing workflow trigger events with immediate execution logic - Update test workflows to use different actions (EMAIL_ATTENDEE, SMS_ATTENDEE) for better differentiation - Fix translation function mock in confirm.handler.test.ts using mockNoTranslations utility - Maintain existing functionality while improving code maintainability Co-Authored-By: amit@cal.com <samit91848@gmail.com> * only show customt emplate for form triggers * filter outside scheduleWorkflowReminder * fix type check * chore: add more tests * test: add comprehensive unit tests for handleMarkNoShow with webhook and workflow coverage - Create handleMarkNoShow.test.ts following confirm.handler.test.ts pattern - Add expectBookingNoShowUpdatedWebhookToHaveBeenFired utility function - Test both webhook and workflow triggers for BOOKING_NO_SHOW_UPDATED - Cover attendee/host no-show scenarios, multiple attendees, and error cases - All 6 unit tests pass with proper mocking of external dependencies Co-Authored-By: amit@cal.com <samit91848@gmail.com> * Revert "test: add comprehensive unit tests for handleMarkNoShow with webhook and workflow coverage" This reverts commit 7642992. * fix: add new workflow triggers to api/v2 * update swagger docs * fix: e2e * fix type check * fix tests, add test for before after events * fix unit tests * revert confirm.handler.test * fix: unit tests * dummy form variables * add routing forms to active on dropdown * add migration file * Ui fixes for variables dropdown * remove other translation keys * review fixes * allow routing forms for activeOn * use repository function to get routing forms * remove unnecessary code * adjust logic in update handler * add triggers to api v2 * remvoe unused file * rename to getAcitveOnOptions handler * remove routingFormOptions handler * clean up getActiveOnOptions * refactor WorkflowService * remove logs * remove unused * fix: type check * fix: missed before after events for recurring * fix: calendarEvent handleMarkNoShow * fix error message Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * don't query disabled routing forms * create tasker function * add tasker code * move isFormTrigger function * small adjustments + todo comments * remove email to host action for form triggers * throw trpc error if email to host is added as step * fix dialog on how to use form responses as variables * remove add variable dropdown for form triggers * remove form workfows in event workflows tab * improvements for workflow logic on form submission * review fixes * base setup for seperate schedule functions (evt and form) * add missing BOOKING_PAID workflow trigger * fix pathname * fix: test for BOOKING_REQUESTED * fix activeOn ids * pass hideBranding and smsReminderNumber * adjustments to reminderScheduler * create empty scheduelForForm functions * pass locale and timezone with form user * pass formData instead of responses * pass timeFormat and locale * reusable function for email sending and reminder creation * implement scheduleEmailReminderForForm * remove added editor field from merge conflict * don't support cal.ai action with form triggers * throw bad request if form trigger and cal.ai is combined * add tests for scheduleFormWorkflows * add form submission tests * remove form response varibe info * clean up workflow actions * fixes for getting template options * pass triggerType to getAllWorkflows * move reusable logic to scheduleSMSReminder * add formdata to param type * type fixes for text reminder managers * implement scheduleSMSReminderForForm * fix import * fix isAuthorizedToAddActiveOnIds * disble whatsapp action * implement triggerFormSubmittedNoEventWorkflow * code clean up * Merge branch 'devin/1755107037-add-workflow-triggers' into feat/routing-form-workflow-triggers * fix type errors * remove async from getSubmitterEmail * fix type errors * revert cal.ai changes * fix type error * add sublogger * code clean up * fix type errors * remove label for attendee whatsapp action * code clean up * fixes saving teams on org workflows * fix type error * code improvements for activeOn ids * Revert "code improvements for activeOn ids" This reverts commit 0a3590a. * improve variable name * fix unit tests * small fixes * type fixes * remove unused translation keys * fix merge conflict issues * code clean up * remove SMS action support * remove more SMS code * add missing imports * set custom template for form action * type fixes * fix tasker endpoint * fix duplicate check * fix workfows.test.ts * use repository funciton to getHideBranding * code clean up * fix hasDuplicateSubmission * code clean up * select only needed properties * remove repository functions * Revert "remove repository functions" This reverts commit 7aa47b1. * add scheduleWorkflows function * Revert "add scheduleWorkflows function" This reverts commit fe5db4f. * move type to /types * Revert "move type to /types" This reverts commit 91e0152. * revert changes causing type errors * remove import * remove unused import * Revert "remove unused import" This reverts commit 1916768. * revert changed from attempt to fix type errors * pass object to gt all workflows * fix isAuthorized check * trigger filtering * remove form submitted no event booked code * remove form submitted no event from schema * remove more code * remove test * fixes * add getSubmitterEmail function * add trigger * small fixes * add missing workflow DTOs * small fixes * use activeOnWithChildren * fix active on when switching trigger type * remove add variable dropdown * add getAllWorkflowsFromRoutingForm to WorkflowService * fix error caused by undefined evt * fix type error * fix type error * fix tests * code clean up * final fixes and clean up * remove console.log * remove template text form from triggers * add routing form repoditory function * fix bug with key * fix test * add missing trigger in update-workflow.input.ts * ForEvt and ForForm function for aiPhoneCallManager * chore: add support for form workflows on api v2 * fixup! chore: add support for form workflows on api v2 * use only repository functions in update handler * move all prisma queries from list.handler * review suggestions * chore: handle workflows api v2 * chore: handle workflows api v2, split in 2 endpoints * fix workflow step creation * remove connect agent and fixes types * add type to workflow * chore: use workflow type in apiv2 WorkflowsOutputService * update worklfow type on update * chore: use workflow type in apiv2 WorkflowsOutputService * fix template body for torm trigger * some UI fixes for email subject/body * resetting email body when changing form triggers * use type field to query workflows * clean up all old active on values * remove responseId from all funciton calls * remove undefined from updateTemplate * refactor: split routing form and event-type workflows code * refactor: split routing form and event-type workflows code * fix template text when adding action * chore: don't rename WorkflowActivationDto to avoid ci blocking * refine update schedule to use only allowed actions * fix type error * don't allow whatsapp action with form trigger * fix type error * return early if activeOn array is empty * fix: from step type in BaseFormWorkflowStepDto * fixup! fix: from step type in BaseFormWorkflowStepDto * api v2 updates * move all prisma calls to repository (service/workflows.ts) * use FORM_TRIGGER_WORKFLOW_EVENTS for form queries * use userRepository * use FORM_TRIGGER_WORKFLOW_EVENTS in isFormTrigger * code clean up * code clean up * use repository functions in formSubmissionValidation.ts * add back trpc import * fix agent repository functions * remove unsued import * fixes for offset api v2 * add missing responseId * fix failing test --------- Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-authored-by: amit@cal.com <samit91848@gmail.com> Co-authored-by: CarinaWolli <wollencarina@gmail.com> Co-authored-by: Amit Sharma <74371312+Amit91848@users.noreply.github.com> Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> Co-authored-by: Udit Takkar <53316345+Udit-takkar@users.noreply.github.com> Co-authored-by: Benny Joo <sldisek783@gmail.com> Co-authored-by: cal.com <morgan@cal.com> Co-authored-by: Morgan <33722304+ThyMinimalDev@users.noreply.github.com>
1 parent bed76be commit e5f14c9

25 files changed

Lines changed: 744 additions & 102 deletions

File tree

apps/api/v2/src/modules/organizations/teams/workflows/controllers/org-team-workflows.controller.e2e-spec.ts

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,10 @@ import {
2727
BEFORE_EVENT,
2828
DAY,
2929
FORM_SUBMITTED,
30+
FORM_SUBMITTED_NO_EVENT,
3031
OnAfterEventTriggerDto,
3132
OnBeforeEventTriggerDto,
33+
OnFormSubmittedNoEventTriggerDto,
3234
OnFormSubmittedTriggerDto,
3335
} from "@/modules/workflows/inputs/workflow-trigger.input";
3436
import {
@@ -471,6 +473,64 @@ describe("OrganizationsTeamsWorkflowsController (E2E)", () => {
471473
});
472474
});
473475

476+
it("should create a new routing form workflow with allowed actions and offset trigger", async () => {
477+
const validWorkflow = structuredClone(
478+
sampleCreateWorkflowRoutingFormDto
479+
) as unknown as CreateFormWorkflowDto;
480+
validWorkflow.steps = [
481+
{
482+
stepNumber: 1,
483+
action: "email_attendee",
484+
recipient: ATTENDEE,
485+
template: REMINDER,
486+
sender: "CalcomE2EStep1",
487+
includeCalendarEvent: true,
488+
message: {
489+
subject: "Upcoming: {EVENT_NAME}",
490+
html: "<p>Reminder for your event {EVENT_NAME}.</p>",
491+
},
492+
},
493+
];
494+
495+
validWorkflow.trigger = {
496+
type: FORM_SUBMITTED_NO_EVENT,
497+
offset: {
498+
value: 1,
499+
unit: DAY,
500+
},
501+
};
502+
return request(app.getHttpServer())
503+
.post(`${basePath}/routing-form`)
504+
.set({ Authorization: `Bearer cal_test_${apiKeyString}` })
505+
.send(validWorkflow)
506+
.expect(201)
507+
.then((response) => {
508+
const responseBody: GetRoutingFormWorkflowOutput = response.body;
509+
expect(responseBody.status).toEqual(SUCCESS_STATUS);
510+
expect(responseBody.data).toBeDefined();
511+
expect(responseBody.data.name).toEqual(sampleCreateWorkflowRoutingFormDto.name);
512+
expect(responseBody.data.type).toEqual("routing-form");
513+
514+
if (responseBody.data.activation instanceof WorkflowFormActivationDto) {
515+
expect(responseBody.data.activation.isActiveOnAllRoutingForms).toEqual(
516+
sampleCreateWorkflowRoutingFormDto.activation.isActiveOnAllRoutingForms
517+
);
518+
}
519+
520+
expect(responseBody.data.trigger.type).toEqual(validWorkflow.trigger.type);
521+
expect(responseBody.data.steps).toHaveLength(sampleCreateWorkflowRoutingFormDto.steps.length);
522+
expect(responseBody.data.steps.find((step) => step.stepNumber === 1)?.id).toBeDefined();
523+
expect(responseBody.data.steps.find((step) => step.stepNumber === 1)?.sender).toEqual(
524+
"CalcomE2EStep1"
525+
);
526+
527+
const trigger = validWorkflow.trigger as OnFormSubmittedNoEventTriggerDto;
528+
expect(responseBody.data.trigger?.type).toEqual(trigger.type);
529+
expect(responseBody.data.trigger?.offset?.unit).toEqual(trigger.offset.unit);
530+
expect(responseBody.data.trigger?.offset?.value).toEqual(trigger.offset.value);
531+
});
532+
});
533+
474534
it("should create a new workflow", async () => {
475535
return request(app.getHttpServer())
476536
.post(basePath)

apps/api/v2/src/modules/workflows/inputs/create-form-workflow.ts

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@ import {
1313
import {
1414
RoutingFormWorkflowTriggerDto,
1515
FORM_SUBMITTED,
16+
FORM_SUBMITTED_NO_EVENT,
1617
FORM_WORKFLOW_TRIGGER_TYPES,
18+
OnFormSubmittedNoEventTriggerDto,
1719
OnFormSubmittedTriggerDto,
1820
} from "./workflow-trigger.input";
1921

@@ -39,6 +41,7 @@ export class WorkflowFormActivationDto {
3941

4042
@ApiExtraModels(
4143
OnFormSubmittedTriggerDto,
44+
OnFormSubmittedNoEventTriggerDto,
4245
WorkflowEmailAddressStepDto,
4346
WorkflowEmailAttendeeStepDto,
4447
RoutingFormWorkflowTriggerDto,
@@ -59,17 +62,23 @@ export class CreateFormWorkflowDto {
5962

6063
@ApiProperty({
6164
description: `Trigger configuration for the routing-form workflow, allowed triggers are ${FORM_WORKFLOW_TRIGGER_TYPES.toString()}`,
62-
oneOf: [{ $ref: getSchemaPath(OnFormSubmittedTriggerDto) }],
65+
oneOf: [
66+
{ $ref: getSchemaPath(OnFormSubmittedTriggerDto) },
67+
{ $ref: getSchemaPath(OnFormSubmittedNoEventTriggerDto) },
68+
],
6369
})
6470
@ValidateNested()
6571
@Type(() => RoutingFormWorkflowTriggerDto, {
6672
keepDiscriminatorProperty: true,
6773
discriminator: {
6874
property: "type",
69-
subTypes: [{ value: OnFormSubmittedTriggerDto, name: FORM_SUBMITTED }],
75+
subTypes: [
76+
{ value: OnFormSubmittedTriggerDto, name: FORM_SUBMITTED },
77+
{ value: OnFormSubmittedNoEventTriggerDto, name: FORM_SUBMITTED_NO_EVENT },
78+
],
7079
},
7180
})
72-
trigger!: OnFormSubmittedTriggerDto;
81+
trigger!: OnFormSubmittedTriggerDto | OnFormSubmittedNoEventTriggerDto;
7382

7483
@ApiProperty({
7584
description: `Steps to execute as part of the routing-form workflow, allowed steps are ${FORM_ALLOWED_STEP_ACTIONS.toString()}`,

apps/api/v2/src/modules/workflows/inputs/update-form-workflow.input.ts

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,16 @@ import {
1818
} from "./workflow-step.input";
1919
import {
2020
OnFormSubmittedTriggerDto,
21+
OnFormSubmittedNoEventTriggerDto,
2122
FORM_SUBMITTED,
23+
FORM_SUBMITTED_NO_EVENT,
2224
FORM_WORKFLOW_TRIGGER_TYPES,
2325
RoutingFormWorkflowTriggerDto,
2426
} from "./workflow-trigger.input";
2527

2628
@ApiExtraModels(
2729
OnFormSubmittedTriggerDto,
30+
OnFormSubmittedNoEventTriggerDto,
2831
UpdateEmailAddressWorkflowStepDto,
2932
UpdateEmailAttendeeWorkflowStepDto,
3033
UpdateEmailHostWorkflowStepDto,
@@ -48,18 +51,24 @@ export class UpdateFormWorkflowDto {
4851

4952
@ApiPropertyOptional({
5053
description: `Trigger configuration for the routing-form workflow, allowed triggers are ${FORM_WORKFLOW_TRIGGER_TYPES}`,
51-
oneOf: [{ $ref: getSchemaPath(OnFormSubmittedTriggerDto) }],
54+
oneOf: [
55+
{ $ref: getSchemaPath(OnFormSubmittedTriggerDto) },
56+
{ $ref: getSchemaPath(OnFormSubmittedNoEventTriggerDto) },
57+
],
5258
})
5359
@IsOptional()
5460
@ValidateNested()
5561
@Type(() => RoutingFormWorkflowTriggerDto, {
5662
keepDiscriminatorProperty: true,
5763
discriminator: {
5864
property: "type",
59-
subTypes: [{ value: OnFormSubmittedTriggerDto, name: FORM_SUBMITTED }],
65+
subTypes: [
66+
{ value: OnFormSubmittedTriggerDto, name: FORM_SUBMITTED },
67+
{ value: OnFormSubmittedNoEventTriggerDto, name: FORM_SUBMITTED_NO_EVENT },
68+
],
6069
},
6170
})
62-
trigger?: OnFormSubmittedTriggerDto;
71+
trigger?: OnFormSubmittedTriggerDto | OnFormSubmittedNoEventTriggerDto;
6372

6473
@ApiPropertyOptional({
6574
description: `Steps to execute as part of the routing-form workflow, allowed steps are ${FORM_ALLOWED_STEP_ACTIONS.toString()}`,

apps/api/v2/src/modules/workflows/inputs/workflow-trigger.input.ts

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,14 @@ export const RESCHEDULE_EVENT = "rescheduleEvent";
1212
export const AFTER_HOSTS_CAL_VIDEO_NO_SHOW = "afterHostsCalVideoNoShow";
1313
export const AFTER_GUESTS_CAL_VIDEO_NO_SHOW = "afterGuestsCalVideoNoShow";
1414
export const FORM_SUBMITTED = "formSubmitted";
15+
export const FORM_SUBMITTED_NO_EVENT = "formSubmittedNoEvent";
1516
export const BOOKING_REJECTED = "bookingRejected";
1617
export const BOOKING_REQUESTED = "bookingRequested";
1718
export const BOOKING_PAYMENT_INITIATED = "bookingPaymentInitiated";
1819
export const BOOKING_PAID = "bookingPaid";
1920
export const BOOKING_NO_SHOW_UPDATED = "bookingNoShowUpdated";
2021

21-
export const FORM_WORKFLOW_TRIGGER_TYPES = [FORM_SUBMITTED] as const;
22+
export const FORM_WORKFLOW_TRIGGER_TYPES = [FORM_SUBMITTED, FORM_SUBMITTED_NO_EVENT] as const;
2223

2324
export const EVENT_TYPE_WORKFLOW_TRIGGER_TYPES = [
2425
BEFORE_EVENT,
@@ -44,6 +45,7 @@ export const WORKFLOW_TRIGGER_TYPES = [
4445
AFTER_HOSTS_CAL_VIDEO_NO_SHOW,
4546
AFTER_GUESTS_CAL_VIDEO_NO_SHOW,
4647
FORM_SUBMITTED,
48+
FORM_SUBMITTED_NO_EVENT,
4749
BOOKING_REJECTED,
4850
BOOKING_REQUESTED,
4951
BOOKING_PAYMENT_INITIATED,
@@ -60,13 +62,27 @@ export const WORKFLOW_TRIGGER_TO_ENUM = {
6062
[AFTER_HOSTS_CAL_VIDEO_NO_SHOW]: WorkflowTriggerEvents.AFTER_HOSTS_CAL_VIDEO_NO_SHOW,
6163
[AFTER_GUESTS_CAL_VIDEO_NO_SHOW]: WorkflowTriggerEvents.AFTER_GUESTS_CAL_VIDEO_NO_SHOW,
6264
[FORM_SUBMITTED]: WorkflowTriggerEvents.FORM_SUBMITTED,
65+
[FORM_SUBMITTED_NO_EVENT]: WorkflowTriggerEvents.FORM_SUBMITTED_NO_EVENT,
6366
[BOOKING_REJECTED]: WorkflowTriggerEvents.BOOKING_REJECTED,
6467
[BOOKING_REQUESTED]: WorkflowTriggerEvents.BOOKING_REQUESTED,
6568
[BOOKING_PAYMENT_INITIATED]: WorkflowTriggerEvents.BOOKING_PAYMENT_INITIATED,
6669
[BOOKING_NO_SHOW_UPDATED]: WorkflowTriggerEvents.BOOKING_NO_SHOW_UPDATED,
6770
[BOOKING_PAID]: WorkflowTriggerEvents.BOOKING_PAID,
6871
} as const;
6972

73+
export const ENUM_ROUTING_FORM_WORFLOW_TRIGGERS = [
74+
WORKFLOW_TRIGGER_TO_ENUM[FORM_SUBMITTED_NO_EVENT],
75+
WORKFLOW_TRIGGER_TO_ENUM[FORM_SUBMITTED],
76+
];
77+
78+
export const ENUM_OFFSET_WORFLOW_TRIGGERS = [
79+
WORKFLOW_TRIGGER_TO_ENUM[FORM_SUBMITTED_NO_EVENT],
80+
WORKFLOW_TRIGGER_TO_ENUM[BEFORE_EVENT],
81+
WORKFLOW_TRIGGER_TO_ENUM[AFTER_EVENT],
82+
WORKFLOW_TRIGGER_TO_ENUM[AFTER_GUESTS_CAL_VIDEO_NO_SHOW],
83+
WORKFLOW_TRIGGER_TO_ENUM[AFTER_HOSTS_CAL_VIDEO_NO_SHOW],
84+
];
85+
7086
export const ENUM_TO_WORKFLOW_TRIGGER = {
7187
[WorkflowTriggerEvents.BEFORE_EVENT]: BEFORE_EVENT,
7288
[WorkflowTriggerEvents.EVENT_CANCELLED]: EVENT_CANCELLED,
@@ -76,6 +92,7 @@ export const ENUM_TO_WORKFLOW_TRIGGER = {
7692
[WorkflowTriggerEvents.AFTER_HOSTS_CAL_VIDEO_NO_SHOW]: AFTER_HOSTS_CAL_VIDEO_NO_SHOW,
7793
[WorkflowTriggerEvents.AFTER_GUESTS_CAL_VIDEO_NO_SHOW]: AFTER_GUESTS_CAL_VIDEO_NO_SHOW,
7894
[WorkflowTriggerEvents.FORM_SUBMITTED]: FORM_SUBMITTED,
95+
[WorkflowTriggerEvents.FORM_SUBMITTED_NO_EVENT]: FORM_SUBMITTED_NO_EVENT,
7996
[WorkflowTriggerEvents.BOOKING_REJECTED]: BOOKING_REJECTED,
8097
[WorkflowTriggerEvents.BOOKING_REQUESTED]: BOOKING_REQUESTED,
8198
[WorkflowTriggerEvents.BOOKING_PAYMENT_INITIATED]: BOOKING_PAYMENT_INITIATED,
@@ -205,7 +222,8 @@ export class OnNoShowUpdateTriggerDto {
205222

206223
export class TriggerOffsetDTO {
207224
@ApiProperty({
208-
description: "Offset before/after the trigger time; required for BEFORE_EVENT and AFTER_EVENT only",
225+
description:
226+
"Offset before/after the trigger time; required for BEFORE_EVENT, AFTER_EVENT, and FORM_SUBMITTED_NO_EVENT",
209227
type: WorkflowTriggerOffsetDto,
210228
})
211229
@ValidateNested()
@@ -261,3 +279,22 @@ export class OnFormSubmittedTriggerDto {
261279
@IsIn([FORM_SUBMITTED])
262280
type: typeof FORM_SUBMITTED = FORM_SUBMITTED;
263281
}
282+
283+
export class OnFormSubmittedNoEventTriggerDto extends TriggerOffsetDTO {
284+
@ApiProperty({
285+
description: "Trigger type for the workflow",
286+
example: FORM_SUBMITTED_NO_EVENT,
287+
})
288+
@IsString()
289+
@IsIn([FORM_SUBMITTED_NO_EVENT])
290+
type: typeof FORM_SUBMITTED_NO_EVENT = FORM_SUBMITTED_NO_EVENT;
291+
}
292+
293+
export const OffsetTriggerDTOInstances = [
294+
OnFormSubmittedNoEventTriggerDto,
295+
OnBeforeEventTriggerDto,
296+
OnAfterEventTriggerDto,
297+
OnAfterCalVideoGuestsNoShowTriggerDto,
298+
OnAfterEventTriggerDto,
299+
];
300+
export type OffsetTriggerDTOInstancesType = InstanceType<(typeof OffsetTriggerDTOInstances)[number]>;

apps/api/v2/src/modules/workflows/outputs/routing-form-workflow.output.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ export class RoutingFormWorkflowTriggerOutputDto {
3535
type!: WorkflowFormTriggerType;
3636

3737
@ApiPropertyOptional({
38-
description: "Offset details (present for BEFORE_EVENT/AFTER_EVENT)",
38+
description: "Offset details (present for BEFORE_EVENT/AFTER_EVENT/FORM_SUBMITTED_NO_EVENT)",
3939
type: WorkflowTriggerOffsetOutputDto,
4040
})
4141
@Expose()

apps/api/v2/src/modules/workflows/services/workflows.input.service.ts

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ import {
2121
WHATSAPP_NUMBER,
2222
} from "../inputs/workflow-step.input";
2323
import {
24-
OnAfterEventTriggerDto,
25-
OnBeforeEventTriggerDto,
24+
OffsetTriggerDTOInstances,
25+
OffsetTriggerDTOInstancesType,
2626
TIME_UNIT_TO_ENUM,
2727
WORKFLOW_TRIGGER_TO_ENUM,
2828
} from "../inputs/workflow-trigger.input";
@@ -31,6 +31,12 @@ import {
3131
export class WorkflowsInputService {
3232
constructor(private readonly teamsVerifiedResourcesRepository: TeamsVerifiedResourcesRepository) {}
3333

34+
private _isOffsetTrigger(
35+
trigger: UpdateEventTypeWorkflowDto["trigger"] | UpdateFormWorkflowDto["trigger"]
36+
): trigger is OffsetTriggerDTOInstancesType {
37+
return OffsetTriggerDTOInstances.some((Instance) => trigger instanceof Instance);
38+
}
39+
3440
private async _getTeamPhoneNumberFromVerifiedId(teamId: number, verifiedPhoneId: number) {
3541
const phoneResource = await this.teamsVerifiedResourcesRepository.getTeamVerifiedPhoneNumberById(
3642
verifiedPhoneId,
@@ -135,17 +141,13 @@ export class WorkflowsInputService {
135141
? WORKFLOW_TRIGGER_TO_ENUM[updateDto?.trigger?.type]
136142
: currentData.trigger;
137143

138-
const timeUnitForZod =
139-
updateDto.trigger instanceof OnBeforeEventTriggerDto ||
140-
updateDto.trigger instanceof OnAfterEventTriggerDto
141-
? updateDto?.trigger?.offset?.unit ?? currentData.timeUnit ?? null
142-
: undefined;
143-
144-
const time =
145-
updateDto.trigger instanceof OnBeforeEventTriggerDto ||
146-
updateDto.trigger instanceof OnAfterEventTriggerDto
147-
? updateDto?.trigger?.offset?.value ?? currentData?.time ?? null
148-
: null;
144+
const timeUnitForZod = this._isOffsetTrigger(updateDto.trigger)
145+
? updateDto?.trigger?.offset?.unit ?? currentData.timeUnit ?? null
146+
: undefined;
147+
148+
const time = this._isOffsetTrigger(updateDto.trigger)
149+
? updateDto?.trigger?.offset?.value ?? currentData?.time ?? null
150+
: null;
149151

150152
const timeUnit = timeUnitForZod ? TIME_UNIT_TO_ENUM[timeUnitForZod] : null;
151153

0 commit comments

Comments
 (0)