Completed
Push — master ( b60009...a65047 )
by Maxence
03:07
created

MembersService   A

Complexity

Total Complexity 15

Size/Duplication

Total Lines 161
Duplicated Lines 36.02 %

Coupling/Cohesion

Components 1
Dependencies 6

Importance

Changes 4
Bugs 0 Features 0
Metric Value
wmc 15
lcom 1
cbo 6
dl 58
loc 161
rs 10
c 4
b 0
f 0

6 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 17 17 1
B getFreshNewMember() 0 22 4
A memberAlreadyExist() 0 6 3
A removeMember() 21 21 3
A addMember() 20 20 3
A removeUser() 0 3 1

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\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
	 *
163
	 * @return array
164
	 * @throws \Exception
165
	 */
166 View Code Duplication
	public function removeMember($circleId, $name) {
167
168
		try {
169
			$isMod = $this->dbMembers->getMemberFromCircle($circleId, $this->userId);
170
			$isMod->hasToBeModerator();
171
		} catch (\Exception $e) {
172
			throw $e;
173
		}
174
175
		try {
176
			$member = $this->dbMembers->getMemberFromCircle($circleId, $name);
177
			$member->cantBeOwner();
178
		} catch (\Exception $e) {
179
			throw $e;
180
		}
181
182
		$this->dbMembers->remove($member);
183
		$circle = $this->dbCircles->getDetailsFromCircle($circleId, $this->userId);
184
185
		return $this->dbMembers->getMembersFromCircle($circleId, $circle->getUser());
186
	}
187
188
189
	/**
190
	 * When a user is removed, remove him from all Circles
191
	 *
192
	 * @param $userId
193
	 */
194
	public function removeUser($userId) {
195
		$this->dbMembers->removeAllFromUserId($userId);
196
	}
197
198
199
}