104 lines
4.2 KiB
TypeScript
104 lines
4.2 KiB
TypeScript
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();
|
||
}
|