46 lines
1.4 KiB
Python
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
|