from fastapi import APIRouter, Depends from fooder.model.product import ProductModel, ProductCreateModel, ProductUpdateModel from fooder.controller.product import ProductController from fooder.context import Context, AuthContextDependency from fooder.exc import NotFound router = APIRouter(tags=["product"]) @router.get("", response_model=list[ProductModel]) async def list_products( ctx: Context = Depends(AuthContextDependency()), limit: int = 10, offset: int = 0, q: str | None = None, ): return await ctx.repo.product.list(q=q, limit=limit, offset=offset) @router.patch("/{product_id}", response_model=ProductModel) async def update_product( product_id: int, data: ProductUpdateModel, ctx: Context = Depends(AuthContextDependency()), ): async with ctx.repo.transaction(): obj = await ctx.repo.product.get_by_id(product_id) await ProductController(ctx, obj).update(data) return obj @router.get("/barcode/{barcode}", response_model=ProductModel) async def get_by_barcode( barcode: str, ctx: Context = Depends(AuthContextDependency()), ): try: return await ctx.repo.product.get_by_barcode(barcode) except NotFound: async with ctx.repo.transaction(): ctrl = await ProductController.import_by_barcode(ctx, barcode) return ctrl.obj @router.post("", response_model=ProductModel, status_code=201) async def create_product( data: ProductCreateModel, ctx: Context = Depends(AuthContextDependency()), ): async with ctx.repo.transaction(): ctrl = await ProductController.create(ctx, data) return ctrl.obj