Correction du décalage de timezone de 1h dans Google Calendar
PROBLÈME:
- Les événements s'affichaient avec 1h de décalage
- Événement à 10h → affiché à 11h (ou 09h selon cas)
CAUSE:
- TIMESTAMP (sans timezone) dans PostgreSQL
- Google envoie dates avec timezone info
- PostgreSQL stockait sans timezone
- JavaScript réinterprétait avec timezone local
- = Double application du décalage
SOLUTION:
1. calendar_events: TIMESTAMP → TIMESTAMPTZ
- start_time: TIMESTAMPTZ (conserve timezone)
- end_time: TIMESTAMPTZ (conserve timezone)
2. Migration automatique:
- scripts/migrate-calendar-timezone.js
- Exécuté automatiquement au démarrage Docker
- Convertit les données existantes
- USING start_time AT TIME ZONE 'UTC'
3. Correction booléens all_day:
- Ligne 433: isAllDay ? 1 : 0 → isAllDay
- Ligne 451: isAllDay ? 1 : 0 → isAllDay
FICHIERS MODIFIÉS:
- config/database.js: TIMESTAMPTZ pour calendar_events
- routes/calendar.routes.js: Booléens corrigés
- docker-entrypoint.sh: Migration auto timezone
- migrations/002_calendar_timestamptz.sql: SQL manuel
- scripts/migrate-calendar-timezone.js: Script migration
DÉPLOIEMENT:
Au prochain rebuild Docker:
1. La table sera recréée avec TIMESTAMPTZ
2. Les événements existants seront migrés
3. Les nouvelles synchros utiliseront le bon format
4. Plus de décalage horaire!
Resynchronisez Google Calendar après déploiement
pour appliquer le nouveau format.
Ajout de 2 scripts interactifs pour gérer les données:
1. scripts/restore-sqlite.sh
- Restauration rapide de SQLite (1 commande)
- Désactive PostgreSQL automatiquement
- Redémarre avec les données originales
2. scripts/switch-to-postgres.sh
- Migration complète vers PostgreSQL
- Backup automatique de SQLite
- Migration et vérification des données
- Rollback possible si erreur
Usage:
bash scripts/restore-sqlite.sh # Récupération rapide
bash scripts/switch-to-postgres.sh # Migration complète
Les deux scripts sont interactifs avec confirmation.
Ajout d'outils pour diagnostiquer et récupérer les données:
1. RECUPERATION-DONNEES.md
- Explication de ce qui s'est passé (données non perdues)
- 2 options: rester sur SQLite ou migrer vers PostgreSQL
- Commandes de vérification et debug
2. scripts/check-data.js
- Diagnostic automatique des données
- Affiche contenu SQLite ET PostgreSQL
- Recommandations selon la situation
Utilisation:
node scripts/check-data.js
Les données utilisateur sont dans data/notes.db (148KB)
et peuvent être restaurées immédiatement.
Ajout des outils de migration et documentation:
- scripts/verify-postgres-connection.js: Test connexion PostgreSQL
- scripts/run-migration.sh: Script automatique de migration
- docker-compose.yml: Volume mount pour accès SQLite depuis container
- MIGRATION-STEPS.md: Guide pas-à-pas complet de migration
La migration peut maintenant être lancée avec:
docker-compose build notes-app
docker-compose up -d
bash scripts/run-migration.sh
Problème identifié:
- Le backend récupère les nouveaux articles (logs: "20 nouveaux")
- Mais le frontend ne les affiche jamais
- Les articles étaient chargés UNIQUEMENT au démarrage de la page
- Pas de rafraîchissement automatique
Solution:
- Ajout d'un setInterval qui recharge les articles toutes les 2 minutes
- Synchronisé avec le scheduler backend (aussi 2 minutes)
- Nettoyage automatique à la destruction du composant
Comportement maintenant:
- Chargement initial au démarrage
- Rafraîchissement auto toutes les 2 minutes
- Les nouveaux articles apparaissent dans les 2 minutes max
- Le refresh manuel fonctionne toujours (déjà implémenté)
Script ajouté:
- check-db-now.js: Vérifie le contenu exact de la DB RSS
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
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
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