diff --git a/fastapi_book_server/app/services/book.py b/fastapi_book_server/app/services/book.py index c0e1f21..52b8e99 100644 --- a/fastapi_book_server/app/services/book.py +++ b/fastapi_book_server/app/services/book.py @@ -14,6 +14,9 @@ class BookTGRMSearchService(TRGMSearchService): BookDB.Meta.table.c.title ] PREFETCH_RELATED = ["source"] + FILTERS = [ + BookDB.Meta.table.c.is_deleted == False, + ] class BookCreator: diff --git a/fastapi_book_server/app/services/common.py b/fastapi_book_server/app/services/common.py index 8a0ce5a..106b6df 100644 --- a/fastapi_book_server/app/services/common.py +++ b/fastapi_book_server/app/services/common.py @@ -7,7 +7,7 @@ from fastapi_pagination.bases import AbstractParams, RawParams from app.utils.pagination import Page, CustomPage from ormar import Model, QuerySet -from sqlalchemy import text, func, select, or_, Table, Column +from sqlalchemy import text, func, select, or_, Table, Column, cast, Text from sqlalchemy.orm import Session from databases import Database @@ -29,6 +29,7 @@ class TRGMSearchService(Generic[T]): FIELDS: Optional[list[Column]] = None SELECT_RELATED: Optional[Union[list[str], str]] = None PREFETCH_RELATED: Optional[Union[list[str], str]] = None + FILTERS = [] @classmethod def get_params(cls) -> AbstractParams: @@ -67,7 +68,7 @@ class TRGMSearchService(Generic[T]): combs = cls.fields_combinations return func.greatest( - *[func.similarity(join_fields(comb), f"{query}::text") for comb in combs] + *[func.similarity(join_fields(comb), cast(query, Text)) for comb in combs] ).label("sml") @classmethod @@ -90,8 +91,8 @@ class TRGMSearchService(Generic[T]): ).order_by( text('sml DESC') ).filter( - cls.table.c.is_deleted == False, - similarity_filter + similarity_filter, + *cls.FILTERS ).cte('objs') sq = session.query(q1.c.id).limit(params.limit).offset(params.offset).subquery() diff --git a/fastapi_book_server/app/views/book.py b/fastapi_book_server/app/views/book.py index 57173ce..53650e8 100644 --- a/fastapi_book_server/app/views/book.py +++ b/fastapi_book_server/app/views/book.py @@ -43,7 +43,7 @@ async def get_book(id: int): return book -@book_router.get("/{source_id}/{remote_id}", response_model=Book) +@book_router.get("/remote/{source_id}/{remote_id}", response_model=Book) async def get_remote_book(source_id: int, remote_id: int): book = await BookDB.objects.select_related("authors").get_or_none( source=source_id,