Skip to content

Commit 84fb4f6

Browse files
CarinaWolliCarinaWolli
and
CarinaWolli
authored
fix: wrong workflow notifications when enabling workflows (#18169)
* only schedule workflow emails not send * fix if statement --------- Co-authored-by: CarinaWolli <wollencarina@gmail.com>
1 parent b5ab6fe commit 84fb4f6

File tree

1 file changed

+145
-141
lines changed

1 file changed

+145
-141
lines changed

packages/trpc/server/routers/viewer/workflows/activateEventType.handler.ts

+145-141
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { WorkflowRepository } from "@calcom/lib/server/repository/workflow";
66
import { getTimeFormatStringFromUserTimeFormat } from "@calcom/lib/timeFormat";
77
import { prisma } from "@calcom/prisma";
88
import { BookingStatus } from "@calcom/prisma/client";
9-
import { MembershipRole, SchedulingType, WorkflowActions } from "@calcom/prisma/enums";
9+
import { MembershipRole, SchedulingType, WorkflowActions, WorkflowTriggerEvents } from "@calcom/prisma/enums";
1010
import { EventTypeMetaDataSchema } from "@calcom/prisma/zod-utils";
1111
import type { TrpcSessionUser } from "@calcom/trpc/server/trpc";
1212

@@ -186,160 +186,164 @@ export const activateEventTypeHandler = async ({ ctx, input }: ActivateEventType
186186
}
187187
await removeSmsReminderFieldForEventTypes({ activeOnToRemove: activeOn, workflowId, isOrg });
188188
} else {
189-
// activate workflow and schedule reminders for existing bookings
190-
191-
const bookingsForReminders = await prisma.booking.findMany({
192-
where: {
193-
eventTypeId: eventTypeId,
194-
status: BookingStatus.ACCEPTED,
195-
startTime: {
196-
gte: new Date(),
189+
if (
190+
eventTypeWorkflow.trigger == WorkflowTriggerEvents.BEFORE_EVENT ||
191+
eventTypeWorkflow.trigger == WorkflowTriggerEvents.AFTER_EVENT
192+
) {
193+
// activate workflow and schedule reminders for existing bookings
194+
const bookingsForReminders = await prisma.booking.findMany({
195+
where: {
196+
eventTypeId: eventTypeId,
197+
status: BookingStatus.ACCEPTED,
198+
startTime: {
199+
gte: new Date(),
200+
},
197201
},
198-
},
199-
include: {
200-
attendees: true,
201-
eventType: {
202-
select: {
203-
schedulingType: true,
204-
slug: true,
205-
hosts: {
206-
select: {
207-
user: {
208-
select: {
209-
email: true,
210-
destinationCalendar: {
211-
select: {
212-
primaryEmail: true,
202+
include: {
203+
attendees: true,
204+
eventType: {
205+
select: {
206+
schedulingType: true,
207+
slug: true,
208+
hosts: {
209+
select: {
210+
user: {
211+
select: {
212+
email: true,
213+
destinationCalendar: {
214+
select: {
215+
primaryEmail: true,
216+
},
213217
},
214218
},
215219
},
216220
},
217221
},
218222
},
219223
},
224+
user: true,
220225
},
221-
user: true,
222-
},
223-
});
226+
});
224227

225-
const bookerUrl = await getBookerBaseUrl(ctx.user.organizationId ?? null);
228+
const bookerUrl = await getBookerBaseUrl(ctx.user.organizationId ?? null);
229+
230+
for (const booking of bookingsForReminders) {
231+
const defaultLocale = "en";
232+
const bookingInfo = {
233+
uid: booking.uid,
234+
bookerUrl,
235+
attendees: booking.attendees.map((attendee) => {
236+
return {
237+
name: attendee.name,
238+
email: attendee.email,
239+
timeZone: attendee.timeZone,
240+
language: { locale: attendee.locale || defaultLocale },
241+
};
242+
}),
243+
organizer: booking.user
244+
? {
245+
name: booking.user.name || "",
246+
email: booking?.userPrimaryEmail ?? booking.user.email,
247+
timeZone: booking.user.timeZone,
248+
timeFormat: getTimeFormatStringFromUserTimeFormat(booking.user.timeFormat),
249+
language: { locale: booking.user.locale || defaultLocale },
250+
}
251+
: { name: "", email: "", timeZone: "", language: { locale: "" } },
252+
startTime: booking.startTime.toISOString(),
253+
endTime: booking.endTime.toISOString(),
254+
title: booking.title,
255+
language: { locale: booking?.user?.locale || defaultLocale },
256+
eventType: {
257+
slug: booking.eventType?.slug || "",
258+
schedulingType: booking.eventType?.schedulingType,
259+
hosts: booking.eventType?.hosts,
260+
},
261+
metadata: booking.metadata,
262+
};
263+
for (const step of eventTypeWorkflow.steps) {
264+
if (
265+
step.action === WorkflowActions.EMAIL_ATTENDEE ||
266+
step.action === WorkflowActions.EMAIL_HOST ||
267+
step.action === WorkflowActions.EMAIL_ADDRESS
268+
) {
269+
let sendTo: string[] = [];
226270

227-
for (const booking of bookingsForReminders) {
228-
const defaultLocale = "en";
229-
const bookingInfo = {
230-
uid: booking.uid,
231-
bookerUrl,
232-
attendees: booking.attendees.map((attendee) => {
233-
return {
234-
name: attendee.name,
235-
email: attendee.email,
236-
timeZone: attendee.timeZone,
237-
language: { locale: attendee.locale || defaultLocale },
238-
};
239-
}),
240-
organizer: booking.user
241-
? {
242-
name: booking.user.name || "",
243-
email: booking?.userPrimaryEmail ?? booking.user.email,
244-
timeZone: booking.user.timeZone,
245-
timeFormat: getTimeFormatStringFromUserTimeFormat(booking.user.timeFormat),
246-
language: { locale: booking.user.locale || defaultLocale },
271+
switch (step.action) {
272+
case WorkflowActions.EMAIL_HOST:
273+
sendTo = [bookingInfo.organizer?.email];
274+
const schedulingType = bookingInfo.eventType?.schedulingType;
275+
const hosts = bookingInfo.eventType.hosts
276+
?.filter((host) =>
277+
bookingInfo.attendees.some((attendee) => host.user.email === attendee.email)
278+
)
279+
.map(({ user }) => user.destinationCalendar?.primaryEmail ?? user.email);
280+
if (
281+
(schedulingType === SchedulingType.ROUND_ROBIN ||
282+
schedulingType === SchedulingType.COLLECTIVE) &&
283+
hosts
284+
) {
285+
sendTo = sendTo.concat(hosts);
286+
}
287+
break;
288+
case WorkflowActions.EMAIL_ATTENDEE:
289+
sendTo = bookingInfo.attendees
290+
.map((attendee) => attendee.email)
291+
.filter((email): email is string => !!email);
292+
break;
293+
case WorkflowActions.EMAIL_ADDRESS:
294+
sendTo = step.sendTo ? [step.sendTo] : [];
295+
break;
247296
}
248-
: { name: "", email: "", timeZone: "", language: { locale: "" } },
249-
startTime: booking.startTime.toISOString(),
250-
endTime: booking.endTime.toISOString(),
251-
title: booking.title,
252-
language: { locale: booking?.user?.locale || defaultLocale },
253-
eventType: {
254-
slug: booking.eventType?.slug || "",
255-
schedulingType: booking.eventType?.schedulingType,
256-
hosts: booking.eventType?.hosts,
257-
},
258-
metadata: booking.metadata,
259-
};
260-
for (const step of eventTypeWorkflow.steps) {
261-
if (
262-
step.action === WorkflowActions.EMAIL_ATTENDEE ||
263-
step.action === WorkflowActions.EMAIL_HOST ||
264-
step.action === WorkflowActions.EMAIL_ADDRESS
265-
) {
266-
let sendTo: string[] = [];
267297

268-
switch (step.action) {
269-
case WorkflowActions.EMAIL_HOST:
270-
sendTo = [bookingInfo.organizer?.email];
271-
const schedulingType = bookingInfo.eventType?.schedulingType;
272-
const hosts = bookingInfo.eventType.hosts
273-
?.filter((host) =>
274-
bookingInfo.attendees.some((attendee) => host.user.email === attendee.email)
275-
)
276-
.map(({ user }) => user.destinationCalendar?.primaryEmail ?? user.email);
277-
if (
278-
(schedulingType === SchedulingType.ROUND_ROBIN ||
279-
schedulingType === SchedulingType.COLLECTIVE) &&
280-
hosts
281-
) {
282-
sendTo = sendTo.concat(hosts);
283-
}
284-
break;
285-
case WorkflowActions.EMAIL_ATTENDEE:
286-
sendTo = bookingInfo.attendees
287-
.map((attendee) => attendee.email)
288-
.filter((email): email is string => !!email);
289-
break;
290-
case WorkflowActions.EMAIL_ADDRESS:
291-
sendTo = step.sendTo ? [step.sendTo] : [];
292-
break;
298+
await scheduleEmailReminder({
299+
evt: bookingInfo,
300+
triggerEvent: eventTypeWorkflow.trigger,
301+
action: step.action,
302+
timeSpan: {
303+
time: eventTypeWorkflow.time,
304+
timeUnit: eventTypeWorkflow.timeUnit,
305+
},
306+
sendTo,
307+
emailSubject: step.emailSubject || "",
308+
emailBody: step.reminderBody || "",
309+
template: step.template,
310+
sender: step.sender,
311+
workflowStepId: step.id,
312+
});
313+
} else if (step.action === WorkflowActions.SMS_NUMBER && step.sendTo) {
314+
await scheduleSMSReminder({
315+
evt: bookingInfo,
316+
reminderPhone: step.sendTo,
317+
triggerEvent: eventTypeWorkflow.trigger,
318+
action: step.action,
319+
timeSpan: {
320+
time: eventTypeWorkflow.time,
321+
timeUnit: eventTypeWorkflow.timeUnit,
322+
},
323+
message: step.reminderBody || "",
324+
workflowStepId: step.id,
325+
template: step.template,
326+
sender: step.sender,
327+
userId: booking.userId,
328+
teamId: eventTypeWorkflow.teamId,
329+
});
330+
} else if (step.action === WorkflowActions.WHATSAPP_NUMBER && step.sendTo) {
331+
await scheduleWhatsappReminder({
332+
evt: bookingInfo,
333+
reminderPhone: step.sendTo,
334+
triggerEvent: eventTypeWorkflow.trigger,
335+
action: step.action,
336+
timeSpan: {
337+
time: eventTypeWorkflow.time,
338+
timeUnit: eventTypeWorkflow.timeUnit,
339+
},
340+
message: step.reminderBody || "",
341+
workflowStepId: step.id,
342+
template: step.template,
343+
userId: booking.userId,
344+
teamId: eventTypeWorkflow.teamId,
345+
});
293346
}
294-
295-
await scheduleEmailReminder({
296-
evt: bookingInfo,
297-
triggerEvent: eventTypeWorkflow.trigger,
298-
action: step.action,
299-
timeSpan: {
300-
time: eventTypeWorkflow.time,
301-
timeUnit: eventTypeWorkflow.timeUnit,
302-
},
303-
sendTo,
304-
emailSubject: step.emailSubject || "",
305-
emailBody: step.reminderBody || "",
306-
template: step.template,
307-
sender: step.sender,
308-
workflowStepId: step.id,
309-
});
310-
} else if (step.action === WorkflowActions.SMS_NUMBER && step.sendTo) {
311-
await scheduleSMSReminder({
312-
evt: bookingInfo,
313-
reminderPhone: step.sendTo,
314-
triggerEvent: eventTypeWorkflow.trigger,
315-
action: step.action,
316-
timeSpan: {
317-
time: eventTypeWorkflow.time,
318-
timeUnit: eventTypeWorkflow.timeUnit,
319-
},
320-
message: step.reminderBody || "",
321-
workflowStepId: step.id,
322-
template: step.template,
323-
sender: step.sender,
324-
userId: booking.userId,
325-
teamId: eventTypeWorkflow.teamId,
326-
});
327-
} else if (step.action === WorkflowActions.WHATSAPP_NUMBER && step.sendTo) {
328-
await scheduleWhatsappReminder({
329-
evt: bookingInfo,
330-
reminderPhone: step.sendTo,
331-
triggerEvent: eventTypeWorkflow.trigger,
332-
action: step.action,
333-
timeSpan: {
334-
time: eventTypeWorkflow.time,
335-
timeUnit: eventTypeWorkflow.timeUnit,
336-
},
337-
message: step.reminderBody || "",
338-
workflowStepId: step.id,
339-
template: step.template,
340-
userId: booking.userId,
341-
teamId: eventTypeWorkflow.teamId,
342-
});
343347
}
344348
}
345349
}

0 commit comments

Comments
 (0)