diff --git a/packages/features/bookings/lib/getBookingResponsesSchema.ts b/packages/features/bookings/lib/getBookingResponsesSchema.ts index 2f84d87ecc8bb5..a1734fe228f7fa 100644 --- a/packages/features/bookings/lib/getBookingResponsesSchema.ts +++ b/packages/features/bookings/lib/getBookingResponsesSchema.ts @@ -40,7 +40,7 @@ function preprocess({ schema: T; isPartialSchema: boolean; eventType: { - bookingFields: z.infer & z.BRAND<"HAS_SYSTEM_FIELDS">; + bookingFields: (z.infer & z.BRAND<"HAS_SYSTEM_FIELDS">) | null; }; view: View; }): z.ZodType, z.infer, z.infer> { @@ -48,6 +48,7 @@ function preprocess({ (responses) => { const parsedResponses = z.record(z.any()).nullable().parse(responses) || {}; const newResponses = {} as typeof parsedResponses; + if (!eventType.bookingFields) return parsedResponses; eventType.bookingFields.forEach((field) => { const value = parsedResponses[field.name]; if (value === undefined) { @@ -86,6 +87,9 @@ function preprocess({ return newResponses; }, schema.superRefine((responses, ctx) => { + if (!eventType.bookingFields) { + return; + } eventType.bookingFields.forEach((bookingField) => { const value = responses[bookingField.name]; const stringSchema = z.string(); diff --git a/packages/features/bookings/lib/getCalEventResponses.ts b/packages/features/bookings/lib/getCalEventResponses.ts index 17626a159c22e5..882c7cb83e1f82 100644 --- a/packages/features/bookings/lib/getCalEventResponses.ts +++ b/packages/features/bookings/lib/getCalEventResponses.ts @@ -1,7 +1,7 @@ import type z from "zod"; import { SystemField } from "@calcom/features/bookings/lib/getBookingFields"; -import type getBookingResponsesSchema from "@calcom/features/bookings/lib/getBookingResponsesSchema"; +import type { getBookingResponsesPartialSchema } from "@calcom/features/bookings/lib/getBookingResponsesSchema"; import type { eventTypeBookingFields } from "@calcom/prisma/zod-utils"; import type { CalendarEvent } from "@calcom/types/Calendar"; @@ -12,7 +12,7 @@ export const getCalEventResponses = ({ // If the eventType has been deleted and a booking is Accepted later on, then bookingFields will be null and we can't know the label of fields. So, we should store the label as well in the DB // Also, it is no longer straightforward to identify if a field is system field or not bookingFields: z.infer | null; - responses: z.infer>; + responses: z.infer>; }) => { const calEventUserFieldsResponses = {} as NonNullable; const calEventResponses = {} as NonNullable; diff --git a/packages/trpc/server/routers/viewer/bookings.tsx b/packages/trpc/server/routers/viewer/bookings.tsx index 6620573bd75250..ea135b65de4900 100644 --- a/packages/trpc/server/routers/viewer/bookings.tsx +++ b/packages/trpc/server/routers/viewer/bookings.tsx @@ -16,6 +16,7 @@ import { deleteScheduledEmailReminder } from "@calcom/ee/workflows/lib/reminders import { deleteScheduledSMSReminder } from "@calcom/ee/workflows/lib/reminders/smsReminderManager"; import { sendDeclinedEmails, sendLocationChangeEmails, sendRequestRescheduleEmail } from "@calcom/emails"; import { getBookingFieldsWithSystemFields } from "@calcom/features/bookings/lib/getBookingFields"; +import { getBookingResponsesPartialSchema } from "@calcom/features/bookings/lib/getBookingResponsesSchema"; import { getCalEventResponses } from "@calcom/features/bookings/lib/getCalEventResponses"; import { handleConfirmation } from "@calcom/features/bookings/lib/handleConfirmation"; import getWebhooks from "@calcom/features/webhooks/lib/getWebhooks"; @@ -772,12 +773,22 @@ export const bookingsRouter = router({ scheduledJobs: true, }, }); + const bookingFields = bookingRaw.eventType + ? getBookingFieldsWithSystemFields(bookingRaw.eventType) + : null; const booking = { ...bookingRaw, + responses: getBookingResponsesPartialSchema({ + eventType: { + bookingFields, + }, + // An existing booking can have data from any number of views, so the schema should consider ALL_VIEWS + view: "ALL_VIEWS", + }), eventType: bookingRaw.eventType ? { ...bookingRaw.eventType, - bookingFields: getBookingFieldsWithSystemFields(bookingRaw.eventType), + bookingFields, } : null, };