Passed
Push — developer ( 5f736c...9195d5 )
by Mariusz
18:14
created

Vtiger_Calendar_Action::checkPermission()   C

Complexity

Conditions 12
Paths 7

Size

Total Lines 18
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 13
c 0
b 0
f 0
dl 0
loc 18
rs 6.9666
cc 12
nc 7
nop 1

How to fix   Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
/**
4
 * Calendar actions 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   	Radosław Skrzypczak <[email protected]>
11
 * @author    	Mariusz Krzaczkowski <[email protected]>
12
 */
13
/**
14
 * Calendar actions class.
15
 */
16
class Vtiger_Calendar_Action extends \App\Controller\Action
17
{
18
	use \App\Controller\ExposeMethod;
19
20
	/**
21
	 * Function to check permission.
22
	 *
23
	 * @param \App\Request $request
24
	 *
25
	 * @throws \App\Exceptions\NoPermitted
26
	 */
27
	public function checkPermission(App\Request $request)
28
	{
29
		$moduleName = $request->getModule();
30
		$privileges = Users_Privileges_Model::getCurrentUserPrivilegesModel();
31
		if (!$privileges->hasModulePermission($moduleName) || !\method_exists(Vtiger_Module_Model::getInstance($moduleName), 'getCalendarViewUrl')) {
0 ignored issues
show
Bug introduced by
$moduleName of type string is incompatible with the type integer expected by parameter $mixed of Users_Privileges_Model::hasModulePermission(). ( Ignorable by Annotation )

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

31
		if (!$privileges->hasModulePermission(/** @scrutinizer ignore-type */ $moduleName) || !\method_exists(Vtiger_Module_Model::getInstance($moduleName), 'getCalendarViewUrl')) {
Loading history...
32
			throw new \App\Exceptions\NoPermitted('LBL_PERMISSION_DENIED', 406);
33
		}
34
		if ('updateEvent' === $request->getMode() && ($request->isEmpty('id', true) || !\App\Privilege::isPermitted($moduleName, 'EditView', $request->getInteger('id')))) {
35
			throw new \App\Exceptions\NoPermittedToRecord('ERR_NO_PERMISSIONS_FOR_THE_RECORD', 406);
36
		}
37
		if ('saveExtraSources' === $request->getMode() || 'deleteExtraSources' === $request->getMode()) {
38
			if ($privileges->hasModuleActionPermission($moduleName, 'CalendarExtraSources')) {
39
				throw new \App\Exceptions\NoPermitted('ERR_ILLEGAL_VALUE');
40
			}
41
			if (!$request->isEmpty('id')) {
42
				$source = Vtiger_CalendarExtSource_Model::getInstanceById($request->getInteger('id'));
43
				if (!$privileges->isAdminUser() && $source->get('user_id') != $privileges->getId()) {
44
					throw new \App\Exceptions\NoPermitted('ERR_NO_PERMISSIONS_FOR_THE_RECORD', 406);
45
				}
46
			}
47
		}
48
	}
49
50
	/** {@inheritdoc} */
51
	public function __construct()
52
	{
53
		parent::__construct();
54
		$this->exposeMethod('getEvents');
55
		$this->exposeMethod('getEventsYear');
56
		$this->exposeMethod('updateEvent');
57
		$this->exposeMethod('getCountEventsGroup');
58
		$this->exposeMethod('pinOrUnpinUser');
59
		$this->exposeMethod('saveExtraSources');
60
		$this->exposeMethod('deleteExtraSources');
61
	}
62
63
	public function getEvents(App\Request $request)
64
	{
65
		$record = $this->getCalendarModel($request);
66
		$entity = array_merge($record->getEntity(), $record->getPublicHolidays(), $record->getExtraSources());
67
		$response = new Vtiger_Response();
68
		$response->setResult($entity);
69
		$response->emit();
70
	}
71
72
	/**
73
	 * Get count Events for extended calendar's left column.
74
	 *
75
	 * @param \App\Request $request
76
	 */
77
	public function getCountEventsGroup(App\Request $request)
78
	{
79
		$request->delete('end');
80
		$record = $this->getCalendarModel($request);
81
		$result = [];
82
		foreach ($request->getArray('dates', 'date') as $datePair) {
83
			$record->set('start', App\Fields\DateTime::formatToDisplay($datePair[0] . ' 00:00:00'));
84
			$record->set('end', App\Fields\DateTime::formatToDisplay($datePair[1] . ' 23:59:59'));
85
			$result[] = $record->getEntityRecordsCount() + $record->getExtraSourcesCount();
86
		}
87
		$response = new Vtiger_Response();
88
		$response->setResult($result);
89
		$response->emit();
90
	}
91
92
	/**
93
	 * Get calendar model.
94
	 *
95
	 * @param App\Request $request
96
	 *
97
	 * @return Vtiger_Calendar_Model
98
	 */
99
	public function getCalendarModel(App\Request $request): Vtiger_Calendar_Model
100
	{
101
		$record = Vtiger_Calendar_Model::getInstance($request->getModule());
102
		$record->set('user', $request->getArray('user', 'Alnum'));
103
		$record->set('types', $request->getArray('types', 'Text'));
104
		$record->set('time', $request->isEmpty('time') ? '' : $request->getByType('time'));
105
		if ($request->has('start') && $request->has('end')) {
106
			$record->set('start', $request->getByType('start', 'DateInUserFormat'));
107
			$record->set('end', $request->getByType('end', 'DateInUserFormat'));
108
		}
109
		if ($request->has('filters')) {
110
			$record->set('filters', $request->getByType('filters', 'Alnum'));
111
		}
112
		if ($request->has('cvid')) {
113
			$record->set('customFilter', $request->getInteger('cvid'));
114
		}
115
		if ($request->has('extraSources')) {
116
			$record->set('extraSources', $request->getArray('extraSources', 'Integer'));
117
		}
118
		return $record;
119
	}
120
121
	/**
122
	 * Update event.
123
	 *
124
	 * @param App\Request $request
125
	 */
126
	public function updateEvent(App\Request $request)
127
	{
128
		$record = Vtiger_Calendar_Model::getInstance($request->getModule());
129
		$success = $record->updateEvent($request->getInteger('id'), $request->getByType('start', 'dateTimeInUserFormat'), $request->getByType('end', 'dateTimeInUserFormat'), $request);
130
		$response = new Vtiger_Response();
131
		$response->setResult($success);
132
		$response->emit();
133
	}
134
135
	/**
136
	 * Get count Events for extended calendar's left column.
137
	 *
138
	 * @param App\Request $request
139
	 *
140
	 * @return void
141
	 */
142
	public function pinOrUnpinUser(App\Request $request): void
143
	{
144
		$db = \App\Db::getInstance();
145
		$userId = \App\User::getCurrentUserId();
146
		if (!$request->isEmpty('element_id')) {
147
			$id = $request->getInteger('element_id');
148
			if (\App\User::isExists($id)) {
149
				$users = Vtiger_CalendarRightPanel_Model::getFavoriteUsers($request->getModule());
150
				if (empty($users[$id])) {
151
					$db->createCommand()->insert('u_#__users_pinned', [
152
						'user_id' => $userId,
153
						'tabid' => \App\Module::getModuleId($request->getModule()),
154
						'fav_id' => $id,
155
					])->execute();
156
					$result = 'pin';
157
				} else {
158
					$db->createCommand()->delete('u_#__users_pinned', ['id' => $users[$id]])->execute();
159
					$result = 'unpin';
160
				}
161
				\App\Cache::delete('FavoriteUsers', $userId);
162
			}
163
		}
164
		$response = new Vtiger_Response();
165
		$response->setResult($result);
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable $result does not seem to be defined for all execution paths leading up to this point.
Loading history...
166
		$response->emit();
167
	}
168
169
	/**
170
	 * Save extra sources.
171
	 *
172
	 * @param App\Request $request
173
	 *
174
	 * @return void
175
	 */
176
	public static function saveExtraSources(App\Request $request): void
177
	{
178
		$model = Vtiger_CalendarExtSource_Model::getCleanInstance($request->getModule());
179
		$model->setData([
180
			'id' => $request->isEmpty('id', true) ? 0 : $request->getInteger('id'),
181
			'label' => $request->getByType('label', \App\Purifier::TEXT),
182
			'base_module' => $request->getInteger('base_module'),
183
			'target_module' => $request->getInteger('target_module'),
184
			'type' => $request->getInteger('type'),
185
			'public' => $request->getBoolean('public') ? 1 : 0,
186
			'include_filters' => $request->getBoolean('include_filters') ? 1 : 0,
187
			'color' => $request->isEmpty('color', true) ? '' : $request->getByType('color', 'Color'),
188
			'custom_view' => $request->getInteger('custom_view'),
189
			'fieldid_a_date' => $request->getInteger('fieldid_a_date'),
190
			'fieldid_a_time' => $request->isEmpty('fieldid_a_time', true) ? 0 : $request->getInteger('fieldid_a_time'),
191
			'fieldid_b_date' => $request->isEmpty('fieldid_b_date', true) ? 0 : $request->getInteger('fieldid_b_date'),
192
			'fieldid_b_time' => $request->isEmpty('fieldid_b_time', true) ? 0 : $request->getInteger('fieldid_b_time'),
193
		]);
194
		$response = new Vtiger_Response();
195
		$response->setResult($model->save());
196
		$response->emit();
197
	}
198
199
	/**
200
	 * Delete extra sources.
201
	 *
202
	 * @param App\Request $request
203
	 *
204
	 * @return void
205
	 */
206
	public static function deleteExtraSources(App\Request $request): void
207
	{
208
		$response = new Vtiger_Response();
209
		$response->setResult(Vtiger_CalendarExtSource_Model::getInstanceById($request->getInteger('id'))->delete());
210
		$response->emit();
211
	}
212
}
213