Aritmetica ferestrei care traverseaza miezul noptii era netestata si prinsa intr-o metoda privata. Extrasa in quiet-hours.ts cu 10 teste care acopera fereastra simpla, traversarea miezului noptii si politica de bypass CRITICAL. Documenteaza explicit ca agregarea nu reevalueaza quiet hours: incrementarea unui contor pe o notificare deja vizibila nu e o intrerupere noua.
38 lines
1.3 KiB
TypeScript
38 lines
1.3 KiB
TypeScript
import type { Severity } from './notification-rules';
|
|
|
|
/**
|
|
* Calculeaza cand se poate livra o notificare data fiind fereastra de liniste
|
|
* a userului. Intoarce null cand se poate livra imediat.
|
|
*
|
|
* Functie pura, separata de runner, ca sa fie testabila: aritmetica de ore cu
|
|
* fereastra care traverseaza miezul noptii e locul unde apar erorile.
|
|
*/
|
|
export function quietHoursDelay(params: {
|
|
start: number | null;
|
|
end: number | null;
|
|
severity: Severity;
|
|
criticalBypasses: boolean;
|
|
now?: Date;
|
|
}): Date | null {
|
|
const { start, end, severity, criticalBypasses } = params;
|
|
const now = params.now ?? new Date();
|
|
|
|
// start === end ar insemna fereastra de 24h sau de 0h -- ambiguu, deci o
|
|
// tratam ca "fara quiet hours" in loc sa ghicim.
|
|
if (start === null || end === null || start === end) return null;
|
|
if (severity === 'CRITICAL' && criticalBypasses) return null;
|
|
|
|
const hour = now.getUTCHours();
|
|
const crossesMidnight = start > end;
|
|
const inQuiet = crossesMidnight ? hour >= start || hour < end : hour >= start && hour < end;
|
|
if (!inQuiet) return null;
|
|
|
|
const deliverAt = new Date(now);
|
|
deliverAt.setUTCMinutes(0, 0, 0);
|
|
// Daca ora curenta e deja peste ora de sfarsit, sfarsitul ferestrei e maine.
|
|
if (hour >= end) {
|
|
deliverAt.setUTCDate(deliverAt.getUTCDate() + 1);
|
|
}
|
|
deliverAt.setUTCHours(end);
|
|
return deliverAt;
|
|
}
|