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