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 typing import Generic, Optional, TypedDict, TypeVar, Union
from databases import Database from databases import Database
from fastapi_pagination import Page
from fastapi_pagination.api import resolve_params from fastapi_pagination.api import resolve_params
from fastapi_pagination.bases import AbstractParams, RawParams from fastapi_pagination.bases import AbstractParams, RawParams
import meilisearch import meilisearch
@@ -15,7 +16,6 @@ from redis import asyncio as aioredis
from sqlalchemy import Table from sqlalchemy import Table
from app.utils.orjson_default import default as orjson_default from app.utils.orjson_default import default as orjson_default
from app.utils.pagination import Page
from core.config import env_config 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): if not await redis.exists(active_key):
return None return None
assert params.offset
assert params.limit
objects_count, objects = await asyncio.gather( objects_count, objects = await asyncio.gather(
redis.llen(key), redis.llen(key),
redis.lrange(key, params.offset, params.offset + params.limit), 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 return cached_object_ids
assert params.limit
assert params.offset
object_ids = await cls._get_object_ids(query) object_ids = await cls._get_object_ids(query)
limited_object_ids = object_ids[params.offset : params.offset + params.limit] 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 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 fastapi_pagination.ext.ormar import paginate
from app.depends import check_token, get_allowed_langs 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.serializers.author_annotation import AuthorAnnotation
from app.services.author import AuthorMeiliSearchService, GetRandomAuthorService from app.services.author import AuthorMeiliSearchService, GetRandomAuthorService
from app.services.translator import TranslatorMeiliSearchService from app.services.translator import TranslatorMeiliSearchService
from app.utils.pagination import Page
author_router = APIRouter( author_router = APIRouter(

View File

@@ -2,7 +2,7 @@ from typing import Annotated, Optional
from fastapi import APIRouter, Depends, HTTPException, Request, status 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.depends import check_token, get_allowed_langs
from app.filters.book import get_book_filter from app.filters.book import get_book_filter
@@ -16,7 +16,6 @@ from app.services.book import (
BookMeiliSearchService, BookMeiliSearchService,
GetRandomBookService, GetRandomBookService,
) )
from app.utils.pagination import Page
book_router = APIRouter( book_router = APIRouter(

View File

@@ -2,7 +2,7 @@ from typing import Annotated
from fastapi import APIRouter, Depends, HTTPException, Request, status 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 fastapi_pagination.ext.ormar import paginate
from app.depends import check_token, get_allowed_langs 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.models import Genre as GenreDB
from app.serializers.genre import Genre from app.serializers.genre import Genre
from app.services.genre import GenreMeiliSearchService from app.services.genre import GenreMeiliSearchService
from app.utils.pagination import Page
genre_router = APIRouter( genre_router = APIRouter(

View File

@@ -2,7 +2,7 @@ from typing import Annotated
from fastapi import APIRouter, Depends, HTTPException, Request, status 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 fastapi_pagination.ext.ormar import paginate
from app.depends import check_token, get_allowed_langs 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 Book as SequenceBook
from app.serializers.sequence import Sequence from app.serializers.sequence import Sequence
from app.services.sequence import GetRandomSequenceService, SequenceMeiliSearchService from app.services.sequence import GetRandomSequenceService, SequenceMeiliSearchService
from app.utils.pagination import Page
sequence_router = APIRouter( sequence_router = APIRouter(

View File

@@ -1,12 +1,11 @@
from fastapi import APIRouter, Depends from fastapi import APIRouter, Depends
from fastapi_pagination import Params from fastapi_pagination import Page, Params
from fastapi_pagination.ext.ormar import paginate from fastapi_pagination.ext.ormar import paginate
from app.depends import check_token from app.depends import check_token
from app.models import Translation as TranslationDB from app.models import Translation as TranslationDB
from app.serializers.translation import Translation from app.serializers.translation import Translation
from app.utils.pagination import Page
translation_router = APIRouter( translation_router = APIRouter(