feat: Meldungen alle zehn Minuten pruefen und verschicken

Der Takt passt zu den Toleranzfenstern: ein Anlass in einem
Viertelstundenfenster wird sicher getroffen, dank Sperre aber nur einmal
gemeldet. Eine Erinnerung kommt damit hoechstens ein paar Minuten frueher
als gewollt, nie spaeter.

Der Kalenderabgleich zaehlt seine Fehlversuche jetzt mit und setzt den
Zaehler bei Erfolg zurueck.

Alte Nachweise raeumt der naechtliche Lauf weg.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Florian Wilde
2026-09-11 09:00:00 +02:00
co-authored by Claude Opus 5
parent b622c1bb28
commit 047a4a1c74
2 changed files with 36 additions and 2 deletions
+30 -1
View File
@@ -3,6 +3,10 @@ import cron from 'node-cron'
import { db } from '@/server/db' import { db } from '@/server/db'
import { abgleichFenster, kontoAbgleichen } from '@/server/kalender/abgleich' import { abgleichFenster, kontoAbgleichen } from '@/server/kalender/abgleich'
import { abgelaufeneChallengesEntfernen } from '@/server/auth/passkey' import { abgelaufeneChallengesEntfernen } from '@/server/auth/passkey'
import {
alteNachweiseEntfernen,
benachrichtigungenVerschicken,
} from '@/server/benachrichtigung/versand'
import { jetzt } from '@/server/zeitgeber' import { jetzt } from '@/server/zeitgeber'
/** /**
@@ -19,6 +23,14 @@ const globalerBereich = globalThis as unknown as { planerJobs?: boolean }
const ABGLEICH_PLAN = '*/15 * * * *' const ABGLEICH_PLAN = '*/15 * * * *'
/** Einmal nachts aufräumen. */ /** Einmal nachts aufräumen. */
const AUFRAEUM_PLAN = '17 3 * * *' const AUFRAEUM_PLAN = '17 3 * * *'
/**
* Alle zehn Minuten nachsehen, ob etwas zu melden ist.
*
* Der Takt passt zu den Toleranzfenstern in src/lib/benachrichtigung.ts: Ein
* Anlass, der in einem 15-Minuten-Fenster liegt, wird sicher getroffen, aber
* dank Wiederholungssperre nur einmal gemeldet.
*/
const MELDUNGS_PLAN = '*/10 * * * *'
async function alleKontenAbgleichen(): Promise<void> { async function alleKontenAbgleichen(): Promise<void> {
const zeitpunkt = jetzt() const zeitpunkt = jetzt()
@@ -62,8 +74,25 @@ export function jobsStarten(): void {
}) })
}) })
cron.schedule(MELDUNGS_PLAN, () => {
void benachrichtigungenVerschicken()
.then((bericht) => {
// Nur Zahlen, nie Empfänger oder Inhalte.
if (bericht.gesendet > 0) {
console.warn(`Benachrichtigungen: ${bericht.gesendet} verschickt.`)
}
})
.catch((fehler: unknown) => {
console.error('Benachrichtigungen abgebrochen:', fehler)
})
})
cron.schedule(AUFRAEUM_PLAN, () => { cron.schedule(AUFRAEUM_PLAN, () => {
void Promise.all([alteTermineEntfernen(), abgelaufeneChallengesEntfernen(jetzt())]) void Promise.all([
alteTermineEntfernen(),
abgelaufeneChallengesEntfernen(jetzt()),
alteNachweiseEntfernen(jetzt()),
])
.then(() => undefined) .then(() => undefined)
.catch((fehler: unknown) => { .catch((fehler: unknown) => {
console.error('Aufräumen abgebrochen:', fehler) console.error('Aufräumen abgebrochen:', fehler)
+6 -1
View File
@@ -339,6 +339,7 @@ export async function kontoAbgleichen(
...(neuerVerweis ? { deltaVerweis: neuerVerweis } : {}), ...(neuerVerweis ? { deltaVerweis: neuerVerweis } : {}),
letzterAbgleich: zeitpunkt, letzterAbgleich: zeitpunkt,
letzterFehler: null, letzterFehler: null,
fehlversuche: 0,
}, },
}) })
@@ -355,7 +356,11 @@ export async function kontoAbgleichen(
await db.kalenderkonto.update({ await db.kalenderkonto.update({
where: { id: konto.id }, where: { id: konto.id },
data: { letzterAbgleich: zeitpunkt, letzterFehler: meldung }, data: {
letzterAbgleich: zeitpunkt,
letzterFehler: meldung,
fehlversuche: { increment: 1 },
},
}) })
return { return {