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