from fastapi import APIRouter, Depends, HTTPException from prisma import Prisma from typing import List from app.models.proveedor import ProveedorCreate, ProveedorUpdate, ProveedorResponse from app.api.dependencies import get_prisma router = APIRouter(prefix="/proveedores", tags=["proveedores"]) @router.get("/", response_model=List[ProveedorResponse]) async def listar_proveedores( skip: int = 0, limit: int = 100, activo: bool = True, db: Prisma = Depends(get_prisma) ): """Listar todos los proveedores""" proveedores = await db.proveedor.find_many( where={"activo": activo} if activo else {}, skip=skip, take=limit ) return proveedores @router.get("/{proveedor_id}", response_model=ProveedorResponse) async def obtener_proveedor( proveedor_id: int, db: Prisma = Depends(get_prisma) ): """Obtener un proveedor por ID""" proveedor = await db.proveedor.find_unique(where={"id": proveedor_id}) if not proveedor: raise HTTPException(status_code=404, detail="Proveedor no encontrado") return proveedor @router.post("/", response_model=ProveedorResponse, status_code=201) async def crear_proveedor( proveedor: ProveedorCreate, db: Prisma = Depends(get_prisma) ): """Crear un nuevo proveedor""" try: nuevo_proveedor = await db.proveedor.create(data=proveedor.dict()) return nuevo_proveedor except Exception as e: raise HTTPException(status_code=400, detail=str(e)) @router.put("/{proveedor_id}", response_model=ProveedorResponse) async def actualizar_proveedor( proveedor_id: int, proveedor: ProveedorUpdate, db: Prisma = Depends(get_prisma) ): """Actualizar un proveedor""" proveedor_existente = await db.proveedor.find_unique(where={"id": proveedor_id}) if not proveedor_existente: raise HTTPException(status_code=404, detail="Proveedor no encontrado") data = {k: v for k, v in proveedor.dict().items() if v is not None} proveedor_actualizado = await db.proveedor.update( where={"id": proveedor_id}, data=data ) return proveedor_actualizado @router.delete("/{proveedor_id}", status_code=204) async def eliminar_proveedor( proveedor_id: int, db: Prisma = Depends(get_prisma) ): """Eliminar un proveedor (soft delete)""" proveedor = await db.proveedor.find_unique(where={"id": proveedor_id}) if not proveedor: raise HTTPException(status_code=404, detail="Proveedor no encontrado") await db.proveedor.update( where={"id": proveedor_id}, data={"activo": False} ) return None