Passed
Push — upgrade-to-connexion3 ( 370342...7c91eb )
by Juho
03:10
created

CustomRequestBodyValidator._validate()   B

Complexity

Conditions 6

Size

Total Lines 19
Code Lines 16

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 6
eloc 16
nop 2
dl 0
loc 19
rs 8.6666
c 0
b 0
f 0
1
"""Custom validator for the Annif API."""
2
3
from __future__ import annotations
4
5
import logging
6
from typing import Any
7
8
from connexion.exceptions import BadRequestProblem
9
from connexion.json_schema import format_error_with_path
10
from connexion.validators import JSONRequestBodyValidator
11
from jsonschema.exceptions import ValidationError
12
13
logger = logging.getLogger("openapi.validation")
14
15
16
class CustomRequestBodyValidator(JSONRequestBodyValidator):
17
    """Custom request body validator that overrides the default error message for the
18
    'maxItems' validator for the 'documents' property."""
19
20
    def __init__(self, *args, **kwargs) -> None:
21
        super().__init__(*args, **kwargs)
22
23
    def _validate(self, body: Any) -> dict | None:
24
        if not self._nullable and body is None:
25
            raise BadRequestProblem("Request body must not be empty")
26
        try:
27
            return self._validator.validate(body)
28
        except ValidationError as exception:
29
            # Prevent logging request body with contents of all documents
30
            if exception.validator == "maxItems" and list(exception.schema_path) == [
31
                "properties",
32
                "documents",
33
                "maxItems",
34
            ]:
35
                exception.message = "too many items"
36
            error_path_msg = format_error_with_path(exception=exception)
37
            logger.error(
38
                f"Validation error: {exception.message}{error_path_msg}",
39
                extra={"validator": "body"},
40
            )
41
            raise BadRequestProblem(detail=f"{exception.message}{error_path_msg}")
42