180 lines
3.2 KiB
Python
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
|