From e55c1abd7b8d4e442b90cfd024b7327a58d39ba8 Mon Sep 17 00:00:00 2001 From: Bulat Kurbanov Date: Tue, 6 Jun 2023 14:43:20 +0200 Subject: [PATCH] Update page --- fastapi_book_server/app/services/common.py | 8 ++- fastapi_book_server/app/utils/pagination.py | 60 -------------------- fastapi_book_server/app/views/author.py | 3 +- fastapi_book_server/app/views/book.py | 3 +- fastapi_book_server/app/views/genre.py | 3 +- fastapi_book_server/app/views/sequence.py | 3 +- fastapi_book_server/app/views/translation.py | 3 +- 7 files changed, 12 insertions(+), 71 deletions(-) delete mode 100644 fastapi_book_server/app/utils/pagination.py diff --git a/fastapi_book_server/app/services/common.py b/fastapi_book_server/app/services/common.py index 44a0f53..f3bbcae 100644 --- a/fastapi_book_server/app/services/common.py +++ b/fastapi_book_server/app/services/common.py @@ -6,6 +6,7 @@ from random import choice from typing import Generic, Optional, TypedDict, TypeVar, Union from databases import Database +from fastapi_pagination import Page from fastapi_pagination.api import resolve_params from fastapi_pagination.bases import AbstractParams, RawParams import meilisearch @@ -15,7 +16,6 @@ from redis import asyncio as aioredis from sqlalchemy import Table from app.utils.orjson_default import default as orjson_default -from app.utils.pagination import Page from core.config import env_config @@ -117,6 +117,9 @@ class BaseSearchService(Generic[MODEL, QUERY], BaseService[MODEL, QUERY]): if not await redis.exists(active_key): return None + assert params.offset + assert params.limit + objects_count, objects = await asyncio.gather( redis.llen(key), redis.lrange(key, params.offset, params.offset + params.limit), @@ -138,6 +141,9 @@ class BaseSearchService(Generic[MODEL, QUERY], BaseService[MODEL, QUERY]): ): return cached_object_ids + assert params.limit + assert params.offset + object_ids = await cls._get_object_ids(query) limited_object_ids = object_ids[params.offset : params.offset + params.limit] diff --git a/fastapi_book_server/app/utils/pagination.py b/fastapi_book_server/app/utils/pagination.py deleted file mode 100644 index a7ee168..0000000 --- a/fastapi_book_server/app/utils/pagination.py +++ /dev/null @@ -1,60 +0,0 @@ -from math import ceil -from typing import ( - Any, - Generic, - Protocol, - Sequence, - TypeVar, - runtime_checkable, -) - -from fastapi_pagination import Params -from fastapi_pagination.bases import AbstractParams, BasePage -from fastapi_pagination.types import GreaterEqualOne, GreaterEqualZero -import orjson - -from app.utils.orjson_default import orjson_dumps - - -@runtime_checkable -class ToDict(Protocol): - def dict(self) -> dict: - ... - - -T = TypeVar("T", ToDict, Any) - - -class Page(BasePage[T], Generic[T]): - page: GreaterEqualOne - size: GreaterEqualOne - total_pages: GreaterEqualZero - - __params_type__ = Params - - class Config: - json_loads = orjson.loads - json_dumps = orjson_dumps - - @classmethod - def create( - cls, - items: Sequence[T], - params: AbstractParams, - *, - total: int, - **kwargs: Any, - ) -> "Page[T]": - if not isinstance(params, Params): - raise ValueError("Page should be used with Params") - - pages = ceil(total / params.size) - - return cls( - total=total, - items=[item.dict() for item in items], - page=params.page, - size=params.size, - total_pages=pages, - **kwargs, - ) diff --git a/fastapi_book_server/app/views/author.py b/fastapi_book_server/app/views/author.py index 68438a6..3111a29 100644 --- a/fastapi_book_server/app/views/author.py +++ b/fastapi_book_server/app/views/author.py @@ -2,7 +2,7 @@ from typing import Annotated from fastapi import APIRouter, Depends, HTTPException, Request, status -from fastapi_pagination import Params +from fastapi_pagination import Page, Params from fastapi_pagination.ext.ormar import paginate from app.depends import check_token, get_allowed_langs @@ -13,7 +13,6 @@ from app.serializers.author import Author, AuthorBook, TranslatedBook from app.serializers.author_annotation import AuthorAnnotation from app.services.author import AuthorMeiliSearchService, GetRandomAuthorService from app.services.translator import TranslatorMeiliSearchService -from app.utils.pagination import Page author_router = APIRouter( diff --git a/fastapi_book_server/app/views/book.py b/fastapi_book_server/app/views/book.py index 0e59ec7..65bdc2f 100644 --- a/fastapi_book_server/app/views/book.py +++ b/fastapi_book_server/app/views/book.py @@ -2,7 +2,7 @@ from typing import Annotated, Optional from fastapi import APIRouter, Depends, HTTPException, Request, status -from fastapi_pagination import Params +from fastapi_pagination import Page, Params from app.depends import check_token, get_allowed_langs from app.filters.book import get_book_filter @@ -16,7 +16,6 @@ from app.services.book import ( BookMeiliSearchService, GetRandomBookService, ) -from app.utils.pagination import Page book_router = APIRouter( diff --git a/fastapi_book_server/app/views/genre.py b/fastapi_book_server/app/views/genre.py index 4cc6f36..58f3da7 100644 --- a/fastapi_book_server/app/views/genre.py +++ b/fastapi_book_server/app/views/genre.py @@ -2,7 +2,7 @@ from typing import Annotated from fastapi import APIRouter, Depends, HTTPException, Request, status -from fastapi_pagination import Params +from fastapi_pagination import Page, Params from fastapi_pagination.ext.ormar import paginate from app.depends import check_token, get_allowed_langs @@ -10,7 +10,6 @@ from app.filters.genre import get_genre_filter from app.models import Genre as GenreDB from app.serializers.genre import Genre from app.services.genre import GenreMeiliSearchService -from app.utils.pagination import Page genre_router = APIRouter( diff --git a/fastapi_book_server/app/views/sequence.py b/fastapi_book_server/app/views/sequence.py index 33c0e7d..c2cc227 100644 --- a/fastapi_book_server/app/views/sequence.py +++ b/fastapi_book_server/app/views/sequence.py @@ -2,7 +2,7 @@ from typing import Annotated from fastapi import APIRouter, Depends, HTTPException, Request, status -from fastapi_pagination import Params +from fastapi_pagination import Page, Params from fastapi_pagination.ext.ormar import paginate from app.depends import check_token, get_allowed_langs @@ -11,7 +11,6 @@ from app.models import Sequence as SequenceDB from app.serializers.sequence import Book as SequenceBook from app.serializers.sequence import Sequence from app.services.sequence import GetRandomSequenceService, SequenceMeiliSearchService -from app.utils.pagination import Page sequence_router = APIRouter( diff --git a/fastapi_book_server/app/views/translation.py b/fastapi_book_server/app/views/translation.py index 24d7aa3..5e0032c 100644 --- a/fastapi_book_server/app/views/translation.py +++ b/fastapi_book_server/app/views/translation.py @@ -1,12 +1,11 @@ from fastapi import APIRouter, Depends -from fastapi_pagination import Params +from fastapi_pagination import Page, Params from fastapi_pagination.ext.ormar import paginate from app.depends import check_token from app.models import Translation as TranslationDB from app.serializers.translation import Translation -from app.utils.pagination import Page translation_router = APIRouter(