Completed
Pull Request — master (#362)
by Maxence
01:40
created

MemberLevel   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 97
Duplicated Lines 0 %

Coupling/Cohesion

Components 2
Dependencies 7

Importance

Changes 0
Metric Value
wmc 7
lcom 2
cbo 7
dl 0
loc 97
rs 10
c 0
b 0
f 0

4 Methods

Rating   Name   Duplication   Size   Complexity  
A verify() 0 21 3
A manage() 0 15 2
A verifyMemberLevel() 0 11 1
A verifySwitchOwner() 0 9 1
1
<?php declare(strict_types=1);
2
3
4
/**
5
 * Circles - Bring cloud-users closer together.
6
 *
7
 * This file is licensed under the Affero General Public License version 3 or
8
 * later. See the COPYING file.
9
 *
10
 * @author Maxence Lange <[email protected]>
11
 * @copyright 2017
12
 * @license GNU AGPL version 3 or any later version
13
 *
14
 * This program is free software: you can redistribute it and/or modify
15
 * it under the terms of the GNU Affero General Public License as
16
 * published by the Free Software Foundation, either version 3 of the
17
 * License, or (at your option) any later version.
18
 *
19
 * This program is distributed in the hope that it will be useful,
20
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22
 * GNU Affero General Public License for more details.
23
 *
24
 * You should have received a copy of the GNU Affero General Public License
25
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
26
 *
27
 */
28
29
30
namespace OCA\Circles\GlobalScale;
31
32
33
use Exception;
34
use OCA\Circles\Exceptions\CircleDoesNotExistException;
35
use OCA\Circles\Exceptions\ConfigNoCircleAvailableException;
36
use OCA\Circles\Exceptions\GlobalScaleDSyncException;
37
use OCA\Circles\Exceptions\GlobalScaleEventException;
38
use OCA\Circles\Exceptions\MemberTypeCantEditLevelException;
39
use OCA\Circles\Model\Circle;
40
use OCA\Circles\Model\GlobalScale\GSEvent;
41
use OCA\Circles\Model\Member;
42
43
44
/**
45
 * Class MemberLevel
46
 *
47
 * @package OCA\Circles\GlobalScale
48
 */
49
class MemberLevel extends AGlobalScaleEvent {
50
51
52
	/**
53
	 * @param GSEvent $event
54
	 * @param bool $localCheck
55
	 *
56
	 * @param bool $mustBeChecked
57
	 *
58
	 * @throws CircleDoesNotExistException
59
	 * @throws ConfigNoCircleAvailableException
60
	 * @throws GlobalScaleDSyncException
61
	 * @throws GlobalScaleEventException
62
	 * @throws MemberTypeCantEditLevelException
63
	 * @throws Exception
64
	 */
65
	public function verify(GSEvent $event, bool $localCheck = false, bool $mustBeChecked = true): void {
66
		parent::verify($event, $localCheck, true);
67
68
		$member = $event->getMember();
69
		$level = $event->getData()
70
					   ->gInt('level');
71
		if ($member->getLevel() === $level) {
72
			return;
73
		}
74
75
		$member->levelHasToBeEditable();
76
77
		$circle = $event->getCircle();
78
		if ($level === Member::LEVEL_OWNER) {
79
			$this->verifySwitchOwner($circle, $member);
80
		} else {
81
			$this->verifyMemberLevel($circle, $member, $level);
82
		}
83
84
		$event->setMember($member);
85
	}
86
87
88
	/**
89
	 * @param GSEvent $event
90
	 *
91
	 * @throws Exception
92
	 */
93
	public function manage(GSEvent $event): void {
94
		$member = $event->getMember();
95
		$level = $event->getData()
96
					   ->gInt('level');
97
		if ($member->getLevel() === $level) {
98
			return;
99
		}
100
101
		$this->membersRequest->updateMember($member);
102
103
		$circle = $event->getCircle();
104
		$isMod = $circle->getHigherViewer();
105
		$isMod->setLevel(Member::LEVEL_ADMIN);
106
		$this->membersRequest->updateMember($isMod);
107
	}
108
109
110
	/**
111
	 * @param Circle $circle
112
	 * @param Member $member
113
	 * @param $level
114
	 *
115
	 * @throws Exception
116
	 */
117
	private function verifyMemberLevel(Circle $circle, Member &$member, $level) {
118
		$isMod = $circle->getHigherViewer();
119
		$isMod->hasToBeModerator();
120
		$isMod->hasToBeHigherLevel($level);
121
122
		$member->hasToBeMember();
123
		$member->cantBeOwner();
124
		$isMod->hasToBeHigherLevel($member->getLevel());
125
126
		$member->setLevel($level);
127
	}
128
129
	/**
130
	 * @param Circle $circle
131
	 * @param Member $member
132
	 *
133
	 * @throws Exception
134
	 */
135
	private function verifySwitchOwner(Circle $circle, Member &$member) {
136
		$isMod = $circle->getHigherViewer();
137
		$this->circlesService->hasToBeOwner($isMod);
138
139
		$member->hasToBeMember();
140
		$member->cantBeOwner();
141
142
		$member->setLevel(Member::LEVEL_OWNER);
143
	}
144
145
}
146
147