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

CoreQueryBuilder::limitToInstance()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 3
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
 * Circles - Bring cloud-users closer together.
7
 *
8
 * This file is licensed under the Affero General Public License version 3 or
9
 * later. See the COPYING file.
10
 *
11
 * @author Maxence Lange <[email protected]>
12
 * @copyright 2017
13
 * @license GNU AGPL version 3 or any later version
14
 *
15
 * This program is free software: you can redistribute it and/or modify
16
 * it under the terms of the GNU Affero General Public License as
17
 * published by the Free Software Foundation, either version 3 of the
18
 * License, or (at your option) any later version.
19
 *
20
 * This program is distributed in the hope that it will be useful,
21
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
22
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23
 * GNU Affero General Public License for more details.
24
 *
25
 * You should have received a copy of the GNU Affero General Public License
26
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
27
 *
28
 */
29
30
31
namespace OCA\Circles\Db;
32
33
34
use daita\MySmallPhpTools\Db\Nextcloud\nc21\NC21ExtendedQueryBuilder;
35
use Doctrine\DBAL\Query\QueryBuilder;
36
use OCA\Circles\Model\Circle;
37
use OCA\Circles\Model\Member;
38
39
/**
40
 * Class CoreQueryBuilder
41
 *
42
 * @package OCA\Circles\Db
43
 */
