Skip to content

Commit ab13e8d

Browse files
authored
Merge pull request #35 from GenerateNU/qihong/search-filter-items
GET items search and filter
2 parents 06c0f4e + 9807afb commit ab13e8d

File tree

4 files changed

+63
-4
lines changed

4 files changed

+63
-4
lines changed

app/api/endpoints/item.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
from fastapi import APIRouter, Body, Depends, HTTPException, status
44

55
from app.api.endpoints.user import get_current_user
6-
from app.models.item import item_model
6+
from app.core.enums import SortOrder
7+
from app.models.item import ItemSortParam, item_model
78
from app.schemas.item import CreateItemRequest, Item, UpdateItemRequest
89
from app.schemas.user import User, UserType
910
from app.services.item import ItemService
@@ -27,8 +28,13 @@ async def post_item(
2728

2829

2930
@router.get("/all", response_model=list[Item])
30-
async def get_items() -> list[Item]:
31-
return await item_model.get_all_items()
31+
async def get_items(
32+
search_text: str | None = None,
33+
vendor_id: str | None = None,
34+
sort_by: ItemSortParam | None = None,
35+
sort_order: SortOrder = SortOrder.ASC,
36+
) -> list[Item]:
37+
return await item_model.get_items(search_text, vendor_id, sort_by, sort_order)
3238

3339

3440
@router.get("/{item_id}", response_model=Item)

app/core/enums.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
from enum import Enum
2+
3+
4+
class SortOrder(str, Enum):
5+
ASC = "asc"
6+
DESC = "desc"

app/models/item.py

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@
44
from fastapi import HTTPException
55
from motor.motor_asyncio import AsyncIOMotorCollection # noqa: TCH002
66

7+
from app.core.enums import SortOrder
78
from app.database.mongodb import db
8-
from app.schemas.item import CreateItemRequest, Item, UpdateItemRequest
9+
from app.schemas.item import CreateItemRequest, Item, ItemSortParam, UpdateItemRequest
910
from app.utils.object_id import parse_object_id
1011

1112

@@ -31,6 +32,36 @@ async def get_all_items(self) -> list[Item]:
3132

3233
return [self.to_item(item) for item in items_list]
3334

35+
async def get_items(
36+
self,
37+
search_text: str | None = None,
38+
vendor_id: str | None = None,
39+
sort_by: ItemSortParam | None = None,
40+
sort_order: SortOrder = SortOrder.ASC,
41+
) -> list[Item]:
42+
query = {}
43+
44+
if search_text:
45+
query["name"] = {
46+
"$regex": search_text,
47+
"$options": "i",
48+
} # case-insensitive partial match
49+
50+
if vendor_id:
51+
query["vendor_id"] = ObjectId(vendor_id)
52+
53+
sort_criteria = []
54+
if sort_by:
55+
sort_direction = 1 if sort_order == SortOrder.ASC else -1
56+
sort_criteria.append((sort_by.field_name, sort_direction))
57+
58+
if sort_criteria:
59+
items_list = await self.collection.find(query).sort(sort_criteria).to_list()
60+
else:
61+
items_list = await self.collection.find(query).to_list()
62+
63+
return [self.to_item(item) for item in items_list]
64+
3465
async def get_item(self, item_id: str) -> Item | None:
3566
item_obj_id = parse_object_id(item_id)
3667

app/schemas/item.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from datetime import datetime
2+
from enum import Enum
23

34
from pydantic import BaseModel
45

@@ -16,6 +17,21 @@ class Config:
1617
from_attributes = True
1718

1819

20+
class ItemSortParam(str, Enum):
21+
DATE = "date"
22+
NAME = "name"
23+
COINS = "coins"
24+
25+
@property
26+
def field_name(self) -> str:
27+
field_mapping = {
28+
ItemSortParam.DATE: "time_posted",
29+
ItemSortParam.NAME: "name",
30+
ItemSortParam.COINS: "price",
31+
}
32+
return field_mapping[self]
33+
34+
1935
class CreateItemRequest(BaseModel):
2036
name: str
2137
expiration: datetime

0 commit comments

Comments
 (0)