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)