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

1"""Module that defines the use case for sending a user invitation email.""" 

2 

3from dataclasses import dataclass 

4 

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 

10 

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) 

18 

19 

20@dataclass(frozen=True, kw_only=True, slots=True) 

21class MailUserInvitationCommand: 

22 """Command for the use case MailUserInvitation. 

23 

24 Attributes: 

25 uuid: The unique id of the user invitation. 

26 """ 

27 

28 uuid: str 

29 

30 

31class MailUserInvitation: 

32 """Use case for sending a user invitation email.""" 

33 

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 

45 

46 async def execute(self, command: MailUserInvitationCommand) -> UserInvitationEntity: 

47 """Execute the use case. 

48 

49 Args: 

50 command: the input for this use case. 

51 

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 

62 if user_invitation.revoked: 

63 raise UnprocessableException(f"User invitation {command.uuid} is revoked") 

64 

65 if user_invitation.mailed: 

66 raise UnprocessableException( 

67 f"Mail already send for user invitation {command.uuid}" 

68 ) 

69 

70 if user_invitation.is_expired: 

71 raise UnprocessableException( 

72 f"User invitation {command.uuid} already expired" 

73 ) 

74 

75 if user_invitation.confirmed: 

76 raise UnprocessableException( 

77 f"User invitation {command.uuid} already confirmed" 

78 ) 

79 

80 UserInvitationMailer( 

81 self._mailer, 

82 self._recipients, 

83 self._mail_template, 

84 user_invitation, 

85 ).send() 

86 

87 user_invitation = user_invitation.mail_sent() 

88 await self._user_invitation_repo.update(user_invitation) 

89 

90 return user_invitation