mirror of
https://github.com/R0m1k3/noteflow.git
synced 2026-10-24 15:48:16 +02:00
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
This commit is contained in:
7 files changed
+744
-19
No files matched your search
@@ -0,0 +1,99 @@
|
||||
// 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;
|
||||
Reference in new issue
Block a user