Initial commit: SIBU 2.0 MISSION

This commit is contained in:
2026-02-21 09:53:31 -05:00
commit 0c7aa53c8b
400 changed files with 67708 additions and 0 deletions

View File

@ -0,0 +1,2 @@
"""Pydantic schemas for request/response validation."""

View File

@ -0,0 +1,53 @@
"""Bus stop schemas."""
from pydantic import BaseModel, field_serializer
from typing import Optional
from datetime import datetime
from uuid import UUID
from app.models.bus_stop import StopType
class BusStopBase(BaseModel):
"""Base bus stop schema."""
name: str
latitude: float
longitude: float
city: str
address: Optional[str] = None
stop_type: StopType = StopType.REGULAR
has_shelter: bool = False
has_seating: bool = False
is_accessible: bool = False
stop_order: Optional[int] = None
class BusStopCreate(BusStopBase):
"""Schema for creating a bus stop."""
pass
class BusStopUpdate(BaseModel):
"""Schema for updating a bus stop."""
name: Optional[str] = None
latitude: Optional[float] = None
longitude: Optional[float] = None
city: Optional[str] = None
address: Optional[str] = None
stop_type: Optional[StopType] = None
has_shelter: Optional[bool] = None
has_seating: Optional[bool] = None
is_accessible: Optional[bool] = None
class BusStopResponse(BusStopBase):
"""Schema for bus stop response."""
id: UUID
created_at: Optional[datetime] = None
updated_at: Optional[datetime] = None
@field_serializer('id')
def serialize_id(self, value: UUID) -> str:
return str(value)
class Config:
from_attributes = True

View File

@ -0,0 +1,22 @@
from pydantic import BaseModel
from typing import Optional
from uuid import UUID
from datetime import datetime
from app.models.report import ReportStatus
class ReportCreate(BaseModel):
message: str
class ReportUpdate(BaseModel):
status: ReportStatus
class ReportResponse(BaseModel):
id: UUID
user_id: Optional[UUID] = None
user_name: Optional[str] = None
message: str
status: ReportStatus
created_at: datetime
class Config:
from_attributes = True

View File

@ -0,0 +1,50 @@
"""Route schemas."""
from pydantic import BaseModel, field_serializer
from typing import Optional
from datetime import datetime
from uuid import UUID
from app.models.route import RouteStatus
class RouteBase(BaseModel):
"""Base route schema."""
name: str
description: Optional[str] = None
origin_city: str
destination_city: str
distance_km: Optional[float] = None
estimated_duration_minutes: Optional[int] = None
average_speed_kmh: Optional[float] = None
status: RouteStatus = RouteStatus.ACTIVE
class RouteCreate(RouteBase):
"""Schema for creating a route."""
pass
class RouteUpdate(BaseModel):
"""Schema for updating a route."""
name: Optional[str] = None
description: Optional[str] = None
origin_city: Optional[str] = None
destination_city: Optional[str] = None
distance_km: Optional[float] = None
estimated_duration_minutes: Optional[int] = None
average_speed_kmh: Optional[float] = None
status: Optional[RouteStatus] = None
class RouteResponse(RouteBase):
"""Schema for route response."""
id: UUID
created_at: Optional[datetime] = None
updated_at: Optional[datetime] = None
@field_serializer('id')
def serialize_id(self, value: UUID) -> str:
return str(value)
class Config:
from_attributes = True

View File

@ -0,0 +1,21 @@
from pydantic import BaseModel
from typing import Optional
from uuid import UUID
class RouteStopBase(BaseModel):
stop_id: UUID
stop_order: Optional[int] = None
travel_time_minutes: Optional[int] = None
stop_delay_minutes: int = 0
is_pickup_point: Optional[bool] = True
is_dropoff_point: Optional[bool] = True
class RouteStopCreate(RouteStopBase):
pass
class RouteStopUpdate(BaseModel):
stop_order: Optional[int] = None
travel_time_minutes: Optional[int] = None
stop_delay_minutes: Optional[int] = None
is_pickup_point: Optional[bool] = None
is_dropoff_point: Optional[bool] = None

View File

@ -0,0 +1,45 @@
"""Shuttle schemas."""
from typing import Optional
from uuid import UUID
from pydantic import BaseModel
class ShuttleBase(BaseModel):
route_name: str
description: Optional[str] = None
origin: str
destination: str
vehicle_type: str
company_name: Optional[str] = None
trip_type: str = "one_way"
price_per_person: Optional[float] = None
price_private_trip: Optional[float] = None
estimated_duration: str
departure_times: Optional[str] = None
contact_whatsapp: str
image_url: Optional[str] = None
is_active: bool = True
class ShuttleCreate(ShuttleBase):
pass
class ShuttleUpdate(BaseModel):
route_name: Optional[str] = None
description: Optional[str] = None
origin: Optional[str] = None
destination: Optional[str] = None
vehicle_type: Optional[str] = None
company_name: Optional[str] = None
trip_type: Optional[str] = None
price_per_person: Optional[float] = None
price_private_trip: Optional[float] = None
estimated_duration: Optional[str] = None
departure_times: Optional[str] = None
contact_whatsapp: Optional[str] = None
image_url: Optional[str] = None
is_active: Optional[bool] = None
class ShuttleRead(ShuttleBase):
id: UUID
class Config:
from_attributes = True

View File

@ -0,0 +1,61 @@
"""User and Auth schemas."""
from pydantic import BaseModel, EmailStr
from typing import Optional
from uuid import UUID
from app.models.user import UserRole, VehicleType
class UserBase(BaseModel):
email: EmailStr
full_name: str
profile_photo_url: Optional[str] = None
class UserUpdate(BaseModel):
full_name: Optional[str] = None
password: Optional[str] = None
profile_photo_url: Optional[str] = None
class PassengerCreate(UserBase):
password: str
class DriverProfileBase(BaseModel):
cedula: str
vehicle_type: VehicleType
license_plate: str
cooperative_name: Optional[str] = None
class DriverCreate(UserBase):
password: str
cedula: str
vehicle_type: VehicleType
license_plate: str
cooperative_name: Optional[str] = None
# Photos will be handled via UploadFile in FastAPI, not in the Pydantic schema for JSON data
class UserResponse(UserBase):
id: UUID
role: UserRole
is_active: bool
is_verified: bool
class Config:
from_attributes = True
class LoginRequest(BaseModel):
email: str
password: str
keep_session: bool = False
class Token(BaseModel):
access_token: str
token_type: str
role: str
full_name: str
profile_photo_url: Optional[str] = None