mirror of
https://github.com/flibusta-apps/book_library_server.git
synced 2025-12-06 15:15:36 +01:00
Code clean up
This commit is contained in:
@@ -1,10 +1,4 @@
|
||||
from typing import Union
|
||||
|
||||
from fastapi import HTTPException, status
|
||||
|
||||
from app.models import Author as AuthorDB
|
||||
from app.models import Book as BookDB
|
||||
from app.serializers.book import CreateBook, CreateRemoteBook
|
||||
from app.services.common import (
|
||||
TRGMSearchService,
|
||||
MeiliSearchService,
|
||||
@@ -40,55 +34,6 @@ class BookFilterService(BaseFilterService):
|
||||
SELECT_RELATED = ["authors", "translators", "annotations"]
|
||||
|
||||
|
||||
class BookCreator:
|
||||
@classmethod
|
||||
def _raise_bad_request(cls):
|
||||
raise HTTPException(status.HTTP_404_NOT_FOUND)
|
||||
|
||||
@classmethod
|
||||
async def _create_book(cls, data: CreateBook) -> BookDB:
|
||||
data_dict = data.dict()
|
||||
|
||||
author_ids = data_dict.pop("authors", [])
|
||||
authors = await AuthorDB.objects.filter(id__in=author_ids).all()
|
||||
|
||||
if len(author_ids) != len(authors):
|
||||
cls._raise_bad_request()
|
||||
|
||||
book = await BookDB.objects.create(**data_dict)
|
||||
|
||||
for author in authors:
|
||||
await book.authors.add(author)
|
||||
|
||||
return book
|
||||
|
||||
@classmethod
|
||||
async def _create_remote_book(cls, data: CreateRemoteBook) -> BookDB:
|
||||
data_dict = data.dict()
|
||||
|
||||
author_ids = data_dict.pop("remote_authors", [])
|
||||
authors = await AuthorDB.objects.filter(
|
||||
source__id=data.source, remote_id__in=author_ids
|
||||
).all()
|
||||
|
||||
if len(author_ids) != len(authors):
|
||||
cls._raise_bad_request()
|
||||
|
||||
book = await BookDB.objects.create(**data_dict)
|
||||
|
||||
for author in authors:
|
||||
await book.authors.add(author)
|
||||
|
||||
return book
|
||||
|
||||
@classmethod
|
||||
async def create(cls, data: Union[CreateBook, CreateRemoteBook]) -> BookDB:
|
||||
if isinstance(data, CreateBook):
|
||||
return await cls._create_book(data)
|
||||
if isinstance(data, CreateRemoteBook):
|
||||
return await cls._create_remote_book(data)
|
||||
|
||||
|
||||
GET_OBJECTS_ID_QUERY = """
|
||||
WITH filtered_books AS (
|
||||
SELECT id FROM books
|
||||
|
||||
@@ -1,57 +0,0 @@
|
||||
from typing import Union
|
||||
|
||||
from fastapi import HTTPException, status
|
||||
|
||||
from app.models import Author as AuthorDB
|
||||
from app.models import Book as BookDB
|
||||
from app.models import Source as SourceDB
|
||||
from app.models import Translation as TranslationDB
|
||||
from app.serializers.translation import CreateTranslation, CreateRemoteTranslation
|
||||
|
||||
|
||||
class TranslationCreator:
|
||||
@classmethod
|
||||
def _raise_bad_request(cls):
|
||||
raise HTTPException(status.HTTP_404_NOT_FOUND)
|
||||
|
||||
@classmethod
|
||||
async def _create_translation(cls, data: CreateTranslation) -> TranslationDB:
|
||||
return await TranslationDB.objects.create(**data.dict())
|
||||
|
||||
@classmethod
|
||||
async def _create_remote_translation(
|
||||
cls, data: CreateRemoteTranslation
|
||||
) -> TranslationDB:
|
||||
source = await SourceDB.objects.get_or_none(id=data.source)
|
||||
|
||||
if source is None:
|
||||
cls._raise_bad_request()
|
||||
|
||||
book = await BookDB.objects.get_or_none(
|
||||
source__id=source.id, remote_id=data.remote_book
|
||||
)
|
||||
|
||||
if book is None:
|
||||
cls._raise_bad_request()
|
||||
|
||||
translator = await AuthorDB.objects.get_or_none(
|
||||
source__id=source.id, remote_id=data.remote_translator
|
||||
)
|
||||
|
||||
if translator is None:
|
||||
cls._raise_bad_request()
|
||||
|
||||
return await TranslationDB.objects.create(
|
||||
book=book.id,
|
||||
translator=translator.id,
|
||||
position=data.position,
|
||||
)
|
||||
|
||||
@classmethod
|
||||
async def create(
|
||||
cls, data: Union[CreateTranslation, CreateRemoteTranslation]
|
||||
) -> TranslationDB:
|
||||
if isinstance(data, CreateTranslation):
|
||||
return await cls._create_translation(data)
|
||||
if isinstance(data, CreateRemoteTranslation):
|
||||
return await cls._create_remote_translation(data)
|
||||
Reference in New Issue
Block a user