Completed
Push — master ( 3ddca8...414a73 )
by Maxence
02:57
created

MemberRequest::searchFederatedUsers()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 7
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 1
1
<?php
2
3
declare(strict_types=1);
4
5
6
/**
7
 * Circles - Bring cloud-users closer together.
8
 *
9
 * This file is licensed under the Affero General Public License version 3 or
10
 * later. See the COPYING file.
11
 *
12
 * @author Maxence Lange <[email protected]>
13
 * @copyright 2021
14
 * @license GNU AGPL version 3 or any later version
15
 *
16
 * This program is free software: you can redistribute it and/or modify
17
 * it under the terms of the GNU Affero General Public License as
18
 * published by the Free Software Foundation, either version 3 of the
19
 * License, or (at your option) any later version.
20
 *
21
 * This program is distributed in the hope that it will be useful,
22
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
23
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
24
 * GNU Affero General Public License for more details.
25
 *
26
 * You should have received a copy of the GNU Affero General Public License
27
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
28
 *
29
 */
30
31
32
namespace OCA\Circles\Db;
33
34
35
use OCA\Circles\Exceptions\InvalidIdException;
36
use OCA\Circles\Exceptions\MemberNotFoundException;
37
use OCA\Circles\Exceptions\RequestBuilderException;
38
use OCA\Circles\IFederatedUser;
39
use OCA\Circles\Model\Circle;
40
use OCA\Circles\Model\Federated\RemoteInstance;
41
use OCA\Circles\Model\FederatedUser;
42
use OCA\Circles\Model\Member;
43
44
45
/**
46
 * Class MemberRequest
47
 *
48
 * @package OCA\Circles\Db
49
 */
