perf: Remove tRPC event call from server-side props (#17205)

This commit is contained in:
Keith Williams
2024-10-20 14:07:09 -07:00
committed by GitHub
parent 5f0cc805a9
commit dcd07d1cc6
2 changed files with 49 additions and 38 deletions
@@ -1,3 +1,4 @@
import type { Prisma } from "@prisma/client";
import type { GetServerSidePropsContext } from "next";
import { z } from "zod";
@@ -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";
@@ -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;
@@ -54,44 +54,54 @@ 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,
@@ -99,20 +109,27 @@ export const getServerSideProps = async (context: GetServerSidePropsContext) =>
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({
+5 -11
View File
@@ -1,3 +1,4 @@
import type { Prisma } from "@prisma/client";
import type { z } from "zod";
import CrmManager from "@calcom/core/crmManager/crmManager";
@@ -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 parsedEventTypeMetadata = EventTypeMetaDataSchema.safeParse(eventTypeMetadata);
const eventTypeMetadata = EventTypeMetaDataSchema.safeParse(eventTypeMetadataQuery?.metadata);
if (!parsedEventTypeMetadata.success || !parsedEventTypeMetadata.data?.apps) return;
if (!eventTypeMetadata.success || !eventTypeMetadata.data?.apps) return;
const crm = await getCRMManagerWithRRLeadSkip(eventTypeMetadata.data.apps);
const crm = await getCRMManagerWithRRLeadSkip(parsedEventTypeMetadata.data.apps);
if (!crm) return;