Completed
Pull Request — master (#21)
by Michal
02:30
created

RabbitMQDataManager::itemsCount()   D

Complexity

Conditions 9
Paths 20

Size

Total Lines 28
Code Lines 18

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 90

Importance

Changes 0
Metric Value
dl 0
loc 28
ccs 0
cts 22
cp 0
rs 4.909
c 0
b 0
f 0
cc 9
eloc 18
nc 20
nop 3
crap 90
1
<?php
2
3
namespace UniMan\Drivers\RabbitMQ;
4
5
use UniMan\Core\DataManager\AbstractDataManager;
6
use UniMan\Core\Utils\Filter;
7
use UniMan\Core\Utils\Multisort;
8
use Nette\Localization\ITranslator;
9
use PhpAmqpLib\Connection\AMQPStreamConnection;
10
11
class RabbitMQDataManager extends AbstractDataManager
12
{
13
    private $translator;
14
15
    /** @var AMQPStreamConnection */
16
    private $connection;
17
18
    private $credentials = [];
19
20
    private $client;
21
22
    private $vhost;
23
24 2
    public function __construct(array $credentials, RabbitMQManagementApiClient $client, ITranslator $translator)
25
    {
26 2
        $this->credentials = $credentials;
27 2
        $this->client = $client;
28 2
        $this->translator = $translator;
29 2
    }
30
31
    public function getConnection()
32
    {
33
        return $this->connection;
34
    }
35
36
    public function databases(array $sorting = [])
37
    {
38
        $vhosts = [];
39
        foreach ($this->client->getVhosts($this->credentials['user']) as $vhost) {
40
            $vhosts[$vhost['name']] = [
41
                'vhost' => $vhost['name'],
42
                'queues' => count($this->client->getQueues($vhost['name'])),
43
                'messages' => isset($vhost['messages']) ? $vhost['messages'] : 0,
44
            ];
45
        }
46
        return Multisort::sort($vhosts, $sorting);
47
    }
48
49
    public function selectDatabase($vhost)
50
    {
51
        $this->vhost = $vhost;
52
        $this->connection = new AMQPStreamConnection(
53
            $this->credentials['host'],
54
            $this->credentials['port'],
55
            $this->credentials['user'],
56
            $this->credentials['password'],
57
            $vhost
58
        );
59
        return $this->connection;
60
    }
61
62
    public function tables(array $sorting = [])
63
    {
64
        $tables = [
65
            RabbitMQDriver::TYPE_QUEUE => [],
66
        ];
67
        foreach ($this->client->getQueues($this->vhost) as $queue) {
68
            $tables[RabbitMQDriver::TYPE_QUEUE][$queue['name']] = [
69
                'queue' => $queue['name'],
70
                'number_of_items' => $queue['messages'],
71
                'size' => $queue['message_bytes'],
72
            ];
73
        }
74
        return [
75
            RabbitMQDriver::TYPE_QUEUE => Multisort::sort($tables[RabbitMQDriver::TYPE_QUEUE], $sorting),
76
        ];
77
    }
78
79
    public function itemsCount($type, $table, array $filter = [])
80
    {
81
        if ($type != RabbitMQDriver::TYPE_QUEUE) {
82
            return 0;
83
        }
84
        if (!$filter) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $filter of type array is implicitly converted to a boolean; are you sure this is intended? If so, consider using empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
85
            foreach ($this->client->getQueues($this->vhost) as $queue) {
86
                if ($queue['name'] == $table) {
87
                    return $queue['messages'];
88
                }
89
            }
90
        }
91
        $totalCount = 0;
92
        foreach ($this->client->getMessages($this->vhost, $table) as $message) {
93
            $item = [
94
                'message_body' => $message['payload'],
95
                'length' => $message['payload_bytes'],
96
                'is_truncated' => false ? $this->translator->translate('core.yes') : $this->translator->translate('core.no'),
97
                'content_encoding' => $message['payload_encoding'],
98
                'redelivered' => $message['redelivered'] ? $this->translator->translate('core.yes') : $this->translator->translate('core.no'),
99
            ];
100
            if (Filter::apply($item, $filter)) {
101
                $totalCount++;
102
            }
103
        }
104
105
        return $totalCount;
106
    }
107
108
    public function items($type, $table, $page, $onPage, array $filter = [], array $sorting = [])
109
    {
110
        if ($type != RabbitMQDriver::TYPE_QUEUE) {
111
            return [];
112
        }
113
        $items = [];
114
        foreach ($this->client->getMessages($this->vhost, $table) as $message) {
115
            $item = [
116
                'message_body' => $message['payload'],
117
                'length' => $message['payload_bytes'],
118
                'is_truncated' => false ? $this->translator->translate('core.yes') : $this->translator->translate('core.no'),
119
                'content_encoding' => $message['payload_encoding'],
120
                'redelivered' => $message['redelivered'] ? $this->translator->translate('core.yes') : $this->translator->translate('core.no'),
121
            ];
122
            if (!Filter::apply($item, $filter)) {
123
                continue;
124
            }
125
            $items[$message['payload']] = $item;
126
        }
127
        $items = Multisort::sort($items, $sorting);
128
        return array_slice($items, ($page - 1) * $onPage, $onPage, true);
129
    }
130
131
    public function deleteTable($type, $queue)
132
    {
133
        $channel = $this->connection->channel();
134
        $channel->queue_delete($queue);
135
        $channel->close();
136
        $this->connection->close();
137
        return true;
138
    }
139
}
140