From 03e787ad5a81af8f164fdfd58c120d2c48456fd7 Mon Sep 17 00:00:00 2001 From: Hariom Balhara Date: Mon, 6 Jun 2022 15:10:56 +0530 Subject: [PATCH] Fixes 3 issues related to 404 links (#2979) --- .../components/booking/BookingListItem.tsx | 3 +- apps/web/pages/success.tsx | 38 +++++++++++++++---- apps/web/pages/team/[slug]/book.tsx | 1 + packages/lib/defaultEvents.ts | 1 + 4 files changed, 34 insertions(+), 9 deletions(-) diff --git a/apps/web/components/booking/BookingListItem.tsx b/apps/web/components/booking/BookingListItem.tsx index 194d39ceee..fcc320b2ac 100644 --- a/apps/web/components/booking/BookingListItem.tsx +++ b/apps/web/components/booking/BookingListItem.tsx @@ -204,7 +204,8 @@ function BookingListItem(booking: BookingItemProps) { pathname: "/success", query: { date: booking.startTime, - type: booking.eventType.id, + // TODO: Booking when fetched should have id 0 already(for Dynamic Events). + type: booking.eventType.id || 0, eventSlug: booking.eventType.slug, user: user?.username || "", name: booking.attendees[0] ? booking.attendees[0].name : undefined, diff --git a/apps/web/pages/success.tsx b/apps/web/pages/success.tsx index 678166117a..805f08a56f 100644 --- a/apps/web/pages/success.tsx +++ b/apps/web/pages/success.tsx @@ -26,6 +26,7 @@ import { import { getDefaultEvent } from "@calcom/lib/defaultEvents"; import { useLocale } from "@calcom/lib/hooks/useLocale"; import { localStorage } from "@calcom/lib/webstorage"; +import { Prisma } from "@calcom/prisma/client"; import { RecurringEvent } from "@calcom/types/Calendar"; import Button from "@calcom/ui/Button"; import { EmailInput } from "@calcom/ui/form/fields"; @@ -667,7 +668,7 @@ function RecurringBookings({ } const getEventTypesFromDB = async (id: number) => { - return await prisma.eventType.findUnique({ + const eventType = await prisma.eventType.findUnique({ where: { id, }, @@ -705,6 +706,15 @@ const getEventTypesFromDB = async (id: number) => { metadata: true, }, }); + + if (!eventType) { + return eventType; + } + + return { + isDynamic: false, + ...eventType, + }; }; const strToNumber = z.string().transform((val, ctx) => { @@ -743,7 +753,6 @@ export async function getServerSideProps(context: GetServerSidePropsContext) { } = parsedQuery.data; const eventTypeRaw = !eventTypeId ? getDefaultEvent(eventTypeSlug) : await getEventTypesFromDB(eventTypeId); - if (!eventTypeRaw) { return { notFound: true, @@ -807,13 +816,26 @@ export async function getServerSideProps(context: GetServerSidePropsContext) { slug: eventType.team?.slug || eventType.users[0]?.username || null, }; + const where: Prisma.BookingWhereInput = { + id: bookingId, + attendees: { some: { email, name } }, + }; + // Dynamic Event uses EventType from @calcom/lib/defaultEvents(a fake EventType) which doesn't have a real user/team/eventTypeId + // So, you can't look them up in DB. + if (!eventType.isDynamic) { + // A Team Event doesn't have a correct user query param as of now. It is equal to team/{eventSlug} which is not a user, so you can't look it up in DB. + if (!eventType.team) { + // username being equal to profile.slug isn't applicable for Team or Dynamic Events. + where.user = { username }; + } + where.eventTypeId = eventType.id; + } else { + // username being equal to eventSlug for Dynamic Event Booking, it can't be used for user lookup. So, just use eventTypeId which would always be null for Dynamic Event Bookings + where.eventTypeId = null; + } + const bookingInfo = await prisma.booking.findFirst({ - where: { - id: bookingId, - eventTypeId: eventType.id, - user: { username }, - attendees: { some: { email, name } }, - }, + where, select: { title: true, uid: true, diff --git a/apps/web/pages/team/[slug]/book.tsx b/apps/web/pages/team/[slug]/book.tsx index b3c496eb4c..c92cbea7ca 100644 --- a/apps/web/pages/team/[slug]/book.tsx +++ b/apps/web/pages/team/[slug]/book.tsx @@ -106,6 +106,7 @@ export async function getServerSideProps(context: GetServerSidePropsContext) { locationLabels: getLocationLabels(t), profile: { ...eventTypeObject.team, + // FIXME: This slug is used as username on success page which is wrong. This is correctly set as username for user booking. slug: "team/" + eventTypeObject.slug, image: eventTypeObject.team?.logo || null, theme: null /* Teams don't have a theme, and `BookingPage` uses it */, diff --git a/packages/lib/defaultEvents.ts b/packages/lib/defaultEvents.ts index b7e3050ad3..e2afe80f0a 100644 --- a/packages/lib/defaultEvents.ts +++ b/packages/lib/defaultEvents.ts @@ -31,6 +31,7 @@ type UsernameSlugLinkProps = { const customInputs: EventTypeCustomInput[] = []; const commons = { + isDynamic: true, periodCountCalendarDays: true, periodStartDate: null, periodEndDate: null,