Test Setup Failed
Push — master ( f60f99...a79e53 )
by Daniel
02:49
created

MethodValidator   A

Complexity

Total Complexity 6

Size/Duplication

Total Lines 66
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 26
c 1
b 0
f 0
dl 0
loc 66
ccs 34
cts 34
cp 1
rs 10
wmc 6
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Usox\JsonSchemaApi\Dispatch;
6
7
use Opis\JsonSchema\Errors\ErrorFormatter;
8
use Opis\JsonSchema\Helper;
9
use Opis\JsonSchema\Validator;
10
use stdClass;
11
use Teapot\StatusCode\Http;
12
use Usox\JsonSchemaApi\Exception\RequestMalformedException;
13
use Usox\JsonSchemaApi\Exception\ResponseMalformedException;
14
15
/**
16
 * Validates input and output against the json schema to ensure valid requests/responses
17
 */
18
final readonly class MethodValidator implements MethodValidatorInterface
0 ignored issues
show
Bug introduced by
A parse error occurred: Syntax error, unexpected T_READONLY, expecting T_CLASS on line 18 at column 6
Loading history...
19
{
20 6
    public function __construct(
21
        private Validator $schemaValidator,
22
        private ErrorFormatter $errorFormatter
23
    ) {
24 6
    }
25
26
    /**
27
     * @throws RequestMalformedException
28
     */
29 2
    public function validateInput(
30
        stdClass $methodSchemaContent,
31
        stdClass $input
32
    ): void {
33
        // Validate the input parameter against the parameter definition in method schema
34 2
        $validationResult = $this->schemaValidator->validate(
35 2
            $input->parameter,
36 2
            $methodSchemaContent->properties->parameter
37 2
        );
38
39
        // Throw exception if the input does not validate against the basic request schema
40 2
        if (!$validationResult->isValid()) {
41 1
            throw new RequestMalformedException(
42 1
                'Bad Request',
43 1
                Http::BAD_REQUEST
44 1
            );
45
        }
46
    }
47
48
    /**
49
     * @param array<mixed> $output
50
     *
51
     * @throws ResponseMalformedException
52
     */
53 2
    public function validateOutput(
54
        stdClass $methodSchemaContent,
55
        array $output
56
    ): void {
57 2
        if (property_exists($methodSchemaContent->properties, 'response')) {
58 2
            $data = new stdClass();
59 2
            $data->data = Helper::toJSON($output);
60
61
            // Wrap the response schema
62 2
            $response = (object) [
63 2
                'type' => 'object',
64 2
                'properties' => (object) [
65 2
                    'data' => $methodSchemaContent->properties->response,
66 2
                ],
67 2
                'required' => ['data']
68 2
            ];
69
70
            // Validate the response against the response definition in method schema
71 2
            $validationResult = $this->schemaValidator->validate(
72 2
                $data,
73 2
                $response
74 2
            );
75
76 2
            $error = $validationResult->error();
77
            // Throw exception if the input does not validate against the basic request schema
78 2
            if ($error !== null) {
79 1
                throw new ResponseMalformedException(
80 1
                    'Internal Server Error',
81 1
                    Http::INTERNAL_SERVER_ERROR,
82 1
                    null,
83 1
                    $this->errorFormatter->format($error)
84 1
                );
85
            }
86
        }
87
    }
88
}
89