ProvidersContainer   A
last analyzed

Complexity

Total Complexity 17

Size/Duplication

Total Lines 181
Duplicated Lines 0 %

Importance

Changes 6
Bugs 3 Features 0
Metric Value
eloc 30
c 6
b 3
f 0
dl 0
loc 181
rs 10
wmc 17

12 Methods

Rating   Name   Duplication   Size   Complexity  
A getResponse() 0 3 1
A getHttpClient() 0 3 1
A getRequest() 0 3 1
A __get() 0 3 1
A __construct() 0 4 1
A checkIsProviderClass() 0 7 2
A addProvider() 0 5 1
A getClientInfo() 0 11 3
A buildProvider() 0 5 1
A resolveProviderClass() 0 9 2
A getLastError() 0 3 1
A getProvider() 0 9 2
1
<?php
2
3
namespace seregazhuk\PinterestBot\Api;
4
5
use SebastianBergmann\CodeCoverage\Report\PHP;
6
use seregazhuk\PinterestBot\Api\Providers\BoardSections;
7
use seregazhuk\PinterestBot\Api\Providers\Pins;
8
use seregazhuk\PinterestBot\Api\Providers\Suggestions;
9
use seregazhuk\PinterestBot\Api\Providers\User;
10
use seregazhuk\PinterestBot\Api\Providers\Auth;
11
use seregazhuk\PinterestBot\Api\Providers\Inbox;
12
use seregazhuk\PinterestBot\Api\Providers\Boards;
13
use seregazhuk\PinterestBot\Api\Providers\Topics;
14
use seregazhuk\PinterestBot\Api\Providers\Pinners;
15
use seregazhuk\PinterestBot\Api\Providers\Keywords;
16
use seregazhuk\PinterestBot\Api\Providers\Comments;
17
use seregazhuk\PinterestBot\Api\Providers\Password;
18
use seregazhuk\PinterestBot\Api\Providers\Interests;
19
use seregazhuk\PinterestBot\Exceptions\WrongProvider;
20
use seregazhuk\PinterestBot\Api\Contracts\HttpClient;
21
use seregazhuk\PinterestBot\Api\Providers\Core\Provider;
22
use seregazhuk\PinterestBot\Api\Providers\Core\ProviderWrapper;
23
24
/**
25
 * @property-read Pins $pins
26
 * @property-read Inbox $inbox
27
 * @property-read User $user
28
 * @property-read Boards $boards
29
 * @property-read Pinners $pinners
30
 * @property-read Keywords $keywords
31
 * @property-read Interests $interests
32
 * @property-read Topics $topics
33
 * @property-read Auth $auth
34
 * @property-read Comments $comments
35
 * @property-read Password $password
36
 * @property-read Suggestions $suggestions
37
 * @property-read BoardSections $boardSections
38
 *
39
 * Class ProvidersContainer
40
 * @package seregazhuk\PinterestBot\Api
41
 */
42
class ProvidersContainer
43
{
44
    /**
45
     * References to the request that travels
46
     * through the application.
47
     *
48
     * @var Request
49
     */
50
    protected $request;
51
52
    /**
53
     * @var Response
54
     */
55
    protected $response;
56
57
    /**
58
     * A array containing the cached providers.
59
     *
60
     * @var array
61
     */
62
    protected $providers = [];
63
64
    /**
65
     * @param Request $request
66
     * @param Response $response
67
     */
68
    public function __construct(Request $request, Response $response)
69
    {
70
        $this->request = $request;
71
        $this->response = $response;
72
    }
73
74
    /**
75
     * Magic method to access different providers from the container.
76
     *
77
     * @param string $provider
78
     * @return Provider
79
     * @throws WrongProvider
80
     */
81
    public function __get($provider)
82
    {
83
        return $this->getProvider($provider);
84
    }
85
86
87
    /**
88
     * Gets provider object by name. If there is no such provider
89
     * in providers array, it will try to create it, then save
90
     * it, and then return.
91
     *
92
     * @param string $provider
93
     *
94
     * @throws WrongProvider
95
     *
96
     * @return Provider
97
     */
98
    public function getProvider($provider)
99
    {
100
        // Check if an instance has already been initiated. If not
101
        // build it and then add to the providers array.
102
        if (!isset($this->providers[$provider])) {
103
            $this->addProvider($provider);
104
        }
105
106
        return $this->providers[$provider];
107
    }
108
109
    /**
110
     * Creates provider by class name, and if success saves
111
     * it to providers array. Provider class must exist in PROVIDERS_NAMESPACE.
112
     *
113
     * @param string $provider
114
     * @throws WrongProvider
115
     */
116
    protected function addProvider($provider)
117
    {
118
        $className = $this->resolveProviderClass($provider);
119
120
        $this->providers[$provider] = $this->buildProvider($className);
121
    }
122
123
    /**
124
     * Build Provider object.
125
     *
126
     * @param string $className
127
     * @return ProviderWrapper
128
     */
129
    protected function buildProvider($className)
130
    {
131
        $provider = new $className($this);
132
133
        return new ProviderWrapper($provider);
134
    }
135
136
    /**
137
     * Proxies call to Response object and returns message from
138
     * the error object.
139
     *
140
     * @return string|null
141
     */
142
    public function getLastError()
143
    {
144
        return $this->response->getLastErrorText();
145
    }
146
147
    /**
148
     * Returns client context from Pinterest response. By default info returns from the last
149
     * Pinterest response. If there was no response before or the argument $reload is
150
     * true, we make a dummy request to the main page to update client context.
151
     *
152
     * @param bool $reload
153
     * @return array|null
154
     * @throws WrongProvider
155
     */
156
    public function getClientInfo($reload = false)
157
    {
158
        $clientInfo = $this->response->getClientInfo();
159
160
        if ($clientInfo === null || $reload) {
161
            /** @var User $userProvider */
162
            $userProvider = $this->getProvider('user');
163
            $userProvider->visitPage();
164
        }
165
166
        return $this->response->getClientInfo();
167
    }
168
169
    /**
170
     * Returns HttpClient object for setting user-agent string or
171
     * other CURL available options.
172
     *
173
     * @return HttpClient
174
     */
175
    public function getHttpClient()
176
    {
177
        return $this->request->getHttpClient();
178
    }
179
180
    /**
181
     * @param string $provider
182
     * @return string
183
     * @throws WrongProvider
184
     */
185
    protected function resolveProviderClass($provider)
186
    {
187
        $className = __NAMESPACE__ . '\\Providers\\' . ucfirst($provider);
188
189
        if (!$this->checkIsProviderClass($className)) {
190
            throw new WrongProvider("Provider $className not found.");
191
        }
192
193
        return $className;
194
    }
195
196
    /**
197
     * @param string $className
198
     * @return bool
199
     */
200
    protected function checkIsProviderClass($className)
201
    {
202
        if (!class_exists($className)) {
203
            return false;
204
        }
205
206
        return in_array(Provider::class, class_parents($className));
207
    }
208
209
    /**
210
     * @return Request
211
     */
212
    public function getRequest()
213
    {
214
        return $this->request;
215
    }
216
217
    /**
218
     * @return Response
219
     */
220
    public function getResponse()
221
    {
222
        return $this->response;
223
    }
224
}
225