diff --git a/fastapi_book_server/app/models.py b/fastapi_book_server/app/models.py index 1c58ed5..23edf09 100644 --- a/fastapi_book_server/app/models.py +++ b/fastapi_book_server/app/models.py @@ -140,6 +140,13 @@ class Book(ormar.Model): genres = ormar.ManyToMany(Genre, through=BookGenres) sequences = ormar.ManyToMany(Sequence, through=BookSequences) + @ormar.property_field + def available_types(self) -> list[str]: + if self.file_type == 'fb2' and self.source.name == 'flibusta': + return ['fb2', 'epub', 'mobi'] + + return [self.file_type] + class BookAnnotation(ormar.Model): class Meta(BaseMeta): diff --git a/fastapi_book_server/app/serializers/book.py b/fastapi_book_server/app/serializers/book.py index 8b759ab..088d300 100644 --- a/fastapi_book_server/app/serializers/book.py +++ b/fastapi_book_server/app/serializers/book.py @@ -10,6 +10,7 @@ class Book(BaseModel): title: str lang: str file_type: str + available_types: list[str] uploaded: date authors: list[Author] diff --git a/fastapi_book_server/app/services/book.py b/fastapi_book_server/app/services/book.py index 52b8e99..cae5759 100644 --- a/fastapi_book_server/app/services/book.py +++ b/fastapi_book_server/app/services/book.py @@ -13,7 +13,7 @@ class BookTGRMSearchService(TRGMSearchService): FIELDS = [ BookDB.Meta.table.c.title ] - PREFETCH_RELATED = ["source"] + PREFETCH_RELATED = ["source", "authors"] FILTERS = [ BookDB.Meta.table.c.is_deleted == False, ] diff --git a/fastapi_book_server/app/views/book.py b/fastapi_book_server/app/views/book.py index 53650e8..53264ad 100644 --- a/fastapi_book_server/app/views/book.py +++ b/fastapi_book_server/app/views/book.py @@ -22,7 +22,7 @@ book_router = APIRouter( @book_router.get("/", response_model=CustomPage[Book], dependencies=[Depends(Params)]) async def get_books(): return await paginate( - BookDB.objects.select_related("authors") + BookDB.objects.select_related(["source", "authors"]) ) @@ -30,12 +30,12 @@ async def get_books(): async def create_book(data: Union[CreateBook, CreateRemoteBook]): book = await BookCreator.create(data) - return await BookDB.objects.select_related("authors").get(id=book.id) + return await BookDB.objects.select_related(["source", "authors"]).get(id=book.id) @book_router.get("/{id}", response_model=Book) async def get_book(id: int): - book = await BookDB.objects.select_related("authors").get_or_none(id=id) + book = await BookDB.objects.select_related(["source", "authors"]).get_or_none(id=id) if book is None: raise HTTPException(status.HTTP_404_NOT_FOUND) @@ -45,7 +45,7 @@ async def get_book(id: int): @book_router.get("/remote/{source_id}/{remote_id}", response_model=Book) async def get_remote_book(source_id: int, remote_id: int): - book = await BookDB.objects.select_related("authors").get_or_none( + book = await BookDB.objects.select_related(["source", "authors"]).get_or_none( source=source_id, remote_id=remote_id ) @@ -58,7 +58,7 @@ async def get_remote_book(source_id: int, remote_id: int): @book_router.put("/{id}", response_model=Book) async def update_book(id: int, data: UpdateBook): - book = await BookDB.objects.select_related("authors").get_or_none(id=id) + book = await BookDB.objects.select_related(["source", "authors"]).get_or_none(id=id) if book is None: raise HTTPException(status.HTTP_404_NOT_FOUND)