Skip to content

Commit

Permalink
perf: Remove tRPC event call from server-side props (#17205)
Browse files Browse the repository at this point in the history
  • Loading branch information
keithwillcode authored Oct 20, 2024
1 parent 5f0cc80 commit dcd07d1
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 38 deletions.
71 changes: 44 additions & 27 deletions apps/web/lib/team/[slug]/[type]/getServerSideProps.tsx
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import type { Prisma } from "@prisma/client";
import type { GetServerSidePropsContext } from "next";
import { z } from "zod";

Expand All @@ -10,7 +11,7 @@ import slugify from "@calcom/lib/slugify";
import prisma from "@calcom/prisma";
import { RedirectType } from "@calcom/prisma/client";
import { SchedulingType } from "@calcom/prisma/enums";
import type { RouterOutputs } from "@calcom/trpc";
import { EventTypeMetaDataSchema } from "@calcom/prisma/zod-utils";

import { getTemporaryOrgRedirect } from "@lib/getTemporaryOrgRedirect";

Expand All @@ -29,7 +30,6 @@ export const getServerSideProps = async (context: GetServerSidePropsContext) =>
const session = await getServerSession({ req });
const { slug: teamSlug, type: meetingSlug } = paramsSchema.parse(params);
const { rescheduleUid, isInstantMeeting: queryIsInstantMeeting, email } = query;
const ssr = await ssrInit(context);
const { currentOrgDomain, isValidOrgDomain } = orgDomainConfig(req, params?.orgSlug);
const isOrgContext = currentOrgDomain && isValidOrgDomain;

Expand All @@ -54,65 +54,82 @@ export const getServerSideProps = async (context: GetServerSidePropsContext) =>
select: {
id: true,
hideBranding: true,
parent: true,
name: true,
slug: true,
eventTypes: {
where: {
slug: meetingSlug,
},
select: {
id: true,
isInstantEvent: true,
schedulingType: true,
metadata: true,
length: true,
},
},
},
});

if (!team) {
if (!team || !team.eventTypes?.[0]) {
return {
notFound: true,
} as const;
}

const eventData = team.eventTypes[0];

let booking: GetBookingType | null = null;
if (rescheduleUid) {
booking = await getBookingForReschedule(`${rescheduleUid}`, session?.user?.id);
}

const org = isValidOrgDomain ? currentOrgDomain : null;
// We use this to both prefetch the query on the server,
// as well as to check if the event exist, so we c an show a 404 otherwise.
const eventData = await ssr.viewer.public.event.fetch({
username: teamSlug,
eventSlug: meetingSlug,
isTeamEvent: true,
org,
fromRedirectOfNonOrgLink: context.query.orgRedirection === "true",
});

if (!eventData) {
return {
notFound: true,
} as const;
}
const ssr = await ssrInit(context);
const fromRedirectOfNonOrgLink = context.query.orgRedirection === "true";
const isUnpublished = team.parent ? !team.parent.slug : !team.slug;

return {
props: {
eventData: {
eventTypeId: eventData.id,
entity: eventData.entity,
entity: {
fromRedirectOfNonOrgLink,
considerUnpublished: isUnpublished && !fromRedirectOfNonOrgLink,
orgSlug: isValidOrgDomain ? currentOrgDomain : null,
teamSlug: team.slug ?? null,
name: team.parent?.name ?? team.name ?? null,
},
length: eventData.length,
metadata: eventData.metadata,
metadata: EventTypeMetaDataSchema.parse(eventData.metadata),
},
booking,
user: teamSlug,
teamId: team.id,
slug: meetingSlug,
trpcState: ssr.dehydrate(),
isBrandingHidden: team?.hideBranding,
isInstantMeeting: eventData.isInstantEvent && queryIsInstantMeeting ? true : false,
isInstantMeeting: eventData && queryIsInstantMeeting ? true : false,
themeBasis: null,
orgBannerUrl: eventData?.team?.parent?.bannerUrl ?? "",
orgBannerUrl: team.parent?.bannerUrl ?? "",
teamMemberEmail: await getTeamMemberEmail(eventData, email as string),
},
};
};

type EventData = RouterOutputs["viewer"]["public"]["event"];

async function getTeamMemberEmail(eventData: EventData, email?: string): Promise<string | null> {
async function getTeamMemberEmail(
eventData: {
id: number;
isInstantEvent: boolean;
schedulingType: SchedulingType | null;
metadata: Prisma.JsonValue | null;
length: number;
},
email?: string
): Promise<string | null> {
// Pre-requisites
if (!eventData || !email || eventData.schedulingType !== SchedulingType.ROUND_ROBIN) return null;
const crmContactOwnerEmail = await getCRMContactOwnerForRRLeadSkip(email, eventData.id);
const crmContactOwnerEmail = await getCRMContactOwnerForRRLeadSkip(email, eventData.metadata);
if (!crmContactOwnerEmail) return null;
// Determine if the contactOwner is a part of the event type
const contactOwnerQuery = await prisma.user.findFirst({
Expand Down
16 changes: 5 additions & 11 deletions packages/app-store/_utils/CRMRoundRobinSkip.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import type { Prisma } from "@prisma/client";
import type { z } from "zod";

import CrmManager from "@calcom/core/crmManager/crmManager";
Expand All @@ -7,20 +8,13 @@ import { EventTypeMetaDataSchema } from "@calcom/prisma/zod-utils";

export async function getCRMContactOwnerForRRLeadSkip(
bookerEmail: string,
eventTypeId: number
eventTypeMetadata: Prisma.JsonValue
): Promise<string | undefined> {
const eventTypeMetadataQuery = await prisma.eventType.findUnique({
where: {
id: eventTypeId,
},
select: { metadata: true },
});

const eventTypeMetadata = EventTypeMetaDataSchema.safeParse(eventTypeMetadataQuery?.metadata);
const parsedEventTypeMetadata = EventTypeMetaDataSchema.safeParse(eventTypeMetadata);

if (!eventTypeMetadata.success || !eventTypeMetadata.data?.apps) return;
if (!parsedEventTypeMetadata.success || !parsedEventTypeMetadata.data?.apps) return;

const crm = await getCRMManagerWithRRLeadSkip(eventTypeMetadata.data.apps);
const crm = await getCRMManagerWithRRLeadSkip(parsedEventTypeMetadata.data.apps);

if (!crm) return;

Expand Down

0 comments on commit dcd07d1

Please sign in to comment.