44
class CoreQueryBuilder extends NC21ExtendedQueryBuilder {
45
46
47
	/**
48
	 * @param string $id
49
	 */
50
	public function limitToUniqueId(string $id): void {
51
		$this->limitToDBField('unique_id', $id, false);
52
	}
53
54
	/**
55
	 * @param string $host
56
	 */
57
	public function limitToInstance(string $host): void {
58
		$this->limitToDBField('instance', $host, false);
59
	}
60
61
62
	public function limitToViewer(Member $viewer): void {
63
		$this->leftJoinViewer($viewer, 'v');
64
		$this->limitVisibility('v');
65
	}
66
67
68
	/**
69
	 * @param Member $member
70
	 */
71
	public function limitToMembership(Member $member): void {
72
		if ($this->getType() !== QueryBuilder::SELECT) {
73
			return;
74
		}
75
76
		$expr = $this->expr();
77
		$pf = $this->getDefaultSelectAlias() . '.';
78
79
		$this->selectAlias('m.user_id', 'member_user_id')
80
			 ->selectAlias('m.user_type', 'member_user_type')
81
			 ->selectAlias('m.member_id', 'member_member_id')
82
			 ->selectAlias('m.circle_id', 'member_circle_id')
83
			 ->selectAlias('m.instance', 'member_instance')
84
			 ->selectAlias('m.cached_name', 'member_cached_name')
85
			 ->selectAlias('m.cached_update', 'member_cached_update')
86
			 ->selectAlias('m.status', 'member_status')
87
			 ->selectAlias('m.level', 'member_level')
88
			 ->selectAlias('m.note', 'member_note')
89
			 ->selectAlias('m.contact_id', 'member_contact_id')
90
			 ->selectAlias('m.contact_meta', 'member_contact_meta')
91
			 ->selectAlias('m.joined', 'member_joined')
92
			 ->leftJoin(
93
				 $this->getDefaultSelectAlias(), CoreRequestBuilder::TABLE_MEMBERS, 'm',
94
				 $expr->eq('m.circle_id', $pf . 'unique_id')
95
			 );
96
97
		// TODO: Check in big table if it is better to put condition in andWhere() or in LeftJoin()
98
		$this->andWhere(
99
			$expr->andX(
100
				$expr->eq('m.user_id', $this->createNamedParameter($member->getUserId())),
101
				$expr->eq('m.user_type', $this->createNamedParameter($member->getUserType())),
102
				$expr->eq('m.instance', $this->createNamedParameter($member->getInstance())),
103
				$expr->gte('m.level', $this->createNamedParameter($member->getLevel()))
104
			)
105
		);
106
	}
107
108
109
	/**
110
	 *
111
	 */
112
	public function leftJoinOwner() {
113
		if ($this->getType() !== QueryBuilder::SELECT) {
114
			return;
115
		}
116
117
		$expr = $this->expr();
118
		$pf = $this->getDefaultSelectAlias() . '.';
119
120
		$this->selectAlias('o.user_id', 'owner_user_id')
121
			 ->selectAlias('o.user_type', 'owner_user_type')
122
			 ->selectAlias('o.member_id', 'owner_member_id')
123
			 ->selectAlias('o.circle_id', 'owner_circle_id')
124
			 ->selectAlias('o.instance', 'owner_instance')
125
			 ->selectAlias('o.cached_name', 'owner_cached_name')
126
			 ->selectAlias('o.cached_update', 'owner_cached_update')
127
			 ->selectAlias('o.status', 'owner_status')
128
			 ->selectAlias('o.level', 'owner_level')
129
			 ->selectAlias('o.note', 'owner_note')
130
			 ->selectAlias('o.contact_id', 'owner_contact_id')
131
			 ->selectAlias('o.contact_meta', 'owner_contact_meta')
132
			 ->selectAlias('o.joined', 'owner_joined')
133
			 ->leftJoin(
134
				 $this->getDefaultSelectAlias(), CoreRequestBuilder::TABLE_MEMBERS, 'o',
135
				 $expr->andX(
136
					 $expr->eq('o.circle_id', $pf . 'unique_id'),
137
					 $expr->eq('o.level', $this->createNamedParameter(Member::LEVEL_OWNER))
138
				 )
139
			 );
140
	}
141
142
143
	/**
144
	 * Left join members to filter userId as viewer.
145
	 *
146
	 * @param Member $viewer
147
	 * @param string $alias
148
	 */
149
	public function leftJoinViewer(Member $viewer, string $alias = 'v') {
150
		if ($this->getType() !== QueryBuilder::SELECT) {
151
			return;
152
		}
153
154
		$expr = $this->expr();
155
		$pf = $this->getDefaultSelectAlias() . '.';
156
157
		$this->selectAlias('v.user_id', 'viewer_user_id')
158
			 ->selectAlias('v.user_type', 'viewer_user_type')
159
			 ->selectAlias('v.member_id', 'viewer_member_id')
160
			 ->selectAlias('v.circle_id', 'viewer_circle_id')
161
			 ->selectAlias('v.instance', 'viewer_instance')
162
			 ->selectAlias('v.cached_name', 'viewer_cached_name')
163
			 ->selectAlias('v.cached_update', 'viewer_cached_update')
164
			 ->selectAlias('v.status', 'viewer_status')
165
			 ->selectAlias('v.level', 'viewer_level')
166
			 ->selectAlias('v.note', 'viewer_note')
167
			 ->selectAlias('v.contact_id', 'viewer_contact_id')
168
			 ->selectAlias('v.contact_meta', 'viewer_contact_meta')
169
			 ->selectAlias('v.joined', 'viewer_joined')
170
			 ->leftJoin(
171
				 $this->getDefaultSelectAlias(), CoreRequestBuilder::TABLE_MEMBERS, 'v',
172
				 $expr->andX(
173
					 $expr->eq('v.circle_id', $pf . 'unique_id'),
174
					 $expr->eq('v.user_id', $this->createNamedParameter($viewer->getUserId())),
175
					 $expr->eq('v.user_type', $this->createNamedParameter($viewer->getUserType())),
176
					 $expr->eq('v.instance', $this->createNamedParameter($viewer->getInstance()))
177
				 )
178
			 );
179
	}
180
181
182
	/**
183
	 * @param string $alias
184
	 */
185
	protected function limitVisibility(string $alias = 'v') {
186
		$expr = $this->expr();
187
188
		// Visibility to non-member is
189
		// - 2 (Personal), if viewer is owner)
190
		// - 4 (Visible to everyone)
191
		$orX = $expr->orX();
192
		$orX->add(
193
			$expr->andX(
194
				$expr->bitwiseAnd($this->getDefaultSelectAlias() . '.config', Circle::CFG_PERSONAL),
195
				$expr->eq($alias . '.level', $this->createNamedParameter(Member::LEVEL_OWNER))
196
			)
197
		);
198
		$orX->add($expr->bitwiseAnd($this->getDefaultSelectAlias() . '.config', Circle::CFG_VISIBLE));
199
		$this->andWhere($orX);
200
201
		// - 128 means fully hidden, filtering
202
		$bitHidden = $expr->bitwiseAnd($this->getDefaultSelectAlias() . '.config', Circle::CFG_HIDDEN);
203
		$this->andWhere($this->createFunction('NOT') . $bitHidden);
204
205
206
//		$orTypes = $this->generateLimit($qb, $circleUniqueId, $userId, $type, $name, $forceAll);
207
//		if (sizeof($orTypes) === 0) {
208
//			throw new ConfigNoCircleAvailableException(
209
//				$this->l10n->t(
210
//					'You cannot use the Circles Application until your administrator has allowed at least one type of circles'
211
//				)
212
//			);
213
//		}
214
215
//		$orXTypes = $this->expr()
216
//						 ->orX();
217
//		foreach ($orTypes as $orType) {
218
//			$orXTypes->add($orType);
219
//		}
220
//
221
//		$qb->andWhere($orXTypes);
222
	}
223
224
225
	/**
226
	 * @param int $flag
227
	 */
228
	public function filterConfig(int $flag): void {
229
		$this->andWhere($this->expr()->bitwiseAnd($this->getDefaultSelectAlias() . '.config', $flag));
230
	}
231
232
}
233
234