Bisher liess sich nur je Schluessel oder je Host nachsehen, wo ein Key verwaltet ist. Die Matrix zeigt das auf einen Blick, loest Hostgruppen-Zuweisungen je Mitglied auf (P vs. P·G) und macht nicht synchrone Zustaende ohne Farbe erkennbar. Die Matrix plant nur: Zuweisen und Entfernen laufen ueber die vorhandenen Aktionen, ausgerollt wird weiter per Dry-Run auf der Schluesselseite. Der Aufbau ist eine reine Funktion in src/lib, damit Seite und CSV-Export garantiert dasselbe zeigen und die Gruppenaufloesung ohne Datenbank testbar ist. Der CSV-Export entschaerft Formelbeginne, weil Schluesselnamen frei waehlbar sind und Excel sie sonst ausfuehren wuerde. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
27 lines
1.1 KiB
TypeScript
27 lines
1.1 KiB
TypeScript
import { NextResponse } from "next/server";
|
|
import { matrixCsv, matrixFilterAus } from "@/lib/zuweisungsmatrix";
|
|
import { RechteFehler, rechtErforderlich } from "@/server/auth/sitzungspflicht";
|
|
import { zuweisungsMatrix } from "@/server/queries/zuweisungen";
|
|
|
|
/**
|
|
* Zuweisungsmatrix als CSV (#025) mit denselben Filtern wie die Seite. Jede Rolle darf lesen;
|
|
* der Handler prueft das selbst, der Proxy laesst ohne Cookie ohnehin niemanden durch.
|
|
*/
|
|
export async function GET(anfrage: Request) {
|
|
try {
|
|
await rechtErforderlich("lesen");
|
|
} catch (fehler) {
|
|
if (fehler instanceof RechteFehler) return NextResponse.json({ fehler: fehler.message }, { status: 403 });
|
|
throw fehler;
|
|
}
|
|
const filter = matrixFilterAus(Object.fromEntries(new URL(anfrage.url).searchParams));
|
|
const { matrix } = await zuweisungsMatrix(filter);
|
|
return new NextResponse(matrixCsv(matrix), {
|
|
headers: {
|
|
"Content-Type": "text/csv; charset=utf-8",
|
|
"Content-Disposition": 'attachment; filename="sshkv-zuweisungen.csv"',
|
|
"Cache-Control": "no-store",
|
|
},
|
|
});
|
|
}
|