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 datetime import date
from typing import Optional from typing import Optional
from fastapi_pagination import Page
from pydantic import BaseModel from pydantic import BaseModel
from app.serializers.sequence import Sequence from app.serializers.sequence import Sequence
@@ -37,3 +38,11 @@ class TranslatedBook(BaseModel):
authors: list[Author] authors: list[Author]
sequences: list[Sequence] sequences: list[Sequence]
annotation_exists: bool 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]): 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 Author as AuthorDB
from app.models import AuthorAnnotation as AuthorAnnotationDB from app.models import AuthorAnnotation as AuthorAnnotationDB
from app.models import Book as BookDB 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.serializers.author_annotation import AuthorAnnotation
from app.services.author import AuthorMeiliSearchService, GetRandomAuthorService from app.services.author import AuthorMeiliSearchService, GetRandomAuthorService
from app.services.translator import TranslatorMeiliSearchService from app.services.translator import TranslatorMeiliSearchService
@@ -81,12 +85,12 @@ async def get_author_annotation(id: int):
@author_router.get( @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( async def get_author_books(
id: int, allowed_langs: Annotated[list[str], Depends(get_allowed_langs)] id: int, allowed_langs: Annotated[list[str], Depends(get_allowed_langs)]
): ):
return await paginate( page = await paginate(
BookDB.objects.prefetch_related(["source"]) BookDB.objects.prefetch_related(["source"])
.select_related(["annotations", "translators", "sequences"]) .select_related(["annotations", "translators", "sequences"])
.filter(authors__id=id, lang__in=allowed_langs, is_deleted=False) .filter(authors__id=id, lang__in=allowed_langs, is_deleted=False)
@@ -94,6 +98,17 @@ async def get_author_books(
transformer=dict_transformer, 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( @author_router.get(
"/search/{query}", response_model=Page[Author], dependencies=[Depends(Params)] "/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( async def get_translated_books(
id: int, allowed_langs: Annotated[list[str], Depends(get_allowed_langs)] id: int, allowed_langs: Annotated[list[str], Depends(get_allowed_langs)]
): ):
return await paginate( page = await paginate(
BookDB.objects.prefetch_related(["source"]) BookDB.objects.prefetch_related(["source"])
.select_related(["annotations", "authors", "sequences"]) .select_related(["annotations", "authors", "sequences"])
.filter( .filter(
@@ -131,6 +146,17 @@ async def get_translated_books(
transformer=dict_transformer, 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( @translator_router.get(
"/search/{query}", response_model=Page[Author], dependencies=[Depends(Params)] "/search/{query}", response_model=Page[Author], dependencies=[Depends(Params)]

View File

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