feat: routes page — deep-link to specific route, sport-colour tiles over real map, sort filter (distance/completions/last-completed), group custom vs auto-detected, taller map tiles
This commit is contained in:
@@ -35,6 +35,7 @@ class RouteOut(BaseModel):
|
||||
auto_detected: Optional[bool]
|
||||
created_at: datetime
|
||||
activity_count: int = 0
|
||||
last_activity_at: Optional[datetime] = None
|
||||
|
||||
class Config:
|
||||
from_attributes = True
|
||||
@@ -45,24 +46,33 @@ async def list_routes(
|
||||
db: AsyncSession = Depends(get_db),
|
||||
current_user: User = Depends(get_current_user),
|
||||
):
|
||||
# Fetch routes with activity counts in one query
|
||||
count_subq = (
|
||||
select(Activity.named_route_id, func.count(Activity.id).label("cnt"))
|
||||
# Fetch routes with activity counts and last-completed time in one query
|
||||
agg_subq = (
|
||||
select(
|
||||
Activity.named_route_id,
|
||||
func.count(Activity.id).label("cnt"),
|
||||
func.max(Activity.start_time).label("last_at"),
|
||||
)
|
||||
.where(Activity.user_id == current_user.id, Activity.named_route_id.isnot(None))
|
||||
.group_by(Activity.named_route_id)
|
||||
.subquery()
|
||||
)
|
||||
result = await db.execute(
|
||||
select(NamedRoute, func.coalesce(count_subq.c.cnt, 0).label("activity_count"))
|
||||
.outerjoin(count_subq, NamedRoute.id == count_subq.c.named_route_id)
|
||||
select(
|
||||
NamedRoute,
|
||||
func.coalesce(agg_subq.c.cnt, 0).label("activity_count"),
|
||||
agg_subq.c.last_at.label("last_activity_at"),
|
||||
)
|
||||
.outerjoin(agg_subq, NamedRoute.id == agg_subq.c.named_route_id)
|
||||
.where(NamedRoute.user_id == current_user.id)
|
||||
.order_by(desc(NamedRoute.created_at))
|
||||
)
|
||||
rows = result.all()
|
||||
out = []
|
||||
for route, cnt in rows:
|
||||
for route, cnt, last_at in rows:
|
||||
d = {c.name: getattr(route, c.name) for c in route.__table__.columns}
|
||||
d["activity_count"] = cnt
|
||||
d["last_activity_at"] = last_at
|
||||
out.append(RouteOut(**d))
|
||||
return out
|
||||
|
||||
|
||||
Reference in New Issue
Block a user