Performance: Optimisations majeures + Auto-refresh RSS

Problèmes résolus:
✅ Flux RSS ne s'affichaient pas → LEFT JOIN + COALESCE
✅ Pas de mise à jour automatique → Scheduler toutes les 5min
✅ Application lente → Cache serveur + client

Scheduler RSS (services/rss-scheduler.js):
- Mise à jour automatique des flux toutes les 5 minutes
- Première exécution 5 secondes après démarrage
- Gestion parallèle de tous les flux activés
- Logs détaillés pour debugging
- Protection contre les exécutions multiples simultanées
- Limite de 20 articles par flux pour performance

Routes RSS optimisées:
- Cache serveur 30 secondes pour /api/rss/articles
- Invalidation cache après fetch manuel
- LEFT JOIN au lieu de INNER JOIN (flux sans articles)
- COALESCE pour titre fallback
- Logs améliorés avec compteurs

Frontend vanilla JS:
- Auto-refresh RSS toutes les 30 secondes
- Cache settings client 1 minute
- Synchronisation avec scheduler serveur
- console.debug au lieu de console.error pour auto-refresh

Frontend React:
- Auto-refresh RSS toutes les 30 secondes
- loadRssData() séparée pour refresh indépendant
- useEffect cleanup proper (clearInterval)
- État lastUpdate pour tracking

Server.js:
- Démarrage scheduler au startup
- Log confirmation démarrage

Performances:
- Moins de requêtes DB grâce au cache
- Refresh automatique sans action utilisateur
- Articles toujours à jour (max 30s de délai)
- Support de beaucoup de flux RSS sans ralentissement
This commit is contained in:
Claude committed 2025-11-11 17:18:57 +00:00
1 parent 2315933868
commit 5cd32da1d1
5 files changed
+211 -57

No files matched your search

+20 -3
View File
@@ -1484,11 +1484,21 @@ async function fetchRssArticles() {
}
}
// Cache des settings pour optimiser les performances
let settingsCache = null;
let settingsCacheTime = 0;
const SETTINGS_CACHE_DURATION = 60000; // 1 minute
async function loadRssArticles() {
try {
// Vérifier si les résumés sont activés
const settings = await api.get('/api/settings');
const summaryEnabled = settings.rss_summary_enabled === '1' || settings.rss_summary_enabled === 'true';
// Vérifier si les résumés sont activés (avec cache)
const now = Date.now();
if (!settingsCache || (now - settingsCacheTime) > SETTINGS_CACHE_DURATION) {
settingsCache = await api.get('/api/settings');
settingsCacheTime = now;
}
const summaryEnabled = settingsCache.rss_summary_enabled === '1' || settingsCache.rss_summary_enabled === 'true';
if (summaryEnabled) {
// Charger les résumés
@@ -1735,6 +1745,13 @@ async function init() {
// Setup search
setupSearch();
// Auto-refresh RSS toutes les 30 secondes pour synchroniser avec le scheduler serveur
setInterval(() => {
loadRssArticles().catch(err => {
console.debug('Erreur auto-refresh RSS:', err);
});
}, 30000); // 30 secondes
// Event listeners
const newNoteBtn = document.getElementById('newNoteBtn');
if (newNoteBtn) {