mirror of
https://github.com/nfonteyne/octane-website.git
synced 2026-09-03 23:24:48 +02:00
fix: calendar display nothing
This commit is contained in:
parent
a09d16238b
commit
323ac4565c
3 changed files with 24 additions and 7 deletions
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue