Skip to content

Commit 01c769b

Browse files
Merge pull request #714 from nextcloud/backport/713/stable22
[stable22] better probe
2 parents a650554 + eec05c5 commit 01c769b

5 files changed

Lines changed: 136 additions & 38 deletions

File tree

lib/Command/CirclesList.php

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,11 @@ protected function configure() {
127127
->addOption('member', '', InputOption::VALUE_REQUIRED, 'search for member', '')
128128
->addOption('def', '', InputOption::VALUE_NONE, 'display complete circle configuration')
129129
->addOption('display-name', '', InputOption::VALUE_NONE, 'display the displayName')
130-
->addOption('all', '', InputOption::VALUE_NONE, 'display also hidden Circles');
130+
->addOption('personal', '', InputOption::VALUE_NONE, 'include Personal Circles')
131+
->addOption('system', '', InputOption::VALUE_NONE, 'include System Circles')
132+
->addOption('hidden', '', InputOption::VALUE_NONE, 'include Hidden Circles')
133+
->addOption('backend', '', InputOption::VALUE_NONE, 'include Backend Circles')
134+
->addOption('single', '', InputOption::VALUE_NONE, 'returns only Single Circles');
131135
}
132136

133137

@@ -184,11 +188,23 @@ protected function execute(InputInterface $input, OutputInterface $output): int
184188
);
185189

186190
$probe = new CircleProbe();
187-
if ($input->getOption('all')) {
188-
$probe->includeSystemCircles()
189-
->includeSingleCircles()
190-
->includePersonalCircles();
191+
192+
if ($input->getOption('system')) {
193+
$probe->includeSystemCircles(true);
194+
$probe->filterHiddenCircles(false);
191195
}
196+
197+
$probe->includeHiddenCircles($input->getOption('hidden'));
198+
$probe->includeBackendCircles($input->getOption('backend'));
199+
$probe->includePersonalCircles($input->getOption('personal'));
200+
201+
if ($input->getOption('single')) {
202+
$singleCircle = new Circle();
203+
$singleCircle->setConfig(Circle::CFG_SINGLE);
204+
$probe->setFilterCircle($singleCircle)
205+
->includeSingleCircles();
206+
}
207+
192208
$circles = $this->circleService->getCircles($probe);
193209
}
194210

lib/Db/CircleRequest.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ public function getCircles(?IFederatedUser $initiator, CircleProbe $probe): arra
170170
)
171171
);
172172

173-
$qb->filterCircles(CoreQueryBuilder::CIRCLE, $probe->filtered());
173+
$qb->filterCircles(CoreQueryBuilder::CIRCLE, $probe);
174174
if (!is_null($initiator)) {
175175
$qb->limitToInitiator(CoreQueryBuilder::CIRCLE, $initiator);
176176
}
@@ -245,7 +245,7 @@ public function getCircle(
245245
);
246246

247247
$qb->limitToUniqueId($id);
248-
$qb->filterCircles(CoreQueryBuilder::CIRCLE, $probe->filtered());
248+
$qb->filterCircles(CoreQueryBuilder::CIRCLE, $probe);
249249
$qb->leftJoinOwner(CoreQueryBuilder::CIRCLE);
250250
// $qb->setOptions(
251251
// [CoreRequestBuilder::CIRCLE, CoreRequestBuilder::INITIATOR], [

lib/Db/CoreQueryBuilder.php

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
use OCA\Circles\Model\Federated\RemoteInstance;
4343
use OCA\Circles\Model\FederatedUser;
4444
use OCA\Circles\Model\Member;
45+
use OCA\Circles\Model\Probes\CircleProbe;
4546
use OCA\Circles\Service\ConfigService;
4647
use OCP\DB\QueryBuilder\ICompositeExpression;
4748
use OCP\DB\QueryBuilder\IQueryBuilder;
@@ -1313,22 +1314,13 @@ protected function limitInitiatorVisibility(string $alias): ICompositeExpression
13131314

13141315
/**
13151316
* @param string $aliasCircle
1316-
* @param int $flag
1317+
* @param CircleProbe $probe
13171318
*/
1318-
public function filterCircles(string $aliasCircle, int $flag): void {
1319-
if ($flag === 0) {
1320-
return;
1321-
}
1322-
1323-
$expr = $this->expr();
1324-
$hide = $expr->andX();
1325-
foreach (Circle::$DEF_CFG as $cfg => $v) {
1326-
if ($flag & $cfg) {
1327-
$hide->add($this->exprFilterBitwise('config', $cfg, $aliasCircle));
1328-
}
1329-
}
1330-
1331-
$this->andWhere($hide);
1319+
public function filterCircles(string $aliasCircle, CircleProbe $probe): void {
1320+
$filter = $probe->filtered();
1321+
$include = $probe->included();
1322+
$config = ($filter | $include) - $include;
1323+
$this->filterBitwise('config', $config, $aliasCircle);
13321324
}
13331325

13341326

lib/Model/Probes/CircleProbe.php

Lines changed: 104 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -41,16 +41,24 @@
4141
class CircleProbe extends MemberProbe {
4242

4343

44-
/** @var array */
45-
public static $filters = [
46-
Circle::CFG_SINGLE,
47-
Circle::CFG_HIDDEN,
48-
Circle::CFG_BACKEND,
49-
];
50-
5144
/** @var int */
5245
private $include = 0;
5346

47+
/** @var int */
48+
private $filter = 0;
49+
50+
51+
/**
52+
* CircleProbe constructor.
53+
*
54+
* @param bool $defaultFilters
55+
*/
56+
public function __construct(bool $defaultFilters = true) {
57+
if ($defaultFilters) {
58+
$this->filter = Circle::CFG_SINGLE | Circle::CFG_HIDDEN;
59+
}
60+
}
61+
5462

5563
/**
5664
* @param bool $include
@@ -139,21 +147,95 @@ public function isIncluded(int $config): bool {
139147
return (($this->included() & $config) !== 0);
140148
}
141149

150+
151+
/**
152+
* @param bool $filter
153+
*
154+
* @return $this
155+
*/
156+
public function filterPersonalCircles(bool $filter = true): self {
157+
$this->filter |= Circle::CFG_PERSONAL;
158+
if (!$filter) {
159+
$this->filter -= Circle::CFG_PERSONAL;
160+
}
161+
162+
return $this;
163+
}
164+
165+
/**
166+
* @param bool $filter
167+
*
168+
* @return $this
169+
*/
170+
public function filterSingleCircles(bool $filter = true): self {
171+
$this->filter |= Circle::CFG_SINGLE;
172+
if (!$filter) {
173+
$this->filter -= Circle::CFG_SINGLE;
174+
}
175+
176+
return $this;
177+
}
178+
179+
/**
180+
* @param bool $filter
181+
*
182+
* @return $this
183+
*/
184+
public function filterSystemCircles(bool $filter = true): self {
185+
$this->filter |= Circle::CFG_SYSTEM;
186+
if (!$filter) {
187+
$this->filter -= Circle::CFG_SYSTEM;
188+
}
189+
190+
return $this;
191+
}
192+
193+
/**
194+
* @param bool $filter
195+
*
196+
* @return $this
197+
*/
198+
public function filterHiddenCircles(bool $filter = true): self {
199+
$this->filter |= Circle::CFG_HIDDEN;
200+
if (!$filter) {
201+
$this->filter -= Circle::CFG_HIDDEN;
202+
}
203+
204+
return $this;
205+
}
206+
207+
/**
208+
* @param bool $filter
209+
*
210+
* @return $this
211+
*/
212+
public function filterBackendCircles(bool $filter = true): self {
213+
$this->filter |= Circle::CFG_BACKEND;
214+
if (!$filter) {
215+
$this->filter -= Circle::CFG_BACKEND;
216+
}
217+
218+
return $this;
219+
}
220+
221+
142222
/**
143223
* @return int
144224
*/
145225
public function filtered(): int {
146-
$filtered = 0;
147-
foreach (self::$filters as $filter) {
148-
if ($this->isIncluded($filter)) {
149-
continue;
150-
}
151-
$filtered += $filter;
152-
}
226+
return $this->filter;
227+
}
153228

154-
return $filtered;
229+
/**
230+
* @param int $config
231+
*
232+
* @return bool
233+
*/
234+
public function isFiltered(int $config): bool {
235+
return (($this->filtered() & $config) !== 0);
155236
}
156237

238+
157239
/**
158240
* @return array
159241
*/
@@ -162,9 +244,16 @@ public function getAsOptions(): array {
162244
[
163245
'included' => $this->included(),
164246
'includeHiddenCircles' => $this->isIncluded(Circle::CFG_HIDDEN),
247+
'includeSingleCircles' => $this->isIncluded(Circle::CFG_SINGLE),
165248
'includeBackendCircles' => $this->isIncluded(Circle::CFG_BACKEND),
166249
'includeSystemCircles' => $this->isIncluded(Circle::CFG_SYSTEM),
167250
'includePersonalCircles' => $this->isIncluded(Circle::CFG_PERSONAL),
251+
'filtered' => $this->included(),
252+
'filterHiddenCircles' => $this->isIncluded(Circle::CFG_HIDDEN),
253+
'filterSingleCircles' => $this->isIncluded(Circle::CFG_SINGLE),
254+
'filterBackendCircles' => $this->isIncluded(Circle::CFG_BACKEND),
255+
'filterSystemCircles' => $this->isIncluded(Circle::CFG_SYSTEM),
256+
'filterPersonalCircles' => $this->isIncluded(Circle::CFG_PERSONAL),
168257
],
169258
parent::getAsOptions()
170259
);

lib/Service/MemberService.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@
6363
use OCA\Circles\Model\Federated\FederatedEvent;
6464
use OCA\Circles\Model\FederatedUser;
6565
use OCA\Circles\Model\Member;
66+
use OCA\Circles\Model\Probes\CircleProbe;
6667
use OCA\Circles\Model\Probes\MemberProbe;
6768

6869
/**
@@ -174,7 +175,7 @@ public function getMemberById(
174175
public function getMembers(string $circleId): array {
175176
$this->federatedUserService->mustHaveCurrentUser();
176177

177-
$probe = new MemberProbe();
178+
$probe = new CircleProbe();
178179
if ($this->federatedUserService->hasRemoteInstance()) {
179180
$probe->setFilterRemoteInstance($this->federatedUserService->getRemoteInstance());
180181
}

0 commit comments

Comments
 (0)