feat(db): Datenmodell, erste Migration und Seed (#003)

Prisma 7.10 mit Postgres-Adapter, 23 Modelle inklusive Rechnungen mit Positionen,
Seed fuer Administrator, Warnregeln und Demo-Daten, Testdatenbank fuer Vitest.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-17 20:32:04 +02:00
co-authored by Claude Opus 5
parent 090396f6c0
commit 293bcf4b5a
22 changed files with 4121 additions and 36 deletions
+34
View File
@@ -0,0 +1,34 @@
import { execFileSync } from "node:child_process";
import { Client } from "pg";
import "dotenv/config";
/**
* Legt die Testdatenbank an (falls nötig) und spielt alle Migrationen ein.
* Ohne `TEST_DATABASE_URL` werden die datenbankgestützten Tests übersprungen.
*/
export default async function setup() {
const url = process.env.TEST_DATABASE_URL;
if (!url) {
console.warn("TEST_DATABASE_URL ist nicht gesetzt – Datenbanktests werden übersprungen.");
return;
}
const ziel = new URL(url);
const datenbank = ziel.pathname.replace(/^\//, "");
const verwaltung = new URL(url);
verwaltung.pathname = "/postgres";
const client = new Client({ connectionString: verwaltung.toString() });
await client.connect();
const vorhanden = await client.query("SELECT 1 FROM pg_database WHERE datname = $1", [datenbank]);
if (vorhanden.rowCount === 0) {
// Datenbanknamen lassen sich nicht parametrisieren; er stammt aus der eigenen Konfiguration.
await client.query(`CREATE DATABASE "${datenbank.replace(/"/g, "")}"`);
}
await client.end();
execFileSync("npx", ["prisma", "migrate", "deploy"], {
env: { ...process.env, DATABASE_URL: url },
stdio: "inherit",
});
}