mirror of
https://github.com/flibusta-apps/book_library_server.git
synced 2025-12-06 07:05:36 +01:00
Update books handlers
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -33,4 +33,4 @@ class Book(BaseModel):
|
||||
|
||||
|
||||
class PageWithSequence(Page[Book]):
|
||||
sequence: Sequence | None
|
||||
parent_item: Sequence | None
|
||||
|
||||
@@ -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)]
|
||||
|
||||
@@ -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
|
||||
)
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user