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
+11 -2
View File
@@ -15,7 +15,15 @@ export function signToken(user) {
});
}
/** Prueft das Bearer-Token und laedt den aktuellen Benutzer aus der DB. */
/**
* Prueft das Bearer-Token und laedt den aktuellen Benutzer aus der DB.
*
* Die Spaltenliste ist bewusst vollstaendig und kein `SELECT *`: das
* Passwort-Hash soll nicht am Request haengen. Sie muss aber alles enthalten,
* was publicUser() ausliefert - theme und theme_mode gehoeren dazu, sonst
* antwortet GET /api/auth/me mit null und das Frontend haelt die gespeicherte
* Wahl beim Neuladen fuer "nichts gewaehlt".
*/
export async function requireAuth(req, res, next) {
const header = req.headers.authorization || '';
const token = header.startsWith('Bearer ') ? header.slice(7) : null;
@@ -30,7 +38,8 @@ export async function requireAuth(req, res, next) {
try {
const [rows] = await pool.query(
`SELECT id, username, email, name, role, color, avatar, is_active, created_at, updated_at
`SELECT id, username, email, name, role, color, avatar, theme, theme_mode,
is_active, created_at, updated_at
FROM crm_users WHERE id = ? LIMIT 1`,
[payload.sub]
);