RestResponseListener   A
last analyzed

Complexity

Total Complexity 9

Size/Duplication

Total Lines 59
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 8

Test Coverage

Coverage 92.86%

Importance

Changes 0
Metric Value
wmc 9
lcom 1
cbo 8
dl 0
loc 59
ccs 26
cts 28
cp 0.9286
rs 10
c 0
b 0
f 0

4 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 9 1
A onKernelView() 0 11 2
A createResponse() 0 12 2
A normalizeResult() 0 13 4
1
<?php
2
declare(strict_types=1);
3
4
namespace Paysera\Bundle\ApiBundle\Listener;
5
6
use Paysera\Bundle\ApiBundle\Entity\RestRequestOptions;
7
use Paysera\Bundle\ApiBundle\Service\ResponseBuilder;
8
use Paysera\Bundle\ApiBundle\Service\RestRequestHelper;
9
use Paysera\Component\Normalization\CoreNormalizer;
10
use Paysera\Component\Normalization\NormalizationContext;
11
use Symfony\Component\HttpFoundation\Request;
12
use Symfony\Component\HttpFoundation\Response;
13
use Symfony\Component\HttpKernel\Event\GetResponseForControllerResultEvent;
14
use Symfony\Component\HttpKernel\Event\ViewEvent;
15
16
/**
17
 * @internal
18
 */
19
class RestResponseListener
20
{
21
    private $coreNormalizer;
22
    private $requestHelper;
23
    private $responseBuilder;
24
25 20
    public function __construct(
26
        CoreNormalizer $coreNormalizer,
27
        RestRequestHelper $requestHelper,
28
        ResponseBuilder $responseBuilder
29
    ) {
30 20
        $this->coreNormalizer = $coreNormalizer;
31 20
        $this->requestHelper = $requestHelper;
32 20
        $this->responseBuilder = $responseBuilder;
33 20
    }
34
35
    /**
36
     * Both events are typecasted as one is deprecated from 4.3, but another not available before this version
37
     * @param GetResponseForControllerResultEvent|ViewEvent $event
38
     */
39 20
    public function onKernelView($event)
40
    {
41 20
        $request = $event->getRequest();
42 20
        if (!$this->requestHelper->isRestRequest($request)) {
43
            return;
44
        }
45
46 20
        $result = $event->getControllerResult();
47 20
        $response = $this->createResponse($request, $result);
48 18
        $event->setResponse($response);
49 18
    }
50
51 20
    private function createResponse(Request $request, $result): Response
52
    {
53 20
        if ($result === null) {
54
            return $this->responseBuilder->buildEmptyResponse();
55
        }
56
57 20
        $options = $this->requestHelper->getOptionsFromRequest($request);
58
59 20
        $normalizedResult = $this->normalizeResult($request, $options, $result);
60
61 18
        return $this->responseBuilder->buildResponse($normalizedResult);
62
    }
63
64 20
    private function normalizeResult(Request $request, RestRequestOptions $options, $result)
65
    {
66 20
        $includedFields = [];
67 20
        $fields = $request->query->get('fields');
68 20
        if ($fields !== null && is_string($fields) && $fields !== '') {
69 2
            $includedFields = explode(',', $fields);
70
        }
71
72 20
        $responseNormalizationType = $options->getResponseNormalizationType();
73 20
        $responseNormalizationGroup = $options->getResponseNormalizationGroup();
74 20
        $context = new NormalizationContext($this->coreNormalizer, $includedFields, $responseNormalizationGroup);
75 20
        return $this->coreNormalizer->normalize($result, $responseNormalizationType, $context);
76
    }
77
}
78