import { InvalidCalendarRangeException } from '../exceptions/invalid-calendar-range.exception.js'; const DAY_MS = 24 * 60 * 60 * 1000; /** * Диапазон календаря по dueDate — полуоткрытый интервал [from, to). * Границы — моменты времени: клиент сам считает начало/конец видимой сетки * в своём часовом поясе, сервер про месяцы и часовые пояса не знает. */ export class CalendarRange { /** Сетка месяца — 6 недель (42 дня), плюс запас на переход на летнее/зимнее время */ static readonly MAX_DAYS = 45; private constructor( public readonly from: Date, public readonly to: Date, ) {} static create(params: { from: Date; to: Date }): CalendarRange { const { from, to } = params; if (Number.isNaN(from.getTime()) || Number.isNaN(to.getTime())) { throw new InvalidCalendarRangeException('Некорректная дата from или to'); } if (from >= to) { throw new InvalidCalendarRangeException('Дата from должна быть раньше даты to'); } if (to.getTime() - from.getTime() > CalendarRange.MAX_DAYS * DAY_MS) { throw new InvalidCalendarRangeException(`Диапазон больше ${CalendarRange.MAX_DAYS} дней`); } return new CalendarRange(from, to); } }