diff --git a/apps/dav/composer/composer/autoload_classmap.php b/apps/dav/composer/composer/autoload_classmap.php index ef25c658b83a4..f6107589455c3 100644 --- a/apps/dav/composer/composer/autoload_classmap.php +++ b/apps/dav/composer/composer/autoload_classmap.php @@ -32,6 +32,7 @@ 'OCA\\DAV\\BulkUpload\\BulkUploadPlugin' => $baseDir . '/../lib/BulkUpload/BulkUploadPlugin.php', 'OCA\\DAV\\BulkUpload\\MultipartRequestParser' => $baseDir . '/../lib/BulkUpload/MultipartRequestParser.php', 'OCA\\DAV\\CalDAV\\Activity\\Backend' => $baseDir . '/../lib/CalDAV/Activity/Backend.php', + 'OCA\\DAV\\CalDAV\\Activity\\CalendarFocusedSelector' => $baseDir . '/../lib/CalDAV/Activity/CalendarFocusedSelector.php', 'OCA\\DAV\\CalDAV\\Activity\\Filter\\Calendar' => $baseDir . '/../lib/CalDAV/Activity/Filter/Calendar.php', 'OCA\\DAV\\CalDAV\\Activity\\Filter\\Todo' => $baseDir . '/../lib/CalDAV/Activity/Filter/Todo.php', 'OCA\\DAV\\CalDAV\\Activity\\Provider\\Base' => $baseDir . '/../lib/CalDAV/Activity/Provider/Base.php', diff --git a/apps/dav/composer/composer/autoload_static.php b/apps/dav/composer/composer/autoload_static.php index 5aa979e007acc..db19826b9a45d 100644 --- a/apps/dav/composer/composer/autoload_static.php +++ b/apps/dav/composer/composer/autoload_static.php @@ -47,6 +47,7 @@ class ComposerStaticInitDAV 'OCA\\DAV\\BulkUpload\\BulkUploadPlugin' => __DIR__ . '/..' . '/../lib/BulkUpload/BulkUploadPlugin.php', 'OCA\\DAV\\BulkUpload\\MultipartRequestParser' => __DIR__ . '/..' . '/../lib/BulkUpload/MultipartRequestParser.php', 'OCA\\DAV\\CalDAV\\Activity\\Backend' => __DIR__ . '/..' . '/../lib/CalDAV/Activity/Backend.php', + 'OCA\\DAV\\CalDAV\\Activity\\CalendarFocusedSelector' => __DIR__ . '/..' . '/../lib/CalDAV/Activity/CalendarFocusedSelector.php', 'OCA\\DAV\\CalDAV\\Activity\\Filter\\Calendar' => __DIR__ . '/..' . '/../lib/CalDAV/Activity/Filter/Calendar.php', 'OCA\\DAV\\CalDAV\\Activity\\Filter\\Todo' => __DIR__ . '/..' . '/../lib/CalDAV/Activity/Filter/Todo.php', 'OCA\\DAV\\CalDAV\\Activity\\Provider\\Base' => __DIR__ . '/..' . '/../lib/CalDAV/Activity/Provider/Base.php', diff --git a/apps/dav/lib/AppInfo/Application.php b/apps/dav/lib/AppInfo/Application.php index b2c3cf9665519..a7b24f240a387 100644 --- a/apps/dav/lib/AppInfo/Application.php +++ b/apps/dav/lib/AppInfo/Application.php @@ -10,6 +10,7 @@ namespace OCA\DAV\AppInfo; +use OCA\DAV\CalDAV\Activity\CalendarFocusedSelector; use OCA\DAV\CalDAV\AppCalendar\AppCalendarPlugin; use OCA\DAV\CalDAV\CachedSubscriptionProvider; use OCA\DAV\CalDAV\CalendarManager; @@ -243,6 +244,8 @@ public function register(IRegistrationContext $context): void { $context->registerEventListener(DeclarativeSettingsSetValueEvent::class, DavAdminSettingsListener::class); $context->registerConfigLexicon(ConfigLexicon::class); + + $context->registerActivityFocusedSelector(CalendarFocusedSelector::class); } #[\Override] diff --git a/apps/dav/lib/CalDAV/Activity/CalendarFocusedSelector.php b/apps/dav/lib/CalDAV/Activity/CalendarFocusedSelector.php new file mode 100644 index 0000000000000..cf8249722c2d2 --- /dev/null +++ b/apps/dav/lib/CalDAV/Activity/CalendarFocusedSelector.php @@ -0,0 +1,28 @@ +leftJoin('a', 'calendars', 'calendars', + $query->expr()->andX( + $query->expr()->eq('a.object_type', $query->createNamedParameter('calendar')), + $query->expr()->eq('a.object_id', 'calendars.id'), + )); + return [ + $query->expr()->eq('calendars.principaluri', $query->createNamedParameter('principals/users/' . $userId)), + ]; + } +} diff --git a/lib/composer/composer/autoload_classmap.php b/lib/composer/composer/autoload_classmap.php index 6472ccd5e2050..027e806ed7c78 100644 --- a/lib/composer/composer/autoload_classmap.php +++ b/lib/composer/composer/autoload_classmap.php @@ -84,6 +84,7 @@ 'OCP\\Activity\\Exceptions\\InvalidValueException' => $baseDir . '/lib/public/Activity/Exceptions/InvalidValueException.php', 'OCP\\Activity\\Exceptions\\SettingNotFoundException' => $baseDir . '/lib/public/Activity/Exceptions/SettingNotFoundException.php', 'OCP\\Activity\\Exceptions\\UnknownActivityException' => $baseDir . '/lib/public/Activity/Exceptions/UnknownActivityException.php', + 'OCP\\Activity\\IActivityFocusedSelector' => $baseDir . '/lib/public/Activity/IActivityFocusedSelector.php', 'OCP\\Activity\\IBulkConsumer' => $baseDir . '/lib/public/Activity/IBulkConsumer.php', 'OCP\\Activity\\IConsumer' => $baseDir . '/lib/public/Activity/IConsumer.php', 'OCP\\Activity\\IEvent' => $baseDir . '/lib/public/Activity/IEvent.php', diff --git a/lib/composer/composer/autoload_static.php b/lib/composer/composer/autoload_static.php index eb51034b2dff1..529c2142675f7 100644 --- a/lib/composer/composer/autoload_static.php +++ b/lib/composer/composer/autoload_static.php @@ -125,6 +125,7 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2 'OCP\\Activity\\Exceptions\\InvalidValueException' => __DIR__ . '/../../..' . '/lib/public/Activity/Exceptions/InvalidValueException.php', 'OCP\\Activity\\Exceptions\\SettingNotFoundException' => __DIR__ . '/../../..' . '/lib/public/Activity/Exceptions/SettingNotFoundException.php', 'OCP\\Activity\\Exceptions\\UnknownActivityException' => __DIR__ . '/../../..' . '/lib/public/Activity/Exceptions/UnknownActivityException.php', + 'OCP\\Activity\\IActivityFocusedSelector' => __DIR__ . '/../../..' . '/lib/public/Activity/IActivityFocusedSelector.php', 'OCP\\Activity\\IBulkConsumer' => __DIR__ . '/../../..' . '/lib/public/Activity/IBulkConsumer.php', 'OCP\\Activity\\IConsumer' => __DIR__ . '/../../..' . '/lib/public/Activity/IConsumer.php', 'OCP\\Activity\\IEvent' => __DIR__ . '/../../..' . '/lib/public/Activity/IEvent.php', diff --git a/lib/private/Activity/Manager.php b/lib/private/Activity/Manager.php index 98453520a8ddb..45c9a5892df52 100644 --- a/lib/private/Activity/Manager.php +++ b/lib/private/Activity/Manager.php @@ -8,6 +8,7 @@ namespace OC\Activity; +use OC\AppFramework\Bootstrap\Coordinator; use OCP\Activity\ActivitySettings; use OCP\Activity\Exceptions\FilterNotFoundException; use OCP\Activity\Exceptions\IncompleteActivityException; @@ -30,18 +31,10 @@ use OCP\Server; class Manager implements IManager { - - /** @var string */ - protected $formattingObjectType; - - /** @var int|string */ - protected $formattingObjectId; - - /** @var bool */ - protected $requirePNG = false; - - /** @var string */ - protected $currentUserId; + protected ?string $formattingObjectType = null; + protected int|string|null $formattingObjectId = null; + protected bool $requirePNG = false; + protected ?string $currentUserId = null; public function __construct( protected IRequest $request, @@ -51,6 +44,7 @@ public function __construct( protected IRichTextFormatter $richTextFormatter, protected IL10N $l10n, protected ITimeFactory $timeFactory, + private Coordinator $coordinator, ) { } @@ -396,4 +390,14 @@ protected function getUserFromToken(): string { // Token found login as that user return array_shift($users); } + + #[\Override] + public function getActivityFocusedSelectors(): array { + $registeredSelectors = $this->coordinator->getRegistrationContext()?->getActivityFocusedSelectors() ?? []; + $selectors = []; + foreach ($registeredSelectors as $registration) { + $selectors[] = Server::get($registration->getService()); + } + return $selectors; + } } diff --git a/lib/private/AppFramework/Bootstrap/RegistrationContext.php b/lib/private/AppFramework/Bootstrap/RegistrationContext.php index 8a6f6bb3e5c51..150f6958254f6 100644 --- a/lib/private/AppFramework/Bootstrap/RegistrationContext.php +++ b/lib/private/AppFramework/Bootstrap/RegistrationContext.php @@ -12,6 +12,7 @@ use Closure; use OC\AppFramework\DependencyInjection\DIContainer; use OC\Support\CrashReport\Registry; +use OCP\Activity\IActivityFocusedSelector; use OCP\AppFramework\App; use OCP\AppFramework\Bootstrap\IRegistrationContext; use OCP\AppFramework\Middleware; @@ -167,6 +168,9 @@ class RegistrationContext { /** @var ServiceRegistration[] */ private $mailProviders = []; + /** @var ServiceRegistration[] */ + private array $activityFocusedSelectors = []; + public function __construct( private LoggerInterface $logger, ) { @@ -491,6 +495,14 @@ public function registerConfigLexicon(string $configLexiconClass): void { $configLexiconClass ); } + + #[\Override] + public function registerActivityFocusedSelector(string $activityFocusedSelectorClass): void { + $this->context->registerActivityFocusedSelector( + $this->appId, + $activityFocusedSelectorClass + ); + } }; } @@ -709,6 +721,10 @@ public function registerConfigLexicon(string $appId, string $configLexiconClass) $this->configLexiconClasses[$appId] = $configLexiconClass; } + public function registerActivityFocusedSelector(string $appId, string $activityFocusedSelectorClass): void { + $this->activityFocusedSelectors[] = new ServiceRegistration($appId, $activityFocusedSelectorClass); + } + /** * @param App[] $apps */ @@ -1094,4 +1110,11 @@ public function getConfigLexicon(string $appId): ?ILexicon { return Server::get($this->configLexiconClasses[$appId]); } + + /** + * @return ServiceRegistration[] + */ + public function getActivityFocusedSelectors(): array { + return $this->activityFocusedSelectors; + } } diff --git a/lib/private/Server.php b/lib/private/Server.php index 7c1128a41690c..46e7be55ff5a9 100644 --- a/lib/private/Server.php +++ b/lib/private/Server.php @@ -590,6 +590,7 @@ public function __construct( $c->get(IRichTextFormatter::class), $l10n, $c->get(ITimeFactory::class), + $c->get(\OC\AppFramework\Bootstrap\Coordinator::class), ); }); diff --git a/lib/public/Activity/IActivityFocusedSelector.php b/lib/public/Activity/IActivityFocusedSelector.php new file mode 100644 index 0000000000000..479624b422a5d --- /dev/null +++ b/lib/public/Activity/IActivityFocusedSelector.php @@ -0,0 +1,30 @@ + conditions to add in the where clause + * @since 35.0.0 + */ + public function extendQuery(IQueryBuilder $query, string $userId): array; +} diff --git a/lib/public/Activity/IManager.php b/lib/public/Activity/IManager.php index a4d0070a99712..bc903c0251f94 100644 --- a/lib/public/Activity/IManager.php +++ b/lib/public/Activity/IManager.php @@ -12,6 +12,7 @@ use OCP\Activity\Exceptions\FilterNotFoundException; use OCP\Activity\Exceptions\IncompleteActivityException; use OCP\Activity\Exceptions\SettingNotFoundException; +use OCP\AppFramework\QueryException; /** * Interface IManager @@ -175,4 +176,13 @@ public function setCurrentUserId(?string $currentUserId = null): void; * @since 8.1.0 */ public function getCurrentUserId(): string; + + /** + * Get "focused activity" selectors declared by booted applications + * + * @throws QueryException If an application registered a class that cannot be instanciated + * @return list + * @since 35.0.0 + */ + public function getActivityFocusedSelectors(): array; } diff --git a/lib/public/AppFramework/Bootstrap/IRegistrationContext.php b/lib/public/AppFramework/Bootstrap/IRegistrationContext.php index f0524660ecd7e..7bfb653f7cf3f 100644 --- a/lib/public/AppFramework/Bootstrap/IRegistrationContext.php +++ b/lib/public/AppFramework/Bootstrap/IRegistrationContext.php @@ -452,4 +452,13 @@ public function registerMailProvider(string $class): void; * @since 31.0.0 */ public function registerConfigLexicon(string $configLexiconClass): void; + + /** + * Register an implementation of \OCP\Activity\IActivityFocusedSelector that + * will extend the DB query to find focused activity events + * + * @param class-string<\OCP\Activity\IActivityFocusedSelector> $configLexiconClass + * @since 35.0.0 + */ + public function registerActivityFocusedSelector(string $activityFocusedSelectorClass): void; }