Sessions 5-7a: 955 tests, deployment ready

This commit is contained in:
Kev
2026-06-08 18:35:13 -04:00
parent 06b82624a2
commit 1fa04dc776
371 changed files with 49366 additions and 955 deletions
+65
View File
@@ -0,0 +1,65 @@
/**
* Grade of the Day selector — runs daily ~5:15 PM ET.
*
* Rules:
* 1. Use an A+ if one exists tonight.
* 2. Otherwise the single highest-confidence A or A-.
* 3. Otherwise fall back to the top grade overall.
*/
const axios = require('axios');
const { buildCard, publicCardUrl } = require('./_shareCardClient');
const API_BASE = process.env.API_BASE_URL || 'http://localhost:4000';
const GRADE_RANK = { 'A+': 0, 'A': 1, 'A-': 2, 'B+': 3, 'B': 4, 'B-': 5, 'C+': 6, 'C': 7, 'C-': 8, 'D': 9, 'F': 10 };
async function fetchTop(limit = 8) {
const res = await axios.get(`${API_BASE}/api/props/top-graded?limit=${limit}`, { timeout: 10_000 }).catch(() => null);
return Array.isArray(res?.data?.props) ? res.data.props : [];
}
function pickGOTD(props) {
if (!props.length) return null;
const sorted = [...props].sort((a, b) => {
const ra = GRADE_RANK[a.grade] ?? 99;
const rb = GRADE_RANK[b.grade] ?? 99;
if (ra !== rb) return ra - rb;
return (b.confidence ?? 0) - (a.confidence ?? 0);
});
return sorted[0];
}
async function generate({ format = 'square' } = {}) {
const props = await fetchTop(8);
const winner = pickGOTD(props);
if (!winner) {
return { data: null, imageBuffer: null, imageUrl: null, note: 'no grades available' };
}
const payload = {
player: winner.player_name || winner.player,
sport: winner.sport,
stat: winner.stat_type || winner.stat,
line: winner.line,
direction: winner.direction,
grade: winner.grade,
projection: winner.projection,
summary: winner.one_line_reason || winner.reasoning?.summary || null,
};
let card = null;
try {
card = await buildCard({ type: 'gotd', format, payload });
} catch (err) {
console.error('[gradeOfTheDay] card build failed:', err.message);
}
return {
data: payload,
imageBuffer: card?.buffer || null,
imageContentType: card?.contentType || null,
imageUrl: publicCardUrl({ type: 'gotd', format, payload }),
};
}
module.exports = { generate, pickGOTD };