mancala/docs/specs/game-history/tasks.md
Halit Aksoy 85e3fb60f6 feat(backend): add game history API and live game previews
- GET /games/me/active and /games/me (Bearer token), /games/popular (live
  games, or the most spectated finished ones), and /game/:id now also
  returns saved records of finished games
- Lists are cached in Valkey for 10 seconds, cleared when a game is saved,
  and empty instead of failing while the database is down
- Live game previews over WebSocket: subscribers get the top 5 on
  subscribe and on change, at most once per second, without counting as
  spectators; ids are public ids
- RTMT supports several connection listeners
2026-10-16 00:21:09 +03:00

2.0 KiB

Game history and live games: tasks

Work through the tasks in order; each ends with its tests passing and a commit. Tick a task when it is committed.

  • 1. Infrastructure: postgres service with init script for the keycloak and mancala databases (replacing keycloak-db), valkey service, backend DATABASE_URL / VALKEY_URL, .env variables, README.
  • 2. Core types and history helpers: PlayerSummary, MoveRecord, summaries, GameRecord, TURN_TIMEOUT_MS, new channels, offlineSince; getInitialBoard, getBoardAfterMove, describeMove, createGameAtMove with unit tests; localized strings.
  • 3. Backend fixes: remove spectators on disconnect, remove finished games from memory, send the connection info once at game start.
  • 4. Postgres repository: pool, migration runner, games and game_players, PostgresGameHistoryRepository (save, get, recent for user, popular), integration tests.
  • 5. Valkey store: live game snapshots and restore, pending saves, cache; integration tests.
  • 6. Game lifecycle: start and move times, spectator counters, outcomes (completed, left, timeout, inactive), timeout watcher, offlineSince, rejecting a new game while playing, saving with retry, restore on startup; unit tests.
  • 7. API: public ids, Bearer auth middleware, /games/me/active, /games/me, /games/popular, /game/:id for finished games, live games channel with throttled push; tests.
  • 8. Board size: --board-unit in BoardView, PitView, StoreView, StoneView; width prop.
  • 9. Home page: ActiveGameBanner, LiveGamesSection with live updates, RecentGamesSection; lobby rejection message.
  • 10. Live game history: MoveList, review mode with ReviewBanner and keyboard, timeout countdown.
  • 11. Replay: ReplayView with controls, speed, timeline, ?move=, own-side orientation, duration.
  • 12. End to end and docs: Chrome tests from design.md, README and TODO.md updates.