Completed
Push — master ( 77c628...ce2be0 )
by Olivier
03:34
created

EventBuilder   A

Complexity

Total Complexity 42

Size/Duplication

Total Lines 102
Duplicated Lines 0 %

Coupling/Cohesion

Components 0
Dependencies 40

Test Coverage

Coverage 98.84%

Importance

Changes 0
Metric Value
wmc 42
lcom 0
cbo 40
dl 0
loc 102
ccs 85
cts 86
cp 0.9884
rs 9.0399
c 0
b 0
f 0

2 Methods

Rating   Name   Duplication   Size   Complexity  
A createEventFromRequest() 0 10 2
D createEventFromArray() 0 88 40

How to fix   Complexity   

Complex Class

Complex classes like EventBuilder often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes. You can also have a look at the cohesion graph to spot any un-connected, or weakly-connected components.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

While breaking up the class, it is a good idea to analyze how other classes use EventBuilder, and based on these observations, apply Extract Interface, too.

1
<?php
2
3
declare(strict_types=1);
4
5
/*
6
 * This software may be modified and distributed under the terms
7
 * of the MIT license. See the LICENSE file for details.
8
 */
9
10
namespace Shapin\Stripe;
11
12
use Shapin\Stripe\Exception\InvalidArgumentException;
13
use Shapin\Stripe\Model\Event;
14
use Symfony\Component\HttpFoundation\Request;
15
16
final class EventBuilder
17
{
18 2
    public function createEventFromRequest(Request $request): Event\Event
19
    {
20 2
        $data = json_decode($request->getContent(), true);
21
22 2
        if (\JSON_ERROR_NONE !== json_last_error()) {
23 1
            throw new InvalidArgumentException('Unable to process Request: Invalid JSON provided ('.json_last_error_msg().')');
24
        }
25
26 1
        return $this->createEventFromArray($data);
27
    }
28
29 116
    public function createEventFromArray(array $data): Event\Event
30
    {
31 116
        if (!isset($data['type'])) {
32
            throw new InvalidArgumentException('Unable to process event: No "type" provided in array.');
33
        }
34
35 116
        switch ($data['type']) {
36 116
            case 'account.external_account.created':
37 1
                return Event\AccountExternalAccountCreatedEvent::createFromArray($data);
38 115
            case 'account.external_account.deleted':
39 1
                return Event\AccountExternalAccountDeletedEvent::createFromArray($data);
40 114
            case 'account.external_account.updated':
41 1
                return Event\AccountExternalAccountUpdatedEvent::createFromArray($data);
42 113
            case 'account.updated':
43 1
                return Event\AccountUpdatedEvent::createFromArray($data);
44 112
            case 'balance.available':
45 1
                return Event\BalanceAvailableEvent::createFromArray($data);
46 111
            case 'charge.captured':
47 2
                return Event\ChargeCapturedEvent::createFromArray($data);
48 109
            case 'charge.expired':
49 1
                return Event\ChargeExpiredEvent::createFromArray($data);
50 108
            case 'charge.failed':
51 1
                return Event\ChargeFailedEvent::createFromArray($data);
52 107
            case 'charge.pending':
53 1
                return Event\ChargePendingEvent::createFromArray($data);
54 106
            case 'charge.refund.updated':
55 1
                return Event\ChargeRefundUpdatedEvent::createFromArray($data);
56 105
            case 'charge.refunded':
57 1
                return Event\ChargeRefundedEvent::createFromArray($data);
58 104
            case 'charge.succeeded':
59 1
                return Event\ChargeSucceededEvent::createFromArray($data);
60 103
            case 'customer.bank_account.deleted':
61 1
                return Event\CustomerBankAccountDeletedEvent::createFromArray($data);
62 102
            case 'customer.created':
63 1
                return Event\CustomerCreatedEvent::createFromArray($data);
64 101
            case 'customer.deleted':
65 1
                return Event\CustomerDeletedEvent::createFromArray($data);
66 100
            case 'customer.source.created':
67 1
                return Event\CustomerSourceCreatedEvent::createFromArray($data);
68 99
            case 'customer.source.deleted':
69 1
                return Event\CustomerSourceDeletedEvent::createFromArray($data);
70 98
            case 'customer.source.expiring':
71 1
                return Event\CustomerSourceExpiringEvent::createFromArray($data);
72 97
            case 'customer.source.updated':
73 1
                return Event\CustomerSourceUpdatedEvent::createFromArray($data);
74 96
            case 'customer.subscription.created':
75 1
                return Event\CustomerSubscriptionCreatedEvent::createFromArray($data);
76 95
            case 'customer.subscription.deleted':
77 1
                return Event\CustomerSubscriptionDeletedEvent::createFromArray($data);
78 94
            case 'customer.subscription.trial_will_end':
79 1
                return Event\CustomerSubscriptionTrialWillEndEvent::createFromArray($data);
80 93
            case 'customer.subscription.updated':
81 1
                return Event\CustomerSubscriptionUpdatedEvent::createFromArray($data);
82 92
            case 'customer.updated':
83 1
                return Event\CustomerUpdatedEvent::createFromArray($data);
84 91
            case 'plan.created':
85 1
                return Event\PlanCreatedEvent::createFromArray($data);
86 90
            case 'plan.deleted':
87 1
                return Event\PlanDeletedEvent::createFromArray($data);
88 89
            case 'plan.updated':
89 1
                return Event\PlanUpdatedEvent::createFromArray($data);
90 88
            case 'product.created':
91 1
                return Event\ProductCreatedEvent::createFromArray($data);
92 87
            case 'product.deleted':
93 1
                return Event\ProductDeletedEvent::createFromArray($data);
94 86
            case 'product.updated':
95 1
                return Event\ProductUpdatedEvent::createFromArray($data);
96 85
            case 'source.canceled':
97 1
                return Event\SourceCanceledEvent::createFromArray($data);
98 84
            case 'source.chargeable':
99 1
                return Event\SourceChargeableEvent::createFromArray($data);
100 83
            case 'source.failed':
101 1
                return Event\SourceFailedEvent::createFromArray($data);
102 82
            case 'source.mandate_notification':
103 1
                return Event\SourceMandateNotificationEvent::createFromArray($data);
104 81
            case 'source.refund_attributes_required':
105 1
                return Event\SourceRefundAttributesRequiredEvent::createFromArray($data);
106 80
            case 'transfer.created':
107 1
                return Event\TransferCreatedEvent::createFromArray($data);
108 79
            case 'transfer.reversed':
109 1
                return Event\TransferReversedEvent::createFromArray($data);
110 78
            case 'transfer.updated':
111 1
                return Event\TransferUpdatedEvent::createFromArray($data);
112
113
            default:
114 77
                throw new InvalidArgumentException("Unable to process event: Event \"{$data['type']}\" is not supported yet.");
115
        }
116
    }
117
}
118