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
« 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."""
3from dataclasses import dataclass
5from kwai_core.domain.presenter import Presenter
6from kwai_core.domain.value_objects.unique_id import UniqueId
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
17@dataclass(kw_only=True, frozen=True, slots=True)
18class CreateCoachCommand(CoachCommand):
19 """Input for the 'create coach' use case.
21 Attributes:
22 member_uuid: The unique id of the associated member.
23 """
25 member_uuid: str
28class CreateCoach:
29 """Create Coach use case."""
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.
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
48 async def execute(self, command: CreateCoachCommand) -> None:
49 """Execute the use case.
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)
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 )
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)