11from datetime import datetime
22
3+ from sqlalchemy import Connection , select
4+
35from bcsd_api .config import Settings
46from bcsd_api .email .sender import EmailSender
57from bcsd_api .exception import Conflict , Unauthorized
68from bcsd_api .id_gen import generate_id
7- from bcsd_api .sheets .client import SheetsClient
9+ from bcsd_api .member .pg_repository import PgMemberRepository
10+ from bcsd_api .tables import app_settings
11+ from bcsd_api .timezone import KST
812
913from . import google as google_auth
1014from . import token as jwt_token
1115from . import verify
12- from bcsd_api .timezone import KST
1316
1417
15- def login (google_token : str , settings : Settings , sheets : SheetsClient ) -> str :
18+ def login (
19+ google_token : str , settings : Settings , repo : PgMemberRepository ,
20+ ) -> str :
1621 profile = google_auth .verify_token (google_token , settings .google_client_id )
17- member = sheets . find_row ( "members" , "email" , profile ["email" ])
22+ member = repo . find_by_email ( profile ["email" ])
1823 if not member :
1924 raise Unauthorized ("member not found, registration required" )
2025 payload = {"sub" : member ["id" ], "email" : profile ["email" ]}
@@ -30,26 +35,22 @@ def confirm_verify(email: str, code: str) -> bool:
3035
3136
3237def register (
33- google_token : str ,
34- name : str ,
35- department : str ,
36- student_id : str ,
37- school_email : str ,
38- phone : str ,
39- track : str ,
40- settings : Settings ,
41- sheets : SheetsClient ,
42- ) -> str :
38+ google_token : str , name : str , department : str ,
39+ student_id : str , school_email : str , phone : str ,
40+ track : str , grade : str ,
41+ settings : Settings , repo : PgMemberRepository , conn : Connection ,
42+ ) -> tuple [str , str ]:
4343 profile = google_auth .verify_token (google_token , settings .google_client_id )
44- _check_duplicate (profile ["email" ], sheets )
44+ _check_duplicate (profile ["email" ], repo )
4545 member_id = generate_id ("M" )
4646 row = _build_row (
4747 member_id , name , profile ["email" ],
48- department , student_id , school_email , phone , track ,
48+ department , student_id , school_email , phone , track , grade ,
4949 )
50- sheets .append_row ("members" , row )
51- payload = {"sub" : member_id , "email" : profile ["email" ]}
52- return _issue_jwt (payload , settings )
50+ repo .create (row )
51+ routing = _resolve_routing (grade , conn )
52+ token = _issue_jwt ({"sub" : member_id , "email" : profile ["email" ]}, settings )
53+ return token , routing
5354
5455
5556def _issue_jwt (payload : dict , settings : Settings ) -> str :
@@ -59,8 +60,8 @@ def _issue_jwt(payload: dict, settings: Settings) -> str:
5960 )
6061
6162
62- def _check_duplicate (email : str , sheets : SheetsClient ) -> None :
63- if sheets . find_row ( "members" , "email" , email ):
63+ def _check_duplicate (email : str , repo : PgMemberRepository ) -> None :
64+ if repo . find_by_email ( email ):
6465 raise Conflict ("member already registered" )
6566
6667
@@ -71,24 +72,34 @@ def _now_kst() -> str:
7172def _build_row (
7273 member_id : str , name : str , email : str ,
7374 department : str , student_id : str ,
74- school_email : str , phone : str , track : str ,
75+ school_email : str , phone : str , track : str , grade : str ,
7576) -> dict :
7677 now = _now_kst ()
77- base = _base_fields ( member_id , name , email )
78- extra = {
78+ return {
79+ "id" : member_id , "name" : name , "email" : email ,
7980 "department" : department , "student_id" : student_id ,
80- "school_email" : school_email , "phone" : phone , "track" : track ,
81+ "school_email" : school_email , "phone" : phone ,
82+ "track" : track , "grade" : grade ,
83+ "status" : "Beginner" , "team" : "" , "payment_status" : "미납" ,
84+ "join_date" : now , "last_updated" : now ,
8185 }
82- timestamps = {"join_date" : now , "last_updated" : now }
83- return {** base , ** extra , ** timestamps }
8486
8587
86- def _base_fields (member_id : str , name : str , email : str ) -> dict :
87- return {
88- "id" : member_id ,
89- "name" : name ,
90- "email" : email ,
91- "status" : "Beginner" ,
92- "team" : "" ,
93- "payment_status" : "미납" ,
94- }
88+ _GRADE_MAP = {"1학년" : 1 , "2학년" : 2 , "3학년" : 3 , "4학년" : 4 , "대학원" : 5 }
89+
90+
91+ def _resolve_routing (grade : str , conn : Connection ) -> str :
92+ threshold = _grade_threshold (conn )
93+ level = _GRADE_MAP .get (grade , 1 )
94+ if level >= threshold :
95+ return "conversion"
96+ return "beginner"
97+
98+
99+ def _grade_threshold (conn : Connection ) -> int :
100+ row = conn .execute (
101+ select (app_settings .c .value ).where (app_settings .c .key == "grade_threshold" ),
102+ ).first ()
103+ if not row :
104+ return 3
105+ return int (row [0 ])
0 commit comments