Completed
Push — master ( ce2be0...7bcb9a )
by Olivier
02:08
created

EventBuilder   F

Complexity

Total Complexity 61

Size/Duplication

Total Lines 140
Duplicated Lines 0 %

Coupling/Cohesion

Components 0
Dependencies 58

Test Coverage

Coverage 99.19%

Importance

Changes 0
Metric Value
wmc 61
lcom 0
cbo 58
dl 0
loc 140
ccs 123
cts 124
cp 0.9919
rs 3.52
c 0
b 0
f 0

2 Methods

Rating   Name   Duplication   Size   Complexity  
A createEventFromRequest() 0 10 2
F createEventFromArray() 0 126 59

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((string) $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 'coupon.created':
61 1
                return Event\CouponCreatedEvent::createFromArray($data);
62 102
            case 'coupon.deleted':
63 1
                return Event\CouponDeletedEvent::createFromArray($data);
64 101
            case 'coupon.updated':
65 1
                return Event\CouponUpdatedEvent::createFromArray($data);
66 100
            case 'customer.bank_account.deleted':
67 1
                return Event\CustomerBankAccountDeletedEvent::createFromArray($data);
68 99
            case 'customer.created':
69 1
                return Event\CustomerCreatedEvent::createFromArray($data);
70 98
            case 'customer.deleted':
71 1
                return Event\CustomerDeletedEvent::createFromArray($data);
72 97
            case 'customer.discount.created':
73 1
                return Event\CustomerDiscountCreatedEvent::createFromArray($data);
74 96
            case 'customer.discount.deleted':
75 1
                return Event\CustomerDiscountDeletedEvent::createFromArray($data);
76 95
            case 'customer.discount.updated':
77 1
                return Event\CustomerDiscountUpdatedEvent::createFromArray($data);
78 94
            case 'customer.source.created':
79 1
                return Event\CustomerSourceCreatedEvent::createFromArray($data);
80 93
            case 'customer.source.deleted':
81 1
                return Event\CustomerSourceDeletedEvent::createFromArray($data);
82 92
            case 'customer.source.expiring':
83 1
                return Event\CustomerSourceExpiringEvent::createFromArray($data);
84 91
            case 'customer.source.updated':
85 1
                return Event\CustomerSourceUpdatedEvent::createFromArray($data);
86 90
            case 'customer.subscription.created':
87 1
                return Event\CustomerSubscriptionCreatedEvent::createFromArray($data);
88 89
            case 'customer.subscription.deleted':
89 1
                return Event\CustomerSubscriptionDeletedEvent::createFromArray($data);
90 88
            case 'customer.subscription.trial_will_end':
91 1
                return Event\CustomerSubscriptionTrialWillEndEvent::createFromArray($data);
92 87
            case 'customer.subscription.updated':
93 1
                return Event\CustomerSubscriptionUpdatedEvent::createFromArray($data);
94 86
            case 'customer.updated':
95 1
                return Event\CustomerUpdatedEvent::createFromArray($data);
96 85
            case 'invoice.created':
97 1
                return Event\InvoiceCreatedEvent::createFromArray($data);
98 84
            case 'invoice.deleted':
99 1
                return Event\InvoiceDeletedEvent::createFromArray($data);
100 83
            case 'invoice.finalized':
101 1
                return Event\InvoiceFinalizedEvent::createFromArray($data);
102 82
            case 'invoice.marked_uncollectible':
103 1
                return Event\InvoiceMarkedUncollectibleEvent::createFromArray($data);
104 81
            case 'invoice.payment_failed':
105 1
                return Event\InvoicePaymentFailedEvent::createFromArray($data);
106 80
            case 'invoice.payment_succeeded':
107 1
                return Event\InvoicePaymentSucceededEvent::createFromArray($data);
108 79
            case 'invoice.sent':
109 1
                return Event\InvoiceSentEvent::createFromArray($data);
110 78
            case 'invoice.upcoming':
111 1
                return Event\InvoiceUpcomingEvent::createFromArray($data);
112 77
            case 'invoice.updated':
113 1
                return Event\InvoiceUpdatedEvent::createFromArray($data);
114 76
            case 'invoice.voided':
115 1
                return Event\InvoiceVoidedEvent::createFromArray($data);
116 75
            case 'invoiceitem.created':
117 1
                return Event\InvoiceItemCreatedEvent::createFromArray($data);
118 74
            case 'invoiceitem.deleted':
119 1
                return Event\InvoiceItemDeletedEvent::createFromArray($data);
120 73
            case 'invoiceitem.updated':
121 1
                return Event\InvoiceItemUpdatedEvent::createFromArray($data);
122 72
            case 'plan.created':
123 1
                return Event\PlanCreatedEvent::createFromArray($data);
124 71
            case 'plan.deleted':
125 1
                return Event\PlanDeletedEvent::createFromArray($data);
126 70
            case 'plan.updated':
127 1
                return Event\PlanUpdatedEvent::createFromArray($data);
128 69
            case 'product.created':
129 1
                return Event\ProductCreatedEvent::createFromArray($data);
130 68
            case 'product.deleted':
131 1
                return Event\ProductDeletedEvent::createFromArray($data);
132 67
            case 'product.updated':
133 1
                return Event\ProductUpdatedEvent::createFromArray($data);
134 66
            case 'source.canceled':
135 1
                return Event\SourceCanceledEvent::createFromArray($data);
136 65
            case 'source.chargeable':
137 1
                return Event\SourceChargeableEvent::createFromArray($data);
138 64
            case 'source.failed':
139 1
                return Event\SourceFailedEvent::createFromArray($data);
140 63
            case 'source.mandate_notification':
141 1
                return Event\SourceMandateNotificationEvent::createFromArray($data);
142 62
            case 'source.refund_attributes_required':
143 1
                return Event\SourceRefundAttributesRequiredEvent::createFromArray($data);
144 61
            case 'transfer.created':
145 1
                return Event\TransferCreatedEvent::createFromArray($data);
146 60
            case 'transfer.reversed':
147 1
                return Event\TransferReversedEvent::createFromArray($data);
148 59
            case 'transfer.updated':
149 1
                return Event\TransferUpdatedEvent::createFromArray($data);
150
151
            default:
152 58
                throw new InvalidArgumentException("Unable to process event: Event \"{$data['type']}\" is not supported yet.");
153
        }
154
    }
155
}
156