"""Module for requests validation.""" from functools import wraps from typing import Any, Callable from flask import Request, Response from jsonschema import ValidationError, validate from owsresponse import response from owsresponse.adaptors.flask import flaskify from transcoding.constants import error as error_const def validate_body( request: Request, schema: dict[str, Any] ) -> Callable[[Callable[..., Response]], Callable[..., Response]]: """Decorate method for validation HTTP request body. Args: request (werkzeug.local.LocalProxy): Request object from the handler. schema (Draft4Validator): The JSON Draft4 Schema to validate against. Returns: callable: the wrapped function. """ def wrap( function: Callable[..., Response], ) -> Callable[..., Response]: @wraps(function) def wrapped_f(*args: Any, **kwargs: Any) -> Response: try: request_body = request.get_json(silent=True) or {} validate(request_body, schema) except ValidationError as error: return flaskify( response.create_error_response( code=error_const.ERROR_CODE_BODY_VALIDATION, message=str(error), status=400, ) ) return function(*args, **kwargs) return wrapped_f return wrap