ResponseBuilder   A
last analyzed

Complexity

Total Complexity 11

Size/Duplication

Total Lines 53
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 1

Test Coverage

Coverage 94.44%

Importance

Changes 0
Metric Value
wmc 11
lcom 1
cbo 1
dl 0
loc 53
ccs 17
cts 18
cp 0.9444
rs 10
c 0
b 0
f 0

4 Methods

Rating   Name   Duplication   Size   Complexity  
A buildResponse() 0 8 3
A buildEmptyResponse() 0 4 1
A getDefaultHeaders() 0 7 1
B buildJsonResponse() 0 20 6
1
<?php
2
declare(strict_types=1);
3
4
namespace Paysera\Bundle\ApiBundle\Service;
5
6
use RuntimeException;
7
use Exception;
8
use InvalidArgumentException;
9
use Symfony\Component\HttpFoundation\Response;
10
11
/**
12
 * @internal
13
 */
14
class ResponseBuilder
15
{
16
    /**
17
     * Builds HTTP Response object by provided data
18
     *
19
     * @param mixed $data
20
     * @param int $statusCode
21
     * @return Response
22
     * @throws Exception
23
     */
24 58
    public function buildResponse($data, int $statusCode = Response::HTTP_OK): Response
25
    {
26 58
        if (!is_object($data) && !is_array($data)) {
27 1
            throw new RuntimeException('Provided data for JSON response must be an object or an array');
28
        }
29
30 57
        return $this->buildJsonResponse($data, $statusCode, $this->getDefaultHeaders());
31
    }
32
33 1
    public function buildEmptyResponse(): Response
34
    {
35 1
        return new Response('', Response::HTTP_NO_CONTENT, $this->getDefaultHeaders());
36
    }
37
38 58
    private function getDefaultHeaders()
39
    {
40
        return [
41 58
            'X-Frame-Options' => 'DENY',
42
            'Cache-Control' => 'must-revalidate, no-cache, no-store, private',
43
        ];
44
    }
45
46 57
    private function buildJsonResponse($data, int $statusCode, array $headers)
47
    {
48
        try {
49 57
            $content = json_encode($data, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
50 1
        } catch (Exception $exception) {
51
            if (
52 1
                get_class($exception) === 'Exception'
53 1
                && strpos($exception->getMessage(), 'Failed calling ') === 0
54
            ) {
55
                throw $exception->getPrevious() ?: $exception;
56
            }
57 1
            throw $exception;
58
        }
59
60 56
        if (JSON_ERROR_NONE !== json_last_error()) {
61 1
            throw new InvalidArgumentException(json_last_error_msg());
62
        }
63
64 55
        return new Response($content, $statusCode, ['Content-Type' => 'application/json'] + $headers);
65
    }
66
}
67