mirror of
https://github.com/flibusta-apps/book_library_server.git
synced 2025-12-06 15:15:36 +01:00
Refactoring
This commit is contained in:
@@ -112,9 +112,6 @@ class BookSequences(ormar.Model):
|
|||||||
class Translation(ormar.Model):
|
class Translation(ormar.Model):
|
||||||
class Meta(BaseMeta):
|
class Meta(BaseMeta):
|
||||||
tablename = "translations"
|
tablename = "translations"
|
||||||
constraints = [
|
|
||||||
# ormar.UniqueColumns("book", "translator"),
|
|
||||||
]
|
|
||||||
|
|
||||||
id: int = ormar.Integer(primary_key=True, nullable=False) # type: ignore
|
id: int = ormar.Integer(primary_key=True, nullable=False) # type: ignore
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
from typing import Optional
|
||||||
|
from datetime import date
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel
|
||||||
|
|
||||||
from app.serializers.orjson_config import ORJSONConfig
|
from app.serializers.orjson_config import ORJSONConfig
|
||||||
@@ -18,3 +20,28 @@ class CreateSequence(BaseModel):
|
|||||||
|
|
||||||
class Config(ORJSONConfig):
|
class Config(ORJSONConfig):
|
||||||
pass
|
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
|
||||||
|
|||||||
@@ -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
|
|
||||||
@@ -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)
|
|
||||||
@@ -9,7 +9,6 @@ from app.views.book_annotation import book_annotation_router
|
|||||||
from app.views.translation import translation_router
|
from app.views.translation import translation_router
|
||||||
|
|
||||||
from app.views.sequence import sequence_router
|
from app.views.sequence import sequence_router
|
||||||
from app.views.sequence_info import sequence_info_router
|
|
||||||
|
|
||||||
|
|
||||||
routers = [
|
routers = [
|
||||||
@@ -20,5 +19,4 @@ routers = [
|
|||||||
book_annotation_router,
|
book_annotation_router,
|
||||||
translation_router,
|
translation_router,
|
||||||
sequence_router,
|
sequence_router,
|
||||||
sequence_info_router,
|
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -4,8 +4,8 @@ from fastapi_pagination import Params
|
|||||||
from fastapi_pagination.ext.ormar import paginate
|
from fastapi_pagination.ext.ormar import paginate
|
||||||
from app.utils.pagination import CustomPage
|
from app.utils.pagination import CustomPage
|
||||||
|
|
||||||
from app.models import Sequence as SequenceDB
|
from app.models import Sequence as SequenceDB, Book as BookDB, BookSequences as BookSequencesDB
|
||||||
from app.serializers.sequence import Sequence, CreateSequence
|
from app.serializers.sequence import Sequence, CreateSequence, Book as SequenceBook
|
||||||
from app.services.sequence import SequenceTGRMSearchService
|
from app.services.sequence import SequenceTGRMSearchService
|
||||||
from app.depends import check_token
|
from app.depends import check_token
|
||||||
|
|
||||||
@@ -29,6 +29,14 @@ async def get_sequence(id: int):
|
|||||||
return await SequenceDB.objects.get(id=id)
|
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)
|
@sequence_router.post("/", response_model=Sequence)
|
||||||
async def create_sequence(data: CreateSequence):
|
async def create_sequence(data: CreateSequence):
|
||||||
return await SequenceDB.objects.create(
|
return await SequenceDB.objects.create(
|
||||||
|
|||||||
@@ -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)
|
|
||||||
Reference in New Issue
Block a user