Test Setup Failed
Push — develop ( 6f7221...94b6b4 )
by Nikita
06:49
created

ProblemFinder::findInconnectableNodes()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 18
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
eloc 10
c 1
b 0
f 1
dl 0
loc 18
rs 9.9332
cc 3
nc 3
nop 0
1
<?php
2
3
namespace Gameap\Services;
4
5
use Gameap\Repositories\DedicatedServersRepository;
6
use Knik\Gameap\GdaemonStatus;
7
8
class ProblemFinder
9
{
10
    private const REQUIRED_EXTENSIONS = ['gd', 'openssl', 'curl', 'gmp', 'intl', 'json', 'zip', 'mbstring'];
11
12
    /** @var GdaemonStatus */
13
    private $gdaemonStatus;
14
15
    /** @var DedicatedServersRepository */
16
    private $nodeRepository;
17
18
    public function __construct(GdaemonStatus $gdaemonStatus, DedicatedServersRepository $nodeRepository)
19
    {
20
        $this->gdaemonStatus = $gdaemonStatus;
21
        $this->nodeRepository = $nodeRepository;
22
    }
23
24
    public function find(): array
25
    {
26
        $problems = [];
27
        $missedExtensions = $this->findMissedExtensions();
28
        if (!empty($missedExtensions)) {
29
            $problems[] = __('home.problems_list.required_extenstions_are_missed', [
30
                'extensions' => implode(', ', $missedExtensions),
31
            ]);
32
        }
33
34
        $inconnectableNodes = $this->findInconnectableNodes();
35
        if (!empty($this->findInconnectableNodes())) {
36
            $problems[] = __('home.problems_list.nodes_is_not_available', [
37
                'nodes' => implode(', ', $inconnectableNodes),
38
            ]);
39
        }
40
41
        return $problems;
42
    }
43
44
    private function findMissedExtensions(): array
45
    {
46
        $extensions = array_map(function(string $value): string {
47
            return strtolower($value);
48
        }, get_loaded_extensions());
49
50
        return array_diff(self::REQUIRED_EXTENSIONS, $extensions);
51
    }
52
53
    private function findInconnectableNodes(): array
54
    {
55
        $problemNodeNames = [];
56
        $nodes = $this->nodeRepository->find();
57
58
        foreach ($nodes as $node) {
59
            $this->gdaemonStatus->setConfig($node->gdaemonSettings());
60
61
            try {
62
                $this->gdaemonStatus->connect();
63
            } catch (\RuntimeException $exception) {
64
                $problemNodeNames[] = $node->name . "(id={$node->id})";
65
            }
66
67
            $this->gdaemonStatus->disconnect();
68
        }
69
70
        return $problemNodeNames;
71
    }
72
}
73