Passed
Push — develop ( e37b00...b3ec5e )
by Nikolay
04:28
created

PbxSettings::setValue()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 9
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 6
c 0
b 0
f 0
dl 0
loc 9
rs 10
cc 2
nc 2
nop 2
1
<?php
2
/*
3
 * MikoPBX - free phone system for small business
4
 * Copyright © 2017-2023 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
namespace MikoPBX\Common\Models;
21
22
use MikoPBX\Common\Handlers\CriticalErrorsHandler;
23
use Phalcon\Validation;
24
use Phalcon\Validation\Validator\Uniqueness as UniquenessValidator;
25
26
/**
27
 * Class PbxSettings
28
 *
29
 * @method static mixed findFirstByKey(string $string)
30
 *
31
 * @package MikoPBX\Common\Models
32
 */
33
class PbxSettings extends ModelsBase
34
{
35
36
    /**
37
     * Key by which the value is stored
38
     *
39
     * @Primary
40
     * @Column(type="string", nullable=false)
41
     */
42
    public string $key = '';
43
44
    /**
45
     * Stored value
46
     *
47
     * @Column(type="string", nullable=true)
48
     */
49
    public ?string $value = null;
50
51
    /**
52
     *  Returns default or saved values for all predefined keys if it exists on DB
53
     *
54
     * @return array
55
     */
56
    public static function getAllPbxSettings(): array
57
    {
58
        $arrayOfSettings = self::getDefaultArrayValues();
59
        $parameters = [
60
            'cache' => [
61
                'key' => ModelsBase::makeCacheKey(PbxSettings::class, 'getAllPbxSettings'),
62
                'lifetime' => 3600,
63
            ],
64
        ];
65
66
        $currentSettings = parent::find($parameters);
67
68
        foreach ($currentSettings as $record) {
69
            if (isset($record->value)) {
70
                $arrayOfSettings[$record->key] = $record->value;
71
            }
72
        }
73
74
        return $arrayOfSettings;
75
    }
76
77
    /**
78
     * Prepares default values for PbxSettings keys
79
     *
80
     * @return array default values
81
     */
82
    public static function getDefaultArrayValues(): array
83
    {
84
        return [
85
            PbxSettingsConstants::PBX_NAME => 'PBX system',
86
            PbxSettingsConstants::VIRTUAL_HARDWARE_TYPE => 'REAL',// VMWARE,HYPER-V,AWS,AZURE,DOCKER
87
            PbxSettingsConstants::PBX_DESCRIPTION => '',
88
            PbxSettingsConstants::RESTART_EVERY_NIGHT => '0',
89
            PbxSettingsConstants::SIP_PORT => '5060',
90
            PbxSettingsConstants::TLS_PORT => '5061',
91
            PbxSettingsConstants::SIP_DEFAULT_EXPIRY => '120',
92
            PbxSettingsConstants::SIP_MIN_EXPIRY => '60',
93
            PbxSettingsConstants::SIP_MAX_EXPIRY => '3600',
94
            PbxSettingsConstants::RTP_PORT_FROM => '10000',
95
            PbxSettingsConstants::RTP_PORT_TO => '10200',
96
            PbxSettingsConstants::RTP_STUN_SERVER => '',
97
            PbxSettingsConstants::USE_WEB_RTC => '0',
98
            PbxSettingsConstants::IAX_PORT => '4569',
99
            PbxSettingsConstants::AMI_ENABLED => '1',
100
            PbxSettingsConstants::AMI_PORT => '5038',
101
            PbxSettingsConstants::AJAM_ENABLED => '1',
102
            PbxSettingsConstants::AJAM_PORT => '8088',
103
            PbxSettingsConstants::AJAM_PORT_TLS => '8089',
104
            PbxSettingsConstants::SSH_PORT => '22',
105
            PbxSettingsConstants::SSH_LOGIN => 'root',
106
            PbxSettingsConstants::SSH_PASSWORD => 'admin',
107
            PbxSettingsConstants::SSH_RSA_KEY => '',
108
            PbxSettingsConstants::SSH_DSS_KEY => '',
109
            PbxSettingsConstants::SSH_AUTHORIZED_KEYS => '',
110
            PbxSettingsConstants::SSH_ECDSA_KEY => '',
111
            PbxSettingsConstants::SSH_DISABLE_SSH_PASSWORD => '0',
112
            PbxSettingsConstants::SSH_LANGUAGE => 'en',
113
            PbxSettingsConstants::WEB_PORT => '80',
114
            PbxSettingsConstants::WEB_HTTPS_PORT => '443',
115
            PbxSettingsConstants::WEB_HTTPS_PUBLIC_KEY => '',
116
            PbxSettingsConstants::WEB_HTTPS_PRIVATE_KEY => '',
117
            PbxSettingsConstants::REDIRECT_TO_HTTPS => '0',
118
            PbxSettingsConstants::MAIL_SMTP_USE_TLS => '0',
119
            PbxSettingsConstants::MAIL_SMTP_CERT_CHECK => '0',
120
            PbxSettingsConstants::MAIL_SMTP_HOST => '',
121
            PbxSettingsConstants::MAIL_SMTP_PORT => '25',
122
            PbxSettingsConstants::MAIL_SMTP_USERNAME => '',
123
            PbxSettingsConstants::MAIL_SMTP_PASSWORD => '',
124
            PbxSettingsConstants::MAIL_SMTP_FROM_USERNAME => 'PBX',
125
            PbxSettingsConstants::MAIL_SMTP_SENDER_ADDRESS => '',
126
            PbxSettingsConstants::MAIL_ENABLE_NOTIFICATIONS => '0',
127
            PbxSettingsConstants::MAIL_TPL_MISSED_CALL_SUBJECT => 'You have missing call from <MailSMTPSenderAddress>',
128
            PbxSettingsConstants::MAIL_TPL_MISSED_CALL_BODY => 'You have missed calls (NOTIFICATION_MISSEDCAUSE) from <NOTIFICATION_CALLERID> at <NOTIFICATION_DATE>',
129
            PbxSettingsConstants::MAIL_TPL_MISSED_CALL_FOOTER => '',
130
            PbxSettingsConstants::MAIL_TPL_VOICEMAIL_SUBJECT => 'VoiceMail from PBX',
131
            PbxSettingsConstants::MAIL_TPL_VOICEMAIL_BODY => 'See attach',
132
            PbxSettingsConstants::MAIL_TPL_VOICEMAIL_FOOTER => '',
133
            PbxSettingsConstants::NTP_SERVER => '0.pool.ntp.org' . PHP_EOL . '1.pool.ntp.org' . PHP_EOL,
134
            PbxSettingsConstants::VOICEMAIL_NOTIFICATIONS_EMAIL => '[email protected]',
135
            PbxSettingsConstants::VOICEMAIL_EXTENSION => '*001',
136
            PbxSettingsConstants::PBX_LANGUAGE => 'en-en',
137
            PbxSettingsConstants::PBX_INTERNAL_EXTENSION_LENGTH => '3',
138
            PbxSettingsConstants::PBX_RECORD_CALLS => '1',
139
            PbxSettingsConstants::PBX_RECORD_CALLS_INNER => '1',
140
            PbxSettingsConstants::PBX_SPLIT_AUDIO_THREAD => '0',
141
            PbxSettingsConstants::PBX_RECORD_ANNOUNCEMENT_IN => '',
142
            PbxSettingsConstants::PBX_RECORD_ANNOUNCEMENT_OUT => '',
143
            PbxSettingsConstants::PBX_RECORD_SAVE_PERIOD => '',
144
            PbxSettingsConstants::PBX_CALL_PARKING_EXT => '800',
145
            PbxSettingsConstants::PBX_CALL_PARKING_FEATURE => '*2',
146
            PbxSettingsConstants::PBX_CALL_PARKING_DURATION => '50',
147
            PbxSettingsConstants::PBX_CALL_PARKING_START_SLOT => '801',
148
            PbxSettingsConstants::PBX_CALL_PARKING_END_SLOT => '820',
149
            PbxSettingsConstants::PBX_FEATURE_ATTENDED_TRANSFER => '##',
150
            PbxSettingsConstants::PBX_FEATURE_BLIND_TRANSFER => '**',
151
            PbxSettingsConstants::PBX_FEATURE_PICKUP_EXTEN => '*8',
152
            PbxSettingsConstants::PBX_FEATURE_DIGIT_TIMEOUT => '2500',
153
            PbxSettingsConstants::PBX_FEATURE_ATXFER_NO_ANSWER_TIMEOUT => '45',
154
            PbxSettingsConstants::PBX_FEATURE_TRANSFER_DIGIT_TIMEOUT => '3',
155
            PbxSettingsConstants::PBX_FIREWALL_ENABLED => '0',
156
            PbxSettingsConstants::PBX_FAIL2BAN_ENABLED => '0',
157
            PbxSettingsConstants::PBX_TIMEZONE => 'Europe/Moscow',
158
            PbxSettingsConstants::PBX_MANUAL_TIME_SETTINGS=>'0',
159
            PbxSettingsConstants::PBX_VERSION => '2020.1.1',
160
            PbxSettingsConstants::PBX_ALLOW_GUEST_CALLS => '0',
161
            PbxSettingsConstants::WEB_ADMIN_LOGIN => 'admin',
162
            PbxSettingsConstants::WEB_ADMIN_PASSWORD => 'admin',
163
            PbxSettingsConstants::WEB_ADMIN_LANGUAGE => 'en',
164
            PbxSettingsConstants::SYSTEM_NOTIFICATIONS_EMAIL => '',
165
            PbxSettingsConstants::SYSTEM_EMAIL_FOR_MISSED => '',
166
            PbxSettingsConstants::SEND_METRICS => '1',
167
            PbxSettingsConstants::CLOUD_INSTANCE_ID => '',
168
            PbxSettingsConstants::DISABLE_ALL_MODULES=> '0',
169
            PbxSettingsConstants::PBX_LICENSE=>'',
170
        ];
171
    }
172
173
    /**
174
     * Returns default or saved value for key if it exists on DB
175
     *
176
     * @param $key string value key
177
     *
178
     * @return string
179
     */
180
    public static function getValueByKey(string $key): string
181
    {
182
        try {
183
            $parameters = [
184
                'cache' => [
185
                    'key' => ModelsBase::makeCacheKey(self::class, 'getValueByKey'),
186
                    'lifetime' => 3600,
187
                ],
188
            ];
189
            $currentSettings = parent::find($parameters);
190
191
            foreach ($currentSettings as $record) {
192
                if ($record->key === $key
193
                    && isset($record->value)
194
                ) {
195
                    return $record->value;
196
                }
197
            }
198
199
            $arrOfDefaultValues = self::getDefaultArrayValues();
200
            if (array_key_exists($key, $arrOfDefaultValues)) {
201
                return $arrOfDefaultValues[$key];
202
            }
203
        } catch (\Throwable $e) {
204
            CriticalErrorsHandler::handleException($e);
205
        }
206
207
        return '';
208
    }
209
210
    /**
211
     * Initialize the model.
212
     */
213
    public function initialize(): void
214
    {
215
        $this->setSource('m_PbxSettings');
216
        parent::initialize();
217
    }
218
219
    /**
220
     * Perform validation on the model.
221
     *
222
     * @return bool Whether the validation was successful or not.
223
     */
224
    public function validation(): bool
225
    {
226
        $validation = new Validation();
227
        $validation->add(
228
            'key',
229
            new UniquenessValidator(
230
                [
231
                    'message' => $this->t('mo_ThisKeyMustBeUniqueForPbxSettingsModels'),
232
                ]
233
            )
234
        );
235
236
        return $this->validate($validation);
237
    }
238
239
    /**
240
     * Set value for key
241
     * @param $key string settings key
242
     * @param $value string value
243
     * @return bool Whether the save was successful or not.
244
     */
245
    public static function setValue(string $key, string $value): bool
246
    {
247
        $record = self::findFirstByKey($key);
248
        if ($record === null) {
249
            $record = new self();
250
            $record->key = $key;
251
        }
252
        $record->value = $value;
253
        return $record->save();
254
    }
255
}