Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -79,3 +79,4 @@ select = ["E", "F", "W", "I", "PL"]

[tool.ruff.lint.isort]
force-sort-within-sections = true
force-single-line = true
7 changes: 7 additions & 0 deletions wacruit/src/apps/common/enums.py
Original file line number Diff line number Diff line change
Expand Up @@ -116,3 +116,10 @@ class TimelineGroupType(Enum):
ROOKIE = "ROOKIE"
PROGRAMMER = "PROGRAMMER"
DESIGNER = "DESIGNER"


class SponsorOrder(str, Enum):
AMOUNT_ASC = "amount"
AMOUNT_DESC = "-amount"
DATE_ASC = "date"
DATE_DESC = "-date"
31 changes: 28 additions & 3 deletions wacruit/src/apps/sponsor/repositories.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,15 @@
from typing import Optional
from typing import Sequence

from fastapi import Depends
from sqlalchemy import extract
from sqlalchemy import select
from sqlalchemy.orm import Session

from wacruit.src.apps.common.enums import SponsorOrder
from wacruit.src.apps.sponsor.models import Sponsor
from wacruit.src.database.connection import get_db_session
from wacruit.src.database.connection import Transaction
from wacruit.src.database.connection import get_db_session


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

def get_all_sponsors(self) -> list[Sponsor]:
return self.session.query(Sponsor).all()
def get_all_sponsors(
self, order: Optional[SponsorOrder] = None, year: Optional[int] = None
) -> Sequence[Sponsor]:
stmt = select(Sponsor)

if year is not None:
stmt = stmt.where(extract("year", Sponsor.sponsored_date) == year)

if order is not None:
order_map = {
"amount": Sponsor.amount.asc(),
"-amount": Sponsor.amount.desc(),
"date": Sponsor.sponsored_date.asc(),
"-date": Sponsor.sponsored_date.desc(),
}

sort_condition = order_map.get(order)
if sort_condition is not None:
stmt = stmt.order_by(sort_condition)

return self.session.execute(stmt).scalars().all()

def update_sponsor(self, sponsor: Sponsor):
with self.transaction:
Expand Down
1 change: 1 addition & 0 deletions wacruit/src/apps/sponsor/schemas.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ class SponsorInfoResponse(OrmModel):
class SponsorBriefResponse(OrmModel):
id: int
name: str
sponsored_date: date


class SponsorUpdateRequest(BaseModel):
Expand Down
9 changes: 7 additions & 2 deletions wacruit/src/apps/sponsor/services.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
from typing import Annotated
from typing import Optional

from fastapi import Depends

from wacruit.src.apps.common.enums import SponsorOrder
from wacruit.src.apps.common.schemas import ListResponse
from wacruit.src.apps.sponsor.exceptions import SponsorAlreadyExistsException
from wacruit.src.apps.sponsor.exceptions import SponsorNotFoundException
Expand Down Expand Up @@ -35,8 +37,11 @@ def get_sponsor_by_id(self, sponsor_id: int) -> SponsorInfoResponse:
raise SponsorNotFoundException
return SponsorInfoResponse.from_orm(sponsor)

def get_all_sponsors(self) -> ListResponse[SponsorBriefResponse]:
sponsors = self.sponsor_repository.get_all_sponsors()
def get_all_sponsors(
self, order: Optional[SponsorOrder] = None, year: Optional[int] = None
) -> ListResponse[SponsorBriefResponse]:
sponsors = self.sponsor_repository.get_all_sponsors(order, year)

return (
ListResponse[SponsorBriefResponse](
items=[SponsorBriefResponse.from_orm(sponsor) for sponsor in sponsors]
Expand Down
14 changes: 12 additions & 2 deletions wacruit/src/apps/sponsor/views.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
from typing import Annotated
from typing import Optional

from fastapi import APIRouter
from fastapi import Depends
from fastapi import Response
from fastapi import Query

from wacruit.src.apps.common.enums import SponsorOrder
from wacruit.src.apps.common.schemas import ListResponse
from wacruit.src.apps.sponsor.schemas import SponsorBriefResponse
from wacruit.src.apps.sponsor.schemas import SponsorCreateRequest
Expand Down Expand Up @@ -36,8 +38,16 @@ def get_sponsor(
@v3_router.get("")
def get_all_sponsors(
sponsor_service: Annotated[SponsorService, Depends()],
order: Annotated[
Optional[SponsorOrder],
Query(
description="sorting order(e.g. amount, -amount, date, -date), "
"'-' prefix for descending order"
),
] = None,
year: Annotated[Optional[int], Query(description="sponsors by year")] = None,
) -> ListResponse[SponsorBriefResponse]:
return sponsor_service.get_all_sponsors()
return sponsor_service.get_all_sponsors(order, year)


@v3_router.patch("/{sponsor_id}")
Expand Down
Loading