Files
calendar/packages/features/ee/workflows/lib/reminders/messageDispatcher.ts
T
Anik Dhabal BabuGitHubcubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>
0b977e615d fix: exclude opt out message from body (#22100)
* fix: exclude opt out

* Update packages/features/ee/workflows/api/scheduleSMSReminders.ts

Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>

---------

Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>
2025-06-30 08:17:36 +00:00

117 lines
3.5 KiB
TypeScript

import type { TFunction } from "i18next";
import { sendOrScheduleWorkflowEmails } from "@calcom/features/ee/workflows/lib/reminders/providers/emailProvider";
import logger from "@calcom/lib/logger";
import prisma from "@calcom/prisma";
import { WorkflowMethods } from "@calcom/prisma/enums";
import * as twilio from "./providers/twilioProvider";
const log = logger.getSubLogger({ prefix: ["[reminderScheduler]"] });
export async function sendSmsOrFallbackEmail(props: {
twilioData: {
phoneNumber: string;
body: string;
sender: string;
bodyWithoutOptOut?: string;
bookingUid?: string | null;
userId?: number | null;
teamId?: number | null;
isWhatsapp?: boolean;
contentSid?: string;
contentVariables?: Record<string, string>;
};
fallbackData?: {
email: string;
t: TFunction;
replyTo: string;
};
}) {
const { userId, teamId } = props.twilioData;
const { CreditService } = await import("@calcom/features/ee/billing/credit-service");
const creditService = new CreditService();
const hasCredits = await creditService.hasAvailableCredits({ userId, teamId });
if (!hasCredits) {
const { fallbackData, twilioData } = props;
if (fallbackData) {
await sendOrScheduleWorkflowEmails({
to: [fallbackData.email],
subject: fallbackData.t("notification_about_your_booking"),
html: twilioData.bodyWithoutOptOut || twilioData.body,
replyTo: fallbackData.replyTo,
});
}
log.debug(
`SMS not sent because ${teamId ? `Team id ${teamId} ` : `User id ${userId} `} has no available credits`
);
return;
}
await twilio.sendSMS(props.twilioData);
}
export async function scheduleSmsOrFallbackEmail(props: {
twilioData: {
phoneNumber: string;
body: string;
scheduledDate: Date;
sender: string;
bodyWithoutOptOut?: string;
bookingUid?: string | null;
userId?: number | null;
teamId?: number | null;
isWhatsapp?: boolean;
contentSid?: string;
contentVariables?: Record<string, string>;
};
fallbackData?: {
email: string;
t: TFunction;
replyTo: string;
workflowStepId?: number;
};
}) {
const { userId, teamId } = props.twilioData;
const { CreditService } = await import("@calcom/features/ee/billing/credit-service");
const creditService = new CreditService();
const hasCredits = await creditService.hasAvailableCredits({ userId, teamId });
if (!hasCredits) {
const { fallbackData, twilioData } = props;
if (fallbackData) {
const reminder = await prisma.workflowReminder.create({
data: {
bookingUid: twilioData.bookingUid,
workflowStepId: fallbackData.workflowStepId,
method: WorkflowMethods.EMAIL,
scheduledDate: twilioData.scheduledDate,
scheduled: true,
},
});
await sendOrScheduleWorkflowEmails({
to: [fallbackData.email],
subject: fallbackData.t("notification_about_your_booking"),
html: twilioData.bodyWithoutOptOut || twilioData.body,
replyTo: fallbackData.replyTo,
sendAt: twilioData.scheduledDate,
referenceUid: reminder.uuid || undefined,
});
return { emailReminderId: reminder.id, sid: null };
}
log.debug(
`SMS not sent because ${teamId ? `Team id ${teamId} ` : `User id ${userId} `} has no available credits`
);
return null;
}
const scheduledSMS = await twilio.scheduleSMS(props.twilioData);
return scheduledSMS?.sid ? { emailReminderId: null, sid: scheduledSMS.sid } : null;
}