ResponseBuilder::buildJsonResponse()   B
last analyzed

Complexity

Conditions 6
Paths 4

Size

Total Lines 20

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 9
CRAP Score 6.0359

Importance

Changes 0
Metric Value
dl 0
loc 20
ccs 9
cts 10
cp 0.9
rs 8.9777
c 0
b 0
f 0
cc 6
nc 4
nop 3
crap 6.0359
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