34 lines
1.4 KiB
TypeScript
34 lines
1.4 KiB
TypeScript
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);
|
|
}
|
|
}
|