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). |
| 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.