Initial commit
This commit is contained in:
@@ -0,0 +1,62 @@
|
||||
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;
|
||||
Reference in New Issue
Block a user