Completed
Push — master ( 9656aa...c41cf7 )
by
34:41 queued 17:34
created

OmiseApi::setupFacade()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 16
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 6
CRAP Score 3.0261

Importance

Changes 0
Metric Value
dl 0
loc 16
ccs 6
cts 7
cp 0.8571
rs 9.4285
c 0
b 0
f 0
cc 3
eloc 6
nc 3
nop 2
crap 3.0261
1
<?php
2
3
/*
4
 * This file is part of the PhpMob package.
5
 *
6
 * (c) Ishmael Doss <[email protected]>
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 */
11
12
declare(strict_types=1);
13
14
namespace PhpMob\Omise;
15
16
use PhpMob\Omise\Api\Account as AccountApi;
17
use PhpMob\Omise\Api\Balance as BalanceApi;
18
use PhpMob\Omise\Api\Charge as ChargeApi;
19
use PhpMob\Omise\Api\Customer as CustomerApi;
20
use PhpMob\Omise\Api\Dispute as DisputeApi;
21
use PhpMob\Omise\Api\Receipt as ReceiptApi;
22
use PhpMob\Omise\Api\Recipient as RecipientApi;
23
use PhpMob\Omise\Api\Refund as RefundApi;
24
use PhpMob\Omise\Api\Token as TokenApi;
25
use PhpMob\Omise\Api\Transaction as TransactionApi;
26
use PhpMob\Omise\Api\Transfer as TransferApi;
27
use PhpMob\Omise\Client\HttpClientInterface;
28
use PhpMob\Omise\Facade\Account;
29
use PhpMob\Omise\Facade\Balance;
30
use PhpMob\Omise\Facade\Charge;
31
use PhpMob\Omise\Facade\Customer;
32
use PhpMob\Omise\Facade\Dispute;
33
use PhpMob\Omise\Facade\Receipt;
34
use PhpMob\Omise\Facade\Recipient;
35
use PhpMob\Omise\Facade\Refund;
36
use PhpMob\Omise\Facade\Token;
37
use PhpMob\Omise\Facade\Transaction;
38
use PhpMob\Omise\Facade\Transfer;
39
use PhpMob\Omise\Hydrator\FacadeHydration;
40
use PhpMob\Omise\Hydrator\HydrationInterface;
41
42
/**
43
 * @author Ishmael Doss <[email protected]>
44
 */
45
class OmiseApi
46
{
47
    const VERSION = '1.0.0-beta1';
48
    const OMISE_ENDPOINT = 'https://api.omise.co/';
49
    const OMISE_VAULT_ENDPOINT = 'https://vault.omise.co/';
50
    const OMISE_VERSION = '2015-11-17';
51
52
    /**
53
     * @var HttpClientInterface
54
     */
55
    private $httpClient;
56
57
    /**
58
     * @var array
59
     */
60
    private $options;
61
62
    /**
63
     * @var HydrationInterface
64
     */
65
    private $hydration;
66
67
    /**
68
     * @var array
69
     */
70
    private static $supports = [
71
        Account::class => AccountApi::class,
72
        Balance::class => BalanceApi::class,
73
        Charge::class => ChargeApi::class,
74
        Customer::class => CustomerApi::class,
75
        Dispute::class => DisputeApi::class,
76
        Receipt::class => ReceiptApi::class,
77
        Recipient::class => RecipientApi::class,
78
        Refund::class => RefundApi::class,
79
        Token::class => TokenApi::class,
80
        Transaction::class => TransactionApi::class,
81
        Transfer::class => TransferApi::class,
82
    ];
83
84
    /**
85
     * @param HttpClientInterface $httpClient
86
     * @param array $options
87
     * @param HydrationInterface $hydration
88
     */
89 62
    public function __construct(HttpClientInterface $httpClient, array $options, HydrationInterface $hydration = null)
90
    {
91 62
        $this->httpClient = $httpClient;
92 62
        $this->options = $options;
93 62
        $this->hydration = $hydration;
94 62
    }
95
96
    /**
97
     * @param $apiClass
98
     *
99
     * @return Api
100
     */
101 62
    public function create($apiClass)
102
    {
103 62
        if (!in_array(Api::class, class_parents($apiClass))) {
104
            throw new \LogicException("The api class ($apiClass) should have sub-type of " . Api::class);
105
        }
106
107 62
        return new $apiClass($this->httpClient, $this->options, $this->hydration);
108
    }
109
110
    /**
111
     * Static use setup.
112
     *
113
     * @param HttpClientInterface $httpClient
114
     * @param array $options
115
     */
116 62
    public static function setupFacade(HttpClientInterface $httpClient, array $options)
117
    {
118 62
        $self = new self($httpClient, $options, new FacadeHydration());
119
120
        /**
121
         * @var Facade
122
         * @var Api $apiClass
123
         */
124 62
        foreach (self::$supports as $domainClass => $apiClass) {
125 62
            if (!in_array(Facade::class, class_parents($domainClass))) {
126
                throw new \LogicException("The domain class ($domainClass) should have sub-type of " . Facade::class);
127
            }
128
129 62
            $domainClass::setApi($self->create($apiClass));
130
        }
131 62
    }
132
}
133