DB:
- quiz_question gains `lang` ('fr' default) and `active` (true default); migration 0002
- only active questions are served to games (pool filter)
History:
- engine writes a game_history row at game end (modes + ranked results), fire-and-forget
- public GET /api/history/:code lists a room's recent games
- lobby shows a "Parties précédentes" collapsible (date, modes, winner/scores)
Back-office:
- create form has a FR/EN language select; lang stored
- per-question active toggle (PATCH /questions/:id) — disable without deleting;
inactive rows dimmed and labelled
- seeds set lang (opentdb=en, manual/pokemon=fr)
Verified e2e: migration applied; game played → /api/history returns it.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- settings carry `categories` (empty = all); quiz/image pool filters by category
(DB + in-code bank), threaded through prepareQuizForRoom/loadGroup/loadQuizPool
- public GET /api/categories lists available categories
- lobby: category chips (Toutes + each), shown when quiz/images is active
- shared: RoomSettings.categories + UpdateSettingsPayload
Verified e2e: /api/categories returns the list; filtering by ["Pokémon"] serves
only Pokémon questions.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Server:
- quiz-round handles image_reveal like a text-answer format (tolerant match
on acceptedAnswers), exposing imageUrl in the round payload; degressive
scoring comes for free from the existing speed bonus (earlier = blurrier =
more points)
- repo includes image_reveal in the pool (requires imageUrl + acceptedAnswers)
- back-office: image upload (@fastify/multipart) saved to UPLOADS_DIR and
served statically on /uploads (@fastify/static); create supports image_reveal
- env: UPLOADS_DIR; gitignore uploads/
Client:
- admin form: "Image à deviner" — upload + preview + accepted answers
- in-game: ImageReveal shows the image with a time-cadenced decreasing blur
(synced via server timestamps) + text input; reveal shows the clear image
and the answer
shared: QuizQuestionPayload.imageUrl
Verified against real server+DB: upload (url), static serve (200), create
(201), validation (400).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>