fix: route leaderboards rank by moving time not elapsed — top-10 route times and route completions list now use COALESCE(moving_time_s, duration_s) so mid-activity pauses don't inflate times (consistent with moving-time avg pace)
Build and push images / validate (push) Successful in 6s
Build and push images / build-backend (push) Successful in 1m11s
Build and push images / build-worker (push) Successful in 5s
Build and push images / build-frontend (push) Successful in 6s

This commit is contained in:
2026-07-01 21:04:46 +01:00
parent acf553ff5c
commit 92cea4dc99
2 changed files with 10 additions and 4 deletions
+6 -2
View File
@@ -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
+4 -2
View File
@@ -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,