From badd0de33c27e15c2f5d5e8593f5be7a64d6f0fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Omar=20L=C3=B3pez?= Date: Tue, 5 Aug 2025 23:10:38 -0700 Subject: [PATCH] fix: resolve circular dependency in getUserAvailability by extracting getPeriodStartDatesBetween utility (#22913) Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- apps/api/v2/package.json | 2 +- packages/lib/getUserAvailability.ts | 21 +++------------- .../server/getBusyTimesFromLimits.ts | 9 +++---- .../utils/getPeriodStartDatesBetween.ts | 24 +++++++++++++++++++ yarn.lock | 10 ++++---- 5 files changed, 36 insertions(+), 30 deletions(-) create mode 100644 packages/lib/intervalLimits/utils/getPeriodStartDatesBetween.ts diff --git a/apps/api/v2/package.json b/apps/api/v2/package.json index a155065e20..05a2a28eda 100644 --- a/apps/api/v2/package.json +++ b/apps/api/v2/package.json @@ -38,7 +38,7 @@ "@axiomhq/winston": "^1.2.0", "@calcom/platform-constants": "*", "@calcom/platform-enums": "*", - "@calcom/platform-libraries": "npm:@calcom/platform-libraries@0.0.286", + "@calcom/platform-libraries": "npm:@calcom/platform-libraries@0.0.287", "@calcom/platform-types": "*", "@calcom/platform-utils": "*", "@calcom/prisma": "*", diff --git a/packages/lib/getUserAvailability.ts b/packages/lib/getUserAvailability.ts index 45adb4dbf5..79ee8d26c9 100644 --- a/packages/lib/getUserAvailability.ts +++ b/packages/lib/getUserAvailability.ts @@ -37,6 +37,7 @@ import type { EventBusyDetails, IntervalLimitUnit } from "@calcom/types/Calendar import type { TimeRange } from "@calcom/types/schedule"; import { getBusyTimes } from "./getBusyTimes"; +import { getPeriodStartDatesBetween as getPeriodStartDatesBetweenUtil } from "./intervalLimits/utils/getPeriodStartDatesBetween"; import { withReporting } from "./sentryWrapper"; const log = logger.getSubLogger({ prefix: ["getUserAvailability"] }); @@ -595,25 +596,9 @@ export class UserAvailabilityService { getUserAvailability = withReporting(this._getUserAvailability.bind(this), "getUserAvailability"); - _getPeriodStartDatesBetween( - dateFrom: Dayjs, - dateTo: Dayjs, - period: IntervalLimitUnit, - timeZone?: string - ): Dayjs[] { - const dates = []; - let startDate = timeZone ? dayjs(dateFrom).tz(timeZone).startOf(period) : dayjs(dateFrom).startOf(period); - const endDate = timeZone ? dayjs(dateTo).tz(timeZone).endOf(period) : dayjs(dateTo).endOf(period); - - while (startDate.isBefore(endDate)) { - dates.push(startDate); - startDate = startDate.add(1, period); - } - return dates; - } - getPeriodStartDatesBetween = withReporting( - this._getPeriodStartDatesBetween.bind(this), + (dateFrom: Dayjs, dateTo: Dayjs, period: IntervalLimitUnit, timeZone?: string) => + getPeriodStartDatesBetweenUtil(dateFrom, dateTo, period, timeZone), "getPeriodStartDatesBetween" ); diff --git a/packages/lib/intervalLimits/server/getBusyTimesFromLimits.ts b/packages/lib/intervalLimits/server/getBusyTimesFromLimits.ts index eb687ec8c8..03575149dc 100644 --- a/packages/lib/intervalLimits/server/getBusyTimesFromLimits.ts +++ b/packages/lib/intervalLimits/server/getBusyTimesFromLimits.ts @@ -1,9 +1,9 @@ import type { Dayjs } from "@calcom/dayjs"; import dayjs from "@calcom/dayjs"; import { getCheckBookingLimitsService } from "@calcom/lib/di/containers/booking-limits"; -import { getUserAvailabilityService } from "@calcom/lib/di/containers/get-user-availability"; import { getStartEndDateforLimitCheck } from "@calcom/lib/getBusyTimes"; import type { EventType } from "@calcom/lib/getUserAvailability"; +import { getPeriodStartDatesBetween } from "@calcom/lib/intervalLimits/utils/getPeriodStartDatesBetween"; import { withReporting } from "@calcom/lib/sentryWrapper"; import { performance } from "@calcom/lib/server/perfObserver"; import { getTotalBookingDuration } from "@calcom/lib/server/queries/booking"; @@ -86,7 +86,6 @@ const _getBusyTimesFromBookingLimits = async (params: { includeManagedEvents?: boolean; timeZone?: string | null; }) => { - const userAvailabilityService = getUserAvailabilityService(); const { bookings, bookingLimits, @@ -106,7 +105,7 @@ const _getBusyTimesFromBookingLimits = async (params: { if (!limit) continue; const unit = intervalLimitKeyToUnit(key); - const periodStartDates = userAvailabilityService.getPeriodStartDatesBetween(dateFrom, dateTo, unit); + const periodStartDates = getPeriodStartDatesBetween(dateFrom, dateTo, unit); for (const periodStart of periodStartDates) { if (limitManager.isAlreadyBusy(periodStart, unit)) continue; @@ -163,14 +162,12 @@ const _getBusyTimesFromDurationLimits = async ( timeZone: string, rescheduleUid?: string ) => { - const userAvailabilityService = getUserAvailabilityService(); - for (const key of descendingLimitKeys) { const limit = durationLimits?.[key]; if (!limit) continue; const unit = intervalLimitKeyToUnit(key); - const periodStartDates = userAvailabilityService.getPeriodStartDatesBetween(dateFrom, dateTo, unit); + const periodStartDates = getPeriodStartDatesBetween(dateFrom, dateTo, unit); for (const periodStart of periodStartDates) { if (limitManager.isAlreadyBusy(periodStart, unit)) continue; diff --git a/packages/lib/intervalLimits/utils/getPeriodStartDatesBetween.ts b/packages/lib/intervalLimits/utils/getPeriodStartDatesBetween.ts new file mode 100644 index 0000000000..9c60a8bf89 --- /dev/null +++ b/packages/lib/intervalLimits/utils/getPeriodStartDatesBetween.ts @@ -0,0 +1,24 @@ +import type { Dayjs } from "@calcom/dayjs"; +import dayjs from "@calcom/dayjs"; +import { withReporting } from "@calcom/lib/sentryWrapper"; + +import type { IntervalLimitUnit } from "../intervalLimitSchema"; + +function _getPeriodStartDatesBetween( + dateFrom: Dayjs, + dateTo: Dayjs, + period: IntervalLimitUnit, + timeZone?: string +): Dayjs[] { + const dates = []; + let startDate = timeZone ? dayjs(dateFrom).tz(timeZone).startOf(period) : dayjs(dateFrom).startOf(period); + const endDate = timeZone ? dayjs(dateTo).tz(timeZone).endOf(period) : dayjs(dateTo).endOf(period); + + while (startDate.isBefore(endDate)) { + dates.push(startDate); + startDate = startDate.add(1, period); + } + return dates; +} + +export const getPeriodStartDatesBetween = withReporting(_getPeriodStartDatesBetween, "getPeriodStartDatesBetween"); diff --git a/yarn.lock b/yarn.lock index 3d0d207eaf..c08123cee0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2500,7 +2500,7 @@ __metadata: "@axiomhq/winston": ^1.2.0 "@calcom/platform-constants": "*" "@calcom/platform-enums": "*" - "@calcom/platform-libraries": "npm:@calcom/platform-libraries@0.0.286" + "@calcom/platform-libraries": "npm:@calcom/platform-libraries@0.0.287" "@calcom/platform-types": "*" "@calcom/platform-utils": "*" "@calcom/prisma": "*" @@ -3556,13 +3556,13 @@ __metadata: languageName: unknown linkType: soft -"@calcom/platform-libraries@npm:@calcom/platform-libraries@0.0.286": - version: 0.0.286 - resolution: "@calcom/platform-libraries@npm:0.0.286" +"@calcom/platform-libraries@npm:@calcom/platform-libraries@0.0.287": + version: 0.0.287 + resolution: "@calcom/platform-libraries@npm:0.0.287" dependencies: "@calcom/features": "*" "@calcom/lib": "*" - checksum: b6402b589456fdc7f0aa86368e75dfcab4ec2c9c813c6bd30efcb7b2c58634441908856a9893788055ca5a71b655a9632ed9f559af7d23bd59293924adcbfe4d + checksum: 098a50e1b20f70c0f67a332d5f4f6a13c9aaf03f0c0ac9c9ffe1b74c06c607e6650bc0f08bdc1a9bdd89fa25461c0e153580305b845620a1506b23150334c5bd languageName: node linkType: hard