fix: calendar display nothing

This commit is contained in:
Nathan FONTEYNE 2026-07-08 16:26:23 +02:00
parent a09d16238b
commit 323ac4565c
3 changed files with 24 additions and 7 deletions

View file

@ -37,6 +37,8 @@ async function upsertPerson(client, name) {
async function ingestSlots(slots) { async function ingestSlots(slots) {
const client = await pool.connect(); const client = await pool.connect();
let availabilityRows = 0; let availabilityRows = 0;
let availableTrueCount = 0;
let availableFalseCount = 0;
let slotsWithNoPeople = 0; let slotsWithNoPeople = 0;
try { try {
await client.query('BEGIN'); await client.query('BEGIN');
@ -76,13 +78,16 @@ async function ingestSlots(slots) {
continue; continue;
} }
const personId = await upsertPerson(client, person.name); const personId = await upsertPerson(client, person.name);
const isAvailable = !!person.available;
if (isAvailable) availableTrueCount += 1;
else availableFalseCount += 1;
await client.query( await client.query(
`INSERT INTO calendar_availability (slot_id, person_id, is_available, checked_at) `INSERT INTO calendar_availability (slot_id, person_id, is_available, checked_at)
VALUES ($1, $2, $3, now()) VALUES ($1, $2, $3, now())
ON CONFLICT (slot_id, person_id) DO UPDATE SET ON CONFLICT (slot_id, person_id) DO UPDATE SET
is_available = excluded.is_available, is_available = excluded.is_available,
checked_at = excluded.checked_at`, checked_at = excluded.checked_at`,
[slotId, personId, !!person.available] [slotId, personId, isAvailable]
); );
availabilityRows += 1; availabilityRows += 1;
} }
@ -95,12 +100,18 @@ async function ingestSlots(slots) {
client.release(); client.release();
} }
const summary = { slotsProcessed: slots.length, availabilityRows, slotsWithNoPeople }; const summary = {
slotsProcessed: slots.length,
availabilityRows,
slotsWithNoPeople,
availableTrueCount,
availableFalseCount,
};
console.log('[calendar] ingest summary:', summary); console.log('[calendar] ingest summary:', summary);
return 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 cappedWeeks = Math.min(weeks || 3, 3);
const now = new Date(); const now = new Date();
const end = new Date(now); const end = new Date(now);

View file

@ -16,7 +16,10 @@ router.get(
router.get( router.get(
'/slots', '/slots',
asyncHandler(async (req, res) => { 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 weeks = req.query.weeks !== undefined ? parseInt(req.query.weeks, 10) : 3;
const personIds = req.query.person_ids const personIds = req.query.person_ids
? req.query.person_ids.split(',').map(Number).filter((n) => !Number.isNaN(n)) ? req.query.person_ids.split(',').map(Number).filter((n) => !Number.isNaN(n))
@ -86,7 +89,8 @@ router.post('/refresh', (req, res) => {
const summary = await calendarRepo.ingestSlots(data.slots); const summary = await calendarRepo.ingestSlots(data.slots);
workflowState.setSuccess( 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.slotsWithNoPeople > 0 ? ` (${summary.slotsWithNoPeople} créneaux sans aucune personne — voir les logs serveur)` : '') `(${summary.availableTrueCount} dispo / ${summary.availableFalseCount} indispo)` +
(summary.slotsWithNoPeople > 0 ? `${summary.slotsWithNoPeople} créneaux sans aucune personne, voir les logs serveur` : '')
); );
} catch (err) { } catch (err) {
clearTimeout(watchdog); clearTimeout(watchdog);

View file

@ -23,7 +23,9 @@ router.post(
try { try {
const summary = await calendarRepo.ingestSlots(slots); const summary = await calendarRepo.ingestSlots(slots);
workflowState.setSuccess( 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 }); res.json({ ok: true, ...summary });
} catch (err) { } catch (err) {