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 '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 '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 '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
|
COUNT(*) as total_entries
|
||||||
FROM vitals_log
|
FROM vitals_log
|
||||||
WHERE profile_id = %s AND date >= CURRENT_DATE - INTERVAL '%s days'
|
WHERE profile_id = %s AND date >= CURRENT_DATE - INTERVAL '%s days'
|
||||||
|
|
@ -338,6 +344,20 @@ def get_vitals_stats(
|
||||||
)
|
)
|
||||||
stats_row = cur.fetchone()
|
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)
|
# Get entries for trend calculation (last 14 days)
|
||||||
cur.execute(
|
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_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_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_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'],
|
"total_entries": stats_row['total_entries'],
|
||||||
"trend_resting_hr": trend_hr,
|
"trend_resting_hr": trend_hr,
|
||||||
"trend_hrv": trend_hrv,
|
"trend_hrv": trend_hrv,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user