Files
noteflow/routes/settings.routes.js
T
Claude e3755d273d Backend: Système complet RSS + OpenRouter + Administration améliorée
## Base de données:
- Table settings (key-value pour paramètres globaux)
- Table rss_feeds (url, title, description, enabled, last_fetched_at)
- Table rss_articles (feed_id, title, link, description, pub_date, content)
- Index optimisés pour performance

## Routes Settings (/api/settings):
- GET /api/settings - Récupérer tous les paramètres
- GET /api/settings/:key - Récupérer un paramètre
- PUT /api/settings/:key - Mettre à jour un paramètre
- DELETE /api/settings/:key - Supprimer un paramètre
- Middleware requireAdmin sur toutes les routes

## Routes RSS (/api/rss):
- GET /api/rss/feeds - Liste des flux RSS (admin)
- POST /api/rss/feeds - Ajouter flux RSS avec parsing validation (admin)
- PUT /api/rss/feeds/:id - Activer/désactiver flux (admin)
- DELETE /api/rss/feeds/:id - Supprimer flux (admin)
- POST /api/rss/fetch - Récupérer articles de tous flux actifs (admin)
- GET /api/rss/articles - Récupérer 10 derniers articles (tous users)
- POST /api/rss/summarize - Générer résumé OpenRouter (admin)
- GET /api/rss/models - Liste modèles OpenRouter (admin)

## Intégration OpenRouter:
- Appel API avec clé, modèle et prompt configurables
- Résumé intelligent des 10 derniers articles
- Prompt par défaut optimisé pour résumés d'actualités
- Support GPT-4, Claude 3, Gemini, Llama 3, Mistral, etc.
- Gestion erreurs et timeout

## Parser RSS:
- rss-parser installé pour parsing flux
- Gestion articles avec contenu, description, date
- Détection doublons par URL
- Update automatique infos flux

## Frontend HTML:
- Modal admin avec système à onglets (Users/RSS/OpenRouter)
- Modal changement mot de passe sans prompt navigateur
- Box RSS dans page principale affichage 10 derniers articles
- Bouton résumé IA dans header box RSS
- Inputs pour gestion flux RSS
- Configuration OpenRouter (API key, modèle, prompt, activation)
- Sélecteur modèles avec recherche

Prochaine étape: CSS + JavaScript pour fonctionnalités
2025-11-11 15:52:39 +00:00

100 lines
2.9 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' });
}
});
/**
* 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;