fooder-api/fooder/view/product.py

46 lines
1.4 KiB
Python

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