diff --git a/src/fastapi_app/lib/joke/__init__.py b/src/fastapi_app/lib/joke/__init__.py index c55dd0a..a26e7d9 100644 --- a/src/fastapi_app/lib/joke/__init__.py +++ b/src/fastapi_app/lib/joke/__init__.py @@ -1,3 +1,4 @@ +from .repository import JokeRepository from .services import JokeService -__all__ = ["JokeService"] +__all__ = ["JokeRepository", "JokeService"] diff --git a/src/fastapi_app/lib/joke/repository.py b/src/fastapi_app/lib/joke/repository.py new file mode 100644 index 0000000..dc11183 --- /dev/null +++ b/src/fastapi_app/lib/joke/repository.py @@ -0,0 +1,30 @@ +import logging + +import sqlalchemy.exc +import sqlalchemy.ext.asyncio as sa_asyncio + +import lib.models as models + + +class JokeRepository: + def __init__(self, async_session: sa_asyncio.async_sessionmaker[sa_asyncio.AsyncSession]): + self.async_session = async_session + self.logger = logging.getLogger(__name__) + + async def get_joke_by(self, id: int) -> models.JokeORM | None: + try: + async with self.async_session() as session: + joke = await session.get(models.JokeORM, id) + return joke + except sqlalchemy.exc.SQLAlchemyError as error: + self.logger.exception("Error: %s", error) + + async def add_joke(self, joke: models.JokeORM) -> models.JokeORM | None: + try: + async with self.async_session() as session: + session.add(joke) + await session.commit() + await session.refresh(joke) + return joke + except sqlalchemy.exc.SQLAlchemyError as error: + self.logger.exception("Error: %s", error) diff --git a/src/fastapi_app/lib/joke/services.py b/src/fastapi_app/lib/joke/services.py index e6aaa66..7569500 100644 --- a/src/fastapi_app/lib/joke/services.py +++ b/src/fastapi_app/lib/joke/services.py @@ -3,20 +3,27 @@ import logging import httpx import pydantic -import lib.models.joke as joke_models +import lib.joke.repository as joke_repository +import lib.models as models class JokeService: - def __init__(self, http_client: httpx.AsyncClient): - self.http_client = http_client + def __init__(self, repository: joke_repository.JokeRepository): + self.repository = repository self.logger = logging.getLogger(__name__) - async def get_joke(self) -> joke_models.Joke | None: + async def get_joke(self) -> models.Joke | None: try: - async with self.http_client as client: + async with httpx.AsyncClient() as client: response = await client.get("https://official-joke-api.appspot.com/random_joke") content = response.json() - return joke_models.Joke(**content) + self.logger.info("Joke retrieved from API") + formatted_joke = models.JokeORM( + type_field=content["type"], setup=content["setup"], punchline=content["punchline"] + ) + await self.repository.add_joke(formatted_joke) + self.logger.info("Joke added to database") + return models.Joke(**content) except pydantic.ValidationError as error: self.logger.exception("Validation Error: %s", error) except httpx.HTTPError as error: