Files
ulitka/src/modules/issue/domain/value-objects/calendar-range.vo.ts
T
vadim 7aecc6f96e
Gitea Actions Demo / Deploy (push) Successful in 31s
calendar due date
2026-10-12 11:08:27 +03:00

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);
}
}