feat: Grundgerüst mit Anmeldung, Layout und Design-Tokens

Next.js 16, Prisma 7, Tailwind 4 und Vitest/Playwright, Konfiguration aus
Laufzettel übernommen, weil dort derselbe Stack erprobt ist.

Die Farben der Branding-Vorgabe stehen als Tokens in globals.css, das
helle Theme setzt dieselben Namen neu. Amber und Rot sind dort
abgedunkelt, sonst reicht der Kontrast nicht – ein Test prüft beide
Themes gegen 4,5:1.

Anmeldung mit lokalem Benutzer, Rolle je Anfrage aus der Datenbank,
Audit-Log per Trigger nur anhängbar. Geprüft im gebauten Stand auf
1440 px und 390 px.

Closes #001

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-12 09:23:41 +02:00
co-authored by Claude Opus 5.5
parent c3211d0fe2
commit 871bb3a77c
75 changed files with 10155 additions and 15 deletions
+63
View File
@@ -0,0 +1,63 @@
// Datenmodell von ProxDeploy. Namensabbildung zur Vorgabe: siehe CLAUDE.md.
// Modelle kommen mit dem Issue dazu, das sie braucht – der Plan in docs/architektur.md
// zeigt das Zielbild.
generator client {
provider = "prisma-client"
output = "../src/generated/prisma"
}
datasource db {
provider = "postgresql"
}
enum Rolle {
ADMIN
OPERATOR
}
enum Quelle {
WEB
CLI
API
SYSTEM
}
model Benutzer {
id String @id @default(cuid())
benutzername String @unique
anzeigename String
email String?
/// argon2id; leer bei Benutzern, die sich nur per OIDC anmelden.
passwortHash String?
oidcSubjekt String? @unique
rolle Rolle @default(OPERATOR)
aktiv Boolean @default(true)
/// Persönliche Standardwerte im Assistenten.
standards Json?
erstelltAm DateTime @default(now())
geaendertAm DateTime @updatedAt
protokoll Protokoll[]
}
/// Audit-Log. Nur anhängen – ein Trigger verweigert UPDATE und DELETE.
model Protokoll {
id BigInt @id @default(autoincrement())
zeit DateTime @default(now())
benutzerId String?
benutzer Benutzer? @relation(fields: [benutzerId], references: [id], onDelete: SetNull)
quelle Quelle
aktion String
ziel String?
details Json?
ip String?
@@index([zeit])
@@index([benutzerId, zeit])
}
model Einstellung {
schluessel String @id
wert Json
geaendertAm DateTime @updatedAt
}