Coverage for bc/kwai-bc-identity/src/kwai_bc_identity/mail_user_invitation.py: 90%
31 statements
« prev ^ index » next coverage.py v7.11.0, created at 2024-01-01 00:00 +0000
« prev ^ index » next coverage.py v7.11.0, created at 2024-01-01 00:00 +0000
1"""Module that defines the use case for sending a user invitation email."""
3from dataclasses import dataclass
5from kwai_core.domain.exceptions import UnprocessableException
6from kwai_core.domain.value_objects.unique_id import UniqueId
7from kwai_core.mail.mailer import Mailer
8from kwai_core.mail.recipient import Recipients
9from kwai_core.template.mail_template import MailTemplate
11from kwai_bc_identity.user_invitations.user_invitation import UserInvitationEntity
12from kwai_bc_identity.user_invitations.user_invitation_mailer import (
13 UserInvitationMailer,
14)
15from kwai_bc_identity.user_invitations.user_invitation_repository import (
16 UserInvitationRepository,
17)
20@dataclass(frozen=True, kw_only=True, slots=True)
21class MailUserInvitationCommand:
22 """Command for the use case MailUserInvitation.
24 Attributes:
25 uuid: The unique id of the user invitation.
26 """
28 uuid: str
31class MailUserInvitation:
32 """Use case for sending a user invitation email."""
34 def __init__(
35 self,
36 user_invitation_repo: UserInvitationRepository,
37 mailer: Mailer,
38 recipients: Recipients,
39 mail_template: MailTemplate,
40 ):
41 self._user_invitation_repo = user_invitation_repo
42 self._mailer = mailer
43 self._recipients = recipients
44 self._mail_template = mail_template
46 async def execute(self, command: MailUserInvitationCommand) -> UserInvitationEntity:
47 """Execute the use case.
49 Args:
50 command: the input for this use case.
52 Raises:
53 UserInvitationNotFoundException: Raised when
54 the user invitation cannot be found.
55 UnprocessableException: Raised when the mail was already sent.
56 Raised when the user recovery was already confirmed.
57 """
58 user_invitation = await self._user_invitation_repo.get_invitation_by_uuid(
59 UniqueId.create_from_string(command.uuid)
60 )
62 if user_invitation.revoked:
63 raise UnprocessableException(f"User invitation {command.uuid} is revoked")
65 if user_invitation.mailed:
66 raise UnprocessableException(
67 f"Mail already send for user invitation {command.uuid}"
68 )
70 if user_invitation.is_expired:
71 raise UnprocessableException(
72 f"User invitation {command.uuid} already expired"
73 )
75 if user_invitation.confirmed:
76 raise UnprocessableException(
77 f"User invitation {command.uuid} already confirmed"
78 )
80 UserInvitationMailer(
81 self._mailer,
82 self._recipients,
83 self._mail_template,
84 user_invitation,
85 ).send()
87 user_invitation = user_invitation.mail_sent()
88 await self._user_invitation_repo.update(user_invitation)
90 return user_invitation