Files
noteflow/routes/settings.routes.js
T
Claude 76b91788b7 Fix: Correction du bug d'écrasement de notes lors de la création
Problème identifié :
- Quand une nouvelle note était créée, elle écrasait la première note existante
- La fonction runQuery() dans database-postgres.js retournait rowCount (1) au lieu de l'ID réel
- Les requêtes INSERT n'utilisaient pas RETURNING pour récupérer l'ID généré

Solution implémentée :
1. Ajout de RETURNING * à toutes les requêtes INSERT dans :
   - routes/notes.routes.js (notes, todos, images, fichiers, tags)
   - routes/todos.routes.js (todos globaux)
   - routes/users.routes.js (utilisateurs)
   - routes/rss.routes.js (flux RSS, résumés)
   - routes/settings.routes.js (paramètres)
   - routes/calendar.routes.js (événements, tokens OAuth)

2. Modification de runQuery() pour :
   - Retourner la ligne complète si RETURNING est présent
   - Inclure tous les champs de la ligne insérée (spread operator)
   - Ajouter des logs détaillés pour le debugging

3. Ajout de logs détaillés pour tracer :
   - Chaque création d'entité avec ses paramètres
   - L'ID retourné après insertion
   - Les erreurs potentielles

Impact :
- Les nouvelles notes ont maintenant leur vrai ID auto-incrémenté
- Plus d'écrasement des notes existantes
- Meilleure traçabilité avec les logs détaillés
2025-11-17 07:34:12 +00:00

140 lines
4.4 KiB
JavaScript

// Routes de gestion des paramètres
const express = require('express');
const router = express.Router();
const { getAll, getOne, runQuery } = require('../config/database');
const { authenticateToken, requireAdmin } = require('../middleware/auth');
const logger = require('../config/logger');
// Toutes les routes nécessitent authentification admin
router.use(authenticateToken);
router.use(requireAdmin);
/**
* GET /api/settings
* Récupérer tous les paramètres
*/
router.get('/', async (req, res) => {
try {
const settings = await getAll('SELECT key, value FROM settings');
// Convertir en objet key-value
const settingsObj = {};
settings.forEach(setting => {
settingsObj[setting.key] = setting.value;
});
res.json(settingsObj);
} catch (error) {
logger.error('Erreur lors de la récupération des paramètres:', error);
res.status(500).json({ error: 'Erreur serveur' });
}
});
/**
* PUT /api/settings
* Mettre à jour plusieurs paramètres en une fois
*/
router.put('/', async (req, res) => {
try {
const settings = req.body;
// Mettre à jour chaque paramètre
for (const [key, value] of Object.entries(settings)) {
// Ignorer les valeurs undefined ou null
if (value === undefined || value === null) continue;
// Vérifier si le paramètre existe
const existing = await getOne('SELECT id FROM settings WHERE key = $1', [key]);
if (existing) {
await runQuery(
'UPDATE settings SET value = $1, updated_at = CURRENT_TIMESTAMP WHERE key = $2',
[value, key]
);
} else {
logger.info(`[CREATE SETTING] Ajout nouveau paramètre - key: "${key}"`);
await runQuery(
'INSERT INTO settings (key, value) VALUES ($1, $2) RETURNING *',
[key, value]
);
logger.info(`[CREATE SETTING] Paramètre créé avec succès - key: "${key}"`);
}
}
logger.info(`${Object.keys(settings).length} paramètres mis à jour`);
res.json({ message: 'Paramètres mis à jour avec succès' });
} catch (error) {
logger.error('Erreur lors de la mise à jour des paramètres:', error);
res.status(500).json({ error: 'Erreur serveur' });
}
});
/**
* GET /api/settings/:key
* Récupérer un paramètre spécifique
*/
router.get('/:key', async (req, res) => {
try {
const setting = await getOne('SELECT value FROM settings WHERE key = $1', [req.params.key]);
if (!setting) {
return res.status(404).json({ error: 'Paramètre non trouvé' });
}
res.json({ key: req.params.key, value: setting.value });
} catch (error) {
logger.error('Erreur lors de la récupération du paramètre:', error);
res.status(500).json({ error: 'Erreur serveur' });
}
});
/**
* PUT /api/settings/:key
* Mettre à jour un paramètre
*/
router.put('/:key', async (req, res) => {
try {
const { value } = req.body;
// Vérifier si le paramètre existe
const existing = await getOne('SELECT id FROM settings WHERE key = $1', [req.params.key]);
if (existing) {
await runQuery(
'UPDATE settings SET value = $1, updated_at = CURRENT_TIMESTAMP WHERE key = $2',
[value, req.params.key]
);
logger.info(`Paramètre mis à jour: ${req.params.key}`);
} else {
logger.info(`[CREATE SETTING] Ajout nouveau paramètre - key: "${req.params.key}"`);
await runQuery(
'INSERT INTO settings (key, value) VALUES ($1, $2) RETURNING *',
[req.params.key, value]
);
logger.info(`[CREATE SETTING] Paramètre créé avec succès - key: "${req.params.key}"`);
}
res.json({ key: req.params.key, value });
} catch (error) {
logger.error('Erreur lors de la mise à jour du paramètre:', error);
res.status(500).json({ error: 'Erreur serveur' });
}
});
/**
* DELETE /api/settings/:key
* Supprimer un paramètre
*/
router.delete('/:key', async (req, res) => {
try {
await runQuery('DELETE FROM settings WHERE key = $1', [req.params.key]);
logger.info(`Paramètre supprimé: ${req.params.key}`);
res.json({ message: 'Paramètre supprimé avec succès' });
} catch (error) {
logger.error('Erreur lors de la suppression du paramètre:', error);
res.status(500).json({ error: 'Erreur serveur' });
}
});
module.exports = router;