Coverage for apps/kwai-api/src/kwai_api/v1/portal/trainings/endpoints.py: 93%

30 statements  

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

1"""Module for the endpoints of the portal trainings API.""" 

2 

3from datetime import datetime 

4from typing import Annotated 

5 

6from fastapi import APIRouter, Depends, HTTPException, Query, status 

7from kwai_bc_training.coaches.coach_db_repository import CoachDbRepository 

8from kwai_bc_training.get_trainings import GetTrainings, GetTrainingsCommand 

9from kwai_bc_training.trainings.training_db_repository import TrainingDbRepository 

10from kwai_bc_training.trainings.training_schedule_db_repository import ( 

11 TrainingScheduleDbRepository, 

12) 

13from kwai_bc_training.trainings.training_schedule_repository import ( 

14 TrainingScheduleNotFoundException, 

15) 

16from kwai_core.db.database import Database 

17from kwai_core.json_api import PaginationModel 

18from pydantic import BaseModel, Field 

19 

20from kwai_api.dependencies import create_database 

21from kwai_api.v1.portal.trainings.presenters import JsonApiTrainingsDocumentPresenter 

22from kwai_api.v1.portal.trainings.schemas import TrainingsDocument 

23 

24 

25router = APIRouter() 

26 

27 

28class TrainingsFilterModel(BaseModel): 

29 """Define the JSON:API filter for trainings.""" 

30 

31 year: int | None = Field(Query(default=None, alias="filter[year]")) 

32 month: int | None = Field(Query(default=None, alias="filter[month]")) 

33 start: datetime | None = Field(Query(default=None, alias="filter[start]")) 

34 end: datetime | None = Field(Query(default=None, alias="filter[end]")) 

35 schedule: int | None = Field(Query(default=None, alias="filter[schedule]")) 

36 

37 

38@router.get( 

39 "/trainings", 

40 responses={ 

41 status.HTTP_404_NOT_FOUND: {"description": "Training schedule was not found."} 

42 }, 

43) 

44async def get_trainings( 

45 pagination: Annotated[PaginationModel, Depends(PaginationModel)], 

46 trainings_filter: Annotated[TrainingsFilterModel, Depends(TrainingsFilterModel)], 

47 db: Annotated[Database, Depends(create_database)], 

48) -> TrainingsDocument: 

49 """Get all trainings for the portal.""" 

50 command = GetTrainingsCommand( 

51 offset=pagination.offset, 

52 limit=pagination.limit, 

53 start=trainings_filter.start, 

54 end=trainings_filter.end, 

55 year=trainings_filter.year, 

56 month=trainings_filter.month, 

57 schedule=trainings_filter.schedule, 

58 ) 

59 presenter = JsonApiTrainingsDocumentPresenter() 

60 try: 

61 await GetTrainings( 

62 TrainingDbRepository(db), 

63 CoachDbRepository(db), 

64 TrainingScheduleDbRepository(db), 

65 presenter, 

66 ).execute(command) 

67 except TrainingScheduleNotFoundException as ex: 

68 raise HTTPException( 

69 status_code=status.HTTP_404_NOT_FOUND, detail=str(ex) 

70 ) from ex 

71 

72 return presenter.get_document()