Rollenstruktur und englische Fachbegriffe festgelegt

Der Discord-Server hat drei Sorten Rollen, die Dokumente kannten nur eine:
Zugehörigkeit (AfiS, Personalabteilung) als Türsteher, Rangrollen für die
Rechte, Zugangsrollen für die Freigabestufe. Das bestehende RoleMapping trägt
das fast, es fehlt nur der Türsteher. Die beiden Felder dafür kommen mit
Phase 1, die Struktur ist in docs/13-entscheidungen.md festgehalten.

Die Freigabestufen heißen jetzt wie die Zugangsrollen: Unclassified,
Restricted Access, Confidential Access, Sensitive Access, Critical Operations,
Executive Oversight. Fachbegriffe der Domäne bleiben englisch, auch in einer
deutschen Oberfläche.

Die Bezeichnungen sind damit Daten in ClearanceLevelConfig, nicht mehr
Oberflächentext in lib/i18n/de.ts: sie sind im Adminbereich änderbar, und was
der Leiter ändern kann, gehört nicht in eine Übersetzungsdatei. StampMark
bekommt den Namen hereingereicht.

Vier neue Tests prüfen den Zustand, den der Seed herstellt, gegen die
Datenbank statt gegen eine Konstante im Code.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Harlekin
2026-09-01 18:50:07 +02:00
co-authored by Claude Opus 5
parent dfc47f91c4
commit dbca57cedf
8 changed files with 143 additions and 36 deletions
+13 -9
View File
@@ -11,17 +11,21 @@ import { createPrismaClient } from '../src/index.js'
const db = createPrismaClient()
/**
* Auslieferungszustand nach docs/01-produkt.md. Ab Stufe 3 ist die Existenz
* einer Akte für niedrigere Stufen verborgen, darunter nur der Inhalt gesperrt.
* Der Leiter kann das im Adminbereich ändern.
* Auslieferungszustand. Ab Stufe 3 ist die Existenz einer Akte für niedrigere
* Stufen verborgen, darunter ist nur der Inhalt gesperrt. Der Leiter kann das
* im Adminbereich ändern.
*
* Die Namen entsprechen den Zugangsrollen auf dem Discord und bleiben deshalb
* englisch, siehe docs/13-entscheidungen.md. Stufe 0 hat keine eigene
* Zugangsrolle: sie gilt für jedes AfiS-Mitglied ohne eine solche Rolle.
*/
const CLEARANCE_LEVELS = [
{ level: 0, name: 'Offen', hiddenBelow: false, colorToken: 'stamp-0' },
{ level: 1, name: 'Intern', hiddenBelow: false, colorToken: 'stamp-1' },
{ level: 2, name: 'Vertraulich', hiddenBelow: false, colorToken: 'stamp-2' },
{ level: 3, name: 'Geheim', hiddenBelow: true, colorToken: 'stamp-3' },
{ level: 4, name: 'Streng geheim', hiddenBelow: true, colorToken: 'stamp-4' },
{ level: 5, name: 'Leitungssache', hiddenBelow: true, colorToken: 'stamp-5' },
{ level: 0, name: 'Unclassified', hiddenBelow: false, colorToken: 'stamp-0' },
{ level: 1, name: 'Restricted Access', hiddenBelow: false, colorToken: 'stamp-1' },
{ level: 2, name: 'Confidential Access', hiddenBelow: false, colorToken: 'stamp-2' },
{ level: 3, name: 'Sensitive Access', hiddenBelow: true, colorToken: 'stamp-3' },
{ level: 4, name: 'Critical Operations', hiddenBelow: true, colorToken: 'stamp-4' },
{ level: 5, name: 'Executive Oversight', hiddenBelow: true, colorToken: 'stamp-5' },
]
async function main(): Promise<void> {