Passed
Push — master ( 5d017b...8e35dd )
by Laurens
05:45 queued 12s
created

eCurringClient   A

Complexity

Total Complexity 25

Size/Duplication

Total Lines 235
Duplicated Lines 0 %

Test Coverage

Coverage 0%

Importance

Changes 0
Metric Value
wmc 25
eloc 89
dl 0
loc 235
ccs 0
cts 102
cp 0
rs 10
c 0
b 0
f 0

19 Methods

Rating   Name   Duplication   Size   Complexity  
A create() 0 9 4
A getSubscriptions() 0 10 1
A getProducts() 0 10 1
A createCustomer() 0 9 1
A getTransaction() 0 7 1
A delete() 0 5 2
A createSubscription() 0 9 1
A getSubscriptionTransactions() 0 11 1
A update() 0 7 3
A getCustomers() 0 10 1
A updateSubscription() 0 9 1
A updateCustomer() 0 9 1
A createTransaction() 0 9 1
A __construct() 0 16 1
A decodeJsonToArray() 0 3 1
A getProduct() 0 7 1
A getSubscription() 0 7 1
A deleteTransaction() 0 3 1
A getCustomer() 0 7 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace LauLamanApps\eCurring;
6
7
use LauLamanApps\eCurring\Http\ClientInterface;
8
use LauLamanApps\eCurring\Http\Endpoint\MapperInterface;
9
use LauLamanApps\eCurring\Http\Resource\Creatable;
10
use LauLamanApps\eCurring\Http\Resource\CreateParserInterface;
11
use LauLamanApps\eCurring\Http\Resource\Deletable;
12
use LauLamanApps\eCurring\Http\Resource\Updatable;
13
use LauLamanApps\eCurring\Http\Resource\UpdateParserInterface;
14
use LauLamanApps\eCurring\Resource\Curser\Pagination;
15
use LauLamanApps\eCurring\Resource\Customer;
16
use LauLamanApps\eCurring\Resource\CustomerCollection;
17
use LauLamanApps\eCurring\Resource\Factory\CustomerFactoryInterface;
18
use LauLamanApps\eCurring\Resource\Factory\ProductFactoryInterface;
19
use LauLamanApps\eCurring\Resource\Factory\SubscriptionFactoryInterface;
20
use LauLamanApps\eCurring\Resource\Factory\TransactionFactoryInterface;
21
use LauLamanApps\eCurring\Resource\Product;
22
use LauLamanApps\eCurring\Resource\ProductCollection;
23
use LauLamanApps\eCurring\Resource\Subscription;
24
use LauLamanApps\eCurring\Resource\SubscriptionCollection;
25
use LauLamanApps\eCurring\Resource\Transaction;
26
use LauLamanApps\eCurring\Resource\TransactionCollection;
27
use Ramsey\Uuid\UuidInterface;
28
29
final class eCurringClient implements eCurringClientInterface
30
{
31
    /**
32
     * @var ClientInterface
33
     */
34
    private $httpClient;
35
36
    /**
37
     * @var ProductFactoryInterface
38
     */
39
    private $subscriptionPlanFactory;
40
41
    /**
42
     * @var TransactionFactoryInterface
43
     */
44
    private $transactionFactory;
45
46
    /**
47
     * @var SubscriptionFactoryInterface
48
     */
49
    private $subscriptionFactory;
50
51
    /**
52
     * @var CustomerFactoryInterface
53
     */
54
    private $customerFactory;
55
56
    /**
57
     * @var CreateParserInterface
58
     */
59
    private $createParser;
60
61
    /**
62
     * @var UpdateParserInterface
63
     */
64
    private $updateParser;
65
66
    public function __construct(
67
        ClientInterface $httpClient,
68
        CustomerFactoryInterface $customerFactory,
69
        SubscriptionFactoryInterface $subscriptionFactory,
70
        ProductFactoryInterface $subscriptionPlanFactory,
71
        TransactionFactoryInterface $transactionFactory,
72
        CreateParserInterface $createParser,
73
        UpdateParserInterface $updateParser
74
    ) {
75
        $this->httpClient = $httpClient;
76
        $this->customerFactory = $customerFactory;
77
        $this->subscriptionFactory = $subscriptionFactory;
78
        $this->subscriptionPlanFactory = $subscriptionPlanFactory;
79
        $this->transactionFactory = $transactionFactory;
80
        $this->createParser = $createParser;
81
        $this->updateParser = $updateParser;
82
    }
83
84
    public function create(Creatable $entity): Creatable
85
    {
86
        switch (true) {
87
            case $entity instanceof Customer:
88
                return $this->createCustomer($entity);
89
            case $entity instanceof Subscription:
90
                return $this->createSubscription($entity);
91
            case $entity instanceof Transaction:
92
                return $this->createTransaction($entity);
0 ignored issues
show
Bug Best Practice introduced by
In this branch, the function will implicitly return null which is incompatible with the type-hinted return LauLamanApps\eCurring\Http\Resource\Creatable. Consider adding a return statement or allowing null as return value.

For hinted functions/methods where all return statements with the correct type are only reachable via conditions, ?null? gets implicitly returned which may be incompatible with the hinted type. Let?s take a look at an example:

interface ReturnsInt {
    public function returnsIntHinted(): int;
}

class MyClass implements ReturnsInt {
    public function returnsIntHinted(): int
    {
        if (foo()) {
            return 123;
        }
        // here: null is implicitly returned
    }
}
Loading history...
93
        }
94
    }
95
96
    public function update(Updatable $entity): Updatable
97
    {
98
        switch (true) {
99
            case $entity instanceof Customer:
100
                return $this->updateCustomer($entity);
101
            case $entity instanceof Subscription:
102
                return $this->updateSubscription($entity);
0 ignored issues
show
Bug Best Practice introduced by
In this branch, the function will implicitly return null which is incompatible with the type-hinted return LauLamanApps\eCurring\Http\Resource\Updatable. Consider adding a return statement or allowing null as return value.

For hinted functions/methods where all return statements with the correct type are only reachable via conditions, ?null? gets implicitly returned which may be incompatible with the hinted type. Let?s take a look at an example:

interface ReturnsInt {
    public function returnsIntHinted(): int;
}

class MyClass implements ReturnsInt {
    public function returnsIntHinted(): int
    {
        if (foo()) {
            return 123;
        }
        // here: null is implicitly returned
    }
}
Loading history...
103
        }
104
    }
105
106
    public function delete(Deletable $entity): void
107
    {
108
        switch (true) {
109
            case $entity instanceof Transaction:
110
                $this->deleteTransaction($entity);
111
        }
112
    }
113
114
    public function getCustomers(?Pagination $pagination = null): CustomerCollection
115
    {
116
        $json = $this->httpClient->getJson(
117
            $this->httpClient->getEndpoint(MapperInterface::GET_CUSTOMERS, [], $pagination)
118
        );
119
120
        return $this->customerFactory->fromArray(
121
            $this,
122
            $this->decodeJsonToArray($json),
123
            $pagination ?? new Pagination(10)
124
        );
125
    }
126
127
    public function getCustomer(string $id): Customer
128
    {
129
        $json = $this->httpClient->getJson(
130
            $this->httpClient->getEndpoint(MapperInterface::GET_CUSTOMER, [$id])
131
        );
132
133
        return $this->customerFactory->fromData($this, $this->decodeJsonToArray($json)['data']);
134
    }
135
136
    public function getProducts(?Pagination $pagination = null): ProductCollection
137
    {
138
        $json = $this->httpClient->getJson(
139
            $this->httpClient->getEndpoint(MapperInterface::GET_SUBSCRIPTION_PLANS, [], $pagination)
140
        );
141
142
        return $this->subscriptionPlanFactory->fromArray(
143
            $this,
144
            $this->decodeJsonToArray($json),
145
            $pagination ?? new Pagination(10)
146
        );
147
    }
148
149
    public function getProduct(string $id): Product
150
    {
151
        $json = $this->httpClient->getJson(
152
            $this->httpClient->getEndpoint(MapperInterface::GET_SUBSCRIPTION_PLAN, [$id])
153
        );
154
155
        return $this->subscriptionPlanFactory->fromData($this, $this->decodeJsonToArray($json)['data']);
156
    }
157
158
    public function getSubscriptions(?Pagination $page = null): SubscriptionCollection
159
    {
160
        $json = $this->httpClient->getJson(
161
            $this->httpClient->getEndpoint(MapperInterface::GET_SUBSCRIPTIONS)
162
        );
163
164
        return $this->subscriptionFactory->fromArray(
165
            $this,
166
            $this->decodeJsonToArray($json),
167
            $page ?? new Pagination(10)
168
        );
169
    }
170
171
    public function getSubscription(string $id): Subscription
172
    {
173
        $json = $this->httpClient->getJson(
174
            $this->httpClient->getEndpoint(MapperInterface::GET_SUBSCRIPTION, [$id])
175
        );
176
177
        return $this->subscriptionFactory->fromData($this, $this->decodeJsonToArray($json)['data']);
178
    }
179
180
    public function getSubscriptionTransactions(Subscription $subscription, ?Pagination $pagination = null): TransactionCollection
181
    {
182
        $json = $this->httpClient->getJson(
183
            $this->httpClient->getEndpoint(MapperInterface::GET_SUBSCRIPTION_TRANSACTIONS, [$subscription->getId()])
184
        );
185
186
        return $this->transactionFactory->fromSubscriptionArray(
187
            $this,
188
            $this->decodeJsonToArray($json),
189
            $subscription,
190
            $pagination ?? new Pagination(10)
191
        );
192
    }
193
194
    public function getTransaction(UuidInterface $id): Transaction
195
    {
196
        $json = $this->httpClient->getJson(
197
            $this->httpClient->getEndpoint(MapperInterface::GET_SUBSCRIPTION_PLAN, [$id])
198
        );
199
200
        return $this->transactionFactory->fromData($this->decodeJsonToArray($json)['data']);
201
    }
202
203
    private function createCustomer(Customer $customer): Customer
204
    {
205
        $data = $this->createParser->parse($customer);
206
        
207
        $json = $this->httpClient->getJson(
208
            $this->httpClient->postEndpoint(MapperInterface::POST_CUSTOMER, $data)
209
        );
210
211
        return $this->customerFactory->fromData($this, $this->decodeJsonToArray($json)['data']);
212
    }
213
    private function updateCustomer(Customer $customer): Customer
214
    {
215
        $data = $this->updateParser->parse($customer);
216
217
        $json = $this->httpClient->getJson(
218
            $this->httpClient->patchEndpoint(MapperInterface::PATCH_CUSTOMER, $data, [$customer->getId()])
219
        );
220
221
        return $this->customerFactory->fromData($this, $this->decodeJsonToArray($json));
222
    }
223
    private function createSubscription(Subscription $subscription): Subscription
224
    {
225
        $data = $this->createParser->parse($subscription);
226
227
        $json = $this->httpClient->getJson(
228
            $this->httpClient->postEndpoint(MapperInterface::POST_SUBSCRIPTION, $data)
229
        );
230
231
        return $this->subscriptionFactory->fromData($this, $this->decodeJsonToArray($json)['data']);
232
    }
233
234
    private function updateSubscription(Subscription $subscription): Subscription
235
    {
236
        $data = $this->updateParser->parse($subscription);
237
238
        $json = $this->httpClient->getJson(
239
            $this->httpClient->patchEndpoint(MapperInterface::PATCH_SUBSCRIPTION, $data, [$subscription->getId()])
240
        );
241
242
        return $this->subscriptionFactory->fromData($this, $this->decodeJsonToArray($json)['data']);
243
    }
244
245
    private function createTransaction(Transaction $transaction): Transaction
246
    {
247
        $data = $this->createParser->parse($transaction);
248
249
        $json = $this->httpClient->getJson(
250
            $this->httpClient->postEndpoint(MapperInterface::POST_TRANSACTION, $data)
251
        );
252
253
        return $this->transactionFactory->fromData($this, $this->decodeJsonToArray($json)['data']);
0 ignored issues
show
Unused Code introduced by
The call to LauLamanApps\eCurring\Re...ryInterface::fromData() has too many arguments starting with $this->decodeJsonToArray($json)['data']. ( Ignorable by Annotation )

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

253
        return $this->transactionFactory->/** @scrutinizer ignore-call */ fromData($this, $this->decodeJsonToArray($json)['data']);

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...
Bug introduced by
$this of type LauLamanApps\eCurring\eCurringClient is incompatible with the type array expected by parameter $data of LauLamanApps\eCurring\Re...ryInterface::fromData(). ( Ignorable by Annotation )

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

253
        return $this->transactionFactory->fromData(/** @scrutinizer ignore-type */ $this, $this->decodeJsonToArray($json)['data']);
Loading history...
254
    }
255
256
    private function deleteTransaction(Transaction $transaction): void
257
    {
258
        $this->httpClient->deleteEndpoint(MapperInterface::DELETE_TRANSACTION, [$transaction->getId()]);
259
    }
260
261
    private function decodeJsonToArray(string $json): array
262
    {
263
        return json_decode($json, true);
264
    }
265
}
266