diff --git a/apps/web/lib/team/[slug]/[type]/getServerSideProps.tsx b/apps/web/lib/team/[slug]/[type]/getServerSideProps.tsx index 6046eed3e51250..4dd25698aabef3 100644 --- a/apps/web/lib/team/[slug]/[type]/getServerSideProps.tsx +++ b/apps/web/lib/team/[slug]/[type]/getServerSideProps.tsx @@ -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 { +async function getTeamMemberEmail( + eventData: { + id: number; + isInstantEvent: boolean; + schedulingType: SchedulingType | null; + metadata: Prisma.JsonValue | null; + length: number; + }, + email?: string +): Promise { // 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({ diff --git a/packages/app-store/_utils/CRMRoundRobinSkip.ts b/packages/app-store/_utils/CRMRoundRobinSkip.ts index bdd514c6fd6bf2..8b9b53762c1780 100644 --- a/packages/app-store/_utils/CRMRoundRobinSkip.ts +++ b/packages/app-store/_utils/CRMRoundRobinSkip.ts @@ -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 { - 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;