Completed
Push — master ( 70ebc4...68730f )
by Zbigniew
02:45
created

AbstractResource   A

Complexity

Total Complexity 22

Size/Duplication

Total Lines 162
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 4

Test Coverage

Coverage 87.04%

Importance

Changes 0
Metric Value
wmc 22
lcom 1
cbo 4
dl 0
loc 162
ccs 47
cts 54
cp 0.8704
rs 10
c 0
b 0
f 0

8 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 7 1
getResourceMethodConfiguration() 0 1 ?
A calculateRequestPathFormat() 0 8 2
A assertIsNull() 0 6 2
A assertIsValidIdString() 0 6 4
C prepareRequestPathForResourceMethod() 0 28 8
A assertIsValidIdArray() 0 11 3
A executeRequest() 0 17 2
1
<?php
2
/**
3
 * This file is part of the WrikePhpLibrary package.
4
 *
5
 * (c) Zbigniew Ślązak
6
 *
7
 * For the full copyright and license information, please view the LICENSE
8
 * file that was distributed with this source code.
9
 */
10
11
namespace Zibios\WrikePhpLibrary\Resource;
12
13
use Zibios\WrikePhpLibrary\Client\ClientInterface;
14
use Zibios\WrikePhpLibrary\Enum\Api\RequestMethodEnum;
15
use Zibios\WrikePhpLibrary\Enum\Api\ResourceMethodEnum;
16
use Zibios\WrikePhpLibrary\Transformer\ResponseTransformerInterface;
17
18
/**
19
 * Resource Abstract
20
 *
21
 * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
22
 */
23
abstract class AbstractResource implements ResourceInterface
24
{
25
    /**
26
     * @var ClientInterface
27
     */
28
    protected $client;
29
30
    /**
31
     * @var ResponseTransformerInterface
32
     */
33
    protected $responseTransformer;
34
35
    /**
36
     * @param ClientInterface $client
37
     * @param ResponseTransformerInterface $responseTransformer
38
     */
39 40
    public function __construct(
40
        ClientInterface $client,
41
        ResponseTransformerInterface $responseTransformer
42
    ) {
43 40
        $this->client = $client;
44 40
        $this->responseTransformer = $responseTransformer;
45 40
    }
46
47
    /**
48
     * @return array
49
     */
50
    abstract protected function getResourceMethodConfiguration();
51
52
    /**
53
     * @param string $requestMethod
54
     * @param string $resourceMethod
55
     * @param array $params
56
     * @param string|array|null $id
57
     *
58
     * @return mixed
59
     * @throws \RuntimeException
60
     * @throws \LogicException
61
     * @throws \Exception
62
     * @throws \InvalidArgumentException
63
     * @throws \Zibios\WrikePhpLibrary\Exception\Api\ApiException
64
     * @throws \Zibios\WrikePhpLibrary\Exception\Api\AccessForbiddenException
65
     * @throws \Zibios\WrikePhpLibrary\Exception\Api\InvalidParameterException
66
     * @throws \Zibios\WrikePhpLibrary\Exception\Api\InvalidRequestException
67
     * @throws \Zibios\WrikePhpLibrary\Exception\Api\NotAllowedException
68
     * @throws \Zibios\WrikePhpLibrary\Exception\Api\NotAuthorizedException
69
     * @throws \Zibios\WrikePhpLibrary\Exception\Api\ParameterRequiredException
70
     * @throws \Zibios\WrikePhpLibrary\Exception\Api\ResourceNotFoundException
71
     * @throws \Zibios\WrikePhpLibrary\Exception\Api\ServerErrorException
72
     */
73 32
    protected function executeRequest($requestMethod, $resourceMethod, array $params, $id)
74
    {
75 32
        RequestMethodEnum::assertIsValidValue($requestMethod);
76 32
        ResourceMethodEnum::assertIsValidValue($resourceMethod);
77
78
        try {
79 32
            $response = $this->client->executeRequestForParams(
80 32
                $requestMethod,
81 32
                $this->prepareRequestPathForResourceMethod($resourceMethod, $id),
82
                $params
83 32
            );
84 32
        } catch (\Exception $e) {
85 16
            throw $this->client->transformApiException($e);
86
        }
87
88 16
        return $this->responseTransformer->transform($response, static::class);
89
    }
90
91
    /**
92
     * @param string $resourceMethod
93
     * @param string|array|null $id
94
     *
95
     * @return string
96
     * @throws \InvalidArgumentException
97
     */
98 32
    private function prepareRequestPathForResourceMethod($resourceMethod, $id)
99
    {
100 32
        $requestPathFormat = $this->calculateRequestPathFormat(
101 32
            $resourceMethod,
102 32
            $this->getResourceMethodConfiguration()
103 32
        );
104
105
        switch ($resourceMethod) {
106 32
            case ResourceMethodEnum::GET_ALL:
107 2
                $this->assertIsNull($id);
108 2
                return sprintf($requestPathFormat, $id);
109
110 30
            case ResourceMethodEnum::GET_BY_IDS:
111 2
                $this->assertIsValidIdArray($id);
112 2
                return sprintf($requestPathFormat, implode(',', $id));
113
114 28
            case ResourceMethodEnum::GET_ALL_IN_ACCOUNT:
115 28
            case ResourceMethodEnum::CREATE_IN_ACCOUNT:
116 28
            case ResourceMethodEnum::GET_BY_ID:
117 28
            case ResourceMethodEnum::UPDATE:
118 28
            case ResourceMethodEnum::DELETE:
119 28
                $this->assertIsValidIdString($id);
120 28
                return sprintf($requestPathFormat, $id);
121
122
            default:
123
                throw new \InvalidArgumentException(sprintf('"%s" resource method not yet supported', $resourceMethod));
124
        }
125
    }
126
127
    /**
128
     * @param string $resourceMethod
129
     *
130
     * @param array $resourceMethodConfiguration
131
     *
132
     * @return string
133
     * @throws \InvalidArgumentException
134
     */
135 32
    private function calculateRequestPathFormat($resourceMethod, $resourceMethodConfiguration)
136
    {
137 32
        if (array_key_exists($resourceMethod, $resourceMethodConfiguration) === false) {
138
            throw new \InvalidArgumentException();
139
        }
140
141 32
        return $resourceMethodConfiguration[$resourceMethod];
142
    }
143
144
    /**
145
     * @param mixed $value
146
     *
147
     * @throws \InvalidArgumentException
148
     */
149 2
    private function assertIsNull($value)
150
    {
151 2
        if ($value !== null) {
152
            throw new \InvalidArgumentException();
153
        }
154 2
    }
155
156
    /**
157
     * @param mixed $value
158
     *
159
     * @throws \InvalidArgumentException
160
     */
161 30
    private function assertIsValidIdString($value)
162
    {
163 30
        if (is_string($value) === false || trim($value) === '' || strlen($value) > 16) {
164
            throw new \InvalidArgumentException(sprintf('Invalid Id, should be not empty string!'));
165
        }
166 30
    }
167
168
    /**
169
     * @param mixed $value
170
     *
171
     * @throws \InvalidArgumentException
172
     */
173 2
    private function assertIsValidIdArray($value)
174
    {
175 2
        if (is_array($value) === false) {
176
            throw new \InvalidArgumentException();
177
        }
178
179
        /** @var array $value */
180 2
        foreach ($value as $id) {
181 2
            $this->assertIsValidIdString($id);
182 2
        }
183 2
    }
184
}
185