Completed
Push — master ( 0663df...8c3fa4 )
by Maxence
06:17 queued 03:19
created

MemberRequest::getMember()   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 2
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(json_encode($member->getNotes())));
74
75
		if ($member->hasInvitedBy()) {
76
			$qb->setValue('invited_by', $qb->createNamedParameter($member->getInvitedBy()->getSingleId()));
77
		}
78
79
		$qb->execute();
80
	}
81
82
83
	/**
84
	 * @param Member $member
85
	 *
86
	 * @throws InvalidIdException
87
	 */
88
	public function update(Member $member): void {
89
		$this->confirmValidIds([$member->getCircleId(), $member->getSingleId(), $member->getId()]);
90
91
		$qb = $this->getMemberUpdateSql();
92
		$qb->set('member_id', $qb->createNamedParameter($member->getId()))
93
		   ->set('cached_name', $qb->createNamedParameter($member->getDisplayName()))
94
		   ->set('cached_update', $qb->createNamedParameter($this->timezoneService->getUTCDate()))
95
		   ->set('level', $qb->createNamedParameter($member->getLevel()))
96
		   ->set('status', $qb->createNamedParameter($member->getStatus()))
97
		   ->set('contact_id', $qb->createNamedParameter($member->getContactId()))
98
		   ->set('note', $qb->createNamedParameter(json_encode($member->getNotes())));
99
100
		$qb->limitToCircleId($member->getCircleId());
101
		$qb->limitToSingleId($member->getSingleId());
102
103
		$qb->execute();
104
	}
105
106
107
	/**
108
	 * @param Member $member
109
	 *
110
	 * @throws InvalidIdException
111
	 * @throws RequestBuilderException
112
	 */
113
	public function insertOrUpdate(Member $member): void {
114
		try {
115
			$this->searchMember($member);
116
			$this->update($member);
117
		} catch (MemberNotFoundException $e) {
118
			$this->save($member);
119
		}
120
	}
121
122
123
	/**
124
	 * @param string $singleId
125
	 * @param string $displayName
126
	 * @param string $circleId
127
	 */
128
	public function updateDisplayName(string $singleId, string $displayName, string $circleId = ''): void {
129
		$qb = $this->getMemberUpdateSql();
130
		$qb->set('cached_name', $qb->createNamedParameter($displayName))
131
		   ->set('cached_update', $qb->createNamedParameter($this->timezoneService->getUTCDate()));
132
133
		$qb->limitToSingleId($singleId);
134
		if ($circleId !== '') {
135
			$qb->limitToCircleId($circleId);
136
		}
137
138
		$qb->execute();
139
	}
140
141
142
	/**
143
	 * @param Member $member
144
	 */
145
	public function delete(Member $member) {
146
		$qb = $this->getMemberDeleteSql();
147
		$qb->limitToCircleId($member->getCircleId());
148
		$qb->limitToSingleId($member->getSingleId());
149
150
		$qb->execute();
151
	}
152
153
154
	/**
155
	 * @param IFederatedUser $federatedUser
156
	 */
157
	public function deleteFederatedUser(IFederatedUser $federatedUser): void {
158
		$qb = $this->getMemberDeleteSql();
159
		$qb->limitToSingleId($federatedUser->getSingleId());
160
		$qb->limitToMemberId($federatedUser->getSingleId());
161
		$qb->limitToCircleId($federatedUser->getSingleId());
162
163
		$qb->execute();
164
	}
165
166
167
	/**
168
	 * @param IFederatedUser $federatedUser
169
	 * @param Circle $circle
170
	 */
171
	public function deleteFederatedUserFromCircle(IFederatedUser $federatedUser, Circle $circle): void {
172
		$qb = $this->getMemberDeleteSql();
173
		$qb->limitToSingleId($federatedUser->getSingleId());
174
		$qb->limitToCircleId($circle->getSingleId());
175
176
		$qb->execute();
177
	}
178
179
180
	/**
181
	 *
182
	 * @param Circle $circle
183
	 */
