import uuid from fastapi import APIRouter, Depends from sqlalchemy import func, select from sqlalchemy.ext.asyncio import AsyncSession from app.core.deps import get_db_session, require_study_member from app.models.milestone import Milestone from app.schemas.progress import StudyProgressRead router = APIRouter() @router.get("/progress", response_model=StudyProgressRead, dependencies=[Depends(require_study_member())]) async def get_progress( study_id: uuid.UUID, db: AsyncSession = Depends(get_db_session), ) -> StudyProgressRead: milestone_total_stmt = select(func.count()).select_from(Milestone).where(Milestone.study_id == study_id) milestone_done_stmt = select(func.count()).select_from(Milestone).where( Milestone.study_id == study_id, Milestone.status == "DONE" ) milestone_total = (await db.execute(milestone_total_stmt)).scalar_one() milestone_done = (await db.execute(milestone_done_stmt)).scalar_one() completion_rate = float(milestone_done / milestone_total) if milestone_total else 0.0 return StudyProgressRead( milestones_total=milestone_total, milestones_done=milestone_done, completion_rate=completion_rate, )