1<?php
2/**
3 * Hubic service.
4 *
5 * @author  Pedro Amorim <contact@pamorim.fr>
6 * @license http://www.opensource.org/licenses/mit-license.html MIT License
7 * @link    https://api.hubic.com/docs/
8 */
9
10namespace OAuth\OAuth2\Service;
11
12use OAuth\OAuth2\Token\StdOAuth2Token;
13use OAuth\Common\Http\Exception\TokenResponseException;
14use OAuth\Common\Http\Uri\Uri;
15use OAuth\Common\Consumer\CredentialsInterface;
16use OAuth\Common\Http\Client\ClientInterface;
17use OAuth\Common\Storage\TokenStorageInterface;
18use OAuth\Common\Http\Uri\UriInterface;
19
20/**
21 * Hubic service.
22 *
23 * @author  Pedro Amorim <contact@pamorim.fr>
24 * @license http://www.opensource.org/licenses/mit-license.html MIT License
25 * @link    https://api.hubic.com/docs/
26 */
27class Hubic extends AbstractService
28{
29
30    // Scopes
31    const SCOPE_USAGE_GET       = 'usage.r';
32    const SCOPE_ACCOUNT_GET     = 'account.r';
33    const SCOPE_GETALLLINKS_GET = 'getAllLinks.r';
34    const SCOPE_CREDENTIALS_GET = 'credentials.r';
35    const SCOPE_SPONSORCODE_GET = 'sponsorCode.r';
36    const SCOPE_ACTIVATE_POST   = 'activate.w';
37    const SCOPE_SPONSORED_GET   = 'sponsored.r';
38    const SCOPE_LINKS_GET       = 'links.r';
39    const SCOPE_LINKS_POST      = 'links.rw';
40    const SCOPE_LINKS_ALL       = 'links.drw';
41
42    public function __construct(
43        CredentialsInterface $credentials,
44        ClientInterface $httpClient,
45        TokenStorageInterface $storage,
46        $scopes = array(),
47        UriInterface $baseApiUri = null
48    ) {
49        parent::__construct(
50            $credentials,
51            $httpClient,
52            $storage,
53            $scopes,
54            $baseApiUri,
55            true
56        );
57
58        if (null === $baseApiUri) {
59            $this->baseApiUri = new Uri('https://api.hubic.com/');
60        }
61    }
62
63    /**
64     * {@inheritdoc}
65     */
66    public function getAuthorizationEndpoint()
67    {
68        return new Uri('https://api.hubic.com/oauth/auth');
69
70    }
71
72    /**
73     * {@inheritdoc}
74     */
75    public function getAccessTokenEndpoint()
76    {
77        return new Uri('https://api.hubic.com/oauth/token');
78    }
79
80    /**
81     * {@inheritdoc}
82     */
83    protected function getAuthorizationMethod()
84    {
85        return static::AUTHORIZATION_METHOD_HEADER_BEARER;
86    }
87
88    /**
89     * {@inheritdoc}
90     */
91    protected function parseAccessTokenResponse($responseBody)
92    {
93        $data = json_decode($responseBody, true);
94
95        if (null === $data || !is_array($data)) {
96            throw new TokenResponseException('Unable to parse response.');
97        } elseif (isset($data['error'])) {
98            throw new TokenResponseException(
99                'Error in retrieving token: "' . $data['error'] . '"'
100            );
101        }
102
103        $token = new StdOAuth2Token();
104        $token->setAccessToken($data['access_token']);
105        $token->setLifetime($data['expires_in']);
106
107        if (isset($data['refresh_token'])) {
108            $token->setRefreshToken($data['refresh_token']);
109            unset($data['refresh_token']);
110        }
111
112        unset($data['access_token']);
113        unset($data['expires_in']);
114
115        $token->setExtraParams($data);
116
117        return $token;
118    }
119
120
121    /**
122     * {@inheritdoc}
123     */
124    public function getAuthorizationUri(array $additionalParameters = array())
125    {
126        $parameters = array_merge(
127            $additionalParameters,
128            array(
129                'type'          => 'web_server',
130                'client_id'     => $this->credentials->getConsumerId(),
131                'redirect_uri'  => $this->credentials->getCallbackUrl(),
132                'response_type' => 'code',
133            )
134        );
135
136        // special, hubic use a param scope with commas
137        // between scopes instead of spaces
138        $parameters['scope'] = implode(',', $this->scopes);
139
140        if ($this->needsStateParameterInAuthUrl()) {
141            if (!isset($parameters['state'])) {
142                $parameters['state'] = $this->generateAuthorizationState();
143            }
144            $this->storeAuthorizationState($parameters['state']);
145        }
146
147        // Build the url
148        $url = clone $this->getAuthorizationEndpoint();
149        foreach ($parameters as $key => $val) {
150            $url->addToQuery($key, $val);
151        }
152
153        return $url;
154    }
155}
156