Completed
Pull Request — master (#476)
by Michele
04:56
created

Buffer::__construct()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 12
Code Lines 9

Duplication

Lines 0
Ratio 0 %
Metric Value
dl 0
loc 12
rs 9.4285
cc 2
eloc 9
nc 2
nop 5
1
<?php
2
3
namespace OAuth\OAuth2\Service;
4
5
use OAuth\OAuth2\Token\StdOAuth2Token;
6
use OAuth\Common\Http\Exception\TokenResponseException;
7
use OAuth\Common\Http\Uri\Uri;
8
use OAuth\Common\Consumer\CredentialsInterface;
9
use OAuth\Common\Http\Uri\UriInterface;
10
use OAuth\Common\Storage\TokenStorageInterface;
11
use OAuth\Common\Http\Client\ClientInterface;
12
13
/**
14
 * Buffer API.
15
 * @author  Sumukh Sridhara <@sumukhsridhara>
16
 * @link https://bufferapp.com/developers/api
17
 */
18
class Buffer extends AbstractService
19
{
20
    public function __construct(
21
        CredentialsInterface $credentials,
22
        ClientInterface $httpClient,
23
        TokenStorageInterface $storage,
24
        $scopes = array(),
25
        UriInterface $baseApiUri = null
26
    ) {
27
        parent::__construct($credentials, $httpClient, $storage, $scopes, $baseApiUri);
28
        if ($baseApiUri === null) {
29
            $this->baseApiUri = new Uri('https://api.bufferapp.com/1/');
30
        }
31
    }
32
33
    /**
34
     * {@inheritdoc}
35
     */
36
    public function getAuthorizationEndpoint()
37
    {
38
        return new Uri('https://bufferapp.com/oauth2/authorize');
39
    }
40
41
    /**
42
     * {@inheritdoc}
43
     */
44
    public function getAccessTokenEndpoint()
45
    {
46
        return new Uri('https://api.bufferapp.com/1/oauth2/token.json');
47
    }
48
49
    /**
50
     * {@inheritdoc}
51
     */
52
    protected function getAuthorizationMethod()
53
    {
54
        return static::AUTHORIZATION_METHOD_QUERY_STRING;
55
    }
56
57
    /**
58
     * {@inheritdoc}
59
     */
60
    public function getAuthorizationUri(array $additionalParameters = array())
61
    {
62
        $parameters = array_merge(
63
            $additionalParameters,
64
            array(
65
                'client_id'     => $this->credentials->getConsumerId(),
66
                'redirect_uri'  => $this->credentials->getCallbackUrl(),
67
                'response_type' => 'code',
68
            )
69
        );
70
71
        // Build the url
72
        $url = clone $this->getAuthorizationEndpoint();
73
        foreach ($parameters as $key => $val) {
74
            $url->addToQuery($key, $val);
75
        }
76
77
        return $url;
78
    }
79
80
    /**
81
     * {@inheritdoc}
82
     */
83
    public function requestRequestToken()
84
    {
85
        $responseBody = $this->httpClient->retrieveResponse(
86
            $this->getRequestTokenEndpoint(),
0 ignored issues
show
Bug introduced by
The method getRequestTokenEndpoint() does not exist on OAuth\OAuth2\Service\Buffer. Did you maybe mean request()?

This check marks calls to methods that do not seem to exist on an object.

This is most likely the result of a method being renamed without all references to it being renamed likewise.

Loading history...
87
            array(
88
                'client_key' => $this->credentials->getConsumerId(),
89
                'redirect_uri' => $this->credentials->getCallbackUrl(),
90
                'response_type' => 'code',
91
            )
92
        );
93
94
        $code = $this->parseRequestTokenResponse($responseBody);
95
96
        return $code;
97
    }
98
99
    protected function parseRequestTokenResponse($responseBody)
100
    {
101
        parse_str($responseBody, $data);
102
103
        if (null === $data || !is_array($data)) {
104
            throw new TokenResponseException('Unable to parse response.');
105
        } elseif (!isset($data['code'])) {
106
            throw new TokenResponseException('Error in retrieving code.');
107
        }
108
        return $data['code'];
109
    }
110
111
    public function requestAccessToken($code)
112
    {
113
        $bodyParams = array(
114
            'client_id'     => $this->credentials->getConsumerId(),
115
            'client_secret' => $this->credentials->getConsumerSecret(),
116
            'redirect_uri' => $this->credentials->getCallbackUrl(),
117
            'code'          => $code,
118
            'grant_type'    => 'authorization_code',
119
        );
120
121
        $responseBody = $this->httpClient->retrieveResponse(
122
            $this->getAccessTokenEndpoint(),
123
            $bodyParams,
124
            $this->getExtraOAuthHeaders()
125
        );
126
        $token = $this->parseAccessTokenResponse($responseBody);
127
        $this->storage->storeAccessToken($this->service(), $token);
128
129
        return $token;
130
    }
131
132
    protected function parseAccessTokenResponse($responseBody)
133
    {
134
        $data = json_decode($responseBody, true);
135
136
        if ($data === null || !is_array($data)) {
137
            throw new TokenResponseException('Unable to parse response.');
138
        } elseif (isset($data['error'])) {
139
            throw new TokenResponseException('Error in retrieving token: "' . $data['error'] . '"');
140
        }
141
142
        $token = new StdOAuth2Token();
143
        $token->setAccessToken($data['access_token']);
144
145
        $token->setEndOfLife(StdOAuth2Token::EOL_NEVER_EXPIRES);
146
        unset($data['access_token']);
147
        $token->setExtraParams($data);
148
149
        return $token;
150
    }
151
}
152