from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy.ext.asyncio import AsyncSession from app.core.database import get_db from app.crud import audit as audit_crud from app.crud import manufacturer as manufacturer_crud from app.deps import require_permission from app.models.user import User from app.schemas.manufacturer import ManufacturerCreate, ManufacturerRead, ManufacturerUpdate router = APIRouter() @router.get("", response_model=list[ManufacturerRead]) async def list_manufacturers( skip: int = 0, limit: int = 100, db: AsyncSession = Depends(get_db), _: User = Depends(require_permission("manufacturers:read")), ): return await manufacturer_crud.list_all(db, skip=skip, limit=limit) @router.post("", response_model=ManufacturerRead, status_code=status.HTTP_201_CREATED) async def create_manufacturer( payload: ManufacturerCreate, db: AsyncSession = Depends(get_db), actor: User = Depends(require_permission("manufacturers:write")), ): m = await manufacturer_crud.create( db, name=payload.name, url=str(payload.url), logo_url=str(payload.logo_url) if payload.logo_url else None, ) await audit_crud.log( db, actor=actor, action="create", resource_type="Manufacturer", resource_id=m.id, description=audit_crud.describe_create("Manufacturer", m.id, m.name), ) return m @router.get("/{manufacturer_id}", response_model=ManufacturerRead) async def get_manufacturer( manufacturer_id: int, db: AsyncSession = Depends(get_db), _: User = Depends(require_permission("manufacturers:read")), ): m = await manufacturer_crud.get(db, manufacturer_id) if m is None: raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Manufacturer not found") return m @router.patch("/{manufacturer_id}", response_model=ManufacturerRead) async def update_manufacturer( manufacturer_id: int, payload: ManufacturerUpdate, db: AsyncSession = Depends(get_db), actor: User = Depends(require_permission("manufacturers:write")), ): m = await manufacturer_crud.get(db, manufacturer_id) if m is None: raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Manufacturer not found") data = payload.model_dump(exclude_unset=True) if "url" in data and data["url"] is not None: data["url"] = str(data["url"]) if "logo_url" in data and data["logo_url"] is not None: data["logo_url"] = str(data["logo_url"]) m = await manufacturer_crud.update(db, m, data) await audit_crud.log( db, actor=actor, action="update", resource_type="Manufacturer", resource_id=m.id, description=audit_crud.describe_update("Manufacturer", m.id, data), ) return m @router.delete("/{manufacturer_id}", status_code=status.HTTP_204_NO_CONTENT) async def delete_manufacturer( manufacturer_id: int, db: AsyncSession = Depends(get_db), actor: User = Depends(require_permission("manufacturers:delete")), ): m = await manufacturer_crud.get(db, manufacturer_id) if m is None: raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Manufacturer not found") name = m.name await manufacturer_crud.delete(db, m) await audit_crud.log( db, actor=actor, action="delete", resource_type="Manufacturer", resource_id=manufacturer_id, description=audit_crud.describe_delete("Manufacturer", manufacturer_id, name), )