mirror of
https://github.com/R0m1k3/noteflow.git
synced 2026-10-11 17:29:37 +02:00
🐘 NoteFlow utilise maintenant EXCLUSIVEMENT PostgreSQL CHANGEMENTS MAJEURS: ================== 1. Base de données (config/database.js) ✅ Remplacé par PostgreSQL (backup SQLite créé) ✅ Toutes les routes et services mis à jour ✅ database-loader.js supprimé (plus nécessaire) 2. Migration automatique (docker-entrypoint.sh) ✅ Attend que PostgreSQL soit prêt ✅ Détecte si PostgreSQL est vide ✅ Migre automatiquement SQLite si présent ✅ Lance le serveur après migration 3. Package.json ✅ Description mise à jour (PostgreSQL) ✅ Keywords: postgresql au lieu de sqlite ✅ sqlite3 gardé uniquement pour migration 4. Documentation ✅ POSTGRESQL-ONLY.md: Guide complet PostgreSQL ✅ Commandes, dépannage, sécurité ✅ Instructions de migration MIGRATION UTILISATEUR: ===================== Au prochain démarrage Docker: 1. Le container détecte PostgreSQL vide 2. Cherche ./data/notes.db (si existe) 3. Migre AUTOMATIQUEMENT toutes les données 4. Démarre avec PostgreSQL COMMANDES: ========= docker-compose build docker-compose up -d → Tout se fait automatiquement! Les données SQLite sont conservées comme backup dans ./data/ mais l'application n'utilise plus que PostgreSQL. FICHIERS MODIFIÉS: ================= - config/database.js (PostgreSQL uniquement) - docker-entrypoint.sh (migration automatique) - server.js + 11 routes + 2 services - package.json (description + keywords) - Documentation complète: POSTGRESQL-ONLY.md Cette migration garantit: - Performance optimale - Meilleure gestion de la concurrence - Support production à grande échelle - Pas de perte de données (migration auto)
137 lines
4.0 KiB
JavaScript
137 lines
4.0 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 = ?', [key]);
|
|
|
|
if (existing) {
|
|
await runQuery(
|
|
'UPDATE settings SET value = ?, updated_at = CURRENT_TIMESTAMP WHERE key = ?',
|
|
[value, key]
|
|
);
|
|
} else {
|
|
await runQuery(
|
|
'INSERT INTO settings (key, value) VALUES (?, ?)',
|
|
[key, value]
|
|
);
|
|
}
|
|
}
|
|
|
|
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 = ?', [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 = ?', [req.params.key]);
|
|
|
|
if (existing) {
|
|
await runQuery(
|
|
'UPDATE settings SET value = ?, updated_at = CURRENT_TIMESTAMP WHERE key = ?',
|
|
[value, req.params.key]
|
|
);
|
|
} else {
|
|
await runQuery(
|
|
'INSERT INTO settings (key, value) VALUES (?, ?)',
|
|
[req.params.key, value]
|
|
);
|
|
}
|
|
|
|
logger.info(`Paramètre mis à jour: ${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 = ?', [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;
|