Failed Conditions
Push — master ( c6baf0...a3629e )
by Florent
16:19
created

AuthorizationCode::create()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 20

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 20
rs 9.6
c 0
b 0
f 0
cc 1
nc 1
nop 9

2 Methods

Rating   Name   Duplication   Size   Complexity  
A AuthorizationCode::getQueryParam() 0 8 2
A AuthorizationCode::hasQueryParam() 0 4 1

How to fix   Many Parameters   

Many Parameters

Methods with many parameters are not only hard to understand, but their parameters also often become inconsistent when you need more, or different data.

There are several approaches to avoid long parameter lists:

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\Component\AuthorizationCodeGrant;
15
16
use OAuth2Framework\Component\AuthorizationCodeGrant\Event as AuthorizationCodeEvent;
17
use OAuth2Framework\Component\Core\Client\ClientId;
18
use OAuth2Framework\Component\Core\DataBag\DataBag;
19
use OAuth2Framework\Component\Core\Event\Event;
20
use OAuth2Framework\Component\Core\ResourceServer\ResourceServerId;
21
use OAuth2Framework\Component\Core\Token\Token;
22
use OAuth2Framework\Component\Core\Token\TokenId;
23
use OAuth2Framework\Component\Core\UserAccount\UserAccountId;
24
25
class AuthorizationCode extends Token
26
{
27
    private $queryParameters;
28
    private $redirectUri;
29
    private $used;
30
31
    public function __construct(AuthorizationCodeId $authorizationCodeId, ClientId $clientId, UserAccountId $userAccountId, array $queryParameters, string $redirectUri, \DateTimeImmutable $expiresAt, DataBag $parameter, DataBag $metadata, ?ResourceServerId $resourceServerId)
32
    {
33
        parent::__construct($authorizationCodeId, $clientId, $userAccountId, $parameter, $metadata, $expiresAt, $resourceServerId);
34
        $this->queryParameters = $queryParameters;
35
        $this->redirectUri = $redirectUri;
36
        $this->used = false;
37
    }
38
39
    /**
40
     * {@inheritdoc}
41
     */
42
    public static function getSchema(): string
43
    {
44
        return 'https://oauth2-framework.spomky-labs.com/schemas/model/authorization-code/1.0/schema';
45
    }
46
47
    public function setTokenId(TokenId $tokenId): void
48
    {
49
        if (!$tokenId instanceof AuthorizationCodeId) {
50
            throw new \RuntimeException('The token ID must be an Authorization Code ID.');
51
        }
52
        parent::setTokenId($tokenId);
53
    }
54
55
    public function getQueryParameters(): array
56
    {
57
        return $this->queryParameters;
58
    }
59
60
    public function setQueryParameters(array $queryParameters): void
61
    {
62
        $this->queryParameters = $queryParameters;
63
    }
64
65
    public function isUsed(): bool
66
    {
67
        return $this->used;
68
    }
69
70
    public function markAsUsed(): void
71
    {
72
        $this->used = true;
73
    }
74
75
    public function getQueryParams(): array
76
    {
77
        return $this->queryParameters;
78
    }
79
80
    public function getQueryParam(string $key)
0 ignored issues
show
Documentation introduced by
The return type could not be reliably inferred; please add a @return annotation.

Our type inference engine in quite powerful, but sometimes the code does not provide enough clues to go by. In these cases we request you to add a @return annotation as described here.

Loading history...
81
    {
82
        if (!$this->hasQueryParam($key)) {
83
            throw new \RuntimeException(\sprintf('Query parameter with key "%s" does not exist.', $key));
84
        }
85
86
        return $this->queryParameters[$key];
87
    }
88
89
    public function hasQueryParam(string $key): bool
90
    {
91
        return \array_key_exists($key, $this->getQueryParams());
92
    }
93
94
    public function getRedirectUri(): string
95
    {
96
        return $this->redirectUri;
97
    }
98
99
    public function setRedirectUri(string $redirectUri): void
100
    {
101
        $this->redirectUri = $redirectUri;
102
    }
103
104
    public function toArray(): array
105
    {
106
        return [
107
            'code' => $this->getTokenId()->getValue(),
108
        ];
109
    }
110
111
    /**
112
     * {@inheritdoc}
113
     */
114
    public function jsonSerialize()
115
    {
116
        $data = parent::jsonSerialize() + [
117
            'auth_code_id' => $this->getTokenId()->getValue(),
118
            'query_parameters' => (object) $this->getQueryParameters(),
119
            'redirect_uri' => $this->getRedirectUri(),
120
            'is_used' => $this->isUsed(),
121
        ];
122
123
        return $data;
124
    }
125
126
    public function apply(Event $event): void
127
    {
128
        $map = $this->getEventMap();
129
        if (!\array_key_exists($event->getType(), $map)) {
130
            throw new \RuntimeException('Unsupported event.');
131
        }
132
        if ($this->getTokenId()->getValue() !== $event->getDomainId()->getValue()) {
133
            throw new \RuntimeException('Event not applicable for this authorization code.');
134
        }
135
        $method = $map[$event->getType()];
136
137
        $this->$method($event);
138
    }
139
140
    private function getEventMap(): array
141
    {
142
        return [
143
            AuthorizationCodeEvent\AuthorizationCodeCreatedEvent::class => 'applyAuthorizationCodeCreatedEvent',
144
            AuthorizationCodeEvent\AuthorizationCodeMarkedAsUsedEvent::class => 'applyAuthorizationCodeMarkedAsUsedEvent',
145
            AuthorizationCodeEvent\AuthorizationCodeRevokedEvent::class => 'applyAuthorizationCodeRevokedEvent',
146
        ];
147
    }
148
149
    protected function applyAuthorizationCodeCreatedEvent(AuthorizationCodeEvent\AuthorizationCodeCreatedEvent $event): void
150
    {
151
        $this->setTokenId($event->getAuthorizationCodeId());
152
        $this->setClientId($event->getClientId());
153
        $this->setResourceOwnerId($event->getUserAccountId());
154
        $this->setQueryParameters($event->getQueryParameters());
155
        $this->setRedirectUri($event->getRedirectUri());
156
        $this->setExpiresAt($event->getExpiresAt());
157
        $this->setParameter($event->getParameter());
158
        $this->setMetadata($event->getMetadata());
159
        $this->setExpiresAt($event->getExpiresAt());
160
        $this->setResourceServerId($event->getResourceServerId());
161
        $this->used = false;
162
    }
163
164
    protected function applyAuthorizationCodeMarkedAsUsedEvent(AuthorizationCodeEvent\AuthorizationCodeMarkedAsUsedEvent $event): void
165
    {
166
        $this->markAsUsed();
167
    }
168
169
    protected function applyAuthorizationCodeRevokedEvent(AuthorizationCodeEvent\AuthorizationCodeRevokedEvent $event): void
170
    {
171
        $this->markAsRevoked();
172
    }
173
}
174