Skip to content

Commit d49d616

Browse files
committed
feat(activity): Add API for applications to register a focused activity selector
This allows applications to register a class to extend the query for focused activity. Focused activity events should directly concern the logged-in user. Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
1 parent e0cccd3 commit d49d616

8 files changed

Lines changed: 89 additions & 12 deletions

File tree

lib/composer/composer/autoload_classmap.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@
8484
'OCP\\Activity\\Exceptions\\InvalidValueException' => $baseDir . '/lib/public/Activity/Exceptions/InvalidValueException.php',
8585
'OCP\\Activity\\Exceptions\\SettingNotFoundException' => $baseDir . '/lib/public/Activity/Exceptions/SettingNotFoundException.php',
8686
'OCP\\Activity\\Exceptions\\UnknownActivityException' => $baseDir . '/lib/public/Activity/Exceptions/UnknownActivityException.php',
87+
'OCP\\Activity\\IActivityFocusedSelector' => $baseDir . '/lib/public/Activity/IActivityFocusedSelector.php',
8788
'OCP\\Activity\\IBulkConsumer' => $baseDir . '/lib/public/Activity/IBulkConsumer.php',
8889
'OCP\\Activity\\IConsumer' => $baseDir . '/lib/public/Activity/IConsumer.php',
8990
'OCP\\Activity\\IEvent' => $baseDir . '/lib/public/Activity/IEvent.php',

lib/composer/composer/autoload_static.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2
125125
'OCP\\Activity\\Exceptions\\InvalidValueException' => __DIR__ . '/../../..' . '/lib/public/Activity/Exceptions/InvalidValueException.php',
126126
'OCP\\Activity\\Exceptions\\SettingNotFoundException' => __DIR__ . '/../../..' . '/lib/public/Activity/Exceptions/SettingNotFoundException.php',
127127
'OCP\\Activity\\Exceptions\\UnknownActivityException' => __DIR__ . '/../../..' . '/lib/public/Activity/Exceptions/UnknownActivityException.php',
128+
'OCP\\Activity\\IActivityFocusedSelector' => __DIR__ . '/../../..' . '/lib/public/Activity/IActivityFocusedSelector.php',
128129
'OCP\\Activity\\IBulkConsumer' => __DIR__ . '/../../..' . '/lib/public/Activity/IBulkConsumer.php',
129130
'OCP\\Activity\\IConsumer' => __DIR__ . '/../../..' . '/lib/public/Activity/IConsumer.php',
130131
'OCP\\Activity\\IEvent' => __DIR__ . '/../../..' . '/lib/public/Activity/IEvent.php',

lib/private/Activity/Manager.php

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
namespace OC\Activity;
1010

11+
use OC\AppFramework\Bootstrap\Coordinator;
1112
use OCP\Activity\ActivitySettings;
1213
use OCP\Activity\Exceptions\FilterNotFoundException;
1314
use OCP\Activity\Exceptions\IncompleteActivityException;
@@ -30,18 +31,10 @@
3031
use OCP\Server;
3132

3233
class Manager implements IManager {
33-
34-
/** @var string */
35-
protected $formattingObjectType;
36-
37-
/** @var int|string */
38-
protected $formattingObjectId;
39-
40-
/** @var bool */
41-
protected $requirePNG = false;
42-
43-
/** @var string */
44-
protected $currentUserId;
34+
protected ?string $formattingObjectType = null;
35+
protected int|string|null $formattingObjectId = null;
36+
protected bool $requirePNG = false;
37+
protected ?string $currentUserId = null;
4538

4639
public function __construct(
4740
protected IRequest $request,
@@ -51,6 +44,7 @@ public function __construct(
5144
protected IRichTextFormatter $richTextFormatter,
5245
protected IL10N $l10n,
5346
protected ITimeFactory $timeFactory,
47+
private Coordinator $coordinator,
5448
) {
5549
}
5650

@@ -396,4 +390,14 @@ protected function getUserFromToken(): string {
396390
// Token found login as that user
397391
return array_shift($users);
398392
}
393+
394+
#[\Override]
395+
public function getActivityFocusedSelectors(): array {
396+
$registeredSelectors = $this->coordinator->getRegistrationContext()?->getActivityFocusedSelectors() ?? [];
397+
$selectors = [];
398+
foreach ($registeredSelectors as $registration) {
399+
$selectors[] = Server::get($registration->getService());
400+
}
401+
return $selectors;
402+
}
399403
}

lib/private/AppFramework/Bootstrap/RegistrationContext.php

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
use Closure;
1313
use OC\AppFramework\DependencyInjection\DIContainer;
1414
use OC\Support\CrashReport\Registry;
15+
use OCP\Activity\IActivityFocusedSelector;
1516
use OCP\AppFramework\App;
1617
use OCP\AppFramework\Bootstrap\IRegistrationContext;
1718
use OCP\AppFramework\Middleware;
@@ -167,6 +168,9 @@ class RegistrationContext {
167168
/** @var ServiceRegistration<IMailProvider>[] */
168169
private $mailProviders = [];
169170

171+
/** @var ServiceRegistration<IActivityFocusedSelector>[] */
172+
private array $activityFocusedSelectors = [];
173+
170174
public function __construct(
171175
private LoggerInterface $logger,
172176
) {
@@ -491,6 +495,14 @@ public function registerConfigLexicon(string $configLexiconClass): void {
491495
$configLexiconClass
492496
);
493497
}
498+
499+
#[\Override]
500+
public function registerActivityFocusedSelector(string $activityFocusedSelectorClass): void {
501+
$this->context->registerActivityFocusedSelector(
502+
$this->appId,
503+
$activityFocusedSelectorClass
504+
);
505+
}
494506
};
495507
}
496508

