From 87d50920d7c5fcc718659d3b18e6495ca844a528 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 13 Nov 2025 18:54:53 +0000 Subject: [PATCH] =?UTF-8?q?Fix:=20Affichage=20articles=20RSS=20du=20plus?= =?UTF-8?q?=20r=C3=A9cent=20au=20plus=20ancien?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Correction de l'ordre d'affichage : - Supprime le .reverse() dans loadRssArticles() - Les articles s'affichent maintenant du plus récent au plus ancien - Correspond au comportement standard d'un lecteur RSS Résout le problème où les nouveaux articles (13 nov) étaient à la fin et nécessitaient de paginer jusqu'à la dernière page. Maintenant les articles les plus récents apparaissent en premier. Ajout de scripts utilitaires : - check-rss-dates.js : Vérifie les dates des articles en DB - init-rss-feeds.js : Initialise des flux RSS par défaut - force-refresh-rss.js : Force une mise à jour manuelle --- scripts/check-rss-dates.js | 74 +++++++++++++++++++++++++ scripts/force-refresh-rss.js | 58 +++++++++++++++++++ scripts/init-rss-feeds.js | 104 +++++++++++++++++++++++++++++++++++ src/pages/Index.tsx | 4 +- 4 files changed, 238 insertions(+), 2 deletions(-) create mode 100644 scripts/check-rss-dates.js create mode 100644 scripts/force-refresh-rss.js create mode 100644 scripts/init-rss-feeds.js diff --git a/scripts/check-rss-dates.js b/scripts/check-rss-dates.js new file mode 100644 index 0000000..049f7ae --- /dev/null +++ b/scripts/check-rss-dates.js @@ -0,0 +1,74 @@ +// Script pour vérifier les dates des articles RSS +const { getAll, initDatabase } = require('../config/database'); + +async function checkRssDates() { + console.log('\n==================== VÉRIFICATION DATES RSS ====================\n'); + + try { + await initDatabase(); + + // Vérifier le nombre total d'articles + const total = await getAll('SELECT COUNT(*) as count FROM rss_articles'); + console.log(`📊 Total articles en base: ${total[0]?.count || 0}\n`); + + // Vérifier les 10 derniers articles par date + const recent = await getAll(` + SELECT + a.title, + a.pub_date, + a.created_at, + f.title as feed_title, + a.link + FROM rss_articles a + LEFT JOIN rss_feeds f ON a.feed_id = f.id + ORDER BY a.pub_date DESC + LIMIT 10 + `); + + console.log('📅 10 articles les plus récents (par pub_date):'); + recent.forEach((article, i) => { + const pubDate = new Date(article.pub_date); + const createdDate = new Date(article.created_at); + console.log(`\n${i + 1}. ${article.title}`); + console.log(` Source: ${article.feed_title || 'Inconnu'}`); + console.log(` Date publication: ${pubDate.toLocaleString('fr-FR')}`); + console.log(` Date ajout DB: ${createdDate.toLocaleString('fr-FR')}`); + }); + + // Vérifier les flux + console.log('\n\n📰 Flux RSS configurés:'); + const feeds = await getAll('SELECT * FROM rss_feeds WHERE enabled = 1'); + feeds.forEach(feed => { + console.log(`\n- ${feed.title || feed.url}`); + console.log(` URL: ${feed.url}`); + console.log(` Dernière mise à jour: ${feed.last_fetched_at || 'jamais'}`); + }); + + // Compter articles par flux + console.log('\n\n📈 Articles par flux:'); + const counts = await getAll(` + SELECT + f.title, + COUNT(a.id) as count, + MAX(a.pub_date) as latest + FROM rss_feeds f + LEFT JOIN rss_articles a ON f.id = a.feed_id + WHERE f.enabled = 1 + GROUP BY f.id + `); + counts.forEach(c => { + const latest = c.latest ? new Date(c.latest).toLocaleString('fr-FR') : 'aucun'; + console.log(`\n${c.title}: ${c.count} articles`); + console.log(` Plus récent: ${latest}`); + }); + + console.log('\n\n========================================================\n'); + + } catch (error) { + console.error('❌ Erreur:', error); + } + + process.exit(0); +} + +checkRssDates(); diff --git a/scripts/force-refresh-rss.js b/scripts/force-refresh-rss.js new file mode 100644 index 0000000..29bd9fb --- /dev/null +++ b/scripts/force-refresh-rss.js @@ -0,0 +1,58 @@ +// Script pour forcer la mise à jour des flux RSS et afficher les résultats +const { fetchAllFeeds } = require('../services/rss-scheduler'); +const { getAll } = require('../config/database'); +const logger = require('../config/logger'); + +async function forceRefresh() { + console.log('\n==================== MISE À JOUR FORCÉE RSS ====================\n'); + + try { + console.log('⏳ Lancement de la mise à jour...\n'); + + // Forcer la mise à jour + await fetchAllFeeds(); + + console.log('\n📊 Vérification de la base de données...\n'); + + // Afficher les statistiques + const total = await getAll('SELECT COUNT(*) as count FROM rss_articles'); + console.log(`📄 Total articles: ${total[0]?.count || 0}`); + + // Afficher les 10 derniers + const recent = await getAll(` + SELECT + a.title, + a.pub_date, + f.title as feed_title + FROM rss_articles a + LEFT JOIN rss_feeds f ON a.feed_id = f.id + ORDER BY a.pub_date DESC + LIMIT 10 + `); + + if (recent.length > 0) { + console.log('\n📅 10 articles les plus récents:\n'); + recent.forEach((article, i) => { + const pubDate = new Date(article.pub_date); + const now = new Date(); + const diffHours = Math.round((now - pubDate) / (1000 * 60 * 60)); + + console.log(`${i + 1}. ${article.title}`); + console.log(` Source: ${article.feed_title || 'Inconnu'}`); + console.log(` Date: ${pubDate.toLocaleString('fr-FR')} (il y a ${diffHours}h)`); + console.log(''); + }); + } else { + console.log('\n⚠️ Aucun article dans la base de données'); + } + + console.log('========================================================\n'); + + } catch (error) { + console.error('❌ Erreur:', error); + } + + process.exit(0); +} + +forceRefresh(); diff --git a/scripts/init-rss-feeds.js b/scripts/init-rss-feeds.js new file mode 100644 index 0000000..870b0c5 --- /dev/null +++ b/scripts/init-rss-feeds.js @@ -0,0 +1,104 @@ +// Script pour initialiser des flux RSS par défaut +const Parser = require('rss-parser'); +const { getAll, runQuery, initDatabase } = require('../config/database'); +const logger = require('../config/logger'); + +const parser = new Parser({ + timeout: 10000, + headers: { + 'User-Agent': 'NoteFlow RSS Reader' + } +}); + +const DEFAULT_FEEDS = [ + 'https://news.google.com/rss/search?tbm=nws&q=NBA&oq=NBA&scoring=n&hl=fr&gl=FR&ceid=FR:fr', + 'https://dwh.lequipe.fr/api/edito/rss?path=/Basket/Nba/', + 'https://fresh.vonrodbox.eu/i/?a=rss&user=Michael&token=Lapin2509&hours=168' +]; + +async function initFeeds() { + console.log('\n==================== INITIALISATION FLUX RSS ====================\n'); + + try { + await initDatabase(); + + // Vérifier les flux existants + const existing = await getAll('SELECT * FROM rss_feeds'); + console.log(`📰 Flux existants: ${existing.length}\n`); + + for (const url of DEFAULT_FEEDS) { + try { + // Vérifier si le flux existe déjà + const exists = existing.find(f => f.url === url); + if (exists) { + console.log(`⏭️ Flux déjà présent: ${exists.title || url}`); + continue; + } + + console.log(`⏳ Ajout du flux: ${url}`); + + // Parser le flux + const feed = await parser.parseURL(url); + + // Ajouter le flux + const result = await runQuery( + 'INSERT INTO rss_feeds (url, title, description, enabled) VALUES (?, ?, ?, 1)', + [url, feed.title || url, feed.description || ''] + ); + + console.log(`✅ Flux ajouté: ${feed.title}`); + console.log(` Articles disponibles: ${feed.items.length}`); + + // Ajouter les articles (limiter à 100) + const items = feed.items.slice(0, 100); + let addedCount = 0; + + for (const item of items) { + try { + if (!item.link) continue; + + await runQuery( + 'INSERT INTO rss_articles (feed_id, title, link, description, pub_date, content) VALUES (?, ?, ?, ?, ?, ?)', + [ + result.id, + item.title || 'Sans titre', + item.link, + item.contentSnippet || item.description || '', + item.pubDate || item.isoDate || new Date().toISOString(), + item.content || item['content:encoded'] || '' + ] + ); + addedCount++; + } catch (err) { + // Ignorer les doublons + if (!err.message.includes('UNIQUE')) { + console.log(` ⚠️ Article ignoré: ${err.message}`); + } + } + } + + console.log(` Articles ajoutés: ${addedCount}\n`); + + } catch (error) { + console.error(`❌ Erreur avec ${url}:`, error.message, '\n'); + } + } + + // Résumé final + const finalFeeds = await getAll('SELECT COUNT(*) as count FROM rss_feeds WHERE enabled = 1'); + const finalArticles = await getAll('SELECT COUNT(*) as count FROM rss_articles'); + + console.log('========================================================'); + console.log(`✅ Initialisation terminée!`); + console.log(`📰 Flux actifs: ${finalFeeds[0].count}`); + console.log(`📄 Articles en base: ${finalArticles[0].count}`); + console.log('========================================================\n'); + + } catch (error) { + console.error('❌ Erreur lors de l\'initialisation:', error); + } + + process.exit(0); +} + +initFeeds(); diff --git a/src/pages/Index.tsx b/src/pages/Index.tsx index e21994a..d41077b 100644 --- a/src/pages/Index.tsx +++ b/src/pages/Index.tsx @@ -187,8 +187,8 @@ const Index = () => { try { const articles = await RssService.getArticles(100); if (Array.isArray(articles)) { - // Inverser pour afficher les anciens articles en premier - setRssArticles([...articles].reverse()); + // Les articles arrivent triés par date DESC (récent en premier) depuis le backend + setRssArticles(articles); } } catch (error) { console.error("Erreur lors du chargement des articles RSS:", error);