4.1 KiB
4.1 KiB
type, title, description, tags, timestamp, story_id, status
| type | title | description | tags | timestamp | story_id | status | ||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| User Story | Monitor community account activity | Administrators use a server-rendered dashboard to review daily activity, confirmed connections, locations, denials, and risky networks. |
|
2026-08-02T12:05:27Z | US-018 | verified |
User Story
As an administrator, I want an operational dashboard of account and game activity, so that I can understand community growth and quickly investigate access risks.
Acceptance Criteria
- The administrator landing page is a dashboard rather than a settings form.
- A server-rendered Natural Earth overview plots each user's latest observation with valid approximate coordinates.
- Administrators can opt into a zoomable OpenStreetMap view without removing the default overview.
- OpenStreetMap tiles load only after the administrator selects the interactive view and retain required attribution.
- Map markers show the managed Discord nickname on hover or keyboard focus, link to user records, and have an accessible text-table equivalent.
- Users sharing approximate coordinates render as one grouped marker with a visible count in both map views.
- Grouped-marker hover and keyboard focus list every managed Discord nickname at that location.
- Interactive grouped markers open a popup with links to every corresponding user record.
- Single-user markers retain their direct nickname tooltip and user-record link.
- The location list identifies the enriched network company and ASN when available.
- The location list shows ProxyCheck's connection type separately from its risk classification.
- The location list shows the provider's proxy/VPN signal as an explicit Yes or No value.
- Unknown is shown only for individual enriched fields that are unavailable, including existing cached responses.
- The dashboard graphs distinct daily active users by UTC day for the previous 14 days with understandable date labels.
- Monthly active users count distinct users observed through portal or game activity in the previous 30 days.
- Monthly active Minecraft accounts count distinct accounts with a confirmed Velocity post-login connection in the previous 30 days.
- The dashboard shows login denials from the previous 24 hours.
- Recent VPN, proxy, and Tor observations use enriched ProxyCheck classifications, collapse repeated rows per user, and show counts, sources, and latest activity.
- The graph includes an accessible title, description, point labels, and textual values.
- Dashboard queries and initial rendering execute server-side; only the opt-in pan-and-zoom map hydrates client-side.
- Deployment-managed guild settings and denial messaging remain available on a dedicated settings page.
Implementation
apps/web/src/app/admin/(console)/page.tsxapps/web/src/app/admin/(console)/settings/page.tsxapps/web/src/lib/admin-metrics.tsapps/web/src/components/user-world-map.tsxapps/web/src/components/map-view-toggle.tsxapps/web/src/lib/user-location-map.ts
Validation
- Missing-day chart behavior and per-user VPN collapsing are covered by
apps/web/src/lib/admin-metrics.test.ts. - Coordinate parsing, backward-compatible ProxyCheck network parsing, normalized location grouping, projection, count badges, complete grouped tooltips, linked markers, semantic network columns, text fallback, and attribution are covered by the user-world-map tests.
- The Next.js production build reports the dashboard and database-backed console pages as dynamic server-rendered routes.