Completed
Push — master ( c38f59...1533d6 )
by Olivier
08:44
created

EventBuilder   A

Complexity

Total Complexity 5

Size/Duplication

Total Lines 86
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 1

Test Coverage

Coverage 98.67%

Importance

Changes 0
Metric Value
wmc 5
lcom 1
cbo 1
dl 0
loc 86
ccs 74
cts 75
cp 0.9867
rs 10
c 0
b 0
f 0

2 Methods

Rating   Name   Duplication   Size   Complexity  
A createEventFromRequest() 0 10 2
A createEventFromArray() 0 12 3
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
    private $events = [
19
        'account.external_account.created' => Event\AccountExternalAccountCreatedEvent::class,
20 2
        'account.external_account.deleted' => Event\AccountExternalAccountDeletedEvent::class,
21
        'account.external_account.updated' => Event\AccountExternalAccountUpdatedEvent::class,
22 2
        'account.updated' => Event\AccountUpdatedEvent::class,
23 1
        'balance.available' => Event\BalanceAvailableEvent::class,
24
        'charge.captured' => Event\ChargeCapturedEvent::class,
25
        'charge.expired' => Event\ChargeExpiredEvent::class,
26 1
        'charge.failed' => Event\ChargeFailedEvent::class,
27
        'charge.pending' => Event\ChargePendingEvent::class,
28
        'charge.refund.updated' => Event\ChargeRefundUpdatedEvent::class,
29 116
        'charge.refunded' => Event\ChargeRefundedEvent::class,
30
        'charge.succeeded' => Event\ChargeSucceededEvent::class,
31 116
        'coupon.created' => Event\CouponCreatedEvent::class,
32
        'coupon.deleted' => Event\CouponDeletedEvent::class,
33
        'coupon.updated' => Event\CouponUpdatedEvent::class,
34
        'customer.bank_account.deleted' => Event\CustomerBankAccountDeletedEvent::class,
35 116
        'customer.created' => Event\CustomerCreatedEvent::class,
36 116
        'customer.deleted' => Event\CustomerDeletedEvent::class,
37 1
        'customer.discount.created' => Event\CustomerDiscountCreatedEvent::class,
38 115
        'customer.discount.deleted' => Event\CustomerDiscountDeletedEvent::class,
39 1
        'customer.discount.updated' => Event\CustomerDiscountUpdatedEvent::class,
40 114
        'customer.source.created' => Event\CustomerSourceCreatedEvent::class,
41 1
        'customer.source.deleted' => Event\CustomerSourceDeletedEvent::class,
42 113
        'customer.source.expiring' => Event\CustomerSourceExpiringEvent::class,
43 1
        'customer.source.updated' => Event\CustomerSourceUpdatedEvent::class,
44 112
        'customer.subscription.created' => Event\CustomerSubscriptionCreatedEvent::class,
45 1
        'customer.subscription.deleted' => Event\CustomerSubscriptionDeletedEvent::class,
46 111
        'customer.subscription.trial_will_end' => Event\CustomerSubscriptionTrialWillEndEvent::class,
47 2
        'customer.subscription.updated' => Event\CustomerSubscriptionUpdatedEvent::class,
48 109
        'customer.updated' => Event\CustomerUpdatedEvent::class,
49 1
        'invoice.created' => Event\InvoiceCreatedEvent::class,
50 108
        'invoice.deleted' => Event\InvoiceDeletedEvent::class,
51 1
        'invoice.finalized' => Event\InvoiceFinalizedEvent::class,
52 107
        'invoice.marked_uncollectible' => Event\InvoiceMarkedUncollectibleEvent::class,
53 1
        'invoice.payment_failed' => Event\InvoicePaymentFailedEvent::class,
54 106
        'invoice.payment_succeeded' => Event\InvoicePaymentSucceededEvent::class,
55 1
        'invoice.sent' => Event\InvoiceSentEvent::class,
56 105
        'invoice.upcoming' => Event\InvoiceUpcomingEvent::class,
57 1
        'invoice.updated' => Event\InvoiceUpdatedEvent::class,
58 104
        'invoice.voided' => Event\InvoiceVoidedEvent::class,
59 1
        'invoiceitem.created' => Event\InvoiceItemCreatedEvent::class,
60 103
        'invoiceitem.deleted' => Event\InvoiceItemDeletedEvent::class,
61 1
        'invoiceitem.updated' => Event\InvoiceItemUpdatedEvent::class,
62 102
        'plan.created' => Event\PlanCreatedEvent::class,
63 1
        'plan.deleted' => Event\PlanDeletedEvent::class,
64 101
        'plan.updated' => Event\PlanUpdatedEvent::class,
65 1
        'product.created' => Event\ProductCreatedEvent::class,
66 100
        'product.deleted' => Event\ProductDeletedEvent::class,
67 1
        'product.updated' => Event\ProductUpdatedEvent::class,
68 99
        'source.canceled' => Event\SourceCanceledEvent::class,
69 1
        'source.chargeable' => Event\SourceChargeableEvent::class,
70 98
        'source.failed' => Event\SourceFailedEvent::class,
71 1
        'source.mandate_notification' => Event\SourceMandateNotificationEvent::class,
72 97
        'source.refund_attributes_required' => Event\SourceRefundAttributesRequiredEvent::class,
73 1
        'transfer.created' => Event\TransferCreatedEvent::class,
74 96
        'transfer.reversed' => Event\TransferReversedEvent::class,
75 1
        'transfer.updated' => Event\TransferUpdatedEvent::class,
76 95
    ];
77 1
78 94
    public function createEventFromRequest(Request $request): Event\Event
79 1
    {
80 93
        $data = json_decode((string) $request->getContent(), true);
81 1
82 92
        if (\JSON_ERROR_NONE !== json_last_error()) {
83 1
            throw new InvalidArgumentException('Unable to process Request: Invalid JSON provided ('.json_last_error_msg().')');
84 91
        }
85 1
86 90
        return $this->createEventFromArray($data);
87 1
    }
88 89
89 1
    public function createEventFromArray(array $data): Event\Event
90 88
    {
91 1
        if (!isset($data['type'])) {
92 87
            throw new InvalidArgumentException('Unable to process event: No "type" provided in array.');
93 1
        }
94 86
95 1
        if (array_key_exists($data['type'], $this->events)) {
96 85
            return call_user_func($this->events[$data['type']].'::createFromArray', $data);
97 1
        }
98 84
99 1
        throw new InvalidArgumentException("Unable to process event: Event \"{$data['type']}\" is not supported yet.");
100 83
    }
101
}
102