From 323ac4565cb5dda4478a77d04faf5ca6e14ca6f4 Mon Sep 17 00:00:00 2001 From: Nathan FONTEYNE Date: Wed, 8 Jul 2026 16:26:23 +0200 Subject: [PATCH] fix: calendar display nothing --- src/repositories/calendarRepo.js | 17 ++++++++++++++--- src/routes/calendar.js | 10 +++++++--- src/routes/calendarWebhooks.js | 4 +++- 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/src/repositories/calendarRepo.js b/src/repositories/calendarRepo.js index 2944575..5603618 100644 --- a/src/repositories/calendarRepo.js +++ b/src/repositories/calendarRepo.js @@ -37,6 +37,8 @@ async function upsertPerson(client, name) { async function ingestSlots(slots) { const client = await pool.connect(); let availabilityRows = 0; + let availableTrueCount = 0; + let availableFalseCount = 0; let slotsWithNoPeople = 0; try { await client.query('BEGIN'); @@ -76,13 +78,16 @@ async function ingestSlots(slots) { continue; } const personId = await upsertPerson(client, person.name); + const isAvailable = !!person.available; + if (isAvailable) availableTrueCount += 1; + else availableFalseCount += 1; await client.query( `INSERT INTO calendar_availability (slot_id, person_id, is_available, checked_at) VALUES ($1, $2, $3, now()) ON CONFLICT (slot_id, person_id) DO UPDATE SET is_available = excluded.is_available, checked_at = excluded.checked_at`, - [slotId, personId, !!person.available] + [slotId, personId, isAvailable] ); availabilityRows += 1; } @@ -95,12 +100,18 @@ async function ingestSlots(slots) { client.release(); } - const summary = { slotsProcessed: slots.length, availabilityRows, slotsWithNoPeople }; + const summary = { + slotsProcessed: slots.length, + availabilityRows, + slotsWithNoPeople, + availableTrueCount, + availableFalseCount, + }; console.log('[calendar] ingest summary:', summary); return summary; } -async function getSlots({ minPeople = 1, personIds = null, weeks = 3 } = {}) { +async function getSlots({ minPeople = 0, personIds = null, weeks = 3 } = {}) { const cappedWeeks = Math.min(weeks || 3, 3); const now = new Date(); const end = new Date(now); diff --git a/src/routes/calendar.js b/src/routes/calendar.js index 85247e0..8ae8006 100644 --- a/src/routes/calendar.js +++ b/src/routes/calendar.js @@ -16,7 +16,10 @@ router.get( router.get( '/slots', asyncHandler(async (req, res) => { - const minPeople = req.query.min_people !== undefined ? parseInt(req.query.min_people, 10) : 1; + // Default 0, not 1: with no filter the calendar should show every + // ingested slot (heat-colored by availability ratio on the frontend), + // not just slots where at least one person happens to be free. + const minPeople = req.query.min_people !== undefined ? parseInt(req.query.min_people, 10) : 0; const weeks = req.query.weeks !== undefined ? parseInt(req.query.weeks, 10) : 3; const personIds = req.query.person_ids ? req.query.person_ids.split(',').map(Number).filter((n) => !Number.isNaN(n)) @@ -85,8 +88,9 @@ router.post('/refresh', (req, res) => { const summary = await calendarRepo.ingestSlots(data.slots); workflowState.setSuccess( - `${summary.slotsProcessed} créneaux reçus, ${summary.availabilityRows} disponibilités enregistrées` + - (summary.slotsWithNoPeople > 0 ? ` (${summary.slotsWithNoPeople} créneaux sans aucune personne — voir les logs serveur)` : '') + `${summary.slotsProcessed} créneaux reçus, ${summary.availabilityRows} disponibilités enregistrées ` + + `(${summary.availableTrueCount} dispo / ${summary.availableFalseCount} indispo)` + + (summary.slotsWithNoPeople > 0 ? ` — ${summary.slotsWithNoPeople} créneaux sans aucune personne, voir les logs serveur` : '') ); } catch (err) { clearTimeout(watchdog); diff --git a/src/routes/calendarWebhooks.js b/src/routes/calendarWebhooks.js index c362608..f419c99 100644 --- a/src/routes/calendarWebhooks.js +++ b/src/routes/calendarWebhooks.js @@ -23,7 +23,9 @@ router.post( try { const summary = await calendarRepo.ingestSlots(slots); workflowState.setSuccess( - `${summary.slotsProcessed} créneaux reçus, ${summary.availabilityRows} disponibilités enregistrées` + `${summary.slotsProcessed} créneaux reçus, ${summary.availabilityRows} disponibilités enregistrées ` + + `(${summary.availableTrueCount} dispo / ${summary.availableFalseCount} indispo)` + + (summary.slotsWithNoPeople > 0 ? ` — ${summary.slotsWithNoPeople} créneaux sans aucune personne, voir les logs serveur` : '') ); res.json({ ok: true, ...summary }); } catch (err) {