Befunde aus dem Sicherheits-Review: - Anhalten, Beenden und Abgleich der Ratenpläne fangen Fehler je Buchung ab. Ein Stripe-Fehler bei einer Buchung bricht nicht mehr den ganzen Worker-Lauf ab (E-Mails, Reservierungen liefen sonst nicht weiter). Teilfehler setzen den Exit-Code 1, damit der CronJob-Lauf sichtbar fehlschlägt. - Beim Beenden eines Plans werden neben offenen Rechnungen auch Entwürfe gelöscht. Laut Stripe-Testuhr bleibt ein Entwurf nach dem Beenden zwar liegen und wird nicht eingezogen; das Löschen schließt das aus. Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
39 lines
1.4 KiB
TypeScript
39 lines
1.4 KiB
TypeScript
/**
|
|
* Hintergrundlauf fuer Reservierungen, Folgeraten, Zahlungsmethoden und
|
|
* E-Mails. Im Cluster als Kubernetes-CronJob (k8s/base/cronjob-worker.yaml),
|
|
* lokal per `pnpm worker`.
|
|
*
|
|
* Endet mit Exit-Code 1, wenn etwas fehlschlaegt — der CronJob-Lauf wird
|
|
* dann als fehlgeschlagen sichtbar statt still im Log zu verschwinden.
|
|
*/
|
|
import { getDb } from "@/lib/db";
|
|
import { env, requireAppSecret } from "@/lib/env";
|
|
import { getGateway } from "@/lib/payment-gateway";
|
|
import { runWorker } from "@/lib/worker-jobs";
|
|
|
|
try {
|
|
process.loadEnvFile();
|
|
} catch {
|
|
// Im Container kommen die Variablen aus der Umgebung.
|
|
}
|
|
|
|
const db = getDb();
|
|
try {
|
|
const result = await runWorker(db, getGateway(), {
|
|
now: new Date(),
|
|
secret: requireAppSecret(),
|
|
adminEmail: env().ADMIN_NOTIFY_EMAIL ?? null,
|
|
});
|
|
console.log(`[worker] ${new Date().toISOString()} ${JSON.stringify(result)}`);
|
|
// Teilfehler (einzelne Buchungen bei Stripe) machen den Job sichtbar
|
|
// fehlgeschlagen, ohne die uebrigen Aufgaben des Laufs zu verhindern.
|
|
const partialFailures =
|
|
result.emails.failed + result.held.failed + result.schedules.failed + result.installments.failed + result.stopped.failed;
|
|
process.exitCode = partialFailures > 0 ? 1 : 0;
|
|
} catch (error) {
|
|
console.error(`[worker] Abbruch: ${error instanceof Error ? error.message : "unbekannter Fehler"}`);
|
|
process.exitCode = 1;
|
|
} finally {
|
|
await db.$disconnect();
|
|
}
|