Failed Conditions
Push — ng ( e90992...13fb6e )
by Florent
17:32
created

RefreshTokenRepository::find()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 13
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 13
rs 9.4285
c 0
b 0
f 0
cc 3
eloc 8
nc 3
nop 1
1
<?php
2
3
declare(strict_types=1);
4
5
/*
6
 * The MIT License (MIT)
7
 *
8
 * Copyright (c) 2014-2018 Spomky-Labs
9
 *
10
 * This software may be modified and distributed under the terms
11
 * of the MIT license.  See the LICENSE file for details.
12
 */
13
14
namespace OAuth2Framework\Bundle\Tests\TestBundle\Entity;
15
16
use OAuth2Framework\Bundle\Service\RandomIdGenerator;
17
use OAuth2Framework\Component\Core\Client\ClientId;
18
use OAuth2Framework\Component\Core\DataBag\DataBag;
19
use OAuth2Framework\Component\Core\Event\Event;
20
use OAuth2Framework\Component\Core\Event\EventStore;
21
use OAuth2Framework\Component\Core\ResourceOwner\ResourceOwnerId;
22
use OAuth2Framework\Component\Core\ResourceServer\ResourceServerId;
23
use OAuth2Framework\Component\RefreshTokenGrant\RefreshToken;
24
use OAuth2Framework\Component\RefreshTokenGrant\RefreshTokenId;
25
use SimpleBus\Message\Bus\MessageBus;
26
use Symfony\Component\Cache\Adapter\AdapterInterface;
27
28
final class RefreshTokenRepository implements \OAuth2Framework\Component\RefreshTokenGrant\RefreshTokenRepository
29
{
30
    /**
31
     * @var int
32
     */
33
    private $lifetime;
34
35
    /**
36
     * @var int
37
     */
38
    private $minLength;
39
40
    /**
41
     * @var int
42
     */
43
    private $maxLength;
44
45
    /**
46
     * @var EventStore
47
     */
48
    private $eventStore;
49
50
    /**
51
     * @var MessageBus
52
     */
53
    private $eventBus;
54
55
    /**
56
     * @var AdapterInterface
57
     */
58
    private $cache;
59
60
    /**
61
     * RefreshTokenRepository constructor.
62
     *
63
     * @param int              $minLength
64
     * @param int              $maxLength
65
     * @param int              $lifetime
66
     * @param EventStore       $eventStore
67
     * @param MessageBus       $eventBus
68
     * @param AdapterInterface $cache
69
     */
70
    public function __construct(int $minLength, int $maxLength, int $lifetime, EventStore $eventStore, MessageBus $eventBus, AdapterInterface $cache)
71
    {
72
        $this->minLength = $minLength;
73
        $this->maxLength = $maxLength;
74
        $this->lifetime = $lifetime;
75
        $this->eventStore = $eventStore;
76
        $this->eventBus = $eventBus;
77
        $this->cache = $cache;
78
    }
79
80
    /**
81
     * {@inheritdoc}
82
     */
83
    public function create(ResourceOwnerId $resourceOwnerId, ClientId $clientId, DataBag $parameters, DataBag $metadatas, ? ResourceServerId $resourceServerId): RefreshToken
84
    {
85
        $expiresAt = new \DateTimeImmutable(sprintf('now +%u seconds', $this->lifetime));
86
        $refreshTokenId = RefreshTokenId::create(RandomIdGenerator::generate($this->minLength, $this->maxLength));
87
        $refreshToken = RefreshToken::createEmpty();
88
        $refreshToken = $refreshToken->create($refreshTokenId, $resourceOwnerId, $clientId, $parameters, $metadatas, $expiresAt, $resourceServerId);
89
90
        return $refreshToken;
91
    }
92
93
    /**
94
     * {@inheritdoc}
95
     */
96
    public function find(RefreshTokenId $refreshTokenId)
97
    {
98
        $refreshToken = $this->getFromCache($refreshTokenId);
99
        if (null === $refreshToken) {
100
            $events = $this->eventStore->findAllForDomainId($refreshTokenId);
101
            if (!empty($events)) {
102
                $refreshToken = $this->getFromEvents($events);
103
                $this->cacheObject($refreshToken);
104
            }
105
        }
106
107
        return $refreshToken;
108
    }
109
110
    /**
111
     * {@inheritdoc}
112
     */
113
    public function save(RefreshToken $refreshToken)
114
    {
115
        $events = $refreshToken->recordedMessages();
116
        foreach ($events as $event) {
117
            $this->eventStore->save($event);
118
            $this->eventBus->handle($event);
119
        }
120
        $refreshToken->eraseMessages();
121
        $this->cacheObject($refreshToken);
122
    }
123
124
    /**
125
     * @param Event[] $events
126
     *
127
     * @return RefreshToken
128
     */
129
    private function getFromEvents(array $events): RefreshToken
130
    {
131
        $refreshToken = RefreshToken::createEmpty();
132
        foreach ($events as $event) {
133
            $refreshToken = $refreshToken->apply($event);
134
        }
135
136
        return $refreshToken;
137
    }
138
139
    /**
140
     * @param RefreshTokenId $refreshTokenId
141
     *
142
     * @return RefreshToken|null
143
     */
144
    private function getFromCache(RefreshTokenId $refreshTokenId): ? RefreshToken
145
    {
146
        $itemKey = sprintf('oauth2-refresh_token-%s', $refreshTokenId->getValue());
147
        $item = $this->cache->getItem($itemKey);
148
        if ($item->isHit()) {
149
            return $item->get();
150
        }
151
152
        return null;
153
    }
154
155
    /**
156
     * @param RefreshToken $refreshToken
157
     */
158
    private function cacheObject(RefreshToken $refreshToken)
159
    {
160
        $itemKey = sprintf('oauth2-refresh_token-%s', $refreshToken->getTokenId()->getValue());
161
        $item = $this->cache->getItem($itemKey);
162
        $item->set($refreshToken);
163
        $item->tag(['oauth2_server', 'refresh_token', $itemKey]);
164
        $this->cache->save($item);
165
    }
166
}
167