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

61 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_card_service 

7from app.db.session import get_session 

8from app.modules.cards.schemas import CardCreate, CardRead 

9 

10logger = logging.getLogger(__name__) 

11 

12router = APIRouter() 

13 

14 

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

16def create_card(payload: CardCreate, session: Session = Depends(get_session)): # noqa: B008 

17 logger.debug( 

18 "create_card endpoint called: deck_id=%s front_present=%s back_present=%s", 

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

20 bool(getattr(payload, "front", None)), 

21 bool(getattr(payload, "back", None)), 

22 ) 

23 service = get_card_service(session) 

24 try: 

25 card = service.create_card(payload) 

26 logger.info( 

27 "Card created via endpoint: id=%s deck_id=%s", 

28 getattr(card, "id", None), 

29 getattr(card, "deck_id", None), 

30 ) 

31 return card 

32 except ValueError as err: 

33 logger.warning("create_card 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_card") 

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

38 

39 

40@router.get("/{card_id}", response_model=CardRead) 

41def get_card(card_id: int, session: Session = Depends(get_session)): # noqa: B008 

42 logger.debug("get_card endpoint called: card_id=%s", card_id) 

43 service = get_card_service(session) 

44 try: 

45 card = service.get_card(card_id) 

46 logger.info("Card fetched via endpoint: card_id=%s", card_id) 

47 return card 

48 except ValueError as err: 

49 logger.info("get_card not found: card_id=%s", card_id) 

50 raise HTTPException(status_code=404, detail=str(err)) from err 

51 except Exception as err: 

52 logger.exception("Unexpected error in get_card: card_id=%s", card_id) 

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

54 

55 

56@router.get("/deck/{deck_id}", response_model=list[CardRead]) 

57def get_cards(deck_id: int, session: Session = Depends(get_session)): # noqa: B008 

58 logger.debug("get_cards endpoint called: deck_id=%s", deck_id) 

59 service = get_card_service(session) 

60 try: 

61 cards = service.get_cards_for_deck(deck_id) 

62 logger.info("Returning %s cards for deck_id=%s", len(cards), deck_id) 

63 return cards 

64 except Exception as err: 

65 logger.exception("Unexpected error listing cards for deck_id=%s", deck_id) 

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

67 

68 

69@router.delete("/{card_id}") 

70def delete_card(card_id: int, session: Session = Depends(get_session)): # noqa: B008 

71 logger.debug("delete_card endpoint called: card_id=%s", card_id) 

72 service = get_card_service(session) 

73 try: 

74 service.delete_card(card_id) 

75 logger.info("Card deleted via endpoint: card_id=%s", card_id) 

76 return {"detail": "Card deleted"} 

77 except ValueError as err: 

78 logger.info("delete_card not found: card_id=%s", card_id) 

79 raise HTTPException(status_code=404, detail=str(err)) from err 

80 except Exception as err: 

81 logger.exception("Unexpected error deleting card_id=%s", card_id) 

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