diff --git a/packages/features/bookings/lib/handleCancelBooking.ts b/packages/features/bookings/lib/handleCancelBooking.ts index f64ed8d7e8b5cb..243b3035ff68af 100644 --- a/packages/features/bookings/lib/handleCancelBooking.ts +++ b/packages/features/bookings/lib/handleCancelBooking.ts @@ -429,6 +429,8 @@ async function handler(input: CancelBookingInput, dependencies?: Dependencies) { isPlatformManagedUserBooking: bookingToDelete.user.isPlatformManaged, } satisfies HandleCancelBookingResponse; + const parsedMetadata = bookingMetadataSchema.safeParse(bookingToDelete.metadata || {}); + const { assignmentReason: _emailAssignmentReason, ...evtWithoutAssignmentReason } = evt; const promises = webhooks.map((webhook) => sendPayload(webhook.secret, eventTrigger, new Date().toISOString(), webhook, { @@ -438,6 +440,7 @@ async function handler(input: CancelBookingInput, dependencies?: Dependencies) { smsReminderNumber: bookingToDelete.smsReminderNumber || undefined, cancelledBy: cancelledBy, requestReschedule: false, + ...(parsedMetadata.success && parsedMetadata.data ? { metadata: parsedMetadata.data } : {}), }).catch((e) => { logger.error( `Error executing webhook for event: ${eventTrigger}, URL: ${webhook.subscriberUrl}, bookingId: ${evt.bookingId}, bookingUid: ${evt.uid}`, @@ -448,7 +451,6 @@ async function handler(input: CancelBookingInput, dependencies?: Dependencies) { await Promise.all(promises); const workflows = await getAllWorkflowsFromEventType(bookingToDelete.eventType, bookingToDelete.userId); - const parsedMetadata = bookingMetadataSchema.safeParse(bookingToDelete.metadata || {}); const creditService = new CreditService(); diff --git a/packages/features/bookings/lib/handleCancelBooking/test/handleCancelBooking.test.ts b/packages/features/bookings/lib/handleCancelBooking/test/handleCancelBooking.test.ts index 9bbe4784126ece..3d76ce4837a610 100644 --- a/packages/features/bookings/lib/handleCancelBooking/test/handleCancelBooking.test.ts +++ b/packages/features/bookings/lib/handleCancelBooking/test/handleCancelBooking.test.ts @@ -141,6 +141,9 @@ describe("Cancel Booking", () => { organizer, location: BookingLocations.CalVideo, subscriberUrl: "http://my-webhook.example.com", + metadata: { + videoCallUrl: "https://existing-daily-video-call-url.example.com", + }, payload: { cancelledBy: organizer.email, organizer: { @@ -271,6 +274,9 @@ describe("Cancel Booking", () => { organizer, location: BookingLocations.CalVideo, subscriberUrl: "http://my-webhook.example.com", + metadata: { + videoCallUrl: "https://existing-daily-video-call-url.example.com", + }, payload: { cancelledBy: organizer.email, organizer: { @@ -375,6 +381,9 @@ describe("Cancel Booking", () => { status: BookingStatus.ACCEPTED, startTime: `${plus1DateString}T05:00:00.000Z`, endTime: `${plus1DateString}T05:30:00.000Z`, + metadata: { + myCustomKey: "myCustomValue", + }, attendees: [ { email: hostAttendee.email, @@ -423,6 +432,9 @@ describe("Cancel Booking", () => { organizer, location: BookingLocations.CalVideo, subscriberUrl: "http://my-webhook.example.com", + metadata: { + myCustomKey: "myCustomValue", + }, payload: { cancelledBy: organizer.email, organizer: { @@ -1180,6 +1192,9 @@ describe("Cancel Booking", () => { }, location: BookingLocations.CalVideo, subscriberUrl: "http://my-webhook.example.com", + metadata: { + videoCallUrl: "https://existing-daily-video-call-url.example.com", + }, payload: { cancelledBy: organizer.email, organizer: { diff --git a/packages/testing/src/lib/bookingScenario/expects.ts b/packages/testing/src/lib/bookingScenario/expects.ts index f4c180e51cf398..0a98a317bbde33 100644 --- a/packages/testing/src/lib/bookingScenario/expects.ts +++ b/packages/testing/src/lib/bookingScenario/expects.ts @@ -1152,12 +1152,14 @@ export function expectBookingCancelledWebhookToHaveBeenFired({ location, subscriberUrl, payload, + metadata, }: { organizer: { email: string; name: string; username?: string; usernameInOrg?: string }; booker: { email: string; name: string }; subscriberUrl: string; location: string; payload?: Record; + metadata?: Record | null; }) { const organizerPayload = { username: organizer.username, @@ -1169,7 +1171,7 @@ export function expectBookingCancelledWebhookToHaveBeenFired({ payload: { ...payload, organizer: organizerPayload, - metadata: null, + ...(metadata !== undefined ? { metadata } : {}), responses: { name: { label: "name",