import { prisma } from "@/lib/db"; import { WARTESCHLANGE, warteschlangeHolen, type VorgangsJob } from "@/server/vorgaenge/warteschlange"; import { vorgangAusfuehren } from "@/worker/ausfuehren"; import { HANDLER } from "@/worker/handler"; /** * Fuehrt einen eingereihten Vorgang so aus, wie es der Worker tut (#012): Job aus pg-boss * holen, mit seinem `geheim` ausfuehren, danach loeschen (src/worker/index.ts). * Liefert zusaetzlich die rohen Job-Daten, damit Tests pruefen koennen, was darin stand. */ export async function vorgangImWorker(vorgangId: string): Promise<{ jobDaten: VorgangsJob }> { const boss = await warteschlangeHolen(); // Die Warteschlange ueberlebt das Leeren der Tabellen; deshalb gezielt den eigenen Job suchen. const jobs = await boss.fetch(WARTESCHLANGE, { batchSize: 100 }); const job = jobs.find((kandidat) => kandidat.data.vorgangId === vorgangId); if (!job) throw new Error(`Kein Job für Vorgang ${vorgangId}`); await vorgangAusfuehren(job.data.vorgangId, HANDLER, job.data.geheim); await boss.complete(WARTESCHLANGE, job.id); if (job.data.geheim) await boss.deleteJob(WARTESCHLANGE, job.id); return { jobDaten: job.data }; } /** Alle Zeilen aller Tabellen als ein Text – fuer „steht das Geheimnis irgendwo?“. */ export async function datenbankAlsText(): Promise { const teile = await Promise.all([ prisma.vorgang.findMany(), prisma.protokoll.findMany(), prisma.$queryRaw`SELECT data FROM pgboss.job`, ]); return JSON.stringify(teile, (_k, wert: unknown) => (typeof wert === "bigint" ? wert.toString() : wert)); } export async function warteschlangeStoppen(): Promise { const boss = await warteschlangeHolen(); await boss.stop({ graceful: false }); }