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>
This commit is contained in:
Omar López
2025-08-06 06:10:38 +00:00
committed by GitHub
co-authored by Devin AI
parent 124fd8ebca
commit badd0de33c
5 changed files with 36 additions and 30 deletions
+1 -1
View File
@@ -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": "*",
+3 -18
View File
@@ -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"
);
@@ -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;
@@ -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");
+5 -5
View File
@@ -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