* add booking booking to team settings * add update mutation * add missing export * fix dirty state * first version of global team limits in getUserAvailability * add test setup * create seperate test file for global limits * add tests for all units * move limitManager and booking limit functions outside of getUserAvailability * add migration * clean up code * move yearly booking count to booking repository * code clean up * don't count rescheduling booking * add test for getSchedule * fix type error * fix type error * fix type error * fix from and end date for fetching bookings * reuse functions * allow null for bookingLimits * remove bookings from managed event type * fix type error * code clean up * small fixes form clean up * fix type issue * same fixes in teams/_post * fix existing tz issue * tests for fix * adds missingn await * imrove description * remove spreading * fix reschedule issue with booking limits * fix reschedule error with booking durations * remove useeffect * undo commit * add bookingLimits to UpdateOrgTeamDto * fix unit tests * Prepare view for app router migration * throw error if not in ascending order * fix disabled update button --------- Co-authored-by: CarinaWolli <wollencarina@gmail.com> Co-authored-by: Joe Au-Yeung <j.auyeung419@gmail.com> Co-authored-by: Joe Au-Yeung <65426560+joeauyeung@users.noreply.github.com>
73 lines
1.8 KiB
TypeScript
73 lines
1.8 KiB
TypeScript
import dayjs from "@calcom/dayjs";
|
|
import type { IntervalLimit } from "@calcom/types/Calendar";
|
|
|
|
import { getErrorFromUnknown } from "../errors";
|
|
import { HttpError } from "../http-error";
|
|
import { ascendingLimitKeys, intervalLimitKeyToUnit } from "../intervalLimit";
|
|
import { parseDurationLimit } from "../isDurationLimits";
|
|
import { getTotalBookingDuration } from "./queries";
|
|
|
|
export async function checkDurationLimits(
|
|
durationLimits: IntervalLimit,
|
|
eventStartDate: Date,
|
|
eventId: number,
|
|
rescheduleUid?: string
|
|
) {
|
|
const parsedDurationLimits = parseDurationLimit(durationLimits);
|
|
if (!parsedDurationLimits) return false;
|
|
|
|
// not iterating entries to preserve types
|
|
const limitCalculations = ascendingLimitKeys.map((key) =>
|
|
checkDurationLimit({
|
|
key,
|
|
limitingNumber: parsedDurationLimits[key],
|
|
eventStartDate,
|
|
eventId,
|
|
rescheduleUid,
|
|
})
|
|
);
|
|
|
|
try {
|
|
return !!(await Promise.all(limitCalculations));
|
|
} catch (error) {
|
|
throw new HttpError({ message: getErrorFromUnknown(error).message, statusCode: 401 });
|
|
}
|
|
}
|
|
|
|
export async function checkDurationLimit({
|
|
eventStartDate,
|
|
eventId,
|
|
key,
|
|
limitingNumber,
|
|
rescheduleUid,
|
|
}: {
|
|
eventStartDate: Date;
|
|
eventId: number;
|
|
key: keyof IntervalLimit;
|
|
limitingNumber: number | undefined;
|
|
rescheduleUid?: string;
|
|
}) {
|
|
{
|
|
if (!limitingNumber) return;
|
|
|
|
const unit = intervalLimitKeyToUnit(key);
|
|
|
|
const startDate = dayjs(eventStartDate).startOf(unit).toDate();
|
|
const endDate = dayjs(eventStartDate).endOf(unit).toDate();
|
|
|
|
const totalBookingDuration = await getTotalBookingDuration({
|
|
eventId,
|
|
startDate,
|
|
endDate,
|
|
rescheduleUid,
|
|
});
|
|
|
|
if (totalBookingDuration < limitingNumber) return;
|
|
|
|
throw new HttpError({
|
|
message: `duration_limit_reached`,
|
|
statusCode: 403,
|
|
});
|
|
}
|
|
}
|