49 lines
1.8 KiB
Python
49 lines
1.8 KiB
Python
import logging
|
|
from fastapi import FastAPI, Request, Response
|
|
from fastapi.responses import JSONResponse
|
|
from utils.meme_util import MemeUtil
|
|
|
|
|
|
class Meme(FastAPI):
|
|
"""
|
|
Misc Endpoints
|
|
"""
|
|
|
|
def __init__(self, app: FastAPI, my_util, constants) -> None:
|
|
self.app: FastAPI = app
|
|
self.util = my_util
|
|
self.meme_util = MemeUtil(constants)
|
|
self.constants = constants
|
|
self.endpoints: dict = {
|
|
"memes/get_meme/{id:path}": self.get_meme_by_id,
|
|
"memes/random": self.random_meme,
|
|
"memes/list_memes": self.list_memes,
|
|
}
|
|
|
|
for endpoint, handler in self.endpoints.items():
|
|
app.add_api_route(
|
|
f"/{endpoint}", handler, methods=["GET"], include_in_schema=True
|
|
)
|
|
|
|
async def get_meme_by_id(self, id: int, request: Request) -> Response:
|
|
"""Get meme (image) by id"""
|
|
meme_image = await self.meme_util.get_meme_by_id(id)
|
|
if not meme_image:
|
|
return Response(status_code=404, content="Not found")
|
|
return Response(content=meme_image, media_type="image/png")
|
|
|
|
async def random_meme(self, request: Request) -> Response:
|
|
"""Get random meme (image)"""
|
|
meme_image = await self.meme_util.get_random_meme()
|
|
if not meme_image:
|
|
return Response(status_code=404, content="Not found")
|
|
return Response(content=meme_image, media_type="image/png")
|
|
|
|
async def list_memes(self, page: int, request: Request) -> Response:
|
|
"""Get meme (image) by id"""
|
|
meme_list = await self.meme_util.list_memes(page)
|
|
page_count = await self.meme_util.get_page_count()
|
|
return JSONResponse(
|
|
content={"paging": {"current": page, "of": page_count}, "memes": meme_list}
|
|
)
|