Initial commit: SIBU 2.0 MISSION
This commit is contained in:
2
backend/app/schemas/__init__.py
Normal file
2
backend/app/schemas/__init__.py
Normal file
@ -0,0 +1,2 @@
|
||||
"""Pydantic schemas for request/response validation."""
|
||||
|
||||
53
backend/app/schemas/bus_stop.py
Normal file
53
backend/app/schemas/bus_stop.py
Normal 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
|
||||
|
||||
22
backend/app/schemas/report.py
Normal file
22
backend/app/schemas/report.py
Normal 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
|
||||
50
backend/app/schemas/route.py
Normal file
50
backend/app/schemas/route.py
Normal 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
|
||||
|
||||
21
backend/app/schemas/route_stop.py
Normal file
21
backend/app/schemas/route_stop.py
Normal 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
|
||||
45
backend/app/schemas/shuttle.py
Normal file
45
backend/app/schemas/shuttle.py
Normal 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
|
||||
61
backend/app/schemas/user.py
Normal file
61
backend/app/schemas/user.py
Normal 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
|
||||
Reference in New Issue
Block a user