fix: Wave 1 — critical bug fixes across 9 files
All checks were successful
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>
This commit is contained in:
Vantz Stockwell
2026-02-21 13:24:24 -05:00
parent b2ca0c6f0b
commit 208622000c
10 changed files with 59 additions and 15 deletions

View File

@@ -19,7 +19,7 @@ let performanceChartInstance: ECharts | null = null
const loadMapAnalytics = async () => {
loading.value = true
try {
const response = await api.get<MapAnalyticsSummary>(`/api/analytics/maps?range=${timeRange.value}`)
const response = await api.get<MapAnalyticsSummary>(`/analytics/maps?range=${timeRange.value}`)
analytics.value = response
await nextTick()
renderCharts()

View File

@@ -1,6 +1,7 @@
<script setup lang="ts">
import { ref, onMounted } from 'vue'
import { useApi } from '@/composables/useApi'
import { useAuthStore } from '@/stores/auth'
import { Download, Upload, FileText, Loader2 } from 'lucide-vue-next'
import { safeFileSize, safeDate } from '@/utils/formatters'
@@ -13,6 +14,7 @@ interface ExportRecord {
}
const api = useApi()
const authStore = useAuthStore()
const exports = ref<ExportRecord[]>([])
const isExporting = ref(false)
const isImporting = ref(false)
@@ -53,6 +55,7 @@ async function importData() {
const response = await fetch('/api/migration/import', {
method: 'POST',
headers: { 'Authorization': 'Bearer ' + authStore.accessToken },
body: formData,
})

View File

@@ -45,7 +45,7 @@ const loadRetentionData = async () => {
loading.value = true
try {
const response = await api.get<RetentionResponse>(
`/api/analytics/retention?wipe_count=${wipeCount.value}`
`/analytics/retention?wipe_count=${wipeCount.value}`
)
retentionData.value = response

View File

@@ -66,7 +66,7 @@ const formatDate = (dateStr: string): string => {
const loadTransactions = async () => {
loading.value = true
try {
const data = await api.get<StoreTransaction[]>('/api/webstore/transactions')
const data = await api.get<StoreTransaction[]>('/webstore/transactions')
transactions.value = data
await nextTick()
renderRevenueChart()

View File

@@ -30,7 +30,7 @@ const loadAnalytics = async () => {
loading.value = true
try {
const range = rangeToParam(timeRange.value)
const response = await api.get<WipePerformanceMetrics>(`/api/analytics/wipes/performance?range=${range}`)
const response = await api.get<WipePerformanceMetrics>(`/analytics/wipes/performance?range=${range}`)
metrics.value = response
await nextTick()

View File

@@ -30,10 +30,10 @@ const kpiCards = [
]
const quickLinks = [
{ label: 'Licenses', description: 'Manage license keys and activations', icon: Key, route: '/platform-admin/licenses' },
{ label: 'Subscriptions', description: 'View module subscriptions and MRR', icon: CreditCard, route: '/platform-admin/subscriptions' },
{ label: 'Users', description: 'Manage platform users and permissions', icon: Users, route: '/platform-admin/users' },
{ label: 'Servers', description: 'Monitor connected game servers', icon: MonitorCog, route: '/platform-admin/servers' },
{ label: 'Licenses', description: 'Manage license keys and activations', icon: Key, route: '/admin/licenses' },
{ label: 'Subscriptions', description: 'View module subscriptions and MRR', icon: CreditCard, route: '/admin/subscriptions' },
{ label: 'Users', description: 'Manage platform users and permissions', icon: Users, route: '/admin/users' },
{ label: 'Servers', description: 'Monitor connected game servers', icon: MonitorCog, route: '/admin/servers' },
]
function formatValue(value: number | undefined, format: string): string {