nerdware/README.md
AyoubBenziza d3ce52b60a feat(admin): manual quiz back-office + rewrite README
Back-office (roadmap V1 step 7):
- server: token-protected HTTP API under /api/admin (ADMIN_TOKEN), Drizzle-backed
  CRUD for manual questions — list, create (mcq/truefalse/free, category upsert,
  dedup on prompt, validation), delete; 401/503 when unauthorized/unconfigured
- client: /admin page with token login + TanStack Query (list/create/delete),
  format-aware form (QCM / vrai-faux / réponse libre)
- env: ADMIN_TOKEN

README: replace the shadcn template with a real NerdWare overview (stack,
structure, getting started, scripts, game modes, back-office).

Verified against real Postgres: auth (401), create (201), dedup (409),
validation (400), list, delete (200/404).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-10 16:43:19 +02:00

3.2 KiB

NerdWare

Party game web multi-épreuves, ambiance WarioWare, centré culture geek (jeux vidéo, manga, pop culture). Chaque joueur joue sur son propre PC/téléphone, les rooms sont synchronisées en temps réel via Socket.IO.

V1 : Quiz culture + Blindtest (YouTube), mélangeables dans une même partie.

Architecture détaillée : ARCHITECTURE.md · consignes de dev : CLAUDE.md.

Stack

Couche Choix
Langage TypeScript (strict, front + back)
Runtime / package manager Bun
Monorepo Turborepo
Backend Fastify + Socket.IO
DB PostgreSQL + Drizzle ORM (contenu quiz + historique ; rooms en mémoire)
Frontend Vite + React, wouter, Zustand, TanStack Query (back-office)
UI Tailwind v4 + shadcn/ui, Framer Motion, Lucide
Audio YouTube IFrame Player API
Avatars DiceBear (style lorelei), générés en local

Structure

apps/
  web/      Client Vite + React (jeu + back-office)
  server/   Fastify + Socket.IO + Drizzle (moteur de jeu autoritaire)
packages/
  shared/   Types de domaine + events WS partagés (@nerdware/shared)
  ui/       Composants shadcn/ui (@workspace/ui)

Le serveur est autoritaire : timer, scores, ordre des manches et tirage du DJ sont tranchés côté serveur ; le client n'affiche que l'état reçu. Chaque épreuve implémente l'interface GameRound (start / submitAnswer / reveal / score) — ajouter un mode = un module, sans toucher à la plomberie.

Démarrer

Prérequis : Bun ≥ 1.3, et Docker pour la base (optionnel — sans DB, le quiz tourne sur une banque en dur).

bun install

# (optionnel) base de données
docker compose up -d
cd apps/server && cp .env.example .env
bun run db:migrate      # applique les migrations
bun run db:seed         # seed Open Trivia DB (~1 req/5s) + banque FR
cd ../..

# config client
cd apps/web && cp .env.example .env && cd ../..

# tout lancer (Turborepo)
bun run dev

Crée une room, choisis ton pseudo, partage le lien d'invitation, et lancez une partie (quiz, blindtest ou mixte).

Scripts (racine)

bun run dev         # tout en dev
bun run build       # build complet
bun run lint        # lint
bun run typecheck   # type-check
bun run test        # tests (bun test)
bun run format      # prettier

Serveur (apps/server) : db:generate, db:migrate, db:seed, db:studio.

Modes de jeu

  • Quiz — QCM, vrai/faux, et réponse libre (matching tolérant). Bonus de rapidité. Questions issues d'Open Trivia DB (seed) ou du back-office.
  • Blindtest — chaque joueur soumet des liens YouTube ; un DJ neutre pilote la lecture, les autres devinent (titre/artiste, qui l'a ajouté, ou mixte). Nécessite ≥ 3 joueurs. Récap des titres + liens en fin de partie.
  • Mixte (défaut) — séquence mélangée de manches quiz et blindtest.

Back-office quiz

Page protégée /admin pour écrire des questions manuelles (QCM, vrai/faux, réponse libre). Définir ADMIN_TOKEN dans apps/server/.env et une DATABASE_URL valide. Le jeton est demandé à la connexion sur /admin.