Passed
Push — master ( 88da43...347e4e )
by Dominic
02:55
created

TokenManager::createRefreshToken()   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
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\Repositories\TokenRepository;
9
10
class TokenManager
11
{
12
	/**
13
	 * The token repository
14
	 *
15
	 * @var \tbclla\Revolut\Repositories\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\Repositories\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