feat: game lobby service

This commit is contained in:
Ilia Denisov
2026-04-25 23:20:55 +02:00
committed by GitHub
parent 32dc29359a
commit 48b0056b49
336 changed files with 57074 additions and 1418 deletions
@@ -0,0 +1,80 @@
package internalhttp
import (
"log/slog"
"net/http"
"galaxy/lobby/internal/service/pausegame"
"galaxy/lobby/internal/service/resumegame"
"galaxy/lobby/internal/service/shared"
)
const (
pauseGamePath = "/api/v1/lobby/games/{game_id}/pause"
resumeGamePath = "/api/v1/lobby/games/{game_id}/resume"
)
// registerPauseResumeRoutes binds the admin pause and resume
// routes on the internal port. The actor is always admin (Admin
// Service is the trusted caller).
func registerPauseResumeRoutes(mux *http.ServeMux, deps Dependencies, logger *slog.Logger) {
h := &pauseResumeHandlers{
deps: deps,
logger: logger.With("component", "internal_http.pauseresume"),
}
mux.HandleFunc("POST "+pauseGamePath, h.handlePause)
mux.HandleFunc("POST "+resumeGamePath, h.handleResume)
}
type pauseResumeHandlers struct {
deps Dependencies
logger *slog.Logger
}
func (h *pauseResumeHandlers) handlePause(writer http.ResponseWriter, request *http.Request) {
if h.deps.PauseGame == nil {
writeError(writer, http.StatusInternalServerError, "internal_error", "pause game service is not wired")
return
}
games := &gameHandlers{deps: h.deps, logger: h.logger}
gameID, ok := games.extractGameID(writer, request)
if !ok {
return
}
record, err := h.deps.PauseGame.Handle(request.Context(), pausegame.Input{
Actor: shared.NewAdminActor(),
GameID: gameID,
})
if err != nil {
writeErrorFromService(writer, h.logger, err)
return
}
writeJSON(writer, http.StatusOK, encodeGameRecord(record))
}
func (h *pauseResumeHandlers) handleResume(writer http.ResponseWriter, request *http.Request) {
if h.deps.ResumeGame == nil {
writeError(writer, http.StatusInternalServerError, "internal_error", "resume game service is not wired")
return
}
games := &gameHandlers{deps: h.deps, logger: h.logger}
gameID, ok := games.extractGameID(writer, request)
if !ok {
return
}
record, err := h.deps.ResumeGame.Handle(request.Context(), resumegame.Input{
Actor: shared.NewAdminActor(),
GameID: gameID,
})
if err != nil {
writeErrorFromService(writer, h.logger, err)
return
}
writeJSON(writer, http.StatusOK, encodeGameRecord(record))
}