Completed
Push — master ( 3d8aa7...80558b )
by Timo
02:25
created

ArrayAdapter::getResponse()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 16
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 7
CRAP Score 3.0175

Importance

Changes 0
Metric Value
cc 3
eloc 7
nc 3
nop 1
dl 0
loc 16
ccs 7
cts 8
cp 0.875
crap 3.0175
rs 9.4285
c 0
b 0
f 0
1
<?php
2
3
namespace hamburgscleanest\GuzzleAdvancedThrottle\Cache\Adapters;
4
5
use DateInterval;
6
use DateTime;
7
use hamburgscleanest\GuzzleAdvancedThrottle\Cache\Helpers\RequestHelper;
8
use hamburgscleanest\GuzzleAdvancedThrottle\Cache\Interfaces\StorageInterface;
9
use hamburgscleanest\GuzzleAdvancedThrottle\RequestInfo;
10
use Psr\Http\Message\RequestInterface;
11
use Psr\Http\Message\ResponseInterface;
12
13
/**
14
 * Class ArrayAdapter
15
 * @package hamburgscleanest\GuzzleAdvancedThrottle\Cache\Adapters
16
 */
17
class ArrayAdapter implements StorageInterface
18
{
19
20
    /** @var string */
21
    private const STORAGE_KEY = 'requests';
22
    /** @var string */
23
    private const RESPONSE_KEY = 'response';
24
    /** @var string */
25
    private const EXPIRATION_KEY = 'expires_at';
26
27
    /** @var array */
28
    private $_storage = [];
29
30
    /**
31
     * @param string $host
32
     * @param string $key
33
     * @param int $requestCount
34
     * @param \DateTime $expiresAt
35
     * @param int $remainingSeconds
36
     */
37 11
    public function save(string $host, string $key, int $requestCount, DateTime $expiresAt, int $remainingSeconds) : void
38
    {
39 11
        $this->_storage[$host][$key] = RequestInfo::create($requestCount, $expiresAt->getTimestamp(), $remainingSeconds);
40 11
    }
41
42
    /**
43
     * @param string $host
44
     * @param string $key
45
     * @return RequestInfo|null
46
     */
47 17
    public function get(string $host, string $key) : ? RequestInfo
48
    {
49 17
        return $this->_storage[$host][$key] ?? null;
50
    }
51
52
    /**
53
     * @param RequestInterface $request
54
     * @param ResponseInterface $response
55
     * @param int $duration
56
     * @throws \Exception
57
     */
58 3
    public function saveResponse(RequestInterface $request, ResponseInterface $response, int $duration = 300) : void
59
    {
60 3
        [$host, $path] = RequestHelper::getHostAndPath($request);
61
62 3
        $this->_storage[self::STORAGE_KEY][$host][$path] = [
63 3
            self::RESPONSE_KEY   => $response,
64 3
            self::EXPIRATION_KEY => (new DateTime())->add(new DateInterval('PT' . $duration . 'M'))->getTimestamp()
65
        ];
66 3
    }
67
68
    /**
69
     * @param RequestInterface $request
70
     * @return ResponseInterface|null
71
     */
72 3
    public function getResponse(RequestInterface $request) : ? ResponseInterface
73
    {
74 3
        [$host, $path] = RequestHelper::getHostAndPath($request);
75
76 3
        $response = $this->_storage[self::STORAGE_KEY][$host][$path] ?? null;
77 3
        if ($response !== null)
78
        {
79 3
            if ($response[self::EXPIRATION_KEY] > \time())
80
            {
81 3
                return $response[self::RESPONSE_KEY];
82
            }
83
84
            $this->_invalidate($host, $path);
85
        }
86
87 1
        return null;
88
    }
89
90
    /**
91
     * @param string $host
92
     * @param string $path
93
     */
94
    private function _invalidate(string $host, string $path)
95
    {
96
        unset($this->_storage[self::STORAGE_KEY][$host][$path]);
97
    }
98
}