fix: prevent double-counting of sleep sessions in stats by grouping by start date
This commit is contained in:
@@ -3,7 +3,7 @@ from typing import List, Optional
|
||||
from fastapi import APIRouter, Depends, Query
|
||||
from sqlmodel.ext.asyncio.session import AsyncSession
|
||||
from app.database import get_session
|
||||
from app.crud import get_sessions, get_all_time_stats
|
||||
from app.crud import get_sessions, get_sleep_counts_by_start_date
|
||||
from app.schemas import DailySummaryResponse, TimetableResponse, WakeupBedtimeResponse, SummaryResponse
|
||||
from app.utils.time_utils import get_day_night_splits
|
||||
|
||||
@@ -106,14 +106,26 @@ async def get_summary(
|
||||
to_date: datetime,
|
||||
session: AsyncSession = Depends(get_session),
|
||||
):
|
||||
sessions, _ = await get_sessions(session, from_date=from_date, to_date=to_date)
|
||||
total_sleeps = len(sessions)
|
||||
|
||||
# Period Stats
|
||||
period_counts = await get_sleep_counts_by_start_date(session, from_date=from_date, to_date=to_date)
|
||||
total_sleeps = sum(count for _, count in period_counts)
|
||||
num_days = (to_date.date() - from_date.date()).days + 1
|
||||
avg_sleeps_per_day = total_sleeps / num_days if num_days > 0 else 0.0
|
||||
|
||||
total_sleeps_all_time, avg_sleeps_per_day_all_time = await get_all_time_stats(session)
|
||||
|
||||
|
||||
# All-Time Stats
|
||||
all_counts = await get_sleep_counts_by_start_date(session)
|
||||
total_sleeps_all_time = sum(count for _, count in all_counts)
|
||||
avg_sleeps_per_day_all_time = 0.0
|
||||
if all_counts:
|
||||
# counts are ordered by desc date (from crud.py)
|
||||
# so last one is earliest.
|
||||
earliest_date_str = all_counts[-1][0]
|
||||
# SQLite date() returns YYYY-MM-DD string
|
||||
earliest_date = datetime.strptime(earliest_date_str, "%Y-%m-%d").date()
|
||||
today = datetime.now(timezone.utc).date()
|
||||
days_all_time = (today - earliest_date).days + 1
|
||||
avg_sleeps_per_day_all_time = total_sleeps_all_time / days_all_time if days_all_time > 0 else 0.0
|
||||
|
||||
return {
|
||||
"total_sleeps": total_sleeps,
|
||||
"avg_sleeps_per_day": avg_sleeps_per_day,
|
||||
|
||||
Reference in New Issue
Block a user