Notification Contract¶
Diese Seite beschreibt den gemeinsamen Notification-Vertrag zwischen Backend, Web und Mobile. Sie ist die Referenz für Inbox-Daten, Mutationen und die serverseitig gespeicherten Notification-Preferences.
Zielbild¶
- Die Notification-Inbox ist serverseitig die Quelle der Wahrheit.
- Web und Mobile verwenden denselben API-Vertrag für
list,read,read all,deleteundclear. - Lokale Caches dienen nur als kurzfristiger Fallback für Offline-/Hydrationsfälle, nicht als eigenständige Inbox.
- Notification-Preferences werden über
/api/user/settingsserverseitig gespeichert.
Inbox DTO¶
Ein einzelner Notification-Eintrag wird clientseitig auf diese Form normalisiert:
type NotificationRecord = {
id: string
title: string
body?: string
date: string
tone: 'info' | 'success' | 'warning' | 'error'
read: boolean
}
Regeln:
idmuss stabil und eindeutig sein.titleist Pflicht.datewird als ISO-Zeitstempel geführt.toneist aufinfo | success | warning | errorbegrenzt.readbeschreibt ausschließlich den serverseitigen Inbox-Zustand.
Inbox Endpunkte¶
Die Clients sprechen primär diese Endpunkte an:
GET /api/notificationsPOST /api/notifications/:id/readPOST /api/notifications/read-allDELETE /api/notifications/:idDELETE /api/notifications
Kompatibilitäts-Fallbacks sind clientseitig weiterhin erlaubt:
PATCH /api/notifications/:id/readPATCH /api/notifications/read-allPOST /api/notifications/:id/deletePOST /api/notifications/clear
Die Fallbacks existieren nur, damit ältere oder leicht driftende Deployments nicht sofort brechen. Die kanonische Richtung bleibt der primäre Satz oben.
Producer-Regeln¶
Neue Notifications entstehen nur über die Backend-Service-Schicht, nicht aus lokalen Placeholder-Daten.
Aktuell angeschlossene Producer umfassen unter anderem:
- Billing / Stripe / Keygen
- Mitgliederaktionen
- Scheduler / Event-Erinnerungen
- Reports
- Duell- und Challenge-bezogene Ereignisse
Client-Verhalten¶
Web¶
- Die Glocke und der Toaster trennen serverseitige Inbox und lokale UI-Feedbacks.
- Gelöschte Inbox-Einträge dürfen nicht aus
localStoragewieder auftauchen. - Der aktuelle Stand wird nach
read,read all,deleteundclearwieder gegen die API abgeglichen.
Mobile¶
- Mobile nutzt dieselben Inbox-Mutationen wie Web.
- SecureStore dient nur als Cache für den zuletzt bekannten Serverstand.
- Beim App-Resume und bei explizitem Refresh wird die Inbox erneut vom Backend geladen.
Notification Preferences¶
Notification-Preferences liegen unter /api/user/settings.
Kanonische Struktur:
type NotificationPreferences = {
version: 1
email: {
enabled: boolean
events: boolean
invites: boolean
categories: {
training: boolean
competition: boolean
board: boolean
youth: boolean
club: boolean
}
}
push: {
enabled: boolean
sound: boolean
}
summary: {
mode: 'off' | 'daily' | 'weekly' | 'monthly'
time: string | null
}
dnd: {
enabled: boolean
from: string | null
to: string | null
}
reminders: {
minutes15: boolean
hour1: boolean
hours24: boolean
viaEmail: boolean
viaPush: boolean
}
updates: {
acceptDecline: boolean
edits: boolean
cancel: boolean
}
}
Übergangsregel:
notifications.*ist die serverseitige Wahrheit.- Flache Root-Felder wie
emailEnabled,categories,updates,pushEnabledwerden nur noch als Legacy-Kompatibilitäts-Mirror behandelt. - Neue Clients sollen ausschließlich den kanonischen Block schreiben.
Verifikation¶
Der Track gilt erst dann als stabil, wenn diese Pfade abgesichert sind:
- Backend-Build läuft durch.
- Web-Build läuft durch.
- Mobile-Typecheck läuft durch.
- Mobile-Notification-Smoke deckt
load,read,read all,delete,clearund Refresh-Verhalten ab.