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

29 statements  

« prev     ^ index     » next       coverage.py v7.15.2, created at 2026-10-07 12:42 +0000

1from fastapi import Depends, Form 

2from fastapi.responses import RedirectResponse 

3 

4from polar.auth.dependencies import WebUserWrite 

5from polar.config import settings 

6from polar.exceptions import PolarRedirectionError 

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

8from polar.kit.db.postgres import AsyncSession 

9from polar.kit.http import ReturnTo, get_safe_return_url 

10from polar.openapi import APITag 

11from polar.postgres import get_db_session 

12from polar.routing import APIRouter 

13 

14from .schemas import EmailUpdateRequest 

15from .service import EmailUpdateError 

16from .service import email_update as email_update_service 

17 

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

19 

20 

21@router.post("/request") 

22async def request_email_update( 

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") 

46async def verify_email_update( 

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