1 parent
cb29c7d2c4
commit
7aecc6f96e
32 files changed
+532
-25
No files matched your search
@@ -0,0 +1,33 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user