Coverage for src/app/modules/decks/repository.py: 100%

53 statements  

« prev     ^ index     » next       coverage.py v7.14.3, created at 2026-06-24 08:34 +0000

1import logging 

2 

3from sqlalchemy.orm import Session, joinedload 

4 

5from app.modules.decks.model import Deck 

6 

7logger = logging.getLogger(__name__) 

8 

9 

10class DeckRepository: 

11 def __init__(self, db: Session): 

12 self.db = db 

13 logger.debug("DeckRepository initialized: Session=%s", type(db)) 

14 

15 def create(self, name: str) -> Deck: 

16 logger.debug("create called: name=%s", name) 

17 try: 

18 deck = Deck(name=name) 

19 self.db.add(deck) 

20 self.db.commit() 

21 self.db.refresh(deck) 

22 logger.info("Deck created: id=%s name=%s", getattr(deck, "id", None), name) 

23 return deck 

24 except Exception: 

25 logger.exception("Failed to create deck with name=%s", name) 

26 raise 

27 

28 def get(self, deck_id: int) -> Deck | None: 

29 logger.debug("get called: deck_id=%s", deck_id) 

30 try: 

31 deck = self.db.query(Deck).filter(Deck.id == deck_id).first() 

32 except Exception: 

33 logger.exception("Failed to fetch deck_id=%s", deck_id) 

34 raise 

35 

36 if not deck: 

37 logger.debug("get returned no result: deck_id=%s", deck_id) 

38 else: 

39 logger.debug("get fetched deck: deck_id=%s", deck_id) 

40 return deck 

41 

42 def get_with_cards(self, deck_id: int) -> Deck | None: 

43 logger.debug("get_with_cards called: deck_id=%s", deck_id) 

44 try: 

45 deck = ( 

46 self.db.query(Deck) 

47 .options(joinedload(Deck.cards)) 

48 .filter(Deck.id == deck_id) 

49 .first() 

50 ) 

51 except Exception: 

52 logger.exception("Failed to fetch deck with cards for deck_id=%s", deck_id) 

53 raise 

54 

55 if not deck: 

56 logger.info("Deck not found (with cards): deck_id=%s", deck_id) 

57 return None 

58 

59 card_count = len(getattr(deck, "cards", [])) 

60 logger.info("Fetched deck with cards: deck_id=%s card_count=%s", deck_id, card_count) 

61 return deck 

62 

63 def delete(self, deck: Deck): 

64 logger.debug("delete called: deck_id=%s", getattr(deck, "id", None)) 

65 try: 

66 self.db.delete(deck) 

67 self.db.commit() 

68 logger.info("Deleted deck: deck_id=%s", getattr(deck, "id", None)) 

69 except Exception: 

70 logger.exception("Failed to delete deck_id=%s", getattr(deck, "id", None)) 

71 raise