From 34d360a4ec190d3481cf9b1138b0f73485740e5e Mon Sep 17 00:00:00 2001 From: Hariom Balhara Date: Wed, 7 Feb 2024 18:10:45 +0530 Subject: [PATCH] fix: Reduce payload in event-type/getByViewer (#13580) * Avoid selecting unused props * Reduce payload --------- Co-authored-by: Udit Takkar <53316345+Udit-takkar@users.noreply.github.com> --- .../views/event-types-listing-view.tsx | 7 +-- .../components/EventTypeDescription.tsx | 3 +- packages/lib/server/eventTypeSelect.ts | 45 +++++++++++++++++++ packages/lib/server/repository/eventType.ts | 16 ++++--- packages/lib/server/repository/membership.ts | 10 +++-- .../viewer/eventTypes/getByViewer.handler.ts | 2 +- 6 files changed, 65 insertions(+), 18 deletions(-) create mode 100644 packages/lib/server/eventTypeSelect.ts diff --git a/apps/web/modules/event-types/views/event-types-listing-view.tsx b/apps/web/modules/event-types/views/event-types-listing-view.tsx index 192783d562..0e9c6bcfb7 100644 --- a/apps/web/modules/event-types/views/event-types-listing-view.tsx +++ b/apps/web/modules/event-types/views/event-types-listing-view.tsx @@ -166,11 +166,7 @@ const Item = ({ type, group, readOnly }: { type: EventType; group: EventTypeGrou return readOnly ? (
{content()} - +
) : ( diff --git a/packages/features/eventtypes/components/EventTypeDescription.tsx b/packages/features/eventtypes/components/EventTypeDescription.tsx index f22e2a0ca7..b54cce64b8 100644 --- a/packages/features/eventtypes/components/EventTypeDescription.tsx +++ b/packages/features/eventtypes/components/EventTypeDescription.tsx @@ -16,11 +16,10 @@ import { Clock, Users, RefreshCw, Clipboard, Plus, User, Lock } from "@calcom/ui export type EventTypeDescriptionProps = { eventType: Pick< z.infer, - Exclude | "metadata" + Exclude | "metadata" | "seatsPerTimeSlot" > & { descriptionAsSafeHTML?: string | null; recurringEvent: Prisma.JsonValue; - seatsPerTimeSlot?: number; }; className?: string; shortenDescription?: boolean; diff --git a/packages/lib/server/eventTypeSelect.ts b/packages/lib/server/eventTypeSelect.ts new file mode 100644 index 0000000000..ddc51e6557 --- /dev/null +++ b/packages/lib/server/eventTypeSelect.ts @@ -0,0 +1,45 @@ +import { Prisma } from "@calcom/prisma/client"; + +export const eventTypeSelect = Prisma.validator()({ + id: true, + teamId: true, + schedulingType: true, + userId: true, + metadata: true, + description: true, + hidden: true, + slug: true, + length: true, + title: true, + requiresConfirmation: true, + position: true, + offsetStart: true, + profileId: true, + eventName: true, + parentId: true, + timeZone: true, + periodType: true, + periodStartDate: true, + periodEndDate: true, + periodDays: true, + periodCountCalendarDays: true, + lockTimeZoneToggleOnBookingPage: true, + requiresBookerEmailVerification: true, + disableGuests: true, + hideCalendarNotes: true, + minimumBookingNotice: true, + beforeEventBuffer: true, + afterEventBuffer: true, + seatsPerTimeSlot: true, + onlyShowFirstAvailableSlot: true, + seatsShowAttendees: true, + seatsShowAvailabilityCount: true, + scheduleId: true, + price: true, + currency: true, + slotInterval: true, + successRedirectUrl: true, + isInstantEvent: true, + assignAllTeamMembers: true, + recurringEvent: true, +}); diff --git a/packages/lib/server/repository/eventType.ts b/packages/lib/server/repository/eventType.ts index bfa48b3f5b..184425bce8 100644 --- a/packages/lib/server/repository/eventType.ts +++ b/packages/lib/server/repository/eventType.ts @@ -6,6 +6,7 @@ import { prisma } from "@calcom/prisma"; import type { Ensure } from "@calcom/types/utils"; import { safeStringify } from "../../safeStringify"; +import { eventTypeSelect } from "../eventTypeSelect"; import { LookupTarget, ProfileRepository } from "./profile"; const log = logger.getSubLogger({ prefix: ["repository/eventType"] }); @@ -99,12 +100,15 @@ export class EventTypeRepository { if (!upId) return []; const lookupTarget = ProfileRepository.getLookupTarget(upId); const profileId = lookupTarget.type === LookupTarget.User ? null : lookupTarget.id; - const include = { + const select = { + ...eventTypeSelect, // TODO: As required by getByViewHandler - Make it configurable team: { - include: { + select: { + id: true, eventTypes: { - include: { + select: { + id: true, users: { select: userSelect }, }, }, @@ -140,7 +144,7 @@ export class EventTypeRepository { userId: lookupTarget.id, ...where, }, - include, + select, orderBy, }); } @@ -164,7 +168,7 @@ export class EventTypeRepository { ], ...where, }, - include, + select, orderBy, }); } else { @@ -172,7 +176,7 @@ export class EventTypeRepository { where: { profileId, }, - include, + select, orderBy, }); } diff --git a/packages/lib/server/repository/membership.ts b/packages/lib/server/repository/membership.ts index a607552ea4..1825617e1f 100644 --- a/packages/lib/server/repository/membership.ts +++ b/packages/lib/server/repository/membership.ts @@ -4,6 +4,7 @@ import { Prisma } from "@calcom/prisma/client"; import logger from "../../logger"; import { safeStringify } from "../../safeStringify"; +import { eventTypeSelect } from "../eventTypeSelect"; import { LookupTarget, ProfileRepository } from "./profile"; const log = logger.getSubLogger({ prefix: ["repository/membership"] }); @@ -103,11 +104,14 @@ export class MembershipRepository { select: teamParentSelect, }, eventTypes: { - include: { + select: { + ...eventTypeSelect, team: { - include: { + select: { + id: true, eventTypes: { - include: { + select: { + id: true, users: { select: userSelect }, }, }, diff --git a/packages/trpc/server/routers/viewer/eventTypes/getByViewer.handler.ts b/packages/trpc/server/routers/viewer/eventTypes/getByViewer.handler.ts index 75b84bd399..d0422a96d8 100644 --- a/packages/trpc/server/routers/viewer/eventTypes/getByViewer.handler.ts +++ b/packages/trpc/server/routers/viewer/eventTypes/getByViewer.handler.ts @@ -115,7 +115,7 @@ export const getByViewerHandler = async ({ ctx, input }: GetByViewerOptions) => }) ) ), - metadata: eventType.metadata ? EventTypeMetaDataSchema.parse(eventType.metadata) : undefined, + metadata: eventType.metadata ? EventTypeMetaDataSchema.parse(eventType.metadata) : null, children: await Promise.all( (eventType.children || []).map(async (c) => ({ ...c,