Skip to content
26 changes: 24 additions & 2 deletions rental_backend/routes/item.py
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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]

Expand Down
Loading