---
name: project-user-preferences
description: "Table user_preferences — stockage DB des préférences UI par utilisateur, route /api/preferences, sync UiContext"
metadata: 
  node_type: memory
  type: project
  originSessionId: d7532bd8-8eb4-4b40-8c39-8f569dcf432f
---

Système de persistance des préférences UI en base de données, par utilisateur.

## Table (backend/src/db/index.js)
```sql
CREATE TABLE IF NOT EXISTS user_preferences (
  user_id    INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
  key        TEXT    NOT NULL,
  value      TEXT    NOT NULL,
  updated_at TEXT    NOT NULL DEFAULT (datetime('now')),
  PRIMARY KEY (user_id, key)
)
```
Table générique clé/valeur — extensible à toutes les futures prefs sans migration.

## Route (backend/src/routes/preferences.js)
- `GET /api/preferences` — retourne `{ key: value, ... }` pour l'utilisateur connecté
- `PATCH /api/preferences` — upsert d'un ou plusieurs couples ; liste blanche des clés autorisées
- Clés actuellement autorisées : `chart_interets`, `chart_capital`, `chart_cashback`
- Pour ajouter une nouvelle pref : l'ajouter dans le Set `ALLOWED_KEYS` de la route

## Stratégie de sync dans UiContext
- **Au montage** : `api.get('/preferences')` → valeurs DB écrasent localStorage (DB fait foi). Silencieux si token absent.
- **À chaque changement** : localStorage mis à jour immédiatement (feedback instantané) + `api.patch('/preferences', { key: value })` asynchrone silencieux en cas d'erreur réseau.

## Extension future
Pour persister d'autres prefs (thème, font_scale, langue, devise, display_mode) :
1. Ajouter la clé dans `ALLOWED_KEYS` (preferences.js)
2. Lire la valeur dans le `useEffect` de montage (UiContext)
3. Appeler `persistPref(key, value)` dans le setter correspondant

**Why:** L'utilisateur veut que ses préférences de couleurs soient liées à son compte et non au navigateur.
**How to apply:** Toute nouvelle préférence UI candidate à la persistance multi-device doit passer par ce système.
