Coverage for polar/email_update/endpoints.py: 66%

29 statements  

« prev     ^ index     » next       coverage.py v7.10.6, created at 2025-12-05 16:17 +0000

1from fastapi import Depends, Form 1a

2from fastapi.responses import RedirectResponse 1a

3 

4from polar.auth.dependencies import WebUserWrite 1a

5from polar.config import settings 1a

6from polar.exceptions import PolarRedirectionError 1a

7from polar.integrations.loops.service import loops as loops_service 1a

8from polar.kit.db.postgres import AsyncSession 1a

9from polar.kit.http import ReturnTo, get_safe_return_url 1a

10from polar.openapi import APITag 1a

11from polar.postgres import get_db_session 1a

12from polar.routing import APIRouter 1a

13 

14from .schemas import EmailUpdateRequest 1a

15from .service import EmailUpdateError 1a

16from .service import email_update as email_update_service 1a

17 

18router = APIRouter(prefix="/email-update", tags=["email-update", APITag.private]) 1a

19 

20 

21@router.post("/request") 1a

22async def request_email_update( 1a

23 email_update_request: EmailUpdateRequest, 

24 auth_subject: WebUserWrite, 

25 session: AsyncSession = Depends(get_db_session), 

26) -> None: 

27 email_update_record, token = await email_update_service.request_email_update( 

28 email_update_request.email, 

29 session, 

30 auth_subject, 

31 ) 

32 

33 await email_update_service.send_email( 

34 email_update_record, 

35 token, 

36 base_url=str(settings.generate_frontend_url("/verify-email")), 

37 extra_url_params=( 

38 {"return_to": email_update_request.return_to} 

39 if email_update_request.return_to 

40 else {} 

41 ), 

42 ) 

43 

44 

45@router.post("/verify") 1a

46async def verify_email_update( 1a

47 return_to: ReturnTo, 

48 auth_subject: WebUserWrite, 

49 token: str = Form(), 

50 session: AsyncSession = Depends(get_db_session), 

51) -> RedirectResponse: 

52 try: 

53 user = await email_update_service.verify(session, token) 

54 except EmailUpdateError as e: 

55 raise PolarRedirectionError( 

56 e.message, e.status_code, return_to=return_to 

57 ) from e 

58 

59 await loops_service.user_update(session, user) 

60 

61 return_url = get_safe_return_url(return_to) 

62 response = RedirectResponse(return_url, 303) 

63 

64 return response