Legt den kompletten Unterbau an, auf dem die Fachmodule aufsetzen. Betrieb: - docker-compose.yml mit Traefik, App, Worker, PostgreSQL 17 + PostGIS, Redis, MinIO und Gotenberg; Entwicklungs-Override ohne Traefik, dafuer mit Mailpit und Adminer - Mehrstufiges Dockerfile: eigener Benutzer, tini als PID 1, Healthcheck - .env.example mit einem Kommentar zu jeder Variable Mandantentrennung: - Row Level Security auf allen mandantenpflichtigen Tabellen - Zwei getrennte Datenbankverbindungen: florian_app mit aktiver RLS fuer die Anwendung, Eigentuemer-Zugang nur fuer Migration, Seed und Anmeldung - fuerOrganisation() als einziger Weg zu Fachdaten Nachvollziehbarkeit: - AuditLog append-only per Trigger; UPDATE ist dauerhaft gesperrt, DELETE nur im gekennzeichneten Aufbewahrungslauf - Geheimnisse werden vor dem Schreiben entfernt Anmeldung: - OIDC gegen ein extern betriebenes authentik, Rollen aus Gruppen nur als Vorbelegung beim ersten Login - Lokaler E-Mail/Passwort-Login als Rueckfallweg - Terminal per PIN und RFID mit zwei Schranken (Geraet, dann Person) Weiteres: - lib/authz.ts mit 9 Rollen und 38 Einzelrechten - lib/storage.ts (MinIO), lib/audit.ts, lib/warteschlange.ts (BullMQ) - Integrationen fuer Mail, Telegram und LLM hinter abschaltbaren Interfaces - tRPC v11, Basis-Layout mit Seitenleiste und dunkler Darstellung - Seed mit einer Beispielwehr: 16 Personen, 3 Fahrzeuge, 40 Geraete - 32 Vitest-Tests (davon 8 gegen eine echte Datenbank), 10 Playwright-Tests - README, Anleitung mit Screenshots, Roadmap, Aufwandsschaetzung, Devlog, Versionierungsregeln und Changelog Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
33 lines
1.3 KiB
TypeScript
33 lines
1.3 KiB
TypeScript
import "dotenv/config";
|
|
|
|
/**
|
|
* Wird vor jedem Testlauf ausgeführt.
|
|
*
|
|
* Setzt eine vollständige, aber unschädliche Umgebung, damit lib/env.ts
|
|
* durchläuft, ohne dass eine echte .env vorhanden sein muss.
|
|
*
|
|
* Ist eine .env vorhanden, wird sie oben geladen — dann laufen auch die Tests
|
|
* mit, die eine echte Datenbank brauchen (Mandantentrennung). Ohne .env greifen
|
|
* die Platzhalter, und diese Tests überspringen sich selbst.
|
|
*/
|
|
|
|
// NODE_ENV ist in den Node-Typen schreibgeschützt, zur Laufzeit aber setzbar.
|
|
const umgebung = process.env as Record<string, string | undefined>;
|
|
|
|
umgebung.NODE_ENV = "test";
|
|
umgebung.TZ = "Europe/Berlin";
|
|
umgebung.SKIP_ENV_VALIDATION = "1";
|
|
|
|
umgebung.APP_URL ??= "http://localhost:3100";
|
|
umgebung.DATABASE_URL ??= "postgresql://test:test@localhost:5442/test?schema=public";
|
|
umgebung.DIRECT_DATABASE_URL ??= umgebung.DATABASE_URL;
|
|
umgebung.REDIS_URL ??= "redis://localhost:6389";
|
|
umgebung.S3_ENDPOINT ??= "localhost";
|
|
umgebung.S3_ACCESS_KEY ??= "test";
|
|
umgebung.S3_SECRET_KEY ??= "test";
|
|
umgebung.S3_BUCKET ??= "test";
|
|
umgebung.AUTH_SECRET ??= "testgeheimnis_mindestens_32_zeichen_lang_ok";
|
|
umgebung.KIOSK_DEVICE_SECRET ??= "testgeraetegeheimnis";
|
|
// bcrypt mit weniger Runden — im Test zählt Tempo, nicht Härte.
|
|
umgebung.AUTH_BCRYPT_ROUNDS ??= "4";
|