Coverage for src / mysingle / auth / router / verify.py: 0%
21 statements
« prev ^ index » next coverage.py v7.12.0, created at 2025-12-02 00:58 +0900
« prev ^ index » next coverage.py v7.12.0, created at 2025-12-02 00:58 +0900
1from fastapi import APIRouter, Body, Request, status
2from pydantic import EmailStr
4from ..exceptions import (
5 UserAlreadyVerified,
6 UserInactive,
7 UserNotExists,
8)
9from ..schemas import UserResponse
10from ..user_manager import UserManager
12user_manager = UserManager()
15def get_verify_router() -> APIRouter:
16 """이메일 검증을 위한 라우터 생성"""
17 router = APIRouter()
19 @router.post(
20 "/request-verify-token",
21 status_code=status.HTTP_202_ACCEPTED,
22 )
23 async def request_verify_token(
24 request: Request,
25 email: EmailStr = Body(..., embed=True),
26 ) -> None:
27 """
28 이메일 검증 토큰을 요청합니다.
30 보안을 위해 이메일 존재 여부와 관계없이 항상 202 응답을 반환합니다.
31 """
32 try:
33 user = await user_manager.get_by_email(email)
34 await user_manager.request_verify(user, request)
35 except (
36 UserNotExists,
37 UserInactive,
38 UserAlreadyVerified,
39 ):
40 # 보안: 사용자 존재 여부를 노출하지 않음
41 pass
43 return None
45 @router.post(
46 "/verify",
47 response_model=UserResponse,
48 )
49 async def verify(
50 request: Request,
51 token: str = Body(..., embed=True),
52 ) -> UserResponse:
53 """
54 이메일 검증 토큰을 사용하여 사용자를 검증합니다.
55 """
56 # UserManager.verify에서 이미 적절한 예외를 발생시키므로
57 # 직접 전파하도록 수정
58 user = await user_manager.verify(token, request)
59 return UserResponse.model_validate(user, from_attributes=True)
61 return router