RefreshTokenStorage::getValidRefreshToken()   A
last analyzed

Complexity

Conditions 4
Paths 2

Size

Total Lines 16
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 11
CRAP Score 4

Importance

Changes 0
Metric Value
cc 4
eloc 11
nc 2
nop 1
dl 0
loc 16
ccs 11
cts 11
cp 1
crap 4
rs 9.9
c 0
b 0
f 0
1
<?php
2
3
namespace kalanis\OAuth2\Storage\NDB;
4
5
6
use DateTime;
7
use kalanis\OAuth2\Storage\RefreshTokens\IRefreshToken;
8
use kalanis\OAuth2\Storage\RefreshTokens\IRefreshTokenStorage;
9
use kalanis\OAuth2\Storage\RefreshTokens\RefreshToken;
10
use Nette\Database\Explorer;
11
use Nette\Database\SqlLiteral;
12
use Nette\Database\Table\ActiveRow;
13
use Nette\Database\Table\Selection;
14
15
16
/**
17
 * Nette database RefreshToken storage
18
 * @package kalanis\OAuth2\Storage\NDB
19
 */
20 1
class RefreshTokenStorage implements IRefreshTokenStorage
21
{
22 1
    public function __construct(
23
        private readonly Explorer $context,
24
    )
25
    {
26 1
    }
27
28
    /**
29
     * Store refresh token
30
     */
31
    public function store(IRefreshToken $refreshToken): void
32
    {
33 1
        $this->getTable()->insert([
34 1
            'refresh_token' => $refreshToken->getRefreshToken(),
35 1
            'client_id' => $refreshToken->getClientId(),
36 1
            'user_id' => $refreshToken->getUserId(),
37 1
            'expires_at' => $refreshToken->getExpires(),
38
        ]);
39 1
    }
40
41
    /**
42
     * Get authorization code table
43
     * @return Selection<ActiveRow>
44
     */
45
    protected function getTable(): Selection
46
    {
47 1
        return $this->context->table('oauth_refresh_token');
48
    }
49
50
    /**
51
     * Remove refresh token
52
     * @param string $token
53
     */
54
    public function remove(string $token): void
55
    {
56 1
        $this->getTable()->where(['refresh_token' => $token])->delete();
57 1
    }
58
59
    /**
60
     * Get valid refresh token
61
     * @param string $refreshToken
62
     * @return IRefreshToken|null
63
     */
64
    public function getValidRefreshToken(string $refreshToken): ?IRefreshToken
65
    {
66 1
        $row = $this->getTable()
67 1
            ->where(['refresh_token' => $refreshToken])
68 1
            ->where(new SqlLiteral('TIMEDIFF(expires_at, NOW()) >= 0'))
69 1
            ->fetch();
70
71 1
        if (!$row) {
72 1
            return null;
73
        }
74
75 1
        return new RefreshToken(
76 1
            strval($row['refresh_token']),
77 1
            new DateTime(strval($row['expires_at'])),
78 1
            is_numeric($row['client_id'])? intval($row['client_id']) : strval($row['client_id']),
79 1
            is_null($row['user_id']) ? null : strval($row['user_id']),
80
        );
81
    }
82
}
83