"use server"; import { cursorAus, protokollFilterAus } from "@/lib/protokoll-filter"; import { RechteFehler, rechtErforderlich } from "@/server/auth/sitzungspflicht"; import { protokollSeite, type ProtokollSeite } from "@/server/queries/protokoll"; import { kettePruefenZwischengespeichert } from "@/server/services/protokoll"; /** * Protokollansicht (#027): nur lesende Aktionen. Bewusst gibt es hier nichts, was einen * Eintrag aendert oder loescht – das verbietet ohnehin der Trigger, und * `tests/protokoll-ansicht.test.ts` haelt fest, dass auch kein Code es versucht. */ export type KettenAntwort = { readonly fehlerhafteId?: string | null; readonly eintraege?: number; readonly geprueftAm?: string; readonly fehler?: string; }; export async function kettePruefenAktion(): Promise { try { const { benutzer } = await rechtErforderlich("lesen"); const ergebnis = await kettePruefenZwischengespeichert({ id: benutzer.id, name: benutzer.name }); return { fehlerhafteId: ergebnis.fehlerhafteId, eintraege: ergebnis.eintraege, geprueftAm: ergebnis.geprueftAm.toISOString(), }; } catch (fehler) { if (fehler instanceof RechteFehler) return { fehler: fehler.message }; throw fehler; } } /** „Ältere laden“: dieselben GET-Filter wie die Seite, Cursor ist die kleinste gezeigte ID. */ export async function aeltereLadenAktion( query: string, vor: string, ): Promise { try { await rechtErforderlich("lesen"); } catch (fehler) { if (fehler instanceof RechteFehler) return { fehler: fehler.message }; throw fehler; } const cursor = cursorAus(String(vor)); if (cursor === undefined) return { zeilen: [], weiterVor: null }; const filter = protokollFilterAus(Object.fromEntries(new URLSearchParams(String(query).slice(0, 2000)))); return protokollSeite(filter, cursor); }