Completed
Push — some-scrutinizing ( c6cac2...cfec76 )
by Maxence
02:21
created

MembersMapper::add()   A

Complexity

Conditions 2
Paths 4

Size

Total Lines 15
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 15
rs 9.4285
cc 2
eloc 12
nc 4
nop 1
1
<?php
2
/**
3
 * Circles - Bring cloud-users closer together.
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\Db;
28
29
use Doctrine\DBAL\Exception\UniqueConstraintViolationException;
30
use OCA\Circles\Exceptions\MemberAlreadyExistsException;
31
use OCA\Circles\Exceptions\MemberDoesNotExistException;
32
use OCA\Circles\Model\Circle;
33
use OCA\Circles\Model\Member;
34
35
use OCP\IDBConnection;
36
use OCP\AppFramework\Db\Mapper;
37
38
class MembersMapper extends Mapper {
39
40
	const TABLENAME = 'circles_members';
41
42
	private $miscService;
43
44
	public function __construct(IDBConnection $db, $miscService) {
45
		parent::__construct($db, self::TABLENAME, 'OCA\Circles\Db\Members');
46
		$this->miscService = $miscService;
47
	}
48
49
50
	/**
51
	 * @param $circleId
52
	 * @param $userId
53
	 * @param bool $moderator
54
	 *
55
	 * @return null|Member
56
	 * @throws MemberDoesNotExistException
57
	 */
58
	public function getMemberFromCircle($circleId, $userId, $moderator = false) {
59
60
		$circleId = (int)$circleId;
61
		$qb = $this->getMemberFromCircleSql($circleId, $userId);
62
		$cursor = $qb->setMaxResults(1)
63
					 ->execute();
64
65
		$data = $cursor->fetch();
66
		if ($data === false) {
67
			throw new MemberDoesNotExistException();
68
		}
69
70
		if ($moderator !== true) {
71
			unset($data['note']);
72
		}
73
74
		$member = new Member();
75
		$member->fromArray($data);
76
		$cursor->closeCursor();
77
78
		return $member;
79
	}
80
81
82
	/**
83
	 * get members list from a circle. If moderator, returns also notes about each member.
84
	 *
85
	 * @param $circleId
86
	 * @param Member $user
87
	 *
88
	 * @return array
89
	 * @internal param Member $member
90
	 * @internal param bool $moderator
91
	 *
92
	 */
93
	public function getMembersFromCircle($circleId, Member $user) {
94
		try {
95
			$user->hasToBeMember();
96
97
			$qb = $this->getMembersFromCircleSql((int)$circleId);
98
			$cursor = $qb->execute();
99
			$result = [];
100
			while ($data = $cursor->fetch()) {
101
				if (!$user->isLevel(Member::LEVEL_MODERATOR)) {
102
					unset($data['note']);
103
				}
104
105
				$member = new Member();
106
				$member->fromArray($data);
107
				$result[] = $member;
108
			}
109
			$cursor->closeCursor();
110
111
		} catch (MemberDoesNotExistException $e) {
112
			throw new $e;
113
		}
114
115
		return $result;
116
	}
117
118
119
	/**
120
	 * Generate SQL Request for getMemberFromCircle()
121
	 *
122
	 * @param $circleId
123
	 * @param $userId
124
	 *
125
	 * @return \OCP\DB\QueryBuilder\IQueryBuilder
126
	 */
127
	private function getMemberFromCircleSql($circleId, $userId) {
128
		$qb = $this->getMembersFromCircleSqlBase($circleId);
129
		$expr = $qb->expr();
130
131
		$qb->andWhere(
132
			$expr->eq('user_id', $qb->createNamedParameter($userId))
133
		);
134
135
		return $qb;
136
	}
137
138
139
	/**
140
	 * Return SQL for getMembersFromCircle.
141
	 *
142
	 * @param $circleId
143
	 *
144
	 * @return \OCP\DB\QueryBuilder\IQueryBuilder
145
	 */
146
	private function getMembersFromCircleSql($circleId) {
147
		$qb = $this->getMembersFromCircleSqlBase($circleId);
148
		$expr = $qb->expr();
149
150
		/** @noinspection PhpMethodParametersCountMismatchInspection */
151
		$qb->andwhere(
152
			$expr->neq('status', $qb->createNamedParameter(Member::STATUS_NONMEMBER))
153
		);
154
155
		return $qb;
156
	}
