Passed
Push — develop ( 7c58c1...71706d )
by Портнов
05:03
created

CDRDatabaseProvider::getCdr()   B

Complexity

Conditions 6
Paths 36

Size

Total Lines 32
Code Lines 22

Duplication

Lines 0
Ratio 0 %

Importance

Changes 3
Bugs 0 Features 0
Metric Value
eloc 22
c 3
b 0
f 0
dl 0
loc 32
rs 8.9457
cc 6
nc 36
nop 1
1
<?php
2
/*
3
 * MikoPBX - free phone system for small business
4
 * Copyright (C) 2017-2020 Alexey Portnov and Nikolay Beketov
5
 *
6
 * This program is free software: you can redistribute it and/or modify
7
 * it under the terms of the GNU General Public License as published by
8
 * the Free Software Foundation; either version 3 of the License, or
9
 * (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License along with this program.
17
 * If not, see <https://www.gnu.org/licenses/>.
18
 */
19
20
declare(strict_types=1);
21
22
namespace MikoPBX\Common\Providers;
23
24
use MikoPBX\Common\Models\CallDetailRecordsTmp;
25
use MikoPBX\Core\System\BeanstalkClient;
26
use MikoPBX\Core\System\Util;
27
use MikoPBX\Core\Workers\WorkerCdr;
28
use Phalcon\Di;
29
use Phalcon\Di\DiInterface;
30
use Phalcon\Di\ServiceProviderInterface;
31
32
/**
33
 * CDR database connection is created based in the parameters defined in the configuration file
34
 */
35
class CDRDatabaseProvider extends DatabaseProviderBase implements ServiceProviderInterface
36
{
37
    public const SERVICE_NAME = 'dbCDR';
38
39
    /**
40
     * Register dbCDR service provider
41
     *
42
     * @param \Phalcon\Di\DiInterface $di
43
     */
44
    public function register(DiInterface $di): void
45
    {
46
        $dbConfig = $di->getShared(ConfigProvider::SERVICE_NAME)->get('cdrDatabase')->toArray();
47
        $this->registerDBService(self::SERVICE_NAME, $di, $dbConfig);
48
    }
49
50
    /**
51
     * Возвращает все завершенные временные CDR.
52
     * @param array $filter
53
     * @return array
54
     */
55
    public static function getCdr(array $filter = []): array
56
    {
57
        if (empty($filter)) {
58
            $filter = [
59
                'work_completed<>1 AND endtime<>""',
60
                'miko_tmp_db' => true
61
            ];
62
        }
63
        $filter['miko_result_in_file'] = true;
64
        $filter['order'] = 'answer';
65
        if (!isset($filter['columns'])) {
66
            $filter['columns'] = 'id,start,answer,src_num,dst_num,dst_chan,endtime,linkedid,recordingfile,dialstatus,UNIQUEID';
67
        }
68
69
        $client = new BeanstalkClient(WorkerCdr::SELECT_CDR_TUBE);
70
        try {
71
            $result = $client->request(json_encode($filter), 2);
72
            $filename = json_decode($result, true, 512, JSON_THROW_ON_ERROR);
0 ignored issues
show
Bug introduced by
It seems like $result can also be of type false; however, parameter $json of json_decode() does only seem to accept string, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

72
            $filename = json_decode(/** @scrutinizer ignore-type */ $result, true, 512, JSON_THROW_ON_ERROR);
Loading history...
73
        } catch (\Throwable $e) {
74
            $filename = '';
75
        }
76
        $result_data = [];
77
        if (file_exists($filename)) {
78
            try {
79
                $result_data = json_decode(file_get_contents($filename), true, 512, JSON_THROW_ON_ERROR);
80
            } catch (\Throwable $e) {
81
                Util::sysLogMsg('SELECT_CDR_TUBE', 'Error parse response.');
82
            }
83
            unlink($filename);
84
        }
85
86
        return $result_data;
87
    }
88
89
    /**
90
     * Возвращает все не завершенные CDR.
91
     * @return array
92
     */
93
    public static function getCacheCdr(): array
94
    {
95
        $result = [];
96
        $di = Di::getDefault();
97
        if(!$di){
98
            return $result;
99
        }
100
        $managedCache   = $di->get(ManagedCacheProvider::SERVICE_NAME);
101
        $idsList        = $managedCache->getKeys(CallDetailRecordsTmp::CACHE_KEY);
102
        foreach ($idsList as $key){
103
            $cdr = $managedCache->get(str_replace(ManagedCacheProvider::CACHE_PREFIX, '', $key));
104
            if($cdr){
105
                $result[] = $cdr;
106
            }
107
        }
108
        return $result;
109
    }
110
111
}