Completed
Push — master ( 1533d6...1cd2c5 )
by Olivier
04:35 queued 03:09
created

EventBuilder::createEventFromArray()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 12

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 3.0416

Importance

Changes 0
Metric Value
dl 0
loc 12
ccs 5
cts 6
cp 0.8333
rs 9.8666
c 0
b 0
f 0
cc 3
nc 3
nop 1
crap 3.0416
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.created' => Event\CustomerSourceCreatedEvent::class,
41
        'customer.source.deleted' => Event\CustomerSourceDeletedEvent::class,
42
        'customer.source.expiring' => Event\CustomerSourceExpiringEvent::class,
43
        'customer.source.updated' => Event\CustomerSourceUpdatedEvent::class,
44
        'customer.subscription.created' => Event\CustomerSubscriptionCreatedEvent::class,
45
        'customer.subscription.deleted' => Event\CustomerSubscriptionDeletedEvent::class,
46
        'customer.subscription.trial_will_end' => Event\CustomerSubscriptionTrialWillEndEvent::class,
47
        'customer.subscription.updated' => Event\CustomerSubscriptionUpdatedEvent::class,
48
        'customer.updated' => Event\CustomerUpdatedEvent::class,
49
        'invoice.created' => Event\InvoiceCreatedEvent::class,
50
        'invoice.deleted' => Event\InvoiceDeletedEvent::class,
51
        'invoice.finalized' => Event\InvoiceFinalizedEvent::class,
52
        'invoice.marked_uncollectible' => Event\InvoiceMarkedUncollectibleEvent::class,
53
        'invoice.payment_failed' => Event\InvoicePaymentFailedEvent::class,
54
        'invoice.payment_succeeded' => Event\InvoicePaymentSucceededEvent::class,
55
        'invoice.sent' => Event\InvoiceSentEvent::class,
56
        'invoice.upcoming' => Event\InvoiceUpcomingEvent::class,
57
        'invoice.updated' => Event\InvoiceUpdatedEvent::class,
58
        'invoice.voided' => Event\InvoiceVoidedEvent::class,
59
        'invoiceitem.created' => Event\InvoiceItemCreatedEvent::class,
60
        'invoiceitem.deleted' => Event\InvoiceItemDeletedEvent::class,
61
        'invoiceitem.updated' => Event\InvoiceItemUpdatedEvent::class,
62
        'plan.created' => Event\PlanCreatedEvent::class,
63
        'plan.deleted' => Event\PlanDeletedEvent::class,
64
        'plan.updated' => Event\PlanUpdatedEvent::class,
65
        'product.created' => Event\ProductCreatedEvent::class,
66
        'product.deleted' => Event\ProductDeletedEvent::class,
67
        'product.updated' => Event\ProductUpdatedEvent::class,
68
        'source.canceled' => Event\SourceCanceledEvent::class,
69
        'source.chargeable' => Event\SourceChargeableEvent::class,
70
        'source.failed' => Event\SourceFailedEvent::class,
71
        'source.mandate_notification' => Event\SourceMandateNotificationEvent::class,
72
        'source.refund_attributes_required' => Event\SourceRefundAttributesRequiredEvent::class,
73
        'transfer.created' => Event\TransferCreatedEvent::class,
74
        'transfer.reversed' => Event\TransferReversedEvent::class,
75
        'transfer.updated' => Event\TransferUpdatedEvent::class,
76
    ];
77
78 2
    public function createEventFromRequest(Request $request): Event\Event
79
    {
80 2
        $data = json_decode((string) $request->getContent(), true);
81
82 2
        if (\JSON_ERROR_NONE !== json_last_error()) {
83 1
            throw new InvalidArgumentException('Unable to process Request: Invalid JSON provided ('.json_last_error_msg().')');
84
        }
85
86 1
        return $this->createEventFromArray($data);
87
    }
88
89 116
    public function createEventFromArray(array $data): Event\Event
90
    {
91 116
        if (!isset($data['type'])) {
92
            throw new InvalidArgumentException('Unable to process event: No "type" provided in array.');
93
        }
94
95 116
        if (array_key_exists($data['type'], $this->events)) {
96 58
            return call_user_func($this->events[$data['type']].'::createFromArray', $data);
97
        }
98
99 58
        throw new InvalidArgumentException("Unable to process event: Event \"{$data['type']}\" is not supported yet.");
100
    }
101
}
102