Files
Artista-Filmcamp/scripts/worker.ts
T
Nick SzaunigandClaude Opus 5.5 a28d18c3e6 fix: Worker übersteht Stripe-Fehler einzelner Buchungen, Rechnungsentwürfe beim Beenden löschen
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]>
2026-10-06 06:34:20 +02:00

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();
}