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 89.29%

Importance

Changes 0
Metric Value
wmc 9
lcom 1
cbo 8
dl 0
loc 59
ccs 25
cts 28
cp 0.8929
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 Maba\Bundle\RestBundle\Listener;
5
6
use Maba\Bundle\RestBundle\Entity\RestRequestOptions;
7
use Maba\Bundle\RestBundle\Service\ResponseBuilder;
8
use Maba\Bundle\RestBundle\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 6
    public function __construct(
26
        CoreNormalizer $coreNormalizer,
27
        RestRequestHelper $requestHelper,
28
        ResponseBuilder $responseBuilder
29
    ) {
30 6
        $this->coreNormalizer = $coreNormalizer;
31 6
        $this->requestHelper = $requestHelper;
32 6
        $this->responseBuilder = $responseBuilder;
33 6
    }
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 6
    public function onKernelView($event)
40
    {
41 6
        $request = $event->getRequest();
42 6
        if (!$this->requestHelper->isRestRequest($request)) {
43
            return;
44
        }
45
46 6
        $result = $event->getControllerResult();
47 6
        $response = $this->createResponse($request, $result);
48 6
        $event->setResponse($response);
49 6
    }
50
51 6
    private function createResponse(Request $request, $result): Response
52
    {
53 6
        if ($result === null) {
54
            return $this->responseBuilder->buildEmptyResponse();
55
        }
56
57 6
        $options = $this->requestHelper->getOptionsFromRequest($request);
58
59 6
        $normalizedResult = $this->normalizeResult($request, $options, $result);
60
61 6
        return $this->responseBuilder->buildResponse($normalizedResult);
62
    }
63
64 6
    private function normalizeResult(Request $request, RestRequestOptions $options, $result)
65
    {
66 6
        $includedFields = [];
67 6
        $fields = $request->query->get('fields');
68 6
        if ($fields !== null && is_string($fields) && $fields !== '') {
69
            $includedFields = explode(',', $fields);
70
        }
71
72 6
        $responseNormalizationType = $options->getResponseNormalizationType();
73 6
        $responseNormalizationGroup = $options->getResponseNormalizationGroup();
74 6
        $context = new NormalizationContext($this->coreNormalizer, $includedFields, $responseNormalizationGroup);
75 6
        return $this->coreNormalizer->normalize($result, $responseNormalizationType, $context);
76
    }
77
}
78