fix: wrong workflow notifications when enabling workflows (#18169)

* only schedule workflow emails not send

* fix if statement

---------

Co-authored-by: CarinaWolli <wollencarina@gmail.com>
This commit is contained in:
Carina Wollendorfer
2024-12-13 11:58:30 -05:00
committed by GitHub
co-authored by CarinaWolli
parent b5ab6fe3fa
commit 84fb4f68b2
@@ -6,7 +6,7 @@ import { WorkflowRepository } from "@calcom/lib/server/repository/workflow";
import { getTimeFormatStringFromUserTimeFormat } from "@calcom/lib/timeFormat";
import { prisma } from "@calcom/prisma";
import { BookingStatus } from "@calcom/prisma/client";
import { MembershipRole, SchedulingType, WorkflowActions } from "@calcom/prisma/enums";
import { MembershipRole, SchedulingType, WorkflowActions, WorkflowTriggerEvents } from "@calcom/prisma/enums";
import { EventTypeMetaDataSchema } from "@calcom/prisma/zod-utils";
import type { TrpcSessionUser } from "@calcom/trpc/server/trpc";
@@ -186,30 +186,34 @@ export const activateEventTypeHandler = async ({ ctx, input }: ActivateEventType
}
await removeSmsReminderFieldForEventTypes({ activeOnToRemove: activeOn, workflowId, isOrg });
} else {
// activate workflow and schedule reminders for existing bookings
const bookingsForReminders = await prisma.booking.findMany({
where: {
eventTypeId: eventTypeId,
status: BookingStatus.ACCEPTED,
startTime: {
gte: new Date(),
if (
eventTypeWorkflow.trigger == WorkflowTriggerEvents.BEFORE_EVENT ||
eventTypeWorkflow.trigger == WorkflowTriggerEvents.AFTER_EVENT
) {
// activate workflow and schedule reminders for existing bookings
const bookingsForReminders = await prisma.booking.findMany({
where: {
eventTypeId: eventTypeId,
status: BookingStatus.ACCEPTED,
startTime: {
gte: new Date(),
},
},
},
include: {
attendees: true,
eventType: {
select: {
schedulingType: true,
slug: true,
hosts: {
select: {
user: {
select: {
email: true,
destinationCalendar: {
select: {
primaryEmail: true,
include: {
attendees: true,
eventType: {
select: {
schedulingType: true,
slug: true,
hosts: {
select: {
user: {
select: {
email: true,
destinationCalendar: {
select: {
primaryEmail: true,
},
},
},
},
@@ -217,129 +221,129 @@ export const activateEventTypeHandler = async ({ ctx, input }: ActivateEventType
},
},
},
user: true,
},
user: true,
},
});
});
const bookerUrl = await getBookerBaseUrl(ctx.user.organizationId ?? null);
const bookerUrl = await getBookerBaseUrl(ctx.user.organizationId ?? null);
for (const booking of bookingsForReminders) {
const defaultLocale = "en";
const bookingInfo = {
uid: booking.uid,
bookerUrl,
attendees: booking.attendees.map((attendee) => {
return {
name: attendee.name,
email: attendee.email,
timeZone: attendee.timeZone,
language: { locale: attendee.locale || defaultLocale },
};
}),
organizer: booking.user
? {
name: booking.user.name || "",
email: booking?.userPrimaryEmail ?? booking.user.email,
timeZone: booking.user.timeZone,
timeFormat: getTimeFormatStringFromUserTimeFormat(booking.user.timeFormat),
language: { locale: booking.user.locale || defaultLocale },
}
: { name: "", email: "", timeZone: "", language: { locale: "" } },
startTime: booking.startTime.toISOString(),
endTime: booking.endTime.toISOString(),
title: booking.title,
language: { locale: booking?.user?.locale || defaultLocale },
eventType: {
slug: booking.eventType?.slug || "",
schedulingType: booking.eventType?.schedulingType,
hosts: booking.eventType?.hosts,
},
metadata: booking.metadata,
};
for (const step of eventTypeWorkflow.steps) {
if (
step.action === WorkflowActions.EMAIL_ATTENDEE ||
step.action === WorkflowActions.EMAIL_HOST ||
step.action === WorkflowActions.EMAIL_ADDRESS
) {
let sendTo: string[] = [];
switch (step.action) {
case WorkflowActions.EMAIL_HOST:
sendTo = [bookingInfo.organizer?.email];
const schedulingType = bookingInfo.eventType?.schedulingType;
const hosts = bookingInfo.eventType.hosts
?.filter((host) =>
bookingInfo.attendees.some((attendee) => host.user.email === attendee.email)
)
.map(({ user }) => user.destinationCalendar?.primaryEmail ?? user.email);
if (
(schedulingType === SchedulingType.ROUND_ROBIN ||
schedulingType === SchedulingType.COLLECTIVE) &&
hosts
) {
sendTo = sendTo.concat(hosts);
for (const booking of bookingsForReminders) {
const defaultLocale = "en";
const bookingInfo = {
uid: booking.uid,
bookerUrl,
attendees: booking.attendees.map((attendee) => {
return {
name: attendee.name,
email: attendee.email,
timeZone: attendee.timeZone,
language: { locale: attendee.locale || defaultLocale },
};
}),
organizer: booking.user
? {
name: booking.user.name || "",
email: booking?.userPrimaryEmail ?? booking.user.email,
timeZone: booking.user.timeZone,
timeFormat: getTimeFormatStringFromUserTimeFormat(booking.user.timeFormat),
language: { locale: booking.user.locale || defaultLocale },
}
break;
case WorkflowActions.EMAIL_ATTENDEE:
sendTo = bookingInfo.attendees
.map((attendee) => attendee.email)
.filter((email): email is string => !!email);
break;
case WorkflowActions.EMAIL_ADDRESS:
sendTo = step.sendTo ? [step.sendTo] : [];
break;
}
: { name: "", email: "", timeZone: "", language: { locale: "" } },
startTime: booking.startTime.toISOString(),
endTime: booking.endTime.toISOString(),
title: booking.title,
language: { locale: booking?.user?.locale || defaultLocale },
eventType: {
slug: booking.eventType?.slug || "",
schedulingType: booking.eventType?.schedulingType,
hosts: booking.eventType?.hosts,
},
metadata: booking.metadata,
};
for (const step of eventTypeWorkflow.steps) {
if (
step.action === WorkflowActions.EMAIL_ATTENDEE ||
step.action === WorkflowActions.EMAIL_HOST ||
step.action === WorkflowActions.EMAIL_ADDRESS
) {
let sendTo: string[] = [];
await scheduleEmailReminder({
evt: bookingInfo,
triggerEvent: eventTypeWorkflow.trigger,
action: step.action,
timeSpan: {
time: eventTypeWorkflow.time,
timeUnit: eventTypeWorkflow.timeUnit,
},
sendTo,
emailSubject: step.emailSubject || "",
emailBody: step.reminderBody || "",
template: step.template,
sender: step.sender,
workflowStepId: step.id,
});
} else if (step.action === WorkflowActions.SMS_NUMBER && step.sendTo) {
await scheduleSMSReminder({
evt: bookingInfo,
reminderPhone: step.sendTo,
triggerEvent: eventTypeWorkflow.trigger,
action: step.action,
timeSpan: {
time: eventTypeWorkflow.time,
timeUnit: eventTypeWorkflow.timeUnit,
},
message: step.reminderBody || "",
workflowStepId: step.id,
template: step.template,
sender: step.sender,
userId: booking.userId,
teamId: eventTypeWorkflow.teamId,
});
} else if (step.action === WorkflowActions.WHATSAPP_NUMBER && step.sendTo) {
await scheduleWhatsappReminder({
evt: bookingInfo,
reminderPhone: step.sendTo,
triggerEvent: eventTypeWorkflow.trigger,
action: step.action,
timeSpan: {
time: eventTypeWorkflow.time,
timeUnit: eventTypeWorkflow.timeUnit,
},
message: step.reminderBody || "",
workflowStepId: step.id,
template: step.template,
userId: booking.userId,
teamId: eventTypeWorkflow.teamId,
});
switch (step.action) {
case WorkflowActions.EMAIL_HOST:
sendTo = [bookingInfo.organizer?.email];
const schedulingType = bookingInfo.eventType?.schedulingType;
const hosts = bookingInfo.eventType.hosts
?.filter((host) =>
bookingInfo.attendees.some((attendee) => host.user.email === attendee.email)
)
.map(({ user }) => user.destinationCalendar?.primaryEmail ?? user.email);
if (
(schedulingType === SchedulingType.ROUND_ROBIN ||
schedulingType === SchedulingType.COLLECTIVE) &&
hosts
) {
sendTo = sendTo.concat(hosts);
}
break;
case WorkflowActions.EMAIL_ATTENDEE:
sendTo = bookingInfo.attendees
.map((attendee) => attendee.email)
.filter((email): email is string => !!email);
break;
case WorkflowActions.EMAIL_ADDRESS:
sendTo = step.sendTo ? [step.sendTo] : [];
break;
}
await scheduleEmailReminder({
evt: bookingInfo,
triggerEvent: eventTypeWorkflow.trigger,
action: step.action,
timeSpan: {
time: eventTypeWorkflow.time,
timeUnit: eventTypeWorkflow.timeUnit,
},
sendTo,
emailSubject: step.emailSubject || "",
emailBody: step.reminderBody || "",
template: step.template,
sender: step.sender,
workflowStepId: step.id,
});
} else if (step.action === WorkflowActions.SMS_NUMBER && step.sendTo) {
await scheduleSMSReminder({
evt: bookingInfo,
reminderPhone: step.sendTo,
triggerEvent: eventTypeWorkflow.trigger,
action: step.action,
timeSpan: {
time: eventTypeWorkflow.time,
timeUnit: eventTypeWorkflow.timeUnit,
},
message: step.reminderBody || "",
workflowStepId: step.id,
template: step.template,
sender: step.sender,
userId: booking.userId,
teamId: eventTypeWorkflow.teamId,
});
} else if (step.action === WorkflowActions.WHATSAPP_NUMBER && step.sendTo) {
await scheduleWhatsappReminder({
evt: bookingInfo,
reminderPhone: step.sendTo,
triggerEvent: eventTypeWorkflow.trigger,
action: step.action,
timeSpan: {
time: eventTypeWorkflow.time,
timeUnit: eventTypeWorkflow.timeUnit,
},
message: step.reminderBody || "",
workflowStepId: step.id,
template: step.template,
userId: booking.userId,
teamId: eventTypeWorkflow.teamId,
});
}
}
}
}