Passed
Push — developer ( dedd13...2a4a55 )
by Mariusz
14:30
created

Settings_Log_LogsViewer_Action   A

Complexity

Total Complexity 24

Size/Duplication

Total Lines 88
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 24
eloc 65
dl 0
loc 88
rs 10
c 0
b 0
f 0
1
<?php
2
3
/**
4
 * Settings log viewer action file.
5
 *
6
 * @package   Action
7
 *
8
 * @copyright YetiForce S.A.
9
 * @license   YetiForce Public License 5.0 (licenses/LicenseEN.txt or yetiforce.com)
10
 * @author    Arkadiusz Sołek <[email protected]>
11
 * @author    Mariusz Krzaczkowski <[email protected]>
12
 */
13
/**
14
 * Settings log viewer action class.
15
 */
16
class Settings_Log_LogsViewer_Action extends Settings_Vtiger_Basic_Action
17
{
18
	/** {@inheritdoc} */
19
	public function process(App\Request $request)
20
	{
21
		$type = $request->getByType('type');
22
		if (!isset(\App\Log::LOGS_VIEWER_COLUMN_MAP[$type])) {
23
			throw new \App\Exceptions\NoPermittedForAdmin('ERR_ILLEGAL_VALUE');
24
		}
25
		$rows = $columns = [];
26
		foreach ($request->getArray('columns') as $key => $value) {
27
			$columns[$key] = $value['name'];
28
		}
29
		$mapping = \App\Log::LOGS_VIEWER_COLUMN_MAP[$type];
30
		if (\App\Db::getInstance()->isTableExists($mapping['table'])) {
31
			$query = (new \App\Db\Query())->from($mapping['table']);
32
			$logsCountAll = (int) $query->count('*');
33
			$this->loadFilter($request, $mapping['filter'], $query);
34
			$count = (int) $query->count('*');
35
			$query->limit($request->getInteger('length'))->offset($request->getInteger('start'));
36
			$order = current($request->getArray('order', App\Purifier::ALNUM));
37
			if ($order && isset($columns[$order['column']], $mapping['columns'][$columns[$order['column']]])) {
38
				$query->orderBy([$columns[$order['column']] => \App\Db::ASC === strtoupper($order['dir']) ? \SORT_ASC : \SORT_DESC]);
39
			}
40
			$dataReader = $query->createCommand()->query();
41
			while ($row = $dataReader->read()) {
42
				$r = [];
43
				foreach ($mapping['columns'] as $key => $value) {
44
					switch ($value['type']) {
45
						case 'DateTime':
46
							$r[] = \App\Fields\DateTime::formatToDisplay($row[$key]);
47
							break;
48
						case 'Date':
49
							$r[] = \App\Fields\Date::formatToDisplay($row[$key]);
50
							break;
51
						case 'Text':
52
							$r[] = $row[$key] ? \App\Layout::truncateText($row[$key], 50, true) : '';
53
							break;
54
						case 'Owner':
55
							$r[] = \App\Fields\Owner::getUserLabel($row[$key]);
56
							break;
57
						case 'Reference':
58
							$r[] = \App\Record::getLabel($row[$key]);
59
							break;
60
						case 'Boolean':
61
							$r[] = \App\Language::translate(empty($row[$key]) ? 'LBL_NO' : 'LBL_YES');
62
							break;
63
						default:
64
							break;
65
					}
66
				}
67
				$rows[] = $r;
68
			}
69
			$dataReader->close();
70
		}
71
		header('content-type: text/json; charset=UTF-8');
72
		echo \App\Json::encode([
73
			'draw' => $request->getInteger('draw'),
74
			'iTotalRecords' => $logsCountAll ?? 0,
75
			'iTotalDisplayRecords' => $count ?? 0,
76
			'aaData' => $rows
77
		]);
78
	}
79
80
	/**
81
	 * Load filter.
82
	 *
83
	 * @param App\Request  $request
84
	 * @param array        $filter
85
	 * @param App\Db\Query $query
86
	 */
87
	public function loadFilter(App\Request $request, array $filter, App\Db\Query &$query)
0 ignored issues
show
Bug introduced by
A parse error occurred: Syntax error, unexpected T_VARIABLE, expecting T_STRING or T_NAME_QUALIFIED or T_NAME_FULLY_QUALIFIED or T_NAME_RELATIVE on line 87 at column 79
Loading history...
88
	{
89
		foreach ($filter as $key => $value) {
90
			if ($request->has($key) && '' !== $request->getRaw($key)) {
91
				switch ($value) {
92
					case 'DateTimeRange':
93
						$range = $request->getByType($key, 'DateRangeUserFormat');
94
						$query->andWhere(['between', $key, $range[0] . ' 00:00:00', $range[1] . ' 23:59:59']);
95
						break;
96
					case 'Text':
97
						$query->andWhere(['like', $key, $request->getByType($key, 'Text')]);
98
						break;
99
					case 'Boolean':
100
						$query->andWhere([$key => $request->getInteger($key)]);
101
						break;
102
					default:
103
						break;
104
				}
105
			}
106
		}
107
	}
108
}
109