fix: critical bug fixes - routes UUID, image paths, favorites loading, bottom nav debounce

This commit is contained in:
2026-02-25 16:29:13 -05:00
parent c449083171
commit fd95df461b
14 changed files with 379 additions and 116 deletions

View File

@ -46,16 +46,24 @@ async def get_route_stops(route_id: str, session: Session = Depends(get_session)
"""Get all stops for a route."""
from app.models.route_stop import RouteStop
from app.models.bus_stop import BusStop
from uuid import UUID
try:
route_id_uuid = UUID(route_id)
except ValueError:
raise HTTPException(status_code=400, detail="Invalid route ID format")
statement = select(RouteStop, BusStop).join(
BusStop, RouteStop.stop_id == BusStop.id
).where(RouteStop.route_id == route_id).order_by(RouteStop.stop_order)
).where(RouteStop.route_id == route_id_uuid).order_by(RouteStop.stop_order)
results = session.exec(statement).all()
# Merge RouteStop data into BusStop response
stops = []
for route_stop, bus_stop in results:
stop_data = bus_stop.model_dump()
# Convert UUIDs to strings for JSON compatibility
stop_data['id'] = str(stop_data['id'])
stop_data['stop_order'] = route_stop.stop_order
stop_data['travel_time_minutes'] = route_stop.travel_time_minutes
stop_data['stop_delay_minutes'] = route_stop.stop_delay_minutes
@ -124,21 +132,28 @@ async def add_stop_to_route(
_: bool = Depends(get_current_admin)
):
"""Add a stop to a route with cascading order adjustment."""
from uuid import UUID
try:
route_id_uuid = UUID(route_id)
stop_id_uuid = UUID(stop_data.stop_id)
except ValueError:
raise HTTPException(status_code=400, detail="Invalid UUID format")
# 1. Check if route exists
route = session.get(Route, route_id)
route = session.get(Route, route_id_uuid)
if not route:
raise HTTPException(status_code=404, detail="Route not found")
# 2. Determine stop order
if stop_data.stop_order is None:
# Append to end
max_order = session.exec(select(func.max(RouteStop.stop_order)).where(RouteStop.route_id == route_id)).one()
max_order = session.exec(select(func.max(RouteStop.stop_order)).where(RouteStop.route_id == route_id_uuid)).one()
# handle case where max_order is None (no stops)
stop_data.stop_order = (max_order or 0) + 1
else:
# Shift existing stops equal to or greater than new order
existing_stops = session.exec(
select(RouteStop).where(RouteStop.route_id == route_id, RouteStop.stop_order >= stop_data.stop_order)
select(RouteStop).where(RouteStop.route_id == route_id_uuid, RouteStop.stop_order >= stop_data.stop_order)
).all()
for stop in existing_stops:
stop.stop_order += 1
@ -146,8 +161,8 @@ async def add_stop_to_route(
# 3. Create new RouteStop
new_stop = RouteStop(
route_id=route_id,
stop_id=stop_data.stop_id,
route_id=route_id_uuid,
stop_id=stop_id_uuid,
stop_order=stop_data.stop_order,
travel_time_minutes=stop_data.travel_time_minutes,
stop_delay_minutes=stop_data.stop_delay_minutes or 0,
@ -168,12 +183,14 @@ async def update_route_stop_order(
_: bool = Depends(get_current_admin)
):
"""Update a route stop, potentially reordering others."""
# This assumes we find the connection by route_id and stop_id.
# NOTE: If a stop is on a route multiple times, this logic needs ID, but for now assuming unique stop per route.
# Actually RouteStop has its own ID but we are using stop_id in path. Let's find the RouteStop entry.
from uuid import UUID
try:
route_id_uuid = UUID(route_id)
stop_id_uuid = UUID(stop_id)
except ValueError:
raise HTTPException(status_code=400, detail="Invalid UUID format")
route_stop = session.exec(
select(RouteStop).where(RouteStop.route_id == route_id, RouteStop.stop_id == stop_id)
select(RouteStop).where(RouteStop.route_id == route_id_uuid, RouteStop.stop_id == stop_id_uuid)
).first()
if not route_stop:
@ -199,7 +216,7 @@ async def update_route_stop_order(
# Moving down: shift stops between old+1 and new DOWN (-1)
stops_to_shift = session.exec(
select(RouteStop).where(
RouteStop.route_id == route_id,
RouteStop.route_id == route_id_uuid,
RouteStop.stop_order > old_order,
RouteStop.stop_order <= new_order
)
@ -211,7 +228,7 @@ async def update_route_stop_order(
# Moving up: shift stops between new and old-1 UP (+1)
stops_to_shift = session.exec(
select(RouteStop).where(
RouteStop.route_id == route_id,
RouteStop.route_id == route_id_uuid,
RouteStop.stop_order >= new_order,
RouteStop.stop_order < old_order
)
@ -227,3 +244,45 @@ async def update_route_stop_order(
session.refresh(route_stop)
return route_stop
@router.delete("/{route_id}/stops/{stop_id}")
async def remove_stop_from_route(
route_id: str,
stop_id: str,
session: Session = Depends(get_session),
_: bool = Depends(get_current_admin)
):
"""Remove a stop from a route."""
from uuid import UUID
try:
route_id_uuid = UUID(route_id)
stop_id_uuid = UUID(stop_id)
except ValueError:
raise HTTPException(status_code=400, detail="Invalid UUID format")
route_stop = session.exec(
select(RouteStop).where(
RouteStop.route_id == route_id_uuid,
RouteStop.stop_id == stop_id_uuid
)
).first()
if not route_stop:
raise HTTPException(status_code=404, detail="Stop not found on this route")
# Re-order remaining stops
removed_order = route_stop.stop_order
remaining_stops = session.exec(
select(RouteStop).where(
RouteStop.route_id == route_id_uuid,
RouteStop.stop_order > removed_order
)
).all()
for s in remaining_stops:
s.stop_order -= 1
session.add(s)
session.delete(route_stop)
session.commit()
return {"ok": True}