From 3666241aac1e79ce305f6b4e719204596553ad9c Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 8 Apr 2026 08:19:10 +0000 Subject: [PATCH] Fix Trinity Console dashboard: dynamic server/subscriber counts Dashboard was showing hardcoded values: - Servers Online: 12 (should be 22) - Active Subscribers: 0 - Total MRR: $0 Now fetches live data: - Server count from Pterodactyl API via getMinecraftServers() - Subscriber count and MRR from arbiter_db subscriptions table Files changed: - src/routes/admin/index.js: async dashboard route with data fetching - src/views/admin/dashboard.ejs: EJS variables instead of hardcoded values Chronicler #69 --- .../arbiter-3.0/src/routes/admin/index.js | 41 ++++++++++++++++++- .../arbiter-3.0/src/views/admin/dashboard.ejs | 6 +-- 2 files changed, 42 insertions(+), 5 deletions(-) diff --git a/services/arbiter-3.0/src/routes/admin/index.js b/services/arbiter-3.0/src/routes/admin/index.js index c41f154..2c263cc 100644 --- a/services/arbiter-3.0/src/routes/admin/index.js +++ b/services/arbiter-3.0/src/routes/admin/index.js @@ -1,6 +1,8 @@ const express = require('express'); const router = express.Router(); const { requireTrinityAccess } = require('./middleware'); +const { getMinecraftServers } = require('../../panel/discovery'); +const db = require('../../database'); // Sub-routers const playersRouter = require('./players'); @@ -23,8 +25,43 @@ router.get('/', (req, res) => { res.redirect('/admin/dashboard'); }); -router.get('/dashboard', (req, res) => { - res.render('admin/dashboard', { title: 'Command Bridge' }); +router.get('/dashboard', async (req, res) => { + try { + // Fetch server count from Pterodactyl + const servers = await getMinecraftServers(); + const serversOnline = servers.length; + + // Fetch subscriber stats from database + const { rows: subStats } = await db.query(` + SELECT + COUNT(*) FILTER (WHERE status IN ('active', 'grace_period', 'lifetime')) as active_count, + COALESCE(SUM(CASE + WHEN status = 'active' AND tier_id IS NOT NULL THEN + (SELECT price FROM subscription_tiers WHERE id = tier_id) + ELSE 0 + END), 0) as mrr + FROM subscriptions + `); + + const activeSubscribers = parseInt(subStats[0]?.active_count || 0); + const totalMRR = parseFloat(subStats[0]?.mrr || 0); + + res.render('admin/dashboard', { + title: 'Command Bridge', + serversOnline, + activeSubscribers, + totalMRR + }); + } catch (error) { + console.error('Dashboard data fetch error:', error); + // Fallback to zeros on error + res.render('admin/dashboard', { + title: 'Command Bridge', + serversOnline: 0, + activeSubscribers: 0, + totalMRR: 0 + }); + } }); router.use('/players', playersRouter); diff --git a/services/arbiter-3.0/src/views/admin/dashboard.ejs b/services/arbiter-3.0/src/views/admin/dashboard.ejs index e219ca2..3e23e6c 100644 --- a/services/arbiter-3.0/src/views/admin/dashboard.ejs +++ b/services/arbiter-3.0/src/views/admin/dashboard.ejs @@ -1,15 +1,15 @@
Active Subscribers
-
0
+
<%= activeSubscribers %>
Total MRR
-
$0
+
$<%= totalMRR.toFixed(0) %>
Servers Online
-
12
+
<%= serversOnline %>
Last Sync