From 46f979ba6df35f5a84314e44ae7fdd4bf1745301 Mon Sep 17 00:00:00 2001 From: Joe Au-Yeung <65426560+joeauyeung@users.noreply.github.com> Date: Fri, 11 Apr 2025 13:49:21 -0400 Subject: [PATCH] chore: Add logging and try/catch blocks in `handleNewBooking` (#20665) * Add logging and try/catch blocks * Add additional logging around `deleteEventsAndMeetings` * Type fix --- .../bookings/lib/handleCancelBooking.ts | 110 +++++++++++------- packages/lib/EventManager.ts | 1 + 2 files changed, 69 insertions(+), 42 deletions(-) diff --git a/packages/features/bookings/lib/handleCancelBooking.ts b/packages/features/bookings/lib/handleCancelBooking.ts index 2d0c4c979a..1171aa6d83 100644 --- a/packages/features/bookings/lib/handleCancelBooking.ts +++ b/packages/features/bookings/lib/handleCancelBooking.ts @@ -448,53 +448,79 @@ async function handler(input: CancelBookingInput) { allRemainingBookings ); - const bookingToDeleteEventTypeMetadata = eventTypeMetaDataSchemaWithTypedApps.parse( - bookingToDelete.eventType?.metadata || null - ); + try { + const bookingToDeleteEventTypeMetadataParsed = eventTypeMetaDataSchemaWithTypedApps.safeParse( + bookingToDelete.eventType?.metadata || null + ); - const credentials = await getAllCredentials(bookingToDelete.user, { - ...bookingToDelete.eventType, - metadata: bookingToDeleteEventTypeMetadata, - }); + if (!bookingToDeleteEventTypeMetadataParsed.success) { + log.error( + `Error parsing metadata`, + safeStringify({ error: bookingToDeleteEventTypeMetadataParsed?.error }) + ); + throw new Error("Error parsing metadata"); + } - const eventManager = new EventManager( - { ...bookingToDelete.user, credentials }, - bookingToDeleteEventTypeMetadata?.apps - ); + const bookingToDeleteEventTypeMetadata = bookingToDeleteEventTypeMetadataParsed.data; - await eventManager.cancelEvent(evt, bookingToDelete.references, isBookingInRecurringSeries); - - const bookingReferenceDeletes = prisma.bookingReference.deleteMany({ - where: { - bookingId: bookingToDelete.id, - }, - }); - - const webhookTriggerPromises = []; - const workflowReminderPromises = []; - - for (const booking of updatedBookings) { - // delete scheduled webhook triggers of cancelled bookings - webhookTriggerPromises.push(deleteWebhookScheduledTriggers({ booking })); - - //Workflows - cancel all reminders for cancelled bookings - workflowReminderPromises.push(WorkflowRepository.deleteAllWorkflowReminders(booking.workflowReminders)); - } - - await Promise.all([...webhookTriggerPromises, ...workflowReminderPromises]).catch((error) => { - log.error("An error occurred when deleting workflow reminders and webhook triggers", error); - }); - - if (internalNote && teamId) { - await handleInternalNote({ - internalNote, - booking: bookingToDelete, - userId: userId || -1, - teamId: teamId, + const credentials = await getAllCredentials(bookingToDelete.user, { + ...bookingToDelete.eventType, + metadata: bookingToDeleteEventTypeMetadata, }); + + const eventManager = new EventManager( + { ...bookingToDelete.user, credentials }, + bookingToDeleteEventTypeMetadata?.apps + ); + + await eventManager.cancelEvent(evt, bookingToDelete.references, isBookingInRecurringSeries); + + await prisma.bookingReference.deleteMany({ + where: { + bookingId: bookingToDelete.id, + }, + }); + } catch (error) { + log.error(`Error deleting integrations`, safeStringify({ error })); } - const prismaPromises: Promise[] = [bookingReferenceDeletes]; + try { + const webhookTriggerPromises = []; + const workflowReminderPromises = []; + + for (const booking of updatedBookings) { + // delete scheduled webhook triggers of cancelled bookings + webhookTriggerPromises.push(deleteWebhookScheduledTriggers({ booking })); + + //Workflows - cancel all reminders for cancelled bookings + workflowReminderPromises.push(WorkflowRepository.deleteAllWorkflowReminders(booking.workflowReminders)); + } + + await Promise.allSettled([...webhookTriggerPromises, ...workflowReminderPromises]).then((results) => { + const rejectedReasons = results + .filter((result): result is PromiseRejectedResult => result.status === "rejected") + .map((result) => result.reason); + + if (rejectedReasons.length > 0) { + log.error("An error occurred when deleting workflow reminders and webhook triggers", rejectedReasons); + } + }); + } catch (error) { + log.error("Error deleting scheduled webhooks and workflows", safeStringify({ error })); + } + + try { + if (internalNote && teamId) { + await handleInternalNote({ + internalNote, + booking: bookingToDelete, + userId: userId || -1, + teamId: teamId, + }); + } + } catch (error) { + log.error("Error handlingInternalNote", safeStringify({ error })); + } try { // TODO: if emails fail try to requeue them @@ -505,7 +531,7 @@ async function handler(input: CancelBookingInput) { bookingToDelete?.eventType?.metadata as EventTypeMetadata ); } catch (error) { - console.error("Error deleting event", error); + log.error("Error deleting event", error); } return { success: true, diff --git a/packages/lib/EventManager.ts b/packages/lib/EventManager.ts index 679e26b2d6..f287914e8a 100644 --- a/packages/lib/EventManager.ts +++ b/packages/lib/EventManager.ts @@ -588,6 +588,7 @@ export default class EventManager { bookingReferences: PartialReference[]; isBookingInRecurringSeries?: boolean; }) { + const log = logger.getSubLogger({ prefix: [`[deleteEventsAndMeetings]: ${event?.uid}`] }); const calendarReferences = [], videoReferences = [], crmReferences = [],