Files
Erick Cesar Mondragon Palacios 7da903a0ab Agrega backend FastAPI al proyecto
2026-05-22 23:15:56 -06:00

180 lines
3.2 KiB
Python

from datetime import datetime
from pydantic import BaseModel, Field
class UserOut(BaseModel):
id: int
name: str
email: str
phone: str | None
role: str
model_config = {"from_attributes": True}
class TokenOut(BaseModel):
access_token: str
token_type: str = "bearer"
user: UserOut
class LoginIn(BaseModel):
email: str
password: str
class RegisterIn(BaseModel):
name: str = Field(min_length=3, max_length=120)
email: str
phone: str | None = None
password: str = Field(min_length=6, max_length=80)
role: str = "ciudadano"
class PositionOut(BaseModel):
position_id: int
lat: float
lng: float
speed: int
timestamp: str
model_config = {"from_attributes": True}
class RouteOut(BaseModel):
route_id: str
name: str
truck_id: int
status: str
current_position_id: int
assigned_operator_id: int | None = None
model_config = {"from_attributes": True}
class RouteDetailOut(RouteOut):
positions: list[PositionOut]
class ColoniaOut(BaseModel):
colonia: str
route_id: str
horario_estimado: str
model_config = {"from_attributes": True}
class DomicilioCreate(BaseModel):
tipo: str = "Casa principal"
direccion: str
colonia: str
lat: float | None = None
lng: float | None = None
class DomicilioOut(BaseModel):
id: int
tipo: str
direccion: str
colonia: str
lat: float | None
lng: float | None
route_id: str
model_config = {"from_attributes": True}
class EtaOut(BaseModel):
domicilio_id: int
route_id: str
route_name: str
truck_id: int
colonia: str
horario_estimado: str
eta_message: str
current_position_id: int
privacy_note: str
class AlertCreate(BaseModel):
type: str
title: str
message: str
route_id: str
priority: int = 1
class AlertOut(BaseModel):
id: int
type: str
title: str
message: str
route_id: str
truck_id: int
operator_id: int | None
priority: int
status: str
created_at: datetime
model_config = {"from_attributes": True}
class ReportCreate(BaseModel):
domicilio_id: int
type: str
comment: str = Field(min_length=5, max_length=800)
class ReportOut(BaseModel):
id: int
user_id: int
domicilio_id: int
type: str
comment: str
status: str
created_at: datetime
model_config = {"from_attributes": True}
class ReportStatusUpdate(BaseModel):
status: str = Field(pattern="^(NUEVO|EN_REVISION|ATENDIDO|CERRADO)$")
class RatingCreate(BaseModel):
domicilio_id: int
stars: int = Field(ge=1, le=5)
comment: str | None = Field(default=None, max_length=400)
class RatingOut(BaseModel):
id: int
user_id: int
domicilio_id: int
stars: int
comment: str | None
created_at: datetime
model_config = {"from_attributes": True}
class OperatorActionOut(BaseModel):
ok: bool
route: RouteOut
alert: AlertOut | None = None
message: str
class AssignOperatorIn(BaseModel):
operator_id: int
class DashboardOut(BaseModel):
routes_total: int
active_routes: int
trucks_total: int
operators_total: int
alerts_open: int
reports_open: int
average_rating: float