NOUVEAU SYSTÈME DE LOGGING:
Au lieu d'utiliser les logs Docker (inaccessibles depuis Portainer),
création d'un système de logs accessible directement dans le navigateur.
FICHIERS AJOUTÉS:
1. services/timezone-logger.js:
- Service singleton qui stocke les logs en mémoire
- Limite à 500 logs max (pour éviter les fuites mémoire)
- Méthodes: log(), getLogs(), clearLogs(), getLogsByCategory()
2. routes/timezone-logs.routes.js:
- GET /api/timezone-logs - Logs en JSON
- GET /api/timezone-logs/html - Interface web avec design moderne
- GET /api/timezone-logs/category/:cat - Filtrer par catégorie
- POST /api/timezone-logs/clear - Vider les logs
3. VOIR-LOGS-TIMEZONE.md:
- Documentation complète du système
- Procédure pas à pas
- Explications des logs attendus
FICHIERS MODIFIÉS:
1. config/database.js:
- Utilise timezoneLogger au lieu de logger.debug
- Catégorie: PARSER
2. routes/calendar.routes.js:
- Logs avec timezoneLogger lors de la synchronisation
- Catégorie: SYNC (synchronisation Google Calendar)
- Catégorie: GET (envoi au frontend)
3. server.js:
- Ajout de la route /api/timezone-logs
INTERFACE WEB DE LOGS:
Accessible sur: http://localhost:2222/api/timezone-logs/html
Fonctionnalités:
- ✅ Design moderne avec dégradés et animations
- ✅ Statistiques en temps réel (total, par catégorie)
- ✅ Filtrage par catégorie (SYNC, PARSER, GET)
- ✅ Auto-refresh toutes les 3 secondes
- ✅ Code couleur par catégorie
- ✅ Affichage des données JSON formatées
- ✅ Bouton pour vider les logs
- ✅ Responsive, fonctionne sur mobile
UTILISATION:
1. Rebuild: docker-compose build --no-cache notes-app
2. Ouvrir: http://localhost:2222/api/timezone-logs/html
3. Synchroniser Google Calendar
4. Observer les logs en temps réel dans le navigateur
Plus besoin d'accès aux logs Docker/Portainer !
🐘 NoteFlow utilise maintenant EXCLUSIVEMENT PostgreSQL
CHANGEMENTS MAJEURS:
==================
1. Base de données (config/database.js)
✅ Remplacé par PostgreSQL (backup SQLite créé)
✅ Toutes les routes et services mis à jour
✅ database-loader.js supprimé (plus nécessaire)
2. Migration automatique (docker-entrypoint.sh)
✅ Attend que PostgreSQL soit prêt
✅ Détecte si PostgreSQL est vide
✅ Migre automatiquement SQLite si présent
✅ Lance le serveur après migration
3. Package.json
✅ Description mise à jour (PostgreSQL)
✅ Keywords: postgresql au lieu de sqlite
✅ sqlite3 gardé uniquement pour migration
4. Documentation
✅ POSTGRESQL-ONLY.md: Guide complet PostgreSQL
✅ Commandes, dépannage, sécurité
✅ Instructions de migration
MIGRATION UTILISATEUR:
=====================
Au prochain démarrage Docker:
1. Le container détecte PostgreSQL vide
2. Cherche ./data/notes.db (si existe)
3. Migre AUTOMATIQUEMENT toutes les données
4. Démarre avec PostgreSQL
COMMANDES:
=========
docker-compose build
docker-compose up -d
→ Tout se fait automatiquement!
Les données SQLite sont conservées comme backup dans ./data/
mais l'application n'utilise plus que PostgreSQL.
FICHIERS MODIFIÉS:
=================
- config/database.js (PostgreSQL uniquement)
- docker-entrypoint.sh (migration automatique)
- server.js + 11 routes + 2 services
- package.json (description + keywords)
- Documentation complète: POSTGRESQL-ONLY.md
Cette migration garantit:
- Performance optimale
- Meilleure gestion de la concurrence
- Support production à grande échelle
- Pas de perte de données (migration auto)
CORRECTIF URGENT: L'application chargeait toujours SQLite même avec
PostgreSQL configuré, causant une perte apparente de toutes les données.
Ajout de database-loader.js qui détecte automatiquement:
- DB_TYPE=postgres → PostgreSQL
- DATABASE_URL=postgresql:// → PostgreSQL
- Sinon → SQLite
Tous les routes et services mis à jour pour utiliser database-loader
au lieu de charger directement database.js.
Les données ne sont PAS perdues, elles sont dans PostgreSQL.
L'application se reconnectera correctement après redémarrage.
Fichiers modifiés:
- config/database-loader.js (nouveau)
- server.js
- routes/*.js (11 fichiers)
- services/*.js (2 fichiers)
Problèmes résolus:
- Articles non mis à jour (toujours 12 nov au lieu de 14 nov)
- Détection de doublons défaillante
- Cache trop agressif bloquant les nouveaux articles
- Logique complexe et difficile à déboguer
Architecture V2 (simple et robuste):
**services/rss-scheduler-v2.js**
- Détection doublons SIMPLE: uniquement par lien
- Pas de double vérification titre+date (trop complexe)
- Nettoyage automatique (garde les 100 derniers)
- Logs clairs pour chaque étape
- Fetch séquentiel pour éviter les races
- Timeout robuste (15s par flux)
**routes/rss.routes-v2.js**
- Suppression du cache de 30s
- Requêtes SQL directes simples
- Pas de logique de filtre temporel compliquée
- Endpoint /refresh déclenche un fetch immédiat
- Logs cohérents
**Scripts utilitaires**
- reset-rss.js: Nettoie complètement la DB RSS
- migrate-to-rss-v2.js: Migre de V1 à V2
- Plus tous les scripts de debug existants
Backups:
- rss-scheduler.js.backup (ancien système)
- rss.routes.js.backup (ancien système)
Migration:
1. node scripts/reset-rss.js (optionnel, nettoie la DB)
2. Redémarrer le serveur
3. Ajouter les flux RSS via l'interface
4. Les articles seront récupérés toutes les 2 minutes
Résultat attendu:
- Les nouveaux articles apparaissent dans les 2 minutes
- Pas de doublons même avec liens changeants
- Affichage du plus récent au plus ancien
- Système simple, maintenable et debuggable
Problème identifié :
- Les liens Google News changent à chaque requête (tracking)
- Les mêmes articles étaient considérés comme nouveaux
- Empêchait l'ajout des vrais nouveaux articles (13 nov)
Solution :
- Double vérification : par lien ET par titre+date
- Évite les doublons même si le lien change
- Permet d'ajouter les vrais nouveaux articles
Détails techniques :
- Vérifie existingByLink (contrainte UNIQUE de la DB)
- Vérifie existingByTitleDate (même titre + même jour)
- N'ajoute que si les deux vérifications échouent
- Normalise pubDate avant comparaison
Scripts ajoutés :
- debug-rss-fetch.js : Debug détaillé de la récupération
- cleanup-duplicates.js : Analyse et nettoyage des doublons
- 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.
Problème:
L'utilisateur signale que les articles RSS ne se mettent pas à jour -
"toujours les mêmes articles depuis ce matin, pas de changement d'affichage".
Causes identifiées:
1. Le scheduler RSS s'exécutait toutes les 5 minutes (peut-être trop long)
2. Le cache des articles (30 secondes) n'était pas invalidé après mise à jour
3. Pas assez de logs pour diagnostiquer les problèmes
Solutions appliquées:
1. **Fréquence augmentée du scheduler** (services/rss-scheduler.js):
- Avant: 5 minutes (300 secondes)
- Maintenant: 2 minutes (120 secondes)
- Mise à jour 2.5x plus fréquente des flux RSS
- Log au démarrage: "mise à jour toutes les 2 minutes"
2. **Invalidation automatique du cache** (services/rss-scheduler.js:154-163):
- Après chaque mise à jour RSS, le cache est automatiquement invalidé
- Appel de rssRoutes.invalidateCache() après fetchAllFeeds()
- Log: "Cache des articles RSS invalidé"
- Garantit que les nouveaux articles sont immédiatement disponibles
3. **Export de la fonction invalidateCache** (routes/rss.routes.js:161-165):
- Nouvelle fonction exportée pour invalidation externe
- Utilisée par le scheduler après chaque mise à jour
- Garantit synchronisation entre scheduler et API
Changements:
- services/rss-scheduler.js:
* Ligne 176: Intervalle réduit de 5 min à 2 min
* Lignes 154-163: Invalidation du cache après mise à jour
* Logs améliorés avec durée et stats
- routes/rss.routes.js:
* Lignes 158-165: Fonction invalidateCache() exportée
* Ligne 399: Export de invalidateCache en tant que propriété
* Cache invalidé automatiquement après mises à jour scheduler
Comportement attendu:
- Nouvea
ux articles récupérés toutes les 2 minutes
- Cache invalidé automatiquement après chaque mise à jour
- Articles frais disponibles immédiatement après synchronisation
- Logs détaillés pour diagnostic (nombre d'articles, durée, erreurs)
L'utilisateur devrait voir de nouveaux articles maximum 2 minutes après
leur publication dans les flux RSS.
Améliorations majeures de la fluidité de l'application :
RSS Auto-Initialization:
- Auto-initialisation de 3 flux français par défaut (Le Monde, BBC, Le Figaro)
- Lancement automatique au premier démarrage du serveur
- Timeout protection (15s) pour parsing RSS
- Logging détaillé avec emojis pour meilleur suivi
Visual Feedback System:
- Skeleton loaders CSS pour performance perçue améliorée
- Indicateur de rafraîchissement (top-right) pendant mises à jour RSS
- Loading spinners animés
- Animations fade-in fluides
- Empty states avec styles appropriés
Diagnostic Tools:
- Script diagnose-rss.js pour troubleshooting
- Affiche état complet: feeds, articles, résumés, settings
- Auto-initialise la base de données si nécessaire
Client Improvements:
- Fonctions showRefreshIndicator() / hideRefreshIndicator()
- Indicateur visuel pendant auto-refresh toutes les 30s
- Meilleure gestion des erreurs avec feedback visuel
Files modified:
- services/rss-scheduler.js: initializeDefaultFeeds()
- public/css/skeleton.css: NEW - Complete visual feedback system
- public/index.html: Added skeleton.css + refresh indicator
- public/js/complete-app.js: Visual feedback functions
- scripts/diagnose-rss.js: NEW - RSS diagnostic tool
User impact:
✓ Flux RSS automatiquement peuplés au premier lancement
✓ Interface plus fluide avec indicateurs visuels
✓ Performance perçue grandement améliorée
✓ Auto-refresh transparent toutes les 30s
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