Completed
Push — some-scrutinizing ( e5bac5...edec13 )
by Maxence
02:26
created

MembersService   A

Complexity

Total Complexity 18

Size/Duplication

Total Lines 186
Duplicated Lines 20.43 %

Coupling/Cohesion

Components 1
Dependencies 6

Importance

Changes 6
Bugs 0 Features 0
Metric Value
wmc 18
c 6
b 0
f 0
lcom 1
cbo 6
dl 38
loc 186
rs 10

7 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 17 17 1
B addMember() 0 34 4
A getFreshNewMember() 0 20 4
A memberAlreadyExist() 0 6 3
A inviteMemberToPrivateCircle() 0 8 2
A addMemberToCircle() 0 4 1
A removeMember() 21 21 3

How to fix   Duplicated Code   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

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 \Exception
91
	 */
92
	public function addMember($circleId, $name) {
93
94
		// we check that this->userId is moderator
95
		try {
96
			$circle = $this->dbCircles->getDetailsFromCircle($circleId, $this->userId);
97
			$this->dbMembers->getMemberFromCircle($circleId, $this->userId)
98
							->hasToBeModerator();
99
		} catch (\Exception $e) {
100
			throw $e;
101
		}
102
103
		try {
104
			$member = $this->getFreshNewMember($circleId, $name);
105
		} catch (\Exception $e) {
106
			throw $e;
107
		}
108
109
		$member->setCircleId($circleId);
110
		$member->setUserId($name);
111
112
		switch ($circle->getType()) {
113
			case Circle::CIRCLES_PRIVATE:
114
				$this->inviteMemberToPrivateCircle($member);
115
				break;
116
117
			default:
118
				$this->addMemberToCircle($member);
119
				break;
120
		}
121
122
		$this->dbMembers->editMember($member);
123
124
		return $this->dbMembers->getMembersFromCircle($circleId, $circle->getUser());
125
	}
126
127
128
	/**
129
	 * Check if a fresh member can be generated (by addMember)
130
	 *
131
	 * @param $circleId
132
	 * @param $name
133
	 *
134
	 * @return null|Member
135
	 * @throws MemberAlreadyExistsException
136
	 * @throws NoUserException
137
	 */
138
	private function getFreshNewMember($circleId, $name) {
139
140
		if (!$this->userManager->userExists($name)) {
141
			throw new NoUserException("The selected user does not exist");
142
		}
143
144
		try {
145
			$member = $this->dbMembers->getMemberFromCircle($circleId, $name);
146
147
		} catch (MemberDoesNotExistException $e) {
148
			$member = new Member($name, $circleId);
149
			$this->dbMembers->add($member);
150
		}
151
152
		if ($this->memberAlreadyExist($member)) {
153
			throw new MemberAlreadyExistsException();
154
		}
155
156
		return $member;
157
	}
158
159
160
	/**
161
	 * return if member already exists
162
	 *
163
	 * @param $member
164
	 *
165
	 * @return bool
166
	 */
167
	private function memberAlreadyExist($member) {
168
		return ($member->getLevel() > Member::LEVEL_NONE
169
				|| ($member->getStatus() !== Member::STATUS_NONMEMBER
170
					&& $member->getStatus() !== Member::STATUS_REQUEST)
171
		);
172
	}
173
174
	/**
175
	 * Invite a Member to a private Circle, or accept his request.
176
	 *
177
	 * @param $member
178
	 */
179
	private function inviteMemberToPrivateCircle(&$member) {
180
		if ($member->getStatus() === Member::STATUS_REQUEST) {
181
			self::AddMemberToCircle($member);
182
		} else {
183
			$member->setLevel(Member::LEVEL_NONE);
184
			$member->setStatus(Member::STATUS_INVITED);
185
		}
186
	}
187
188
	/**
189
	 * add a member to a circle.
190
	 *
191
	 * @param $member
192
	 */
193
	private function addMemberToCircle(&$member) {
194
		$member->setLevel(Member::LEVEL_MEMBER);
195
		$member->setStatus(Member::STATUS_MEMBER);
196
	}
197
198
199
	/**
200
	 * @param $circleId
201
	 * @param $name
202
	 *
203
	 * @return array
204
	 * @throws \Exception
205
	 */
206 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...
207
208
		try {
209
			$isMod = $this->dbMembers->getMemberFromCircle($circleId, $this->userId);
210
			$isMod->hasToBeModerator();
211
		} catch (\Exception $e) {
212
			throw $e;
213
		}
214
215
		try {
216
			$member = $this->dbMembers->getMemberFromCircle($circleId, $name);
217
			$member->cantBeOwner();
218
		} catch (\Exception $e) {
219
			throw $e;
220
		}
221
222
		$this->dbMembers->remove($member);
223
		$circle = $this->dbCircles->getDetailsFromCircle($circleId, $this->userId);
224
225
		return $this->dbMembers->getMembersFromCircle($circleId, $circle->getUser());
226
	}
227
228
}