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:
co-authored by
Claude Opus 5
parent
b622c1bb28
commit
047a4a1c74
+30
-1
@@ -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)
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user