feat(vorlagen): Liste, Formular und Live-Vorschau (#019)

Die Vorlagen-Logik aus #019 war bisher nur per Seed und Service
erreichbar. Admins koennen eigene Vorlagen jetzt anlegen, eingebaute
anpassen und eigene archivieren; jede Rolle sieht die Liste, weil
Operatoren die Vorlagen im Assistenten wiedererkennen sollen.

Die Vorschau nutzt im Browser dieselben reinen Funktionen wie der
Server (platzhalterErsetzen, optionenPruefen, sudoersInhalt). So sieht
der Admin vor dem Speichern, was in authorized_keys, ~/.ssh/config und
sudoers landen wuerde; verbindlich prueft weiterhin der Server. Voller
sudo-Zugang bekommt einen deutlichen Hinweis, weil er root gleichkommt.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-12 11:16:31 +02:00
co-authored by Claude Opus 5.5
parent bdf12b05e7
commit 5c42f8dd8d
7 changed files with 686 additions and 13 deletions
+40
View File
@@ -0,0 +1,40 @@
import { prisma } from "@/lib/db";
/**
* Lesemodelle fuer Vorlagen (#019). Vorlagen enthalten keine Geheimnisse – jede angemeldete
* Rolle darf sie sehen; die Seite blendet nur die Bearbeiten-Knoepfe aus.
*/
const AUSWAHL = {
id: true,
name: true,
beschreibung: true,
eingebaut: true,
schluesselTyp: true,
kategorie: true,
standardLaufzeitTage: true,
zielbenutzer: true,
zielbenutzerAnlegen: true,
sudoModus: true,
sudoBefehle: true,
authorizedKeysOptionen: true,
sshConfigAlias: true,
knownHostsEintragen: true,
privatNachAusrollenLoeschen: true,
archiviertAm: true,
} as const;
/** Eingebaute zuerst in Seed-Reihenfolge – sie sind der Normalfall, eigene die Ausnahme. */
export async function vorlagenListe() {
return prisma.vorlage.findMany({
where: { archiviertAm: null },
orderBy: [{ eingebaut: "desc" }, { angelegtAm: "asc" }, { name: "asc" }],
select: AUSWAHL,
});
}
export type VorlagenListenEintrag = Awaited<ReturnType<typeof vorlagenListe>>[number];
export async function vorlageDetail(id: string) {
return prisma.vorlage.findUnique({ where: { id }, select: AUSWAHL });
}