Passed
Push — master ( 1d5d1c...1894e2 )
by Siim
26:48 queued 11:50
created

AbstractRequest::setRequest()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 1
nc 1
nop 1
dl 0
loc 3
rs 10
c 0
b 0
f 0
1
<?php
2
/**
3
 * Created by PhpStorm.
4
 * User: siim
5
 * Date: 17.01.19
6
 * Time: 8:03
7
 */
8
9
namespace Sf4\Api\Request;
10
11
use Sf4\Api\Dto\DtoInterface;
12
use Sf4\Api\Dto\Traits\DtoTrait;
13
use Sf4\Api\RequestHandler\RequestHandlerTrait;
14
use Sf4\Api\Response\ResponseInterface;
15
use Sf4\Api\Response\ResponseTrait;
16
use Symfony\Component\HttpFoundation\JsonResponse;
17
use Symfony\Component\HttpFoundation\Request;
18
19
abstract class AbstractRequest implements RequestInterface
20
{
21
22
    use ResponseTrait;
23
    use DtoTrait;
24
    use RequestHandlerTrait;
25
26
    /** @var Request|null $request */
27
    protected $request;
28
29
    /**
30
     * AbstractRequest constructor.
31
     * @param ResponseInterface $response
32
     * @param DtoInterface $dto
33
     */
34
    public function init(ResponseInterface $response, DtoInterface $dto = null)
35
    {
36
        $response->setRequest($this);
37
        $this->setResponse($response);
38
        if ($dto) {
39
            $this->setDto($dto);
40
            $this->attachDtoToResponse();
41
        }
42
    }
43
44
    protected function attachDtoToResponse()
45
    {
46
        $response = $this->getResponse();
47
        $dto = $this->getDto();
48
        if ($response !== null && $response->getDto() === null && $dto !== null) {
49
            $response->setDto($dto);
50
        }
51
    }
52
53
    /**
54
     * @param \Closure $closure
55
     * @param string|null $cacheKey
56
     * @throws \Psr\Cache\InvalidArgumentException
57
     */
58
    public function getCachedResponse(\Closure $closure, string $cacheKey = null)
59
    {
60
        if ($cacheKey) {
61
            $cacheKey = md5($cacheKey);
62
            $cacheAdapter = $this->getRequestHandler()->getCacheAdapter();
63
            $cacheItem = $cacheAdapter->getItem($cacheKey);
64
            if ($cacheItem->isHit()) {
65
                /*
66
                 * Return cached response
67
                 */
68
                $responseContent = json_decode($cacheItem->get(), true);
69
                $this->getResponse()->setJsonResponse(
70
                    new JsonResponse(
71
                        $responseContent,
72
                        $this->getResponse()->getResponseStatus(),
73
                        $this->getResponse()->getResponseHeaders()
74
                    )
75
                );
76
            } else {
77
                /*
78
                 * Handle request and add response to cache
79
                 */
80
                $closure();
81
                $responseContent = $this->getRequestHandler()->getResponse()->getContent();
82
                if ($responseContent) {
83
                    $cacheItem->set($responseContent);
84
                    $cacheItem->expiresAfter(0);
85
                    $cacheAdapter->save($cacheItem);
86
                }
87
            }
88
        } else {
89
            /*
90
             * Handle request
91
             */
92
            $closure();
93
        }
94
    }
95
96
    /**
97
     * @throws \Psr\Cache\InvalidArgumentException
98
     */
99
    public function handle()
100
    {
101
        $this->getCachedResponse(function () {
102
            $requestContent = $this->getRequest()->getContent();
103
            if ($requestContent) {
104
                $data = json_decode($requestContent, true);
105
                $this->getDto()->populate($data);
106
            }
107
            $this->getResponse()->init();
108
        });
109
    }
110
111
    /**
112
     * @return Request|null
113
     */
114
    public function getRequest(): ?Request
115
    {
116
        return $this->request;
117
    }
118
119
    /**
120
     * @param Request|null $request
121
     */
122
    public function setRequest(?Request $request): void
123
    {
124
        $this->request = $request;
125
    }
126
127
    /**
128
     * @return string
129
     */
130
    public function getRoute(): string
131
    {
132
        return static::ROUTE;
133
    }
134
}
135