Update page

This commit is contained in:
2023-06-06 14:43:20 +02:00
parent 8a6db6cd0b
commit e55c1abd7b
7 changed files with 12 additions and 71 deletions

View File

@@ -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]

View File

@@ -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,
)

View File

@@ -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(

View File

@@ -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(

View File

@@ -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(

View File

@@ -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(

View File

@@ -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(