/
pa1ch
/
FitAssistant
Обзор
Документация
Войти
/
pa1ch
/
FitAssistant
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
app/api/endpoints/progress.py
83 строки
3 KB
Pavel Chugaev
feat(progress): аналитика по упражнению — 1ПМ, недельный тоннаж, бейдж рекорда
14 июл 2026, 00:14
14 июл 2026, 00:14
22ac994
Код
Авторство
О чём код?
"""Progress & analytics endpoints — JSON data for charts.""" from fastapi import APIRouter from app.api.deps import CurrentUser, SessionDep from app.api.schemas import ( ExerciseProgressPoint, MeasurementHistoryPoint, StreakOut, WeeklyTonnagePoint, WorkoutStatsOut, ) from app.services.progress import ( get_exercise_progress, get_exercise_weekly_tonnage, get_measurement_history, get_workout_stats, ) from app.services.streak import get_streak router = APIRouter(prefix="/progress", tags=["progress"]) @router.get("/streak", response_model=StreakOut) async def streak(session: SessionDep, user: CurrentUser): s = await get_streak(session, user.id) # get_streak may initialize the row or reset an expired streak — persist that. await session.commit() return StreakOut( current_streak=s.current_streak, longest_streak=s.longest_streak, is_frozen=s.is_frozen, days_until_reset=s.days_until_reset, ) @router.get("/stats", response_model=WorkoutStatsOut) async def stats(session: SessionDep, user: CurrentUser): s = await get_workout_stats(session, user.id) return WorkoutStatsOut( total_workouts=s.total_workouts, workouts_this_month=s.workouts_this_month, workouts_last_30_days=s.workouts_last_30_days, total_sets=s.total_sets, most_frequent_exercise=s.most_frequent_exercise, avg_workouts_per_week=s.avg_workouts_per_week, ) @router.get("/exercise/{exercise_id}", response_model=list[ExerciseProgressPoint]) async def exercise_progress(exercise_id: int, session: SessionDep, user: CurrentUser): data = await get_exercise_progress(session, user.id, exercise_id) return [ ExerciseProgressPoint( date=p.date, max_weight=p.max_weight, total_volume=p.total_volume, max_reps=p.max_reps, total_reps=p.total_reps, total_sets=p.total_sets, est_1rm=p.est_1rm, ) for p in data ] @router.get("/exercise/{exercise_id}/weekly", response_model=list[WeeklyTonnagePoint]) async def exercise_weekly_tonnage(exercise_id: int, session: SessionDep, user: CurrentUser): data = await get_exercise_weekly_tonnage(session, user.id, exercise_id) return [ WeeklyTonnagePoint( week_start=w.week_start, tonnage=w.tonnage, total_reps=w.total_reps, total_sets=w.total_sets, ) for w in data ] @router.get("/measurements", response_model=list[MeasurementHistoryPoint]) async def measurement_history(session: SessionDep, user: CurrentUser): return await get_measurement_history(session, user.id)