fix: critical bug fixes - routes UUID, image paths, favorites loading, bottom nav debounce
This commit is contained in:
@ -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}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user