from fastapi import APIRouter, Depends from fooder.repository.expression import fuzzy_match from fooder.domain import Product from fooder.model.product import ProductModel, ProductCreateModel, ProductUpdateModel from fooder.controller.product import ProductController from fooder.context import Context, AuthContextDependency 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, ): expressions = [] if q: expressions.append( fuzzy_match(Product.name, q) ) return await ctx.repo.product.list(*expressions, limit=limit, offset=offset) @router.patch("/{product_id}", response_model=ProductModel) async def update_product( product_id: int, data: ProductUpdateModel, ctx: Context = Depends(AuthContextDependency()), ): obj = await ctx.repo.product.get(Product.id == product_id) async with ctx.repo.transaction(): await ProductController(ctx, obj).update(data) return 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