Coverage for src / mysingle / auth / router / reset.py: 0%

23 statements  

« 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 

3 

4from ..exceptions import ( 

5 UserInactive, 

6 UserNotExists, 

7) 

8from ..user_manager import UserManager 

9 

10user_manager = UserManager() 

11 

12 

13def get_reset_password_router() -> APIRouter: 

14 """비밀번호 재설정을 위한 라우터 생성""" 

15 router = APIRouter() 

16 

17 @router.post( 

18 "/forgot-password", 

19 status_code=status.HTTP_202_ACCEPTED, 

20 ) 

21 async def forgot_password( 

22 request: Request, 

23 email: EmailStr = Body(..., embed=True), 

24 ) -> None: 

25 """ 

26 비밀번호 재설정 이메일을 요청합니다. 

27 

28 보안을 위해 이메일 존재 여부와 관계없이 항상 202 응답을 반환합니다. 

29 """ 

30 try: 

31 user = await user_manager.get_by_email(email) 

32 except UserNotExists: 

33 # 보안: 사용자 존재 여부를 노출하지 않음 

34 return None 

35 

36 try: 

37 await user_manager.forgot_password(user, request) 

38 except UserInactive: 

39 # 보안: 사용자 상태를 노출하지 않음 

40 pass 

41 

42 return None 

43 

44 @router.post( 

45 "/reset-password", 

46 status_code=status.HTTP_204_NO_CONTENT, 

47 ) 

48 async def reset_password( 

49 request: Request, 

50 token: str = Body(...), 

51 password: str = Body(...), 

52 ) -> None: 

53 """ 

54 토큰을 사용하여 비밀번호를 재설정합니다. 

55 """ 

56 # UserManager.reset_password에서 이미 적절한 예외를 발생시키므로 

57 # 직접 전파하도록 수정 

58 await user_manager.reset_password(token, password, request) 

59 return None 

60 

61 return router