From 0f8ed8d8b3eca0378bc5966645f30088ae3cf3b8 Mon Sep 17 00:00:00 2001 From: Simone Robutti Date: Fri, 2 Dec 2022 17:34:58 +0100 Subject: [PATCH] integrated pagination with tortoise --- mobilizon_reshare/web/__init__.py | 10 ---------- mobilizon_reshare/web/backend/events/endpoints.py | 6 ++---- mobilizon_reshare/web/backend/main.py | 9 +++++++-- .../web/backend/publications/endpoints.py | 4 ++-- tests/web/conftest.py | 5 +++-- tests/web/endpoints/test_events.py | 2 +- 6 files changed, 15 insertions(+), 21 deletions(-) diff --git a/mobilizon_reshare/web/__init__.py b/mobilizon_reshare/web/__init__.py index 55e79f7..e69de29 100644 --- a/mobilizon_reshare/web/__init__.py +++ b/mobilizon_reshare/web/__init__.py @@ -1,10 +0,0 @@ -from typing import List - -from fastapi_pagination import paginate -from tortoise import Model - - -async def transform_and_paginate(model, model_list: List[Model]): - return paginate( - [await model.to_pydantic().from_tortoise_orm(x) for x in model_list] - ) diff --git a/mobilizon_reshare/web/backend/events/endpoints.py b/mobilizon_reshare/web/backend/events/endpoints.py index b63c710..3b0b49f 100644 --- a/mobilizon_reshare/web/backend/events/endpoints.py +++ b/mobilizon_reshare/web/backend/events/endpoints.py @@ -1,12 +1,10 @@ from fastapi_pagination import Page +from fastapi_pagination.ext.tortoise import paginate from mobilizon_reshare.models.event import Event -from mobilizon_reshare.storage.query.read import get_all_events -from mobilizon_reshare.web import transform_and_paginate def register_endpoints(app): @app.get("/events", status_code=200, response_model=Page[Event.to_pydantic()]) async def get_events(): - all_events = await get_all_events() - return await transform_and_paginate(Event, all_events) + return await paginate(Event, prefetch_related=True) diff --git a/mobilizon_reshare/web/backend/main.py b/mobilizon_reshare/web/backend/main.py index f056be8..65b15bb 100644 --- a/mobilizon_reshare/web/backend/main.py +++ b/mobilizon_reshare/web/backend/main.py @@ -30,10 +30,15 @@ def register_endpoints(app): register_publication_endpoints(app) +def init_endpoints(app): + + register_endpoints(app) + add_pagination(app) + + @app.on_event("startup") async def init_app(init_logging=True): check_database() await init_db(init_logging=init_logging) - register_endpoints(app) - add_pagination(app) + init_endpoints(app) return app diff --git a/mobilizon_reshare/web/backend/publications/endpoints.py b/mobilizon_reshare/web/backend/publications/endpoints.py index b5e56fe..987419c 100644 --- a/mobilizon_reshare/web/backend/publications/endpoints.py +++ b/mobilizon_reshare/web/backend/publications/endpoints.py @@ -1,7 +1,7 @@ from fastapi_pagination import Page +from fastapi_pagination.ext.tortoise import paginate from mobilizon_reshare.models.publication import Publication -from mobilizon_reshare.web import transform_and_paginate def register_endpoints(app): @@ -9,4 +9,4 @@ def register_endpoints(app): "/publications", status_code=200, response_model=Page[Publication.to_pydantic()] ) async def get_publications(): - return await transform_and_paginate(Publication, await Publication.all()) + return await paginate(Publication, prefetch_related=True) diff --git a/tests/web/conftest.py b/tests/web/conftest.py index c90cd18..0626099 100644 --- a/tests/web/conftest.py +++ b/tests/web/conftest.py @@ -3,7 +3,7 @@ import urllib3 from httpx import AsyncClient from mobilizon_reshare.storage import db -from mobilizon_reshare.web.backend.main import app, register_endpoints +from mobilizon_reshare.web.backend.main import app, init_endpoints @pytest.fixture(scope="session") @@ -13,7 +13,8 @@ def anyio_backend(): @pytest.fixture() async def client(): - register_endpoints(app) + init_endpoints(app) + async with AsyncClient(app=app, base_url="http://test") as client: yield client diff --git a/tests/web/endpoints/test_events.py b/tests/web/endpoints/test_events.py index e397041..20bc44e 100644 --- a/tests/web/endpoints/test_events.py +++ b/tests/web/endpoints/test_events.py @@ -14,4 +14,4 @@ async def test_events(client: AsyncClient, event_model_generator): response = await client.get("/events") assert response.status_code == 200 expected = await Event.to_pydantic().from_tortoise_orm(event) - assert response.json()[0] == json.loads(expected.json()) + assert response.json()["items"][0] == json.loads(expected.json())