TokenManager::getAccessToken()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 2
c 1
b 0
f 0
nc 1
nop 0
dl 0
loc 5
rs 10
1
<?php
2
3
namespace tbclla\Revolut\Auth;
4
5
use tbclla\Revolut\Auth\Requests\AccessTokenRequest;
6
use tbclla\Revolut\Exceptions\AppUnauthorizedException;
7
use tbclla\Revolut\Interfaces\GrantsAccessTokens;
8
use tbclla\Revolut\Interfaces\TokenRepository;
9
10
class TokenManager
11
{
12
    /**
13
     * The token repository
14
     *
15
     * @var \tbclla\Revolut\Interfaces\TokenRepository
16
     */
17
    private $tokenRepository;
18
19
    /**
20
     * The access token request
21
     *
22
     * @var \tbclla\Revolut\Auth\Requests\AccessTokenRequest
23
     */
24
    private $accessTokenRequest;
25
26
    /**
27
     * Create a token manager
28
     *
29
     * @param \tbclla\Revolut\Interfaces\TokenRepository $tokenRepository
30
     * @param \tbclla\Revolut\Auth\Requests\AccessTokenRequest $accessTokenRequest
31
     * @return void
32
     */
33
    public function __construct(TokenRepository $tokenRepository, AccessTokenRequest $accessTokenRequest)
34
    {
35
        $this->tokenRepository = $tokenRepository;
36
        $this->accessTokenRequest = $accessTokenRequest;
37
    }
38
39
    /**
40
     * Get an access token from the repository,
41
     * or request a new access token
42
     *
43
     * @return \tbclla\Revolut\Auth\AccessToken
44
     */
45
    public function getAccessToken()
46
    {
47
        $accessToken = $this->tokenRepository->getAccessToken();
48
49
        return $accessToken ?? $this->refreshAccessToken();
50
    }
51
52
    /**
53
     * Get a refresh token from the repository
54
     *
55
     * @return \tbclla\Revolut\Auth\RefreshToken|null
56
     */
57
    public function getRefreshToken()
58
    {
59
        return $this->tokenRepository->getRefreshToken();
60
    }
61
62
    /**
63
     * Store a new access token
64
     *
65
     * @param string $value
66
     * @return \tbclla\Revolut\Auth\AccessToken
67
     */
68
    public function createAccessToken(string $value)
69
    {
70
        return $this->tokenRepository->createAccessToken($value);
71
    }
72
73
    /**
74
     * Store a new refresh token
75
     *
76
     * @param string $value
77
     * @return \tbclla\Revolut\Auth\RefreshToken
78
     */
79
    public function createRefreshToken(string $value)
80
    {
81
        return $this->tokenRepository->createRefreshToken($value);
82
    }
83
84
    /**
85
     * Exchange a refresh token for a new access token
86
     *
87
     * @return \tbclla\Revolut\Auth\AccessToken
88
     * @throws \tbclla\Revolut\Exceptions\AppUnauthorizedException
89
     */
90
    public function refreshAccessToken()
91
    {
92
        if (!$refreshToken = $this->getRefreshToken()) {
93
            throw new AppUnauthorizedException('No refresh token found. Re-authorization required.');
94
        }
95
96
        return $this->requestAccessToken($refreshToken);
97
    }
98
99
    /**
100
     * Request a new access token
101
     *
102
     * @param \tbclla\Revolut\Interfaces\GrantsAccessTokens $token
103
     * @return \tbclla\Revolut\Auth\AccessToken
104
     */
105
    public function requestAccessToken(GrantsAccessTokens $token)
106
    {
107
        $response = $this->accessTokenRequest->exchange($token);
108
109
        if (isset($response['refresh_token'])) {
110
            $this->createRefreshToken($response['refresh_token']);
111
        }
112
113
        return $this->createAccessToken($response['access_token']);
114
    }
115
}
116