Skip to content

Commit 6f05142

Browse files
chore: Remove SendGrid related code from emailReminderManager (#23591)
* chore: Remove SendGrid related code from emailReminderManager * Small type fixes in consumers * Remove redundant userId/teamId from activateEventType.handler * Remove sendSengridMail as dep * Remove teamId param --------- Co-authored-by: Keith Williams <keithwillcode@gmail.com>
1 parent e02108d commit 6f05142

File tree

7 files changed

+19
-208
lines changed

7 files changed

+19
-208
lines changed

packages/features/ee/round-robin/roundRobinManualReassignment.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -502,8 +502,6 @@ export async function handleWorkflowsUpdate({
502502
includeCalendarEvent: workflowStep.includeCalendarEvent,
503503
workflowStepId: workflowStep.id,
504504
verifiedAt: workflowStep.verifiedAt,
505-
userId: workflow.userId,
506-
teamId: workflow.teamId,
507505
});
508506
}
509507

packages/features/ee/workflows/lib/reminders/emailReminderManager.ts

Lines changed: 17 additions & 131 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import { v4 as uuidv4 } from "uuid";
33

44
import dayjs from "@calcom/dayjs";
55
import generateIcsString from "@calcom/emails/lib/generateIcsString";
6-
import { FeaturesRepository } from "@calcom/features/flags/features.repository";
76
import { preprocessNameFieldDataWithVariant } from "@calcom/features/form-builder/utils";
87
import tasker from "@calcom/features/tasker";
98
import { SENDER_NAME, WEBSITE_URL } from "@calcom/lib/constants";
@@ -19,10 +18,8 @@ import {
1918
} from "@calcom/prisma/enums";
2019
import { bookingMetadataSchema } from "@calcom/prisma/zod-utils";
2120

22-
import { IMMEDIATE_WORKFLOW_TRIGGER_EVENTS } from "../constants";
2321
import { getWorkflowRecipientEmail } from "../getWorkflowReminders";
2422
import { sendOrScheduleWorkflowEmails } from "./providers/emailProvider";
25-
import { getBatchId, sendSendgridMail } from "./providers/sendgridProvider";
2623
import type { AttendeeInBookingInfo, BookingInfo, timeUnitLowerCase } from "./smsReminderManager";
2724
import type { VariablesType } from "./templates/customTemplate";
2825
import customTemplate from "./templates/customTemplate";
@@ -53,13 +50,10 @@ interface scheduleEmailReminderArgs extends ScheduleReminderArgs {
5350
evt: BookingInfo;
5451
sendTo: string[];
5552
action: ScheduleEmailReminderAction;
56-
userId?: number | null;
57-
teamId?: number | null;
5853
emailSubject?: string;
5954
emailBody?: string;
6055
hideBranding?: boolean;
6156
includeCalendarEvent?: boolean;
62-
isMandatoryReminder?: boolean;
6357
verifiedAt: Date | null;
6458
}
6559

@@ -77,11 +71,8 @@ export const scheduleEmailReminder = async (args: scheduleEmailReminderArgs) =>
7771
emailBody = "",
7872
hideBranding,
7973
includeCalendarEvent,
80-
isMandatoryReminder,
8174
action,
8275
verifiedAt,
83-
userId,
84-
teamId,
8576
} = args;
8677

