Completed
Push — some-scrutinizing ( 29b6ab...e5bac5 )
by Maxence
18:16
created

MembersService::removeMember()   A

Complexity

Conditions 3
Paths 5

Size

Total Lines 21
Code Lines 14

Duplication

Lines 21
Ratio 100 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
dl 21
loc 21
rs 9.3142
c 1
b 0
f 0
cc 3
eloc 14
nc 5
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\CircleDoesNotExistException;
34
use OCA\Circles\Exceptions\MemberAlreadyExistsException;
35
use OCA\Circles\Exceptions\MemberDoesNotExistException;
36
use OCA\Circles\Exceptions\MemberIsNotModeratorException;
37
use OCA\Circles\Exceptions\MemberIsOwnerException;
38
use \OCA\Circles\Model\Circle;
39
use \OCA\Circles\Model\Member;
40
use OCP\IL10N;
41
use OCP\IUserManager;
42
43
class MembersService {
44
45
	/** @var string */
46
	private $userId;
47
48
	/** @var IL10N */
49
	private $l10n;
50
51
	/** @var IUserManager */
52
	private $userManager;
53
54
	/** @var ConfigService */
55
	private $configService;
56
57
	/** @var CirclesMapper */
58
	private $dbCircles;
59
60
	/** @var MembersMapper */
61
	private $dbMembers;
62
63
	/** @var MiscService */
64
	private $miscService;
65
66 View Code Duplication
	public function __construct(
67
		$userId,
68
		IL10N $l10n,
69
		IUserManager $userManager,
70
		ConfigService $configService,
71
		DatabaseService $databaseService,
72
		MiscService $miscService
73
	) {
74
		$this->userId = $userId;
75
		$this->l10n = $l10n;
76
		$this->userManager = $userManager;
77
		$this->configService = $configService;
78
		$this->miscService = $miscService;
79
80
		$this->dbCircles = $databaseService->getCirclesMapper();
81
		$this->dbMembers = $databaseService->getMembersMapper();
82
	}
83
84
85
	/**
86
	 * @param $circleId
87
	 * @param $name
88
	 *
89
	 * @return array
90
	 * @throws CircleDoesNotExistException
91
	 * @throws MemberAlreadyExistsException
92
	 * @throws MemberDoesNotExistException
93
	 * @throws MemberIsNotModeratorException
94
	 * @throws NoUserException
95
	 */
96
	public function addMember($circleId, $name) {
97
98
		if (!$this->userManager->userExists($name)) {
99
			throw new NoUserException("The selected user does not exist");
100
		}
101
102
		// we check that this->userId is moderator
103
		try {
104
			$this->dbMembers->getMemberFromCircle($circleId, $this->userId)
105
							->hasToBeModerator();
106
		} catch (MemberDoesNotExistException $e) {
107
			throw $e;
108
		} catch (MemberIsNotModeratorException $e) {
109
			throw new MemberIsNotModeratorException("You are not moderator of this circle");
110
		}
111
112
		try {
113
			$member = $this->dbMembers->getMemberFromCircle($circleId, $name);
114
115
		} catch (MemberDoesNotExistException $e) {
116
			$member = new Member();
117
			$member->setCircleId($circleId);
118
			$member->setUserId($name);
119
			$member->setLevel(Member::LEVEL_NONE);
120
			$member->setStatus(Member::STATUS_NONMEMBER);
121
122
			$this->dbMembers->add($member);
123
		}
124
125
		try {
126
			$circle = $this->dbCircles->getDetailsFromCircle($this->userId, $circleId);
127
		} catch (CircleDoesNotExistException $e) {
128
			throw $e;
129
		}
130
131
		if ($this->memberAlreadyExist($member)) {
132
			throw new MemberAlreadyExistsException();
133
		}
134
135
		$member->setCircleId($circleId);
136
		$member->setUserId($name);
137
138
		switch ($circle->getType()) {
139
			case Circle::CIRCLES_PRIVATE:
140
				$this->inviteMemberToPrivateCircle($member);
141
				break;
142
143
			default:
144
				$this->addMemberToCircle($member);
145
				break;
146
		}
147
148
		$this->dbMembers->editMember($member);
149
150
		return $this->dbMembers->getMembersFromCircle($circleId, $circle->getUser());
151
	}
152
153
154
	/**
155
	 * return if member already exists
156
	 *
157
	 * @param $member
158
	 *
159
	 * @return bool
160
	 */
161
	private function memberAlreadyExist($member) {
162
		return ($member->getLevel() > Member::LEVEL_NONE
163
				|| ($member->getStatus() !== Member::STATUS_NONMEMBER
164
					&& $member->getStatus() !== Member::STATUS_REQUEST)
165
		);
166
	}
167
168
	/**
169
	 * Invite a Member to a private Circle, or accept his request.
170
	 *
171
	 * @param $member
172
	 */
173
	private function inviteMemberToPrivateCircle(&$member) {
174
		if ($member->getStatus() === Member::STATUS_REQUEST) {
175
			self::AddMemberToCircle($member);
176
		} else {
177
			$member->setLevel(Member::LEVEL_NONE);
178
			$member->setStatus(Member::STATUS_INVITED);
179
		}
180
	}
181
182
	/**
183
	 * add a member to a circle.
184
	 *
185
	 * @param $member
186
	 */
187
	private function addMemberToCircle(&$member) {
188
		$member->setLevel(Member::LEVEL_MEMBER);
189
		$member->setStatus(Member::STATUS_MEMBER);
190
	}
191
192
193
	/**
194
	 * @param $circleId
195
	 * @param $name
196
	 *
197
	 * @return array
198
	 * @throws \Exception
199
	 */
200 View Code Duplication
	public function removeMember($circleId, $name) {
1 ignored issue
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
201
202
		try {
203
			$isMod = $this->dbMembers->getMemberFromCircle($circleId, $this->userId);
204
			$isMod->hasToBeModerator();
205
		} catch (\Exception $e) {
206
			throw $e;
207
		}
208
209
		try {
210
			$member = $this->dbMembers->getMemberFromCircle($circleId, $name);
211
			$member->cantBeOwner();
212
		} catch (\Exception $e) {
213
			throw $e;
214
		}
215
216
		$this->dbMembers->remove($member);
217
		$circle = $this->dbCircles->getDetailsFromCircle($this->userId, $circleId);
218
219
		return $this->dbMembers->getMembersFromCircle($circleId, $circle->getUser());
220
	}
221
222
}