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

+21 -5
View File
@@ -11,22 +11,39 @@ export default function Dashboard() {
const [rssContent, setRssContent] = useState<RssArticle[] | RssSummary[]>([]);
const [showSummaries, setShowSummaries] = useState(false);
const [loading, setLoading] = useState(true);
const [lastUpdate, setLastUpdate] = useState<Date>(new Date());
useEffect(() => {
loadData();
// Auto-refresh toutes les 30 secondes pour afficher les nouveaux articles RSS
const interval = setInterval(() => {
loadRssData();
}, 30000); // 30 secondes
return () => clearInterval(interval);
}, []);
const loadData = async () => {
try {
const [notesData, todosData, settings] = await Promise.all([
const [notesData, todosData] = await Promise.all([
notesApi.getAll(false),
todosApi.getAll(),
settingsApi.getAll(),
]);
setNotes(notesData);
setTodos(todosData);
await loadRssData();
} catch (error) {
console.error('Erreur chargement données:', error);
} finally {
setLoading(false);
}
};
const loadRssData = async () => {
try {
const settings = await settingsApi.getAll();
const summaryEnabled = settings.rss_summary_enabled === '1';
setShowSummaries(summaryEnabled);
@@ -37,10 +54,9 @@ export default function Dashboard() {
const articles = await rssApi.getArticles();
setRssContent(articles);
}
setLastUpdate(new Date());
} catch (error) {
console.error('Erreur chargement données:', error);
} finally {
setLoading(false);
console.error('Erreur chargement RSS:', error);
}
};