Coverage for bc/kwai-bc-training/src/kwai_bc_training/get_trainings.py: 98%

44 statements  

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

1"""Module for the use case get trainings.""" 

2 

3from dataclasses import dataclass 

4from datetime import datetime 

5 

6from kwai_core.domain.presenter import AsyncPresenter, IterableResult 

7from kwai_core.domain.value_objects.timestamp import Timestamp 

8from kwai_core.domain.value_objects.unique_id import UniqueId 

9 

10from kwai_bc_training.coaches.coach_repository import CoachRepository 

11from kwai_bc_training.trainings.training import TrainingEntity 

12from kwai_bc_training.trainings.training_repository import TrainingRepository 

13from kwai_bc_training.trainings.training_schedule import ( 

14 TrainingScheduleIdentifier, 

15) 

16from kwai_bc_training.trainings.training_schedule_repository import ( 

17 TrainingScheduleRepository, 

18) 

19 

20 

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

22class GetTrainingsCommand: 

23 """Input for the get trainings use case. 

24 

25 Attributes: 

26 limit: the max. number of elements to return. Default is None, which means all. 

27 offset: Offset to use. Default is None. 

28 year: Only return trainings of this year. 

29 month: Only return trainings of this month. 

30 start: Only return trainings starting from this date. 

31 end: Only return trainings before this date. 

32 coach_uuid: Only return trainings with this coach. 

33 schedule: Only return trainings created from this training schedule. 

34 active: Only return trainings that are active (default is True). 

35 """ 

36 

37 limit: int | None = None 

38 offset: int | None = None 

39 year: int | None = None 

40 month: int | None = None 

41 start: datetime | None = None 

42 end: datetime | None = None 

43 coach_uuid: str | None = None 

44 schedule: int | None = None 

45 active: bool = True 

46 

47 

48class GetTrainings: 

49 """Use case to get trainings.""" 

50 

51 def __init__( 

52 self, 

53 repo: TrainingRepository, 

54 coach_repo: CoachRepository, 

55 training_schedule_repo: TrainingScheduleRepository, 

56 presenter: AsyncPresenter[IterableResult[TrainingEntity]], 

57 ): 

58 """Initialize use case. 

59 

60 Attributes: 

61 repo: The repository for trainings. 

62 coach_repo: The repository for coaches. 

63 training_schedule_repo: The repository for training schedules. 

64 presenter: A presenter for a training entity. 

65 """ 

66 self._repo = repo 

67 self._coach_repo = coach_repo 

68 self._training_schedule_repo = training_schedule_repo 

69 self._presenter = presenter 

70 

71 async def execute(self, command: GetTrainingsCommand) -> None: 

72 """Execute the use case. 

73 

74 Args: 

75 command: The input for this use case. 

76 

77 Raises: 

78 CoachNotFoundException: Raised when a coach is not found. 

79 TrainingSchemaNotFoundException: Raised when a training schedule is not found. 

80 """ 

81 query = self._repo.create_query().order_by_date() 

82 

83 if command.year: 

84 query.filter_by_year_month(command.year, command.month) 

85 

86 if command.start and command.end: 

87 query.filter_by_dates( 

88 Timestamp(timestamp=command.start), Timestamp(timestamp=command.end) 

89 ) 

90 

91 if command.coach_uuid: 

92 coach_query = self._coach_repo.create_query().filter_by_uuid( 

93 UniqueId.create_from_string(command.coach_uuid) 

94 ) 

95 coach = await self._coach_repo.get(coach_query) 

96 query.filter_by_coach(coach) 

97 

98 if command.schedule: 

99 training_schedule = await self._training_schedule_repo.get_by_id( 

100 TrainingScheduleIdentifier(command.schedule) 

101 ) 

102 query.filter_by_training_schedule(training_schedule) 

103 

104 if command.active: 

105 query.filter_active() 

106 

107 query.order_by_date() 

108 

109 await self._presenter.present( 

110 IterableResult[TrainingEntity]( 

111 count=await query.count(), 

112 limit=command.limit or 0, 

113 offset=command.offset or 0, 

114 iterator=self._repo.get_all(query, command.limit, command.offset), 

115 ) 

116 )