Spaces:
Sleeping
Sleeping
| from typing import Annotated | |
| from loguru import logger | |
| from fastapi import APIRouter, Depends, HTTPException, Request | |
| from dependency_injector.wiring import inject, Provide | |
| from app.dependencies.containers import Container | |
| from app.dto.request import ( | |
| DialogflowWebhookRequest, | |
| SeatQueryRequest, | |
| StopRequest, | |
| TicketRequest, | |
| TripQueryRequest, | |
| ) | |
| from app.dto.response import ( | |
| DialogServiceResult, | |
| DialogflowResponseBuilder, | |
| ) | |
| from app.services.trip_service import TripService | |
| router = APIRouter(prefix="/trip", tags=["Trip"]) | |
| async def trips_option( | |
| request: Request, service: TripService = Depends(Provide[Container.trip_service]) | |
| ): | |
| body = await request.json() | |
| params = body.get("sessionInfo", {}).get("parameters", {}) | |
| try: | |
| data = TripQueryRequest(**params) | |
| except Exception as e: | |
| raise HTTPException(status_code=400, detail="Invalid location parameters") | |
| rs: DialogServiceResult = await service.get_trips_option(data) | |
| return ( | |
| DialogflowResponseBuilder() | |
| .add_text(rs.text) | |
| .add_choice_chips(options=rs.options, key="route") | |
| .set_parameters(rs.parameters) | |
| .build() | |
| ) | |
| async def confirm( | |
| request: Request, service: TripService = Depends(Provide[Container.trip_service]) | |
| ): | |
| body = await request.json() | |
| body = DialogflowWebhookRequest(**body) | |
| parameters = body.get_parameters() | |
| try: | |
| data = TripQueryRequest(**parameters) | |
| except Exception as e: | |
| logger.error(f"Error parsing trip parameters {e}", exc_info=True) | |
| raise HTTPException(status_code=400, detail="Invalid trip query parameters") | |
| rs: DialogServiceResult = service.confirm_trip_search_input(data=data) | |
| return ( | |
| DialogflowResponseBuilder() | |
| .add_text(rs.text) | |
| .add_choice_chips(options=rs.options) | |
| .build() | |
| ) | |
| async def validate_trip_selection( | |
| request: Request, service: TripService = Depends(Provide[Container.trip_service]) | |
| ): | |
| body = await request.json() | |
| body = DialogflowWebhookRequest(**body) | |
| params = body.get_parameters() | |
| try: | |
| data = TripQueryRequest(**params) | |
| except Exception as e: | |
| raise HTTPException(status_code=400, detail="Invalid trip selection parameters") | |
| rs: DialogServiceResult = await service.validate_trip_selection( | |
| id_selected=data.id_selected, data=data | |
| ) | |
| return DialogflowResponseBuilder().set_parameters(rs.parameters).build() | |
| async def fetch_available_seat( | |
| request: Request, service: TripService = Depends(Provide[Container.trip_service]) | |
| ): | |
| body = await request.json() | |
| body = DialogflowWebhookRequest(**body) | |
| params = body.get_parameters() | |
| try: | |
| logger.info(f"Received parameters: {params}") | |
| data = SeatQueryRequest(**params) | |
| except Exception as e: | |
| logger.error(f"Error parsing trip parameters {e}", exc_info=True) | |
| raise HTTPException(status_code=400, detail="Invalid trip query parameters") | |
| rs: DialogServiceResult = await service.get_available_seat(data.trip_data) | |
| return ( | |
| DialogflowResponseBuilder() | |
| .add_text(rs.text) | |
| .add_choice_chips(options=rs.options, key="chair") | |
| .set_parameters(rs.parameters) | |
| .build() | |
| ) | |
| async def validate_seat_selection( | |
| request: Request, service: TripService = Depends(Provide[Container.trip_service]) | |
| ): | |
| body = await request.json() | |
| body = DialogflowWebhookRequest(**body) | |
| params = body.get_parameters() | |
| try: | |
| data = SeatQueryRequest(**params) | |
| except Exception as e: | |
| logger.error("Error parsing trip parameters", exc_info=True) | |
| raise HTTPException(status_code=400, detail="Invalid trip query parameters") | |
| rs: DialogServiceResult = await service.validate_seat_selection( | |
| selected=data.seat, data=data.trip_data | |
| ) | |
| return ( | |
| DialogflowResponseBuilder() | |
| .add_text(rs.text) | |
| .set_parameters(rs.parameters) | |
| .build() | |
| ) | |
| async def pick_up_stop( | |
| request: Request, service: TripService = Depends(Provide[Container.trip_service]) | |
| ): | |
| try: | |
| body = await request.json() | |
| body = DialogflowWebhookRequest(**body) | |
| params = body.get_parameters() | |
| data = StopRequest(**params) | |
| except Exception as e: | |
| logger.error(f"Error parsing trip parameters {e}", exc_info=True) | |
| raise HTTPException(status_code=400, detail="Invalid trip query parameters") | |
| rs: DialogServiceResult = await service.get_pick_up_points( | |
| route_id=data.trip_data.route_id, way_id=data.trip_data.way_id | |
| ) | |
| return ( | |
| DialogflowResponseBuilder() | |
| .add_text(rs.text) | |
| .add_choice_chips(options=rs.options, key="name") | |
| .set_parameters(rs.parameters) | |
| .build() | |
| ) | |
| async def validate_pick_up_selection( | |
| request: Request, service: TripService = Depends(Provide[Container.trip_service]) | |
| ): | |
| body = await request.json() | |
| body = DialogflowWebhookRequest(**body) | |
| params = body.get_parameters() | |
| try: | |
| data = StopRequest(**params) | |
| except Exception as e: | |
| logger.error("Error parsing trip parameters", exc_info=True) | |
| raise HTTPException(status_code=400, detail="Invalid trip query parameters") | |
| selected = body.get_text() | |
| rs: DialogServiceResult = await service.validate_stop_selection( | |
| id_selected=data.id_selected, data=data.trip_data, role="pick-up" | |
| ) | |
| return ( | |
| DialogflowResponseBuilder() | |
| .add_text(rs.text) | |
| .add_choice_chips(options=rs.options) | |
| .set_parameters(rs.parameters) | |
| .build() | |
| ) | |
| async def drop_off_stop( | |
| request: Request, service: TripService = Depends(Provide[Container.trip_service]) | |
| ): | |
| body = await request.json() | |
| body = DialogflowWebhookRequest(**body) | |
| params = body.get_parameters() | |
| try: | |
| data = StopRequest(**params) | |
| except Exception as e: | |
| logger.error("Error parsing trip parameters", exc_info=True) | |
| raise HTTPException(status_code=400, detail="Invalid trip query parameters") | |
| rs: DialogServiceResult = await service.get_drop_off_points( | |
| route_id=data.trip_data.route_id, way_id=data.trip_data.way_id | |
| ) | |
| logger.info(f"Drop-off points: {rs.options}") | |
| return ( | |
| DialogflowResponseBuilder() | |
| .add_text(rs.text) | |
| .add_choice_chips(options=rs.options, key="name") | |
| .set_parameters(rs.parameters) | |
| .build() | |
| ) | |
| async def validate_drop_off_selection( | |
| request: Request, service: TripService = Depends(Provide[Container.trip_service]) | |
| ): | |
| body = await request.json() | |
| body = DialogflowWebhookRequest(**body) | |
| params = body.get_parameters() | |
| try: | |
| data = StopRequest(**params) | |
| except Exception as e: | |
| logger.error("Error parsing trip parameters", exc_info=True) | |
| raise HTTPException(status_code=400, detail="Invalid trip query parameters") | |
| rs: DialogServiceResult = await service.validate_stop_selection( | |
| id_selected=data.id_selected, data=data.trip_data, role="drop-off" | |
| ) | |
| return ( | |
| DialogflowResponseBuilder() | |
| .add_text(rs.text) | |
| .add_choice_chips(options=rs.options) | |
| .set_parameters(rs.parameters) | |
| .build() | |
| ) | |
| async def show_ticket( | |
| request: Request, service: TripService = Depends(Provide[Container.trip_service]) | |
| ): | |
| body = await request.json() | |
| body = DialogflowWebhookRequest(**body) | |
| params = body.get_parameters() | |
| try: | |
| data = TicketRequest(**params) | |
| except Exception as e: | |
| logger.error("Error parsing trip parameters", exc_info=True) | |
| raise HTTPException(status_code=400, detail="Invalid trip query parameters") | |
| rs: DialogServiceResult = await service.make_ticket_summary(data) | |
| return ( | |
| DialogflowResponseBuilder() | |
| .add_text(rs.text) | |
| .set_parameters(rs.parameters) | |
| .build() | |
| ) | |