Failed Conditions
Push — ng ( 0fdecc...ff414d )
by Florent
03:42
created

RefreshTokenRepository::cacheObject()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 8
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 8
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 6
nc 1
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\Component\Core\Event\Event;
17
use OAuth2Framework\Component\Core\Event\EventStore;
18
use OAuth2Framework\Component\RefreshTokenGrant\RefreshToken;
19
use OAuth2Framework\Component\RefreshTokenGrant\RefreshTokenId;
20
use OAuth2Framework\Component\RefreshTokenGrant\RefreshTokenRepository as RefreshTokenRepositoryInterface;
21
use SimpleBus\Message\Bus\MessageBus;
22
use Symfony\Component\Cache\Adapter\AdapterInterface;
23
24
final class RefreshTokenRepository implements RefreshTokenRepositoryInterface
25
{
26
    /**
27
     * @var EventStore
28
     */
29
    private $eventStore;
30
31
    /**
32
     * @var MessageBus
33
     */
34
    private $eventBus;
35
36
    /**
37
     * @var AdapterInterface
38
     */
39
    private $cache;
40
41
    /**
42
     * RefreshTokenRepository constructor.
43
     *
44
     * @param EventStore       $eventStore
45
     * @param MessageBus       $eventBus
46
     * @param AdapterInterface $cache
47
     */
48
    public function __construct(EventStore $eventStore, MessageBus $eventBus, AdapterInterface $cache)
49
    {
50
        $this->eventStore = $eventStore;
51
        $this->eventBus = $eventBus;
52
        $this->cache = $cache;
53
    }
54
55
    /**
56
     * {@inheritdoc}
57
     */
58
    public function find(RefreshTokenId $refreshTokenId)
59
    {
60
        $refreshToken = $this->getFromCache($refreshTokenId);
61
        if (null === $refreshToken) {
62
            $events = $this->eventStore->findAllForDomainId($refreshTokenId);
63
            if (!empty($events)) {
64
                $refreshToken = $this->getFromEvents($events);
65
                $this->cacheObject($refreshToken);
66
            }
67
        }
68
69
        return $refreshToken;
70
    }
71
72
    /**
73
     * {@inheritdoc}
74
     */
75
    public function save(RefreshToken $refreshToken)
76
    {
77
        $events = $refreshToken->recordedMessages();
78
        foreach ($events as $event) {
79
            $this->eventStore->save($event);
80
            $this->eventBus->handle($event);
81
        }
82
        $refreshToken->eraseMessages();
83
        $this->cacheObject($refreshToken);
84
    }
85
86
    /**
87
     * @param Event[] $events
88
     *
89
     * @return RefreshToken
90
     */
91
    private function getFromEvents(array $events): RefreshToken
92
    {
93
        $refreshToken = RefreshToken::createEmpty();
94
        foreach ($events as $event) {
95
            $refreshToken = $refreshToken->apply($event);
96
        }
97
98
        return $refreshToken;
99
    }
100
101
    /**
102
     * @param RefreshTokenId $refreshTokenId
103
     *
104
     * @return RefreshToken|null
105
     */
106
    private function getFromCache(RefreshTokenId $refreshTokenId): ? RefreshToken
107
    {
108
        $itemKey = sprintf('oauth2-refresh_token-%s', $refreshTokenId->getValue());
109
        $item = $this->cache->getItem($itemKey);
110
        if ($item->isHit()) {
111
            return $item->get();
112
        }
113
114
        return null;
115
    }
116
117
    /**
118
     * @param RefreshToken $refreshToken
119
     */
120
    private function cacheObject(RefreshToken $refreshToken)
121
    {
122
        $itemKey = sprintf('oauth2-refresh_token-%s', $refreshToken->getTokenId()->getValue());
123
        $item = $this->cache->getItem($itemKey);
124
        $item->set($refreshToken);
125
        $item->tag(['oauth2_server', 'refresh_token', $itemKey]);
126
        $this->cache->save($item);
127
    }
128
}
129