LobbyService: create lobby, join lobby, enforce player limit #32

Open
opened 2026-04-19 07:23:36 +00:00 by forgejo-lila · 0 comments
Owner

Context

Service layer for lobby business logic, between controller (HTTP) and model (database).

What to do

Implement LobbyService following existing service patterns.

Files to create

  • apps/api/src/services/lobbyService.ts

Key functions

  • createLobby(hostUserId, gameMode, isPrivate, maxPlayers) — generate unique code, insert lobby + host as first player.
  • joinLobby(code, userId) — validate lobby exists, is 'waiting', not full. Insert player.
  • leaveLobby(lobbyId, userId) — remove player. If host leaves, close lobby or transfer host.
  • getPublicLobbies() — lobbies where is_private = false and status = 'waiting'.
  • getLobby(code) — lobby with players.

Acceptance criteria

  • Code generation produces unique, human-readable codes
  • Player limit enforced (default 4, configurable)
  • Cannot join full or in_progress lobby
  • Host leaving waiting lobby closes it (or transfers host — decide and document)
  • All functions async, use model layer (no direct drizzle imports)
  • Unit tests with mocked model layer

Notes

Reference: apps/api/src/services/gameService.ts. The service never imports from drizzle-orm — it calls functions from packages/db/src/models/.

## Context Service layer for lobby business logic, between controller (HTTP) and model (database). ## What to do Implement `LobbyService` following existing service patterns. ## Files to create - `apps/api/src/services/lobbyService.ts` ## Key functions - `createLobby(hostUserId, gameMode, isPrivate, maxPlayers)` — generate unique code, insert lobby + host as first player. - `joinLobby(code, userId)` — validate lobby exists, is 'waiting', not full. Insert player. - `leaveLobby(lobbyId, userId)` — remove player. If host leaves, close lobby or transfer host. - `getPublicLobbies()` — lobbies where `is_private = false` and `status = 'waiting'`. - `getLobby(code)` — lobby with players. ## Acceptance criteria - Code generation produces unique, human-readable codes - Player limit enforced (default 4, configurable) - Cannot join full or in_progress lobby - Host leaving waiting lobby closes it (or transfers host — decide and document) - All functions async, use model layer (no direct drizzle imports) - Unit tests with mocked model layer ## Notes Reference: `apps/api/src/services/gameService.ts`. The service never imports from `drizzle-orm` — it calls functions from `packages/db/src/models/`.
forgejo-lila added the
multiplayer
label 2026-04-19 07:23:36 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: forgejo-lila/lila#32
No description provided.