Files
Laufzettel/prisma/seed.ts
T
florian.wilde 9bd198a531
Prüfung / pruefung (push) Canceled after 0s
Prüfung / e2e (push) Canceled after 0s
feat(seed): sieben Vorlagen, Beispielbestand und Demo-Kunden (#33)
2026-09-26 03:26:58 +00:00

104 lines
4.2 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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<void> {
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();
}