Completed
Push — master ( 216249...401e97 )
by Maxence
03:07
created

MembersService::getMember()   A

Complexity

Conditions 2
Paths 3

Size

Total Lines 12
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
dl 0
loc 12
rs 9.4285
c 1
b 0
f 0
cc 2
eloc 8
nc 3
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\CircleTypeNotValid;
34
use OCA\Circles\Exceptions\MemberAlreadyExistsException;
35
use OCA\Circles\Exceptions\MemberDoesNotExistException;
36
use OCA\Circles\Model\Circle;
37
use \OCA\Circles\Model\Member;
38
use OCP\IL10N;
39
use OCP\IUserManager;
40
41
class MembersService {
42
43
	/** @var string */
44
	private $userId;
45
46
	/** @var IL10N */
47
	private $l10n;
48
49
	/** @var IUserManager */
50
	private $userManager;
51
52
	/** @var ConfigService */
53
	private $configService;
54
55
	/** @var CirclesMapper */
56
	private $dbCircles;
57
58
	/** @var MembersMapper */
59
	private $dbMembers;
60
61
	/** @var MiscService */
62
	private $miscService;
63
64
	public function __construct(
65
		$userId,
66
		IL10N $l10n,
67
		IUserManager $userManager,
68
		ConfigService $configService,
69
		DatabaseService $databaseService,
70
		MiscService $miscService
71
	) {
72
		$this->userId = $userId;
73
		$this->l10n = $l10n;
74
		$this->userManager = $userManager;
75
		$this->configService = $configService;
76
		$this->miscService = $miscService;
77
78
		$this->dbCircles = $databaseService->getCirclesMapper();
79
		$this->dbMembers = $databaseService->getMembersMapper();
80
	}
81
82
83
	/**
84
	 * @param $circleId
85
	 * @param $name
86
	 *
87
	 * @return array
88
	 * @throws \Exception
89
	 */
90 View Code Duplication
	public function addMember($circleId, $name) {
91
92
		try {
93
			$circle = $this->dbCircles->getDetailsFromCircle($circleId, $this->userId);
94
			$this->dbMembers->getMemberFromCircle($circleId, $this->userId)
95
							->hasToBeModerator();
96
		} catch (\Exception $e) {
97
			throw $e;
98
		}
99
100
		try {
101
			$member = $this->getFreshNewMember($circleId, $name);
102
		} catch (\Exception $e) {
103
			throw $e;
104
		}
105
		$member->inviteToCircle($circle->getType());
106
		$this->dbMembers->editMember($member);
107
108
		return $this->dbMembers->getMembersFromCircle($circleId, $circle->getUser());
109
	}
110
111
112
	/**
113
	 * getMember();
114
	 *
115
	 * Will return any data of a user related to a circle (as a Member). User can be a 'non-member'
116
	 *
117
	 * @param $circleId
118
	 * @param $userId
119
	 *
120
	 * @return Member
121
	 * @throws \Exception
122
	 */
123
	public function getMember($circleId, $userId) {
124
125
		try {
126
			$this->dbMembers->getMemberFromCircle($circleId, $this->userId)
127
							->hasToBeMember();
128
			$member = $this->dbMembers->getMemberFromCircle($circleId, $userId);
129
		} catch (\Exception $e) {
130
			throw $e;
131
		}
132
133
		return $member;
134
	}
135
136
137
	/**
138
	 * Check if a fresh member can be generated (by addMember)
139
	 *
140
	 * @param $circleId
141
	 * @param $name
142
	 *
143
	 * @return null|Member
144
	 * @throws MemberAlreadyExistsException
145
	 * @throws NoUserException
146
	 */
147
	private function getFreshNewMember($circleId, $name) {
148
149
		if (!$this->userManager->userExists($name)) {
150
			throw new NoUserException($this->l10n->t("This user does not exist"));
151
		}
152
153
		try {
154
			$member = $this->dbMembers->getMemberFromCircle($circleId, $name);
155
156
		} catch (MemberDoesNotExistException $e) {
157
			$member = new Member($this->l10n, $name, $circleId);
158
			$this->dbMembers->add($member);
159
		}
160
161
		if ($this->memberAlreadyExist($member)) {
162
			throw new MemberAlreadyExistsException(
163
				$this->l10n->t('This user is already a member of the circle')
164
			);
165
		}
166
167
		return $member;
168
	}
169
170
171
	/**
172
	 * return if member already exists
173
	 *
174
	 * @param Member $member
175
	 *
176
	 * @return bool
177
	 */
178
	private function memberAlreadyExist($member) {
179
		return ($member->getLevel() > Member::LEVEL_NONE
180
				|| ($member->getStatus() !== Member::STATUS_NONMEMBER
181
					&& $member->getStatus() !== Member::STATUS_REQUEST)
182
		);
183
	}
184
185
186
	/**
187
	 * @param $circleId
188
	 * @param $name
189
	 * @param $level
190
	 *
191
	 * @return array
192
	 * @throws \Exception
193
	 */
194
	public function levelMember($circleId, $name, $level) {
195
196
		try {
197
			$circle = $this->dbCircles->getDetailsFromCircle($circleId, $this->userId);
198
			if ($circle->getType() === Circle::CIRCLES_PERSONAL) {
199
				throw new CircleTypeNotValid(
200
					$this->l10n->t('You cannot edit level in a personal circle')
201
				);
202
			} else if ((int)$level === Member::LEVEL_OWNER) {
203
				$this->switchOwner($circleId, $name);
204
			} else {
205
				$isMod = $this->dbMembers->getMemberFromCircle($circleId, $this->userId);
206
				$isMod->hasToBeModerator();
207
				$isMod->hasToBeHigherLevel($level);
208
209
				$member = $this->dbMembers->getMemberFromCircle($circleId, $name);
210
				$member->hasToBeMember();
211
				$member->cantBeOwner();
212
				$isMod->hasToBeHigherLevel($member->getLevel());
213
214
				$member->setLevel($level);
215
				$this->dbMembers->editMember($member);
216
			}
217
218
			return $this->dbMembers->getMembersFromCircle($circleId, $circle->getUser());
219
		} catch (\Exception $e) {
220
			throw $e;
221
		}
222
223
	}
224
225
226
	public function switchOwner($circleId, $name) {
227
		try {
228
			$isMod = $this->dbMembers->getMemberFromCircle($circleId, $this->userId);
229
			$isMod->hasToBeOwner();
230
			$member = $this->dbMembers->getMemberFromCircle($circleId, $name);
231
232
			$member->setLevel(Member::LEVEL_OWNER);
233
			$this->dbMembers->editMember($member);
234
235
			$isMod->setLevel(Member::LEVEL_ADMIN);
236
			$this->dbMembers->editMember($isMod);
237
238
		} catch (\Exception $e) {
239
			throw $e;
240
		}
241
	}
242
243
244
	/**
245
	 * @param $circleId
246
	 * @param $name
247
	 *
248
	 * @return array
249
	 * @throws \Exception
250
	 */
251
	public function removeMember($circleId, $name) {
252
253
		try {
254
			$isMod = $this->dbMembers->getMemberFromCircle($circleId, $this->userId);
255
			$isMod->hasToBeModerator();
256
257
			$member = $this->dbMembers->getMemberFromCircle($circleId, $name);
258
			$member->cantBeOwner();
259
260
			$isMod->hasToBeHigherLevel($member->getLevel());
261
		} catch (\Exception $e) {
262
			throw $e;
263
		}
264
265
		$member->setStatus(Member::STATUS_NONMEMBER);
266
		$member->setLevel(Member::LEVEL_NONE);
267
		$this->dbMembers->editMember($member);
268
269
		$circle = $this->dbCircles->getDetailsFromCircle($circleId, $this->userId);
270
271
		return $this->dbMembers->getMembersFromCircle($circleId, $circle->getUser());
272
	}
273
274
275
	/**
276
	 * When a user is removed, remove him from all Circles
277
	 *
278
	 * @param $userId
279
	 */
280
	public function removeUser($userId) {
281
		$this->dbMembers->removeAllFromUserId($userId);
282
	}
283
284
285
}