From 7a09925cf08e1d46d4c887b171270f028e4ff032 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 13 Nov 2025 16:54:23 +0000 Subject: [PATCH] =?UTF-8?q?Fix:=20Augmentation=20limites=20r=C3=A9cup?= =?UTF-8?q?=C3=A9ration=20articles=20RSS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Augmente limite par défaut de 5 à 50 articles dans /api/rss/articles - Ajoute paramètre optionnel 'hours' pour filtrer par période (ex: ?hours=24) - Augmente limite de récupération par flux de 20 à 100 articles - Améliore le logging pour afficher les paramètres appliqués - Désactive le cache lors de l'utilisation du filtre temporel Résout le problème où toujours les mêmes articles étaient affichés malgré plus de 100 nouveaux articles disponibles dans les flux. --- routes/rss.routes.js | 53 ++++++++++++++++++++++++++++----------- services/rss-scheduler.js | 4 +-- 2 files changed, 40 insertions(+), 17 deletions(-) diff --git a/routes/rss.routes.js b/routes/rss.routes.js index 9546435..64e2a1f 100644 --- a/routes/rss.routes.js +++ b/routes/rss.routes.js @@ -166,35 +166,58 @@ function invalidateCache() { /** * GET /api/rss/articles - * Récupérer les articles RSS (avec cache et paramètre limit) + * Récupérer les articles RSS (avec cache et paramètres limit et hours) + * @query limit - Nombre d'articles à récupérer (défaut: 50) + * @query hours - Récupérer uniquement les articles des X dernières heures (défaut: tous) */ router.get('/articles', async (req, res) => { try { - const limit = parseInt(req.query.limit) || 5; + const limit = parseInt(req.query.limit) || 50; // Augmenté de 5 à 50 + const hours = parseInt(req.query.hours) || null; - // Utiliser le cache si disponible et récent - const now = Date.now(); - if (articlesCache && (now - articlesCacheTime) < ARTICLES_CACHE_DURATION) { - logger.debug('Articles RSS servis depuis le cache'); - return res.json(articlesCache.slice(0, limit)); - } - - const articles = await getAll(` + // Construire la requête SQL avec filtre temporel optionnel + let query = ` SELECT a.id, a.title, a.link, a.description, a.pub_date, a.content, COALESCE(f.title, f.url) as feed_title, f.url as feed_url FROM rss_articles a LEFT JOIN rss_feeds f ON a.feed_id = f.id WHERE a.pub_date IS NOT NULL + `; + + const params = []; + + // Ajouter un filtre temporel si spécifié + if (hours) { + query += ` AND datetime(a.pub_date) >= datetime('now', '-${hours} hours')`; + logger.debug(`Filtre appliqué: articles des ${hours} dernières heures`); + } + + query += ` ORDER BY a.pub_date DESC LIMIT ? - `, [limit]); + `; + params.push(limit); - // Mettre en cache - articlesCache = articles || []; - articlesCacheTime = now; + // Ne pas utiliser le cache si un filtre temporel est appliqué + if (!hours) { + // Utiliser le cache si disponible et récent + const now = Date.now(); + if (articlesCache && (now - articlesCacheTime) < ARTICLES_CACHE_DURATION) { + logger.debug('Articles RSS servis depuis le cache'); + return res.json(articlesCache.slice(0, limit)); + } + } - logger.info(`Articles RSS récupérés: ${articles?.length || 0}`); + const articles = await getAll(query, params); + + // Mettre en cache uniquement si pas de filtre temporel + if (!hours) { + articlesCache = articles || []; + articlesCacheTime = Date.now(); + } + + logger.info(`Articles RSS récupérés: ${articles?.length || 0} (limit: ${limit}${hours ? `, ${hours}h` : ''})`); res.json(articles || []); } catch (error) { logger.error('Erreur lors de la récupération des articles RSS:', error); diff --git a/services/rss-scheduler.js b/services/rss-scheduler.js index c492884..bb04b18 100644 --- a/services/rss-scheduler.js +++ b/services/rss-scheduler.js @@ -106,8 +106,8 @@ async function fetchAllFeeds() { [parsedFeed.title || feed.url, parsedFeed.description || '', feed.id] ); - // Ajouter les articles (limiter à 20 par flux pour ne pas surcharger) - const items = parsedFeed.items.slice(0, 20); + // Ajouter les articles (limiter à 100 par flux pour capturer plus d'articles) + const items = parsedFeed.items.slice(0, 100); let feedArticles = 0; for (const item of items) {