diff --git a/packages/features/ee/workflows/api/scheduleSMSReminders.ts b/packages/features/ee/workflows/api/scheduleSMSReminders.ts index bf849d7f60..2319e9bff5 100644 --- a/packages/features/ee/workflows/api/scheduleSMSReminders.ts +++ b/packages/features/ee/workflows/api/scheduleSMSReminders.ts @@ -2,6 +2,7 @@ import type { NextApiRequest, NextApiResponse } from "next"; import dayjs from "@calcom/dayjs"; +import { getShortenLink } from "@calcom/ee/workflows/lib/reminders/utils"; import { getCalEventResponses } from "@calcom/features/bookings/lib/getCalEventResponses"; import { getBookerBaseUrl } from "@calcom/lib/getBookerUrl/server"; import { defaultHandler } from "@calcom/lib/server"; @@ -120,6 +121,33 @@ async function handler(req: NextApiRequest, res: NextApiResponse) { reminder.booking.eventType?.team?.parentId ?? organizerOrganizationId ?? null ); + const urls = { + meetingUrl: bookingMetadataSchema.parse(reminder.booking?.metadata || {})?.videoCallUrl || "", + cancelLink: `${bookerUrl}/booking/${reminder.booking.uid}?cancel=true` || "", + rescheduleLink: `${bookerUrl}/reschedule/${reminder.booking.uid}` || "", + }; + + const [meetingUrl, cancelLink, rescheduleLink] = await Promise.allSettled([ + getShortenLink(urls.meetingUrl), + getShortenLink(urls.cancelLink), + getShortenLink(urls.rescheduleLink), + ]).then((results) => { + return results.map((result) => { + let finalResult = ""; + + if (result.status === "fulfilled") { + const v = result.value; + if (typeof v === "string") { + finalResult = v; + } else { + finalResult = v.shortLink; + } + } + + return finalResult; + }); + }); + const variables: VariablesType = { eventName: reminder.booking?.eventType?.title, organizerName: reminder.booking?.user?.name || "", @@ -131,9 +159,9 @@ async function handler(req: NextApiRequest, res: NextApiResponse) { location: reminder.booking?.location || "", additionalNotes: reminder.booking?.description, responses: responses, - meetingUrl: bookingMetadataSchema.parse(reminder.booking?.metadata || {})?.videoCallUrl, - cancelLink: `${bookerUrl}/booking/${reminder.booking.uid}?cancel=true`, - rescheduleLink: `${bookerUrl}/reschedule/${reminder.booking.uid}`, + meetingUrl, + cancelLink, + rescheduleLink, attendeeTimezone: reminder.booking.attendees[0].timeZone, eventTimeInAttendeeTimezone: dayjs(reminder.booking.startTime).tz( reminder.booking.attendees[0].timeZone diff --git a/packages/features/ee/workflows/lib/reminders/smsReminderManager.ts b/packages/features/ee/workflows/lib/reminders/smsReminderManager.ts index 25269ef38e..b2171e46c5 100644 --- a/packages/features/ee/workflows/lib/reminders/smsReminderManager.ts +++ b/packages/features/ee/workflows/lib/reminders/smsReminderManager.ts @@ -1,4 +1,5 @@ import dayjs from "@calcom/dayjs"; +import { getShortenLink } from "@calcom/ee/workflows/lib/reminders/utils"; import { SENDER_ID, WEBSITE_URL } from "@calcom/lib/constants"; import logger from "@calcom/lib/logger"; import type { TimeFormat } from "@calcom/lib/timeFormat"; @@ -146,6 +147,33 @@ export const scheduleSMSReminder = async (args: ScheduleTextReminderArgs) => { let smsMessage = message; if (smsMessage) { + const urls = { + meetingUrl: bookingMetadataSchema.parse(evt.metadata || {})?.videoCallUrl || "", + cancelLink: `${evt.bookerUrl ?? WEBSITE_URL}/booking/${evt.uid}?cancel=true`, + rescheduleLink: `${evt.bookerUrl ?? WEBSITE_URL}/reschedule/${evt.uid}`, + }; + + const [meetingUrl, cancelLink, rescheduleLink] = await Promise.allSettled([ + getShortenLink(urls.meetingUrl), + getShortenLink(urls.cancelLink), + getShortenLink(urls.rescheduleLink), + ]).then((results) => { + return results.map((result) => { + let finalResult = ""; + + if (result.status === "fulfilled") { + const v = result.value; + if (typeof v === "string") { + finalResult = v; + } else { + finalResult = v.shortLink; + } + } + + return finalResult; + }); + }); + const variables: VariablesType = { eventName: evt.title, organizerName: evt.organizer.name, @@ -159,10 +187,10 @@ export const scheduleSMSReminder = async (args: ScheduleTextReminderArgs) => { location: evt.location, additionalNotes: evt.additionalNotes, responses: evt.responses, - meetingUrl: bookingMetadataSchema.parse(evt.metadata || {})?.videoCallUrl, - cancelLink: `${evt.bookerUrl ?? WEBSITE_URL}/booking/${evt.uid}?cancel=true`, + meetingUrl, + cancelLink, + rescheduleLink, cancelReason: evt.cancellationReason, - rescheduleLink: `${evt.bookerUrl ?? WEBSITE_URL}/reschedule/${evt.uid}`, rescheduleReason: evt.rescheduleReason, attendeeTimezone: evt.attendees[0].timeZone, eventTimeInAttendeeTimezone: dayjs(evt.startTime).tz(evt.attendees[0].timeZone), diff --git a/packages/features/ee/workflows/lib/reminders/utils.ts b/packages/features/ee/workflows/lib/reminders/utils.ts new file mode 100644 index 0000000000..c976d8d024 --- /dev/null +++ b/packages/features/ee/workflows/lib/reminders/utils.ts @@ -0,0 +1,14 @@ +import { dub } from "@calcom/features/auth/lib/dub"; + +export const getShortenLink = (link: string) => { + // don't hit dub with with empty string + if (!link.length) { + const pr: Promise = new Promise((resolve) => resolve(link)); + return pr; + } else { + return dub.links.create({ + url: link, + domain: "sms.cal.com", + }); + } +};