1+ from typing import Optional
2+ from typing import Sequence
3+
14from fastapi import Depends
5+ from sqlalchemy import extract
6+ from sqlalchemy import select
27from sqlalchemy .orm import Session
38
9+ from wacruit .src .apps .common .enums import SponsorOrder
410from wacruit .src .apps .sponsor .models import Sponsor
5- from wacruit .src .database .connection import get_db_session
611from wacruit .src .database .connection import Transaction
12+ from wacruit .src .database .connection import get_db_session
713
814
915class 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 :
0 commit comments