Add sorting

This commit is contained in:
Jacob Windsor 2025-02-19 17:52:11 +01:00
parent dc0d2acf53
commit 6b458654a7
2 changed files with 21 additions and 7 deletions

View File

@ -1,9 +1,9 @@
from typing import Annotated from typing import Annotated, Literal
from uuid import UUID from uuid import UUID
from fastapi import Depends from fastapi import Depends
from sqlalchemy.ext.asyncio.session import AsyncSession from sqlalchemy.ext.asyncio.session import AsyncSession
from sqlmodel import select from sqlmodel import asc, desc, select
from ..models.house import House from ..models.house import House
from ..providers.db_provider import get_session from ..providers.db_provider import get_session
@ -13,8 +13,19 @@ class HouseRepository:
def __init__(self, session: Annotated[AsyncSession, Depends(get_session)]) -> None: def __init__(self, session: Annotated[AsyncSession, Depends(get_session)]) -> None:
self.session = session self.session = session
async def get_all(self, limit: int = 100, offset: int = 0) -> list[House]: async def get_all(
statement = select(House).offset(offset).limit(limit) self,
limit: int = 100,
offset: int = 0,
order_by: Literal["PRICE"] = "PRICE",
sort_order: Literal["ASC", "DESC"] = "DESC",
) -> list[House]:
sorter = desc if sort_order == "DESC" else asc
statement = (
select(House).offset(offset).limit(limit).order_by(sorter(House.price))
)
result = await self.session.execute(statement) result = await self.session.execute(statement)
return result.scalars().all() return result.scalars().all()

View File

@ -1,4 +1,4 @@
from typing import Annotated from typing import Annotated, Literal
from fastapi import APIRouter, Depends from fastapi import APIRouter, Depends
@ -48,10 +48,14 @@ async def create_house(
@router.get("") @router.get("")
async def get_all_houses( async def get_all_houses(
house_repository: Annotated[HouseRepository, Depends()], house_repository: Annotated[HouseRepository, Depends()],
order_by: Literal["PRICE"] = "PRICE",
sort_order: Literal["ASC", "DESC"] = "DESC",
limit: int = 100, limit: int = 100,
offset: int = 0, offset: int = 0,
) -> HousesListResponse: ) -> HousesListResponse:
all_houses = await house_repository.get_all(offset=offset, limit=limit) all_houses = await house_repository.get_all(
offset=offset, limit=limit, order_by=order_by, sort_order=sort_order
)
house_responses = [ house_responses = [
HouseResponse( HouseResponse(
@ -64,6 +68,5 @@ async def get_all_houses(
) )
for house in all_houses for house in all_houses
] ]
print(house_responses)
return HousesListResponse(houses=house_responses) return HousesListResponse(houses=house_responses)