Update books handlers

This commit is contained in:
2023-06-06 20:53:43 +02:00
parent 52725ae126
commit 1702632ee9
4 changed files with 42 additions and 7 deletions

View File

@@ -1,6 +1,7 @@
from datetime import date
from typing import Optional
from fastapi_pagination import Page
from pydantic import BaseModel
from app.serializers.sequence import Sequence
@@ -37,3 +38,11 @@ class TranslatedBook(BaseModel):
authors: list[Author]
sequences: list[Sequence]
annotation_exists: bool
class PageWithAuthorBook(Page[AuthorBook]):
parent_item: Author | None
class PageWithTranslatedBook(Page[TranslatedBook]):
parent_item: TranslatedBook | None

View File

@@ -33,4 +33,4 @@ class Book(BaseModel):
class PageWithSequence(Page[Book]):
sequence: Sequence | None
parent_item: Sequence | None

View File

@@ -9,7 +9,11 @@ from app.depends import check_token, get_allowed_langs
from app.models import Author as AuthorDB
from app.models import AuthorAnnotation as AuthorAnnotationDB
from app.models import Book as BookDB
from app.serializers.author import Author, AuthorBook, TranslatedBook
from app.serializers.author import (
Author,
PageWithAuthorBook,
PageWithTranslatedBook,
)
from app.serializers.author_annotation import AuthorAnnotation
from app.services.author import AuthorMeiliSearchService, GetRandomAuthorService
from app.services.translator import TranslatorMeiliSearchService
@@ -81,12 +85,12 @@ async def get_author_annotation(id: int):
@author_router.get(
"/{id}/books", response_model=Page[AuthorBook], dependencies=[Depends(Params)]
"/{id}/books", response_model=PageWithAuthorBook, dependencies=[Depends(Params)]
)
async def get_author_books(
id: int, allowed_langs: Annotated[list[str], Depends(get_allowed_langs)]
):
return await paginate(
page = await paginate(
BookDB.objects.prefetch_related(["source"])
.select_related(["annotations", "translators", "sequences"])
.filter(authors__id=id, lang__in=allowed_langs, is_deleted=False)
@@ -94,6 +98,17 @@ async def get_author_books(
transformer=dict_transformer,
)
author = await AuthorDB.objects.get_or_none(id=id)
return PageWithAuthorBook(
items=page.items,
total=page.total,
page=page.page,
size=page.size,
pages=page.pages,
parent_item=author, # type: ignore
)
@author_router.get(
"/search/{query}", response_model=Page[Author], dependencies=[Depends(Params)]
@@ -116,11 +131,11 @@ translator_router = APIRouter(
)
@translator_router.get("/{id}/books", response_model=Page[TranslatedBook])
@translator_router.get("/{id}/books", response_model=PageWithTranslatedBook)
async def get_translated_books(
id: int, allowed_langs: Annotated[list[str], Depends(get_allowed_langs)]
):
return await paginate(
page = await paginate(
BookDB.objects.prefetch_related(["source"])
.select_related(["annotations", "authors", "sequences"])
.filter(
@@ -131,6 +146,17 @@ async def get_translated_books(
transformer=dict_transformer,
)
translator = await AuthorDB.objects.get(id=id)
return PageWithTranslatedBook(
items=page.items,
total=page.total,
page=page.page,
size=page.size,
pages=page.pages,
parent_item=translator, # type: ignore
)
@translator_router.get(
"/search/{query}", response_model=Page[Author], dependencies=[Depends(Params)]

View File

@@ -70,7 +70,7 @@ async def get_sequence_books(
total=page.total,
page=page.page,
size=page.size,
sequence=sequence, # type: ignore
parent_item=sequence, # type: ignore
)