From 1702632ee95ee55cfc75bf84456794a6128feed4 Mon Sep 17 00:00:00 2001 From: Bulat Kurbanov Date: Tue, 6 Jun 2023 20:53:43 +0200 Subject: [PATCH] Update books handlers --- fastapi_book_server/app/serializers/author.py | 9 +++++ .../app/serializers/sequence.py | 2 +- fastapi_book_server/app/views/author.py | 36 ++++++++++++++++--- fastapi_book_server/app/views/sequence.py | 2 +- 4 files changed, 42 insertions(+), 7 deletions(-) diff --git a/fastapi_book_server/app/serializers/author.py b/fastapi_book_server/app/serializers/author.py index a7cceb5..28179cb 100644 --- a/fastapi_book_server/app/serializers/author.py +++ b/fastapi_book_server/app/serializers/author.py @@ -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 diff --git a/fastapi_book_server/app/serializers/sequence.py b/fastapi_book_server/app/serializers/sequence.py index f8f7e41..13883e7 100644 --- a/fastapi_book_server/app/serializers/sequence.py +++ b/fastapi_book_server/app/serializers/sequence.py @@ -33,4 +33,4 @@ class Book(BaseModel): class PageWithSequence(Page[Book]): - sequence: Sequence | None + parent_item: Sequence | None diff --git a/fastapi_book_server/app/views/author.py b/fastapi_book_server/app/views/author.py index b25e10c..e292917 100644 --- a/fastapi_book_server/app/views/author.py +++ b/fastapi_book_server/app/views/author.py @@ -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)] diff --git a/fastapi_book_server/app/views/sequence.py b/fastapi_book_server/app/views/sequence.py index c721aab..88a255c 100644 --- a/fastapi_book_server/app/views/sequence.py +++ b/fastapi_book_server/app/views/sequence.py @@ -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 )