diff --git a/backend/app/api/activities.py b/backend/app/api/activities.py index c68c5ee..bc1f732 100644 --- a/backend/app/api/activities.py +++ b/backend/app/api/activities.py @@ -423,17 +423,21 @@ async def get_route_leaderboard( if not act.named_route_id: return None + # Rank by moving time (pauses excluded), falling back to elapsed for + # activities without it — consistent with avg pace being moving-time based. + effort_s = func.coalesce(Activity.moving_time_s, Activity.duration_s) rows = (await db.execute( select( Activity.id, Activity.name, Activity.start_time, - Activity.duration_s, Activity.distance_m, Activity.avg_heart_rate, + effort_s.label("duration_s"), + Activity.distance_m, Activity.avg_heart_rate, ) .where( Activity.named_route_id == act.named_route_id, Activity.user_id == current_user.id, Activity.duration_s.isnot(None), ) - .order_by(Activity.duration_s) + .order_by(effort_s) )).all() if not rows: return None diff --git a/backend/app/api/routes.py b/backend/app/api/routes.py index aeed46a..121c883 100644 --- a/backend/app/api/routes.py +++ b/backend/app/api/routes.py @@ -195,11 +195,13 @@ async def route_activities( db: AsyncSession = Depends(get_db), current_user: User = Depends(get_current_user), ): + # Rank by moving time (pauses excluded), falling back to elapsed for + # activities without it — consistent with avg pace being moving-time based. result = await db.execute( select(Activity).where( Activity.named_route_id == route_id, Activity.user_id == current_user.id, - ).order_by(Activity.duration_s) + ).order_by(func.coalesce(Activity.moving_time_s, Activity.duration_s)) ) activities = result.scalars().all() return [ @@ -207,7 +209,7 @@ async def route_activities( "id": a.id, "name": a.name, "start_time": a.start_time, - "duration_s": a.duration_s, + "duration_s": a.moving_time_s or a.duration_s, "distance_m": a.distance_m, "avg_heart_rate": a.avg_heart_rate, "avg_speed_ms": a.avg_speed_ms,