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
« 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
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
14from .schemas import EmailUpdateRequest
15from .service import EmailUpdateError
16from .service import email_update as email_update_service
18router = APIRouter(prefix="/email-update", tags=["email-update", APITag.private])
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 )
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")
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
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