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
This commit is contained in:
Benny Joo
2024-09-03 18:53:02 +09:00
committed by GitHub
parent 6bb60e36fd
commit 12a9c74eb6
15 changed files with 69 additions and 75 deletions
+3 -1
View File
@@ -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(
@@ -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<PageProps>(getServerSideProps);
export default WithLayout({ getData, Page: MeetingEnded, getLayout: null })<"P">;
@@ -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<PageProps>(getServerSideProps);
export default WithLayout({ getData, Page: MeetingNotStarted, getLayout: null })<"P">;
@@ -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">;
@@ -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<typeof getServerSideProps>;
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,
@@ -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<typeof getServerSideProps>;
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: {
@@ -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<typeof getServerSideProps>;
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) {
@@ -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<typeof getServerSideProps>;
export default function MeetingUnavailable(props: PageProps) {
const { t } = useLocale();
@@ -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<typeof getServerSideProps>;
export default function MeetingNotStarted(props: PageProps) {
const { t } = useLocale();
@@ -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<typeof getServerSideProps>;
export default function JoinCall(props: PageProps) {
const { t } = useLocale();
+4 -4
View File
@@ -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) => <VideosSingleView {...props} />;
VideosSinglePage.PageWrapper = PageWrapper;
+4 -7
View File
@@ -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) => <MeetingEnded {...props} />;
MeetingEndedPage.PageWrapper = PageWrapper;
@@ -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) => <MeetingNotStarted {...props} />;
MeetingNotStartedPage.PageWrapper = PageWrapper;
+2 -2
View File
@@ -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 = () => <NoMeetingFound />;
NoMeetingFoundPage.PageWrapper = PageWrapper;
+16 -1
View File
@@ -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: {