50
class MemberRequest extends MemberRequestBuilder {
51
52
53
	/**
54
	 * @param Member $member
55
	 *
56
	 * @throws InvalidIdException
57
	 */
58
	public function save(Member $member): void {
59
		$this->confirmValidIds([$member->getCircleId(), $member->getSingleId(), $member->getId()]);
60
61
		$qb = $this->getMemberInsertSql();
62
		$qb->setValue('circle_id', $qb->createNamedParameter($member->getCircleId()))
63
		   ->setValue('single_id', $qb->createNamedParameter($member->getSingleId()))
64
		   ->setValue('member_id', $qb->createNamedParameter($member->getId()))
65
		   ->setValue('user_id', $qb->createNamedParameter($member->getUserId()))
66
		   ->setValue('user_type', $qb->createNamedParameter($member->getUserType()))
67
		   ->setValue('cached_name', $qb->createNamedParameter($member->getDisplayName()))
68
		   ->setValue('cached_update', $qb->createNamedParameter($this->timezoneService->getUTCDate()))
69
		   ->setValue('instance', $qb->createNamedParameter($qb->getInstance($member)))
70
		   ->setValue('level', $qb->createNamedParameter($member->getLevel()))
71
		   ->setValue('status', $qb->createNamedParameter($member->getStatus()))
72
		   ->setValue('contact_id', $qb->createNamedParameter($member->getContactId()))
73
		   ->setValue('note', $qb->createNamedParameter($member->getNote()));
74
75
		$qb->execute();
76
	}
77
78
79
	/**
80
	 * @param Member $member
81
	 *
82
	 * @throws InvalidIdException
83
	 */
84
	public function update(Member $member): void {
85
		$this->confirmValidIds([$member->getCircleId(), $member->getSingleId(), $member->getId()]);
86
87
		$qb = $this->getMemberUpdateSql();
88
		$qb->set('member_id', $qb->createNamedParameter($member->getId()))
89
		   ->set('cached_name', $qb->createNamedParameter($member->getDisplayName()))
90
		   ->set('cached_update', $qb->createNamedParameter($this->timezoneService->getUTCDate()))
91
		   ->set('level', $qb->createNamedParameter($member->getLevel()))
92
		   ->set('status', $qb->createNamedParameter($member->getStatus()))
93
		   ->set('contact_id', $qb->createNamedParameter($member->getContactId()))
94
		   ->set('note', $qb->createNamedParameter($member->getNote()));
95
96
		$qb->limitToCircleId($member->getCircleId());
97
		$qb->limitToUserId($member->getUserId());
98
		$qb->limitToUserType($member->getUserType());
99
		$qb->limitToInstance($qb->getInstance($member));
100
		$qb->limitToSingleId($member->getSingleId());
101
102
		$qb->execute();
103
	}
104
105
106
	/**
107
	 * @param Member $member
108
	 *
109
	 * @throws InvalidIdException
110
	 */
111
	public function insertOrUpdate(Member $member): void {
112
		try {
113
			$this->searchMember($member);
114
			$this->update($member);
115
		} catch (MemberNotFoundException $e) {
116
			$this->save($member);
117
		}
118
	}
119
120
121
	/**
122
	 * @param Member $member
123
	 */
124
	public function delete(Member $member) {
125
		$qb = $this->getMemberDeleteSql();
126
		$qb->limitToCircleId($member->getCircleId());
127
		$qb->limitToUserId($member->getUserId());
128
		$qb->limitToUserType($member->getUserType());
129
		$qb->limitToInstance($qb->getInstance($member));
130
		$qb->limitToSingleId($member->getSingleId());
131
132
		$qb->execute();
133
	}
134
135
136
	/**
137
	 * @param IFederatedUser $federatedUser
138
	 */
139
	public function deleteFederatedUser(IFederatedUser $federatedUser): void {
140
		$qb = $this->getMemberDeleteSql();
141
		$qb->limitToSingleId($federatedUser->getSingleId());
142
143
		$qb->execute();
144
	}
145
146
147
	/**
148
	 * @param IFederatedUser $federatedUser
149
	 * @param Circle $circle
150
	 */
151
	public function deleteFederatedUserFromCircle(IFederatedUser $federatedUser, Circle $circle): void {
152
		$qb = $this->getMemberDeleteSql();
153
		$qb->limitToSingleId($federatedUser->getSingleId());
154
		$qb->limitToCircleId($circle->getSingleId());
155
156
		$qb->execute();
157
	}
158
159
160
	/**
161
	 *
162
	 * @param Circle $circle
163
	 */
164
	public function deleteAllFromCircle(Circle $circle) {
165
		$qb = $this->getMemberDeleteSql();
166
		$qb->andWhere(
167
			$qb->expr()->orX(
168
				$qb->exprLimit('single_id', $circle->getSingleId()),
169
				$qb->exprLimit('circle_id', $circle->getSingleId())
170
			)
171
		);
172
173
		$qb->execute();
174
	}
175
176
177
	/**
178
	 * @param Member $member
179
	 */
180
	public function updateLevel(Member $member): void {
181
		$qb = $this->getMemberUpdateSql();
182
		$qb->set('level', $qb->createNamedParameter($member->getLevel()));
183
184
		$qb->limitToMemberId($member->getId());
185
		$qb->limitToCircleId($member->getCircleId());
186
		$qb->limitToUserId($member->getUserId());
187
		$qb->limitToUserType($member->getUserType());
188
		$qb->limitToInstance($qb->getInstance($member));
189
		$qb->limitToSingleId($member->getSingleId());
190
191
		$qb->execute();
192
	}
193
194
195
	/**
196
	 * @param string $singleId
197
	 * @param IFederatedUser|null $initiator
198
	 * @param RemoteInstance|null $remoteInstance
199
	 * @param Member|null $filter
200
	 *
201
	 * @return Member[]
202
	 * @throws RequestBuilderException
203
	 */
204
	public function getMembers(
205
		string $singleId,
206
		?IFederatedUser $initiator = null,
207
		?RemoteInstance $remoteInstance = null,
208
		?Member $filter = null
209
	): array {
210
		$qb = $this->getMemberSelectSql($initiator);
211
		$qb->limitToCircleId($singleId);
212
213
		$qb->setOptions([CoreQueryBuilder::MEMBER], ['canBeVisitorOnOpen' => true]);
214
		$qb->leftJoinCircle(CoreQueryBuilder::MEMBER, $initiator);
215
216
		if (!is_null($remoteInstance)) {
217
			$aliasCircle = $qb->generateAlias(CoreQueryBuilder::MEMBER, CoreQueryBuilder::CIRCLE);
218
			$qb->limitToRemoteInstance(CoreQueryBuilder::MEMBER, $remoteInstance, true, $aliasCircle);
219
		}
220
		if (!is_null($filter)) {
221
			$qb->filterDirectMembership(CoreQueryBuilder::MEMBER, $filter);
222
		}
223
224
		$qb->orderBy($qb->getDefaultSelectAlias() . '.level', 'desc');
225
		$qb->addOrderBy($qb->getDefaultSelectAlias() . '.cached_name', 'asc');
226
227
		return $this->getItemsFromRequest($qb);
228
	}
229
230
231
	/**
232
	 * @param string $singleId
233
	 * @param bool $getData
234
	 *
235
	 * @return Member[]
236
	 * @throws RequestBuilderException
237
	 */
238
	public function getInheritedMembers(string $singleId, bool $getData = false): array {
239
		$qb = $this->getMemberSelectSql(null, $getData);
240
241
		if ($getData) {
242
			$qb->leftJoinCircle(CoreQueryBuilder::MEMBER);
243
			$qb->setOptions([CoreQueryBuilder::MEMBER], ['getData' => $getData]);
244
		}
245
246
		$qb->limitToMembersByInheritance(CoreQueryBuilder::MEMBER, $singleId);
247
248
		$aliasMembership = $qb->generateAlias(CoreQueryBuilder::MEMBER, CoreQueryBuilder::MEMBERSHIPS);
249
		$qb->orderBy($aliasMembership . '.inheritance_depth', 'asc');
250
//		$qb->groupBy(CoreQueryBuilder::MEMBER . '.single_id');
251
252
		return $this->getItemsFromRequest($qb);
253
	}
254
255
256
	/**
257
	 * @param string $memberId
258
	 * @param FederatedUser|null $initiator
259
	 *
260
	 * @return Member
261
	 * @throws MemberNotFoundException
262
	 * @throws RequestBuilderException
263
	 */
264
	public function getMemberById(string $memberId, ?FederatedUser $initiator = null): Member {
265
		$qb = $this->getMemberSelectSql();
266
		$qb->limitToMemberId($memberId);
267
268
		if (!is_null($initiator)) {
269
			$qb->leftJoinCircle(CoreQueryBuilder::MEMBER, $initiator);
270
		}
271
272
		return $this->getItemFromRequest($qb);
273
	}
274
275
276
	/**
277
	 * @param string $circleId
278
	 *
279
	 * @return array
280
	 * @throws RequestBuilderException
281
	 */
282
	public function getMemberInstances(string $circleId): array {
283
		$qb = $this->getMemberSelectSql();
284
		$qb->limitToCircleId($circleId);
285
286
		$qb->andwhere($qb->expr()->nonEmptyString(CoreQueryBuilder::MEMBER . '.instance'));
287
//		$qb->groupBy(CoreQueryBuilder::MEMBER . '.instance');
288
289
		return array_map(
290
			function(Member $member): string {
291
				return $member->getInstance();
292
			}, $this->getItemsFromRequest($qb)
293
		);
294
	}
295
296
297
	/**
298
	 * @param string $singleId
299
	 *
300
	 * @return Member[]
301
	 */
302
	public function getMembersBySingleId(string $singleId): array {
303
		$qb = $this->getMemberSelectSql();
304
		$qb->leftJoinCircle(CoreQueryBuilder::MEMBER);
305
306
		$qb->limitToSingleId($singleId);
307
308
		return $this->getItemsFromRequest($qb);
309
	}
310
311
312
	/**
313
	 * @param Member $member
314
	 * @param FederatedUser|null $initiator
315
	 *
316
	 * @return Member
317
	 * @throws MemberNotFoundException
318
	 * @throws RequestBuilderException
319
	 */
320
	public function searchMember(Member $member, ?FederatedUser $initiator = null): Member {
321
		$qb = $this->getMemberSelectSql();
322
		$qb->limitToCircleId($member->getCircleId());
323
		$qb->limitToUserId($member->getUserId());
324
		$qb->limitToUserType($member->getUserType());
325
		$qb->limitToInstance($qb->getInstance($member));
326
		$qb->limitToSingleId($member->getSingleId());
327
328
		$qb->leftJoinCircle(CoreQueryBuilder::MEMBER, $initiator);
329
330
		return $this->getItemFromRequest($qb);
331
	}
332
333
334
	/**
335
	 * @param string $needle
336
	 *
337
	 * @return FederatedUser[]
338
	 * @throws RequestBuilderException
339
	 */
340
	public function searchFederatedUsers(string $needle): array {
341
		$qb = $this->getMemberSelectSql();
342
		$qb->searchInDBField('user_id', '%' . $needle . '%');
343
//		$qb->groupBy('single_id');
344
345
		return $this->getItemsFromRequest($qb, true);
346
	}
347
348
349
	/**
350
	 * @param IFederatedUser $federatedUser
351
	 *
352
	 * @return FederatedUser[]|Member
353
	 * @throws RequestBuilderException
354
	 */
355
	public function getAlternateSingleId(IFederatedUser $federatedUser) {
356
		$qb = $this->getMemberSelectSql();
357
		$qb->limitToSingleId($federatedUser->getSingleId());
358
359
		$expr = $qb->expr();
360
		$orX = $expr->orX(
361
			$qb->exprLimitToDBField('user_id', $federatedUser->getUserId(), false, true),
0 ignored issues
show
Deprecated Code introduced by
The method daita\MySmallPhpTools\Db...r::exprLimitToDBField() has been deprecated with message: - use exprLimit() / exprFilter();

This method has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the method will be removed from the class and what other method or class to use instead.

Loading history...
362
			$qb->exprLimitToDBFieldInt('user_type', $federatedUser->getUserType(), false),
0 ignored issues
show
Deprecated Code introduced by
The method daita\MySmallPhpTools\Db...exprLimitToDBFieldInt() has been deprecated with message: - use exprLimitInt() / exprFilterInt()

This method has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the method will be removed from the class and what other method or class to use instead.

Loading history...
363
			$qb->exprLimitToDBField('instance', $qb->getInstance($federatedUser), false, false)
0 ignored issues
show
Deprecated Code introduced by
The method daita\MySmallPhpTools\Db...r::exprLimitToDBField() has been deprecated with message: - use exprLimit() / exprFilter();

This method has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the method will be removed from the class and what other method or class to use instead.

Loading history...
364
		);
365
366
		$qb->andWhere($orX);
367
368
		return $this->getItemsFromRequest($qb, true);
369
	}
370
371
}
372
373