Completed
Push — master ( a06a42...8f4f82 )
by Zbigniew
03:40
created

GuzzleClient::calculateOptionsForParams()   C

Complexity

Conditions 7
Paths 8

Size

Total Lines 25
Code Lines 18

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 15
CRAP Score 7.0119

Importance

Changes 0
Metric Value
dl 0
loc 25
ccs 15
cts 16
cp 0.9375
rs 6.7272
c 0
b 0
f 0
cc 7
eloc 18
nc 8
nop 3
crap 7.0119
1
<?php
2
3
/*
4
 * This file is part of the zibios/wrike-php-guzzle package.
5
 *
6
 * (c) Zbigniew Ślązak
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 */
11
12
namespace Zibios\WrikePhpGuzzle\Client;
13
14
use GuzzleHttp\Client as BaseClient;
15
use Psr\Http\Message\ResponseInterface;
16
use Zibios\WrikePhpLibrary\Api;
17
use Zibios\WrikePhpLibrary\Client\ClientInterface;
18
use Zibios\WrikePhpLibrary\Enum\Api\RequestMethodEnum;
19
use Zibios\WrikePhpLibrary\Enum\Api\ResponseFormatEnum;
20
use Zibios\WrikePhpLibrary\Validator\AccessTokenValidator;
21
22
/**
23
 * Guzzle Client for Wrike library.
24
 */
25
class GuzzleClient extends BaseClient implements ClientInterface
26
{
27
    /**
28
     * @return string
29
     */
30
    public function getResponseFormat()
31
    {
32
        return ResponseFormatEnum::PSR_RESPONSE;
33
    }
34
35
    /**
36
     * Request method.
37
     *
38
     * Generic format for HTTP client request method.
39
     *
40
     * @param string $requestMethod GT/POST/PUT/DELETE
41
     * @param string $path          full path to REST resource without domain, ex. 'accounts/XXXXXXXX/contacts'
42
     * @param array  $params        optional params for GET/POST request
43
     * @param string $accessToken   Access Token for Wrike access
44
     *
45
     * @see \Zibios\WrikePhpLibrary\Enum\Api\RequestMethodEnum
46
     * @see \Zibios\WrikePhpLibrary\Enum\Api\RequestPathFormatEnum
47
     *
48
     * @throws \Exception
49
     * @throws \InvalidArgumentException
50
     *
51
     * @return string|ResponseInterface
52
     */
53 11
    public function executeRequestForParams($requestMethod, $path, array $params, $accessToken)
54
    {
55 11
        RequestMethodEnum::assertIsValidValue($requestMethod);
56
57 10
        $options = $this->calculateOptionsForParams($requestMethod, $params, $accessToken);
58
59 8
        return $this->request($requestMethod, $path, $options);
60
    }
61
62
    /**
63
     * Main method for calculating request params.
64
     *
65
     * @param string $requestMethod
66
     * @param array  $params
67
     * @param $accessToken
68
     *
69
     * @throws \InvalidArgumentException
70
     *
71
     * @return array
72
     */
73 10
    protected function calculateOptionsForParams($requestMethod, array $params, $accessToken)
74
    {
75 10
        $options = $this->prepareBaseOptions($accessToken);
76 8
        if (count($params) === 0) {
77 4
            return $options;
78
        }
79
80
        switch ($requestMethod) {
81 4
            case RequestMethodEnum::GET:
82 1
                $options['query'] = $params;
83 1
                break;
84 3
            case RequestMethodEnum::PUT:
85 2
            case RequestMethodEnum::POST:
86 2
                if (count($params) > 0) {
87 2
                    $options['json'] = $params;
88
                }
89 2
                break;
90 1
            case RequestMethodEnum::DELETE:
91 1
                break;
92
            default:
93
                throw new \InvalidArgumentException();
94
        }
95
96 4
        return $options;
97
    }
98
99
    /**
100
     * @param $accessToken
101
     *
102
     * @throws \InvalidArgumentException
103
     *
104
     * @return array
105
     */
106 10
    protected function prepareBaseOptions($accessToken)
107
    {
108 10
        AccessTokenValidator::assertIsValid($accessToken);
109 8
        $options = [];
110 8
        $options['headers']['Content-Type'] = 'application/json';
111 8
        $options['headers']['Authorization'] = sprintf('Bearer %s', $accessToken);
112 8
        $options['base_uri'] = Api::BASE_URI;
113
114 8
        return $options;
115
    }
116
}
117