Completed
Push — master ( 24d46d...ba1824 )
by Olivier
01:53
created

EventBuilder   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 93
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 3

Test Coverage

Coverage 93.33%

Importance

Changes 0
Metric Value
wmc 7
lcom 1
cbo 3
dl 0
loc 93
ccs 14
cts 15
cp 0.9333
rs 10
c 0
b 0
f 0

2 Methods

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