Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions apps/dav/composer/composer/autoload_classmap.php
Original file line number Diff line number Diff line change
Expand Up @@ -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',
Expand Down
1 change: 1 addition & 0 deletions apps/dav/composer/composer/autoload_static.php
Original file line number Diff line number Diff line change
Expand Up @@ -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',
Expand Down
3 changes: 3 additions & 0 deletions apps/dav/lib/AppInfo/Application.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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]
Expand Down
28 changes: 28 additions & 0 deletions apps/dav/lib/CalDAV/Activity/CalendarFocusedSelector.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<?php

declare(strict_types=1);

/**
* SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/

namespace OCA\DAV\CalDAV\Activity;

use OCP\Activity\IActivityFocusedSelector;
use OCP\DB\QueryBuilder\IQueryBuilder;

class CalendarFocusedSelector implements IActivityFocusedSelector {
#[\Override]
public function extendQuery(IQueryBuilder $query, string $userId): array {
// Activity related to calendars owned by the user
$query->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)),
];
}
}
1 change: 1 addition & 0 deletions lib/composer/composer/autoload_classmap.php
Original file line number Diff line number Diff line change
Expand Up @@ -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',
Expand Down
1 change: 1 addition & 0 deletions lib/composer/composer/autoload_static.php
Original file line number Diff line number Diff line change
Expand Up @@ -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',
Expand Down
28 changes: 16 additions & 12 deletions lib/private/Activity/Manager.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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,
Expand All @@ -51,6 +44,7 @@ public function __construct(
protected IRichTextFormatter $richTextFormatter,
protected IL10N $l10n,
protected ITimeFactory $timeFactory,
private Coordinator $coordinator,
) {
}

Expand Down Expand Up @@ -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;
}
}
23 changes: 23 additions & 0 deletions lib/private/AppFramework/Bootstrap/RegistrationContext.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -167,6 +168,9 @@ class RegistrationContext {
/** @var ServiceRegistration<IMailProvider>[] */
private $mailProviders = [];

/** @var ServiceRegistration<IActivityFocusedSelector>[] */
private array $activityFocusedSelectors = [];

public function __construct(
private LoggerInterface $logger,
) {
Expand Down Expand Up @@ -491,6 +495,14 @@ public function registerConfigLexicon(string $configLexiconClass): void {
$configLexiconClass
);
}

#[\Override]
public function registerActivityFocusedSelector(string $activityFocusedSelectorClass): void {
$this->context->registerActivityFocusedSelector(
$this->appId,
$activityFocusedSelectorClass
);
}
};
}

Expand Down Expand Up @@ -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
*/
Expand Down Expand Up @@ -1094,4 +1110,11 @@ public function getConfigLexicon(string $appId): ?ILexicon {

return Server::get($this->configLexiconClasses[$appId]);
}

/**
* @return ServiceRegistration<IActivityFocusedSelector>[]
*/
public function getActivityFocusedSelectors(): array {
return $this->activityFocusedSelectors;
}
}
1 change: 1 addition & 0 deletions lib/private/Server.php
Original file line number Diff line number Diff line change
Expand Up @@ -590,6 +590,7 @@ public function __construct(
$c->get(IRichTextFormatter::class),
$l10n,
$c->get(ITimeFactory::class),
$c->get(\OC\AppFramework\Bootstrap\Coordinator::class),
);
});

Expand Down
30 changes: 30 additions & 0 deletions lib/public/Activity/IActivityFocusedSelector.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<?php

declare(strict_types=1);

/**
* SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/

namespace OCP\Activity;

use OCP\AppFramework\Attribute\Implementable;
use OCP\DB\QueryBuilder\ICompositeExpression;
use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\DB\QueryBuilder\IQueryFunction;

/**
* @since 35.0.0
*/
#[Implementable(since: '35.0.0')]
interface IActivityFocusedSelector {
/**
* Extend query with joins if needed, and return an array of conditions to add
* in the OR clause of the WHERE for filtering focused activity events
*
* @return list<string|ICompositeExpression|IQueryFunction> conditions to add in the where clause
* @since 35.0.0
*/
public function extendQuery(IQueryBuilder $query, string $userId): array;
}
10 changes: 10 additions & 0 deletions lib/public/Activity/IManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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<IActivityFocusedSelector>
* @since 35.0.0
*/
public function getActivityFocusedSelectors(): array;
}
9 changes: 9 additions & 0 deletions lib/public/AppFramework/Bootstrap/IRegistrationContext.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Loading