from pydantic import BaseModel, field_validator from typing import Any from pydantic import BaseModel, Field from app.dto.trip import TripDTO class LocationRequest(BaseModel): origin_office: str | None = None departure_city: str | None = None dest_office: str | None = None destination_city: str | None = None class TimeRequest(BaseModel): time_select: dict | None = Field(default_factory=dict) class TripQueryRequest(BaseModel): departure_city: str | None = None destination_city: str | None = None origin_office: str | None = None dest_office: str | None = None ticket_number: int | None = None date: dict | None = Field(default_factory=dict) time_select: dict | None = Field(default_factory=dict) id_selected: int | None = None @field_validator("ticket_number", "id_selected", mode="before") def validate_ticket_number(cls, v): return int(v) if v else None @field_validator("id_selected", mode="before") def validate_selected_pickup(cls, v): return int(v) if v else None class TicketRequest(BaseModel): user_name: str | None = None phone_number: str | None = None email: str | None = None seat: str | None = None pickup: str | None = None dropoff: str | None = None trip_data: TripDTO | None = None class SeatQueryRequest(BaseModel): seat: str | None = None trip_data: TripDTO | None = None class SessionInfo(BaseModel): session: str | None = None parameters: dict[str, Any] = Field(default_factory=dict) class FulfillmentInfo(BaseModel): tag: str | None = None class DialogflowWebhookRequest(BaseModel): text: str | None = None sessionInfo: SessionInfo | None = None fulfillmentInfo: FulfillmentInfo | None = None detectIntentResponseId: str | None = None def get_parameters(self) -> dict[str, Any]: return self.sessionInfo.parameters if self.sessionInfo else {} def get_session(self) -> str: return ( self.sessionInfo.session if self.sessionInfo and self.sessionInfo.session else "" ) def get_text(self) -> str: return self.text.strip() if self.text else "" def get_tag(self) -> str: return ( self.fulfillmentInfo.tag if self.fulfillmentInfo and self.fulfillmentInfo.tag else "" ) class StopRequest(BaseModel): trip_data: TripDTO | None = None id_selected: int | None = None @field_validator("id_selected", mode="before") def validate_selected_pickup(cls, v): return int(v) if v else None