66
77import logging
88from datetime import datetime , timezone
9- from typing import Any
9+ from typing import Any , List
1010
11- from fastapi import APIRouter , HTTPException
11+ from fastapi import APIRouter , Depends , HTTPException
12+ from sqlalchemy .orm import Session
1213
14+ from app .db .database import get_db
15+ from app .models .user import User
1316from app .schemas .routes import RouteSearchRequest , RouteSearchResponse
1417from app .services .ai_agents_service import ai_agents_service
18+ from app .services .auth_service import auth_service
19+ from app .services .preference_service import preference_service
1520from app .services .routing_service import (
1621 RoutingAPIError ,
1722 RoutingDataError ,
2631
2732
2833@router .post ("/search" , response_model = RouteSearchResponse )
29- async def search_routes (request : RouteSearchRequest ) -> Any :
34+ async def search_routes (
35+ request : RouteSearchRequest ,
36+ db : Session = Depends (get_db ),
37+ current_user : User = Depends (auth_service .get_current_user ),
38+ ) -> Any :
3039 """
3140 Search for public transport routes between two locations.
3241
3342 Queries the HSL (Helsinki Regional Transport) API to find route alternatives
34- between origin and destination coordinates.
43+ between origin and destination coordinates. Requires authentication.
3544
3645 Args:
3746 request: Route search parameters including origin, destination, and preferences
47+ db: Database session
48+ current_user: Authenticated user (required)
3849
3950 Returns:
4051 RouteSearchResponse with list of available route itineraries
@@ -43,15 +54,32 @@ async def search_routes(request: RouteSearchRequest) -> Any:
4354 HTTPException: If the route search fails or returns invalid data
4455 """
4556 logger .info (
46- "Route search request: origin=%s, destination=%s, num_itineraries=%s" ,
57+ "Route search request: origin=%s, destination=%s, num_itineraries=%s, user_id=%s " ,
4758 request .origin ,
4859 request .destination ,
4960 request .num_itineraries ,
61+ current_user .id ,
5062 )
5163
5264 # Use current time if earliest_departure not provided
5365 earliest_departure = request .earliest_departure or datetime .now (timezone .utc )
5466
67+ # Collect user preferences from multiple sources
68+ user_preferences : List [str ] = []
69+
70+ # 1. Add preferences from request (explicitly provided)
71+ if request .preferences :
72+ user_preferences .extend (request .preferences )
73+
74+ # 2. Add stored preferences from authenticated user
75+ try :
76+ stored_prefs = preference_service .get_user_preferences (db , int (current_user .id ))
77+ user_preferences .extend ([str (pref .prompt ) for pref in stored_prefs ])
78+ except Exception as e : # pylint: disable=broad-except
79+ logger .warning ("Failed to fetch user preferences: %s" , str (e ))
80+
81+ logger .info ("Using %d user preferences for route insights" , len (user_preferences ))
82+
5583 try :
5684 # Call routing service to fetch itineraries from HSL API
5785 itineraries = await routing_service .get_itinaries (
@@ -64,7 +92,9 @@ async def search_routes(request: RouteSearchRequest) -> Any:
6492 # Enhance each itinerary with AI insights (with graceful degradation)
6593 for itinerary in itineraries :
6694 try :
67- await ai_agents_service .get_itinerary_insight (itinerary )
95+ await ai_agents_service .get_itinerary_insight (
96+ itinerary , user_preferences if user_preferences else None
97+ )
6898 except Exception as e : # pylint: disable=broad-except
6999 # Gracefully degrade - log warning but continue without AI insights
70100 logger .warning ("Failed to get AI insights for itinerary: %s" , str (e ))
0 commit comments