Test Setup Failed
Push — dev ( b27119...389162 )
by Herberto
04:46
created

OauthAccessTokenRepository::getNewToken()   A

Complexity

Conditions 2
Paths 1

Size

Total Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 9
rs 9.9666
c 0
b 0
f 0
cc 2
nc 1
nop 3
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Acme\App\Infrastructure\Auth\Authentication\Oauth;
6
7
use Acme\App\Core\Port\Persistence\DQL\DqlQueryBuilderInterface;
8
use Acme\App\Core\Port\Persistence\Exception\EmptyQueryResultException;
9
use Acme\App\Core\Port\Persistence\PersistenceServiceInterface;
10
use Acme\App\Core\Port\Persistence\QueryServiceRouterInterface;
11
use Acme\App\Core\SharedKernel\Component\User\Domain\User\UserId;
12
use League\OAuth2\Server\Entities\AccessTokenEntityInterface;
13
use League\OAuth2\Server\Entities\ClientEntityInterface;
14
use League\OAuth2\Server\Entities\ScopeEntityInterface;
15
use League\OAuth2\Server\Repositories\AccessTokenRepositoryInterface;
16
use function is_string;
17
18
final class OauthAccessTokenRepository implements AccessTokenRepositoryInterface
19
{
20
    /**
21
     * @var DqlQueryBuilderInterface
22
     */
23
    private $dqlQueryBuilder;
24
25
    /**
26
     * @var QueryServiceRouterInterface
27
     */
28
    private $queryService;
29
30
    /**
31
     * @var PersistenceServiceInterface
32
     */
33
    private $persistenceService;
34
35
    public function __construct(
36
        DqlQueryBuilderInterface $dqlQueryBuilder,
37
        QueryServiceRouterInterface $queryService,
38
        PersistenceServiceInterface $persistenceService
39
    ) {
40
        $this->dqlQueryBuilder = $dqlQueryBuilder;
41
        $this->queryService = $queryService;
42
        $this->persistenceService = $persistenceService;
43
    }
44
45
    /**
46
     * @param ScopeEntityInterface[] $scopes
47
     * @param UserId $userIdentifier
48
     */
49
    public function getNewToken(
50
        ClientEntityInterface $clientEntity,
51
        array $scopes,
52
        $userIdentifier = null
53
    ): AccessTokenEntityInterface {
54
        return new OauthAccessToken(
55
            is_string($userIdentifier) ? new UserId($userIdentifier) : $userIdentifier, $clientEntity, $scopes
56
        );
57
    }
58
59
    public function persistNewAccessToken(AccessTokenEntityInterface $oauthAccessToken): void
60
    {
61
        $this->persistenceService->upsert($oauthAccessToken);
62
    }
63
64
    /**
65
     * @param string $tokenId
66
     */
67
    public function revokeAccessToken($tokenId): void
68
    {
69
        try {
70
            $oauthAccessToken = $this->find($tokenId);
71
        } catch (EmptyQueryResultException $e) {
72
            return;
73
        }
74
75
        $oauthAccessToken->revoke();
76
        $this->persistenceService->upsert($oauthAccessToken);
77
    }
78
79
    /**
80
     * @param string $tokenId
81
     */
82
    public function isAccessTokenRevoked($tokenId): ?bool
83
    {
84
        try {
85
            return $this->find($tokenId)->isRevoked();
86
        } catch (EmptyQueryResultException $e) {
87
            return true;
88
        }
89
    }
90
91
    private function find(string $tokenId): OauthAccessToken
92
    {
93
        $dqlQuery = $this->dqlQueryBuilder->create(OauthAccessToken::class)
94
            ->where('OauthAccessToken.identifier = :identifier')
95
            ->setParameter('identifier', $tokenId)
96
            ->build();
97
98
        return $this->queryService->query($dqlQuery)->getSingleResult();
99
    }
100
}
101