from typing import Any, List, Optional from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy.orm import Session from app import crud, models, schemas from app.api import deps router = APIRouter() @router.get("/", response_model=List[schemas.Product]) def read_products( db: Session = Depends(deps.get_db), skip: int = 0, limit: int = 100, name: Optional[str] = None, category_id: Optional[int] = None, min_price: Optional[float] = None, max_price: Optional[float] = None, in_stock: Optional[bool] = None, ) -> Any: """ Retrieve products with filtering options. """ filter_params = schemas.ProductFilterParams( name=name, category_id=category_id, min_price=min_price, max_price=max_price, in_stock=in_stock, ) products = crud.product.search_products( db, filter_params=filter_params, skip=skip, limit=limit ) return products @router.post("/", response_model=schemas.Product) def create_product( *, db: Session = Depends(deps.get_db), product_in: schemas.ProductCreate, current_user: models.User = Depends(deps.get_current_admin_user), ) -> Any: """ Create new product (admin only). """ product = crud.product.create(db, obj_in=product_in) return product @router.get("/{id}", response_model=schemas.Product) def read_product( *, db: Session = Depends(deps.get_db), id: int, ) -> Any: """ Get product by ID. """ product = crud.product.get(db, id=id) if not product: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail="Product not found", ) return product @router.put("/{id}", response_model=schemas.Product) def update_product( *, db: Session = Depends(deps.get_db), id: int, product_in: schemas.ProductUpdate, current_user: models.User = Depends(deps.get_current_admin_user), ) -> Any: """ Update a product (admin only). """ product = crud.product.get(db, id=id) if not product: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail="Product not found", ) product = crud.product.update(db, db_obj=product, obj_in=product_in) return product @router.delete("/{id}", status_code=status.HTTP_204_NO_CONTENT, response_model=None) def delete_product( *, db: Session = Depends(deps.get_db), id: int, current_user: models.User = Depends(deps.get_current_admin_user), ) -> None: """ Delete a product (admin only). """ product = crud.product.get(db, id=id) if not product: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail="Product not found", ) crud.product.remove(db, id=id)