mirror of
https://github.com/ijaric/voice_assistant.git
synced 2025-05-24 14:33:26 +00:00
build: wip: joke example
This commit is contained in:
parent
9888f0e993
commit
bf7807899c
|
@ -1,5 +1,6 @@
|
||||||
from .health import *
|
from .health import *
|
||||||
|
from .joke import get_joke, joke_router
|
||||||
|
|
||||||
__all__ = [
|
__all__ = [
|
||||||
"basic_router",
|
"basic_router", "joke_router", "get_joke"
|
||||||
]
|
]
|
||||||
|
|
22
src/fastapi_app/lib/api/v1/handlers/joke.py
Normal file
22
src/fastapi_app/lib/api/v1/handlers/joke.py
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
import fastapi
|
||||||
|
|
||||||
|
import lib.api.v1.schemas as api_shemas
|
||||||
|
import lib.joke.services as services
|
||||||
|
|
||||||
|
joke_router = fastapi.APIRouter()
|
||||||
|
|
||||||
|
|
||||||
|
@joke_router.get(
|
||||||
|
"/",
|
||||||
|
response_model=api_shemas.JokeResponse,
|
||||||
|
summary="Random joke",
|
||||||
|
description="Return a random joke from a free API.",
|
||||||
|
)
|
||||||
|
async def get_joke(joke_service: services.JokeService):
|
||||||
|
joke = await joke_service.get_joke()
|
||||||
|
if joke:
|
||||||
|
return api_shemas.JokeResponse(
|
||||||
|
joke=f"{joke.setup}\n{joke.punchline}", id=joke.id_field, category=joke.type_field
|
||||||
|
)
|
||||||
|
|
||||||
|
return api_shemas.JokeResponse(joke="No joke for you!", id=0, category="No category")
|
|
@ -1,5 +1,4 @@
|
||||||
from .base import HealthResponseModel
|
from .base import HealthResponseModel
|
||||||
|
from .joke import JokeResponse
|
||||||
|
|
||||||
__all__ = [
|
__all__ = ["HealthResponseModel", "JokeResponse"]
|
||||||
"HealthResponseModel",
|
|
||||||
]
|
|
||||||
|
|
7
src/fastapi_app/lib/api/v1/schemas/joke.py
Normal file
7
src/fastapi_app/lib/api/v1/schemas/joke.py
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
import pydantic
|
||||||
|
|
||||||
|
|
||||||
|
class JokeResponse(pydantic.BaseModel):
|
||||||
|
id_field: int = pydantic.Field(alias="id")
|
||||||
|
joke: str
|
||||||
|
category: str
|
|
@ -11,6 +11,7 @@ import lib.app.errors as app_errors
|
||||||
import lib.app.settings as app_settings
|
import lib.app.settings as app_settings
|
||||||
import lib.app.split_settings as app_split_settings
|
import lib.app.split_settings as app_split_settings
|
||||||
import lib.clients as clients
|
import lib.clients as clients
|
||||||
|
import lib.joke.services as joke_services
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
@ -69,12 +70,13 @@ class Application:
|
||||||
# Services
|
# Services
|
||||||
|
|
||||||
logger.info("Initializing services")
|
logger.info("Initializing services")
|
||||||
|
jk_serivces = joke_services.JokeService(http_client=http_client)
|
||||||
|
|
||||||
# Handlers
|
# Handlers
|
||||||
|
|
||||||
logger.info("Initializing handlers")
|
logger.info("Initializing handlers")
|
||||||
liveness_probe_handler = api_v1_handlers.basic_router
|
liveness_probe_handler = api_v1_handlers.basic_router
|
||||||
|
joke_handler = api_v1_handlers.get_joke(joke_service=jk_serivces)
|
||||||
|
|
||||||
logger.info("Creating application")
|
logger.info("Creating application")
|
||||||
|
|
||||||
|
|
3
src/fastapi_app/lib/joke/__init__.py
Normal file
3
src/fastapi_app/lib/joke/__init__.py
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
from .services import JokeService
|
||||||
|
|
||||||
|
__all__ = ["JokeService"]
|
23
src/fastapi_app/lib/joke/services.py
Normal file
23
src/fastapi_app/lib/joke/services.py
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
import logging
|
||||||
|
|
||||||
|
import httpx
|
||||||
|
import pydantic
|
||||||
|
|
||||||
|
import lib.models.joke as joke_models
|
||||||
|
|
||||||
|
|
||||||
|
class JokeService:
|
||||||
|
def __init__(self, http_client: httpx.AsyncClient):
|
||||||
|
self.http_client = http_client
|
||||||
|
self.logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
async def get_joke(self) -> joke_models.Joke | None:
|
||||||
|
try:
|
||||||
|
async with self.http_client as client:
|
||||||
|
response = await client.get("https://official-joke-api.appspot.com/random_joke")
|
||||||
|
content = response.json()
|
||||||
|
return joke_models.Joke(**content)
|
||||||
|
except pydantic.ValidationError as error:
|
||||||
|
self.logger.exception("Validation Error: %s", error)
|
||||||
|
except httpx.HTTPError as error:
|
||||||
|
self.logger.exception("HTTP Error: %s", error)
|
10
src/fastapi_app/lib/models/joke.py
Normal file
10
src/fastapi_app/lib/models/joke.py
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
import pydantic
|
||||||
|
|
||||||
|
|
||||||
|
class Joke(pydantic.BaseModel):
|
||||||
|
"""Joke model."""
|
||||||
|
|
||||||
|
id_field: int = pydantic.Field(alias="id")
|
||||||
|
type_field: str = pydantic.Field(alias="type")
|
||||||
|
setup: str
|
||||||
|
punchline: str
|
Loading…
Reference in New Issue
Block a user