Completed
Push — master ( 3a74af...b425be )
by Matthias
13s
created

Client::__construct()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 10
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 7
nc 2
nop 3
dl 0
loc 10
rs 9.4285
c 0
b 0
f 0
1
<?php
2
3
namespace SolutionDrive\HipchatAPIv2Client;
4
5
use Buzz\Browser;
6
use Buzz\Client\Curl;
7
use SolutionDrive\HipchatAPIv2Client\Auth\AuthInterface;
8
use SolutionDrive\HipchatAPIv2Client\Exception\RequestException;
9
10
class Client implements ClientInterface
11
{
12
    protected $baseUrl;
13
14
    /** @var AuthInterface */
15
    protected $auth;
16
17
    /** @var Browser */
18
    protected $browser;
19
20
    /**
21
     * Client constructor
22
     *
23
     * @param AuthInterface $auth Authentication you want to use to access the api
24
     * @param Browser $browser Client you want to use, by default browser with curl will be used
25
     * @param string $baseUrl URL to the HipChat server endpoint
26
     *
27
     * @return self
28
     */
29
    public function __construct(AuthInterface $auth, Browser $browser = null, $baseUrl = 'https://api.hipchat.com')
30
    {
31
        $this->auth = $auth;
32
        $this->baseUrl = $baseUrl;
33
        if ($browser === null) {
34
            $client = new Curl();
35
            $this->browser = new Browser($client);
36
        }
37
        else {
38
            $this->browser = $browser;
39
        }
40
    }
41
42
    /**
43
     * Set the base URL for the requests. Defaults to the public API
44
     *     but this allows it to work with internal implementations too
45
     *
46
     * @param string $url URL to the HipChat server endpoint
47
     *
48
     * @deprecated Use constructor to change default baseUrl instead, will be removed in 2.0
49
     */
50
    public function setBaseUrl($url)
51
    {
52
        $this->baseUrl = $url;
53
    }
54
55
    /**
56
     * Common get request for all API calls
57
     *
58
     * @param string $resource The path to the resource wanted. For example v2/room
59
     * @param array $query Parameters to filter the response for example array('max-results' => 50)
60
     *
61
     * @return array Decoded array containing response
62
     * @throws Exception\RequestException
63
     */
64
    public function get($resource, $query = array())
65
    {
66
        $url = $this->baseUrl . $resource;
67
        if (count($query) > 0) {
68
            $url .= "?";
69
        }
70
71
        foreach ($query as $key => $value) {
72
            $url .= "$key=$value&";
73
        }
74
75
        $headers = array("Authorization" => $this->auth->getCredential());
76
77
        try {
78
            $response = $this->browser->get($url, $headers);
79
        } catch (\Buzz\Exception\ClientException $e) {
80
            throw new RequestException($e->getMessage());
81
        }
82
83
        if ($this->browser->getLastResponse()->getStatusCode() > 299) {
84
            throw new RequestException(json_decode($this->browser->getLastResponse()->getContent(), true));
85
        }
86
87
        return json_decode($response->getContent(), true);
88
    }
89
90
    /**
91
     * Common post request for all API calls
92
     *
93
     * @param string $resource The path to the resource wanted. For example v2/room
94
     * @param array $content Parameters be posted for example:
95
     *                              array(
96
     *                                'name'                => 'Example name',
97
     *                                'privacy'             => 'private',
98
     *                                'is_archived'         => 'false',
99
     *                                'is_guest_accessible' => 'false',
100
     *                                'topic'               => 'New topic',
101
     *                              )
102
     *
103
     * @return array Decoded array containing response
104
     * @throws Exception\RequestException
105
     */
106 View Code Duplication
    public function post($resource, $content)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
107
    {
108
        $url = $this->baseUrl . $resource;
109
110
        $headers = array(
111
            'Content-Type' => 'application/json',
112
            'Authorization' => $this->auth->getCredential()
113
        );
114
115
        try {
116
            $response = $this->browser->post($url, $headers, json_encode($content));
117
        } catch (\Buzz\Exception\ClientException $e) {
118
            throw new RequestException($e->getMessage());
119
        }
120
121
        if ($this->browser->getLastResponse()->getStatusCode() > 299) {
122
            throw new RequestException(json_decode($this->browser->getLastResponse()->getContent(), true));
123
        }
124
125
        return json_decode($response->getContent(), true);
126
    }
127
128
    /**
129
     * Common put request for all API calls
130
     *
131
     * @param string $resource The path to the resource wanted. For example v2/room
132
     * @param array $content Parameters be putted for example:
133
     *                              array(
134
     *                                'name'                => 'Example name',
135
     *                                'privacy'             => 'private',
136
     *                                'is_archived'         => 'false',
137
     *                                'is_guest_accessible' => 'false',
138
     *                                'topic'               => 'New topic',
139
     *                              )
140
     *
141
     * @return array Decoded array containing response
142
     * @throws Exception\RequestException
143
     */
144 View Code Duplication
    public function put($resource, $content = array())
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
145
    {
146
        $url = $this->baseUrl . $resource;
147
        $headers = array(
148
            'Content-Type' => 'application/json',
149
            'Authorization' => $this->auth->getCredential()
150
        );
151
152
        try {
153
            $response = $this->browser->put($url, $headers, json_encode($content));
154
        } catch (\Buzz\Exception\ClientException $e) {
155
            throw new RequestException($e->getMessage());
156
        }
157
158
        if ($this->browser->getLastResponse()->getStatusCode() > 299) {
159
            throw new RequestException(json_decode($this->browser->getLastResponse()->getContent(), true));
160
        }
161
162
        return json_decode($response->getContent(), true);
163
    }
164
165
    /**
166
     * Common delete request for all API calls
167
     *
168
     * @param string $resource The path to the resource wanted. For example v2/room
169
     *
170
     * @return array Decoded array containing response
171
     * @throws Exception\RequestException
172
     */
173 View Code Duplication
    public function delete($resource)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
174
    {
175
        $url = $this->baseUrl . $resource;
176
177
        $headers = array(
178
            'Authorization' => $this->auth->getCredential()
179
        );
180
181
        try {
182
            $response = $this->browser->delete($url, $headers);
183
        } catch (\Buzz\Exception\ClientException $e) {
184
            throw new RequestException($e->getMessage());
185
        }
186
187
        if ($this->browser->getLastResponse()->getStatusCode() > 299) {
188
            throw new RequestException(json_decode($this->browser->getLastResponse()->getContent(), true));
189
        }
190
191
        return json_decode($response->getContent(), true);
192
    }
193
}
194