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
« 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
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
14from .schemas import EmailUpdateRequest 1a
15from .service import EmailUpdateError 1a
16from .service import email_update as email_update_service 1a
18router = APIRouter(prefix="/email-update", tags=["email-update", APITag.private]) 1a
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 )
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 )
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
59 await loops_service.user_update(session, user)
61 return_url = get_safe_return_url(return_to)
62 response = RedirectResponse(return_url, 303)
64 return response