From e27de47d9fc3a987cc8f2c76e6908edabaa52faa Mon Sep 17 00:00:00 2001 From: Benny Joo Date: Wed, 18 Jun 2025 02:53:12 -0400 Subject: [PATCH] perf: leverage DB index for user profile fetching (booking page & payment page) (#21814) * leverage DB index for findByUserIdAndOrgSlug method * booking view * payment view * fix * fix * address comment --- .../bookings-single-view.getServerSideProps.tsx | 2 +- packages/features/ee/payments/pages/payment.tsx | 6 +++--- packages/lib/hideBranding.ts | 10 ++++------ packages/lib/server/repository/profile.ts | 17 ++++++++++++++--- 4 files changed, 22 insertions(+), 13 deletions(-) diff --git a/apps/web/modules/bookings/views/bookings-single-view.getServerSideProps.tsx b/apps/web/modules/bookings/views/bookings-single-view.getServerSideProps.tsx index 9fee836322..50fd5eb59b 100644 --- a/apps/web/modules/bookings/views/bookings-single-view.getServerSideProps.tsx +++ b/apps/web/modules/bookings/views/bookings-single-view.getServerSideProps.tsx @@ -234,7 +234,7 @@ export async function getServerSideProps(context: GetServerSidePropsContext) { eventTypeId: eventType.id, team: eventType.team, owner: eventType.users[0] ?? null, - orgSlug: currentOrgDomain, + organizationId: session?.user?.profile?.organizationId ?? session?.user?.org?.id ?? null, }), profile, eventType, diff --git a/packages/features/ee/payments/pages/payment.tsx b/packages/features/ee/payments/pages/payment.tsx index 4eb62a2865..23f55557d4 100644 --- a/packages/features/ee/payments/pages/payment.tsx +++ b/packages/features/ee/payments/pages/payment.tsx @@ -1,7 +1,7 @@ import type { GetServerSidePropsContext } from "next"; import { z } from "zod"; -import { orgDomainConfig } from "@calcom/features/ee/organizations/lib/orgDomains"; +import { getServerSession } from "@calcom/features/auth/lib/getServerSession"; import { getClientSecretFromPayment } from "@calcom/features/ee/payments/pages/getClientSecretFromPayment"; import { shouldHideBrandingForEvent } from "@calcom/lib/hideBranding"; import prisma from "@calcom/prisma"; @@ -18,7 +18,7 @@ const querySchema = z.object({ export const getServerSideProps = async (context: GetServerSidePropsContext) => { const { uid } = querySchema.parse(context.query); - const { currentOrgDomain } = orgDomainConfig(context.req); + const session = await getServerSession({ req: context.req }); const rawPayment = await prisma.payment.findUnique({ where: { @@ -59,7 +59,7 @@ export const getServerSideProps = async (context: GetServerSidePropsContext) => eventTypeId: eventType.id, team: eventType.team, owner: eventType.users[0] ?? null, - orgSlug: currentOrgDomain, + organizationId: session?.user?.profile?.organizationId ?? session?.user?.org?.id ?? null, }), }; diff --git a/packages/lib/hideBranding.ts b/packages/lib/hideBranding.ts index 17cf1409d5..745d087ee5 100644 --- a/packages/lib/hideBranding.ts +++ b/packages/lib/hideBranding.ts @@ -24,8 +24,6 @@ type UserWithProfile = UserWithoutProfile & { profile: Profile | null; }; -type OrgSlug = string | null; - /** * Determines if branding should be hidden by checking entity and organization settings */ @@ -79,12 +77,12 @@ export async function shouldHideBrandingForEvent({ eventTypeId, team, owner, - orgSlug, + organizationId, }: { eventTypeId: number; team: Team | null; owner: UserWithoutProfile | null; - orgSlug: OrgSlug; + organizationId: number | null; }) { let ownerProfile = null; if (team) { @@ -94,10 +92,10 @@ export async function shouldHideBrandingForEvent({ }); } else if (owner) { // Needed only for User events, not for Team events - ownerProfile = orgSlug + ownerProfile = organizationId ? await ProfileRepository.findByUserIdAndOrgSlug({ userId: owner.id, - orgSlug, + organizationId, }) : null; diff --git a/packages/lib/server/repository/profile.ts b/packages/lib/server/repository/profile.ts index 642cb0eb33..7046e8dcc6 100644 --- a/packages/lib/server/repository/profile.ts +++ b/packages/lib/server/repository/profile.ts @@ -665,9 +665,20 @@ export class ProfileRepository { return normalizeProfile(profile); } - static async findByUserIdAndOrgSlug({ userId, orgSlug }: { userId: number; orgSlug: string }) { - const profile = await prisma.profile.findFirst({ - where: { userId, organization: { slug: orgSlug } }, + static async findByUserIdAndOrgSlug({ + userId, + organizationId, + }: { + userId: number; + organizationId: number; + }) { + const profile = await prisma.profile.findUnique({ + where: { + userId_organizationId: { + userId, + organizationId, + }, + }, include: { organization: { select: organizationSelect,