feat(game): canonical gameId in POST /api/v1/admin/init
Engine no longer mints its own game UUID. The orchestrator (backend)
generates the game UUID at game-create time and passes it in the
admin/init request body as the required `gameId` field, so the value
that names the engine container and host bind-mount directory also
ends up inside the engine's state.json.
The engine rejects the zero UUID with 400 and any init that conflicts
with an existing state.json with 409 (a second init on the same gameId
is also a conflict; full idempotency is not part of the contract).
Updates rest.InitRequest, openapi.yaml (schema + 409 response),
controller.GenerateGame/NewGame/buildGameOnMap signatures, the engine
HTTP handler/executor, the backend runtime worker, and the relevant
unit and contract tests. Documentation in game/README.md,
docs/ARCHITECTURE.md, backend/README.md, and backend/docs/{runtime,flows}.md
is updated in the same patch.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
+13
-2
@@ -1,11 +1,22 @@
|
||||
package rest
|
||||
|
||||
import "github.com/google/uuid"
|
||||
|
||||
// InitRequest is the body of POST /api/v1/admin/init. The orchestrator
|
||||
// (game backend) generates GameID before launching the engine container
|
||||
// and creating the per-game storage directory, then passes the same
|
||||
// value here so the engine state and the orchestrator's persisted
|
||||
// identity stay aligned.
|
||||
type InitRequest struct {
|
||||
// List of the Races in the Game
|
||||
// GameID is the canonical identity of the new game. The engine
|
||||
// rejects requests with the zero UUID and requests that conflict
|
||||
// with an existing state.json on disk.
|
||||
GameID uuid.UUID `json:"gameId" binding:"required"`
|
||||
// Races lists the participating races. Minimum 10 entries.
|
||||
Races []InitRace `json:"races" binding:"required,gte=10"`
|
||||
}
|
||||
|
||||
type InitRace struct {
|
||||
// Name of the Race
|
||||
// RaceName is the human-readable name of the race.
|
||||
RaceName string `json:"raceName" binding:"required,notblank"`
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user