Sessions 5-7a: 955 tests, deployment ready
This commit is contained in:
@@ -0,0 +1,111 @@
|
||||
const express = require('express');
|
||||
const { getSupabaseServiceClient } = require('../utils/supabase');
|
||||
|
||||
const router = express.Router();
|
||||
|
||||
const MISSION_HEADER = { 'X-VYNDR-Mission': 'Kill bad satisfieds before they satisfieds you' };
|
||||
|
||||
// GET /parlays-graded — total scan count
|
||||
router.get('/parlays-graded', async (req, res) => {
|
||||
try {
|
||||
const supabase = getSupabaseServiceClient();
|
||||
const { count, error } = await supabase
|
||||
.from('scan_sessions')
|
||||
.select('*', { count: 'exact', head: true });
|
||||
|
||||
if (error) throw error;
|
||||
|
||||
res.set(MISSION_HEADER).json({ count: count || 0 });
|
||||
} catch (err) {
|
||||
console.error('[stats/parlays-graded]', err.message);
|
||||
res.status(503).set(MISSION_HEADER).json({ error: 'Service temporarily unavailable' });
|
||||
}
|
||||
});
|
||||
|
||||
// GET /public — public dashboard stats
|
||||
router.get('/public', async (req, res) => {
|
||||
try {
|
||||
const supabase = getSupabaseServiceClient();
|
||||
|
||||
// Total parlays graded
|
||||
const { count: parlaysGraded, error: countErr } = await supabase
|
||||
.from('scan_sessions')
|
||||
.select('*', { count: 'exact', head: true });
|
||||
if (countErr) throw countErr;
|
||||
|
||||
// Most common grade
|
||||
const { data: grades, error: gradesErr } = await supabase
|
||||
.from('scan_sessions')
|
||||
.select('final_grade');
|
||||
if (gradesErr) throw gradesErr;
|
||||
|
||||
let avg_grade = null;
|
||||
if (grades && grades.length > 0) {
|
||||
const freq = {};
|
||||
for (const row of grades) {
|
||||
const g = row.final_grade;
|
||||
if (g) freq[g] = (freq[g] || 0) + 1;
|
||||
}
|
||||
let maxCount = 0;
|
||||
for (const [grade, c] of Object.entries(freq)) {
|
||||
if (c > maxCount) {
|
||||
maxCount = c;
|
||||
avg_grade = grade;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Kill conditions caught
|
||||
const { data: picks, error: picksErr } = await supabase
|
||||
.from('picks')
|
||||
.select('kill_conditions')
|
||||
.not('kill_conditions', 'eq', '[]');
|
||||
if (picksErr) throw picksErr;
|
||||
|
||||
const kill_conditions_caught = picks ? picks.filter(p =>
|
||||
p.kill_conditions && Array.isArray(p.kill_conditions) && p.kill_conditions.length > 0
|
||||
).length : 0;
|
||||
|
||||
res.set(MISSION_HEADER).json({
|
||||
parlays_graded: parlaysGraded || 0,
|
||||
avg_grade,
|
||||
kill_conditions_caught,
|
||||
sports_covered: ['NBA', 'MLB'],
|
||||
});
|
||||
} catch (err) {
|
||||
console.error('[stats/public]', err.message);
|
||||
res.status(503).set(MISSION_HEADER).json({ error: 'Service temporarily unavailable' });
|
||||
}
|
||||
});
|
||||
|
||||
// GET /live — top 3 most recently graded props
|
||||
router.get('/live', async (req, res) => {
|
||||
try {
|
||||
const supabase = getSupabaseServiceClient();
|
||||
const { data, error } = await supabase
|
||||
.from('picks')
|
||||
.select('player, stat_type, line, direction, grade, confidence, created_at')
|
||||
.order('created_at', { ascending: false })
|
||||
.limit(3);
|
||||
|
||||
if (error) throw error;
|
||||
|
||||
const result = (data || []).map(row => ({
|
||||
player: row.player,
|
||||
stat: row.stat_type,
|
||||
line: row.line,
|
||||
direction: row.direction,
|
||||
grade: row.grade,
|
||||
confidence: row.confidence,
|
||||
sport: 'NBA',
|
||||
graded_at: row.created_at,
|
||||
}));
|
||||
|
||||
res.set(MISSION_HEADER).json(result);
|
||||
} catch (err) {
|
||||
console.error('[stats/live]', err.message);
|
||||
res.status(503).set(MISSION_HEADER).json({ error: 'Service temporarily unavailable' });
|
||||
}
|
||||
});
|
||||
|
||||
module.exports = router;
|
||||
Reference in New Issue
Block a user