Passed
Push — master ( e32a81...12baf4 )
by Antonio Carlos
02:26
created

src/Support/Resource.php (1 issue)

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
3
namespace PragmaRX\Health\Support;
4
5
use JsonSerializable;
6
use Ramsey\Uuid\Uuid;
7
use Illuminate\Support\Collection;
8
use PragmaRX\Health\Support\Traits\ToArray;
9
use PragmaRX\Health\Events\RaiseHealthIssue;
10
use PragmaRX\Health\Support\Traits\ImportProperties;
11
12
class Resource implements JsonSerializable
13
{
14
    use ToArray, ImportProperties;
15
16
    /**
17
     * @var string
18
     */
19
    public $id;
20
21
    /**
22
     * @var string
23
     */
24
    public $name;
25
26
    /**
27
     * @var string
28
     */
29
    public $slug;
30
31
    /**
32
     * @var string
33
     */
34
    public $abbreviation;
35
36
    /**
37
     * @var bool
38
     */
39
    public $isGlobal;
40
41
    /**
42
     * @var string
43
     */
44
    public $errorMessage;
45
46
    /**
47
     * @var array
48
     */
49
    public $style;
50
51
    /**
52
     * @var bool
53
     */
54
    public $notify;
55
56
    /**
57
     * @var Collection
58
     */
59
    public $targets;
60
61
    /**
62
     * @var ResourceChecker
63
     */
64
    public $checker;
65
66
    /**
67
     * @var Collection
68
     */
69
    public $resources;
70
71
    /**
72
     * @var bool
73
     */
74
    protected $notified;
75
76
    /**
77
     * @var string
78
     */
79
    protected $currentAction;
80
81
    /**
82
     * @var bool|null
83
     */
84
    protected $graphEnabled = null;
85
86
    /**
87
     * Resource factory.
88
     *
89
     * @param Collection $data
90
     * @return resource
91
     * @throws \Exception
92
     */
93 3
    public static function factory(Collection $data)
94
    {
95 3
        $instance = new static();
96
97 3
        $instance->id = (string) Uuid::uuid4();
98
99 3
        $instance->name = $data['name'];
100
101 3
        $instance->slug = str_slug($data['name']);
102
103 3
        $instance->graphEnabled = isset($data['graph_enabled'])
104 3
            ? $data['graph_enabled']
105 3
            : null;
106
107 3
        $instance->abbreviation = $data['abbreviation'];
108
109 3
        $instance->targets = $instance->instantiateTargets(
110 3
            $data['targets'] ?? collect()
111
        );
112
113 3
        $instance->notify =
114 3
            $data['notify'] ?? config('health.notifications.enabled');
115
116 3
        $instance->style = $instance->keysToCamel(config('health.style'));
117
118 3
        $instance->style['columnSize'] =
119 3
            $data['column_size'] ?? $instance->style['columnSize'];
120
121 3
        $instance->errorMessage =
122 3
            $data['error_message'] ?? config('health.errors.message');
123
124 3
        $instance->isGlobal = $data['is_global'] ?? false;
125
126 3
        $instance->checker = $instance->instantiateChecker($data['checker']);
127
128 3
        $instance->importProperties($data);
129
130 3
        return $instance;
131
    }
132
133
    /**
134
     * Instantiate all checkers for a resource.
135
     *
136
     * @param Collection $targets
137
     * @return Collection|\IlluminateAgnostic\Arr\Support\Collection|\IlluminateAgnostic\Collection\Support\Collection|\IlluminateAgnostic\Str\Support\Collection|mixed|\Tightenco\Collect\Support\Collection|\Vanilla\Support\Collection
138
     */
139 3
    public function instantiateTargets(Collection $targets)
140
    {
141 3
        if ($targets->isEmpty()) {
142 3
            return collect([Target::factory($this, $targets)]);
143
        }
144
145 3
        $current = collect();
146
147
        $targets = $targets
148
            ->map(function (Collection $targetList) {
149
                return $targetList->map(function ($target, $name) {
150 3
                    return Target::factory($this, $target, $name);
151 3
                });
152 3
            })
153
            ->reduce(function ($current, $targetList) {
154 3
                foreach ($targetList as $target) {
155 3
                    $current[] = $target;
156
                }
157
158 3
                return $current;
159 3
            }, $current);
160
161 3
        return $targets;
162
    }
163
164
    /**
165
     * Instantiate one checker.
166
     *
167
     * @param string $checker
168
     * @return object
169
     */
170 3
    public function instantiateChecker(string $checker)
171
    {
172 3
        return instantiate($checker);
173
    }
174
175
    /**
176
     * Check all targets for a resource.
177
     *
178
     * @param string $action
179
     * @return resource
180
     */
181 1
    public function check($action = 'resource')
182
    {
183
        $this->setCurrentAction($action)->targets->each(function (
184
            Target $target
185
        ) {
186 1
            $target->check($target);
0 ignored issues
show
The call to Target::check() has too many arguments starting with $target.

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress.

In this case you can add the @ignore PhpDoc annotation to the duplicate definition and it will be ignored.

Loading history...
187 1
        });
188
189 1
        $this->notify();
190
191 1
        return $this;
192
    }
193
194
    /**
195
     * Check global resources.
196
     *
197
     * @param $resources
198
     * @return resource
199
     */
200
    public function checkGlobal($resources)
201
    {
202
        return $this->setResources($resources)->check();
203
    }
204
205
    /**
206
     * Check if is healthy.
207
     *
208
     * @return mixed
209
     */
210 3
    public function isHealthy()
211
    {
212
        return $this->targets->reduce(function ($carry, $target) {
213 3
            return $carry && $target->result->healthy;
214 3
        }, true);
215
    }
216
217 3
    protected function keysToCamel($array)
218
    {
219
        return collect($array)->mapWithKeys(function ($item, $key) {
220 3
            return [camel_case($key) => $item];
221 3
        });
222
    }
223
224
    /**
225
     * Notify about health problems.
226
     */
227 1
    protected function notify()
228
    {
229 1
        if ($this->canNotify()) {
230
            $this->sendNotifications();
231
        }
232 1
    }
233
234
    /**
235
     * Send notifications.
236
     *
237
     * @return static
238
     */
239
    protected function sendNotifications()
240
    {
241
        return collect(config('health.notifications.channels'))->each(function (
242
            $channel
243
        ) {
244
            try {
245
                event(new RaiseHealthIssue($this, $channel));
246
            } catch (\Exception $exception) {
247
                report($exception);
248
            }
249
        });
250
    }
251
252
    /**
253
     * Can we notify about errors on this resource?
254
     *
255
     * @return bool
256
     */
257 1
    protected function canNotify()
258
    {
259
        return
260 1
            ! $this->notified &&
261 1
            $this->notificationsAreEnabled() &&
262 1
            ! $this->isHealthy();
263
    }
264
265
    /**
266
     * Is notification enabled for this resource?
267
     *
268
     * @return bool
269
     */
270 1
    protected function notificationsAreEnabled()
271
    {
272
        return
273 1
            $this->notify &&
274 1
            config('health.notifications.enabled') &&
275 1
            config('health.notifications.notify_on.'.$this->currentAction);
276
    }
277
278
    /**
279
     * Set current action.
280
     *
281
     * @param string $currentAction
282
     * @return resource
283
     */
284 1
    public function setCurrentAction(string $currentAction)
285
    {
286 1
        $this->currentAction = $currentAction;
287
288 1
        return $this;
289
    }
290
291
    /**
292
     * Resources setter.
293
     *
294
     * @param $resources
295
     * @return resource
296
     */
297
    protected function setResources($resources)
298
    {
299
        $this->resources = $resources;
300
301
        return $this;
302
    }
303
304
    /**
305
     * Object to json.
306
     *
307
     * @return false|string
308
     */
309 1
    public function __toString()
310
    {
311 1
        return json_encode($this->__toArray($this, 6));
312
    }
313
314
    /**
315
     * Prepare the resource for JSON serialization.
316
     *
317
     * @return string
318
     */
319 1
    public function jsonSerialize()
320
    {
321 1
        return json_decode($this->__toString(), true);
322
    }
323
}
324