Vantz Stockwell
8253680fbd
fix: License key format, login populates license, case-insensitive email
...
Test Asgard Runner / test (push) Successful in 3s
- admin.service.ts: createLicense() now uses CORR-XXXX-XXXX-XXXX format
instead of raw hex hash
- admin.service.ts: getLicenses() flattens owner_email in response to
match frontend expected shape
- auth.service.ts: Login/register responses now include full license
object so frontend can populate auth store
- auth.service.ts: Email lookups are case-insensitive (LOWER()) to
prevent duplicate accounts from case variations
- LoginView/RegisterView: Call setLicense() after setAuth()
- AdminLicenses: Handle null expires_at (was showing Dec 31, 1969),
fix nullable types, fix query param name (per_page → limit)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-02-21 15:32:35 -05:00
Vantz Stockwell
208622000c
fix: Wave 1 — critical bug fixes across 9 files
...
Test Asgard Runner / test (push) Successful in 3s
- Fix double-prefix URL bugs in 4 analytics/revenue views (/api/api → /api)
- Fix AdminDashboard quick-links routing (/platform-admin/* → /admin/*)
- Fix MigrationView import missing Authorization header
- Remove dead ConsoleModule from app.module (conflicts with NatsBridgeGateway on /ws)
- Fix store.service.ts raw Error throws → NotFoundException/ForbiddenException
- Fix payment-order entity FK (webstore_subscription_id → WebstoreSubscription)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-02-21 13:24:24 -05:00
Vantz Stockwell
26e717ac96
fix: Replace unsafe .toFixed() calls with safeFixed() in analytics views
...
- AnalyticsView: avg_players, uptime_percentage
- WipeAnalyticsView: success_rate, population curve, durations, CSV export
- PlayerRetentionView: retention percentages, session duration, tooltip
- MapAnalyticsView: rotation effectiveness, performance metrics, table
All analytics views now use safe formatter utilities with optional chaining
to prevent null/undefined runtime errors when displaying numeric data.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-02-15 21:56:04 -05:00
Vantz Stockwell
daa9c3035f
fix: Guard against undefined stats in AdminDashboard formatValue
...
Test Asgard Runner / test (push) Successful in 3s
API returns partial/empty stats object — individual fields can be undefined
even when the object exists. Added null guard to prevent toLocaleString crash.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-02-15 21:49:20 -05:00
Vantz Stockwell
88b50a30b4
feat: Phase 1c — Platform Admin Dashboard
...
Full super-admin dashboard for SaaS platform management:
Backend (10 files):
- Migration 003: Add is_super_admin column to users table
- JWT Claims: Carry is_super_admin through access tokens
- SuperAdmin extractor: Axum FromRequestParts that rejects non-admins (403)
- Admin API module: 10 endpoints behind /api/admin/*
- GET /stats (KPIs: licenses, users, MRR, servers, signups)
- GET/POST /licenses (paginated, filterable, manual generation)
- GET/PATCH /licenses/:id (detail view, revoke/activate)
- GET /subscriptions (module sub list with MRR breakdown)
- GET/PATCH /users (paginated, toggle admin, disable accounts)
- GET /servers (fleet overview across all licenses)
- GET /health (DB pool, NATS status, table row counts)
- Bootstrap updated: first user gets is_super_admin = true
Frontend (8 files):
- 5 admin views in src/views/platform-admin/
- DashboardLayout: "Platform" nav section (gated on isSuperAdmin)
- Router: /admin/* routes with superAdmin meta guard
- Auth store: isSuperAdmin computed property
- Types: is_super_admin on User interface
Build: 80 chunks, zero TS errors, clean production build.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-02-15 02:07:38 -05:00
Vantz Stockwell
0ac1738c85
feat: Add 5 Platform Admin views for super-admin dashboard
...
- AdminDashboard: KPI cards (licenses, users, MRR, servers, signups) + quick links
- AdminLicenses: Searchable paginated table with detail panel, CSV export, license generation
- AdminSubscriptions: MRR summary cards, per-module breakdown, subscriber table
- AdminUsers: Paginated user table with super admin toggle and account disable actions
- AdminServers: Filterable server table with connection type badges, status dots, relative heartbeat times
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-02-15 02:04:31 -05:00