From 12a9c74eb6b4c952fd8002df09751b795de58fe6 Mon Sep 17 00:00:00 2001 From: Benny Joo Date: Tue, 3 Sep 2024 05:53:02 -0400 Subject: [PATCH] chore: App router migration - Add method to `BookingRepository` & Extract `/videos/**/*` into `/modules` and `/lib` (#16466) * meeting-ended: refactor and extract client code into /modules * meeting-not-started: refactor and extract client code into /modules * meeting-not-found: fix getData * BookingRepository: add a new method * video: refactor and extract client code into /modules * refactor * refactor getServerSideProps * use findBookingByUid for more getServerSideProps functions * rename findBookingByUid -> findBookingByUidWithOptionalSelect * add safety --- apps/web/app/future/video/[uid]/page.tsx | 4 +++- .../future/video/meeting-ended/[uid]/page.tsx | 6 ++++-- .../video/meeting-not-started/[uid]/page.tsx | 20 +++++++++---------- .../future/video/no-meeting-found/page.tsx | 14 +------------ .../video/[uid]/getServerSideProps.ts} | 14 ++++--------- .../[uid]/getServerSideProps.ts} | 9 +++------ .../[uid]/getServerSideProps.ts} | 12 +++-------- .../videos-meeting-ended-single-view.tsx | 4 +++- ...videos-meeting-not-started-single-view.tsx | 5 ++++- .../videos/views/videos-single-view.tsx | 5 ++++- apps/web/pages/video/[uid].tsx | 8 ++++---- apps/web/pages/video/meeting-ended/[uid].tsx | 11 ++++------ .../pages/video/meeting-not-started/[uid].tsx | 11 ++++------ apps/web/pages/video/no-meeting-found.tsx | 4 ++-- packages/lib/server/repository/booking.ts | 17 +++++++++++++++- 15 files changed, 69 insertions(+), 75 deletions(-) rename apps/web/{modules/videos/views/videos-single-view.getServerSideProps.tsx => lib/video/[uid]/getServerSideProps.ts} (92%) rename apps/web/{modules/videos/views/videos-meeting-ended-single-view.getServerSideProps.tsx => lib/video/meeting-ended/[uid]/getServerSideProps.ts} (81%) rename apps/web/{modules/videos/views/videos-meeting-not-started-single-view.getServerSideProps.tsx => lib/video/meeting-not-started/[uid]/getServerSideProps.ts} (61%) diff --git a/apps/web/app/future/video/[uid]/page.tsx b/apps/web/app/future/video/[uid]/page.tsx index 18731663a1..1ab356f72c 100644 --- a/apps/web/app/future/video/[uid]/page.tsx +++ b/apps/web/app/future/video/[uid]/page.tsx @@ -4,8 +4,10 @@ import { WithLayout } from "app/layoutHOC"; import { APP_NAME } from "@calcom/lib/constants"; +import { getServerSideProps } from "@lib/video/[uid]/getServerSideProps"; + +import type { PageProps } from "~/videos/views/videos-single-view"; import VideosSingleView from "~/videos/views/videos-single-view"; -import { getServerSideProps, type PageProps } from "~/videos/views/videos-single-view.getServerSideProps"; export const generateMetadata = async () => await _generateMetadata( diff --git a/apps/web/app/future/video/meeting-ended/[uid]/page.tsx b/apps/web/app/future/video/meeting-ended/[uid]/page.tsx index f3cf10badd..a90d75d49f 100644 --- a/apps/web/app/future/video/meeting-ended/[uid]/page.tsx +++ b/apps/web/app/future/video/meeting-ended/[uid]/page.tsx @@ -2,8 +2,10 @@ import { withAppDirSsr } from "app/WithAppDirSsr"; import { _generateMetadata } from "app/_utils"; import { WithLayout } from "app/layoutHOC"; +import { getServerSideProps } from "@lib/video/meeting-ended/[uid]/getServerSideProps"; + +import type { PageProps } from "~/videos/views/videos-meeting-ended-single-view"; import MeetingEnded from "~/videos/views/videos-meeting-ended-single-view"; -import { getServerSideProps } from "~/videos/views/videos-meeting-ended-single-view.getServerSideProps"; export const generateMetadata = async () => await _generateMetadata( @@ -11,6 +13,6 @@ export const generateMetadata = async () => () => "Meeting Unavailable" ); -const getData = withAppDirSsr(getServerSideProps); +const getData = withAppDirSsr(getServerSideProps); export default WithLayout({ getData, Page: MeetingEnded, getLayout: null })<"P">; diff --git a/apps/web/app/future/video/meeting-not-started/[uid]/page.tsx b/apps/web/app/future/video/meeting-not-started/[uid]/page.tsx index cc56a262ed..790367733e 100644 --- a/apps/web/app/future/video/meeting-not-started/[uid]/page.tsx +++ b/apps/web/app/future/video/meeting-not-started/[uid]/page.tsx @@ -1,19 +1,19 @@ import { withAppDirSsr } from "app/WithAppDirSsr"; -import type { PageProps } from "app/_types"; +import type { PageProps as _PageProps } from "app/_types"; import { _generateMetadata } from "app/_utils"; import { WithLayout } from "app/layoutHOC"; -import prisma, { bookingMinimalSelect } from "@calcom/prisma"; +import { BookingRepository } from "@calcom/lib/server/repository/booking"; +import { getServerSideProps } from "@lib/video/meeting-not-started/[uid]/getServerSideProps"; + +import type { PageProps } from "~/videos/views/videos-meeting-not-started-single-view"; import MeetingNotStarted from "~/videos/views/videos-meeting-not-started-single-view"; -import { getServerSideProps } from "~/videos/views/videos-meeting-not-started-single-view.getServerSideProps"; -export const generateMetadata = async ({ params }: PageProps) => { - const booking = await prisma.booking.findUnique({ - where: { - uid: typeof params?.uid === "string" ? params.uid : "", - }, - select: bookingMinimalSelect, +export const generateMetadata = async ({ params, searchParams }: _PageProps) => { + const p = { ...params, ...searchParams }; + const booking = await BookingRepository.findBookingByUidWithOptionalSelect({ + bookingUid: typeof p?.uid === "string" ? p.uid : "", }); return await _generateMetadata( @@ -22,6 +22,6 @@ export const generateMetadata = async ({ params }: PageProps) => { ); }; -const getData = withAppDirSsr(getServerSideProps); +const getData = withAppDirSsr(getServerSideProps); export default WithLayout({ getData, Page: MeetingNotStarted, getLayout: null })<"P">; diff --git a/apps/web/app/future/video/no-meeting-found/page.tsx b/apps/web/app/future/video/no-meeting-found/page.tsx index e067027d7d..09823fb1d0 100644 --- a/apps/web/app/future/video/no-meeting-found/page.tsx +++ b/apps/web/app/future/video/no-meeting-found/page.tsx @@ -1,8 +1,5 @@ import { _generateMetadata } from "app/_utils"; import { WithLayout } from "app/layoutHOC"; -import type { GetServerSidePropsContext } from "next"; - -import { ssrInit } from "@server/lib/ssr"; import NoMeetingFound from "~/videos/views/videos-no-meeting-found-single-view"; @@ -12,13 +9,4 @@ export const generateMetadata = async () => (t) => t("no_meeting_found") ); -// ssr was added by Intuita, legacy page does not have it -const getData = async (context: GetServerSidePropsContext) => { - const ssr = await ssrInit(context); - - return { - dehydratedState: ssr.dehydrate(), - }; -}; - -export default WithLayout({ getData, Page: NoMeetingFound, getLayout: null })<"P">; +export default WithLayout({ Page: NoMeetingFound, getLayout: null })<"P">; diff --git a/apps/web/modules/videos/views/videos-single-view.getServerSideProps.tsx b/apps/web/lib/video/[uid]/getServerSideProps.ts similarity index 92% rename from apps/web/modules/videos/views/videos-single-view.getServerSideProps.tsx rename to apps/web/lib/video/[uid]/getServerSideProps.ts index af2e6e914d..ea41d739d6 100644 --- a/apps/web/modules/videos/views/videos-single-view.getServerSideProps.tsx +++ b/apps/web/lib/video/[uid]/getServerSideProps.ts @@ -7,15 +7,12 @@ import { } from "@calcom/app-store/dailyvideo/lib/VideoApiAdapter"; import { getServerSession } from "@calcom/features/auth/lib/getServerSession"; import { getCalVideoReference } from "@calcom/features/get-cal-video-reference"; +import { BookingRepository } from "@calcom/lib/server/repository/booking"; import { UserRepository } from "@calcom/lib/server/repository/user"; -import prisma, { bookingMinimalSelect } from "@calcom/prisma"; - -import { type inferSSRProps } from "@lib/types/inferSSRProps"; +import prisma from "@calcom/prisma"; import { ssrInit } from "@server/lib/ssr"; -export type PageProps = inferSSRProps; - const md = new MarkdownIt("default", { html: true, breaks: true, linkify: true }); export async function getServerSideProps(context: GetServerSidePropsContext) { @@ -23,12 +20,9 @@ export async function getServerSideProps(context: GetServerSidePropsContext) { const ssr = await ssrInit(context); - const booking = await prisma.booking.findUnique({ - where: { - uid: context.query.uid as string, - }, + const booking = await BookingRepository.findBookingByUidWithOptionalSelect({ + bookingUid: context.query.uid as string, select: { - ...bookingMinimalSelect, uid: true, description: true, isRecorded: true, diff --git a/apps/web/modules/videos/views/videos-meeting-ended-single-view.getServerSideProps.tsx b/apps/web/lib/video/meeting-ended/[uid]/getServerSideProps.ts similarity index 81% rename from apps/web/modules/videos/views/videos-meeting-ended-single-view.getServerSideProps.tsx rename to apps/web/lib/video/meeting-ended/[uid]/getServerSideProps.ts index 96526bd9e2..9e073704eb 100644 --- a/apps/web/modules/videos/views/videos-meeting-ended-single-view.getServerSideProps.tsx +++ b/apps/web/lib/video/meeting-ended/[uid]/getServerSideProps.ts @@ -1,17 +1,14 @@ import type { GetServerSidePropsContext } from "next"; -import prisma, { bookingMinimalSelect } from "@calcom/prisma"; +import { BookingRepository } from "@calcom/lib/server/repository/booking"; import { type inferSSRProps } from "@lib/types/inferSSRProps"; export type PageProps = inferSSRProps; export async function getServerSideProps(context: GetServerSidePropsContext) { - const booking = await prisma.booking.findUnique({ - where: { - uid: context.query.uid as string, - }, + const booking = await BookingRepository.findBookingByUidWithOptionalSelect({ + bookingUid: context.query.uid as string, select: { - ...bookingMinimalSelect, uid: true, user: { select: { diff --git a/apps/web/modules/videos/views/videos-meeting-not-started-single-view.getServerSideProps.tsx b/apps/web/lib/video/meeting-not-started/[uid]/getServerSideProps.ts similarity index 61% rename from apps/web/modules/videos/views/videos-meeting-not-started-single-view.getServerSideProps.tsx rename to apps/web/lib/video/meeting-not-started/[uid]/getServerSideProps.ts index 50464d2c93..379a34bd81 100644 --- a/apps/web/modules/videos/views/videos-meeting-not-started-single-view.getServerSideProps.tsx +++ b/apps/web/lib/video/meeting-not-started/[uid]/getServerSideProps.ts @@ -1,17 +1,11 @@ import type { GetServerSidePropsContext } from "next"; -import prisma, { bookingMinimalSelect } from "@calcom/prisma"; -import type { inferSSRProps } from "@calcom/types/inferSSRProps"; - -export type PageProps = inferSSRProps; +import { BookingRepository } from "@calcom/lib/server/repository/booking"; // change the type export async function getServerSideProps(context: GetServerSidePropsContext) { - const booking = await prisma.booking.findUnique({ - where: { - uid: context.query.uid as string, - }, - select: bookingMinimalSelect, + const booking = await BookingRepository.findBookingByUidWithOptionalSelect({ + bookingUid: context.query.uid as string, }); if (!booking) { diff --git a/apps/web/modules/videos/views/videos-meeting-ended-single-view.tsx b/apps/web/modules/videos/views/videos-meeting-ended-single-view.tsx index 0cdf24d544..a7d352d615 100644 --- a/apps/web/modules/videos/views/videos-meeting-ended-single-view.tsx +++ b/apps/web/modules/videos/views/videos-meeting-ended-single-view.tsx @@ -3,10 +3,12 @@ import dayjs from "@calcom/dayjs"; import { useLocale } from "@calcom/lib/hooks/useLocale"; import { detectBrowserTimeFormat } from "@calcom/lib/timeFormat"; +import type { inferSSRProps } from "@calcom/types/inferSSRProps"; import { Button, HeadSeo, Icon } from "@calcom/ui"; -import { type PageProps } from "./videos-meeting-ended-single-view.getServerSideProps"; +import type { getServerSideProps } from "@lib/video/meeting-ended/[uid]/getServerSideProps"; +export type PageProps = inferSSRProps; export default function MeetingUnavailable(props: PageProps) { const { t } = useLocale(); diff --git a/apps/web/modules/videos/views/videos-meeting-not-started-single-view.tsx b/apps/web/modules/videos/views/videos-meeting-not-started-single-view.tsx index bcf4b8e79f..c7d5e8b7d7 100644 --- a/apps/web/modules/videos/views/videos-meeting-not-started-single-view.tsx +++ b/apps/web/modules/videos/views/videos-meeting-not-started-single-view.tsx @@ -3,9 +3,12 @@ import dayjs from "@calcom/dayjs"; import { useLocale } from "@calcom/lib/hooks/useLocale"; import { detectBrowserTimeFormat } from "@calcom/lib/timeFormat"; +import type { inferSSRProps } from "@calcom/types/inferSSRProps"; import { Button, HeadSeo, Icon, EmptyScreen } from "@calcom/ui"; -import { type PageProps } from "./videos-meeting-not-started-single-view.getServerSideProps"; +import type { getServerSideProps } from "@lib/video/meeting-not-started/[uid]/getServerSideProps"; + +export type PageProps = inferSSRProps; export default function MeetingNotStarted(props: PageProps) { const { t } = useLocale(); diff --git a/apps/web/modules/videos/views/videos-single-view.tsx b/apps/web/modules/videos/views/videos-single-view.tsx index e40e8ce105..9abb726ae0 100644 --- a/apps/web/modules/videos/views/videos-single-view.tsx +++ b/apps/web/modules/videos/views/videos-single-view.tsx @@ -13,11 +13,14 @@ import { TRANSCRIPTION_STOPPED_ICON, RECORDING_DEFAULT_ICON } from "@calcom/lib/ import { formatToLocalizedDate, formatToLocalizedTime } from "@calcom/lib/date-fns"; import { useLocale } from "@calcom/lib/hooks/useLocale"; import { markdownToSafeHTML } from "@calcom/lib/markdownToSafeHTML"; +import type { inferSSRProps } from "@calcom/types/inferSSRProps"; import { Icon } from "@calcom/ui"; +import type { getServerSideProps } from "@lib/video/[uid]/getServerSideProps"; + import { CalAiTranscribe } from "~/videos/ai/ai-transcribe"; -import { type PageProps } from "./videos-single-view.getServerSideProps"; +export type PageProps = inferSSRProps; export default function JoinCall(props: PageProps) { const { t } = useLocale(); diff --git a/apps/web/pages/video/[uid].tsx b/apps/web/pages/video/[uid].tsx index a0e571ee66..b5eaeac454 100644 --- a/apps/web/pages/video/[uid].tsx +++ b/apps/web/pages/video/[uid].tsx @@ -1,10 +1,10 @@ -import PageWrapper, { type CalPageWrapper } from "@components/PageWrapper"; +import PageWrapper from "@components/PageWrapper"; -import VideosSingleView from "~/videos/views/videos-single-view"; +import VideosSingleView, { type PageProps } from "~/videos/views/videos-single-view"; -export { getServerSideProps, type PageProps } from "~/videos/views/videos-single-view.getServerSideProps"; +export { getServerSideProps } from "@lib/video/[uid]/getServerSideProps"; -const VideosSinglePage = VideosSingleView as unknown as CalPageWrapper; +const VideosSinglePage = (props: PageProps) => ; VideosSinglePage.PageWrapper = PageWrapper; diff --git a/apps/web/pages/video/meeting-ended/[uid].tsx b/apps/web/pages/video/meeting-ended/[uid].tsx index 3c744d7f9e..2e00c7ff23 100644 --- a/apps/web/pages/video/meeting-ended/[uid].tsx +++ b/apps/web/pages/video/meeting-ended/[uid].tsx @@ -1,13 +1,10 @@ -import PageWrapper, { type CalPageWrapper } from "@components/PageWrapper"; +import PageWrapper from "@components/PageWrapper"; -import MeetingEnded from "~/videos/views/videos-meeting-ended-single-view"; +import MeetingEnded, { type PageProps } from "~/videos/views/videos-meeting-ended-single-view"; -export { - getServerSideProps, - type PageProps, -} from "~/videos/views/videos-meeting-ended-single-view.getServerSideProps"; +export { getServerSideProps } from "@lib/video/meeting-ended/[uid]/getServerSideProps"; -const MeetingEndedPage = MeetingEnded as unknown as CalPageWrapper; +const MeetingEndedPage = (props: PageProps) => ; MeetingEndedPage.PageWrapper = PageWrapper; diff --git a/apps/web/pages/video/meeting-not-started/[uid].tsx b/apps/web/pages/video/meeting-not-started/[uid].tsx index fe592e983e..902130c2f5 100644 --- a/apps/web/pages/video/meeting-not-started/[uid].tsx +++ b/apps/web/pages/video/meeting-not-started/[uid].tsx @@ -1,13 +1,10 @@ -import PageWrapper, { type CalPageWrapper } from "@components/PageWrapper"; +import PageWrapper from "@components/PageWrapper"; -import MeetingNotStarted from "~/videos/views/videos-meeting-not-started-single-view"; +import MeetingNotStarted, { type PageProps } from "~/videos/views/videos-meeting-not-started-single-view"; -export { - getServerSideProps, - type PageProps, -} from "~/videos/views/videos-meeting-not-started-single-view.getServerSideProps"; +export { getServerSideProps } from "@lib/video/meeting-not-started/[uid]/getServerSideProps"; -const MeetingNotStartedPage = MeetingNotStarted as unknown as CalPageWrapper; +const MeetingNotStartedPage = (props: PageProps) => ; MeetingNotStartedPage.PageWrapper = PageWrapper; diff --git a/apps/web/pages/video/no-meeting-found.tsx b/apps/web/pages/video/no-meeting-found.tsx index 55bd4f9d3c..dad9643a44 100644 --- a/apps/web/pages/video/no-meeting-found.tsx +++ b/apps/web/pages/video/no-meeting-found.tsx @@ -1,8 +1,8 @@ -import PageWrapper, { type CalPageWrapper } from "@components/PageWrapper"; +import PageWrapper from "@components/PageWrapper"; import NoMeetingFound from "~/videos/views/videos-no-meeting-found-single-view"; -const NoMeetingFoundPage = NoMeetingFound as unknown as CalPageWrapper; +const NoMeetingFoundPage = () => ; NoMeetingFoundPage.PageWrapper = PageWrapper; diff --git a/packages/lib/server/repository/booking.ts b/packages/lib/server/repository/booking.ts index 8e054088fd..b5d85a31f0 100644 --- a/packages/lib/server/repository/booking.ts +++ b/packages/lib/server/repository/booking.ts @@ -1,6 +1,6 @@ import type { Prisma } from "@prisma/client"; -import prisma from "@calcom/prisma"; +import prisma, { bookingMinimalSelect } from "@calcom/prisma"; import { BookingStatus } from "@calcom/prisma/enums"; import { UserRepository } from "./user"; @@ -113,6 +113,21 @@ export class BookingRepository { return allBookings; } + static async findBookingByUidWithOptionalSelect({ + bookingUid, + select, + }: { + bookingUid: string; + select?: Prisma.BookingSelect; + }) { + return await prisma.booking.findUnique({ + where: { + uid: bookingUid, + }, + select: { ...bookingMinimalSelect, ...select }, + }); + } + static async findBookingByUidAndUserId({ bookingUid, userId }: { bookingUid: string; userId: number }) { return await prisma.booking.findFirst({ where: {