Files
crowdlending-app/backend/src/routes/preferences.js
T
Olivier CROGUENNEC 48ed7fe65e Initial commit
2026-06-13 14:57:15 +02:00

63 lines
1.8 KiB
JavaScript

import { Router } from 'express';
import db from '../db/index.js';
const router = Router();
// Clés autorisées — liste blanche pour éviter les injections de clés arbitraires
const ALLOWED_KEYS = new Set([
'chart_interets',
'chart_capital',
'chart_cashback',
// Extensible : ajouter ici les futures prefs (theme, font_scale, langue, devise, display_mode…)
]);
/**
* GET /api/preferences
* Retourne toutes les préférences de l'utilisateur connecté sous forme d'objet plat.
* Les clés absentes ne sont pas retournées (le frontend utilise ses valeurs par défaut).
*/
router.get('/', (req, res) => {
const rows = db
.prepare('SELECT key, value FROM user_preferences WHERE user_id = ?')
.all(req.user.id);
const result = {};
for (const { key, value } of rows) result[key] = value;
res.json(result);
});
/**
* PATCH /api/preferences
* Upsert d'un ou plusieurs couples { key: value }.
* Seules les clés de ALLOWED_KEYS sont acceptées.
*/
router.patch('/', (req, res) => {
const payload = req.body;
if (!payload || typeof payload !== 'object' || Array.isArray(payload)) {
return res.status(400).json({ error: 'Corps invalide — objet { clé: valeur } attendu' });
}
const upsert = db.prepare(`
INSERT INTO user_preferences (user_id, key, value, updated_at)
VALUES (?, ?, ?, datetime('now'))
ON CONFLICT (user_id, key) DO UPDATE SET value = excluded.value, updated_at = excluded.updated_at
`);
const unknown = Object.keys(payload).filter(k => !ALLOWED_KEYS.has(k));
if (unknown.length) {
return res.status(400).json({ error: `Clés inconnues : ${unknown.join(', ')}` });
}
const persist = db.transaction(() => {
for (const [key, value] of Object.entries(payload)) {
upsert.run(req.user.id, key, String(value));
}
});
persist();
res.json({ ok: true });
});
export default router;