Completed
Push — master ( 647bff...599871 )
by Nazar
07:21
created

databases::admin_databases_get()   B

Complexity

Conditions 4
Paths 3

Size

Total Lines 26
Code Lines 20

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 20

Importance

Changes 0
Metric Value
cc 4
eloc 20
nc 3
nop 0
dl 0
loc 26
rs 8.5806
c 0
b 0
f 0
ccs 0
cts 19
cp 0
crap 20
1
<?php
2
/**
3
 * @package    CleverStyle Framework
4
 * @subpackage System module
5
 * @category   modules
6
 * @author     Nazar Mokrynskyi <[email protected]>
7
 * @copyright  Copyright (c) 2015-2016, Nazar Mokrynskyi
8
 * @license    MIT License, see license.txt
9
 */
10
namespace cs\modules\System\api\Controller\admin;
11
use
12
	cs\Config,
13
	cs\Core,
14
	cs\ExitException,
15
	cs\Language;
16
17
trait databases {
18
	/**
19
	 * Get array of databases
20
	 */
21
	public static function admin_databases_get () {
22
		$Config       = Config::instance();
23
		$Core         = Core::instance();
24
		$databases    = $Config->db;
25
		$databases[0] = array_merge(
26
			isset($databases[0]) ? $databases[0] : [],
27
			[
28
				'host'    => $Core->db_host,
29
				'type'    => $Core->db_type,
30
				'prefix'  => $Core->db_prefix,
31
				'name'    => $Core->db_name,
32
				'user'    => '',
33
				'mirrors' => []
34
			]
35
		);
36
		foreach ($databases as $i => &$db) {
37
			$db['index'] = $i;
38
			foreach ($db['mirrors'] as $j => &$mirror) {
39
				$mirror['index'] = $j;
40
			}
41
			unset($j, $mirror);
42
			$db['mirrors'] = array_values($db['mirrors']);
43
		}
44
		unset($i, $db);
45
		return array_values($databases);
46
	}
47
	/**
48
	 * Update database or database mirror settings
49
	 *
50
	 * @param \cs\Request $Request
51
	 *
52
	 * @throws ExitException
53
	 */
54
	public static function admin_databases_patch ($Request) {
55
		$data = $Request->data('host', 'type', 'prefix', 'name', 'user', 'password');
56
		if (!$data || !in_array($data['type'], static::admin_databases_get_drivers())) {
57
			throw new ExitException(400);
58
		}
59
		$Config         = Config::instance();
60
		$database_index = $Request->route_ids(0);
61
		$databases      = &$Config->db;
62
		if (!isset($databases[$database_index])) {
63
			throw new ExitException(404);
64
		}
65
		$database     = &$databases[$database_index];
66
		$mirror_index = $Request->route_ids(1);
67
		// Maybe, we are changing database mirror
68
		if ($mirror_index !== null) {
69
			if (!isset($database['mirrors'][$mirror_index])) {
70
				throw new ExitException(404);
71
			}
72
			$database = &$database['mirrors'][$mirror_index];
73
		} elseif ($database_index == 0) {
74
			throw new ExitException(400);
75
		}
76
		$database = $data + $database;
77
		if (!$Config->save()) {
78
			throw new ExitException(500);
79
		}
80
	}
81
	/**
82
	 * Create database or database mirror
83
	 *
84
	 * @param \cs\Request $Request
85
	 *
86
	 * @throws ExitException
87
	 */
88
	public static function admin_databases_post ($Request) {
89
		$data = $Request->data('mirror', 'host', 'type', 'prefix', 'name', 'user', 'password');
90
		if (!$data || !in_array($data['type'], static::admin_databases_get_drivers())) {
91
			throw new ExitException(400);
92
		}
93
		$Config         = Config::instance();
94
		$database_index = $Request->route_ids(0);
95
		$databases      = &$Config->db;
96
		// Maybe, we are adding database mirror
97
		if ($database_index !== null) {
98
			if (!isset($databases[$Request->route_ids[0]])) {
99
				throw new ExitException(404);
100
			}
101
			$databases = &$databases[$Request->route_ids[0]]['mirrors'];
102
		}
103
		$databases[] = $data;
104
		if (!$Config->save()) {
105
			throw new ExitException(500);
106
		}
107
	}
108
	/**
109
	 * Delete database or database mirror
110
	 *
111
	 * @param \cs\Request $Request
112
	 *
113
	 * @throws ExitException
114
	 */
115
	public static function admin_databases_delete ($Request) {
116
		$route_ids = $Request->route_ids;
117
		if (!isset($route_ids[0])) {
118
			throw new ExitException(400);
119
		}
120
		$Config         = Config::instance();
121
		$databases      = &$Config->db;
122
		$database_index = $route_ids[0];
123
		if (!isset($databases[$database_index])) {
124
			throw new ExitException(404);
125
		}
126
		// Maybe, we are deleting database mirror
127
		if (isset($route_ids[1])) {
128
			if (!isset($databases[$database_index]['mirrors'][$route_ids[1]])) {
129
				throw new ExitException(404);
130
			}
131
			unset($databases[$database_index]['mirrors'][$route_ids[1]]);
132
		} elseif ($database_index == 0) {
133
			throw new ExitException(400);
134
		} else {
135
			static::admin_databases_delete_check_usages($database_index);
136
			unset($databases[$database_index]);
137
		}
138
		if (!$Config->save()) {
139
			throw new ExitException(500);
140
		}
141
	}
142
	protected static function admin_databases_delete_check_usages ($database_index) {
143
		$Config  = Config::instance();
144
		$used_by = [];
145
		foreach ($Config->components['modules'] as $module => $module_data) {
146
			if (isset($module_data['db']) && is_array($module_data['db'])) {
147
				foreach ($module_data['db'] as $index) {
148
					if ($index == $database_index) {
149
						$used_by[] = $module;
150
					}
151
				}
152
			}
153
		}
154
		if ($used_by) {
155
			throw new ExitException(
156
				Language::instance()->system_admin_blocks_db_used_by_modules(implode(', ', $used_by)),
157
				409
158
			);
159
		}
160
	}
161
	/**
162
	 * Get array of available database drivers
163
	 */
164
	public static function admin_databases_drivers () {
165
		return static::admin_databases_get_drivers();
166
	}
167
	/**
168
	 * @return string[]
169
	 */
170
	protected static function admin_databases_get_drivers () {
171
		return _mb_substr(get_files_list(DIR.'/core/drivers/DB', '/^[^_].*?\.php$/i', 'f'), 0, -4);
172
	}
173
	/**
174
	 * Test database connection
175
	 *
176
	 * @param \cs\Request $Request
177
	 *
178
	 * @throws ExitException
179
	 */
180
	public static function admin_databases_test ($Request) {
181
		$data    = $Request->data('type', 'name', 'user', 'password', 'host');
182
		$drivers = static::admin_databases_get_drivers();
183
		if (!$data || !in_array($data['type'], $drivers, true)) {
184
			throw new ExitException(400);
185
		}
186
		$driver_class = "\\cs\\DB\\$data[type]";
187
		/**
188
		 * @var \cs\DB\_Abstract $connection
189
		 */
190
		$connection = new $driver_class($data['name'], $data['user'], $data['password'], $data['host']);
191
		if (!$connection->connected()) {
192
			throw new ExitException(500);
193
		}
194
	}
195
	/**
196
	 * Get database settings
197
	 */
198
	public static function admin_databases_get_settings () {
199
		$Config = Config::instance();
200
		return [
201
			'db_balance'     => $Config->core['db_balance'],
202
			'db_mirror_mode' => $Config->core['db_mirror_mode'],
203
			'applied'        => $Config->cancel_available()
204
		];
205
	}
206
	/**
207
	 * Apply database settings
208
	 *
209
	 * @param \cs\Request $Request
210
	 *
211
	 * @throws ExitException
212
	 */
213
	public static function admin_databases_apply_settings ($Request) {
214
		static::admin_databases_settings_common($Request);
215
		if (!Config::instance()->apply()) {
216
			throw new ExitException(500);
217
		}
218
	}
219
	/**
220
	 * @param \cs\Request $Request
221
	 *
222
	 * @throws ExitException
223
	 */
224
	protected static function admin_databases_settings_common ($Request) {
225
		$data = $Request->data('db_balance', 'db_mirror_mode');
226
		if (!$data) {
227
			throw new ExitException(400);
228
		}
229
		$Config                         = Config::instance();
230
		$Config->core['db_balance']     = (int)(bool)$data['db_balance'];
231
		$Config->core['db_mirror_mode'] = (int)(bool)$data['db_mirror_mode'];
232
	}
233
	/**
234
	 * Save database settings
235
	 *
236
	 * @param \cs\Request $Request
237
	 *
238
	 * @throws ExitException
239
	 */
240
	public static function admin_databases_save_settings ($Request) {
241
		static::admin_databases_settings_common($Request);
242
		if (!Config::instance()->save()) {
243
			throw new ExitException(500);
244
		}
245
	}
246
	/**
247
	 * Cancel database settings
248
	 *
249
	 * @throws ExitException
250
	 */
251
	public static function admin_databases_cancel_settings () {
252
		Config::instance()->cancel();
253
	}
254
}
255