From 1baae19702badac70765927378a33a6ead4d537c Mon Sep 17 00:00:00 2001 From: Kurbanov Bulat Date: Fri, 10 Dec 2021 16:27:10 +0300 Subject: [PATCH] Refactoring --- fastapi_book_server/app/models.py | 3 - .../app/serializers/sequence.py | 27 +++++++ .../app/serializers/sequence_info.py | 80 ------------------- .../app/services/sequence_info.py | 46 ----------- fastapi_book_server/app/views/__init__.py | 2 - fastapi_book_server/app/views/sequence.py | 12 ++- .../app/views/sequence_info.py | 48 ----------- 7 files changed, 37 insertions(+), 181 deletions(-) delete mode 100644 fastapi_book_server/app/serializers/sequence_info.py delete mode 100644 fastapi_book_server/app/services/sequence_info.py delete mode 100644 fastapi_book_server/app/views/sequence_info.py diff --git a/fastapi_book_server/app/models.py b/fastapi_book_server/app/models.py index 83e5023..8b40c58 100644 --- a/fastapi_book_server/app/models.py +++ b/fastapi_book_server/app/models.py @@ -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 diff --git a/fastapi_book_server/app/serializers/sequence.py b/fastapi_book_server/app/serializers/sequence.py index d7bb03d..185acd3 100644 --- a/fastapi_book_server/app/serializers/sequence.py +++ b/fastapi_book_server/app/serializers/sequence.py @@ -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 diff --git a/fastapi_book_server/app/serializers/sequence_info.py b/fastapi_book_server/app/serializers/sequence_info.py deleted file mode 100644 index db55665..0000000 --- a/fastapi_book_server/app/serializers/sequence_info.py +++ /dev/null @@ -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 diff --git a/fastapi_book_server/app/services/sequence_info.py b/fastapi_book_server/app/services/sequence_info.py deleted file mode 100644 index c9b24da..0000000 --- a/fastapi_book_server/app/services/sequence_info.py +++ /dev/null @@ -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) diff --git a/fastapi_book_server/app/views/__init__.py b/fastapi_book_server/app/views/__init__.py index fffdf7b..260c086 100644 --- a/fastapi_book_server/app/views/__init__.py +++ b/fastapi_book_server/app/views/__init__.py @@ -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, ] diff --git a/fastapi_book_server/app/views/sequence.py b/fastapi_book_server/app/views/sequence.py index eac49b2..9e60b7c 100644 --- a/fastapi_book_server/app/views/sequence.py +++ b/fastapi_book_server/app/views/sequence.py @@ -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( diff --git a/fastapi_book_server/app/views/sequence_info.py b/fastapi_book_server/app/views/sequence_info.py deleted file mode 100644 index aeff356..0000000 --- a/fastapi_book_server/app/views/sequence_info.py +++ /dev/null @@ -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)