Renumber the 15 reference docs into pillar groups (recipe -> anatomy): - 01 Build Recipe (entry), 02 Composition Root - domains: 10 Layering Rules - contract: 20 Spec-First Routing, 21 CRUD Template, 22 Auth Integration - interfaces/infra: 30 Infra Adapters - UI: 40 UI: Auto-Rendered Admin & Custom Pages (new; @aetoskia packages, client template, x- catalog via react-openapi MCP module) - pipelines: 50 Pipeline Scaffold, 51 Worker & Progress, 52 Human-in-the-Loop - delivery/meta: 90 Drone Pipelines, 91 Versioning & Changelog, 92 Genericity Matrix, 93 Library Registry, 94 Repository Inventory MCP module names are unchanged (NN_ prefix stripped); all cross-references (wiki, templates, hooks, registry) updated; lib index rewritten pillar-first; build recipe bootstraps the client template. Bundle + HTML sites regenerated.
91 lines
2.4 KiB
Python
91 lines
2.4 KiB
Python
"""# Summary
|
|
|
|
Item route handlers — names must match openapi.yaml operationIds.
|
|
"""
|
|
from fastapi import Request, Response
|
|
|
|
from interfaces._common import delete_or_404, dump, paginate, read_or_404, svc
|
|
|
|
|
|
async def list_items(request: Request, limit: int = 20, offset: int = 0) -> dict:
|
|
"""List items (paginated). ``limit=0`` returns all remaining items.
|
|
|
|
Args:
|
|
request (Request): Incoming request.
|
|
limit (int): Page size. Defaults to 20.
|
|
offset (int): Items to skip. Defaults to 0.
|
|
|
|
Returns:
|
|
dict: ``{"total": int, "items": list[Item]}``.
|
|
"""
|
|
docs = await svc(request, "item").search({})
|
|
return paginate([dump(d) for d in docs], limit, offset)
|
|
|
|
|
|
async def create_item(request: Request, body: dict, response: Response) -> dict:
|
|
"""Create an item.
|
|
|
|
Args:
|
|
request (Request): Incoming request.
|
|
body (dict): Item fields (``id`` ignored).
|
|
response (Response): Response object; set to 201 on success.
|
|
|
|
Returns:
|
|
dict: The created item.
|
|
"""
|
|
response.status_code = 201
|
|
body.pop("id", None)
|
|
doc = await svc(request, "item").create(body)
|
|
return dump(doc)
|
|
|
|
|
|
async def get_item(request: Request, id: int) -> dict:
|
|
"""Fetch one item by id.
|
|
|
|
Args:
|
|
request (Request): Incoming request.
|
|
id (int): Item identifier.
|
|
|
|
Returns:
|
|
dict: The item document.
|
|
|
|
Raises:
|
|
HTTPException: 404 when the item does not exist.
|
|
"""
|
|
return dump(await read_or_404(svc(request, "item"), id, "item"))
|
|
|
|
|
|
async def update_item(request: Request, id: int, body: dict) -> dict:
|
|
"""Replace an item by id.
|
|
|
|
Args:
|
|
request (Request): Incoming request.
|
|
id (int): Item identifier.
|
|
body (dict): Full replacement payload.
|
|
|
|
Returns:
|
|
dict: The updated item.
|
|
|
|
Raises:
|
|
HTTPException: 404 when the item does not exist.
|
|
"""
|
|
await read_or_404(svc(request, "item"), id, "item")
|
|
body.pop("id", None)
|
|
doc = await svc(request, "item").update(id, body)
|
|
return dump(doc)
|
|
|
|
|
|
async def delete_item(request: Request, id: int, response: Response) -> None:
|
|
"""Delete an item by id.
|
|
|
|
Args:
|
|
request (Request): Incoming request.
|
|
id (int): Item identifier.
|
|
response (Response): Response object; set to 204 on success.
|
|
|
|
Raises:
|
|
HTTPException: 404 when the item does not exist.
|
|
"""
|
|
await delete_or_404(svc(request, "item"), id, "item")
|
|
response.status_code = 204
|