The package-level defaultRateLimiter drained its token bucket across all test cases, causing later tests to hit ResourceExhausted. Move rateLimiter from a package-level var to a *grpcRateLimiter field on Server; New() allocates a fresh instance (10 req/s, burst 10) per server. Each test's newTestEnv() constructs its own Server, so tests no longer share limiter state. Production behaviour is unchanged: a single Server is constructed at startup and lives for the process lifetime.
30 lines
1.4 KiB
HTML
30 lines
1.4 KiB
HTML
{{define "audit_detail"}}{{template "base" .}}{{end}}
|
|
{{define "title"}}Event #{{.Event.ID}} — MCIAS{{end}}
|
|
{{define "content"}}
|
|
<div class="page-header d-flex align-center justify-between">
|
|
<div>
|
|
<h1>Audit Event #{{.Event.ID}}</h1>
|
|
<p class="text-muted text-small"><code>{{.Event.EventType}}</code></p>
|
|
</div>
|
|
<a class="btn btn-secondary" href="/audit">← Audit Log</a>
|
|
</div>
|
|
<div class="card">
|
|
<dl style="display:grid;grid-template-columns:140px 1fr;gap:.5rem .75rem;font-size:.9rem">
|
|
<dt class="text-muted">Event ID</dt>
|
|
<dd>{{.Event.ID}}</dd>
|
|
<dt class="text-muted">Time</dt>
|
|
<dd>{{formatTime .Event.EventTime}}</dd>
|
|
<dt class="text-muted">Event Type</dt>
|
|
<dd><code>{{.Event.EventType}}</code></dd>
|
|
<dt class="text-muted">Actor</dt>
|
|
<dd>{{if .Event.ActorUsername}}{{.Event.ActorUsername}}{{else}}—{{end}}</dd>
|
|
<dt class="text-muted">Target</dt>
|
|
<dd>{{if .Event.TargetUsername}}{{.Event.TargetUsername}}{{else}}—{{end}}</dd>
|
|
<dt class="text-muted">IP Address</dt>
|
|
<dd>{{if .Event.IPAddress}}{{.Event.IPAddress}}{{else}}—{{end}}</dd>
|
|
<dt class="text-muted">Details</dt>
|
|
<dd>{{if .Event.Details}}<pre style="margin:0;white-space:pre-wrap;word-break:break-all;background:#f8f9fa;padding:.5rem;border-radius:4px;font-size:.85rem"><code>{{prettyJSON .Event.Details}}</code></pre>{{else}}—{{end}}</dd>
|
|
</dl>
|
|
</div>
|
|
{{end}}
|