157
158
159
	/**
160
	 *
161
	 * Return the base select request for both
162
	 * getMembersFromCircleSql()
163
	 * getMemberFromCircleSql()
164
	 *
165
	 * @param $circleId
166
	 *
167
	 * @return \OCP\DB\QueryBuilder\IQueryBuilder
168
	 */
169
	private function getMembersFromCircleSqlBase($circleId) {
170
		$qb = $this->db->getQueryBuilder();
171
		$expr = $qb->expr();
172
173
		/** @noinspection PhpMethodParametersCountMismatchInspection */
174
		$qb->select(
175
			'circle_id', 'user_id', 'level', 'status', 'note', 'joined'
176
		)
177
		   ->from(self::TABLENAME)
178
		   ->where(
179
			   $expr->eq('circle_id', $qb->createNamedParameter($circleId))
180
		   );
181
182
		return $qb;
183
	}
184
185
186
	/**
187
	 * update database entry for a specific Member.
188
	 *
189
	 * @param Member $member
190
	 *
191
	 * @return bool
192
	 */
193
	public function editMember(Member $member) {
194
195
		$qb = $this->db->getQueryBuilder();
196
197
		/** @noinspection PhpMethodParametersCountMismatchInspection */
198
		$qb->update(self::TABLENAME)
199
		   ->set('level', $qb->createNamedParameter($member->getLevel()))
200
		   ->set('status', $qb->createNamedParameter($member->getStatus()))
201
		   ->where(
202
			   $qb->expr()
203
				  ->andX(
204
					  $qb->expr()
205
						 ->eq('circle_id', $qb->createNamedParameter($member->getCircleId())),
206
					  $qb->expr()
207
						 ->eq('user_id', $qb->createNamedParameter($member->getUserId()))
208
				  )
209
		   );
210
211
		$qb->execute();
212
213
		return true;
214
	}
215
216
217
	/**
218
	 * Insert Member into database.
219
	 *
220
	 * @param Member $member
221
	 *
222
	 * @throws MemberAlreadyExistsException
223
	 */
224
	public function add(Member $member) {
225
226
		try {
227
			$qb = $this->db->getQueryBuilder();
228
			$qb->insert(self::TABLENAME)
229
			   ->setValue('circle_id', $qb->createNamedParameter($member->getCircleId()))
230
			   ->setValue('user_id', $qb->createNamedParameter($member->getUserId()))
231
			   ->setValue('level', $qb->createNamedParameter($member->getLevel()))
232
			   ->setValue('status', $qb->createNamedParameter($member->getStatus()))
233
			   ->setValue('note', $qb->createNamedParameter($member->getNote()));
234
			$qb->execute();
235
		} catch (UniqueConstraintViolationException $e) {
1 ignored issue
show
Bug introduced by
The class Doctrine\DBAL\Exception\...raintViolationException does not exist. Did you forget a USE statement, or did you not list all dependencies?

Scrutinizer analyzes your composer.json/composer.lock file if available to determine the classes, and functions that are defined by your dependencies.

It seems like the listed class was neither found in your dependencies, nor was it found in the analyzed files in your repository. If you are using some other form of dependency management, you might want to disable this analysis.

Loading history...
236
			throw new MemberAlreadyExistsException();
237
		}
238
	}
239
240
241
	/**
242
	 * Remove a member from a circle.
243
	 *
244
	 * @param Member $member
245
	 *
246
	 * @return bool
247
	 */
248
	public function remove(Member $member) {
249
250
		$qb = $this->db->getQueryBuilder();
251
252
		/** @noinspection PhpMethodParametersCountMismatchInspection */
253
		$qb->delete(self::TABLENAME)
254
		   ->where(
255
			   $qb->expr()
256
				  ->eq('circle_id', $qb->createNamedParameter($member->getCircleId())),
257
			   $qb->expr()
258
				  ->eq('user_id', $qb->createNamedParameter($member->getUserId()))
259
		   );
260
261
		$qb->execute();
262
263
		return true;
264
	}
265
266
	/**
267
	 * remove all members/owner from a circle
268
	 *
269
	 * @param Circle $circle
270
	 *
271
	 * @return bool
272
	 */
273 View Code Duplication
	public function removeAllFromCircle(Circle $circle) {
274
		$qb = $this->db->getQueryBuilder();
275
		$qb->delete(self::TABLENAME)
276
		   ->where(
277
			   $qb->expr()
278
				  ->eq('circle_id', $qb->createNamedParameter($circle->getId()))
279
		   );
280
281
		$qb->execute();
282
283
		return true;
284
285
	}
286
}
287
288