diff --git a/src/routes/pages.js b/src/routes/pages.js index cb22d9f..61d3c8d 100644 --- a/src/routes/pages.js +++ b/src/routes/pages.js @@ -1,10 +1,13 @@ const express = require('express'); const router = express.Router(); const { getTopbarLocals } = require('../services/topbar-service'); +const { getAllRatingsFromDB, computeKpis } = require('../services/player-service'); router.get('/', async (req, res) => { const topbar = await getTopbarLocals(); - res.render('index', { activePage: 'players', ...topbar }); + const players = await getAllRatingsFromDB(); + const kpis = computeKpis(players); + res.render('index', { activePage: 'players', kpis, ...topbar }); }); router.get('/courses', async (req, res) => { diff --git a/src/services/player-service.js b/src/services/player-service.js index 523016d..f73f7f8 100644 --- a/src/services/player-service.js +++ b/src/services/player-service.js @@ -292,10 +292,30 @@ async function refreshAllPlayersInDB(progressCallback = null) { } } +/** + * Aggregates KPI summary stats from an already-fetched player array. + * All fields are derived from the player list — no extra DB queries. + */ +function computeKpis(players) { + const active = players.filter(p => p.rating != null && p.rating > 0); + const avg = active.length > 0 + ? Math.round(active.reduce((sum, p) => sum + p.rating, 0) / active.length) + : null; + + return { + tracked: players.length, + active: active.length, + avg, + climbing: players.filter(p => p.ratingChange != null && p.ratingChange > 0).length, + slipping: players.filter(p => p.ratingChange != null && p.ratingChange < 0).length + }; +} + module.exports = { getPlayerDataFromDB, scrapePDGARating, getPredictedRatingFromDB, getAllRatingsFromDB, - refreshAllPlayersInDB + refreshAllPlayersInDB, + computeKpis };