from typing import List from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy.ext.asyncio import AsyncSession from backend.api.deps import AuthUser, require_admin from backend.db.session import get_session from backend.modules.customers.schemas import CustomerCreate, CustomerOut, CustomerUpdate from backend.modules.customers.service import create_customer, list_customers, update_customer, delete_customer router = APIRouter(prefix="/api/v1/customers", tags=["customers"]) @router.get("", response_model=List[CustomerOut]) async def get_customers( session: AsyncSession = Depends(get_session), auth_user: AuthUser = Depends(require_admin), ) -> List[CustomerOut]: customers = await list_customers(session) return [CustomerOut.model_validate(c) for c in customers] @router.post("", response_model=CustomerOut, status_code=status.HTTP_201_CREATED) async def create_customer_endpoint( payload: CustomerCreate, session: AsyncSession = Depends(get_session), auth_user: AuthUser = Depends(require_admin), ) -> CustomerOut: customer = await create_customer(session, payload.model_dump(), auth_user.user) return CustomerOut.model_validate(customer) @router.put("/{customer_id}", response_model=CustomerOut) async def update_customer_endpoint( customer_id: int, payload: CustomerUpdate, session: AsyncSession = Depends(get_session), auth_user: AuthUser = Depends(require_admin), ) -> CustomerOut: customer = await update_customer(session, customer_id, payload.model_dump(exclude_unset=True), auth_user.user) return CustomerOut.model_validate(customer) @router.delete("/{customer_id}", status_code=status.HTTP_204_NO_CONTENT) async def delete_customer_endpoint( customer_id: int, session: AsyncSession = Depends(get_session), auth_user: AuthUser = Depends(require_admin), ): await delete_customer(session, customer_id, auth_user.user)