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

64 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_deck_service 

7from app.db.session import get_session 

8from app.modules.decks.schemas import DeckCreate, DeckRead, DeckWithCards 

9 

10logger = logging.getLogger(__name__) 

11 

12router = APIRouter() 

13 

14 

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

16def create_deck(payload: DeckCreate, session: Session = Depends(get_session)): # noqa: B008 

17 logger.debug("create_deck endpoint called: name_present=%s", bool(getattr(payload, "name", ""))) 

18 service = get_deck_service(session) 

19 try: 

20 deck = service.create_deck(payload.name) 

21 logger.info( 

22 "Deck created via endpoint: id=%s name=%s", 

23 getattr(deck, "id", None), 

24 getattr(deck, "name", None), 

25 ) 

26 return deck 

27 except ValueError as err: 

28 logger.warning("create_deck bad request: %s", err) 

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

30 except Exception as err: 

31 logger.exception("Unexpected error in create_deck") 

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

33 

34 

35@router.get("/{deck_id}", response_model=DeckRead) 

36def get_deck(deck_id: int, session: Session = Depends(get_session)): # noqa: B008 

37 logger.debug("get_deck endpoint called: deck_id=%s", deck_id) 

38 service = get_deck_service(session) 

39 try: 

40 deck = service.get_deck(deck_id) 

41 logger.info("Deck fetched via endpoint: deck_id=%s", deck_id) 

42 return deck 

43 except ValueError as err: 

44 logger.info("get_deck not found: deck_id=%s", deck_id) 

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

46 except Exception as err: 

47 logger.exception("Unexpected error in get_deck: deck_id=%s", deck_id) 

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

49 

50 

51@router.get("/{deck_id}/full", response_model=DeckWithCards) 

52def get_deck_full(deck_id: int, session: Session = Depends(get_session)): # noqa: B008 

53 logger.debug("get_deck_full endpoint called: deck_id=%s", deck_id) 

54 service = get_deck_service(session) 

55 try: 

56 result = service.get_deck_with_cards(deck_id) 

57 logger.info("Deck with cards returned via endpoint: deck_id=%s", deck_id) 

58 return result 

59 except ValueError as err: 

60 logger.info("get_deck_full not found: deck_id=%s", deck_id) 

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

62 except Exception as err: 

63 logger.exception("Unexpected error in get_deck_full: deck_id=%s", deck_id) 

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

65 

66 

67@router.delete("/{deck_id}") 

68def delete_deck(deck_id: int, session: Session = Depends(get_session)): # noqa: B008 

69 logger.debug("delete_deck endpoint called: deck_id=%s", deck_id) 

70 service = get_deck_service(session) 

71 try: 

72 result = service.delete_deck(deck_id) 

73 logger.info("Deck deleted via endpoint: deck_id=%s", deck_id) 

74 return result 

75 except ValueError as err: 

76 logger.info("delete_deck not found: deck_id=%s", deck_id) 

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

78 except Exception as err: 

79 logger.exception("Unexpected error deleting deck_id=%s", deck_id) 

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