From 7725adedc84c4afb319254a077094e2bd71c312c Mon Sep 17 00:00:00 2001 From: Benny Joo Date: Tue, 10 Sep 2024 21:43:50 -0400 Subject: [PATCH] chore: App router migration (`org/[orgSlug]/instant-meeting`), add missing page (#16448) * Create event repository * Use repository in event.handler * fix type check * migrate org/instant-meeting * add export default * fix metadata * move getServerSideProps from @server/lib to @lib * fix * fix * revert unneeded changes --------- Co-authored-by: Udit Takkar <53316345+Udit-takkar@users.noreply.github.com> --- .../team/[slug]/[type]/page.tsx | 42 ++++++ .../team/[slug]/[type]/getServerSideProps.ts | 73 +++++++++++ .../[slug]/[type]/instant-meeting-view.tsx | 41 ++++++ .../instant-meeting/team/[slug]/[type].tsx | 121 +----------------- packages/lib/server/repository/event.ts | 18 +++ .../routers/publicViewer/event.handler.ts | 16 +-- 6 files changed, 183 insertions(+), 128 deletions(-) create mode 100644 apps/web/app/future/org/[orgSlug]/instant-meeting/team/[slug]/[type]/page.tsx create mode 100644 apps/web/lib/org/[orgSlug]/instant-meeting/team/[slug]/[type]/getServerSideProps.ts create mode 100644 apps/web/modules/org/[orgSlug]/instant-meeting/team/[slug]/[type]/instant-meeting-view.tsx create mode 100644 packages/lib/server/repository/event.ts diff --git a/apps/web/app/future/org/[orgSlug]/instant-meeting/team/[slug]/[type]/page.tsx b/apps/web/app/future/org/[orgSlug]/instant-meeting/team/[slug]/[type]/page.tsx new file mode 100644 index 0000000000..2786759be3 --- /dev/null +++ b/apps/web/app/future/org/[orgSlug]/instant-meeting/team/[slug]/[type]/page.tsx @@ -0,0 +1,42 @@ +import { withAppDirSsr } from "app/WithAppDirSsr"; +import type { PageProps as _PageProps } from "app/_types"; +import { _generateMetadata } from "app/_utils"; +import { WithLayout } from "app/layoutHOC"; +import { headers, cookies } from "next/headers"; + +import { getLayout } from "@calcom/features/MainLayoutAppDir"; +import { orgDomainConfig } from "@calcom/features/ee/organizations/lib/orgDomains"; +import { EventRepository } from "@calcom/lib/server/repository/event"; + +import { buildLegacyCtx } from "@lib/buildLegacyCtx"; +import { getServerSideProps } from "@lib/org/[orgSlug]/instant-meeting/team/[slug]/[type]/getServerSideProps"; + +import type { PageProps } from "~/org/[orgSlug]/instant-meeting/team/[slug]/[type]/instant-meeting-view"; +import Page from "~/org/[orgSlug]/instant-meeting/team/[slug]/[type]/instant-meeting-view"; + +export const generateMetadata = async ({ params, searchParams }: _PageProps) => { + const context = buildLegacyCtx(headers(), cookies(), params, searchParams); + const { slug: eventSlug, user: username } = await getData(context); + const { currentOrgDomain, isValidOrgDomain } = orgDomainConfig(context.req, context.params?.orgSlug); + + const org = isValidOrgDomain ? currentOrgDomain : null; + + const event = await EventRepository.getPublicEvent({ + username, + eventSlug, + isTeamEvent: true, + org, + fromRedirectOfNonOrgLink: context.query.orgRedirection === "true", + }); + + const profileName = event?.profile.name ?? ""; + const title = event?.title ?? ""; + + return await _generateMetadata( + () => `${title} | ${profileName}`, + () => `${title}` + ); +}; + +const getData = withAppDirSsr(getServerSideProps); +export default WithLayout({ getLayout, getData, Page })<"P">; 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 new file mode 100644 index 0000000000..31b50cbf12 --- /dev/null +++ b/apps/web/lib/org/[orgSlug]/instant-meeting/team/[slug]/[type]/getServerSideProps.ts @@ -0,0 +1,73 @@ +import type { GetServerSidePropsContext } from "next"; +import { z } from "zod"; + +import { getMultipleDurationValue } from "@calcom/features/bookings/lib/get-booking"; +import { getSlugOrRequestedSlug } from "@calcom/features/ee/organizations/lib/orgDomains"; +import { orgDomainConfig } from "@calcom/features/ee/organizations/lib/orgDomains"; +import slugify from "@calcom/lib/slugify"; +import prisma from "@calcom/prisma"; + +const paramsSchema = z.object({ + type: z.string().transform((s) => slugify(s)), + slug: z.string().transform((s) => slugify(s)), +}); + +export const getServerSideProps = async (context: GetServerSidePropsContext) => { + const { slug: teamSlug, type: meetingSlug } = paramsSchema.parse(context.params); + const { duration: queryDuration } = context.query; + + const { currentOrgDomain, isValidOrgDomain } = orgDomainConfig(context.req, context.params?.orgSlug); + + const team = await prisma.team.findFirst({ + where: { + ...getSlugOrRequestedSlug(teamSlug), + parent: isValidOrgDomain && currentOrgDomain ? getSlugOrRequestedSlug(currentOrgDomain) : null, + }, + select: { + id: true, + hideBranding: true, + }, + }); + + if (!team) { + return { + notFound: true, + } as const; + } + + const org = isValidOrgDomain ? currentOrgDomain : null; + + const { ssrInit } = await import("@server/lib/ssr"); + const ssr = await ssrInit(context); + const eventData = await ssr.viewer.public.event.fetch({ + username: teamSlug, + eventSlug: meetingSlug, + isTeamEvent: true, + org, + fromRedirectOfNonOrgLink: context.query.orgRedirection === "true", + }); + + if (!eventData || !org) { + return { + notFound: true, + } as const; + } + + return { + props: { + entity: eventData.entity, + duration: getMultipleDurationValue( + eventData.metadata?.multipleDuration, + queryDuration, + eventData.length + ), + booking: null, + user: teamSlug, + teamId: team.id, + slug: meetingSlug, + trpcState: ssr.dehydrate(), + isBrandingHidden: team?.hideBranding, + themeBasis: null, + }, + }; +}; diff --git a/apps/web/modules/org/[orgSlug]/instant-meeting/team/[slug]/[type]/instant-meeting-view.tsx b/apps/web/modules/org/[orgSlug]/instant-meeting/team/[slug]/[type]/instant-meeting-view.tsx new file mode 100644 index 0000000000..c52b968fea --- /dev/null +++ b/apps/web/modules/org/[orgSlug]/instant-meeting/team/[slug]/[type]/instant-meeting-view.tsx @@ -0,0 +1,41 @@ +"use client"; + +import { Booker } from "@calcom/atoms/monorepo"; +import { getBookerWrapperClasses } from "@calcom/features/bookings/Booker/utils/getBookerWrapperClasses"; +import { BookerSeo } from "@calcom/features/bookings/components/BookerSeo"; + +import type { getServerSideProps } from "@lib/org/[orgSlug]/instant-meeting/team/[slug]/[type]/getServerSideProps"; +import type { inferSSRProps } from "@lib/types/inferSSRProps"; +import type { EmbedProps } from "@lib/withEmbedSsr"; + +export type PageProps = inferSSRProps & EmbedProps; + +function Type({ slug, user, booking, isEmbed, isBrandingHidden, entity, duration }: PageProps) { + return ( +
+ + +
+ ); +} + +Type.isBookingPage = true; + +export default Type; diff --git a/apps/web/pages/org/[orgSlug]/instant-meeting/team/[slug]/[type].tsx b/apps/web/pages/org/[orgSlug]/instant-meeting/team/[slug]/[type].tsx index 158202b913..2877917dba 100644 --- a/apps/web/pages/org/[orgSlug]/instant-meeting/team/[slug]/[type].tsx +++ b/apps/web/pages/org/[orgSlug]/instant-meeting/team/[slug]/[type].tsx @@ -1,119 +1,10 @@ -import type { GetServerSidePropsContext } from "next"; -import { z } from "zod"; - -import { Booker } from "@calcom/atoms/monorepo"; -import { getBookerWrapperClasses } from "@calcom/features/bookings/Booker/utils/getBookerWrapperClasses"; -import { BookerSeo } from "@calcom/features/bookings/components/BookerSeo"; -import { getMultipleDurationValue } from "@calcom/features/bookings/lib/get-booking"; -import { getSlugOrRequestedSlug } from "@calcom/features/ee/organizations/lib/orgDomains"; -import { orgDomainConfig } from "@calcom/features/ee/organizations/lib/orgDomains"; -import slugify from "@calcom/lib/slugify"; -import prisma from "@calcom/prisma"; - -import type { inferSSRProps } from "@lib/types/inferSSRProps"; -import type { EmbedProps } from "@lib/withEmbedSsr"; - import PageWrapper from "@components/PageWrapper"; -export type PageProps = inferSSRProps & EmbedProps; +import type { PageProps } from "~/org/[orgSlug]/instant-meeting/team/[slug]/[type]/instant-meeting-view"; +import Type from "~/org/[orgSlug]/instant-meeting/team/[slug]/[type]/instant-meeting-view"; -export default function Type({ - slug, - user, - booking, - isEmbed, - isBrandingHidden, - entity, - duration, -}: PageProps) { - return ( -
- - -
- ); -} +const Page = (props: PageProps) => ; +Page.PageWrapper = PageWrapper; -const paramsSchema = z.object({ - type: z.string().transform((s) => slugify(s)), - slug: z.string().transform((s) => slugify(s)), -}); - -Type.PageWrapper = PageWrapper; -Type.isBookingPage = true; - -export const getServerSideProps = async (context: GetServerSidePropsContext) => { - const { slug: teamSlug, type: meetingSlug } = paramsSchema.parse(context.params); - const { duration: queryDuration } = context.query; - const { ssrInit } = await import("@server/lib/ssr"); - const ssr = await ssrInit(context); - const { currentOrgDomain, isValidOrgDomain } = orgDomainConfig(context.req, context.params?.orgSlug); - - const team = await prisma.team.findFirst({ - where: { - ...getSlugOrRequestedSlug(teamSlug), - parent: isValidOrgDomain && currentOrgDomain ? getSlugOrRequestedSlug(currentOrgDomain) : null, - }, - select: { - id: true, - hideBranding: true, - }, - }); - - if (!team) { - return { - notFound: true, - } as const; - } - - const org = isValidOrgDomain ? currentOrgDomain : null; - - const eventData = await ssr.viewer.public.event.fetch({ - username: teamSlug, - eventSlug: meetingSlug, - isTeamEvent: true, - org, - fromRedirectOfNonOrgLink: context.query.orgRedirection === "true", - }); - - if (!eventData || !org) { - return { - notFound: true, - } as const; - } - - return { - props: { - entity: eventData.entity, - duration: getMultipleDurationValue( - eventData.metadata?.multipleDuration, - queryDuration, - eventData.length - ), - booking: null, - user: teamSlug, - teamId: team.id, - slug: meetingSlug, - trpcState: ssr.dehydrate(), - isBrandingHidden: team?.hideBranding, - themeBasis: null, - }, - }; -}; +export { getServerSideProps } from "@lib/org/[orgSlug]/instant-meeting/team/[slug]/[type]/getServerSideProps"; +export default Page; diff --git a/packages/lib/server/repository/event.ts b/packages/lib/server/repository/event.ts new file mode 100644 index 0000000000..3b25e2e0ce --- /dev/null +++ b/packages/lib/server/repository/event.ts @@ -0,0 +1,18 @@ +import { getPublicEvent } from "@calcom/features/eventtypes/lib/getPublicEvent"; +import prisma from "@calcom/prisma"; + +import type { TEventInputSchema } from "../../../trpc/server/routers/publicViewer/event.schema"; + +export class EventRepository { + static async getPublicEvent(input: TEventInputSchema) { + const event = await getPublicEvent( + input.username, + input.eventSlug, + input.isTeamEvent, + input.org, + prisma, + input.fromRedirectOfNonOrgLink + ); + return event; + } +} diff --git a/packages/trpc/server/routers/publicViewer/event.handler.ts b/packages/trpc/server/routers/publicViewer/event.handler.ts index 39d1fab1f0..1744762288 100644 --- a/packages/trpc/server/routers/publicViewer/event.handler.ts +++ b/packages/trpc/server/routers/publicViewer/event.handler.ts @@ -1,23 +1,13 @@ -import { getPublicEvent } from "@calcom/features/eventtypes/lib/getPublicEvent"; -import type { PrismaClient } from "@calcom/prisma"; +import { EventRepository } from "@calcom/lib/server/repository/event"; import type { TEventInputSchema } from "./event.schema"; interface EventHandlerOptions { - ctx: { prisma: PrismaClient }; input: TEventInputSchema; } -export const eventHandler = async ({ ctx, input }: EventHandlerOptions) => { - const event = await getPublicEvent( - input.username, - input.eventSlug, - input.isTeamEvent, - input.org, - ctx.prisma, - input.fromRedirectOfNonOrgLink - ); - return event; +export const eventHandler = async ({ input }: EventHandlerOptions) => { + return await EventRepository.getPublicEvent(input); }; export default eventHandler;