mancala/docs/specs/game-history/tasks.md
Halit Aksoy f404b92aaf feat(backend): save finished games in Postgres
- Connection pool and a small migration runner (schema_migrations, one
  transaction per migration, advisory lock)
- games and game_players tables with indexes for a user's games and for
  popular games
- PostgresGameHistoryRepository: idempotent save, get, recent games of a
  user, popular games
- Integration tests against a real Postgres via testcontainers; a custom
  Jest environment gives tests Node's web globals, which Jest 27 leaves out
- GameRecord carries the number of distinct spectators
2026-10-16 00:11:12 +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.