Completed
Push — some-scrutinizing ( 7755b5...18fbfb )
by Maxence
03:27
created

MembersService::addMemberToCircle()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 4
rs 10
cc 1
eloc 3
nc 1
nop 1
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
		$member->inviteToCircle($circle->getType());
112
113
		$this->dbMembers->editMember($member);
114
115
		return $this->dbMembers->getMembersFromCircle($circleId, $circle->getUser());
116
	}
117
118
119
	/**
120
	 * Check if a fresh member can be generated (by addMember)
121
	 *
122
	 * @param $circleId
123
	 * @param $name
124
	 *
125
	 * @return null|Member
126
	 * @throws MemberAlreadyExistsException
127
	 * @throws NoUserException
128
	 */
129
	private function getFreshNewMember($circleId, $name) {
130
131
		if (!$this->userManager->userExists($name)) {
132
			throw new NoUserException("The selected user does not exist");
133
		}
134
135
		try {
136
			$member = $this->dbMembers->getMemberFromCircle($circleId, $name);
137
138
		} catch (MemberDoesNotExistException $e) {
139
			$member = new Member($name, $circleId);
140
			$this->dbMembers->add($member);
141
		}
142
143
		if ($this->memberAlreadyExist($member)) {
144
			throw new MemberAlreadyExistsException();
145
		}
146
147
		return $member;
148
	}
149
150
151
	/**
152
	 * return if member already exists
153
	 *
154
	 * @param $member
155
	 *
156
	 * @return bool
157
	 */
158
	private function memberAlreadyExist($member) {
159
		return ($member->getLevel() > Member::LEVEL_NONE
160
				|| ($member->getStatus() !== Member::STATUS_NONMEMBER
161
					&& $member->getStatus() !== Member::STATUS_REQUEST)
162
		);
163
	}
164
165
166
	/**
167
	 * @param $circleId
168
	 * @param $name
169
	 *
170
	 * @return array
171
	 * @throws \Exception
172
	 */
173 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...
174
175
		try {
176
			$isMod = $this->dbMembers->getMemberFromCircle($circleId, $this->userId);
177
			$isMod->hasToBeModerator();
178
		} catch (\Exception $e) {
179
			throw $e;
180
		}
181
182
		try {
183
			$member = $this->dbMembers->getMemberFromCircle($circleId, $name);
184
			$member->cantBeOwner();
185
		} catch (\Exception $e) {
186
			throw $e;
187
		}
188
189
		$this->dbMembers->remove($member);
190
		$circle = $this->dbCircles->getDetailsFromCircle($circleId, $this->userId);
191
192
		return $this->dbMembers->getMembersFromCircle($circleId, $circle->getUser());
193
	}
194
195
}