Files
AfiS-Aktensystem/packages/db/prisma/seed.ts
T
HarlekinandClaude Opus 5 dbca57cedf 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>
2026-09-01 18:50:07 +02:00

74 lines
2.8 KiB
TypeScript

import { createPrismaClient } from '../src/index.js'
/**
* Grundzustand der Anwendung. Alles hier ist Konfiguration, ohne die die App
* nicht sinnvoll läuft, kein Testinhalt.
*
* Die vier Startvorlagen (Korruptionsverdacht, Dienstvergehen,
* Sicherheitsvorfall, Routineprüfung) kommen in Phase 3 dazu, zusammen mit dem
* Vorlagen-Editor. Siehe TASKS.md.
*/
const db = createPrismaClient()
/**
* 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: '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> {
for (const config of CLEARANCE_LEVELS) {
await db.clearanceLevelConfig.upsert({
where: { level: config.level },
create: config,
update: { name: config.name, colorToken: config.colorToken },
})
}
console.log(`[seed] ${CLEARANCE_LEVELS.length} Freigabestufen`)
// Änderungsrichtlinie im Auslieferungszustand: eigene Einträge sind 15 Minuten
// frei änderbar, danach nur mit Recht. Eine Änderung in dieser Karenzzeit wird
// versioniert und protokolliert, aber nicht sichtbar markiert.
// Siehe docs/05-akten-und-vorlagen.md.
await db.appSetting.upsert({
where: { id: 1 },
create: { id: 1 },
update: {},
})
console.log('[seed] Änderungsrichtlinie GRACE_WINDOW, 15 Minuten')
const year = new Date().getFullYear()
await db.caseCounter.upsert({
where: { year },
create: { year, lastNumber: 0 },
update: {},
})
console.log(`[seed] Aktenzeichen-Zähler für ${year}`)
// entry.edit_own, entry.edit_any und entry.retract sind bewusst keiner Rolle
// zugeordnet. Der Leiter schaltet sie frei, wenn er sie will.
// Siehe docs/03-auth-und-rechte.md.
const mappings = await db.roleMapping.count()
console.log(`[seed] ${mappings} Rollen-Zuordnungen vorhanden, keine angelegt`)
}
main()
.then(() => db.$disconnect())
.catch(async (error: unknown) => {
console.error('[seed] fehlgeschlagen', error)
await db.$disconnect()
process.exit(1)
})