from typing import Optional from common.enums import AuthProvider, UserRole from common.models.gmodel import Res_WebPacketProtocol, WebPacketProtocol # 라우터 폴더마다 protocol.py 를 두고 Req_/Res_ 를 정의한다 (protocol 규약). class AuthProtocol(WebPacketProtocol): pass class Req_Login(AuthProtocol): id: str = "" password: str = "" class Req_Signup(AuthProtocol): """id/pw 가입.""" id: str = "" password: str = "" name: Optional[str] = None email: str = "" class Req_GoogleLogin(AuthProtocol): """구글 로그인.""" credential: str = "" class Req_KakaoLogin(AuthProtocol): """카카오 로그인. ★ 구글은 브라우저가 받은 ID 토큰(credential)을 우리가 검증하지만, 카카오는 **인가 코드**를 받아 서버가 토큰으로 바꾼다 — 클라이언트 시크릿을 브라우저에 둘 수 없기 때문이다. 그래서 필드 이름이 다르다. ★ `redirect_uri` 는 프론트가 인가를 요청할 때 쓴 값이다. 카카오가 교환 시점에 이 값을 대조하므로 **글자 하나까지 같아야** 한다. 비우면 서버 설정값을 쓴다 — 한 벌로 쓰는 평소에는 보낼 필요가 없고, 로컬처럼 주소가 다른 환경에서만 채운다.""" code: str = "" redirect_uri: str = "" class Res_Login(Res_WebPacketProtocol): access_token: str = "" refresh_token: str = "" token_type: str = "bearer" class Req_UpdateMe(AuthProtocol): # 본인 정보 수정. name: Optional[str] = None email: Optional[str] = None contact_number: Optional[str] = None password: Optional[str] = None # 비밀번호 변경(옵션). class Res_RefreshToken(Res_WebPacketProtocol): access_token: str = "" token_type: str = "bearer" class Res_Me(Res_WebPacketProtocol): user_id: str = "" id: str = "" name: Optional[str] = None email: Optional[str] = None contact_number: Optional[str] = None role: UserRole = UserRole.USER # 이 계정이 무엇으로 로그인하는가. provider: AuthProvider = AuthProvider.LOCAL