Skip to content

Commit ab6d4b9

Browse files
authored
Merge pull request #137 from wafflestudio/develop
후원자 정렬 (#136)
2 parents e150926 + c08ad50 commit ab6d4b9

6 files changed

Lines changed: 56 additions & 7 deletions

File tree

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,3 +79,4 @@ select = ["E", "F", "W", "I", "PL"]
7979

8080
[tool.ruff.lint.isort]
8181
force-sort-within-sections = true
82+
force-single-line = true

wacruit/src/apps/common/enums.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,3 +116,10 @@ class TimelineGroupType(Enum):
116116
ROOKIE = "ROOKIE"
117117
PROGRAMMER = "PROGRAMMER"
118118
DESIGNER = "DESIGNER"
119+
120+
121+
class SponsorOrder(str, Enum):
122+
AMOUNT_ASC = "amount"
123+
AMOUNT_DESC = "-amount"
124+
DATE_ASC = "date"
125+
DATE_DESC = "-date"

wacruit/src/apps/sponsor/repositories.py

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,15 @@
1+
from typing import Optional
2+
from typing import Sequence
3+
14
from fastapi import Depends
5+
from sqlalchemy import extract
6+
from sqlalchemy import select
27
from sqlalchemy.orm import Session
38

9+
from wacruit.src.apps.common.enums import SponsorOrder
410
from wacruit.src.apps.sponsor.models import Sponsor
5-
from wacruit.src.database.connection import get_db_session
611
from wacruit.src.database.connection import Transaction
12+
from wacruit.src.database.connection import get_db_session
713

814

915
class SponsorRepository:
@@ -26,8 +32,27 @@ def get_sponsor_by_sponsor_name(self, sponsor_name: str) -> Sponsor | None:
2632
def get_sponsor_by_id(self, sponsor_id: int) -> Sponsor | None:
2733
return self.session.query(Sponsor).filter(Sponsor.id == sponsor_id).first()
2834

29-
def get_all_sponsors(self) -> list[Sponsor]:
30-
return self.session.query(Sponsor).all()
35+
def get_all_sponsors(
36+
self, order: Optional[SponsorOrder] = None, year: Optional[int] = None
37+
) -> Sequence[Sponsor]:
38+
stmt = select(Sponsor)
39+
40+
if year is not None:
41+
stmt = stmt.where(extract("year", Sponsor.sponsored_date) == year)
42+
43+
if order is not None:
44+
order_map = {
45+
"amount": Sponsor.amount.asc(),
46+
"-amount": Sponsor.amount.desc(),
47+
"date": Sponsor.sponsored_date.asc(),
48+
"-date": Sponsor.sponsored_date.desc(),
49+
}
50+
51+
sort_condition = order_map.get(order)
52+
if sort_condition is not None:
53+
stmt = stmt.order_by(sort_condition)
54+
55+
return self.session.execute(stmt).scalars().all()
3156

3257
def update_sponsor(self, sponsor: Sponsor):
3358
with self.transaction:

wacruit/src/apps/sponsor/schemas.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ class SponsorInfoResponse(OrmModel):
2727
class SponsorBriefResponse(OrmModel):
2828
id: int
2929
name: str
30+
sponsored_date: date
3031

3132

3233
class SponsorUpdateRequest(BaseModel):

wacruit/src/apps/sponsor/services.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
from typing import Annotated
2+
from typing import Optional
23

34
from fastapi import Depends
45

6+
from wacruit.src.apps.common.enums import SponsorOrder
57
from wacruit.src.apps.common.schemas import ListResponse
68
from wacruit.src.apps.sponsor.exceptions import SponsorAlreadyExistsException
79
from wacruit.src.apps.sponsor.exceptions import SponsorNotFoundException
@@ -35,8 +37,11 @@ def get_sponsor_by_id(self, sponsor_id: int) -> SponsorInfoResponse:
3537
raise SponsorNotFoundException
3638
return SponsorInfoResponse.from_orm(sponsor)
3739

38-
def get_all_sponsors(self) -> ListResponse[SponsorBriefResponse]:
39-
sponsors = self.sponsor_repository.get_all_sponsors()
40+
def get_all_sponsors(
41+
self, order: Optional[SponsorOrder] = None, year: Optional[int] = None
42+
) -> ListResponse[SponsorBriefResponse]:
43+
sponsors = self.sponsor_repository.get_all_sponsors(order, year)
44+
4045
return (
4146
ListResponse[SponsorBriefResponse](
4247
items=[SponsorBriefResponse.from_orm(sponsor) for sponsor in sponsors]

wacruit/src/apps/sponsor/views.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
from typing import Annotated
2+
from typing import Optional
23

34
from fastapi import APIRouter
45
from fastapi import Depends
5-
from fastapi import Response
6+
from fastapi import Query
67

8+
from wacruit.src.apps.common.enums import SponsorOrder
79
from wacruit.src.apps.common.schemas import ListResponse
810
from wacruit.src.apps.sponsor.schemas import SponsorBriefResponse
911
from wacruit.src.apps.sponsor.schemas import SponsorCreateRequest
@@ -36,8 +38,16 @@ def get_sponsor(
3638
@v3_router.get("")
3739
def get_all_sponsors(
3840
sponsor_service: Annotated[SponsorService, Depends()],
41+
order: Annotated[
42+
Optional[SponsorOrder],
43+
Query(
44+
description="sorting order(e.g. amount, -amount, date, -date), "
45+
"'-' prefix for descending order"
46+
),
47+
] = None,
48+
year: Annotated[Optional[int], Query(description="sponsors by year")] = None,
3949
) -> ListResponse[SponsorBriefResponse]:
40-
return sponsor_service.get_all_sponsors()
50+
return sponsor_service.get_all_sponsors(order, year)
4151

4252

4353
@v3_router.patch("/{sponsor_id}")

0 commit comments

Comments
 (0)