Completed
Push — master ( 113154...113154 )
by Maxence
11s
created

MembersService::memberAlreadyExist()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 6
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
dl 0
loc 6
rs 9.4285
c 1
b 0
f 0
cc 3
eloc 4
nc 3
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\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("The selected 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)) {
0 ignored issues
show
Bug introduced by
It seems like $member defined by $this->dbMembers->getMem...ircle($circleId, $name) on line 127 can be null; however, OCA\Circles\Service\Memb...e::memberAlreadyExist() does not accept null, maybe add an additional type check?

Unless you are absolutely sure that the expression can never be null because of other conditions, we strongly recommend to add an additional type check to your code:

/** @return stdClass|null */
function mayReturnNull() { }

function doesNotAcceptNull(stdClass $x) { }

// With potential error.
function withoutCheck() {
    $x = mayReturnNull();
    doesNotAcceptNull($x); // Potential error here.
}

// Safe - Alternative 1
function withCheck1() {
    $x = mayReturnNull();
    if ( ! $x instanceof stdClass) {
        throw new \LogicException('$x must be defined.');
    }
    doesNotAcceptNull($x);
}

// Safe - Alternative 2
function withCheck2() {
    $x = mayReturnNull();
    if ($x instanceof stdClass) {
        doesNotAcceptNull($x);
    }
}
Loading history...
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
}