Completed
Push — master ( 809444...363a27 )
by Maxence
05:40 queued 02:26
created

MembersService::switchOwner()   A

Complexity

Conditions 2
Paths 8

Size

Total Lines 16
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 16
rs 9.4285
c 0
b 0
f 0
cc 2
eloc 11
nc 8
nop 2
1
<?php
2
/**
3
 * Circles - bring cloud-users closer
4
 *
5
 * This file is licensed under the Affero General Public License version 3 or
6
 * later. See the COPYING file.
7
 *
8
 * @author Maxence Lange <[email protected]>
9
 * @copyright 2017
10
 * @license GNU AGPL version 3 or any later version
11
 *
12
 * This program is free software: you can redistribute it and/or modify
13
 * it under the terms of the GNU Affero General Public License as
14
 * published by the Free Software Foundation, either version 3 of the
15
 * License, or (at your option) any later version.
16
 *
17
 * This program is distributed in the hope that it will be useful,
18
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20
 * GNU Affero General Public License for more details.
21
 *
22
 * You should have received a copy of the GNU Affero General Public License
23
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
24
 *
25
 */
26
27
namespace OCA\Circles\Service;
28
29
30
use OC\User\NoUserException;
31
use OCA\Circles\Db\CirclesMapper;
32
use OCA\Circles\Db\MembersMapper;
33
use OCA\Circles\Exceptions\MemberAlreadyExistsException;
34
use OCA\Circles\Exceptions\MemberDoesNotExistException;
35
use \OCA\Circles\Model\Member;
36
use OCP\IL10N;
37
use OCP\IUserManager;
38
39
class MembersService {
40
41
	/** @var string */
42
	private $userId;
43
44
	/** @var IL10N */
45
	private $l10n;
46
47
	/** @var IUserManager */
48
	private $userManager;
49
50
	/** @var ConfigService */
51
	private $configService;
52
53
	/** @var CirclesMapper */
54
	private $dbCircles;
55
56
	/** @var MembersMapper */
57
	private $dbMembers;
58
59
	/** @var MiscService */
60
	private $miscService;
61
62 View Code Duplication
	public function __construct(
63
		$userId,
64
		IL10N $l10n,
65
		IUserManager $userManager,
66
		ConfigService $configService,
67
		DatabaseService $databaseService,
68
		MiscService $miscService
69
	) {
70
		$this->userId = $userId;
71
		$this->l10n = $l10n;
72
		$this->userManager = $userManager;
73
		$this->configService = $configService;
74
		$this->miscService = $miscService;
75
76
		$this->dbCircles = $databaseService->getCirclesMapper();
77
		$this->dbMembers = $databaseService->getMembersMapper();
78
	}
79
80
81
	/**
82
	 * @param $circleId
83
	 * @param $name
84
	 *
85
	 * @return array
86
	 * @throws \Exception
87
	 */
88 View Code Duplication
	public function addMember($circleId, $name) {
89
90
		try {
91
			$circle = $this->dbCircles->getDetailsFromCircle($circleId, $this->userId);
92
			$this->dbMembers->getMemberFromCircle($circleId, $this->userId)
93
							->hasToBeModerator();
94
		} catch (\Exception $e) {
95
			throw $e;
96
		}
97
98
		try {
99
			$member = $this->getFreshNewMember($circleId, $name);
100
		} catch (\Exception $e) {
101
			throw $e;
102
		}
103
		$member->inviteToCircle($circle->getType());
104
		$this->dbMembers->editMember($member);
105
106
		return $this->dbMembers->getMembersFromCircle($circleId, $circle->getUser());
107
	}
108
109
110
	/**
111
	 * Check if a fresh member can be generated (by addMember)
112
	 *
113
	 * @param $circleId
114
	 * @param $name
115
	 *
116
	 * @return null|Member
117
	 * @throws MemberAlreadyExistsException
118
	 * @throws NoUserException
119
	 */
120
	private function getFreshNewMember($circleId, $name) {
121
122
		if (!$this->userManager->userExists($name)) {
123
			throw new NoUserException($this->l10n->t("This user does not exist"));
124
		}
125
126
		try {
127
			$member = $this->dbMembers->getMemberFromCircle($circleId, $name);
128
129
		} catch (MemberDoesNotExistException $e) {
130
			$member = new Member($this->l10n, $name, $circleId);
131
			$this->dbMembers->add($member);
132
		}
133
134
		if ($this->memberAlreadyExist($member)) {
135
			throw new MemberAlreadyExistsException(
136
				$this->l10n->t('This user is already a member of the circle')
137
			);
138
		}
139
140
		return $member;
141
	}
142
143
144
	/**
145
	 * return if member already exists
146
	 *
147
	 * @param Member $member
148
	 *
149
	 * @return bool
150
	 */
151
	private function memberAlreadyExist($member) {
152
		return ($member->getLevel() > Member::LEVEL_NONE
153
				|| ($member->getStatus() !== Member::STATUS_NONMEMBER
154
					&& $member->getStatus() !== Member::STATUS_REQUEST)
155
		);
156
	}
157
158
159
	/**
160
	 * @param $circleId
161
	 * @param $name
162
	 * @param $level
163
	 *
164
	 * @return array
165
	 * @throws \Exception
166
	 */
167
	public function levelMember($circleId, $name, $level) {
168
169
		try {
170
			if ((int)$level === Member::LEVEL_OWNER) {
171
				$this->switchOwner($circleId, $name);
172
			} else {
173
				$isMod = $this->dbMembers->getMemberFromCircle($circleId, $this->userId);
174
				$isMod->hasToBeModerator();
175
				$isMod->hasToBeHigherLevel($level);
176
177
				$member = $this->dbMembers->getMemberFromCircle($circleId, $name);
178
				$member->cantBeOwner();
179
				$isMod->hasToBeHigherLevel($member->getLevel());
180
181
				$member->setLevel($level);
182
				$this->dbMembers->editMember($member);
183
			}
184
		} catch (\Exception $e) {
185
			throw $e;
186
		}
187
		$circle = $this->dbCircles->getDetailsFromCircle($circleId, $this->userId);
188
189
		return $this->dbMembers->getMembersFromCircle($circleId, $circle->getUser());
190
	}
191
192
193
	public function switchOwner($circleId, $name) {
194
		try {
195
			$isMod = $this->dbMembers->getMemberFromCircle($circleId, $this->userId);
196
			$isMod->hasToBeOwner();
197
			$member = $this->dbMembers->getMemberFromCircle($circleId, $name);
198
199
			$member->setLevel(Member::LEVEL_OWNER);
200
			$this->dbMembers->editMember($member);
201
202
			$isMod->setLevel(Member::LEVEL_ADMIN);
203
			$this->dbMembers->editMember($isMod);
204
205
		} catch (\Exception $e) {
206
			throw $e;
207
		}
208
	}
209
210
211
	/**
212
	 * @param $circleId
213
	 * @param $name
214
	 *
215
	 * @return array
216
	 * @throws \Exception
217
	 */
218
	public function removeMember($circleId, $name) {
219
220
		try {
221
			$isMod = $this->dbMembers->getMemberFromCircle($circleId, $this->userId);
222
			$isMod->hasToBeModerator();
223
224
			$member = $this->dbMembers->getMemberFromCircle($circleId, $name);
225
			$member->cantBeOwner();
226
227
			$isMod->hasToBeHigherLevel($member->getLevel());
228
		} catch (\Exception $e) {
229
			throw $e;
230
		}
231
232
		$this->dbMembers->remove($member);
233
		$circle = $this->dbCircles->getDetailsFromCircle($circleId, $this->userId);
234
235
		return $this->dbMembers->getMembersFromCircle($circleId, $circle->getUser());
236
	}
237
238
239
	/**
240
	 * When a user is removed, remove him from all Circles
241
	 *
242
	 * @param $userId
243
	 */
244
	public function removeUser($userId) {
245
		$this->dbMembers->removeAllFromUserId($userId);
246
	}
247
248
249
}