Your content here
async def request_confirm_email(command: UserRequestConfirmEmailCommand) -> None:
"""Запросить подтверждение `email`.
Raises:
UserEmailNotFoundError
UserEmailAlreadyVerifiedError
"""
if command.flow_session.user_id is None:
await audit_api.record_events(
map_request_confirm_email_suppressed(
ip_address=command.ip_address,
flow_session=command.flow_session,
),
)
return
try:
async with db.transaction():
user_email = await user_email_service.get_user_primary_email(
command.flow_session.user_id,
)
if user_email.is_verified:
raise UserEmailAlreadyVerifiedError(user_email)
action_token, action_token_generated = (
await user_action_token_service.create_action_token(
user_id=command.flow_session.user_id,
kind=UserActionTokenKind.EMAIL_VERIFICATION,
channel=UserActionTokenChannelType.EMAIL,
channel_id=user_email.id,
)
)
except ApplicationError as ex:
await audit_api.record_events(
map_request_confirm_email_with_error(
ex,
ip_address=command.ip_address,
flow_session=command.flow_session,
),
)
raise
await schedule_in_background(
user_email_agent.send_email_verification_email(
user_email=user_email,
action_token=action_token,
token_generated=action_token_generated,
),
)
await audit_api.record_events(
map_request_confirm_email_success(
user_id=command.flow_session.user_id,
ip_address=command.ip_address,
user_email=user_email,
action_token=action_token,
flow_session=command.flow_session,
),
)