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 가입. 가입 = 계정 1개다. ★ 이메일을 필수로 받는 이유: 같은 이메일이 이미 구글로 가입돼 있는지 판단할 근거가 없으면 한 사람에게 계정이 둘 생긴다. 지금 이메일 인증 절차는 없다 — 소유 증명이 아니라 **중복 판정용** 이다.""" id: str = "" password: str = "" name: Optional[str] = None email: str = "" class Req_GoogleLogin(AuthProtocol): """구글 로그인. 프론트(GIS)가 받은 ID 토큰을 그대로 넘긴다. 필드 이름이 `credential` 인 이유는 GIS 콜백이 주는 이름 그대로이기 때문이다 — `access_token`/`id_token` 으로 바꿔 부르면 우리 토큰과 헷갈린다.""" credential: str = "" class Res_Login(Res_WebPacketProtocol): access_token: str = "" refresh_token: str = "" token_type: str = "bearer" class Req_UpdateMe(AuthProtocol): # 본인 정보 수정. role·id 는 받지 않는다(자기 권한 변경 불가). 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 # 이 계정이 무엇으로 로그인하는가. 구글 계정에는 바꿀 비밀번호가 없어서(update_me 가 막는다) # 내 정보 화면이 붙을 때 이 값으로 갈라야 한다. provider: AuthProvider = AuthProvider.LOCAL