Completed
Pull Request — master (#615)
by Maxence
02:40
created

MemberRequest::deleteFederatedUser()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

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