Source code for aiomonitor.webui.utils

import json
from contextlib import asynccontextmanager as actxmgr
from typing import AsyncIterator, Type, TypeVar

from aiohttp import web
from pydantic import BaseModel, ValidationError


[docs] class APIParams(BaseModel): pass
T_APIParams = TypeVar("T_APIParams", bound=APIParams)
[docs] @actxmgr async def check_params( request: web.Request, model_class: Type[T_APIParams], ) -> AsyncIterator[T_APIParams]: try: if request.method in ("GET", "DELETE"): data = dict(request.query) else: body = await request.post() data = {k: str(v) for k, v in body.items()} params = model_class.model_validate(data) except ValidationError as e: error_messages = [] for error in e.errors(): field = ".".join(str(loc) for loc in error["loc"]) message = error["msg"] error_messages.append(f"{field}: {message}") detail = "\n".join(error_messages) raise web.HTTPBadRequest( content_type="application/json", body=json.dumps({"msg": "Invalid parameters", "detail": detail}), ) from None try: yield params except Exception as e: raise web.HTTPInternalServerError( content_type="application/json", body=json.dumps({"msg": "Internal server error", "detail": repr(e)}), ) from e