From 218ec9140c030cf971f003ac2a4db2592e6a011d Mon Sep 17 00:00:00 2001 From: Alex van Andel Date: Tue, 24 Jun 2025 16:37:36 +0100 Subject: [PATCH] Revert "perf: Refactor `getPublicEvent` to fetch org data using DB index key (#21850)" This reverts commit a37f1d9798c98ce741070b70396876e56837b792. --- .../services/event-types-atom.service.ts | 5 +- .../d/[link]/[slug]/getServerSideProps.tsx | 9 +- .../team/[slug]/[type]/getServerSideProps.ts | 7 +- .../lib/[user]/[type]/getServerSideProps.ts | 13 ++- .../features/bookings/Booker/utils/event.ts | 4 +- .../features/eventtypes/lib/getPublicEvent.ts | 83 +++++++------------ packages/lib/server/repository/event.ts | 6 +- .../routers/publicViewer/event.schema.ts | 3 +- 8 files changed, 51 insertions(+), 79 deletions(-) diff --git a/apps/api/v2/src/modules/atoms/services/event-types-atom.service.ts b/apps/api/v2/src/modules/atoms/services/event-types-atom.service.ts index c2fcf060a5..d5613afabd 100644 --- a/apps/api/v2/src/modules/atoms/services/event-types-atom.service.ts +++ b/apps/api/v2/src/modules/atoms/services/event-types-atom.service.ts @@ -424,10 +424,7 @@ export class EventTypesAtomService { isTeamEvent, orgSlug, this.dbRead.prisma as unknown as PrismaClient, - true, - undefined, - false, - orgId + true ); if (!event) { diff --git a/apps/web/lib/d/[link]/[slug]/getServerSideProps.tsx b/apps/web/lib/d/[link]/[slug]/getServerSideProps.tsx index 8b6617905c..9d0d01a2cb 100644 --- a/apps/web/lib/d/[link]/[slug]/getServerSideProps.tsx +++ b/apps/web/lib/d/[link]/[slug]/getServerSideProps.tsx @@ -23,7 +23,7 @@ async function getUserPageProps(context: GetServerSidePropsContext) { const { link, slug } = paramsSchema.parse(context.params); const { rescheduleUid, duration: queryDuration } = context.query; const { currentOrgDomain, isValidOrgDomain } = orgDomainConfig(context.req); - const orgSlug = isValidOrgDomain ? currentOrgDomain : null; + const org = isValidOrgDomain ? currentOrgDomain : null; const hashedLink = await prisma.hashedLink.findUnique({ where: { @@ -86,7 +86,7 @@ async function getUserPageProps(context: GetServerSidePropsContext) { return notFound; } - if (!orgSlug) { + if (!org) { const redirect = await getTemporaryOrgRedirect({ slugs: [username], redirectType: RedirectType.User, @@ -103,7 +103,7 @@ async function getUserPageProps(context: GetServerSidePropsContext) { const [user] = await UserRepository.findUsersByUsername({ usernameList: [name], - orgSlug: orgSlug, + orgSlug: org, }); if (!user) { @@ -128,9 +128,8 @@ async function getUserPageProps(context: GetServerSidePropsContext) { username: name, eventSlug: slug, isTeamEvent, - orgSlug, + org, fromRedirectOfNonOrgLink: context.query.orgRedirection === "true", - orgId: session?.user?.org?.id ?? session?.user?.profile?.organizationId ?? undefined, }, session?.user?.id ); diff --git a/apps/web/lib/org/[orgSlug]/instant-meeting/team/[slug]/[type]/getServerSideProps.ts b/apps/web/lib/org/[orgSlug]/instant-meeting/team/[slug]/[type]/getServerSideProps.ts index 6e573f7a3b..a7d8c256aa 100644 --- a/apps/web/lib/org/[orgSlug]/instant-meeting/team/[slug]/[type]/getServerSideProps.ts +++ b/apps/web/lib/org/[orgSlug]/instant-meeting/team/[slug]/[type]/getServerSideProps.ts @@ -43,8 +43,8 @@ export const getServerSideProps = async (context: GetServerSidePropsContext) => } as const; } - const orgSlug = isValidOrgDomain ? currentOrgDomain : null; - if (!orgSlug) { + const org = isValidOrgDomain ? currentOrgDomain : null; + if (!org) { return { notFound: true, } as const; @@ -55,9 +55,8 @@ export const getServerSideProps = async (context: GetServerSidePropsContext) => username: teamSlug, eventSlug: meetingSlug, isTeamEvent: true, - orgSlug, + org, fromRedirectOfNonOrgLink: context.query.orgRedirection === "true", - orgId: session?.user?.org?.id ?? session?.user?.profile?.organizationId ?? undefined, }, session?.user?.id ); diff --git a/apps/web/server/lib/[user]/[type]/getServerSideProps.ts b/apps/web/server/lib/[user]/[type]/getServerSideProps.ts index 65b301cd89..12400d547d 100644 --- a/apps/web/server/lib/[user]/[type]/getServerSideProps.ts +++ b/apps/web/server/lib/[user]/[type]/getServerSideProps.ts @@ -121,8 +121,8 @@ async function getDynamicGroupPageProps(context: GetServerSidePropsContext) { const { rescheduleUid, bookingUid } = context.query; const allowRescheduleForCancelledBooking = context.query.allowRescheduleForCancelledBooking === "true"; const { currentOrgDomain, isValidOrgDomain } = orgDomainConfig(context.req, context.params?.orgSlug); - const orgSlug = isValidOrgDomain ? currentOrgDomain : null; - if (!orgSlug) { + const org = isValidOrgDomain ? currentOrgDomain : null; + if (!org) { const redirect = await getTemporaryOrgRedirect({ slugs: usernames, redirectType: RedirectType.User, @@ -155,9 +155,8 @@ async function getDynamicGroupPageProps(context: GetServerSidePropsContext) { { username: usernames.join("+"), eventSlug: slug, - orgSlug, + org, fromRedirectOfNonOrgLink: context.query.orgRedirection === "true", - orgId: session?.user?.org?.id ?? session?.user?.profile?.organizationId ?? undefined, }, session?.user?.id ); @@ -242,7 +241,7 @@ async function getUserPageProps(context: GetServerSidePropsContext) { } as const; } - const orgSlug = isValidOrgDomain ? currentOrgDomain : null; + const org = isValidOrgDomain ? currentOrgDomain : null; // We use this to both prefetch the query on the server, // as well as to check if the event exist, so we can show a 404 otherwise. @@ -250,7 +249,7 @@ async function getUserPageProps(context: GetServerSidePropsContext) { { username, eventSlug: slug, - orgSlug, + org, fromRedirectOfNonOrgLink: context.query.orgRedirection === "true", }, session?.user?.id @@ -262,7 +261,7 @@ async function getUserPageProps(context: GetServerSidePropsContext) { } as const; } - const allowSEOIndexing = orgSlug + const allowSEOIndexing = org ? user?.profile?.organization?.organizationSettings?.allowSEOIndexing ? user?.allowSEOIndexing : false diff --git a/packages/features/bookings/Booker/utils/event.ts b/packages/features/bookings/Booker/utils/event.ts index 60c4260811..5a69e6926e 100644 --- a/packages/features/bookings/Booker/utils/event.ts +++ b/packages/features/bookings/Booker/utils/event.ts @@ -19,7 +19,7 @@ export type useScheduleForEventReturnType = ReturnType { - const [username, eventSlug, isTeamEvent, orgSlug] = useBookerStore( + const [username, eventSlug, isTeamEvent, org] = useBookerStore( (state) => [state.username, state.eventSlug, state.isTeamEvent, state.org], shallow ); @@ -29,7 +29,7 @@ export const useEvent = (props?: { fromRedirectOfNonOrgLink?: boolean; disabled? username: username ?? "", eventSlug: eventSlug ?? "", isTeamEvent, - orgSlug: orgSlug ?? null, + org: org ?? null, fromRedirectOfNonOrgLink: props?.fromRedirectOfNonOrgLink, }, { diff --git a/packages/features/eventtypes/lib/getPublicEvent.ts b/packages/features/eventtypes/lib/getPublicEvent.ts index 3c17dcf2ff..7bb8ad760b 100644 --- a/packages/features/eventtypes/lib/getPublicEvent.ts +++ b/packages/features/eventtypes/lib/getPublicEvent.ts @@ -227,20 +227,19 @@ export const getPublicEvent = async ( username: string, eventSlug: string, isTeamEvent: boolean | undefined, - orgSlug: string | null, + org: string | null, prisma: PrismaClient, fromRedirectOfNonOrgLink: boolean, currentUserId?: number, - fetchAllUsers = false, - orgId?: number + fetchAllUsers = false ) => { const usernameList = getUsernameList(username); - const orgQuery = orgSlug ? getSlugOrRequestedSlug(orgSlug) : null; + const orgQuery = org ? getSlugOrRequestedSlug(org) : null; // In case of dynamic group event, we fetch user's data and use the default event. if (usernameList.length > 1) { const usersInOrgContext = await UserRepository.findUsersByUsername({ usernameList, - orgSlug: orgSlug, + orgSlug: org, }); const users = usersInOrgContext; @@ -268,27 +267,18 @@ export const getPublicEvent = async ( const disableBookingTitle = !defaultEvent.isDynamic; const unPublishedOrgUser = users.find((user) => user.profile?.organization?.slug === null); - const orgDetails: Pick | undefined = orgId - ? await prisma.team.findUniqueOrThrow({ - where: { - id: orgId, - }, - select: { - logoUrl: true, - name: true, - }, - }) - : orgSlug - ? await prisma.team.findFirstOrThrow({ - where: { - slug: orgSlug, - }, - select: { - logoUrl: true, - name: true, - }, - }) - : undefined; + let orgDetails: Pick | undefined; + if (org) { + orgDetails = await prisma.team.findFirstOrThrow({ + where: { + slug: org, + }, + select: { + logoUrl: true, + name: true, + }, + }); + } return { ...defaultEvent, @@ -319,14 +309,14 @@ export const getPublicEvent = async ( ? { image: getPlaceholderAvatar(orgDetails?.logoUrl, orgDetails?.name), name: orgDetails?.name, - username: orgSlug, + username: org, } : {}), }, entity: { considerUnpublished: !fromRedirectOfNonOrgLink && unPublishedOrgUser !== undefined, fromRedirectOfNonOrgLink, - orgSlug: orgSlug, + orgSlug: org, name: unPublishedOrgUser?.profile?.organization?.name ?? null, teamSlug: null, logoUrl: null, @@ -447,28 +437,19 @@ export const getPublicEvent = async ( eventWithUserProfiles.schedule = eventOwnerDefaultSchedule; } - const orgDetails: Pick | undefined | null = orgId - ? await prisma.team.findUnique({ - where: { - id: orgId, - }, - select: { - logoUrl: true, - name: true, - }, - }) - : orgSlug - ? await prisma.team.findFirst({ - where: { - slug: orgSlug, - parentId: null, - }, - select: { - logoUrl: true, - name: true, - }, - }) - : undefined; + let orgDetails: Pick | undefined | null; + if (org) { + orgDetails = await prisma.team.findFirst({ + where: { + slug: org, + parentId: null, + }, + select: { + logoUrl: true, + name: true, + }, + }); + } let showInstantEventConnectNowModal = eventWithUserProfiles.isInstantEvent; @@ -526,7 +507,7 @@ export const getPublicEvent = async ( (eventWithUserProfiles.team?.slug === null || eventWithUserProfiles.owner?.profile?.organization?.slug === null || eventWithUserProfiles.team?.parent?.slug === null), - orgSlug: orgSlug, + orgSlug: org, teamSlug: (eventWithUserProfiles.team?.slug || teamMetadata?.requestedSlug) ?? null, name: (eventWithUserProfiles.owner?.profile?.organization?.name || diff --git a/packages/lib/server/repository/event.ts b/packages/lib/server/repository/event.ts index 59e7bc7633..e1d2fa2223 100644 --- a/packages/lib/server/repository/event.ts +++ b/packages/lib/server/repository/event.ts @@ -8,12 +8,10 @@ export class EventRepository { input.username, input.eventSlug, input.isTeamEvent, - input.orgSlug, + input.org, prisma, input.fromRedirectOfNonOrgLink, - userId, - false, - input.orgId + userId ); return event; } diff --git a/packages/trpc/server/routers/publicViewer/event.schema.ts b/packages/trpc/server/routers/publicViewer/event.schema.ts index 20befc3716..d10a5965cc 100644 --- a/packages/trpc/server/routers/publicViewer/event.schema.ts +++ b/packages/trpc/server/routers/publicViewer/event.schema.ts @@ -4,8 +4,7 @@ export const ZEventInputSchema = z.object({ username: z.string(), eventSlug: z.string(), isTeamEvent: z.boolean().optional(), - orgSlug: z.string().nullable(), - orgId: z.number().optional(), + org: z.string().nullable(), /** * Informs that the event request has been sent from a page that was reached by a redirect from non-org link(i.e. app.cal.com/username redirected to acme.cal.com/username) * Based on this decision like whether to allow unpublished organization's event to be served or not can be made.