Coverage for src/app/modules/reviews/router.py: 100%

33 statements  

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

1import logging 

2 

3from fastapi import APIRouter, Depends, HTTPException 

4from sqlalchemy.orm import Session 

5 

6from app.core.dependencies import get_review_service 

7from app.db.session import get_session 

8from app.modules.reviews.schemas import DeckScore, ReviewCreate, ReviewRead 

9 

10logger = logging.getLogger(__name__) 

11 

12router = APIRouter() 

13 

14 

15@router.post("/", response_model=ReviewRead) 

16def create_review(payload: ReviewCreate, session: Session = Depends(get_session)): # noqa: B008 

17 logger.debug( 

18 "create_review endpoint called: card_id=%s rating=%s", 

19 getattr(payload, "card_id", None), 

20 getattr(payload, "rating", None), 

21 ) 

22 service = get_review_service(session) 

23 try: 

24 review = service.create_review(payload.card_id, payload.rating) 

25 logger.info( 

26 "Review created via endpoint: id=%s card_id=%s rating=%s", 

27 getattr(review, "id", None), 

28 payload.card_id, 

29 payload.rating, 

30 ) 

31 return review 

32 except ValueError as err: 

33 logger.warning("create_review bad request: %s", err) 

34 raise HTTPException(status_code=400, detail=str(err)) from err 

35 except Exception as err: 

36 logger.exception("Unexpected error in create_review") 

37 raise HTTPException(status_code=500, detail="Internal server error") from err 

38 

39 

40@router.get("/deck/{deck_id}", response_model=DeckScore) 

41def get_deck_score(deck_id: int, session: Session = Depends(get_session)): # noqa: B008 

42 logger.debug("get_deck_score endpoint called: deck_id=%s", deck_id) 

43 service = get_review_service(session) 

44 try: 

45 result = service.compute_deck_score(deck_id) 

46 logger.info( 

47 "Deck score returned via endpoint: deck_id=%s average_score=%s review_count=%s", 

48 result.get("deck_id"), 

49 result.get("average_score"), 

50 result.get("review_count"), 

51 ) 

52 return result 

53 except Exception as err: 

54 logger.exception("Unexpected error in get_deck_score: deck_id=%s", deck_id) 

55 raise HTTPException(status_code=500, detail="Internal server error") from err