mirror of
https://github.com/R0m1k3/noteflow.git
synced 2026-10-12 01:39:47 +02:00
Problème: Décalage d'1 heure persistant malgré types.setTypeParser Cause probable: Container pas rebuild avec le fix database.js Ajouts: 1. scripts/check-calendar-timezone.js - Diagnostic complet timezone PostgreSQL/Node.js - Vérifie si types.setTypeParser(1184) fonctionne - Affiche type de données retourné (string vs Date object) - Compare valeurs SQL brutes avec valeurs JS 2. CALENDAR_TIMEZONE_FIX.md - Documentation complète du problème - Procédure de fix étape par étape - Explication technique de la cause - Historique des tentatives Utilisation: ```bash # 1. Diagnostic node scripts/check-calendar-timezone.js # 2. Si Date object au lieu de string: docker-compose build --no-cache notes-app docker-compose up -d # 3. Resynchroniser calendrier depuis UI ``` Le fix types.setTypeParser(1184) est déjà en place dans database.js mais nécessite un rebuild du container pour être actif.
3.9 KiB
3.9 KiB
Fix Décalage Horaire Calendrier
Problème
Les événements du calendrier Google s'affichent avec 1 heure de décalage dans NoteFlow.
Cause Racine
Le driver PostgreSQL (pg) convertit automatiquement les colonnes TIMESTAMPTZ en objets Date JavaScript, causant une double conversion de timezone:
- Google Calendar → PostgreSQL (stockage en UTC)
- PostgreSQL → JavaScript Date (conversion automatique en timezone locale)
- Frontend → Affichage (nouvelle conversion)
Solution Appliquée
1. Désactivation du parsing automatique (config/database.js)
const { Pool, types } = require('pg');
// IMPORTANT: Désactiver le parsing automatique des TIMESTAMPTZ
types.setTypeParser(1184, function(stringValue) {
return stringValue; // Renvoie la string ISO au lieu d'un objet Date
});
const pool = new Pool({...});
2. Frontend avec timezone explicite (src/pages/Index.tsx)
startDate.toLocaleTimeString('fr-FR', {
hour: '2-digit',
minute: '2-digit',
timeZone: 'Europe/Paris'
})
Procédure de Fix
Étape 1: Diagnostic
Vérifier si le fix est actif:
node scripts/check-calendar-timezone.js
Ce script va vérifier:
- ✓ Si
start_timeest retourné commestring(bon) - ✗ Si
start_timeest unDateobject (mauvais - rebuild requis)
Étape 2: Rebuild du Container (SI NÉCESSAIRE)
Si le diagnostic montre que les dates sont des Date objects:
# 1. Arrêter le container
docker-compose down
# 2. Rebuild SANS cache (important!)
docker-compose build --no-cache notes-app
# 3. Redémarrer
docker-compose up -d
# 4. Vérifier les logs
docker-compose logs -f notes-app
Étape 3: Resynchronisation
- Ouvrir l'interface web NoteFlow
- Aller dans Admin → Calendrier
- Cliquer sur "Synchroniser avec Google Calendar"
- Vérifier que les heures affichées sont correctes
Étape 4: Si le problème persiste
Supprimer les événements et re-synchroniser:
# Se connecter à PostgreSQL
docker exec -it noteflow-postgres psql -U noteflow -d noteflow -p 5499
# Supprimer tous les événements
DELETE FROM calendar_events;
# Quitter
\q
Puis re-synchroniser depuis l'interface web.
Vérification Finale
Comparer un événement dans Google Calendar et NoteFlow:
Google Calendar:
- Rendez-vous: 14:00
NoteFlow (devrait afficher):
- Rendez-vous: 14:00 ✓
Si NoteFlow affiche:
- Rendez-vous: 15:00 ✗ → Reprendre la procédure depuis l'étape 2
Notes Techniques
Types PostgreSQL
TIMESTAMP- Sans timezone, stocke la valeur bruteTIMESTAMPTZ- Avec timezone, stocke en UTC + timezone
Type Parser ID
1184= TIMESTAMPTZ (timestamp with time zone)1114= TIMESTAMP (timestamp without time zone)
Timezone PostgreSQL
Par défaut, PostgreSQL utilise UTC:
SHOW timezone;
-- Résultat: UTC
Timezone Node.js/Container
echo $TZ
# Si vide, Node.js utilise la timezone système (généralement UTC dans Docker)
Format des Dates Google Calendar
Google Calendar API retourne:
event.start.dateTime:"2025-11-15T14:00:00+01:00"(événement avec heure)event.start.date:"2025-11-15"(événement toute la journée)
Ces valeurs sont stockées telles quelles dans PostgreSQL TIMESTAMPTZ.
Historique des Tentatives
- ✗ Changed TIMESTAMP → TIMESTAMPTZ
- ✗ Migration with 'AT TIME ZONE UTC'
- ✗ Migration with 'AT TIME ZONE Europe/Paris'
- ✗ Added timeZone: 'Europe/Paris' to frontend
- ✓ types.setTypeParser(1184) - Solution finale
Contact
Si le problème persiste après toutes ces étapes, vérifier:
- Version de
pgdans package.json - Logs backend pendant la récupération des événements
- Network tab du navigateur pour voir les données brutes retournées par l'API