import "dotenv/config"; import { PrismaPg } from "@prisma/adapter-pg"; import { PrismaClient } from "../src/generated/prisma/client.js"; import { Betriebsmodus } from "../src/generated/prisma/enums.js"; import { demoKundenSaeen } from "./seed-daten/dienstleistung.js"; import { adminAnlegen, eigeneOrganisationAnlegen, einstellungAnlegen, modusLesen, } from "./seed-daten/grundbestand.js"; import { beispielQuelleSaeen, stammdatenSaeen } from "./seed-daten/stammdaten.js"; import { typVorgabenSaeen, vorlagenSaeen } from "./seed-daten/vorlagen.js"; /** * Der Seed: was eine frische Installation braucht, um bedienbar zu sein (#017). * * Der Seed ist idempotent – zweimal hintereinander aufgerufen aendert der zweite * Lauf nichts. Er laeuft im Compose-Stand bewusst NICHT automatisch mit, sondern * ist ein dokumentierter Handgriff (siehe README). * * Angelegt werden: Betriebsmodus samt Namensregeln, die eigene Organisation, ein * Administrator, die sieben Vorlagen als veroeffentlichte Version 1 und ein * Beispielbestand aus Abteilungen, Personen, Geraeten und Tags. Im Modus INTERN * haengt der an der eigenen Organisation und bekommt eine **deaktivierte** * Beispiel-Verzeichnisquelle dazu; im Modus DIENSTLEISTUNG haengt er an den * Demo-Kunden — „erzeugt stattdessen“, so steht es im Auftrag. * * Die einzelnen Schritte liegen unter `prisma/seed-daten/`, damit Tests sie * einzeln aufrufen koennen: diese Datei fuehrt beim Import den ganzen Seed aus. * * Was schon da ist, bleibt, wie es ist. Der Seed richtet ein; er raeumt nicht auf * und stellt nichts zurueck. Wer eine Vorlage bearbeitet oder eine Ziel-OU * geaendert hat, bekommt sie beim naechsten Lauf nicht ueberschrieben. */ const url = process.env["DATABASE_URL"]; if (!url) { throw new Error("DATABASE_URL ist nicht gesetzt. Siehe .env.example."); } const prisma = new PrismaClient({ adapter: new PrismaPg({ connectionString: url }) }); async function main(): Promise { const modus = modusLesen(); console.log("Seed laeuft:"); await einstellungAnlegen(prisma, modus); const eigeneId = await eigeneOrganisationAnlegen(prisma); await adminAnlegen(prisma); const vorlagen = await vorlagenSaeen(prisma); const neueVorlagen = vorlagen.filter((eintrag) => eintrag.neu).length; console.log(` Vorlagen: ${vorlagen.length} vorhanden, davon ${neueVorlagen} neu angelegt`); const typVorgaben = await typVorgabenSaeen(prisma, vorlagen); console.log(` Schnellstart je Geraetetyp: ${typVorgaben} neu`); /* * Der Beispielbestand haengt an dem, der ihn im jeweiligen Modus braucht: * * - INTERN: an der eigenen Organisation. Sie ist das Haus. * - DIENSTLEISTUNG: an der Musterfirma. Der Auftrag verlangt, dass `LZ-7K3F9Q` * dort auf `MUS-PC-001` fuehrt — „erzeugt **stattdessen**“. Beides zugleich * ginge ohnehin nicht: ein Tag-Code gehoert genau einem Geraet. */ if (modus === Betriebsmodus.INTERN) { const bestand = await stammdatenSaeen(prisma, eigeneId); console.log( ` Beispielbestand: ${bestand.abteilungen} Abteilungen, ${bestand.personen} Personen, ` + `${bestand.geraete} Geraete, ${bestand.offeneTags} freie Tags (jeweils neu)`, ); // Das Verzeichnis gibt es nur im Modus INTERN (#008) – im Modus // DIENSTLEISTUNG waere die Beispielquelle eine Zeile, die niemand sieht. const quelle = await beispielQuelleSaeen(prisma, eigeneId); console.log( quelle ? " Verzeichnisquelle: Beispiel angelegt (deaktiviert, Adresse und Passwort ersetzen)" : " Verzeichnisquelle: vorhanden", ); } else { const kunden = await demoKundenSaeen(prisma); for (const kunde of kunden) { const bestand = kunde.bestand; const zahlen = bestand ? `${bestand.abteilungen} Abteilungen, ${bestand.personen} Personen, ` + `${bestand.geraete} Geraete, ${bestand.offeneTags} freie Tags (jeweils neu)` : "kein Bestand"; console.log( ` Kunde ${kunde.kuerzel}: ${kunde.neu ? "angelegt" : "vorhanden"} ` + `(${kunde.kunde}, ${kunde.hostname}) – ${zahlen}`, ); } } console.log("Seed fertig."); } try { await main(); } finally { await prisma.$disconnect(); }