From 0565e23818af2daa5569b6521bb08b6d88bd02d4 Mon Sep 17 00:00:00 2001 From: Alex van Andel Date: Wed, 5 Mar 2025 19:32:53 +0000 Subject: [PATCH] refactor: Remove intervalLimits from @calcom/lib and export directly (#19710) * refactor: Remove intervalLimits from @calcom/lib and export directly * Tackle other places that use parseBookingLimit/parseDurationLimit * More type fixups that were hidden by previous fails * Fixed up booking-limits file * Remove server-only --- apps/web/playwright/booking-limits.e2e.ts | 4 ++-- apps/web/playwright/lib/testUtils.ts | 2 +- apps/web/test/lib/checkBookingLimits.test.ts | 6 +++--- apps/web/test/lib/checkDurationLimits.test.ts | 7 +++++-- .../utils/bookingScenario/bookingScenario.ts | 10 +++++++--- .../checkBookingAndDurationLimits.ts | 6 +++--- .../handleNewBooking/ensureAvailableUsers.ts | 3 ++- .../ee/teams/pages/team-settings-view.tsx | 4 ++-- .../components/tabs/limits/EventLimitsTab.tsx | 4 ++-- packages/features/eventtypes/lib/types.ts | 3 ++- packages/lib/event-types/getEventTypeById.ts | 5 ++++- packages/lib/getBusyTimes.ts | 5 +++-- packages/lib/getUserAvailability.ts | 8 ++++++-- packages/lib/index.ts | 3 --- packages/lib/intervalLimit.ts | 12 ------------ packages/lib/intervalLimits/intervalLimit.ts | 17 +++++++++++++++++ .../lib/intervalLimits/intervalLimitSchema.ts | 14 ++++++++++++++ .../lib/{ => intervalLimits}/isBookingLimits.ts | 4 ++-- .../{ => intervalLimits}/isDurationLimits.ts | 4 ++-- .../limitManager.ts | 4 +++- .../server/checkBookingLimits.ts | 10 +++++----- .../server/checkDurationLimits.ts | 10 +++++----- .../server}/getBusyTimesFromLimits.ts | 17 +++++++++-------- .../validateIntervalLimitOrder.ts | 3 +-- packages/lib/server/index.ts | 2 -- packages/lib/server/queries/teams/index.ts | 2 +- .../atoms/event-types/hooks/useEventTypeForm.ts | 2 +- packages/prisma/zod-utils.ts | 12 ++++-------- .../routers/viewer/eventTypes/update.handler.ts | 2 +- .../trpc/server/routers/viewer/slots/util.ts | 3 ++- .../routers/viewer/teams/update.handler.ts | 4 ++-- .../routers/viewer/teams/update.schema.ts | 2 +- packages/types/Calendar.d.ts | 6 ++---- 33 files changed, 114 insertions(+), 86 deletions(-) delete mode 100644 packages/lib/intervalLimit.ts create mode 100644 packages/lib/intervalLimits/intervalLimit.ts create mode 100644 packages/lib/intervalLimits/intervalLimitSchema.ts rename packages/lib/{ => intervalLimits}/isBookingLimits.ts (72%) rename packages/lib/{ => intervalLimits}/isDurationLimits.ts (72%) rename packages/lib/{bookingLimits => intervalLimits}/limitManager.ts (93%) rename packages/lib/{ => intervalLimits}/server/checkBookingLimits.ts (90%) rename packages/lib/{ => intervalLimits}/server/checkDurationLimits.ts (85%) rename packages/lib/{bookingLimits => intervalLimits/server}/getBusyTimesFromLimits.ts (93%) rename packages/lib/{ => intervalLimits}/validateIntervalLimitOrder.ts (88%) diff --git a/apps/web/playwright/booking-limits.e2e.ts b/apps/web/playwright/booking-limits.e2e.ts index d26dcf61e3..0e95b08640 100644 --- a/apps/web/playwright/booking-limits.e2e.ts +++ b/apps/web/playwright/booking-limits.e2e.ts @@ -6,11 +6,11 @@ import { expect } from "@playwright/test"; import type { Dayjs } from "@calcom/dayjs"; import dayjs from "@calcom/dayjs"; -import { intervalLimitKeyToUnit } from "@calcom/lib/intervalLimit"; +import { intervalLimitKeyToUnit } from "@calcom/lib/intervalLimits/intervalLimit"; +import type { IntervalLimit } from "@calcom/lib/intervalLimits/intervalLimitSchema"; import prisma from "@calcom/prisma"; import { BookingStatus } from "@calcom/prisma/client"; import { entries } from "@calcom/prisma/zod-utils"; -import type { IntervalLimit } from "@calcom/types/Calendar"; import { test } from "./lib/fixtures"; import { diff --git a/apps/web/playwright/lib/testUtils.ts b/apps/web/playwright/lib/testUtils.ts index 1b02564d4d..09fa660fbe 100644 --- a/apps/web/playwright/lib/testUtils.ts +++ b/apps/web/playwright/lib/testUtils.ts @@ -8,9 +8,9 @@ import { createServer } from "http"; import type { Messages } from "mailhog"; import { totp } from "otplib"; +import type { IntervalLimit } from "@calcom/lib/intervalLimits/intervalLimitSchema"; import type { Prisma } from "@calcom/prisma/client"; import { BookingStatus, SchedulingType } from "@calcom/prisma/enums"; -import type { IntervalLimit } from "@calcom/types/Calendar"; import type { createEmailsFixture } from "../fixtures/emails"; import type { Fixtures } from "./fixtures"; diff --git a/apps/web/test/lib/checkBookingLimits.test.ts b/apps/web/test/lib/checkBookingLimits.test.ts index 85b9661341..f7061da0a6 100644 --- a/apps/web/test/lib/checkBookingLimits.test.ts +++ b/apps/web/test/lib/checkBookingLimits.test.ts @@ -3,9 +3,9 @@ import prismaMock from "../../../../tests/libs/__mocks__/prismaMock"; import { describe, expect, it } from "vitest"; import dayjs from "@calcom/dayjs"; -import { validateIntervalLimitOrder } from "@calcom/lib"; -import { checkBookingLimits, checkBookingLimit } from "@calcom/lib/server/checkBookingLimits"; -import type { IntervalLimit } from "@calcom/types/Calendar"; +import type { IntervalLimit } from "@calcom/lib/intervalLimits/intervalLimitSchema"; +import { checkBookingLimits, checkBookingLimit } from "@calcom/lib/intervalLimits/server/checkBookingLimits"; +import { validateIntervalLimitOrder } from "@calcom/lib/intervalLimits/validateIntervalLimitOrder"; type Mockdata = { id: number; diff --git a/apps/web/test/lib/checkDurationLimits.test.ts b/apps/web/test/lib/checkDurationLimits.test.ts index c3aa63d560..52a5877e04 100644 --- a/apps/web/test/lib/checkDurationLimits.test.ts +++ b/apps/web/test/lib/checkDurationLimits.test.ts @@ -3,8 +3,11 @@ import prismaMock from "../../../../tests/libs/__mocks__/prismaMock"; import { describe, expect, it } from "vitest"; import dayjs from "@calcom/dayjs"; -import { validateIntervalLimitOrder } from "@calcom/lib"; -import { checkDurationLimit, checkDurationLimits } from "@calcom/lib/server/checkDurationLimits"; +import { + checkDurationLimit, + checkDurationLimits, +} from "@calcom/lib/intervalLimits/server/checkDurationLimits"; +import { validateIntervalLimitOrder } from "@calcom/lib/intervalLimits/validateIntervalLimitOrder"; type MockData = { id: number; diff --git a/apps/web/test/utils/bookingScenario/bookingScenario.ts b/apps/web/test/utils/bookingScenario/bookingScenario.ts index 6a0b55a512..230849914c 100644 --- a/apps/web/test/utils/bookingScenario/bookingScenario.ts +++ b/apps/web/test/utils/bookingScenario/bookingScenario.ts @@ -15,6 +15,7 @@ import { appStoreMetadata } from "@calcom/app-store/appStoreMetaData"; import { handleStripePaymentSuccess } from "@calcom/features/ee/payments/api/webhook"; import { weekdayToWeekIndex, type WeekDays } from "@calcom/lib/date-fns"; import type { HttpError } from "@calcom/lib/http-error"; +import type { IntervalLimit } from "@calcom/lib/intervalLimits/intervalLimitSchema"; import logger from "@calcom/lib/logger"; import { safeStringify } from "@calcom/lib/safeStringify"; import { ProfileRepository } from "@calcom/lib/server/repository/profile"; @@ -30,9 +31,12 @@ import type { teamMetadataSchema } from "@calcom/prisma/zod-utils"; import type { userMetadataType } from "@calcom/prisma/zod-utils"; import type { eventTypeBookingFields } from "@calcom/prisma/zod-utils"; import type { AppMeta } from "@calcom/types/App"; -import type { CalendarEvent, IntegrationCalendar } from "@calcom/types/Calendar"; -import type { NewCalendarEventType } from "@calcom/types/Calendar"; -import type { EventBusyDate, IntervalLimit } from "@calcom/types/Calendar"; +import type { + CalendarEvent, + IntegrationCalendar, + NewCalendarEventType, + EventBusyDate, +} from "@calcom/types/Calendar"; import type { CredentialForCalendarService } from "@calcom/types/Credential"; import { getMockPaymentService } from "./MockPaymentService"; diff --git a/packages/features/bookings/lib/handleNewBooking/checkBookingAndDurationLimits.ts b/packages/features/bookings/lib/handleNewBooking/checkBookingAndDurationLimits.ts index 9f76835ac9..001b48eefe 100644 --- a/packages/features/bookings/lib/handleNewBooking/checkBookingAndDurationLimits.ts +++ b/packages/features/bookings/lib/handleNewBooking/checkBookingAndDurationLimits.ts @@ -1,7 +1,7 @@ import dayjs from "@calcom/dayjs"; -import { checkBookingLimits } from "@calcom/lib/server/checkBookingLimits"; -import { checkDurationLimits } from "@calcom/lib/server/checkDurationLimits"; -import type { IntervalLimit } from "@calcom/types/Calendar"; +import type { IntervalLimit } from "@calcom/lib/intervalLimits/intervalLimitSchema"; +import { checkBookingLimits } from "@calcom/lib/intervalLimits/server/checkBookingLimits"; +import { checkDurationLimits } from "@calcom/lib/intervalLimits/server/checkDurationLimits"; import type { NewBookingEventType } from "./types"; diff --git a/packages/features/bookings/lib/handleNewBooking/ensureAvailableUsers.ts b/packages/features/bookings/lib/handleNewBooking/ensureAvailableUsers.ts index 4163b99825..dab4cb06a7 100644 --- a/packages/features/bookings/lib/handleNewBooking/ensureAvailableUsers.ts +++ b/packages/features/bookings/lib/handleNewBooking/ensureAvailableUsers.ts @@ -3,10 +3,11 @@ import type { Logger } from "tslog"; import dayjs from "@calcom/dayjs"; import type { Dayjs } from "@calcom/dayjs"; import { checkForConflicts } from "@calcom/features/bookings/lib/conflictChecker/checkForConflicts"; -import { parseBookingLimit, parseDurationLimit } from "@calcom/lib"; import { ErrorCode } from "@calcom/lib/errorCodes"; import { getBusyTimesForLimitChecks } from "@calcom/lib/getBusyTimes"; import { getUsersAvailability } from "@calcom/lib/getUserAvailability"; +import { parseBookingLimit } from "@calcom/lib/intervalLimits/isBookingLimits"; +import { parseDurationLimit } from "@calcom/lib/intervalLimits/isDurationLimits"; import { getPiiFreeUser } from "@calcom/lib/piiFreeData"; import { safeStringify } from "@calcom/lib/safeStringify"; diff --git a/packages/features/ee/teams/pages/team-settings-view.tsx b/packages/features/ee/teams/pages/team-settings-view.tsx index 655ca7d87a..bac750084d 100644 --- a/packages/features/ee/teams/pages/team-settings-view.tsx +++ b/packages/features/ee/teams/pages/team-settings-view.tsx @@ -7,13 +7,13 @@ import { useForm, Controller } from "react-hook-form"; import { AppearanceSkeletonLoader } from "@calcom/features/ee/components/CommonSkeletonLoaders"; import { IntervalLimitsManager } from "@calcom/features/eventtypes/components/tabs/limits/EventLimitsTab"; import SectionBottomActions from "@calcom/features/settings/SectionBottomActions"; -import { validateIntervalLimitOrder } from "@calcom/lib"; import { useLocale } from "@calcom/lib/hooks/useLocale"; import { useParamsWithFallback } from "@calcom/lib/hooks/useParamsWithFallback"; +import type { IntervalLimit } from "@calcom/lib/intervalLimits/intervalLimitSchema"; +import { validateIntervalLimitOrder } from "@calcom/lib/intervalLimits/validateIntervalLimitOrder"; import { MembershipRole } from "@calcom/prisma/enums"; import { trpc } from "@calcom/trpc/react"; import type { RouterOutputs } from "@calcom/trpc/react"; -import type { IntervalLimit } from "@calcom/types/Calendar"; import { Button, CheckboxField, Form, SettingsToggle, showToast } from "@calcom/ui"; import classNames from "@calcom/ui/classNames"; diff --git a/packages/features/eventtypes/components/tabs/limits/EventLimitsTab.tsx b/packages/features/eventtypes/components/tabs/limits/EventLimitsTab.tsx index 3e208e65f9..fae6c4ed88 100644 --- a/packages/features/eventtypes/components/tabs/limits/EventLimitsTab.tsx +++ b/packages/features/eventtypes/components/tabs/limits/EventLimitsTab.tsx @@ -16,9 +16,9 @@ import type { DurationType } from "@calcom/lib/convertToNewDurationType"; import convertToNewDurationType from "@calcom/lib/convertToNewDurationType"; import findDurationType from "@calcom/lib/findDurationType"; import { useLocale } from "@calcom/lib/hooks/useLocale"; -import { ascendingLimitKeys, intervalLimitKeyToUnit } from "@calcom/lib/intervalLimit"; +import { ascendingLimitKeys, intervalLimitKeyToUnit } from "@calcom/lib/intervalLimits/intervalLimit"; +import type { IntervalLimit } from "@calcom/lib/intervalLimits/intervalLimitSchema"; import { PeriodType } from "@calcom/prisma/enums"; -import type { IntervalLimit } from "@calcom/types/Calendar"; import { Button, DateRangePicker, InputField, Label, Select, SettingsToggle, TextField } from "@calcom/ui"; import classNames from "@calcom/ui/classNames"; diff --git a/packages/features/eventtypes/lib/types.ts b/packages/features/eventtypes/lib/types.ts index f9cdf1ab32..8fe242eaf2 100644 --- a/packages/features/eventtypes/lib/types.ts +++ b/packages/features/eventtypes/lib/types.ts @@ -1,6 +1,7 @@ import type { z } from "zod"; import type { ChildrenEventType } from "@calcom/features/eventtypes/components/ChildrenEventTypeSelect"; +import type { IntervalLimit } from "@calcom/lib/intervalLimits/intervalLimitSchema"; import type { EventLocationType } from "@calcom/lib/location"; import type { AttributesQueryValue } from "@calcom/lib/raqb/types"; import type { EventTypeTranslation } from "@calcom/prisma/client"; @@ -10,7 +11,7 @@ import type { customInputSchema } from "@calcom/prisma/zod-utils"; import type { eventTypeBookingFields } from "@calcom/prisma/zod-utils"; import type { eventTypeColor } from "@calcom/prisma/zod-utils"; import type { RouterOutputs, RouterInputs } from "@calcom/trpc/react"; -import type { IntervalLimit, RecurringEvent } from "@calcom/types/Calendar"; +import type { RecurringEvent } from "@calcom/types/Calendar"; export type CustomInputParsed = typeof customInputSchema._output; diff --git a/packages/lib/event-types/getEventTypeById.ts b/packages/lib/event-types/getEventTypeById.ts index ffac9c6a0e..e1881bb515 100644 --- a/packages/lib/event-types/getEventTypeById.ts +++ b/packages/lib/event-types/getEventTypeById.ts @@ -1,10 +1,13 @@ import { Prisma } from "@prisma/client"; +import "server-only"; import { getLocationGroupedOptions } from "@calcom/app-store/server"; import { getEventTypeAppData } from "@calcom/app-store/utils"; import { getBookingFieldsWithSystemFields } from "@calcom/features/bookings/lib/getBookingFields"; -import { parseBookingLimit, parseDurationLimit, parseRecurringEvent, parseEventTypeColor } from "@calcom/lib"; +import { parseRecurringEvent, parseEventTypeColor } from "@calcom/lib"; import { getUserAvatarUrl } from "@calcom/lib/getAvatarUrl"; +import { parseBookingLimit } from "@calcom/lib/intervalLimits/isBookingLimits"; +import { parseDurationLimit } from "@calcom/lib/intervalLimits/isDurationLimits"; import type { LocationObject } from "@calcom/lib/location"; import { getTranslation } from "@calcom/lib/server/i18n"; import { EventTypeRepository } from "@calcom/lib/server/repository/eventType"; diff --git a/packages/lib/getBusyTimes.ts b/packages/lib/getBusyTimes.ts index 414d176834..88d4a39051 100644 --- a/packages/lib/getBusyTimes.ts +++ b/packages/lib/getBusyTimes.ts @@ -5,7 +5,8 @@ import * as Sentry from "@sentry/nextjs"; import dayjs from "@calcom/dayjs"; import { getBusyCalendarTimes } from "@calcom/lib/CalendarManager"; import { subtract } from "@calcom/lib/date-ranges"; -import { intervalLimitKeyToUnit } from "@calcom/lib/intervalLimit"; +import { intervalLimitKeyToUnit } from "@calcom/lib/intervalLimits/intervalLimit"; +import type { IntervalLimit } from "@calcom/lib/intervalLimits/intervalLimitSchema"; import logger from "@calcom/lib/logger"; import { getPiiFreeBooking } from "@calcom/lib/piiFreeData"; import { performance } from "@calcom/lib/server/perfObserver"; @@ -13,7 +14,7 @@ import prisma from "@calcom/prisma"; import type { SelectedCalendar } from "@calcom/prisma/client"; import { BookingStatus } from "@calcom/prisma/enums"; import { stringToDayjs } from "@calcom/prisma/zod-utils"; -import type { EventBusyDetails, IntervalLimit } from "@calcom/types/Calendar"; +import type { EventBusyDetails } from "@calcom/types/Calendar"; import type { CredentialForCalendarService } from "@calcom/types/Credential"; import { getDefinedBufferTimes } from "../features/eventtypes/lib/getDefinedBufferTimes"; diff --git a/packages/lib/getUserAvailability.ts b/packages/lib/getUserAvailability.ts index e1efc89b52..4f93fbf60e 100644 --- a/packages/lib/getUserAvailability.ts +++ b/packages/lib/getUserAvailability.ts @@ -11,12 +11,17 @@ import { z } from "zod"; import type { Dayjs } from "@calcom/dayjs"; import dayjs from "@calcom/dayjs"; -import { parseBookingLimit, parseDurationLimit } from "@calcom/lib"; import { getWorkingHours } from "@calcom/lib/availability"; import type { DateOverride, WorkingHours } from "@calcom/lib/date-ranges"; import { buildDateRanges, subtract } from "@calcom/lib/date-ranges"; import { ErrorCode } from "@calcom/lib/errorCodes"; import { HttpError } from "@calcom/lib/http-error"; +import { parseBookingLimit } from "@calcom/lib/intervalLimits/isBookingLimits"; +import { parseDurationLimit } from "@calcom/lib/intervalLimits/isDurationLimits"; +import { + getBusyTimesFromLimits, + getBusyTimesFromTeamLimits, +} from "@calcom/lib/intervalLimits/server/getBusyTimesFromLimits"; import logger from "@calcom/lib/logger"; import { safeStringify } from "@calcom/lib/safeStringify"; import { findUsersForAvailabilityCheck } from "@calcom/lib/server/findUsersForAvailabilityCheck"; @@ -28,7 +33,6 @@ import { EventTypeMetaDataSchema, stringToDayjsZod } from "@calcom/prisma/zod-ut import type { EventBusyDetails, IntervalLimitUnit } from "@calcom/types/Calendar"; import type { TimeRange } from "@calcom/types/schedule"; -import { getBusyTimesFromLimits, getBusyTimesFromTeamLimits } from "./bookingLimits/getBusyTimesFromLimits"; import { getBusyTimes } from "./getBusyTimes"; import monitorCallbackAsync, { monitorCallbackSync } from "./sentryWrapper"; diff --git a/packages/lib/index.ts b/packages/lib/index.ts index bee6e6177b..5c20db2332 100644 --- a/packages/lib/index.ts +++ b/packages/lib/index.ts @@ -1,8 +1,5 @@ export { default as isPrismaObj, isPrismaObjOrUndefined } from "./isPrismaObj"; export * from "./isRecurringEvent"; -export * from "./isBookingLimits"; -export * from "./isDurationLimits"; export * from "./isEventTypeColor"; -export * from "./validateIntervalLimitOrder"; export * from "./schedules"; export * from "./event-types"; diff --git a/packages/lib/intervalLimit.ts b/packages/lib/intervalLimit.ts deleted file mode 100644 index 132293e105..0000000000 --- a/packages/lib/intervalLimit.ts +++ /dev/null @@ -1,12 +0,0 @@ -import type { IntervalLimit, IntervalLimitUnit } from "@calcom/types/Calendar"; - -export const ascendingLimitKeys: (keyof IntervalLimit)[] = ["PER_DAY", "PER_WEEK", "PER_MONTH", "PER_YEAR"]; - -export const descendingLimitKeys = [...ascendingLimitKeys].reverse(); - -/** - * Turns `PER_DAY` into `day`, `PER_WEEK` into `week` etc. - */ -export function intervalLimitKeyToUnit(key: keyof IntervalLimit) { - return key.split("_")[1].toLowerCase() as IntervalLimitUnit; -} diff --git a/packages/lib/intervalLimits/intervalLimit.ts b/packages/lib/intervalLimits/intervalLimit.ts new file mode 100644 index 0000000000..bae4e31092 --- /dev/null +++ b/packages/lib/intervalLimits/intervalLimit.ts @@ -0,0 +1,17 @@ +import type { IntervalLimitUnit, IntervalLimitKey } from "./intervalLimitSchema"; + +export const ascendingLimitKeys: IntervalLimitKey[] = ["PER_DAY", "PER_WEEK", "PER_MONTH", "PER_YEAR"]; + +export const descendingLimitKeys = [...ascendingLimitKeys].reverse(); + +function isIntervalLimitUnit(value: string): value is IntervalLimitUnit { + return ["day", "week", "month", "year"].includes(value); // Replace with actual values +} +/** + * Turns `PER_DAY` into `day`, `PER_WEEK` into `week` etc. + */ +export function intervalLimitKeyToUnit(key: IntervalLimitKey): IntervalLimitUnit { + const extracted = key.split("_")[1].toLowerCase(); + if (isIntervalLimitUnit(extracted)) return extracted; + throw new Error(`Invalid interval limit key: ${key}`); +} diff --git a/packages/lib/intervalLimits/intervalLimitSchema.ts b/packages/lib/intervalLimits/intervalLimitSchema.ts new file mode 100644 index 0000000000..48663caa08 --- /dev/null +++ b/packages/lib/intervalLimits/intervalLimitSchema.ts @@ -0,0 +1,14 @@ +import { z } from "zod"; + +export type IntervalLimitUnit = "day" | "week" | "month" | "year"; +export type IntervalLimit = Partial}`, number | undefined>>; +export type IntervalLimitKey = keyof IntervalLimit; + +export const intervalLimitsType: z.Schema = z + .object({ + PER_DAY: z.number().optional(), + PER_WEEK: z.number().optional(), + PER_MONTH: z.number().optional(), + PER_YEAR: z.number().optional(), + }) + .nullable(); diff --git a/packages/lib/isBookingLimits.ts b/packages/lib/intervalLimits/isBookingLimits.ts similarity index 72% rename from packages/lib/isBookingLimits.ts rename to packages/lib/intervalLimits/isBookingLimits.ts index 6e00d37773..535dede896 100644 --- a/packages/lib/isBookingLimits.ts +++ b/packages/lib/intervalLimits/isBookingLimits.ts @@ -1,5 +1,5 @@ -import { intervalLimitsType } from "@calcom/prisma/zod-utils"; -import type { IntervalLimit } from "@calcom/types/Calendar"; +import { intervalLimitsType } from "./intervalLimitSchema"; +import type { IntervalLimit } from "./intervalLimitSchema"; export function isBookingLimit(obj: unknown): obj is IntervalLimit { return intervalLimitsType.safeParse(obj).success; diff --git a/packages/lib/isDurationLimits.ts b/packages/lib/intervalLimits/isDurationLimits.ts similarity index 72% rename from packages/lib/isDurationLimits.ts rename to packages/lib/intervalLimits/isDurationLimits.ts index 74fb16c47a..9f4145fa73 100644 --- a/packages/lib/isDurationLimits.ts +++ b/packages/lib/intervalLimits/isDurationLimits.ts @@ -1,5 +1,5 @@ -import { intervalLimitsType } from "@calcom/prisma/zod-utils"; -import type { IntervalLimit } from "@calcom/types/Calendar"; +import type { IntervalLimit } from "./intervalLimitSchema"; +import { intervalLimitsType } from "./intervalLimitSchema"; export function isDurationLimit(obj: unknown): obj is IntervalLimit { return intervalLimitsType.safeParse(obj).success; diff --git a/packages/lib/bookingLimits/limitManager.ts b/packages/lib/intervalLimits/limitManager.ts similarity index 93% rename from packages/lib/bookingLimits/limitManager.ts rename to packages/lib/intervalLimits/limitManager.ts index 9f3840c580..bbff888d2b 100644 --- a/packages/lib/bookingLimits/limitManager.ts +++ b/packages/lib/intervalLimits/limitManager.ts @@ -1,5 +1,7 @@ import type { Dayjs } from "@calcom/dayjs"; -import type { EventBusyDate, IntervalLimitUnit } from "@calcom/types/Calendar"; +import type { EventBusyDate } from "@calcom/types/Calendar"; + +import type { IntervalLimitUnit } from "./intervalLimitSchema"; type BusyMapKey = `${IntervalLimitUnit}-${ReturnType}`; diff --git a/packages/lib/server/checkBookingLimits.ts b/packages/lib/intervalLimits/server/checkBookingLimits.ts similarity index 90% rename from packages/lib/server/checkBookingLimits.ts rename to packages/lib/intervalLimits/server/checkBookingLimits.ts index ff951d5ee6..c6c18011b8 100644 --- a/packages/lib/server/checkBookingLimits.ts +++ b/packages/lib/intervalLimits/server/checkBookingLimits.ts @@ -1,13 +1,13 @@ import dayjs from "@calcom/dayjs"; +import { getErrorFromUnknown } from "@calcom/lib/errors"; +import { HttpError } from "@calcom/lib/http-error"; +import { BookingRepository } from "@calcom/lib/server/repository/booking"; import prisma from "@calcom/prisma"; import { BookingStatus } from "@calcom/prisma/enums"; -import type { IntervalLimit } from "@calcom/types/Calendar"; -import { getErrorFromUnknown } from "../errors"; -import { HttpError } from "../http-error"; import { ascendingLimitKeys, intervalLimitKeyToUnit } from "../intervalLimit"; +import type { IntervalLimit, IntervalLimitKey } from "../intervalLimitSchema"; import { parseBookingLimit } from "../isBookingLimits"; -import { BookingRepository } from "./repository/booking"; export async function checkBookingLimits( bookingLimits: IntervalLimit, @@ -53,7 +53,7 @@ export async function checkBookingLimit({ }: { eventStartDate: Date; eventId?: number; - key: keyof IntervalLimit; + key: IntervalLimitKey; limitingNumber: number | undefined; rescheduleUid?: string | undefined; timeZone?: string | null; diff --git a/packages/lib/server/checkDurationLimits.ts b/packages/lib/intervalLimits/server/checkDurationLimits.ts similarity index 85% rename from packages/lib/server/checkDurationLimits.ts rename to packages/lib/intervalLimits/server/checkDurationLimits.ts index 89949b9b2d..3cf785f96d 100644 --- a/packages/lib/server/checkDurationLimits.ts +++ b/packages/lib/intervalLimits/server/checkDurationLimits.ts @@ -1,11 +1,11 @@ import dayjs from "@calcom/dayjs"; -import type { IntervalLimit } from "@calcom/types/Calendar"; +import { getErrorFromUnknown } from "@calcom/lib/errors"; +import { HttpError } from "@calcom/lib/http-error"; +import { getTotalBookingDuration } from "@calcom/lib/server/queries"; -import { getErrorFromUnknown } from "../errors"; -import { HttpError } from "../http-error"; import { ascendingLimitKeys, intervalLimitKeyToUnit } from "../intervalLimit"; +import type { IntervalLimit, IntervalLimitKey } from "../intervalLimitSchema"; import { parseDurationLimit } from "../isDurationLimits"; -import { getTotalBookingDuration } from "./queries"; export async function checkDurationLimits( durationLimits: IntervalLimit, @@ -43,7 +43,7 @@ export async function checkDurationLimit({ }: { eventStartDate: Date; eventId: number; - key: keyof IntervalLimit; + key: IntervalLimitKey; limitingNumber: number | undefined; rescheduleUid?: string; }) { diff --git a/packages/lib/bookingLimits/getBusyTimesFromLimits.ts b/packages/lib/intervalLimits/server/getBusyTimesFromLimits.ts similarity index 93% rename from packages/lib/bookingLimits/getBusyTimesFromLimits.ts rename to packages/lib/intervalLimits/server/getBusyTimesFromLimits.ts index 39c0e6cb49..fa7d011c6b 100644 --- a/packages/lib/bookingLimits/getBusyTimesFromLimits.ts +++ b/packages/lib/intervalLimits/server/getBusyTimesFromLimits.ts @@ -1,17 +1,18 @@ import type { Dayjs } from "@calcom/dayjs"; import dayjs from "@calcom/dayjs"; -import { descendingLimitKeys, intervalLimitKeyToUnit } from "@calcom/lib/intervalLimit"; -import { checkBookingLimit } from "@calcom/lib/server/checkBookingLimits"; +import { getStartEndDateforLimitCheck } from "@calcom/lib/getBusyTimes"; +import type { EventType } from "@calcom/lib/getUserAvailability"; +import { getPeriodStartDatesBetween } from "@calcom/lib/getUserAvailability"; +import monitorCallbackAsync from "@calcom/lib/sentryWrapper"; import { performance } from "@calcom/lib/server/perfObserver"; import { getTotalBookingDuration } from "@calcom/lib/server/queries"; import { BookingRepository } from "@calcom/lib/server/repository/booking"; -import type { EventBusyDetails, IntervalLimit } from "@calcom/types/Calendar"; +import type { EventBusyDetails } from "@calcom/types/Calendar"; -import { getStartEndDateforLimitCheck } from "../getBusyTimes"; -import type { EventType } from "../getUserAvailability"; -import { getPeriodStartDatesBetween } from "../getUserAvailability"; -import monitorCallbackAsync from "../sentryWrapper"; -import LimitManager from "./limitManager"; +import { descendingLimitKeys, intervalLimitKeyToUnit } from "../intervalLimit"; +import type { IntervalLimit } from "../intervalLimitSchema"; +import LimitManager from "../limitManager"; +import { checkBookingLimit } from "./checkBookingLimits"; export const getBusyTimesFromLimits = async ( ...args: Parameters diff --git a/packages/lib/validateIntervalLimitOrder.ts b/packages/lib/intervalLimits/validateIntervalLimitOrder.ts similarity index 88% rename from packages/lib/validateIntervalLimitOrder.ts rename to packages/lib/intervalLimits/validateIntervalLimitOrder.ts index ee92f3b054..f38fbb57bc 100644 --- a/packages/lib/validateIntervalLimitOrder.ts +++ b/packages/lib/intervalLimits/validateIntervalLimitOrder.ts @@ -1,6 +1,5 @@ -import type { IntervalLimit } from "@calcom/types/Calendar"; - import { ascendingLimitKeys } from "./intervalLimit"; +import type { IntervalLimit } from "./intervalLimitSchema"; export const validateIntervalLimitOrder = (input: IntervalLimit) => { // Sort limits by validationOrder diff --git a/packages/lib/server/index.ts b/packages/lib/server/index.ts index 8b614d75fd..af79762b4e 100644 --- a/packages/lib/server/index.ts +++ b/packages/lib/server/index.ts @@ -1,5 +1,3 @@ -export { checkBookingLimits, checkBookingLimit } from "./checkBookingLimits"; -export { checkDurationLimits, checkDurationLimit } from "./checkDurationLimits"; export { defaultHandler } from "./defaultHandler"; export { defaultResponder } from "./defaultResponder"; export { getLuckyUser } from "./getLuckyUser"; diff --git a/packages/lib/server/queries/teams/index.ts b/packages/lib/server/queries/teams/index.ts index 042ac2a78c..1bbbf02afe 100644 --- a/packages/lib/server/queries/teams/index.ts +++ b/packages/lib/server/queries/teams/index.ts @@ -1,7 +1,7 @@ import { Prisma } from "@prisma/client"; import { getAppFromSlug } from "@calcom/app-store/utils"; -import { parseBookingLimit } from "@calcom/lib"; +import { parseBookingLimit } from "@calcom/lib/intervalLimits/isBookingLimits"; import prisma, { baseEventTypeSelect } from "@calcom/prisma"; import type { Team } from "@calcom/prisma/client"; import { SchedulingType } from "@calcom/prisma/enums"; diff --git a/packages/platform/atoms/event-types/hooks/useEventTypeForm.ts b/packages/platform/atoms/event-types/hooks/useEventTypeForm.ts index 5fe6106e8c..eb5635fbdb 100644 --- a/packages/platform/atoms/event-types/hooks/useEventTypeForm.ts +++ b/packages/platform/atoms/event-types/hooks/useEventTypeForm.ts @@ -15,10 +15,10 @@ import type { EventTypeSetupProps, EventTypeUpdateInput, } from "@calcom/features/eventtypes/lib/types"; -import { validateIntervalLimitOrder } from "@calcom/lib"; import { validateCustomEventName } from "@calcom/lib/event"; import { locationsResolver } from "@calcom/lib/event-types/utils/locationsResolver"; import { useLocale } from "@calcom/lib/hooks/useLocale"; +import { validateIntervalLimitOrder } from "@calcom/lib/intervalLimits/validateIntervalLimitOrder"; import { validateBookerLayouts } from "@calcom/lib/validateBookerLayouts"; import { eventTypeBookingFields as eventTypeBookingFieldsSchema } from "@calcom/prisma/zod-utils"; diff --git a/packages/prisma/zod-utils.ts b/packages/prisma/zod-utils.ts index 05105ac930..45b93c2ef5 100644 --- a/packages/prisma/zod-utils.ts +++ b/packages/prisma/zod-utils.ts @@ -20,6 +20,7 @@ import type { FieldType as FormBuilderFieldType } from "@calcom/features/form-bu import { fieldsSchema as formBuilderFieldsSchema } from "@calcom/features/form-builder/schema"; import { isSupportedTimeZone } from "@calcom/lib/date-fns"; import { emailSchema as emailRegexSchema, emailRegex } from "@calcom/lib/emailSchema"; +import type { IntervalLimit } from "@calcom/lib/intervalLimits/intervalLimitSchema"; import { zodAttributesQueryValue } from "@calcom/lib/raqb/zod"; import { slugify } from "@calcom/lib/slugify"; import { EventTypeCustomInputType } from "@calcom/prisma/enums"; @@ -212,14 +213,9 @@ export const eventTypeColor = z }) .nullable(); -export const intervalLimitsType = z - .object({ - PER_DAY: z.number().optional(), - PER_WEEK: z.number().optional(), - PER_MONTH: z.number().optional(), - PER_YEAR: z.number().optional(), - }) - .nullable(); +export type IntervalLimitsType = IntervalLimit | null; + +export { intervalLimitsType } from "@calcom/lib/intervalLimits/intervalLimitSchema"; export const eventTypeSlug = z.string().transform((val) => slugify(val.trim())); diff --git a/packages/trpc/server/routers/viewer/eventTypes/update.handler.ts b/packages/trpc/server/routers/viewer/eventTypes/update.handler.ts index 84eaa77217..2237dc9797 100644 --- a/packages/trpc/server/routers/viewer/eventTypes/update.handler.ts +++ b/packages/trpc/server/routers/viewer/eventTypes/update.handler.ts @@ -8,7 +8,7 @@ import { allowDisablingHostConfirmationEmails, } from "@calcom/features/ee/workflows/lib/allowDisablingStandardEmails"; import tasker from "@calcom/features/tasker"; -import { validateIntervalLimitOrder } from "@calcom/lib"; +import { validateIntervalLimitOrder } from "@calcom/lib/intervalLimits/validateIntervalLimitOrder"; import logger from "@calcom/lib/logger"; import { getTranslation } from "@calcom/lib/server/i18n"; import { validateBookerLayouts } from "@calcom/lib/validateBookerLayouts"; diff --git a/packages/trpc/server/routers/viewer/slots/util.ts b/packages/trpc/server/routers/viewer/slots/util.ts index 808ef4300b..9af48a754c 100644 --- a/packages/trpc/server/routers/viewer/slots/util.ts +++ b/packages/trpc/server/routers/viewer/slots/util.ts @@ -9,7 +9,6 @@ import { getSlugOrRequestedSlug, orgDomainConfig } from "@calcom/ee/organization import { checkForConflicts } from "@calcom/features/bookings/lib/conflictChecker/checkForConflicts"; import { isEventTypeLoggingEnabled } from "@calcom/features/bookings/lib/isEventTypeLoggingEnabled"; import { getShouldServeCache } from "@calcom/features/calendar-cache/lib/getShouldServeCache"; -import { parseBookingLimit, parseDurationLimit } from "@calcom/lib"; import { findQualifiedHostsWithDelegationCredentials } from "@calcom/lib/bookings/findQualifiedHostsWithDelegationCredentials"; import { shouldIgnoreContactOwner } from "@calcom/lib/bookings/routing/utils"; import { RESERVED_SUBDOMAINS } from "@calcom/lib/constants"; @@ -19,6 +18,8 @@ import { getAggregatedAvailability } from "@calcom/lib/getAggregatedAvailability import { getBusyTimesForLimitChecks } from "@calcom/lib/getBusyTimes"; import type { CurrentSeats, GetAvailabilityUser, IFromUser, IToUser } from "@calcom/lib/getUserAvailability"; import { getUsersAvailability } from "@calcom/lib/getUserAvailability"; +import { parseBookingLimit } from "@calcom/lib/intervalLimits/isBookingLimits"; +import { parseDurationLimit } from "@calcom/lib/intervalLimits/isDurationLimits"; import { calculatePeriodLimits, isTimeOutOfBounds, diff --git a/packages/trpc/server/routers/viewer/teams/update.handler.ts b/packages/trpc/server/routers/viewer/teams/update.handler.ts index 2de09bfb46..48c182985d 100644 --- a/packages/trpc/server/routers/viewer/teams/update.handler.ts +++ b/packages/trpc/server/routers/viewer/teams/update.handler.ts @@ -1,14 +1,14 @@ import type { Prisma } from "@prisma/client"; import { getOrgFullOrigin } from "@calcom/ee/organizations/lib/orgDomains"; -import { validateIntervalLimitOrder } from "@calcom/lib"; import { IS_TEAM_BILLING_ENABLED } from "@calcom/lib/constants"; +import type { IntervalLimit } from "@calcom/lib/intervalLimits/intervalLimitSchema"; +import { validateIntervalLimitOrder } from "@calcom/lib/intervalLimits/validateIntervalLimitOrder"; import { uploadLogo } from "@calcom/lib/server/avatar"; import { isTeamAdmin } from "@calcom/lib/server/queries/teams"; import { prisma } from "@calcom/prisma"; import { RedirectType } from "@calcom/prisma/enums"; import { teamMetadataSchema } from "@calcom/prisma/zod-utils"; -import type { IntervalLimit } from "@calcom/types/Calendar"; import { TRPCError } from "@trpc/server"; diff --git a/packages/trpc/server/routers/viewer/teams/update.schema.ts b/packages/trpc/server/routers/viewer/teams/update.schema.ts index d894e113c2..9807a9a064 100644 --- a/packages/trpc/server/routers/viewer/teams/update.schema.ts +++ b/packages/trpc/server/routers/viewer/teams/update.schema.ts @@ -1,8 +1,8 @@ import { z } from "zod"; +import { intervalLimitsType } from "@calcom/lib/intervalLimits/intervalLimitSchema"; import { resizeBase64Image } from "@calcom/lib/server/resizeBase64Image"; import slugify from "@calcom/lib/slugify"; -import { intervalLimitsType } from "@calcom/prisma/zod-utils"; export const ZUpdateInputSchema = z.object({ id: z.number(), diff --git a/packages/types/Calendar.d.ts b/packages/types/Calendar.d.ts index be31614fa0..a7dfc7a797 100644 --- a/packages/types/Calendar.d.ts +++ b/packages/types/Calendar.d.ts @@ -8,13 +8,13 @@ import type { import type { Dayjs } from "dayjs"; import type { Time } from "ical.js"; import type { TFunction } from "next-i18next"; +import type { Frequency } from "rrule"; import type z from "zod"; import type { bookingResponse } from "@calcom/features/bookings/lib/getBookingResponsesSchema"; import type { Calendar } from "@calcom/features/calendars/weeklyview"; import type { TimeFormat } from "@calcom/lib/timeFormat"; import type { SchedulingType } from "@calcom/prisma/enums"; -import type { Frequency } from "@calcom/prisma/zod-utils"; import type { CredentialForCalendarService } from "@calcom/types/Credential"; import type { Ensure } from "./utils"; @@ -135,9 +135,7 @@ export interface RecurringEvent { tzid?: string | undefined; } -export type IntervalLimitUnit = "day" | "week" | "month" | "year"; - -export type IntervalLimit = Partial}`, number | undefined>>; +export type { IntervalLimit, IntervalLimitUnit } from "@calcom/lib/intervalLimits/intervalLimitSchema"; export type AppsStatus = { appName: string;