diff --git a/rental_backend/routes/item.py b/rental_backend/routes/item.py index f486142..1647177 100644 --- a/rental_backend/routes/item.py +++ b/rental_backend/routes/item.py @@ -1,3 +1,5 @@ +from typing import Literal + from auth_lib.fastapi import UnionAuth from fastapi import APIRouter, Depends, Query from fastapi_sqlalchemy import db @@ -16,17 +18,37 @@ @item.get("", response_model=list[ItemGet]) -async def get_items(type_id: int = Query(None), user=Depends(UnionAuth())) -> list[ItemGet]: +async def get_items( + type_id: int = Query(None), + order_by: Literal["id", "type_id", "is_available"] | None = Query(None), + order: Literal["asc", "desc"] | None = Query(None), + is_available: bool = Query(None), + user=Depends(UnionAuth()), +) -> list[ItemGet]: """ Retrieves a list of items. If `type_id` is specified, only items of that type are returned. - **type_id**: The ID of the item type (optional). - + - **order_by**: Sort field. Available values: id, type_id, is_available. + - **order**: Sort direction: asc (ascending), desc (descending). Works only if order_by is specified. + - **is_available**: true - available, false - unavailable. If not set - all items. Returns a list of items. """ query = Item.query(session=db.session) + if type_id is not None: query = query.filter(Item.type_id == type_id) + + if is_available is not None: + query = query.filter(Item.is_available == is_available) + + new_order = order_by if order_by is not None else "id" + column = getattr(Item, new_order) + if order == "desc": + query = query.order_by(column.desc()) + else: + query = query.order_by(column.asc()) + items = query.all() return [ItemGet.model_validate(item) for item in items]