|
| 1 | +from datetime import UTC, datetime |
1 | 2 | from typing import Annotated |
2 | 3 |
|
| 4 | +from core.models.details import Audience |
| 5 | +from core.models.shoes import Sneaker |
3 | 6 | from fastapi import APIRouter, HTTPException, Query |
4 | 7 |
|
5 | 8 | from api.data.instance import DEFAULT_LIMIT, DEFAULT_OFFSET |
6 | 9 | from api.data.models import SortKey, SortOrder |
7 | | -from api.data.queries import find_sneakers |
8 | | -from core.models.details import Audience |
9 | | -from core.models.shoes import Sneaker |
10 | 10 |
|
11 | 11 | router = APIRouter( |
12 | 12 | prefix="/sneakers", |
|
16 | 16 | @router.get("/") |
17 | 17 | async def get_sneakers( |
18 | 18 | brand: str | None = None, |
19 | | - sku: str | None = None, |
20 | 19 | name: str | None = None, |
21 | | - colorway: str | None = None, |
22 | 20 | audience: Audience | None = None, |
23 | 21 | releaseDate: str | None = None, |
24 | 22 | released: bool | None = None, |
25 | 23 | sort: SortKey = SortKey.RELEASE_DATE, |
26 | | - sortOrder: SortOrder = SortOrder.DESCENDING, |
| 24 | + order: SortOrder = SortOrder.DESCENDING, |
27 | 25 | offset: Annotated[int, Query(gte=DEFAULT_OFFSET)] = DEFAULT_OFFSET, |
28 | 26 | limit: Annotated[int, Query(gte=1, lte=100)] = DEFAULT_LIMIT, |
29 | 27 | ): |
30 | | - return await find_sneakers( |
31 | | - brand=brand, |
32 | | - sku=sku, |
33 | | - name=name, |
34 | | - colorway=colorway, |
35 | | - audience=audience, |
36 | | - release_date=releaseDate, |
37 | | - released=released, |
38 | | - sort_by=sort, |
39 | | - sort_order=sortOrder, |
40 | | - offset=offset, |
41 | | - limit=limit, |
| 28 | + query = Sneaker.find() |
| 29 | + if brand: |
| 30 | + query = query.find(Sneaker.brand == brand) |
| 31 | + if name: |
| 32 | + query = query.find(Sneaker.name == name) |
| 33 | + if audience: |
| 34 | + query = query.find(Sneaker.audience == audience) |
| 35 | + if released is not None: |
| 36 | + now = datetime.now(UTC) |
| 37 | + if released: |
| 38 | + query = query.find(Sneaker.releaseDate <= now) |
| 39 | + else: |
| 40 | + query = query.find(Sneaker.releaseDate > now) |
| 41 | + elif releaseDate: |
| 42 | + if ":" in releaseDate: |
| 43 | + inequality_operator, date_str = releaseDate.split(":") |
| 44 | + date_obj = datetime.strptime(date_str, "%Y-%m-%d") |
| 45 | + if inequality_operator == "lt": |
| 46 | + query = query.find(Sneaker.releaseDate < date_obj) |
| 47 | + elif inequality_operator == "lte": |
| 48 | + query = query.find(Sneaker.releaseDate <= date_obj) |
| 49 | + elif inequality_operator == "gt": |
| 50 | + query = query.find(Sneaker.releaseDate > date_obj) |
| 51 | + elif inequality_operator == "gte": |
| 52 | + query = query.find(Sneaker.releaseDate >= date_obj) |
| 53 | + else: |
| 54 | + date_obj = datetime.strptime(releaseDate, "%Y-%m-%d") |
| 55 | + query = query.find(Sneaker.releaseDate == date_obj) |
| 56 | + |
| 57 | + order = "+" if order == SortOrder.ASCENDING else "-" |
| 58 | + sneakers_list = ( |
| 59 | + await query.sort(f"{order}{sort.value}").skip(offset).limit(limit).to_list() |
42 | 60 | ) |
| 61 | + return sneakers_list |
43 | 62 |
|
44 | 63 |
|
45 | 64 | @router.get("/{product_id}") |
|
0 commit comments