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