Files
calendar/packages/features/ee/workflows/lib/reminders/scheduleMandatoryReminder.ts
T
Udit TakkarandGitHub 4e1d05a7e7 feat: dist tracing 4 (#25574)
* feat: distributed tracing 2

* feat: distributed tracing 2

* refactor: feedback

* refactor: feedback

* fix: type error

* fix: trpc error

* feat: distributed tracing - 3

* chore: translation

* refactor: improvements

* fix: feedback

* chore: remove

* feat: dist tracing 4

* fix: type errors

* fix: type errors

* fix: remove string type

* fix: type errors
2025-12-15 10:43:22 +00:00

101 lines
3.4 KiB
TypeScript

import type { getEventTypeResponse } from "@calcom/features/bookings/lib/handleNewBooking/getEventTypesFromDB";
import { scheduleEmailReminder } from "@calcom/features/ee/workflows/lib/reminders/emailReminderManager";
import type { Workflow } from "@calcom/features/ee/workflows/lib/types";
import type { getDefaultEvent } from "@calcom/features/eventtypes/lib/defaultEvents";
import { withReporting } from "@calcom/lib/sentryWrapper";
import type { TraceContext } from "@calcom/lib/tracing";
import { distributedTracing } from "@calcom/lib/tracing/factory";
import { WorkflowTriggerEvents, TimeUnit, WorkflowActions, WorkflowTemplates } from "@calcom/prisma/enums";
import type { ExtendedCalendarEvent } from "./reminderScheduler";
export type NewBookingEventType = Awaited<ReturnType<typeof getDefaultEvent>> | getEventTypeResponse;
async function _scheduleMandatoryReminder({
evt,
workflows,
requiresConfirmation,
hideBranding,
seatReferenceUid,
isPlatformNoEmail = false,
isDryRun = false,
traceContext,
}: {
evt: ExtendedCalendarEvent;
workflows: Workflow[];
requiresConfirmation: boolean;
hideBranding: boolean;
seatReferenceUid: string | undefined;
isPlatformNoEmail?: boolean;
isDryRun?: boolean;
traceContext: TraceContext;
}) {
const reminderMeta = {
eventTitle: evt.title,
attendeeCount: evt.attendees.length,
organizerId: evt.organizer.id,
requiresConfirmation,
hideBranding,
seatReferenceUid,
isPlatformNoEmail,
};
const spanContext = distributedTracing.createSpan(
traceContext,
"schedule_mandatory_reminder",
reminderMeta
);
const tracingLogger = distributedTracing.getTracingLogger(spanContext);
if (isDryRun) return;
if (isPlatformNoEmail) return;
try {
const hasExistingWorkflow = workflows.some((workflow) => {
return (
workflow.trigger === WorkflowTriggerEvents.BEFORE_EVENT &&
((workflow.time !== null && workflow.time <= 12 && workflow.timeUnit === TimeUnit.HOUR) ||
(workflow.time !== null && workflow.time <= 720 && workflow.timeUnit === TimeUnit.MINUTE)) &&
workflow.steps.some((step) => step?.action === WorkflowActions.EMAIL_ATTENDEE)
);
});
if (
!hasExistingWorkflow &&
evt.attendees.some((attendee) => attendee.email.includes("@gmail.com")) &&
!requiresConfirmation
) {
try {
const filteredAttendees =
evt.attendees?.filter((attendee) => attendee.email.includes("@gmail.com")) || [];
await scheduleEmailReminder({
evt,
triggerEvent: WorkflowTriggerEvents.BEFORE_EVENT,
action: WorkflowActions.EMAIL_ATTENDEE,
timeSpan: {
time: 1,
timeUnit: TimeUnit.HOUR,
},
sendTo: filteredAttendees.map((attendee) => attendee.email),
template: WorkflowTemplates.REMINDER,
hideBranding,
seatReferenceUid,
includeCalendarEvent: false,
// Template is fixed so we don't have to verify
verifiedAt: new Date(),
});
} catch (error) {
tracingLogger.error("Error while scheduling mandatory reminders", JSON.stringify({ error }));
}
}
} catch (error) {
tracingLogger.error("Error while scheduling mandatory reminders", JSON.stringify({ error }));
}
}
export const scheduleMandatoryReminder = withReporting(
_scheduleMandatoryReminder,
"scheduleMandatoryReminder"
);