|
4 | 4 | import litestar |
5 | 5 | from litestar.di import NamedDependency |
6 | 6 | from litestar.exceptions import ValidationException |
7 | | -from litestar.params import FromPath, QueryParameter |
| 7 | +from litestar.params import QueryParameter |
8 | 8 |
|
9 | 9 | from app import schemas |
| 10 | +from app.api import PathId |
10 | 11 | from app.use_cases.create_cards import CreateCardsUseCase |
11 | 12 | from app.use_cases.get_card import GetCardUseCase |
12 | 13 | from app.use_cases.list_cards import ListCardsUseCase |
13 | 14 | from app.use_cases.update_cards import UpdateCardsUseCase |
14 | 15 |
|
15 | 16 |
|
| 17 | +TOO_MANY_CARDS: typing.Final = f"at most {schemas.MAX_CARDS_PER_REQUEST} cards per request" |
| 18 | + |
| 19 | + |
16 | 20 | @litestar.get("/decks/{deck_id:int}/cards/") |
17 | 21 | async def list_cards( |
18 | | - deck_id: FromPath[int], |
| 22 | + deck_id: PathId, |
19 | 23 | list_cards_use_case: NamedDependency[ListCardsUseCase], |
20 | | - after: Annotated[int | None, QueryParameter(gt=0)] = None, |
| 24 | + after: Annotated[int | None, QueryParameter(gt=0, le=schemas.MAX_ID)] = None, |
21 | 25 | limit: Annotated[int, QueryParameter(ge=1, le=schemas.MAX_PAGE_LIMIT)] = schemas.DEFAULT_PAGE_LIMIT, |
22 | 26 | ) -> schemas.CardsPage: |
23 | 27 | cards: typing.Final = await list_cards_use_case(deck_id=deck_id, after=after, limit=limit) |
24 | 28 | return schemas.CardsPage.from_models(cards, limit=limit) |
25 | 29 |
|
26 | 30 |
|
27 | 31 | @litestar.get("/cards/{card_id:int}/") |
28 | | -async def get_card(card_id: FromPath[int], get_card_use_case: NamedDependency[GetCardUseCase]) -> schemas.Card: |
| 32 | +async def get_card(card_id: PathId, get_card_use_case: NamedDependency[GetCardUseCase]) -> schemas.Card: |
29 | 33 | return schemas.Card.model_validate(await get_card_use_case(card_id=card_id)) |
30 | 34 |
|
31 | 35 |
|
32 | 36 | @litestar.post("/decks/{deck_id:int}/cards/") |
33 | 37 | async def create_cards( |
34 | | - deck_id: FromPath[int], |
| 38 | + deck_id: PathId, |
35 | 39 | data: list[schemas.CardCreate], |
36 | 40 | create_cards_use_case: NamedDependency[CreateCardsUseCase], |
37 | 41 | ) -> schemas.Cards: |
| 42 | + if len(data) > schemas.MAX_CARDS_PER_REQUEST: |
| 43 | + raise ValidationException(detail=TOO_MANY_CARDS) |
38 | 44 | return schemas.Cards.from_models(await create_cards_use_case(deck_id=deck_id, data=data)) |
39 | 45 |
|
40 | 46 |
|
41 | 47 | @litestar.put("/decks/{deck_id:int}/cards/") |
42 | 48 | async def update_cards( |
43 | | - deck_id: FromPath[int], |
| 49 | + deck_id: PathId, |
44 | 50 | data: list[schemas.CardUpdate], |
45 | 51 | update_cards_use_case: NamedDependency[UpdateCardsUseCase], |
46 | 52 | ) -> schemas.Cards: |
| 53 | + if len(data) > schemas.MAX_CARDS_PER_REQUEST: |
| 54 | + raise ValidationException(detail=TOO_MANY_CARDS) |
47 | 55 | if len({card.id for card in data}) != len(data): |
48 | 56 | raise ValidationException(detail="card ids must be unique") |
49 | 57 | return schemas.Cards.from_models(await update_cards_use_case(deck_id=deck_id, data=data)) |
|
0 commit comments