@@ -709,6 +721,10 @@ public function registerConfigLexicon(string $appId, string $configLexiconClass)
709721
$this->configLexiconClasses[$appId] = $configLexiconClass;
710722
}
711723

724+
public function registerActivityFocusedSelector(string $appId, string $activityFocusedSelectorClass): void {
725+
$this->activityFocusedSelectors[] = new ServiceRegistration($appId, $activityFocusedSelectorClass);
726+
}
727+
712728
/**
713729
* @param App[] $apps
714730
*/
@@ -1094,4 +1110,11 @@ public function getConfigLexicon(string $appId): ?ILexicon {
10941110

10951111
return Server::get($this->configLexiconClasses[$appId]);
10961112
}
1113+
1114+
/**
1115+
* @return ServiceRegistration<IActivityFocusedSelector>[]
1116+
*/
1117+
public function getActivityFocusedSelectors(): array {
1118+
return $this->activityFocusedSelectors;
1119+
}
10971120
}

lib/private/Server.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -590,6 +590,7 @@ public function __construct(
590590
$c->get(IRichTextFormatter::class),
591591
$l10n,
592592
$c->get(ITimeFactory::class),
593+
$c->get(\OC\AppFramework\Bootstrap\Coordinator::class),
593594
);
594595
});
595596

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
/**
6+
* SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors
7+
* SPDX-License-Identifier: AGPL-3.0-or-later
8+
*/
9+
10+
namespace OCP\Activity;
11+
12+
use OCP\AppFramework\Attribute\Implementable;
13+
use OCP\DB\QueryBuilder\IQueryBuilder;
14+
15+
/**
16+
* @since 35.0.0
17+
*/
18+
#[Implementable(since: '35.0.0')]
19+
interface IActivityFocusedSelector {
20+
/**
21+
* Extend query with joins if needed, and return an array of conditions to add
22+
* in the OR clause of the WHERE for filtering focused activity events
23+
*
24+
* @return list<string> conditions to add in the where clause
25+
* @since 35.0.0
26+
*/
27+
public function extendQuery(IQueryBuilder $query, string $userId): array;
28+
}

lib/public/Activity/IManager.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
use OCP\Activity\Exceptions\FilterNotFoundException;
1313
use OCP\Activity\Exceptions\IncompleteActivityException;
1414
use OCP\Activity\Exceptions\SettingNotFoundException;
15+
use OCP\AppFramework\QueryException;
1516

1617
/**
1718
* Interface IManager
@@ -175,4 +176,13 @@ public function setCurrentUserId(?string $currentUserId = null): void;
175176
* @since 8.1.0
176177
*/
177178
public function getCurrentUserId(): string;
179+
180+
/**
181+
* Get "focused activity" selectors declared by booted applications
182+
*
183+
* @throws QueryException If an application registered a class that cannot be instanciated
184+
* @return list<IActivityFocusedSelector>
185+
* @since 35.0.0
186+
*/
187+
public function getActivityFocusedSelectors(): array;
178188
}

lib/public/AppFramework/Bootstrap/IRegistrationContext.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -452,4 +452,13 @@ public function registerMailProvider(string $class): void;
452452
* @since 31.0.0
453453
*/
454454
public function registerConfigLexicon(string $configLexiconClass): void;
455+
456+
/**
457+
* Register an implementation of \OCP\Activity\IActivityFocusedSelector that
458+
* will extend the DB query to find focused activity events
459+
*
460+
* @param class-string<\OCP\Activity\IActivityFocusedSelector> $configLexiconClass
461+
* @since 35.0.0
462+
*/
463+
public function registerActivityFocusedSelector(string $activityFocusedSelectorClass): void;
455464
}

0 commit comments

Comments
 (0)