from fastapi import APIRouter, Depends from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.orm import selectinload from app.db.session import get_session from app.models.car import CarMake, CarModel from app.schemas.car import CarMakeRead router = APIRouter(prefix="/catalog", tags=["catalog"]) @router.get("/makes", response_model=list[CarMakeRead]) async def list_makes(session: AsyncSession = Depends(get_session)) -> list[CarMake]: result = await session.execute( select(CarMake) .options(selectinload(CarMake.models).selectinload(CarModel.trims)) .order_by(CarMake.name) ) makes = list(result.scalars()) for make in makes: make.models.sort(key=lambda model: model.name) for model in make.models: model.trims.sort(key=lambda trim: trim.name) return makes