Zum Inhalt

Datenmodell

Das Schema ist in lib/db/schema.ts definiert. Enum-Werte stehen als Konstanten in derselben Datei und werden von den Zod-Validierungen und der Oberfläche wiederverwendet. Datenbank, Validierung und Formulare können so nicht auseinanderlaufen.

Kernentitäten

Tabelle Zweck
component_groups Benannte Gruppen von Services. Gruppennamen sind systemweit eindeutig.
components Services (im Schema „components“ genannt). Enthalten den Status-Cache, den Modus (service_status), Owner, Benachrichtigungseinstellungen, SLA-Ziele, SLA-Plan, Incident-SLA-Metriken und die Konfiguration der Uptime-Checks. Servicenamen sind je Gruppe eindeutig.
component_status_events Append-only-Historie der aktiven Statusfenster je Komponente. Siehe Statusmodell.
incidents Kopf eines Incidents: Titel, Impact, Lebenszyklus-Status, Zeitpunkte für Auftritt, Reaktion und Auflösung, Review- und Close-Daten.
incident_updates Öffentliche Timeline-Einträge eines Incidents (inklusive des automatischen Eintrags occurred).
incident_components Betroffene Komponenten eines Incidents, optional mit exaktem Ausfallfenster je Komponente.
incident_notes Private interne Team-Notizen. Nie öffentlich sichtbar.
maintenances Geplante Wartungsfenster mit Start/Ende, Status und Benachrichtigungsmarkierung.
maintenance_components Vom Wartungsfenster betroffene Komponenten.

SLA-Entitäten

Tabelle Zweck
sla_plans / sla_plan_entries Ein Plan definiert je Wochentag ein Zeitfenster (Von–Bis in Minuten). from == to bedeutet geschlossen. Der Plan trägt außerdem die optionale Feiertagsliste, das Feiertagsfenster und die Option ignore_outages_during_maintenance.
holiday_lists / holiday_list_dates Feiertage je Liste. Ein Datum ohne Jahr wiederholt sich jährlich, ein Datum mit Jahr gilt einmalig.
sla_reports Reports für Monat, Quartal oder Jahr mit dem Status open → in_progress → confirmed → completed. confirmed_snapshot hält den beim Bestätigen eingefrorenen Report (seit #349 mit der Berechnungs-Zeitzone timeZone), report_data das Ergebnis zum Zeitpunkt von Generate. pdf_path ist nur noch eine Markierung, ob die Liste die Download-Links zeigt. Gespeichert wird keine Datei.
sla_report_outages Eine Zeile je Ausfall in einem Monatsreport, der bestätigt werden muss (to_confirm / confirmed).

Plattform-Entitäten

Tabelle Zweck
settings Singleton-Zeile (CHECK (id = 1)) mit der Site-Konfiguration. Geheimnisse sind verschlüsselt gespeichert.
users Konten des Teams mit Rolle (admin, service_manager, service_owner, sla_manager) und session_version (zum Widerruf von Sessions).
subscribers Öffentliche und vom Admin verwaltete E-Mail-Empfänger mit Double-Opt-in-Status.
notification_templates Eine Zeile je Event-Typ mit Aktivierungs-Flags je Kanal. Fehlt die Zeile, wird nicht gesendet.
notification_events Protokoll der E-Mail-Benachrichtigungen mit Status pending → processing → sent | failed. sent_chunks zählt die bereits zugestellten Empfänger-Blöcke, damit Wiederholungen niemanden doppelt beliefern.
webhook_endpoints / webhook_deliveries Webhook-Ziele und Zustellversuche.
sms_recipients / sms_deliveries SMS-Empfänger und Zustellversuche.
push_subscriptions / push_deliveries Browser-Push-Abos und Zustellversuche.
uptime_check_results Ergebnisse der automatischen HTTP-Checks mit Antwortzeit und Aufbewahrung.
api_tokens / api_token_components Gehashte API-Tokens mit optionalem Ablauf, Widerruf und Service-Beschränkung.
auth_throttle Zähler für das Rate-Limiting: fehlgeschlagene Anmelde- und Token-Versuche je Client-IP sowie die Anfragen der öffentlichen Formulare je IP und je Adresse (publicform:…).
audit_log Append-only-Protokoll aller mutierenden Admin-Aktionen mit Before/After-JSON.
__drizzle_migrations Migrationsjournal, gepflegt von scripts/migrate.ts.

Wichtige Invarianten

  • components.status ist ein Cache des schwersten offenen Fensters. Geschrieben wird er nur zusammen mit den Statusfenstern (setComponentsStatusTx).
  • maintenances_end_after_start_chk erzwingt scheduled_end > scheduled_start.
  • sla_reports_month_period_chk legt fest, wie die Spalte month je Periode zu lesen ist: Kalendermonat (1–12) bei Monatsreports, Startmonat des Quartals (1/4/7/10) bei Quartalsreports und 1 bei Jahresreports.
  • CHECKs auf sla_plan_entries: day_of_week 0–6, from_min 0–1439, to_min 0–1440.
  • holiday_list_dates_unique_date verhindert doppelte Daten in einer Feiertagsliste.
  • settings_singleton_chk garantiert genau eine Settings-Zeile. Fehlt sie, liefert getSettings() vollständige Defaults.
  • incident_notes und audit_log sind auf Anwendungsebene append-only.