Coverage for bc/kwai-bc-identity/src/kwai_bc_identity/mail_user_invitation.py: 93%
29 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 )
61 if user_invitation.mailed:
62 raise UnprocessableException(
63 f"Mail already send for user invitation {command.uuid}"
64 )
66 if user_invitation.is_expired:
67 raise UnprocessableException(
68 f"User invitation {command.uuid} already expired"
69 )
71 if user_invitation.confirmed:
72 raise UnprocessableException(
73 f"User invitation {command.uuid} already confirmed"
74 )
76 UserInvitationMailer(
77 self._mailer,
78 self._recipients,
79 self._mail_template,
80 user_invitation,
81 ).send()
83 user_invitation = user_invitation.mail_sent()
84 await self._user_invitation_repo.update(user_invitation)
86 return user_invitation