Coverage for bc/kwai-bc-club/src/kwai_bc_club/repositories/coach_db_repository.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 defining a coach repository using a database."""
3from typing import AsyncGenerator
5from kwai_core.db.database import Database
7from kwai_bc_club.domain.club_coach import ClubCoachEntity, ClubCoachIdentifier
8from kwai_bc_club.repositories._tables import CoachRow
9from kwai_bc_club.repositories.coach_db_query import CoachDBQuery, CoachQueryRow
10from kwai_bc_club.repositories.coach_query import CoachQuery
11from kwai_bc_club.repositories.coach_repository import (
12 CoachNotFoundException,
13 CoachRepository,
14)
17class CoachDbRepository(CoachRepository):
18 """A coach repository using a database."""
20 def __init__(self, database: Database) -> None:
21 self._database = database
23 def create_query(self) -> CoachQuery:
24 return CoachDBQuery(self._database)
26 async def get_by_id(self, id_: ClubCoachIdentifier) -> ClubCoachEntity:
27 query = self.create_query().filter_by_id(id_)
28 coach_iterator = self.get_all(query)
29 try:
30 return await anext(coach_iterator)
31 except StopAsyncIteration:
32 raise CoachNotFoundException(f"Coach not found with {id_}") from None
34 async def get_all(
35 self,
36 query: CoachQuery | None = None,
37 limit: int | None = None,
38 offset: int | None = None,
39 ) -> AsyncGenerator[ClubCoachEntity, None]:
40 query = query or self.create_query()
41 async for row in query.fetch(limit, offset):
42 yield CoachQueryRow.map(row).create_entity()
44 async def create(self, coach: ClubCoachEntity):
45 new_coach_id = await self._database.insert(
46 CoachRow.__table_name__, CoachRow.persist(coach)
47 )
48 return coach.set_id(ClubCoachIdentifier(new_coach_id))
50 async def delete(self, coach: ClubCoachEntity):
51 await self._database.delete(coach.id.value, CoachRow.__table_name__)
53 async def update(self, coach: ClubCoachEntity) -> None:
54 await self._database.update(
55 coach.id.value, CoachRow.__table_name__, CoachRow.persist(coach)
56 )