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

1import logging 

2 

3from sqlalchemy.orm import Session 

4 

5from app.modules.cards.model import Card 

6from app.modules.reviews.model import Review 

7 

8logger = logging.getLogger(__name__) 

9 

10 

11class ReviewRepository: 

12 def __init__(self, db: Session): 

13 self.db = db 

14 logger.debug("ReviewRepository initialized: Session=%s", type(db)) 

15 

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 

33 

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 

48 

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} 

56 

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