mirror of
https://github.com/R0m1k3/noteflow.git
synced 2026-10-11 17:29:37 +02:00
Fix: Affichage articles RSS du plus récent au plus ancien
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
This commit is contained in:
4 files changed
+238
-2
No files matched your search
@@ -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();
|
||||||
@@ -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();
|
||||||
@@ -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();
|
||||||
+2
-2
@@ -187,8 +187,8 @@ const Index = () => {
|
|||||||
try {
|
try {
|
||||||
const articles = await RssService.getArticles(100);
|
const articles = await RssService.getArticles(100);
|
||||||
if (Array.isArray(articles)) {
|
if (Array.isArray(articles)) {
|
||||||
// Inverser pour afficher les anciens articles en premier
|
// Les articles arrivent triés par date DESC (récent en premier) depuis le backend
|
||||||
setRssArticles([...articles].reverse());
|
setRssArticles(articles);
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("Erreur lors du chargement des articles RSS:", error);
|
console.error("Erreur lors du chargement des articles RSS:", error);
|
||||||
|
|||||||
Reference in new issue
Block a user