8778
if (!verifiedAt) {
@@ -91,7 +82,6 @@ export const scheduleEmailReminder = async (args: scheduleEmailReminderArgs) =>
9182

9283
const { startTime, endTime } = evt;
9384
const uid = evt.uid as string;
94-
const currentDate = dayjs();
9585
const timeUnit: timeUnitLowerCase | undefined = timeSpan.timeUnit?.toLocaleLowerCase() as timeUnitLowerCase;
9686

9787
let scheduledDate = null;
@@ -286,130 +276,26 @@ export const scheduleEmailReminder = async (args: scheduleEmailReminderArgs) =>
286276

287277
const mailData = await prepareEmailData();
288278

289-
const isSendgridEnabled = !!(process.env.SENDGRID_API_KEY && process.env.SENDGRID_EMAIL);
290-
291-
const featureRepo = new FeaturesRepository(prisma);
292-
293-
const isWorkflowSmtpEmailsEnabled = teamId
294-
? await featureRepo.checkIfTeamHasFeature(teamId, "workflow-smtp-emails")
295-
: userId
296-
? await featureRepo.checkIfUserHasFeature(userId, "workflow-smtp-emails")
297-
: false;
298-
299-
if (isWorkflowSmtpEmailsEnabled || !isSendgridEnabled) {
300-
let reminderUid;
301-
if (scheduledDate) {
302-
const reminder = await prisma.workflowReminder.create({
303-
data: {
304-
bookingUid: uid,
305-
workflowStepId,
306-
method: WorkflowMethods.EMAIL,
307-
scheduledDate: scheduledDate.toDate(),
308-
scheduled: true,
309-
},
310-
});
311-
reminderUid = reminder.uuid;
312-
}
313-
314-
await sendOrScheduleWorkflowEmails({
315-
...mailData,
316-
to: sendTo,
317-
sendAt: scheduledDate?.toDate(),
318-
referenceUid: reminderUid ?? undefined,
279+
let reminderUid = undefined;
280+
if (scheduledDate) {
281+
const reminder = await prisma.workflowReminder.create({
282+
data: {
283+
bookingUid: uid,
284+
workflowStepId,
285+
method: WorkflowMethods.EMAIL,
286+
scheduledDate: scheduledDate.toDate(),
287+
scheduled: true,
288+
},
319289
});
320-
321-
return;
290+
reminderUid = reminder.uuid;
322291
}
323292

324-
/**
325-
* @deprecated only needed for SendGrid, use SMTP with tasker instead
326-
*/
327-
if (IMMEDIATE_WORKFLOW_TRIGGER_EVENTS.includes(triggerEvent)) {
328-
try {
329-
const promises = sendTo.map((email) => sendSendgridMail({ ...mailData, to: email }));
330-
// TODO: Maybe don't await for this?
331-
await Promise.all(promises);
332-
} catch (error) {
333-
log.error("Error sending Email");
334-
}
335-
} else if (
336-
(triggerEvent === WorkflowTriggerEvents.BEFORE_EVENT ||
337-
triggerEvent === WorkflowTriggerEvents.AFTER_EVENT) &&
338-
scheduledDate
339-
) {
340-
// Sendgrid to schedule emails
341-
// Can only schedule at least 60 minutes and at most 72 hours in advance
342-
// To limit the amount of canceled sends we schedule at most 2 hours in advance
343-
if (
344-
currentDate.isBefore(scheduledDate.subtract(1, "hour")) &&
345-
!scheduledDate.isAfter(currentDate.add(2, "hour"))
346-
) {
347-
try {
348-
const sendgridBatchId = await getBatchId();
349-
350-
// If sendEmail failed then workflowReminer will not be created, failing E2E tests
351-
await sendSendgridMail({
352-
...mailData,
353-
to: sendTo,
354-
sendAt: scheduledDate.unix(),
355-
batchId: sendgridBatchId,
356-
});
357-
358-
if (!isMandatoryReminder) {
359-
await prisma.workflowReminder.create({
360-
data: {
361-
bookingUid: uid,
362-
workflowStepId: workflowStepId,
363-
method: WorkflowMethods.EMAIL,
364-
scheduledDate: scheduledDate.toDate(),
365-
scheduled: true,
366-
referenceId: sendgridBatchId,
367-
seatReferenceId: seatReferenceUid,
368-
},
369-
});
370-
} else {
371-
await prisma.workflowReminder.create({
372-
data: {
373-
bookingUid: uid,
374-
method: WorkflowMethods.EMAIL,
375-
scheduledDate: scheduledDate.toDate(),
376-
scheduled: true,
377-
referenceId: sendgridBatchId,
378-
seatReferenceId: seatReferenceUid,
379-
isMandatoryReminder: true,
380-
},
381-
});
382-
}
383-
} catch (error) {
384-
log.error(`Error scheduling email with error ${error}`);
385-
}
386-
} else if (scheduledDate.isAfter(currentDate.add(2, "hour"))) {
387-
// Write to DB and send to CRON if scheduled reminder date is past 2 hours
388-
if (!isMandatoryReminder) {
389-
await prisma.workflowReminder.create({
390-
data: {
391-
bookingUid: uid,
392-
workflowStepId: workflowStepId,
393-
method: WorkflowMethods.EMAIL,
394-
scheduledDate: scheduledDate.toDate(),
395-
scheduled: false,
396-
seatReferenceId: seatReferenceUid,
397-
},
398-
});
399-
} else {
400-
await prisma.workflowReminder.create({
401-
data: {
402-
bookingUid: uid,
403-
method: WorkflowMethods.EMAIL,
404-
scheduledDate: scheduledDate.toDate(),
405-
scheduled: false,
406-
seatReferenceId: seatReferenceUid,
407-
isMandatoryReminder: true,
408-
},
409-
});
410-
}
411-
}
412-
}
293+
await sendOrScheduleWorkflowEmails({
294+
...mailData,
295+
to: sendTo,
296+
sendAt: scheduledDate?.toDate(),
297+
referenceUid: reminderUid ?? undefined,
298+
});
413299
};
414300

415301
export const deleteScheduledEmailReminder = async (reminderId: number) => {

packages/features/ee/workflows/lib/reminders/reminderScheduler.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -156,8 +156,6 @@ const processWorkflowStep = async (
156156
seatReferenceUid,
157157
includeCalendarEvent: step.includeCalendarEvent,
158158
verifiedAt: step.verifiedAt,
159-
userId: workflow.userId,
160-
teamId: workflow.teamId,
161159
});
162160
} else if (isWhatsappAction(step.action)) {
163161
const sendTo = step.action === WorkflowActions.WHATSAPP_ATTENDEE ? smsReminderNumber : step.sendTo;

packages/features/ee/workflows/lib/reminders/scheduleMandatoryReminder.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,8 @@ async function _scheduleMandatoryReminder({
6363
hideBranding,
6464
seatReferenceUid,
6565
includeCalendarEvent: false,
66-
isMandatoryReminder: true,
6766
// Template is fixed so we don't have to verify
6867
verifiedAt: new Date(),
69-
userId: evt.organizer.id,
7068
});
7169
} catch (error) {
7270
log.error("Error while scheduling mandatory reminders", JSON.stringify({ error }));

packages/features/ee/workflows/lib/test/workflows.test.ts

Lines changed: 2 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ import { FeaturesRepository } from "../../../../flags/features.repository";
3636
import { deleteWorkfowRemindersOfRemovedMember } from "../../../teams/lib/deleteWorkflowRemindersOfRemovedMember";
3737
import { scheduleEmailReminder } from "../reminders/emailReminderManager";
3838
import * as emailProvider from "../reminders/providers/emailProvider";
39-
import * as sendgridProvider from "../reminders/providers/sendgridProvider";
4039

4140
const workflowSelect = {
4241
id: true,
@@ -709,7 +708,6 @@ describe("scheduleBookingReminders", () => {
709708
},
710709
});
711710

712-
const allVerified = await prismock.verifiedNumber.findMany();
713711
await scheduleBookingReminders(
714712
bookings,
715713
workflow.steps,
@@ -1061,7 +1059,6 @@ describe("deleteWorkfowRemindersOfRemovedMember", () => {
10611059
});
10621060

10631061
describe("Workflow SMTP Emails Feature Flag", () => {
1064-
vi.spyOn(sendgridProvider, "sendSendgridMail");
10651062
vi.spyOn(emailProvider, "sendOrScheduleWorkflowEmails");
10661063

10671064
const mockEvt = {
@@ -1097,72 +1094,10 @@ describe("Workflow SMTP Emails Feature Flag", () => {
10971094

10981095
beforeEach(() => {
10991096
vi.clearAllMocks();
1100-
// Mock SendGrid environment variables
1101-
process.env.SENDGRID_API_KEY = "test-key";
1102-
process.env.SENDGRID_EMAIL = "test@example.com";
11031097
});
11041098

1105-
test("should use SMTP when team has workflow-smtp-emails feature", async () => {
1106-
vi.spyOn(FeaturesRepository.prototype, "checkIfTeamHasFeature").mockResolvedValue(true);
1107-
1108-
await scheduleEmailReminder({
1109-
...baseArgs,
1110-
teamId: 123,
1111-
});
1112-
expect(sendgridProvider.sendSendgridMail).not.toHaveBeenCalled();
1113-
expect(emailProvider.sendOrScheduleWorkflowEmails).toHaveBeenCalled();
1114-
});
1115-
1116-
test("should use SMTP when user has workflow-smtp-emails feature", async () => {
1117-
vi.spyOn(FeaturesRepository.prototype, "checkIfUserHasFeature").mockResolvedValue(true);
1118-
1119-
await scheduleEmailReminder({
1120-
...baseArgs,
1121-
userId: 123,
1122-
});
1123-
expect(sendgridProvider.sendSendgridMail).not.toHaveBeenCalled();
1124-
expect(emailProvider.sendOrScheduleWorkflowEmails).toHaveBeenCalled();
1125-
});
1126-
1127-
test("should use SendGrid when workflow-smtp-emails feature is not enabled for team", async () => {
1128-
vi.spyOn(FeaturesRepository.prototype, "checkIfTeamHasFeature").mockResolvedValue(false);
1129-
1130-
await scheduleEmailReminder({
1131-
...baseArgs,
1132-
teamId: 123,
1133-
});
1134-
1135-
expect(sendgridProvider.sendSendgridMail).toHaveBeenCalled();
1136-
expect(emailProvider.sendOrScheduleWorkflowEmails).not.toHaveBeenCalled();
1137-
});
1138-
1139-
test("should use SendGrid when workflow-smtp-emails feature is not enabled for user", async () => {
1140-
vi.spyOn(FeaturesRepository.prototype, "checkIfUserHasFeature").mockResolvedValue(false);
1141-
1142-
await scheduleEmailReminder({
1143-
...baseArgs,
1144-
userId: 123,
1145-
});
1146-
1147-
expect(sendgridProvider.sendSendgridMail).toHaveBeenCalled();
1148-
expect(emailProvider.sendOrScheduleWorkflowEmails).not.toHaveBeenCalled();
1149-
});
1150-
1151-
test("should use SMTP when SendGrid is not configured", async () => {
1152-
vi.spyOn(FeaturesRepository.prototype, "checkIfTeamHasFeature").mockResolvedValue(false);
1153-
1154-
vi.spyOn(FeaturesRepository.prototype, "checkIfUserHasFeature").mockResolvedValue(false);
1155-
1156-
delete process.env.SENDGRID_API_KEY;
1157-
delete process.env.SENDGRID_EMAIL;
1158-
1159-
await scheduleEmailReminder({
1160-
...baseArgs,
1161-
teamId: 123,
1162-
userId: 456,
1163-
});
1164-
1165-
expect(sendgridProvider.sendSendgridMail).not.toHaveBeenCalled();
1099+
test("should use SMTP", async () => {
1100+
await scheduleEmailReminder(baseArgs);
11661101
expect(emailProvider.sendOrScheduleWorkflowEmails).toHaveBeenCalled();
11671102
});
11681103
});

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -388,8 +388,6 @@ export const activateEventTypeHandler = async ({ ctx, input }: ActivateEventType
388388
sender: step.sender,
389389
workflowStepId: step.id,
390390
verifiedAt: step.verifiedAt,
391-
userId: eventTypeWorkflow.userId,
392-
teamId: eventTypeWorkflow.teamId,
393391
});
394392
} else if (step.action === WorkflowActions.SMS_NUMBER && step.sendTo) {
395393
await scheduleSMSReminder({

packages/trpc/server/routers/viewer/workflows/util.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -794,8 +794,6 @@ export async function scheduleBookingReminders(
794794
sender: step.sender,
795795
workflowStepId: step.id,
796796
verifiedAt: step?.verifiedAt ?? null,
797-
userId,
798-
teamId,
799797
});
800798
} else if (step.action === WorkflowActions.SMS_NUMBER && step.sendTo) {
801799
await scheduleSMSReminder({

0 commit comments

Comments
 (0)