from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.future import select from typing import List, Optional from database.session import get_db from database.models import Category as CategoryModel, Service as ServiceModel import schemas router = APIRouter( prefix="/services", tags=["services"] ) @router.get("/categories", response_model=List[schemas.Category]) async def get_categories(db: AsyncSession = Depends(get_db)): """ Get all active categories. """ result = await db.execute( select(CategoryModel) .where(CategoryModel.is_active == True) .order_by(CategoryModel.sort_order) ) return result.scalars().all() @router.get("/", response_model=List[schemas.Service]) async def get_services( category_id: Optional[int] = None, db: AsyncSession = Depends(get_db) ): """ Get all active services, optionally filtered by category. """ query = select(ServiceModel).where(ServiceModel.status == "active") if category_id: query = query.where(ServiceModel.category_id == category_id) result = await db.execute(query) return result.scalars().all() @router.get("/{service_id}", response_model=schemas.Service) async def get_service(service_id: int, db: AsyncSession = Depends(get_db)): """ Get a specific service by ID. """ result = await db.execute( select(ServiceModel).where(ServiceModel.id == service_id) ) service = result.scalar_one_or_none() if not service: raise HTTPException(status_code=404, detail="Service not found") return service