Passed
Pull Request — master (#16)
by Nikolay
13:10 queued 02:12
created

ProvidersController::disableAction()   A

Complexity

Conditions 5
Paths 9

Size

Total Lines 21
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 14
dl 0
loc 21
rs 9.4888
c 0
b 0
f 0
cc 5
nc 9
nop 2
1
<?php
2
/**
3
 * Copyright (C) MIKO LLC - All Rights Reserved
4
 * Unauthorized copying of this file, via any medium is strictly prohibited
5
 * Proprietary and confidential
6
 * Written by Nikolay Beketov, 5 2018
7
 *
8
 */
9
10
namespace MikoPBX\AdminCabinet\Controllers;
11
12
use MikoPBX\AdminCabinet\Forms\{IaxProviderEditForm, SipProviderEditForm};
13
use MikoPBX\Common\Models\{Iax, Providers, Sip};
14
15
class ProvidersController extends BaseController
16
{
17
18
    /**
19
     * Получение общего списка провайдеров
20
     */
21
    public function indexAction(): void
22
    {
23
        $providers     = Providers::find();
24
        $providersList = [];
25
        foreach ($providers as $provider) {
26
            $modelType       = ucfirst($provider->type);
27
            $provByType      = $provider->$modelType;
28
            $providersList[] = [
29
                'uniqid'     => $provByType->uniqid,
30
                'name'       => $provByType->description,
31
                'username'   => $provByType->username,
32
                'hostname'   => $provByType->host,
33
                'type'       => $provider->type,
34
                'status'     => $provByType->disabled ? 'disabled' : '',
35
                'existLinks' => $provider->OutgoingRouting->count() > 0 ? 'true' : 'false',
36
37
            ];
38
        }
39
        $this->view->providerlist = $providersList;
40
    }
41
42
43
    /**
44
     * Открытие карточки SIP провайдера и заполнение значений по умолчанию
45
     *
46
     * @param string $uniqid Уникальный идентификатор провайдера, если мы открываем существующего
47
     */
48
    public function modifysipAction(string $uniqid = ''): void
49
    {
50
        $provider = Providers::findFirstByUniqid($uniqid);
51
52
        if ($provider === null) {
53
            $uniqid                     = strtoupper('SIP-' . time());
54
            $provider                   = new Providers();
55
            $provider->type             = 'SIP';
56
            $provider->uniqid           = $uniqid;
57
            $provider->sipuid           = $uniqid;
58
            $provider->Sip              = new Sip();
59
            $provider->Sip->uniqid      = $uniqid;
60
            $provider->Sip->type        = 'friend';
61
            $provider->Sip->port        = 5060;
62
            $provider->Sip->disabled    = '0';
63
            $provider->Sip->qualifyfreq = 60;
64
            $provider->Sip->qualify     = '1';
65
        }
66
67
        $this->view->form      = new SipProviderEditForm($provider->Sip);
68
        $this->view->represent = $provider->getRepresent();
69
    }
70
71
    /**
72
     * Открытие карточки IAX провайдера и заполнение значений по умолчанию
73
     *
74
     * @param string $uniqid Уникальный идентификатор провайдера, если мы открываем существующего
75
     */
76
    public function modifyiaxAction(string $uniqid = ''): void
77
    {
78
        $provider = Providers::findFirstByUniqid($uniqid);
79
80
        if ($provider === null) {
81
            $uniqid                  = strtoupper('IAX-' . time());
82
            $provider                = new Providers();
83
            $provider->type          = 'IAX';
84
            $provider->uniqid        = $uniqid;
85
            $provider->iaxuid        = $uniqid;
86
            $provider->Iax           = new Iax();
87
            $provider->Iax->uniqid   = $uniqid;
88
            $provider->Iax->disabled = '0';
89
            $provider->Iax->qualify  = '1';
90
        }
91
92
        $this->view->form      = new IaxProviderEditForm($provider->Iax);
93
        $this->view->represent = $provider->getRepresent();
94
    }
95
96
    /**
97
     * Включение провайдера
98
     *
99
     * @param string $type   тип провайдера SIP или IAX
100
     * @param string $uniqid Уникальный идентификатор провайдера, если мы открываем существующего
101
     */
102
    public function enableAction(string $type, string $uniqid = ''): void
103
    {
104
        $this->view->success = false;
105
        switch ($type) {
106
            case 'iax':
107
            {
108
                $provider = Iax::findFirstByUniqid($uniqid);
109
                break;
110
            }
111
            case 'sip':
112
            {
113
                $provider = Sip::findFirstByUniqid($uniqid);
114
                break;
115
            }
116
            default:
117
                $provider = null;
118
        }
119
        if ($provider !== null) {
120
            $provider->disabled = '0';
121
            if ($provider->save() === true) {
122
                $this->view->success = true;
123
            }
124
        }
125
    }
126
127
    /**
128
     * Отключение провайдера
129
     *
130
     * @param string $type   тип провайдера SIP или IAX
131
     * @param string $uniqid Уникальный идентификатор провайдера, если мы открываем существующего
132
     */
133
    public function disableAction(string $type, string $uniqid = ''): void
134
    {
135
        $this->view->success = false;
136
        switch ($type) {
137
            case 'iax':
138
            {
139
                $provider = Iax::findFirstByUniqid($uniqid);
140
                break;
141
            }
142
            case 'sip':
143
            {
144
                $provider = Sip::findFirstByUniqid($uniqid);
145
                break;
146
            }
147
            default:
148
                $provider = null;
149
        }
150
        if ($provider !== null) {
151
            $provider->disabled = '1';
152
            if ($provider->save() === true) {
153
                $this->view->success = true;
154
            }
155
        }
156
    }
157
158
    /**
159
     * Сохранение провайдера AJAX запросом из формы
160
     *
161
     * @param string $type - sip или iax
162
     *
163
     */
164
    public function saveAction(string $type): void
165
    {
166
        if ( ! $this->request->isPost()) {
167
            $this->forward('network/index');
168
        }
169
        $this->db->begin();
170
        $data = $this->request->getPost();
171
172
        // Заполним параметры провайдера и его SIP IAX записей
173
        if ( ! $this->saveProvider($data, $type)) {
174
            $this->view->success = false;
175
            $this->db->rollback();
176
177
            return;
178
        }
179
180
        $this->flash->success($this->translation->_('ms_SuccessfulSaved'));
181
        $this->view->success = true;
182
        $this->db->commit();
183
184
        // Если это было создание карточки то надо перегрузить страницу с указанием ID
185
        if (empty($data['id'])) {
186
            $this->view->reload = "providers/modify{$type}/{$data['uniqid']}";
187
        }
188
    }
189
190
    /**
191
     * Сохранение параметров в таблицу  Providers
192
     *
193
     * @param array  $data - POST дата
194
     * @param string $type - sip или iax
195
     *
196
     * @return bool результат сохранения
197
     */
198
    private function saveProvider(array $data, string $type): bool
199
    {
200
        // Проверим это новый провайдер или старый
201
        $provider = Providers::findFirstByUniqid($data['uniqid']);
202
        if ($provider === null) {
203
            $provider         = new Providers();
204
            $provider->uniqid = $data['uniqid'];
205
            switch ($type) {
206
                case 'iax':
207
                    $provider->iaxuid = $data['uniqid'];
208
                    $provider->type   = 'IAX';
209
                    $provider->Iax    = new Iax();
210
                    break;
211
                case 'sip':
212
                    $provider->sipuid = $data['uniqid'];
213
                    $provider->type   = 'SIP';
214
                    $provider->Sip    = new Sip();
215
                    break;
216
            }
217
        }
218
219
        if ($provider->save() === false) {
220
            $errors = $provider->getMessages();
221
            $this->flash->warning(implode('<br>', $errors));
222
223
            return false;
224
        }
225
226
        switch ($type) {
227
            case 'iax':
228
                $providerByType = $provider->Iax;
229
                break;
230
            case 'sip':
231
                $providerByType = $provider->Sip;
232
                break;
233
            default:
234
                $providerByType = [];
235
        }
236
237
        foreach ($providerByType as $name => $value) {
238
            switch ($name) {
239
                case 'id':
240
                    break;
241
                case 'qualify':
242
                case 'disablefromuser':
243
                case 'noregister':
244
                case 'receive_calls_without_auth':
245
                    if (array_key_exists($name, $data)) {
246
                        $providerByType->$name = ($data[$name] === 'on') ? 1 : 0;
247
                    } else {
248
                        $providerByType->$name = 0;
249
                    }
250
                    break;
251
                case 'manualattributes':
252
                    if (array_key_exists($name, $data)) {
253
                        $providerByType->setManualAttributes($data[$name]);
254
                    }
255
                    break;
256
                default:
257
                    if (array_key_exists($name, $data)) {
258
                        $providerByType->$name = $data[$name];
259
                    }
260
            }
261
        }
262
263
        if ($providerByType->save() === false) {
264
            $errors = $providerByType->getMessages();
265
            $this->flash->warning(implode('<br>', $errors));
266
267
            return false;
268
        }
269
270
        return true;
271
    }
272
273
    /**
274
     * Удаление провайдера
275
     *
276
     * @param string $uniqid Уникальный идентификатор провайдера
277
     */
278
    public function deleteAction(string $uniqid = ''): void
279
    {
280
        if ($uniqid === '') {
281
            return;
282
        }
283
284
        $provider = Providers::findFirstByUniqid($uniqid);
285
        if ($provider === null) {
286
            return;
287
        }
288
289
290
        $this->db->begin();
291
        $errors = false;
292
        if ($provider->Iax) {
293
            $iax = $provider->Iax;
294
            if ( ! $iax->delete()) {
295
                $errors = $iax->getMessages();
296
            }
297
        }
298
299
        if ($errors === false && $provider->Sip) {
300
            $sip = $provider->Sip;
301
            if ( ! $sip->delete()) {
302
                $errors = $sip->getMessages();
303
            }
304
        }
305
306
        if ($errors) {
307
            $this->flash->warning(implode('<br>', $errors));
308
            $this->db->rollback();
309
        } else {
310
            $this->db->commit();
311
        }
312
313
314
        $this->forward('providers/index');
315
    }
316
317
}