feat: add blood pressure, VO2 max, and SpO2 to vitals stats
- Avg blood pressure (systolic/diastolic) 7d and 30d - Latest VO2 Max value - Avg SpO2 7d and 30d - Backend now provides all metrics expected by frontend Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
9634ca8909
commit
a55f11bc96
|
|
@ -330,6 +330,12 @@ def get_vitals_stats(
|
|||
AVG(CASE WHEN date >= CURRENT_DATE - INTERVAL '30 days' THEN resting_hr END) as avg_hr_30d,
|
||||
AVG(CASE WHEN date >= CURRENT_DATE - INTERVAL '7 days' THEN hrv END) as avg_hrv_7d,
|
||||
AVG(CASE WHEN date >= CURRENT_DATE - INTERVAL '30 days' THEN hrv END) as avg_hrv_30d,
|
||||
AVG(CASE WHEN date >= CURRENT_DATE - INTERVAL '7 days' THEN blood_pressure_systolic END) as avg_bp_sys_7d,
|
||||
AVG(CASE WHEN date >= CURRENT_DATE - INTERVAL '30 days' THEN blood_pressure_systolic END) as avg_bp_sys_30d,
|
||||
AVG(CASE WHEN date >= CURRENT_DATE - INTERVAL '7 days' THEN blood_pressure_diastolic END) as avg_bp_dia_7d,
|
||||
AVG(CASE WHEN date >= CURRENT_DATE - INTERVAL '30 days' THEN blood_pressure_diastolic END) as avg_bp_dia_30d,
|
||||
AVG(CASE WHEN date >= CURRENT_DATE - INTERVAL '7 days' THEN spo2 END) as avg_spo2_7d,
|
||||
AVG(CASE WHEN date >= CURRENT_DATE - INTERVAL '30 days' THEN spo2 END) as avg_spo2_30d,
|
||||
COUNT(*) as total_entries
|
||||
FROM vitals_log
|
||||
WHERE profile_id = %s AND date >= CURRENT_DATE - INTERVAL '%s days'
|
||||
|
|
@ -338,6 +344,20 @@ def get_vitals_stats(
|
|||
)
|
||||
stats_row = cur.fetchone()
|
||||
|
||||
# Get latest VO2 Max
|
||||
cur.execute(
|
||||
"""
|
||||
SELECT vo2_max
|
||||
FROM vitals_log
|
||||
WHERE profile_id = %s AND vo2_max IS NOT NULL
|
||||
ORDER BY date DESC
|
||||
LIMIT 1
|
||||
""",
|
||||
(pid,)
|
||||
)
|
||||
vo2_row = cur.fetchone()
|
||||
latest_vo2 = vo2_row['vo2_max'] if vo2_row else None
|
||||
|
||||
# Get entries for trend calculation (last 14 days)
|
||||
cur.execute(
|
||||
"""
|
||||
|
|
@ -388,6 +408,13 @@ def get_vitals_stats(
|
|||
"avg_resting_hr_30d": round(stats_row['avg_hr_30d'], 1) if stats_row['avg_hr_30d'] else None,
|
||||
"avg_hrv_7d": round(stats_row['avg_hrv_7d'], 1) if stats_row['avg_hrv_7d'] else None,
|
||||
"avg_hrv_30d": round(stats_row['avg_hrv_30d'], 1) if stats_row['avg_hrv_30d'] else None,
|
||||
"avg_bp_systolic_7d": round(stats_row['avg_bp_sys_7d'], 1) if stats_row['avg_bp_sys_7d'] else None,
|
||||
"avg_bp_systolic_30d": round(stats_row['avg_bp_sys_30d'], 1) if stats_row['avg_bp_sys_30d'] else None,
|
||||
"avg_bp_diastolic_7d": round(stats_row['avg_bp_dia_7d'], 1) if stats_row['avg_bp_dia_7d'] else None,
|
||||
"avg_bp_diastolic_30d": round(stats_row['avg_bp_dia_30d'], 1) if stats_row['avg_bp_dia_30d'] else None,
|
||||
"avg_spo2_7d": round(stats_row['avg_spo2_7d'], 1) if stats_row['avg_spo2_7d'] else None,
|
||||
"avg_spo2_30d": round(stats_row['avg_spo2_30d'], 1) if stats_row['avg_spo2_30d'] else None,
|
||||
"latest_vo2_max": float(latest_vo2) if latest_vo2 else None,
|
||||
"total_entries": stats_row['total_entries'],
|
||||
"trend_resting_hr": trend_hr,
|
||||
"trend_hrv": trend_hrv,
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user