Source code for aiomonitor.webui.utils
import json
from abc import ABCMeta, abstractmethod
from contextlib import asynccontextmanager as actxmgr
from typing import AsyncIterator, Type, TypeVar
import trafaret as t
from aiohttp import web
[docs]
class APIParams(metaclass=ABCMeta):
[docs]
@classmethod
@abstractmethod
def get_checker(cls) -> t.Trafaret:
raise NotImplementedError
[docs]
@classmethod
def check(cls, value):
checker = cls.get_checker()
data = checker.check(value)
return cls(**data) # assumes dataclass-like init with kwargs
T_APIParams = TypeVar("T_APIParams", bound=APIParams)
[docs]
@actxmgr
async def check_params(
request: web.Request,
checker: Type[T_APIParams],
) -> AsyncIterator[T_APIParams]:
try:
if request.method in ("GET", "DELETE"):
params = checker.check(request.query)
else:
body = await request.post()
params = checker.check(body)
yield params
except t.DataError as e:
error_data = e.as_dict()
if isinstance(error_data, str):
detail = error_data
else:
detail = "\n".join(v for v in error_data.values())
raise web.HTTPBadRequest(
content_type="application/json",
body=json.dumps({"msg": "Invalid parameters", "detail": detail}),
) from None
except Exception as e:
raise web.HTTPInternalServerError(
content_type="application/json",
body=json.dumps({"msg": "Internal server error", "detail": repr(e)}),
) from e