Coverage for bc/kwai-bc-club/src/kwai_bc_club/create_coach.py: 100%

23 statements  

« prev     ^ index     » next       coverage.py v7.11.0, created at 2024-01-01 00:00 +0000

1"""Module that defines a 'Create Coach' use case.""" 

2 

3from dataclasses import dataclass 

4 

5from kwai_core.domain.presenter import Presenter 

6from kwai_core.domain.value_objects.unique_id import UniqueId 

7 

8from kwai_bc_club.coach_command import CoachCommand 

9from kwai_bc_club.domain.club_coach import ClubCoachEntity 

10from kwai_bc_club.repositories.coach_repository import ( 

11 CoachAlreadyExistException, 

12 CoachRepository, 

13) 

14from kwai_bc_club.repositories.member_repository import MemberRepository 

15 

16 

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

18class CreateCoachCommand(CoachCommand): 

19 """Input for the 'create coach' use case. 

20 

21 Attributes: 

22 member_uuid: The unique id of the associated member. 

23 """ 

24 

25 member_uuid: str 

26 

27 

28class CreateCoach: 

29 """Create Coach use case.""" 

30 

31 def __init__( 

32 self, 

33 coach_repo: CoachRepository, 

34 member_repo: MemberRepository, 

35 presenter: Presenter[ClubCoachEntity], 

36 ): 

37 """Initialize the 'Create Coach' use case. 

38 

39 Args: 

40 coach_repo: CoachRepository for creating the coach. 

41 member_repo: MemberRepository for getting the members. 

42 presenter: Presenter for a club coach entity. 

43 """ 

44 self._coach_repo = coach_repo 

45 self._member_repo = member_repo 

46 self._presenter = presenter 

47 

48 async def execute(self, command: CreateCoachCommand) -> None: 

49 """Execute the use case. 

50 

51 Raises: 

52 MemberNotFoundException: Raised when the member cannot be found. 

53 CoachAlreadyExistsException: Raised when the coach already exists. 

54 """ 

55 member_query = self._member_repo.create_query().filter_by_uuid( 

56 UniqueId.create_from_string(command.member_uuid) 

57 ) 

58 member = await self._member_repo.get(member_query) 

59 

60 coach_query = self._coach_repo.create_query().filter_by_member(member.id) 

61 coach = await anext(self._coach_repo.get_all(coach_query), None) 

62 if coach is not None: 

63 raise CoachAlreadyExistException( 

64 f"Coach with member {member.uuid} already exists." 

65 ) 

66 

67 coach = await self._coach_repo.create( 

68 ClubCoachEntity( 

69 member=member, 

70 description=command.description, 

71 diploma=command.diploma, 

72 active=command.active, 

73 remark=command.remark, 

74 ) 

75 ) 

76 self._presenter.present(coach)