from aiohttp import web from apollo_utils.service.clients.aiohttp.utils.auth import check_authorization from apollo_utils.service.exceptions import APIError, BadGateway from asyncio import CancelledError from sentry_sdk import capture_exception from typing import Callable from server import config from server.utils.logger import logger @web.middleware async def error_middleware(request: web.Request, handler: Callable) -> web.Response: """Callback for handling exceptions.""" try: return await handler(request) except APIError as ex: if ex.status_code not in config.SENTRY_IGNORE_STATUS_CODES: capture_exception(ex) return web.json_response(data=ex.to_dict(), status=ex.status_code) except CancelledError: ex = BadGateway(detail="Request was cancelled.") return web.json_response(data=ex.to_dict(), status=ex.status_code) @web.middleware async def logging_middleware(request: web.Request, handler: Callable) -> web.Response: """Callback for logging requests.""" response = await handler(request) logger.info(f"[{response.status}] {request.method} {request.rel_url}") return response @web.middleware async def auth_middleware(request: web.Request, handler: Callable) -> web.Response: """Authenticate a user. Raises: Unauthorized: If authorization token is invalid or missing. """ check_authorization(request, api_key=config.AUTH_API_KEY, is_debug=config.DEBUG) return await handler(request)