53 lines
1.8 KiB
Python
53 lines
1.8 KiB
Python
from __future__ import annotations
|
|
|
|
from fastapi import APIRouter, Depends, Query
|
|
|
|
from app.core.deps import DbDep, require_perm
|
|
from app.core.exceptions import ok
|
|
from app.schemas.product import ProductCreate, ProductUpdate
|
|
from app.services import product_service
|
|
|
|
router = APIRouter(prefix="/products", tags=["product"])
|
|
|
|
|
|
@router.get("", dependencies=[Depends(require_perm("product:view"))])
|
|
async def list_products(
|
|
db: DbDep,
|
|
page: int = Query(1, ge=1),
|
|
size: int = Query(20, ge=1, le=200),
|
|
keyword: str | None = None,
|
|
platform_id: int | None = None,
|
|
dept_id: int | None = None,
|
|
) -> dict:
|
|
rows, total = await product_service.paginate(db, page, size, keyword, platform_id, dept_id)
|
|
return ok({
|
|
"list": [(await product_service.to_read(db, p)).model_dump() for p in rows],
|
|
"total": total,
|
|
"page": page,
|
|
"size": size,
|
|
})
|
|
|
|
|
|
@router.get("/{pid}", dependencies=[Depends(require_perm("product:view"))])
|
|
async def get_product(pid: int, db: DbDep) -> dict:
|
|
p = await product_service.get(db, pid)
|
|
return ok((await product_service.to_read(db, p)).model_dump())
|
|
|
|
|
|
@router.post("", dependencies=[Depends(require_perm("product:create"))])
|
|
async def create_product(data: ProductCreate, db: DbDep) -> dict:
|
|
p = await product_service.create(db, data)
|
|
return ok((await product_service.to_read(db, p)).model_dump())
|
|
|
|
|
|
@router.patch("/{pid}", dependencies=[Depends(require_perm("product:update"))])
|
|
async def update_product(pid: int, data: ProductUpdate, db: DbDep) -> dict:
|
|
p = await product_service.update(db, pid, data)
|
|
return ok((await product_service.to_read(db, p)).model_dump())
|
|
|
|
|
|
@router.delete("/{pid}", dependencies=[Depends(require_perm("product:delete"))])
|
|
async def delete_product(pid: int, db: DbDep) -> dict:
|
|
await product_service.delete(db, pid)
|
|
return ok()
|