Merge pull request #90 from R0m1k3/claude/update-rss-feeds-011CV6EZDsWAUqbRHZR1117Q

Fix: Timezone Europe/Paris + diagnostic complet calendrier
This commit is contained in:
LogiFlow authored and GitHub committed 2025-11-14 12:33:08 +01:00
commit 6d44743ae5
2 files changed
+145 -2

No files matched your search

+143
View File
@@ -0,0 +1,143 @@
#!/usr/bin/env node
// Diagnostic complet du décalage horaire Google Calendar
const { Pool } = require('pg');
const DATABASE_URL = process.env.DATABASE_URL;
if (!DATABASE_URL) {
console.error('❌ DATABASE_URL non définie');
process.exit(1);
}
async function diagnose() {
const pool = new Pool({ connectionString: DATABASE_URL });
try {
console.log('\n═══════════════════════════════════════════════════════════');
console.log('🔍 DIAGNOSTIC DÉCALAGE HORAIRE GOOGLE CALENDAR');
console.log('═══════════════════════════════════════════════════════════\n');
const client = await pool.connect();
// 1. Timezone PostgreSQL
console.log('1️⃣ TIMEZONE POSTGRESQL:\n');
const tz = await client.query('SHOW timezone');
console.log(` Server timezone: ${tz.rows[0].TimeZone}`);
const now = await client.query('SELECT NOW(), CURRENT_TIMESTAMP, CURRENT_TIMESTAMP AT TIME ZONE \'UTC\' as utc_now');
console.log(` Server time: ${now.rows[0].now}`);
console.log(` UTC time: ${now.rows[0].utc_now}`);
// 2. Colonnes calendar_events
console.log('\n2️⃣ COLONNES CALENDAR_EVENTS:\n');
const cols = await client.query(`
SELECT column_name, data_type, is_nullable
FROM information_schema.columns
WHERE table_name = 'calendar_events'
AND column_name IN ('start_time', 'end_time')
ORDER BY column_name
`);
cols.rows.forEach(row => {
console.log(` ${row.column_name}: ${row.data_type} (nullable: ${row.is_nullable})`);
});
// 3. Exemple d'événements
console.log('\n3️⃣ EXEMPLE D\'ÉVÉNEMENTS (3 premiers):\n');
const events = await client.query(`
SELECT
id,
title,
start_time,
start_time AT TIME ZONE 'UTC' as start_time_utc,
start_time AT TIME ZONE 'Europe/Paris' as start_time_paris,
all_day
FROM calendar_events
ORDER BY start_time ASC
LIMIT 3
`);
if (events.rows.length === 0) {
console.log(' ⚠️ Aucun événement dans la base de données');
console.log(' → Synchronisez Google Calendar pour tester\n');
} else {
events.rows.forEach((evt, idx) => {
console.log(` Événement ${idx + 1}: ${evt.title}`);
console.log(` - start_time (brut): ${evt.start_time}`);
console.log(` - start_time UTC: ${evt.start_time_utc}`);
console.log(` - start_time Paris: ${evt.start_time_paris}`);
console.log(` - all_day: ${evt.all_day}`);
console.log('');
});
}
// 4. Format renvoyé par le driver Node.js pg
console.log('4️⃣ FORMAT RENVOYÉ PAR LE DRIVER NODE.JS:\n');
if (events.rows.length > 0) {
const firstEvent = events.rows[0];
console.log(` typeof start_time: ${typeof firstEvent.start_time}`);
console.log(` start_time value: ${firstEvent.start_time}`);
console.log(` start_time instanceof Date: ${firstEvent.start_time instanceof Date}`);
if (firstEvent.start_time instanceof Date) {
console.log(` start_time.toISOString(): ${firstEvent.start_time.toISOString()}`);
console.log(` start_time.toLocaleString('fr-FR'): ${firstEvent.start_time.toLocaleString('fr-FR', { timeZone: 'Europe/Paris' })}`);
}
}
// 5. Diagnostic du problème
console.log('\n5️⃣ DIAGNOSTIC:\n');
const hasBadData = await client.query(`
SELECT COUNT(*) as count
FROM calendar_events
WHERE synced_at < NOW() - INTERVAL '1 day'
`);
if (parseInt(hasBadData.rows[0].count) > 0) {
console.log(` ⚠️ ${hasBadData.rows[0].count} événement(s) synchronisé(s) il y a plus d'1 jour`);
console.log(' → Ces événements peuvent avoir un mauvais timezone');
console.log(' → Recommandation: Supprimer et resynchroniser\n');
}
// 6. Vérifier si migration timezone a été appliquée
const migrationCheck = await client.query(`
SELECT data_type
FROM information_schema.columns
WHERE table_name = 'calendar_events'
AND column_name = 'start_time'
`);
const isTimestamptz = migrationCheck.rows[0].data_type.includes('timestamp with time zone');
if (!isTimestamptz) {
console.log(' ❌ PROBLÈME: Les colonnes sont encore en TIMESTAMP au lieu de TIMESTAMPTZ!');
console.log(' → La migration timezone n\'a pas été appliquée');
console.log(' → Lancez: node scripts/migrate-calendar-timezone.js\n');
} else {
console.log(' ✅ Les colonnes sont en TIMESTAMPTZ (correct)\n');
}
console.log('═══════════════════════════════════════════════════════════');
console.log('\n💡 SOLUTION RECOMMANDÉE:\n');
console.log('1. Supprimer tous les événements:');
console.log(' docker exec noteflow-postgres psql -U noteflow -d noteflow -p 5499 -c "DELETE FROM calendar_events"');
console.log('');
console.log('2. Resynchroniser Google Calendar depuis l\'interface web');
console.log(' Admin → Google Calendar → Bouton Synchroniser');
console.log('');
console.log('3. Vérifier que les heures correspondent maintenant');
console.log('');
console.log('═══════════════════════════════════════════════════════════\n');
client.release();
await pool.end();
} catch (error) {
console.error('\n❌ Erreur lors du diagnostic:', error.message);
console.error(error.stack);
process.exit(1);
}
}
diagnose();
+2 -2
View File
@@ -58,7 +58,7 @@ async function migrate() {
await client.query(`
ALTER TABLE calendar_events
ALTER COLUMN start_time TYPE TIMESTAMPTZ
USING start_time AT TIME ZONE 'UTC'
USING start_time AT TIME ZONE 'Europe/Paris'
`);
console.log(' ✅ start_time → TIMESTAMPTZ');
@@ -66,7 +66,7 @@ async function migrate() {
await client.query(`
ALTER TABLE calendar_events
ALTER COLUMN end_time TYPE TIMESTAMPTZ
USING end_time AT TIME ZONE 'UTC'
USING end_time AT TIME ZONE 'Europe/Paris'
`);
console.log(' ✅ end_time → TIMESTAMPTZ');