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
« prev ^ index » next coverage.py v7.14.3, created at 2026-06-24 08:34 +0000
1import logging
3from sqlalchemy.orm import Session
5from app.modules.cards.model import Card
7logger = logging.getLogger(__name__)
10class CardRepository:
11 def __init__(self, db: Session):
12 self.db = db
13 logger.debug("CardRepository initialized: Session=%s", type(db))
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
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
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
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
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
65 if not card:
66 logger.info("Attempted to delete non-existent card: card_id=%s", card_id)
67 return
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