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
« prev ^ index » next coverage.py v7.14.3, created at 2026-06-24 08:34 +0000
1import logging
3from fastapi import APIRouter, Depends, HTTPException
4from sqlalchemy.orm import Session
6from app.core.dependencies import get_card_service
7from app.db.session import get_session
8from app.modules.cards.schemas import CardCreate, CardRead
10logger = logging.getLogger(__name__)
12router = APIRouter()
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
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
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
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