-
Notifications
You must be signed in to change notification settings - Fork 28
Expand file tree
/
Copy pathdecks.py
More file actions
103 lines (81 loc) · 3.24 KB
/
decks.py
File metadata and controls
103 lines (81 loc) · 3.24 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
import typing
import fastapi
from advanced_alchemy.exceptions import NotFoundError
from modern_di_fastapi import FromDI
from sqlalchemy import orm
from starlette import status
from app import models, schemas
from app.repositories import CardsRepository, DecksRepository
ROUTER: typing.Final = fastapi.APIRouter()
@ROUTER.get("/decks/")
async def list_decks(
decks_repository: DecksRepository = FromDI(DecksRepository),
) -> schemas.Decks:
objects = await decks_repository.list()
return typing.cast("schemas.Decks", {"items": objects})
@ROUTER.get("/decks/{deck_id}/")
async def get_deck(
deck_id: int,
decks_repository: DecksRepository = FromDI(DecksRepository),
) -> schemas.Deck:
instance = await decks_repository.get_one_or_none(
models.Deck.id == deck_id,
load=[orm.selectinload(models.Deck.cards)],
)
if not instance:
raise fastapi.HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Deck is not found")
return typing.cast("schemas.Deck", instance)
@ROUTER.put("/decks/{deck_id}/")
async def update_deck(
deck_id: int,
data: schemas.DeckCreate,
decks_repository: DecksRepository = FromDI(DecksRepository),
) -> schemas.Deck:
try:
instance = await decks_repository.update(data=data.model_dump(), item_id=deck_id)
except NotFoundError:
raise fastapi.HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Deck is not found") from None
return typing.cast("schemas.Deck", instance)
@ROUTER.post("/decks/")
async def create_deck(
data: schemas.DeckCreate,
decks_repository: DecksRepository = FromDI(DecksRepository),
) -> schemas.Deck:
instance = await decks_repository.create(data.model_dump())
return typing.cast("schemas.Deck", instance)
@ROUTER.get("/decks/{deck_id}/cards/")
async def list_cards(
deck_id: int,
cards_repository: CardsRepository = FromDI(CardsRepository),
) -> schemas.Cards:
objects = await cards_repository.list(models.Card.deck_id == deck_id)
return typing.cast("schemas.Cards", {"items": objects})
@ROUTER.get("/cards/{card_id}/")
async def get_card(
card_id: int,
cards_repository: CardsRepository = FromDI(CardsRepository),
) -> schemas.Card:
instance = await cards_repository.get_one_or_none(models.Card.id == card_id)
if not instance:
raise fastapi.HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Card is not found")
return typing.cast("schemas.Card", instance)
@ROUTER.post("/decks/{deck_id}/cards/")
async def create_cards(
deck_id: int,
data: list[schemas.CardCreate],
cards_repository: CardsRepository = FromDI(CardsRepository),
) -> schemas.Cards:
objects = await cards_repository.create_many(
data=[models.Card(**card.model_dump(), deck_id=deck_id) for card in data],
)
return typing.cast("schemas.Cards", {"items": objects})
@ROUTER.put("/decks/{deck_id}/cards/")
async def update_cards(
deck_id: int,
data: list[schemas.Card],
cards_repository: CardsRepository = FromDI(CardsRepository),
) -> schemas.Cards:
objects = await cards_repository.upsert_many(
data=[models.Card(**card.model_dump(exclude={"deck_id"}), deck_id=deck_id) for card in data],
)
return typing.cast("schemas.Cards", {"items": objects})