FairRelay / brain /app /api /drivers.py
MouleeswaranM's picture
Upload folder using huggingface_hub
fcf8749 verified
"""
Drivers API endpoint.
Handles GET /api/v1/drivers/{id} for driver details.
"""
from datetime import date, timedelta
from uuid import UUID
from fastapi import APIRouter, Depends, HTTPException, status
from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.orm import selectinload
from app.database import get_db
from app.models import Driver, DriverStatsDaily
from app.schemas.driver import DriverResponse, DriverStatsResponse
router = APIRouter(prefix="/drivers", tags=["Drivers"])
@router.get(
"/{driver_id}",
response_model=DriverResponse,
summary="Get driver details",
description="Returns driver details including recent fairness statistics (last 7 days).",
)
async def get_driver(
driver_id: UUID,
db: AsyncSession = Depends(get_db),
) -> DriverResponse:
"""Get driver details by ID."""
# Fetch driver with recent stats
result = await db.execute(
select(Driver)
.where(Driver.id == driver_id)
.options(selectinload(Driver.daily_stats))
)
driver = result.scalar_one_or_none()
if not driver:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail=f"Driver with ID {driver_id} not found",
)
# Get stats for last 7 days
seven_days_ago = date.today() - timedelta(days=7)
recent_stats = [
DriverStatsResponse(
date=stat.date,
avg_workload_score=stat.avg_workload_score,
total_routes=stat.total_routes,
gini_contribution=stat.gini_contribution,
reported_stress_level=stat.reported_stress_level,
reported_fairness_score=stat.reported_fairness_score,
)
for stat in driver.daily_stats
if stat.date >= seven_days_ago
]
# Sort by date descending
recent_stats.sort(key=lambda x: x.date, reverse=True)
return DriverResponse(
id=driver.id,
external_id=driver.external_id,
name=driver.name,
phone=driver.phone,
whatsapp_number=driver.whatsapp_number,
preferred_language=driver.preferred_language.value,
vehicle_type=driver.vehicle_type.value,
vehicle_capacity_kg=driver.vehicle_capacity_kg,
license_number=driver.license_number,
created_at=driver.created_at,
updated_at=driver.updated_at,
recent_stats=recent_stats,
)
@router.get(
"/external/{external_id}",
response_model=DriverResponse,
summary="Get driver by external ID",
description="Returns driver details by external ID (from integration system).",
)
async def get_driver_by_external_id(
external_id: str,
db: AsyncSession = Depends(get_db),
) -> DriverResponse:
"""Get driver details by external ID."""
result = await db.execute(
select(Driver)
.where(Driver.external_id == external_id)
.options(selectinload(Driver.daily_stats))
)
driver = result.scalar_one_or_none()
if not driver:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail=f"Driver with external ID {external_id} not found",
)
# Get stats for last 7 days
seven_days_ago = date.today() - timedelta(days=7)
recent_stats = [
DriverStatsResponse(
date=stat.date,
avg_workload_score=stat.avg_workload_score,
total_routes=stat.total_routes,
gini_contribution=stat.gini_contribution,
reported_stress_level=stat.reported_stress_level,
reported_fairness_score=stat.reported_fairness_score,
)
for stat in driver.daily_stats
if stat.date >= seven_days_ago
]
recent_stats.sort(key=lambda x: x.date, reverse=True)
return DriverResponse(
id=driver.id,
external_id=driver.external_id,
name=driver.name,
phone=driver.phone,
whatsapp_number=driver.whatsapp_number,
preferred_language=driver.preferred_language.value,
vehicle_type=driver.vehicle_type.value,
vehicle_capacity_kg=driver.vehicle_capacity_kg,
license_number=driver.license_number,
created_at=driver.created_at,
updated_at=driver.updated_at,
recent_stats=recent_stats,
)