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
« 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."""
3from datetime import datetime
4from typing import Annotated
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
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
25router = APIRouter()
28class TrainingsFilterModel(BaseModel):
29 """Define the JSON:API filter for trainings."""
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]"))
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
72 return presenter.get_document()