fix(design): Farbwelt und Modus bleiben nach dem Neuladen erhalten

requireAuth hat den Benutzer mit einer ausgeschriebenen Spaltenliste geladen,
in der theme und theme_mode fehlten. GET /api/auth/me antwortete deshalb mit
null, und der ThemeProvider hat das beim Neuladen als "nichts gewaehlt"
gelesen: die Anzeige fiel auf perinco/System zurueck und hat den
localStorage-Zwischenspeicher gleich mit ueberschrieben. Direkt nach dem Klick
und nach dem Anmelden sah es richtig aus, weil PATCH /me den geaenderten Wert
selbst zurueckgibt und der Login SELECT * benutzt - nur das Neuladen nicht.

Dazu ein Test, der die Spaltenliste mit den Feldern von publicUser()
vergleicht, damit ein neues Benutzerfeld nicht wieder still verloren geht.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Sascha Wolf
2026-09-10 10:29:23 +02:00
co-authored by Claude Opus 5
parent 71a8c30b23
commit a50f5cb4a6
5 changed files with 83 additions and 4 deletions
+5 -1
View File
@@ -53,7 +53,7 @@ ansehen - siehe *Oberfläche prüfen ohne Datenbank* weiter unten.
```bash
npm run lint # = tsc --noEmit, das ist die Wahrheit
npm run build # muss ohne Fehler durchlaufen
cd server && npm test # Postfachanbindung, Berater-Liste, Benutzerfelder, LinkedIn-Foto
cd server && npm test # Postfachanbindung, Berater-Liste, Benutzerfelder, LinkedIn-Foto, Sitzungsbenutzer
```
Automatische Tests gibt es für zwei Bereiche, beide ohne Test-Framework, reines
@@ -68,6 +68,10 @@ Node und ohne Datenbank:
das mehrere Namen kommagetrennt hält. Es steckt im Speichern, im Verlauf, in
der Auswertung und in der Übernahme; ein Fehler darin fällt nicht auf, weil
die Liste weiter Namen zeigt und nur die Zahlen falsch wären.
* `server/test/sessionUser.test.mjs` vergleicht die Spaltenliste in
`requireAuth` mit den Feldern, die `publicUser()` ausliefert. Fehlt dort eine
Spalte, antwortet die API still mit `null` - so ist die gespeicherte
Designwahl beim Neuladen verloren gegangen.
Für alles andere gilt: `tsc`, ein Build und ein Blick in die Oberfläche - notfalls
mit dem Stub aus [Oberfläche prüfen ohne Datenbank](#oberflaeche-pruefen-ohne-datenbank).
+8
View File
@@ -74,6 +74,14 @@ deaktivierter oder gelöschter Benutzer ist sofort draußen und nicht erst, wenn
sein Token abläuft. `secret()` wirft, wenn `JWT_SECRET` fehlt oder kürzer als 16
Zeichen ist - lieber ein harter Startfehler als eine schwache Signatur.
Die Spaltenliste ist ausgeschrieben (kein `SELECT *`), damit das Passwort-Hash
nicht am Request hängt. Sie muss dafür alles enthalten, was `publicUser()`
ausliefert. Fehlte dort `theme` bzw. `theme_mode`, antwortete
`GET /api/auth/me` mit `null`, und die Oberfläche fiel beim Neuladen auf das
Standarddesign zurück - obwohl die Wahl in der Datenbank stand.
`server/test/sessionUser.test.mjs` vergleicht beide Listen, damit ein neues Feld
nicht wieder still verloren geht.
### `server/src/userFields.js`
`normalizeColor` und `normalizeAvatar`, benutzt von `routes/auth.js` und