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

57 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 

4 

5from app.modules.cards.model import Card 

6 

7logger = logging.getLogger(__name__) 

8 

9 

10class CardRepository: 

11 def __init__(self, db: Session): 

12 self.db = db 

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

14 

15 def create(self, front: str, back: str, deck_id: int) -> Card: 

16 logger.debug( 

17 "create called: deck_id=%s front_len=%s back_len=%s", 

18 deck_id, 

19 len(front) if front else 0, 

20 len(back) if back else 0, 

21 ) 

22 try: 

23 card = Card(front=front, back=back, deck_id=deck_id) 

24 self.db.add(card) 

25 self.db.commit() 

26 self.db.refresh(card) 

27 logger.info("Card created: id=%s deck_id=%s", getattr(card, "id", None), deck_id) 

28 return card 

29 except Exception: 

30 logger.exception("Failed to create card for deck_id=%s", deck_id) 

31 raise 

32 

33 def get(self, card_id: int) -> Card | None: 

34 logger.debug("get called: card_id=%s", card_id) 

35 try: 

36 card = self.db.query(Card).filter(Card.id == card_id).first() 

37 except Exception: 

38 logger.exception("Failed to fetch card_id=%s", card_id) 

39 raise 

40 

41 if not card: 

42 logger.debug("get returned no result: card_id=%s", card_id) 

43 else: 

44 logger.debug("get fetched card: card_id=%s", card_id) 

45 return card 

46 

47 def list_by_deck(self, deck_id: int) -> list[Card]: 

48 logger.debug("list_by_deck called: deck_id=%s", deck_id) 

49 try: 

50 results = self.db.query(Card).filter(Card.deck_id == deck_id).all() 

51 logger.info("list_by_deck found %s cards for deck_id=%s", len(results), deck_id) 

52 return results 

53 except Exception: 

54 logger.exception("Failed to list cards for deck_id=%s", deck_id) 

55 raise 

56 

57 def delete(self, card_id: int): 

58 logger.debug("delete called: card_id=%s", card_id) 

59 try: 

60 card = self.get(card_id) 

61 except Exception: 

62 logger.exception("Failed to fetch card before delete: card_id=%s", card_id) 

63 raise 

64 

65 if not card: 

66 logger.info("Attempted to delete non-existent card: card_id=%s", card_id) 

67 return 

68 

69 try: 

70 self.db.delete(card) 

71 self.db.commit() 

72 logger.info("Deleted card: card_id=%s", card_id) 

73 except Exception: 

74 logger.exception("Failed to delete card_id=%s", card_id) 

75 raise