SpotifyService   A
last analyzed

Complexity

Total Complexity 7

Size/Duplication

Total Lines 109
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
dl 0
loc 109
rs 10
c 0
b 0
f 0
wmc 7

5 Methods

Rating   Name   Duplication   Size   Complexity  
B requestToken() 0 24 1
A __construct() 0 3 1
A requestMe() 0 12 1
A requestTopArtists() 0 13 2
A getAuthUri() 0 10 2
1
<?php
2
/**
3
 * Created by PhpStorm.
4
 * User: thiago
5
 * Date: 31/03/18
6
 * Time: 18:47
7
 */
8
9
namespace MyWonderland\Service;
10
11
use GuzzleHttp\Client;
12
use MyWonderland\Domain\Model\Artist;
13
use MyWonderland\Domain\Model\SpotifyMe;
14
use MyWonderland\Domain\Model\SpotifyToken;
15
16
class SpotifyService
17
{
18
    const REDIRECT_URI = '/callback';
19
    const BASE_AUTH_URI = 'https://accounts.spotify.com/authorize/';
20
    const TOKEN_URI = 'https://accounts.spotify.com/api/token';
21
    const BASE_API = 'https://api.spotify.com/v1';
22
23
    /**
24
     * @var RequestService
25
     */
26
    protected $requestService;
27
28
29
    /**
30
     * SpotifyService constructor.
31
     * @param RequestService $requestService
32
     */
33
    public function __construct(RequestService $requestService)
34
    {
35
        $this->requestService = $requestService;
36
    }
37
38
39
    /**
40
     * @param $spotifyClientId
41
     * @param $spotifyCallBackState
42
     * @param $baseUri
43
     * @return string
44
     */
45
    public function getAuthUri($spotifyClientId, $spotifyCallBackState, $baseUri)
46
    {
47
        $scopes = 'user-read-private user-read-email user-top-read';
48
        $queryString = "?client_id=$spotifyClientId" .
49
            '&response_type=code' .
50
            '&show_dialog=true' .
51
            '&redirect_uri=' . rawurlencode($baseUri . self::REDIRECT_URI) .
52
            ($scopes ? '&scope=' . rawurlencode($scopes) : '') .
53
            "&state=$spotifyCallBackState";
54
        return self::BASE_AUTH_URI . $queryString;
55
    }
56
57
58
    /**
59
     * @param $spotifyClientId
60
     * @param $spotifyClientSecret
61
     * @param $code
62
     * @param $baseUri
63
     * @return SpotifyToken
64
     */
65
    public function requestToken($spotifyClientId, $spotifyClientSecret, $code, $baseUri)
66
    {
67
        $client = new Client();
68
        $requestBody = [
69
            'form_params' => [
70
                'grant_type' => 'authorization_code',
71
                'code' => $code,
72
                'redirect_uri' => $baseUri . self::REDIRECT_URI
73
            ],
74
            'headers' => [
75
                'Authorization' => 'Basic  ' .
76
                    base64_encode("$spotifyClientId:$spotifyClientSecret")
77
            ]
78
        ];
79
        $response = $client->request('POST', self::TOKEN_URI, $requestBody, \json_encode($requestBody));
0 ignored issues
show
Unused Code introduced by
The call to GuzzleHttp\Client::request() has too many arguments starting with json_encode($requestBody). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

79
        /** @scrutinizer ignore-call */ 
80
        $response = $client->request('POST', self::TOKEN_URI, $requestBody, \json_encode($requestBody));

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress. Please note the @ignore annotation hint above.

Loading history...
80
81
        // @todo use guzzle options
82
        $responseBody = \json_decode($response->getBody()->getContents(), true);
83
        return new SpotifyToken(
84
            $responseBody['access_token'],
85
            $responseBody['token_type'],
86
            $responseBody['expires_in'],
87
            $responseBody['refresh_token'],
88
            $responseBody['scope']
89
        );
90
    }
91
92
93
    /**
94
     * @param SpotifyToken $token
95
     * @return SpotifyMe
96
     */
97
    public function requestMe(SpotifyToken $token)
98
    {
99
        $uri = 'https://api.spotify.com/v1/me';
100
        $response = $this->requestService->requestContent('GET', $uri, [
101
            'headers' => [
102
                'Authorization' => 'Bearer ' . $token->getAccessToken()
103
            ]
104
        ], $uri . $token->getAccessToken());
105
        return new SpotifyMe(
106
            $response['country'],
107
            $response['display_name'],
108
            $response['images'][0]['url']
109
        );
110
    }
111
112
    public function requestTopArtists(SpotifyToken $token)
113
    {
114
        $uri = self::BASE_API . '/me/top/artists';
115
        $response = $this->requestService->requestContent('GET', $uri, [
116
            'headers' => [
117
                'Authorization' => 'Bearer ' . $token->getAccessToken()
118
            ]
119
        ], $uri . $token->getAccessToken());
120
        $topArtists = [];
121
        foreach ($response['items'] as $artist) {
122
            $topArtists[] = new Artist($artist['name'], $artist['images'][1]['url']);
123
        }
124
        return $topArtists;
125
    }
126
}