ecfb2d3351
Tests · Go / test (push) Successful in 1m58s
Add the games, runtime, and engine-version pages over the existing lobby,
runtime, and engine-version services (no new business logic).
- GET/POST /_gm/games list + create public game
- GET /_gm/games/{id} detail incl. runtime snapshot
- POST /_gm/games/{id}/force-start|stop game state actions
- POST /_gm/games/{id}/ban-member ban a member (uuid + reason)
- POST /_gm/games/{id}/runtime/restart|patch|force-next-turn
- GET/POST /_gm/engine-versions registry + register
- POST /_gm/engine-versions/{ver}/disable disable a version
Console depends on GameAdmin / RuntimeAdmin / EngineVersionAdmin interfaces
(satisfied by the concrete services) so the pages render in tests without a
database. Collection-mutating POSTs are mounted on the collection path to avoid
a static-vs-param route conflict in gin. Writes flow through the CSRF guard and
redirect back; the create form parses datetime-local as UTC.
Tests: list/detail (with and without a runtime), create (visibility/owner/time
assertions), force-start (+ bad-CSRF), ban-member (+ bad uuid), runtime patch
(+ missing version), engine-version list/register/disable, and unavailable.
Docs: backend/docs/admin-console.md page inventory extended.
44 lines
1.9 KiB
Go Template
44 lines
1.9 KiB
Go Template
{{define "content" -}}
|
|
{{$csrf := .CSRFToken}}
|
|
<h1>Games</h1>
|
|
{{with .Data}}
|
|
<table class="list">
|
|
<thead><tr><th>Name</th><th>Visibility</th><th>Status</th><th>Owner</th><th>Players</th><th>Schedule</th><th>Created</th></tr></thead>
|
|
<tbody>
|
|
{{range .Items}}
|
|
<tr>
|
|
<td><a href="/_gm/games/{{.GameID}}">{{if .GameName}}{{.GameName}}{{else}}(unnamed){{end}}</a></td>
|
|
<td>{{.Visibility}}</td>
|
|
<td>{{.Status}}</td>
|
|
<td>{{.Owner}}</td>
|
|
<td>{{.Players}}</td>
|
|
<td>{{.TurnSchedule}}</td>
|
|
<td>{{.CreatedAt}}</td>
|
|
</tr>
|
|
{{else}}<tr><td colspan="7"><span class="note">no games</span></td></tr>{{end}}
|
|
</tbody>
|
|
</table>
|
|
<nav class="pager">
|
|
{{if .HasPrev}}<a href="/_gm/games?page={{.PrevPage}}&page_size={{.PageSize}}">« prev</a>{{end}}
|
|
<span>page {{.Page}} · {{.Total}} total</span>
|
|
{{if .HasNext}}<a href="/_gm/games?page={{.NextPage}}&page_size={{.PageSize}}">next »</a>{{end}}
|
|
</nav>
|
|
{{end}}
|
|
<section class="panel">
|
|
<h2>Create public game</h2>
|
|
<form method="post" action="/_gm/games" class="form">
|
|
<input type="hidden" name="_csrf" value="{{$csrf}}">
|
|
<label>Name <input type="text" name="game_name" required></label>
|
|
<label>Description <input type="text" name="description"></label>
|
|
<label>Min players <input type="number" name="min_players" value="2" min="1"></label>
|
|
<label>Max players <input type="number" name="max_players" value="8" min="1"></label>
|
|
<label>Start gap hours <input type="number" name="start_gap_hours" value="0" min="0"></label>
|
|
<label>Start gap players <input type="number" name="start_gap_players" value="0" min="0"></label>
|
|
<label>Enrollment ends <input type="datetime-local" name="enrollment_ends_at" required></label>
|
|
<label>Turn schedule <input type="text" name="turn_schedule" placeholder="e.g. @every 24h" required></label>
|
|
<label>Engine version <input type="text" name="target_engine_version" placeholder="e.g. 0.1.0" required></label>
|
|
<button type="submit">Create</button>
|
|
</form>
|
|
</section>
|
|
{{- end}}
|