Refactoring

This commit is contained in:
2021-12-10 16:27:10 +03:00
parent e77366d9e9
commit 1baae19702
7 changed files with 37 additions and 181 deletions

View File

@@ -112,9 +112,6 @@ class BookSequences(ormar.Model):
class Translation(ormar.Model):
class Meta(BaseMeta):
tablename = "translations"
constraints = [
# ormar.UniqueColumns("book", "translator"),
]
id: int = ormar.Integer(primary_key=True, nullable=False) # type: ignore

View File

@@ -1,3 +1,5 @@
from typing import Optional
from datetime import date
from pydantic import BaseModel
from app.serializers.orjson_config import ORJSONConfig
@@ -18,3 +20,28 @@ class CreateSequence(BaseModel):
class Config(ORJSONConfig):
pass
class Author(BaseModel):
id: int
first_name: str
last_name: str
middle_name: Optional[str]
class Config(ORJSONConfig):
pass
class Book(BaseModel):
id: int
title: str
lang: str
file_type: str
available_types: list[str]
uploaded: date
authors: list[Author]
annotation_exists: bool
class Config(ORJSONConfig):
pass

View File

@@ -1,80 +0,0 @@
from pydantic import BaseModel
from app.serializers.orjson_config import ORJSONConfig
class SequenceBookAuthor(BaseModel):
id: int
first_name: str
last_name: str
middle_name: str
class Config(ORJSONConfig):
pass
class SeqTranslationTranslator(BaseModel):
id: int
first_name: str
last_name: str
middle_name: str
class Config(ORJSONConfig):
pass
class SequenceBookTranslation(BaseModel):
id: int
translator: SeqTranslationTranslator
class Config(ORJSONConfig):
pass
class SequenceBook(BaseModel):
id: int
title: str
lang: str
file_type: str
authors: SequenceBookAuthor
translation: SequenceBookTranslation
class Config(ORJSONConfig):
pass
class Sequence(BaseModel):
id: int
name: str
class Config(ORJSONConfig):
pass
class SequenceInfo(BaseModel):
id: int
book: SequenceBook
sequence: Sequence
position: int
class Config(ORJSONConfig):
pass
class CreateSequenceInfo(BaseModel):
book: int
sequence: int
position: int
class Config(ORJSONConfig):
pass
class CreateRemoteSequenceInfo(BaseModel):
source: int
remote_book: int
remote_sequence: int
position: int
class Config(ORJSONConfig):
pass

View File

@@ -1,46 +0,0 @@
from typing import Union
from fastapi import HTTPException, status
from app.models import Sequence as SequenceInfoDB, Source as SourceDB, Book as BookDB, Sequence as SequenceDB
from app.serializers.sequence_info import CreateSequenceInfo, CreateRemoteSequenceInfo
class SequenceInfoCreator:
@classmethod
def _raise_bad_request(cls):
raise HTTPException(status.HTTP_404_NOT_FOUND)
@classmethod
async def _create_sequence_info(cls, data: CreateSequenceInfo) -> SequenceInfoDB:
return await SequenceInfoDB.objects.create(**data.dict())
@classmethod
async def _create_remote_sequence_info(cls, data: CreateRemoteSequenceInfo) -> SequenceInfoDB:
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()
sequence = await SequenceDB.objects.get_or_none(source__id=source.id, remote_id=data.remote_sequence)
if sequence is None:
cls._raise_bad_request()
return await SequenceInfoDB.objects.create(
book=book.id,
sequence=sequence.id,
position=data.position,
)
@classmethod
async def create(cls, data: Union[CreateSequenceInfo, CreateRemoteSequenceInfo]) -> SequenceInfoDB:
if isinstance(data, CreateSequenceInfo):
return await cls._create_sequence_info(data)
if isinstance(data, CreateRemoteSequenceInfo):
return await cls._create_remote_sequence_info(data)

View File

@@ -9,7 +9,6 @@ from app.views.book_annotation import book_annotation_router
from app.views.translation import translation_router
from app.views.sequence import sequence_router
from app.views.sequence_info import sequence_info_router
routers = [
@@ -20,5 +19,4 @@ routers = [
book_annotation_router,
translation_router,
sequence_router,
sequence_info_router,
]

View File

@@ -4,8 +4,8 @@ from fastapi_pagination import Params
from fastapi_pagination.ext.ormar import paginate
from app.utils.pagination import CustomPage
from app.models import Sequence as SequenceDB
from app.serializers.sequence import Sequence, CreateSequence
from app.models import Sequence as SequenceDB, Book as BookDB, BookSequences as BookSequencesDB
from app.serializers.sequence import Sequence, CreateSequence, Book as SequenceBook
from app.services.sequence import SequenceTGRMSearchService
from app.depends import check_token
@@ -29,6 +29,14 @@ async def get_sequence(id: int):
return await SequenceDB.objects.get(id=id)
@sequence_router.get("/{id}/books", response_model=CustomPage[SequenceBook], dependencies=[Depends(Params)])
async def get_sequence_books(id: int):
return await paginate(
BookDB.objects.select_related(["source", "annotations", "authors"])
.filter(sequences__id=id).order_by("sequences__booksequences__position")
)
@sequence_router.post("/", response_model=Sequence)
async def create_sequence(data: CreateSequence):
return await SequenceDB.objects.create(

View File

@@ -1,48 +0,0 @@
from typing import Union
from fastapi import APIRouter, Depends, HTTPException, status
from fastapi_pagination import Params
from fastapi_pagination.ext.ormar import paginate
from app.utils.pagination import CustomPage
from app.models import Sequence as SequenceInfoDB
from app.serializers.sequence_info import SequenceInfo, CreateSequenceInfo, CreateRemoteSequenceInfo
from app.services.sequence_info import SequenceInfoCreator
from app.depends import check_token
sequence_info_router = APIRouter(
prefix="/api/v1/sequence_info",
tags=["sequence_info"],
dependencies=[Depends(check_token)],
)
@sequence_info_router.get("/", response_model=CustomPage[SequenceInfo], dependencies=[Depends(Params)])
async def get_sequence_infos():
return await paginate(
SequenceInfoDB.objects.prefetch_related(["book", "sequence"])
.select_related(["book__authors", "book__translations", "book__translations__translator"])
)
@sequence_info_router.get("/{id}", response_model=SequenceInfo)
async def get_sequence_info(id: int):
sequence_info = await SequenceInfoDB.objects.prefetch_related(["book", "sequence"]) \
.select_related(["book__authors", "book__translations", "book__translations__translator"]) \
.get_or_none(id=id)
if sequence_info is None:
raise HTTPException(status.HTTP_404_NOT_FOUND)
return sequence_info
@sequence_info_router.post("/", response_model=SequenceInfo)
async def create_sequence_info(data: Union[CreateSequenceInfo, CreateRemoteSequenceInfo]):
sequence_info = await SequenceInfoCreator.create(data)
return await SequenceInfoDB.objects.prefetch_related(["book", "sequence"]) \
.select_related(["book__authors", "book__translations", "book__translations__translator"]) \
.get(id=sequence_info.id)