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:
parent
c0e35c4c3f
commit
a7afc8fa7b
|
@ -1,3 +1,4 @@
|
||||||
|
from .repository import JokeRepository
|
||||||
from .services import JokeService
|
from .services import JokeService
|
||||||
|
|
||||||
__all__ = ["JokeService"]
|
__all__ = ["JokeRepository", "JokeService"]
|
||||||
|
|
30
src/fastapi_app/lib/joke/repository.py
Normal file
30
src/fastapi_app/lib/joke/repository.py
Normal 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)
|
|
@ -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:
|
||||||
|
|
Loading…
Reference in New Issue
Block a user