implemented events and publications endpoints

split endpoints by entity

removed credentials
This commit is contained in:
Simone Robutti 2022-11-29 13:43:42 +01:00
parent 4db474a8eb
commit 406fe5d9dd
15 changed files with 71 additions and 34 deletions

View File

@ -10,7 +10,7 @@ from mobilizon_reshare.event.event_selection_strategies import select_unpublishe
from mobilizon_reshare.storage.query.read import (
get_published_events,
events_with_status,
get_all_events,
get_all_mobilizon_events,
events_without_publications,
)
@ -51,7 +51,7 @@ async def list_events(
frm = Arrow.fromdatetime(frm) if frm else None
to = Arrow.fromdatetime(to) if to else None
if status is None:
events = await get_all_events(from_date=frm, to_date=to)
events = await get_all_mobilizon_events(from_date=frm, to_date=to)
elif status == EventPublicationStatus.WAITING:
events = await list_unpublished_events(frm=frm, to=to)
else:

View File

@ -0,0 +1,7 @@
from tortoise.contrib.pydantic import pydantic_model_creator
class WithPydantic:
@classmethod
def to_pydantic(cls):
return pydantic_model_creator(cls)

View File

@ -1,11 +1,12 @@
from tortoise import fields
from tortoise.models import Model
from mobilizon_reshare.models import WithPydantic
from mobilizon_reshare.models.publication import PublicationStatus, Publication
from mobilizon_reshare.models.publisher import Publisher
class Event(Model):
class Event(Model, WithPydantic):
id = fields.UUIDField(pk=True)
name = fields.TextField()
description = fields.TextField(null=True)

View File

@ -3,13 +3,15 @@ from enum import IntEnum
from tortoise import fields
from tortoise.models import Model
from mobilizon_reshare.models import WithPydantic
class PublicationStatus(IntEnum):
FAILED = 0
COMPLETED = 1
class Publication(Model):
class Publication(Model, WithPydantic):
id = fields.UUIDField(pk=True)
status = fields.IntEnumField(PublicationStatus)

View File

@ -65,8 +65,12 @@ class MoReDB:
logging.info("Updated database to latest version")
async def setup(self):
tortoise_config = get_tortoise_orm()
Tortoise.init_models(
tortoise_config["apps"]["models"]["models"], "models", _init_relations=True
)
await self._implement_db_changes()
await Tortoise.init(config=get_tortoise_orm(),)
await Tortoise.init(config=tortoise_config)
await Tortoise.generate_schemas()
await update_publishers(publisher_names)

View File

@ -70,15 +70,18 @@ async def get_all_publications(
)
async def get_all_events(
async def get_all_mobilizon_events(
from_date: Optional[Arrow] = None, to_date: Optional[Arrow] = None,
) -> list[MobilizonEvent]:
return [
event_from_model(event)
for event in await prefetch_event_relations(
_add_date_window(Event.all(), "begin_datetime", from_date, to_date)
)
]
return [event_from_model(event) for event in await get_all_events()]
async def get_all_events(
from_date: Optional[Arrow] = None, to_date: Optional[Arrow] = None
):
return await prefetch_event_relations(
_add_date_window(Event.all(), "begin_datetime", from_date, to_date)
)
async def get_all_publishers() -> list[Publisher]:

View File

@ -0,0 +1,9 @@
from mobilizon_reshare.models.event import Event
from mobilizon_reshare.storage.query.read import get_all_events
def register_endpoints(app):
@app.get("/events", status_code=200)
async def get_events():
all_events = await get_all_events()
return [await Event.to_pydantic().from_tortoise_orm(x) for x in all_events]

View File

@ -1,14 +1,16 @@
import logging
from fastapi import FastAPI
from tortoise.contrib.pydantic import pydantic_model_creator
from mobilizon_reshare.models.event import Event
from mobilizon_reshare.storage.db import init as init_db, get_db_url
from mobilizon_reshare.web.backend.events.endpoints import (
register_endpoints as register_event_endpoints,
)
from mobilizon_reshare.web.backend.publications.endpoints import (
register_endpoints as register_publication_endpoints,
)
app = FastAPI()
event_pydantic = pydantic_model_creator(Event)
logger = logging.getLogger(__name__)
@ -23,10 +25,9 @@ def check_database():
def register_endpoints(app):
@app.get("/events", status_code=200)
async def get_event():
return await event_pydantic.from_queryset(Event.all())
register_event_endpoints(app)
register_publication_endpoints(app)
@app.on_event("startup")

View File

@ -0,0 +1,7 @@
from mobilizon_reshare.models.publication import Publication
def register_endpoints(app):
@app.get("/publications", status_code=200)
async def get_publications():
return await Publication.to_pydantic().from_queryset(Publication.all())

View File

@ -3,7 +3,7 @@ from logging import DEBUG, INFO
import pytest
from mobilizon_reshare.storage.query.read import (
get_all_events,
get_all_mobilizon_events,
events_without_publications,
)
from tests.commands.conftest import (
@ -40,7 +40,7 @@ async def test_pull_no_event(
assert "Pulled 0 events from Mobilizon." in caplog.text
assert "There are now 0 unpublished events." in caplog.text
assert expected_result == await get_all_events()
assert expected_result == await get_all_mobilizon_events()
@pytest.mark.asyncio
@ -69,7 +69,7 @@ async def test_pull(
with caplog.at_level(DEBUG):
assert await pull() == expected_result
assert f"Pulled {len(elements)} events from Mobilizon." in caplog.text
assert expected_result == await get_all_events()
assert expected_result == await get_all_mobilizon_events()
assert (
f"There are now {len(expected_result)} unpublished events." in caplog.text
@ -112,7 +112,7 @@ async def test_pull_start(
with caplog.at_level(INFO):
assert await pull() == expected_pull
assert expected_pull == await get_all_events()
assert expected_pull == await get_all_mobilizon_events()
assert expected_pull == await events_without_publications()
report = await start(command_config)
@ -123,7 +123,9 @@ async def test_pull_start(
pull_ids = set(event.mobilizon_id for event in expected_pull)
publish_ids = {expected_publish.mobilizon_id}
assert pull_ids == set(event.mobilizon_id for event in await get_all_events())
assert pull_ids == set(
event.mobilizon_id for event in await get_all_mobilizon_events()
)
assert (pull_ids - publish_ids) == set(
event.mobilizon_id for event in await events_without_publications()
)
@ -188,8 +190,8 @@ async def test_multiple_pull(
with caplog.at_level(DEBUG):
assert await pull()
assert f"There are now {len(expected_first)} unpublished events." in caplog.text
assert expected_first == await get_all_events()
assert await events_without_publications() == await get_all_events()
assert expected_first == await get_all_mobilizon_events()
assert await events_without_publications() == await get_all_mobilizon_events()
# I clean the message collector
message_collector.data = []
@ -200,6 +202,6 @@ async def test_multiple_pull(
assert f"There are now {len(expected_last)} unpublished events." in caplog.text
assert set(event.mobilizon_id for event in expected_last) == set(
event.mobilizon_id for event in await get_all_events()
event.mobilizon_id for event in await get_all_mobilizon_events()
)
assert await events_without_publications() == await get_all_events()
assert await events_without_publications() == await get_all_mobilizon_events()

View File

@ -4,7 +4,7 @@ import pytest
from mobilizon_reshare.config.command import CommandConfig
from mobilizon_reshare.storage.query.converter import event_from_model, event_to_model
from mobilizon_reshare.storage.query.read import get_all_events
from mobilizon_reshare.storage.query.read import get_all_mobilizon_events
from tests.commands.conftest import simple_event_element, second_event_element
from mobilizon_reshare.event.event import EventPublicationStatus
from mobilizon_reshare.main.start import start
@ -222,7 +222,7 @@ async def test_start_second_execution(
"event_1|desc_1",
]
# I verify that the db event and the new event coming from mobilizon are both in the db
assert len(list(await get_all_events())) == 2
assert len(list(await get_all_mobilizon_events())) == 2
@pytest.mark.parametrize(

View File

@ -3,7 +3,7 @@ from uuid import UUID
import pytest
from mobilizon_reshare.storage.query.converter import event_to_model
from mobilizon_reshare.storage.query.read import get_all_events
from mobilizon_reshare.storage.query.read import get_all_mobilizon_events
@pytest.mark.asyncio
@ -14,4 +14,4 @@ async def test_get_all_events(event_generator):
for e in all_events:
await event_to_model(e).save()
assert list(await get_all_events()) == all_events
assert list(await get_all_mobilizon_events()) == all_events

View File

@ -3,7 +3,7 @@ import json
import pytest
from httpx import AsyncClient
from mobilizon_reshare.web.backend.main import event_pydantic
from mobilizon_reshare.models.event import Event
@pytest.mark.anyio
@ -13,4 +13,5 @@ async def test_events(client: AsyncClient, event_model_generator):
response = await client.get("/events")
assert response.status_code == 200
assert response.json()[0] == [json.loads(event_pydantic.from_orm(event).json())][0]
expected = await Event.to_pydantic().from_tortoise_orm(event)
assert response.json()[0] == json.loads(expected.json())