58 lines
1.6 KiB
TypeScript
58 lines
1.6 KiB
TypeScript
import { EventType, PeriodType } from "@prisma/client";
|
|
|
|
import dayjs from "@calcom/dayjs";
|
|
|
|
export class BookingDateInPastError extends Error {
|
|
constructor(message = "Attempting to book a meeting in the past.") {
|
|
super(message);
|
|
}
|
|
}
|
|
|
|
function guardAgainstBookingInThePast(date: Date) {
|
|
if (date >= new Date()) {
|
|
// Date is in the future.
|
|
return;
|
|
}
|
|
throw new BookingDateInPastError();
|
|
}
|
|
|
|
function isOutOfBounds(
|
|
time: dayjs.ConfigType,
|
|
{
|
|
periodType,
|
|
periodDays,
|
|
periodCountCalendarDays,
|
|
periodStartDate,
|
|
periodEndDate,
|
|
}: Pick<
|
|
EventType,
|
|
"periodType" | "periodDays" | "periodCountCalendarDays" | "periodStartDate" | "periodEndDate"
|
|
>
|
|
) {
|
|
const date = dayjs(time);
|
|
guardAgainstBookingInThePast(date.toDate());
|
|
|
|
periodDays = periodDays || 0;
|
|
|
|
switch (periodType) {
|
|
case PeriodType.ROLLING: {
|
|
const periodRollingEndDay = periodCountCalendarDays
|
|
? dayjs().utcOffset(date.utcOffset()).add(periodDays, "days").endOf("day")
|
|
: dayjs().utcOffset(date.utcOffset()).businessDaysAdd(periodDays).endOf("day");
|
|
return date.endOf("day").isAfter(periodRollingEndDay);
|
|
}
|
|
|
|
case PeriodType.RANGE: {
|
|
const periodRangeStartDay = dayjs(periodStartDate).utcOffset(date.utcOffset()).endOf("day");
|
|
const periodRangeEndDay = dayjs(periodEndDate).utcOffset(date.utcOffset()).endOf("day");
|
|
return date.endOf("day").isBefore(periodRangeStartDay) || date.endOf("day").isAfter(periodRangeEndDay);
|
|
}
|
|
|
|
case PeriodType.UNLIMITED:
|
|
default:
|
|
return false;
|
|
}
|
|
}
|
|
|
|
export default isOutOfBounds;
|