1
0
mirror of https://github.com/ijaric/voice_assistant.git synced 2025-05-24 14:33:26 +00:00

build: joke repo & service

This commit is contained in:
Artem Litvinov 2023-10-02 20:08:07 +01:00
parent c0e35c4c3f
commit a7afc8fa7b
3 changed files with 45 additions and 7 deletions

View File

@ -1,3 +1,4 @@
from .repository import JokeRepository
from .services import JokeService from .services import JokeService
__all__ = ["JokeService"] __all__ = ["JokeRepository", "JokeService"]

View File

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

View File

@ -3,20 +3,27 @@ import logging
import httpx import httpx
import pydantic import pydantic
import lib.models.joke as joke_models import lib.joke.repository as joke_repository
import lib.models as models
class JokeService: class JokeService:
def __init__(self, http_client: httpx.AsyncClient): def __init__(self, repository: joke_repository.JokeRepository):
self.http_client = http_client self.repository = repository
self.logger = logging.getLogger(__name__) self.logger = logging.getLogger(__name__)
async def get_joke(self) -> joke_models.Joke | None: async def get_joke(self) -> models.Joke | None:
try: 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") response = await client.get("https://official-joke-api.appspot.com/random_joke")
content = response.json() 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: except pydantic.ValidationError as error:
self.logger.exception("Validation Error: %s", error) self.logger.exception("Validation Error: %s", error)
except httpx.HTTPError as error: except httpx.HTTPError as error: