mirror of
https://github.com/flibusta-apps/book_library_server.git
synced 2025-12-06 15:15:36 +01:00
58 lines
1.7 KiB
Python
58 lines
1.7 KiB
Python
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)
|