Add invite request system and Gitea Actions CI/CD pipeline
Some checks failed
Build & Deploy Staging / build (release) Waiting to run
Build & Deploy Staging / deploy (release) Has been cancelled

Invite request feature:
- Public form to request an invite when INVITE_REQUEST_ENABLED=true
- Stores requests in new invite_requests DB table
- Emails admins on new request, emails requester on approve/deny
- Admin panel tab to review, approve, and deny requests
- Approval auto-creates invite code and sends signup link

CI/CD pipeline:
- Build & push Docker image to Gitea registry on release
- Auto-deploy to staging with health check
- Manual workflow_dispatch for production deploys

Also includes client layout/sizing improvements for card grid
and opponent spacing.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
adlee-was-taken
2026-04-07 19:38:52 -04:00
parent 0c0588f920
commit ef54ac201a
16 changed files with 1003 additions and 50 deletions

View File

@@ -37,6 +37,7 @@
<a href="#" data-panel="users" class="nav-link">Users</a>
<a href="#" data-panel="games" class="nav-link">Games</a>
<a href="#" data-panel="invites" class="nav-link">Invites</a>
<a href="#" data-panel="invite-requests" class="nav-link">Requests</a>
<a href="#" data-panel="audit" class="nav-link">Audit Log</a>
</div>
<div class="nav-user">
@@ -191,6 +192,35 @@
</table>
</section>
<!-- Invite Requests Panel -->
<section id="invite-requests-panel" class="panel hidden">
<h2>Invite Requests</h2>
<div class="panel-toolbar">
<div class="filter-bar">
<select id="request-status-filter">
<option value="pending">Pending</option>
<option value="">All</option>
<option value="approved">Approved</option>
<option value="denied">Denied</option>
</select>
<button id="request-filter-btn" class="btn">Filter</button>
</div>
</div>
<table id="invite-requests-table" class="data-table">
<thead>
<tr>
<th>Name</th>
<th>Email</th>
<th>Message</th>
<th>Submitted</th>
<th>Status</th>
<th>Actions</th>
</tr>
</thead>
<tbody></tbody>
</table>
</section>
<!-- Audit Log Panel -->
<section id="audit-panel" class="panel hidden">
<h2>Audit Log</h2>
@@ -207,12 +237,15 @@
<option value="end_game">End Game</option>
<option value="create_invite">Create Invite</option>
<option value="revoke_invite">Revoke Invite</option>
<option value="approve_invite_request">Approve Request</option>
<option value="deny_invite_request">Deny Request</option>
</select>
<select id="audit-target-filter">
<option value="">All Targets</option>
<option value="user">Users</option>
<option value="game">Games</option>
<option value="invite_code">Invites</option>
<option value="invite_request">Invite Requests</option>
</select>
<button id="audit-filter-btn" class="btn">Filter</button>
</div>