Coverage for src/app/modules/reviews/repository.py: 100%
47 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
6from app.modules.reviews.model import Review
8logger = logging.getLogger(__name__)
11class ReviewRepository:
12 def __init__(self, db: Session):
13 self.db = db
14 logger.debug("ReviewRepository initialized: Session=%s", type(db))
16 def create(self, card_id: int, rating: int) -> Review:
17 logger.debug("create called: card_id=%s rating=%s", card_id, rating)
18 try:
19 review = Review(card_id=card_id, rating=rating)
20 self.db.add(review)
21 self.db.commit()
22 self.db.refresh(review)
23 logger.info(
24 "Review created: id=%s card_id=%s rating=%s",
25 getattr(review, "id", None),
26 card_id,
27 rating,
28 )
29 return review
30 except Exception:
31 logger.exception("Failed to create review for card_id=%s rating=%s", card_id, rating)
32 raise
34 def get_by_deck(self, deck_id: int) -> list[Review]:
35 logger.debug("get_by_deck called: deck_id=%s", deck_id)
36 try:
37 reviews = (
38 self.db.query(Review)
39 .join(Card, Review.card_id == Card.id)
40 .filter(Card.deck_id == deck_id)
41 .all()
42 )
43 logger.info("get_by_deck found %s reviews for deck_id=%s", len(reviews), deck_id)
44 return reviews
45 except Exception:
46 logger.exception("Failed to fetch reviews for deck_id=%s", deck_id)
47 raise
49 def delete_by_deck(self, deck_id: int):
50 logger.debug("delete_by_deck called: deck_id=%s", deck_id)
51 try:
52 reviews = self.get_by_deck(deck_id)
53 if not reviews:
54 logger.info("No reviews to delete for deck_id=%s", deck_id)
55 return {"deleted_count": 0}
57 deleted_count = 0
58 for r in reviews:
59 self.db.delete(r)
60 deleted_count += 1
61 self.db.commit()
62 logger.info("Deleted %s reviews for deck_id=%s", deleted_count, deck_id)
63 return {"deleted_count": deleted_count}
64 except Exception:
65 logger.exception("Failed to delete reviews for deck_id=%s", deck_id)
66 raise