Skip to content

Commit

Permalink
chore: App router migration - Add method to BookingRepository & Ext…
Browse files Browse the repository at this point in the history
…ract `/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
  • Loading branch information
hbjORbj authored Sep 3, 2024
1 parent 6bb60e3 commit 12a9c74
Show file tree
Hide file tree
Showing 15 changed files with 69 additions and 75 deletions.
4 changes: 3 additions & 1 deletion apps/web/app/future/video/[uid]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down
6 changes: 4 additions & 2 deletions apps/web/app/future/video/meeting-ended/[uid]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,17 @@ 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(
() => "Meeting Unavailable",
() => "Meeting Unavailable"
);

const getData = withAppDirSsr(getServerSideProps);
const getData = withAppDirSsr<PageProps>(getServerSideProps);

export default WithLayout({ getData, Page: MeetingEnded, getLayout: null })<"P">;
20 changes: 10 additions & 10 deletions apps/web/app/future/video/meeting-not-started/[uid]/page.tsx
Original file line number Diff line number Diff line change
@@ -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(
Expand All @@ -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">;
14 changes: 1 addition & 13 deletions apps/web/app/future/video/no-meeting-found/page.tsx
Original file line number Diff line number Diff line change
@@ -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";

Expand All @@ -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">;
Original file line number Diff line number Diff line change
Expand Up @@ -7,28 +7,22 @@ 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) {
const { req } = context;

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,
Expand Down
Original file line number Diff line number Diff line change
@@ -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: {
Expand Down
Original file line number Diff line number Diff line change
@@ -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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
5 changes: 4 additions & 1 deletion apps/web/modules/videos/views/videos-single-view.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
8 changes: 4 additions & 4 deletions apps/web/pages/video/[uid].tsx
Original file line number Diff line number Diff line change
@@ -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;

Expand Down
11 changes: 4 additions & 7 deletions apps/web/pages/video/meeting-ended/[uid].tsx
Original file line number Diff line number Diff line change
@@ -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;

Expand Down
11 changes: 4 additions & 7 deletions apps/web/pages/video/meeting-not-started/[uid].tsx
Original file line number Diff line number Diff line change
@@ -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;

Expand Down
4 changes: 2 additions & 2 deletions apps/web/pages/video/no-meeting-found.tsx
Original file line number Diff line number Diff line change
@@ -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;

Expand Down
17 changes: 16 additions & 1 deletion packages/lib/server/repository/booking.ts
Original file line number Diff line number Diff line change
@@ -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";
Expand Down Expand Up @@ -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: {
Expand Down

0 comments on commit 12a9c74

Please sign in to comment.