From 19756b80e50d6f2d4d5e0a37148f7add68c23d33 Mon Sep 17 00:00:00 2001 From: Samuel Enocsson Date: Thu, 21 May 2026 13:38:04 +0200 Subject: [PATCH] feat: expose lastMonthRating and deltaPredicted on player objects (#3) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add two derived fields to all player objects returned by getPlayerDataFromDB and the error branch in getAllRatingsFromDB. No new DB columns — both fields are pure arithmetic derivations. monthlyHistory placeholder [] included ahead of A2 implementation. --- src/services/player-service.js | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/src/services/player-service.js b/src/services/player-service.js index 79f7157..fd86274 100644 --- a/src/services/player-service.js +++ b/src/services/player-service.js @@ -18,13 +18,23 @@ async function getPlayerDataFromDB(pdgaNumber) { stdDev = updatedPlayer?.std_dev; } + const rating = cachedPlayer.current_rating; + const ratingChange = cachedPlayer.rating_change; + const resolvedPredicted = predictedRating > 0 ? predictedRating : null; + const resolvedStdDev = stdDev > 0 ? stdDev : null; + return { pdgaNumber: cachedPlayer.pdga_number, name: cachedPlayer.name, - rating: cachedPlayer.current_rating, - ratingChange: cachedPlayer.rating_change, - predictedRating: predictedRating > 0 ? predictedRating : null, - stdDev: stdDev > 0 ? stdDev : null + rating, + ratingChange, + predictedRating: resolvedPredicted, + stdDev: resolvedStdDev, + // previous month's official rating (null when either value is missing) + lastMonthRating: (rating != null && ratingChange != null) ? rating - ratingChange : null, + // gap between next predicted update and current rating (null when either is missing) + deltaPredicted: (resolvedPredicted != null && rating != null) ? resolvedPredicted - rating : null, + monthlyHistory: [] }; } return null; @@ -161,12 +171,18 @@ async function getAllRatingsFromDB(progressCallback = null) { } } catch (error) { logger.error(`Failed to load PDGA ${pdgaNumber} from database:`, error.message); + const errorRating = player.current_rating; + const errorRatingChange = player.rating_change; const errorData = { pdgaNumber: parseInt(pdgaNumber), name: player.name || 'Database Error', - rating: player.current_rating, - ratingChange: player.rating_change, - predictedRating: null + rating: errorRating, + ratingChange: errorRatingChange, + predictedRating: null, + stdDev: null, + lastMonthRating: (errorRating != null && errorRatingChange != null) ? errorRating - errorRatingChange : null, + deltaPredicted: null, + monthlyHistory: [] }; ratings.push(errorData);