2026-08-06 16:02:05 +00:00
|
|
|
from fastapi import APIRouter, Depends, HTTPException, Query
|
|
|
|
|
from sqlalchemy.orm import Session
|
2026-08-04 19:20:19 +00:00
|
|
|
|
2026-08-06 16:02:05 +00:00
|
|
|
from app.database import get_db
|
2026-08-04 19:20:19 +00:00
|
|
|
from app.schemas import EntityResponse, InventoryTreeNode, ListResponse, NodeContext, Relation
|
|
|
|
|
from app.services.inventory import build_inventory_tree, build_node_context, get_badges, get_node_relations
|
|
|
|
|
|
|
|
|
|
router = APIRouter(prefix='/inventory', tags=['inventory'])
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@router.get('/tree', response_model=ListResponse[InventoryTreeNode])
|
|
|
|
|
def inventory_tree(
|
|
|
|
|
root_id: str | None = None,
|
|
|
|
|
depth: int | None = Query(default=None, ge=0),
|
2026-08-06 16:02:05 +00:00
|
|
|
db: Session = Depends(get_db),
|
|
|
|
|
):
|
|
|
|
|
items = build_inventory_tree(db, root_id=root_id, depth=depth)
|
2026-08-04 19:20:19 +00:00
|
|
|
return ListResponse(count=len(items), items=items)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@router.get('/tree/{item_id}', response_model=EntityResponse[InventoryTreeNode])
|
2026-08-06 16:02:05 +00:00
|
|
|
def inventory_subtree(
|
|
|
|
|
item_id: str,
|
|
|
|
|
depth: int | None = Query(default=None, ge=0),
|
|
|
|
|
db: Session = Depends(get_db),
|
|
|
|
|
):
|
|
|
|
|
items = build_inventory_tree(db, root_id=item_id, depth=depth)
|
2026-08-04 19:20:19 +00:00
|
|
|
if not items:
|
|
|
|
|
raise HTTPException(status_code=404, detail='Inventory node not found')
|
|
|
|
|
return EntityResponse(item=items[0])
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@router.get('/nodes/{item_id}/context', response_model=EntityResponse[NodeContext])
|
2026-08-06 16:02:05 +00:00
|
|
|
def node_context(item_id: str, db: Session = Depends(get_db)):
|
|
|
|
|
item = build_node_context(db, item_id)
|
2026-08-04 19:20:19 +00:00
|
|
|
if not item:
|
|
|
|
|
raise HTTPException(status_code=404, detail='Inventory node not found')
|
|
|
|
|
return EntityResponse(item=item)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@router.get('/nodes/{item_id}/badges', response_model=ListResponse[str])
|
2026-08-06 16:02:05 +00:00
|
|
|
def node_badges(item_id: str, db: Session = Depends(get_db)):
|
|
|
|
|
badges = get_badges(db, item_id)
|
2026-08-04 19:20:19 +00:00
|
|
|
return ListResponse(count=len(badges), items=badges)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@router.get('/nodes/{item_id}/relations', response_model=ListResponse[Relation])
|
|
|
|
|
def node_relations(
|
|
|
|
|
item_id: str,
|
|
|
|
|
layer: str | None = None,
|
|
|
|
|
type: str | None = Query(default=None),
|
|
|
|
|
direction: str = Query(default='both', pattern='^(incoming|outgoing|both)$'),
|
2026-08-06 16:02:05 +00:00
|
|
|
db: Session = Depends(get_db),
|
|
|
|
|
):
|
|
|
|
|
items = get_node_relations(db, item_id, layer=layer, rel_type=type, direction=direction)
|
2026-08-04 19:20:19 +00:00
|
|
|
return ListResponse(count=len(items), items=items)
|