57 lines
1.6 KiB
Python
57 lines
1.6 KiB
Python
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"])
|
|
|
|
_auth_ctx = AuthContextDependency()
|
|
|
|
|
|
@router.get("", response_model=list[ProductModel])
|
|
async def list_products(
|
|
ctx: Context = Depends(_auth_ctx),
|
|
limit: int = 10,
|
|
offset: int = 0,
|
|
q: str | None = None,
|
|
):
|
|
return await ctx.repo.product.list_for_user(
|
|
q=q, limit=limit, offset=offset, user_id=ctx.user.id
|
|
)
|
|
|
|
|
|
@router.patch("/{product_id}", response_model=ProductModel)
|
|
async def update_product(
|
|
product_id: int,
|
|
data: ProductUpdateModel,
|
|
ctx: Context = Depends(_auth_ctx),
|
|
):
|
|
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(_auth_ctx),
|
|
):
|
|
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(_auth_ctx),
|
|
):
|
|
async with ctx.repo.transaction():
|
|
ctrl = await ProductController.create(ctx, data)
|
|
return ctrl.obj
|