184
	public function deleteAllFromCircle(Circle $circle) {
185
		$qb = $this->getMemberDeleteSql();
186
		$qb->andWhere(
187
			$qb->expr()->orX(
188
				$qb->exprLimit('single_id', $circle->getSingleId()),
189
				$qb->exprLimit('circle_id', $circle->getSingleId())
190
			)
191
		);
192
193
		$qb->execute();
194
	}
195
196
197
	/**
198
	 * @param Member $member
199
	 */
200
	public function updateLevel(Member $member): void {
201
		$qb = $this->getMemberUpdateSql();
202
		$qb->set('level', $qb->createNamedParameter($member->getLevel()));
203
204
		$qb->limitToMemberId($member->getId());
205
		$qb->limitToCircleId($member->getCircleId());
206
		$qb->limitToSingleId($member->getSingleId());
207
208
		$qb->execute();
209
	}
210
211
212
	/**
213
	 * @param string $singleId
214
	 * @param IFederatedUser|null $initiator
215
	 * @param RemoteInstance|null $remoteInstance
216
	 * @param Member|null $filter
217
	 *
218
	 * @return Member[]
219
	 * @throws RequestBuilderException
220
	 */
221
	public function getMembers(
222
		string $singleId,
223
		?IFederatedUser $initiator = null,
224
		?RemoteInstance $remoteInstance = null,
225
		?Member $filter = null
226
	): array {
227
		$qb = $this->getMemberSelectSql($initiator);
228
		$qb->limitToCircleId($singleId);
229
230
		$qb->setOptions([CoreQueryBuilder::MEMBER], ['canBeVisitorOnOpen' => true]);
231
		$qb->leftJoinCircle(CoreQueryBuilder::MEMBER, $initiator);
232
		$qb->leftJoinInvitedBy(CoreQueryBuilder::MEMBER);
233
234
		if (!is_null($remoteInstance)) {
235
			$aliasCircle = $qb->generateAlias(CoreQueryBuilder::MEMBER, CoreQueryBuilder::CIRCLE);
236
			$qb->limitToRemoteInstance(CoreQueryBuilder::MEMBER, $remoteInstance, true, $aliasCircle);
237
		}
238
		if (!is_null($filter)) {
239
			$qb->filterDirectMembership(CoreQueryBuilder::MEMBER, $filter);
240
		}
241
242
		$qb->orderBy($qb->getDefaultSelectAlias() . '.level', 'desc');
243
		$qb->addOrderBy($qb->getDefaultSelectAlias() . '.cached_name', 'asc');
244
245
		return $this->getItemsFromRequest($qb);
246
	}
247
248
249
	/**
250
	 * @param string $singleId
251
	 * @param bool $getData
252
	 * @param int $level
253
	 *
254
	 * @return Member[]
255
	 * @throws RequestBuilderException
256
	 */
257
	public function getInheritedMembers(string $singleId, bool $getData = false, int $level = 0): array {
258
		$qb = $this->getMemberSelectSql(null, $getData);
259
260
		if ($getData) {
261
			$qb->leftJoinCircle(CoreQueryBuilder::MEMBER);
262
			$qb->setOptions([CoreQueryBuilder::MEMBER], ['getData' => $getData]);
263
		}
264
265
		$qb->limitToMembersByInheritance(CoreQueryBuilder::MEMBER, $singleId, $level);
266
267
		$aliasMembership = $qb->generateAlias(CoreQueryBuilder::MEMBER, CoreQueryBuilder::MEMBERSHIPS);
268
		$qb->orderBy($aliasMembership . '.inheritance_depth', 'asc')
269
		   ->addGroupBy($aliasMembership . '.inheritance_depth');
270
271
		return $this->getItemsFromRequest($qb);
272
	}
273
274
275
	/**
276
	 * @param string $circleId
277
	 * @param string $singleId
278
	 *
279
	 * @return Member
280
	 * @throws MemberNotFoundException
281
	 * @throws RequestBuilderException
282
	 */
283
	public function getMember(string $circleId, string $singleId): Member {
284
		$qb = $this->getMemberSelectSql();
285
		$qb->limitToCircleId($circleId);
286
		$qb->limitToSingleId($singleId);
287
288
		return $this->getItemFromRequest($qb);
289
	}
