Files
plantillas-proyectos/backend/api/v1/modules/a76/transportation/drivers/routes.py
2026-03-02 15:28:50 -07:00

83 lines
2.9 KiB
Python

from typing import Any, Dict, List
from core.database import get_core_db
from core.security import get_current_user, validate_access_to_resource
from fastapi import APIRouter, Depends, HTTPException, Query, status
from sqlalchemy.orm import Session
from .dto import DriverCreateDTO, DriverResponseDTO
from .models import Driver
from .services import DriverService
from .imports.routes import router as imports_router
router = APIRouter(prefix="/drivers")
# CSV import (upload -> scan -> status -> commit)
router.include_router(imports_router, prefix="/imports", tags=["a76 / drivers / csv_import"])
@router.get("/", response_model=Dict[str, Any])
async def list_drivers(
company_id: int = Query(..., description="Company ID for filtering"),
page: int = Query(1, ge=1, description="Page number"),
page_size: int = Query(50, ge=1, le=100, description="Page size"),
db: Session = Depends(get_core_db),
current_user: dict = Depends(get_current_user),
):
tenant_id = validate_access_to_resource(db, company_id, current_user)
drivers = DriverService.list_drivers(db, str(company_id), tenant_id)
total = len(drivers)
# Aplicar paginación manualmente
skip = (page - 1) * page_size
paginated_drivers = drivers[skip : skip + page_size]
return {
"items": [DriverResponseDTO.model_validate(driver) for driver in paginated_drivers],
"total": total,
"page": page,
"page_size": page_size,
}
@router.get("/{transporter_key}/{line}", response_model=DriverResponseDTO)
async def read_driver(
transporter_key: str,
line: int,
company_id: int = Query(..., description="Company ID for filtering"),
db: Session = Depends(get_core_db),
current_user: dict = Depends(get_current_user),
):
tenant_id = validate_access_to_resource(db, company_id, current_user)
driver = DriverService.get_driver_by_key_and_line(
db, transporter_key, line, str(company_id), tenant_id
)
if not driver:
raise HTTPException(status_code=404, detail="Driver not found")
return driver
@router.post("/", response_model=DriverResponseDTO, status_code=status.HTTP_201_CREATED)
async def create_driver(
driver_data: DriverCreateDTO,
db: Session = Depends(get_core_db),
current_user: dict = Depends(get_current_user),
):
return DriverService.create_driver(db, driver_data)
@router.delete("/{transporter_key}/{line}", status_code=status.HTTP_204_NO_CONTENT)
async def delete_driver(
transporter_key: str,
line: int,
company_id: int = Query(..., description="Company ID for filtering"),
db: Session = Depends(get_core_db),
current_user: dict = Depends(get_current_user),
):
tenant_id = validate_access_to_resource(db, company_id, current_user)
driver = DriverService.delete_driver(
db, transporter_key, line, str(company_id), tenant_id
)
if not driver:
raise HTTPException(status_code=404, detail="Driver not found")