add inventory sorting to the api

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
2026-11-12 12:07:15 -07:00
parent c17d8a9f8a
commit 8f3bff2e62
2 changed files with 50 additions and 1 deletions

View File

@@ -75,10 +75,35 @@ def _find(db: DbSession, user: User, class_name: str) -> InventoryEntry | None:
).scalar_one_or_none()
def _sort_key_name(item):
return (item["name"].lower(), item["class_name"])
def _sort_key_category(item):
return ((item["category"] or "").lower(), item["name"].lower(), item["class_name"])
def _sort_key_quantity(item):
return (-item["quantity"], item["name"].lower(), item["class_name"])
def _sort_key_updated(item):
return (-item["updated_at"].timestamp(), item["name"].lower())
_SORT_KEYS = {
"name": _sort_key_name,
"category": _sort_key_category,
"quantity": _sort_key_quantity,
"updated": _sort_key_updated,
}
@router.get("", response_model=InventoryPage)
def list_inventory(
category: str | None = None,
search: str | None = None,
sort: str = Query(default="name", pattern="^(name|category|quantity|updated)$"),
page: int = Query(default=1, ge=1),
page_size: int = Query(default=25, ge=1),
user: User = Depends(get_current_user),
@@ -102,7 +127,7 @@ def list_inventory(
if needle in i["name"].lower() or needle in i["class_name"].lower()
]
items.sort(key=lambda i: (i["name"].lower(), i["class_name"]))
items.sort(key=_SORT_KEYS[sort])
total = len(items)
total_pages = max(1, math.ceil(total / page_size))
start = (page - 1) * page_size