feat: game lobby service
This commit is contained in:
@@ -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))
|
||||
}
|
||||
Reference in New Issue
Block a user