From c9bfd977b161a433ff41c82f2ced4ff86de94e08 Mon Sep 17 00:00:00 2001 From: Benny Joo Date: Thu, 6 Feb 2025 22:26:29 +0000 Subject: [PATCH] perf: make metadata generation light for event type single page (#19143) * add findTitleById method to Repository * refactor route --- .../event-types/[type]/page.tsx | 34 ++++++++++++++--- packages/lib/server/repository/eventType.ts | 38 +++++++++++++++++++ 2 files changed, 67 insertions(+), 5 deletions(-) diff --git a/apps/web/app/(use-page-wrapper)/event-types/[type]/page.tsx b/apps/web/app/(use-page-wrapper)/event-types/[type]/page.tsx index 44d7b43f87..f0067599e7 100644 --- a/apps/web/app/(use-page-wrapper)/event-types/[type]/page.tsx +++ b/apps/web/app/(use-page-wrapper)/event-types/[type]/page.tsx @@ -2,19 +2,43 @@ import { withAppDirSsr } from "app/WithAppDirSsr"; import type { PageProps as _PageProps } from "app/_types"; import { _generateMetadata } from "app/_utils"; import { cookies, headers } from "next/headers"; +import { z } from "zod"; -import { buildLegacyCtx } from "@lib/buildLegacyCtx"; +import { getServerSession } from "@calcom/features/auth/lib/getServerSession"; +import { EventTypeRepository } from "@calcom/lib/server/repository/eventType"; + +import { buildLegacyCtx, buildLegacyRequest } from "@lib/buildLegacyCtx"; import type { PageProps as EventTypePageProps } from "@lib/event-types/[type]/getServerSideProps"; import { getServerSideProps } from "@lib/event-types/[type]/getServerSideProps"; import EventTypePageWrapper from "~/event-types/views/event-types-single-view"; -export const generateMetadata = async ({ params, searchParams }: _PageProps) => { - const legacyCtx = buildLegacyCtx(headers(), cookies(), params, searchParams); - const { eventType } = await getData(legacyCtx); +const querySchema = z.object({ + type: z + .string() + .refine((val) => !isNaN(Number(val)), { + message: "event-type id must be a string that can be cast to a number", + }) + .transform((val) => Number(val)), +}); + +export const generateMetadata = async ({ params }: _PageProps) => { + const session = await getServerSession({ req: buildLegacyRequest(headers(), cookies()) }); + const parsed = querySchema.safeParse(params); + if (!parsed.success || !session?.user?.id) { + return await _generateMetadata( + (t) => `${t("event_type")}`, + () => "" + ); + } + + const data = await EventTypeRepository.findTitleById({ + id: parsed.data.type, + userId: session?.user?.id, + }); return await _generateMetadata( - (t) => `${eventType.title} | ${t("event_type")}`, + (t) => (data?.title ? `${data.title} | ${t("event_type")}` : `${t("event_type")}`), () => "" ); }; diff --git a/packages/lib/server/repository/eventType.ts b/packages/lib/server/repository/eventType.ts index 761f9da5f5..71f972466a 100644 --- a/packages/lib/server/repository/eventType.ts +++ b/packages/lib/server/repository/eventType.ts @@ -441,6 +441,44 @@ export class EventTypeRepository { }); } + static async findTitleById({ id, userId }: { id: number; userId: number }) { + return await prisma.eventType.findFirst({ + where: { + AND: [ + { + OR: [ + { + users: { + some: { + id: userId, + }, + }, + }, + { + team: { + members: { + some: { + userId: userId, + }, + }, + }, + }, + { + userId: userId, + }, + ], + }, + { + id, + }, + ], + }, + select: { + title: true, + }, + }); + } + static async findById({ id, userId }: { id: number; userId: number }) { const userSelect = Prisma.validator()({ name: true,