diff --git a/apps/web/playwright/webhook.e2e.ts b/apps/web/playwright/webhook.e2e.ts index cf1c64b3f0..9c48421222 100644 --- a/apps/web/playwright/webhook.e2e.ts +++ b/apps/web/playwright/webhook.e2e.ts @@ -67,6 +67,7 @@ test("add webhook & test that creating an event triggers a webhook call", async body.payload.eventTypeId = dynamic; body.payload.videoCallData = dynamic; body.payload.appsStatus = dynamic; + body.payload.metadata.videoCallUrl = dynamic; // if we change the shape of our webhooks, we can simply update this by clicking `u` // console.log("BODY", body); diff --git a/apps/web/playwright/webhook.e2e.ts-snapshots/webhookResponse--calcom-web.txt b/apps/web/playwright/webhook.e2e.ts-snapshots/webhookResponse--calcom-web.txt index df45e9df6d..18700cb784 100644 --- a/apps/web/playwright/webhook.e2e.ts-snapshots/webhookResponse--calcom-web.txt +++ b/apps/web/playwright/webhook.e2e.ts-snapshots/webhookResponse--calcom-web.txt @@ -1 +1 @@ -{"triggerEvent":"BOOKING_CREATED","createdAt":"[redacted/dynamic]","payload":{"type":"30 min","title":"30 min between Nameless and Test Testson","description":"","additionalNotes":"","customInputs":{},"startTime":"[redacted/dynamic]","endTime":"[redacted/dynamic]","organizer":{"name":"Nameless","email":"[redacted/dynamic]","timeZone":"[redacted/dynamic]","language":"[redacted/dynamic]"},"attendees":[{"email":"test@example.com","name":"Test Testson","timeZone":"[redacted/dynamic]","language":"[redacted/dynamic]"}],"location":"[redacted/dynamic]","destinationCalendar":null,"hideCalendarNotes":false,"requiresConfirmation":"[redacted/dynamic]","eventTypeId":"[redacted/dynamic]","seatsShowAttendees":false,"uid":"[redacted/dynamic]","videoCallData":"[redacted/dynamic]","appsStatus":"[redacted/dynamic]","eventTitle":"30 min","eventDescription":null,"price":0,"currency":"usd","length":30,"bookingId":"[redacted/dynamic]","metadata":{},"status":"ACCEPTED","additionalInformation":"[redacted/dynamic]"}} \ No newline at end of file +{"triggerEvent":"BOOKING_CREATED","createdAt":"[redacted/dynamic]","payload":{"type":"30 min","title":"30 min between Nameless and Test Testson","description":"","additionalNotes":"","customInputs":{},"startTime":"[redacted/dynamic]","endTime":"[redacted/dynamic]","organizer":{"name":"Nameless","email":"[redacted/dynamic]","timeZone":"[redacted/dynamic]","language":"[redacted/dynamic]"},"attendees":[{"email":"test@example.com","name":"Test Testson","timeZone":"[redacted/dynamic]","language":"[redacted/dynamic]"}],"location":"[redacted/dynamic]","destinationCalendar":null,"hideCalendarNotes":false,"requiresConfirmation":"[redacted/dynamic]","eventTypeId":"[redacted/dynamic]","seatsShowAttendees":false,"uid":"[redacted/dynamic]","videoCallData":"[redacted/dynamic]","appsStatus":"[redacted/dynamic]","eventTitle":"30 min","eventDescription":null,"price":0,"currency":"usd","length":30,"bookingId":"[redacted/dynamic]","metadata":{"videoCallUrl":"[redacted/dynamic]"},"status":"ACCEPTED","additionalInformation":"[redacted/dynamic]"}} \ No newline at end of file diff --git a/packages/features/bookings/lib/handleNewBooking.ts b/packages/features/bookings/lib/handleNewBooking.ts index 438d6a69e5..880fc4dc24 100644 --- a/packages/features/bookings/lib/handleNewBooking.ts +++ b/packages/features/bookings/lib/handleNewBooking.ts @@ -835,6 +835,8 @@ async function handler(req: NextApiRequest & { userId?: number | undefined }) { evt.appsStatus = Object.values(calcAppsStatus); } + let videoCallUrl; + if (originalRescheduledBooking?.uid) { // Use EventManager to conditionally use all needed integrations. const updateManager = await eventManager.reschedule( @@ -869,9 +871,9 @@ async function handler(req: NextApiRequest & { userId?: number | undefined }) { metadata.conferenceData = updatedEvent.conferenceData; metadata.entryPoints = updatedEvent.entryPoints; handleAppsStatus(results, booking); + videoCallUrl = metadata.hangoutLink || videoCallUrl; } } - if (noEmail !== true) { await sendRescheduledEmails({ ...evt, @@ -893,6 +895,9 @@ async function handler(req: NextApiRequest & { userId?: number | undefined }) { results = createManager.results; referencesToCreate = createManager.referencesToCreate; + + videoCallUrl = evt.videoCallData && evt.videoCallData.url ? evt.videoCallData.url : null; + if (results.length > 0 && results.every((res) => !res.success)) { const error = { errorCode: "BookingCreatingMeetingFailed", @@ -909,6 +914,7 @@ async function handler(req: NextApiRequest & { userId?: number | undefined }) { metadata.conferenceData = results[0].createdEvent?.conferenceData; metadata.entryPoints = results[0].createdEvent?.entryPoints; handleAppsStatus(results, booking); + videoCallUrl = metadata.hangoutLink || videoCallUrl; } if (noEmail !== true) { await sendScheduledEmails({ @@ -945,7 +951,7 @@ async function handler(req: NextApiRequest & { userId?: number | undefined }) { } log.debug(`Booking ${organizerUser.username} completed`); - + const metadata = videoCallUrl ? { videoCallUrl } : undefined; if (isConfirmedByDefault) { const eventTrigger: WebhookTriggerEvents = rescheduleUid ? WebhookTriggerEvents.BOOKING_RESCHEDULED @@ -1001,7 +1007,7 @@ async function handler(req: NextApiRequest & { userId?: number | undefined }) { ...eventTypeInfo, bookingId, rescheduleUid, - metadata: reqBody.metadata, + metadata: { ...metadata, ...reqBody.metadata }, eventTypeId, status: "ACCEPTED", smsReminderNumber: booking?.smsReminderNumber || undefined, @@ -1043,6 +1049,7 @@ async function handler(req: NextApiRequest & { userId?: number | undefined }) { uid: booking.uid, }, data: { + metadata, references: { createMany: { data: referencesToCreate, diff --git a/packages/features/ee/workflows/components/TimeTimeUnitInput.tsx b/packages/features/ee/workflows/components/TimeTimeUnitInput.tsx index 411d588535..b9a0a01e71 100644 --- a/packages/features/ee/workflows/components/TimeTimeUnitInput.tsx +++ b/packages/features/ee/workflows/components/TimeTimeUnitInput.tsx @@ -42,7 +42,7 @@ export const TimeTimeUnitInput = (props: Props) => {