290
291
292
	/**
293
	 * @param string $memberId
294
	 * @param FederatedUser|null $initiator
295
	 * @param bool $canBeVisitor
296
	 *
297
	 * @return Member
298
	 * @throws MemberNotFoundException
299
	 * @throws RequestBuilderException
300
	 */
301
	public function getMemberById(
302
		string $memberId,
303
		?FederatedUser $initiator = null,
304
		bool $canBeVisitor = false
305
	): Member {
306
		$qb = $this->getMemberSelectSql();
307
		$qb->limitToMemberId($memberId);
308
309
		if (!is_null($initiator)) {
310
			$qb->setOptions([CoreQueryBuilder::MEMBER], ['canBeVisitor' => $canBeVisitor]);
311
			$qb->leftJoinCircle(CoreQueryBuilder::MEMBER, $initiator);
312
		}
313
314
		return $this->getItemFromRequest($qb);
315
	}
316
317
318
	/**
319
	 * @param string $circleId
320
	 *
321
	 * @return array
322
	 * @throws RequestBuilderException
323
	 */
324
	public function getMemberInstances(string $circleId): array {
325
		$qb = $this->getMemberSelectSql();
326
		$qb->limitToCircleId($circleId);
327
328
		$qb->andwhere($qb->expr()->nonEmptyString(CoreQueryBuilder::MEMBER . '.instance'));
329
330
		return array_map(
331
			function(Member $member): string {
332
				return $member->getInstance();
333
			}, $this->getItemsFromRequest($qb)
334
		);
335
	}
336
337
338
	/**
339
	 * @param string $singleId
340
	 *
341
	 * @return Member[]
342
	 * @throws RequestBuilderException
343
	 */
344
	public function getMembersBySingleId(string $singleId): array {
345
		$qb = $this->getMemberSelectSql();
346
		$qb->leftJoinCircle(CoreQueryBuilder::MEMBER);
347
348
		$qb->limitToSingleId($singleId);
349
350
		return $this->getItemsFromRequest($qb);
351
	}
352
353
354
	/**
355
	 * @param Member $member
356
	 * @param FederatedUser|null $initiator
357
	 *
358
	 * @return Member
359
	 * @throws MemberNotFoundException
360
	 * @throws RequestBuilderException
361
	 */
362
	public function searchMember(Member $member, ?FederatedUser $initiator = null): Member {
363
		$qb = $this->getMemberSelectSql();
364
		$qb->limitToCircleId($member->getCircleId());
365
		$qb->limitToSingleId($member->getSingleId());
366
367
		$qb->leftJoinCircle(CoreQueryBuilder::MEMBER, $initiator);
368
369
		return $this->getItemFromRequest($qb);
370
	}
371
372
373
	/**
374
	 * @param string $needle
375
	 *
376
	 * @return FederatedUser[]
377
	 * @throws RequestBuilderException
378
	 */
379
	public function searchFederatedUsers(string $needle): array {
380
		$qb = $this->getMemberSelectSql();
381
		$qb->searchInDBField('user_id', '%' . $needle . '%');
382
383
		return $this->getItemsFromRequest($qb, true);
384
	}
385
386
387
	/**
388
	 * @param IFederatedUser $federatedUser
389
	 *
390
	 * @return Member[]
391
	 * @throws RequestBuilderException
392
	 */
393
	public function getAlternateSingleId(IFederatedUser $federatedUser): array {
394
		$qb = $this->getMemberSelectSql();
395
		$qb->limitToSingleId($federatedUser->getSingleId());
396
397
		$qb->leftJoinRemoteInstance(CoreQueryBuilder::MEMBER);
398
//		$expr = $qb->expr();
399
//		$orX = $expr->orX(
400
//			$qb->exprFilter('user_id', $federatedUser->getUserId()),
401
//			$qb->exprFilterInt('user_type', $federatedUser->getUserType()),
402
//			$qb->exprFilter('instance', $qb->getInstance($federatedUser), '', false)
403
//		);
404
//
405
//		$qb->andWhere($orX);
406
407
		return $this->getItemsFromRequest($qb);
408
	}
409
410
}
411
412