mirror of
https://github.com/nextcloud/server.git
synced 2026-06-25 00:20:33 -04:00
refactor: Add new modern events for system tag lifecycle
The old one was deprecated in 22.0.0 but didn't had a replacement. Signed-off-by: Carl Schwan <carlschwan@kde.org>
This commit is contained in:
parent
351d3c6377
commit
b42ebea5fc
21 changed files with 425 additions and 355 deletions
|
|
@ -10,7 +10,6 @@ return array(
|
|||
'OCA\\AdminAudit\\Actions\\Action' => $baseDir . '/../lib/Actions/Action.php',
|
||||
'OCA\\AdminAudit\\Actions\\Files' => $baseDir . '/../lib/Actions/Files.php',
|
||||
'OCA\\AdminAudit\\Actions\\Sharing' => $baseDir . '/../lib/Actions/Sharing.php',
|
||||
'OCA\\AdminAudit\\Actions\\TagManagement' => $baseDir . '/../lib/Actions/TagManagement.php',
|
||||
'OCA\\AdminAudit\\Actions\\Trashbin' => $baseDir . '/../lib/Actions/Trashbin.php',
|
||||
'OCA\\AdminAudit\\Actions\\Versions' => $baseDir . '/../lib/Actions/Versions.php',
|
||||
'OCA\\AdminAudit\\AppInfo\\Application' => $baseDir . '/../lib/AppInfo/Application.php',
|
||||
|
|
@ -26,5 +25,6 @@ return array(
|
|||
'OCA\\AdminAudit\\Listener\\GroupManagementEventListener' => $baseDir . '/../lib/Listener/GroupManagementEventListener.php',
|
||||
'OCA\\AdminAudit\\Listener\\SecurityEventListener' => $baseDir . '/../lib/Listener/SecurityEventListener.php',
|
||||
'OCA\\AdminAudit\\Listener\\SharingEventListener' => $baseDir . '/../lib/Listener/SharingEventListener.php',
|
||||
'OCA\\AdminAudit\\Listener\\TagEventListener' => $baseDir . '/../lib/Listener/TagEventListener.php',
|
||||
'OCA\\AdminAudit\\Listener\\UserManagementEventListener' => $baseDir . '/../lib/Listener/UserManagementEventListener.php',
|
||||
);
|
||||
|
|
|
|||
|
|
@ -25,7 +25,6 @@ class ComposerStaticInitAdminAudit
|
|||
'OCA\\AdminAudit\\Actions\\Action' => __DIR__ . '/..' . '/../lib/Actions/Action.php',
|
||||
'OCA\\AdminAudit\\Actions\\Files' => __DIR__ . '/..' . '/../lib/Actions/Files.php',
|
||||
'OCA\\AdminAudit\\Actions\\Sharing' => __DIR__ . '/..' . '/../lib/Actions/Sharing.php',
|
||||
'OCA\\AdminAudit\\Actions\\TagManagement' => __DIR__ . '/..' . '/../lib/Actions/TagManagement.php',
|
||||
'OCA\\AdminAudit\\Actions\\Trashbin' => __DIR__ . '/..' . '/../lib/Actions/Trashbin.php',
|
||||
'OCA\\AdminAudit\\Actions\\Versions' => __DIR__ . '/..' . '/../lib/Actions/Versions.php',
|
||||
'OCA\\AdminAudit\\AppInfo\\Application' => __DIR__ . '/..' . '/../lib/AppInfo/Application.php',
|
||||
|
|
@ -41,6 +40,7 @@ class ComposerStaticInitAdminAudit
|
|||
'OCA\\AdminAudit\\Listener\\GroupManagementEventListener' => __DIR__ . '/..' . '/../lib/Listener/GroupManagementEventListener.php',
|
||||
'OCA\\AdminAudit\\Listener\\SecurityEventListener' => __DIR__ . '/..' . '/../lib/Listener/SecurityEventListener.php',
|
||||
'OCA\\AdminAudit\\Listener\\SharingEventListener' => __DIR__ . '/..' . '/../lib/Listener/SharingEventListener.php',
|
||||
'OCA\\AdminAudit\\Listener\\TagEventListener' => __DIR__ . '/..' . '/../lib/Listener/TagEventListener.php',
|
||||
'OCA\\AdminAudit\\Listener\\UserManagementEventListener' => __DIR__ . '/..' . '/../lib/Listener/UserManagementEventListener.php',
|
||||
);
|
||||
|
||||
|
|
|
|||
|
|
@ -1,28 +0,0 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
/*!
|
||||
* SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
|
||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
*/
|
||||
|
||||
namespace OCA\AdminAudit\Actions;
|
||||
|
||||
use OCP\SystemTag\ISystemTag;
|
||||
|
||||
class TagManagement extends Action {
|
||||
/**
|
||||
* @param ISystemTag $tag newly created tag
|
||||
*/
|
||||
public function createTag(ISystemTag $tag): void {
|
||||
$this->log('System tag "%s" (%s, %s) created',
|
||||
[
|
||||
'name' => $tag->getName(),
|
||||
'visibility' => $tag->isUserVisible() ? 'visible' : 'invisible',
|
||||
'assignable' => $tag->isUserAssignable() ? 'user assignable' : 'system only',
|
||||
],
|
||||
['name', 'visibility', 'assignable']
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
@ -13,7 +13,6 @@ use OCA\AdminAudit\Actions\Auth;
|
|||
use OCA\AdminAudit\Actions\Console;
|
||||
use OCA\AdminAudit\Actions\Files;
|
||||
use OCA\AdminAudit\Actions\Sharing;
|
||||
use OCA\AdminAudit\Actions\TagManagement;
|
||||
use OCA\AdminAudit\Actions\Trashbin;
|
||||
use OCA\AdminAudit\Actions\Versions;
|
||||
use OCA\AdminAudit\AuditLogger;
|
||||
|
|
@ -27,6 +26,7 @@ use OCA\AdminAudit\Listener\FileEventListener;
|
|||
use OCA\AdminAudit\Listener\GroupManagementEventListener;
|
||||
use OCA\AdminAudit\Listener\SecurityEventListener;
|
||||
use OCA\AdminAudit\Listener\SharingEventListener;
|
||||
use OCA\AdminAudit\Listener\TagEventListener;
|
||||
use OCA\AdminAudit\Listener\UserManagementEventListener;
|
||||
use OCA\Files_Versions\Events\VersionRestoredEvent;
|
||||
use OCP\App\Events\AppDisableEvent;
|
||||
|
|
@ -58,7 +58,7 @@ use OCP\Preview\BeforePreviewFetchedEvent;
|
|||
use OCP\Share;
|
||||
use OCP\Share\Events\ShareCreatedEvent;
|
||||
use OCP\Share\Events\ShareDeletedEvent;
|
||||
use OCP\SystemTag\ManagerEvent;
|
||||
use OCP\SystemTag\Events\TagCreatedEvent;
|
||||
use OCP\User\Events\BeforeUserLoggedInEvent;
|
||||
use OCP\User\Events\BeforeUserLoggedOutEvent;
|
||||
use OCP\User\Events\PasswordUpdatedEvent;
|
||||
|
|
@ -127,6 +127,9 @@ class Application extends App implements IBootstrap {
|
|||
// Cache events
|
||||
$context->registerEventListener(CacheEntryInsertedEvent::class, CacheEventListener::class);
|
||||
$context->registerEventListener(CacheEntryRemovedEvent::class, CacheEventListener::class);
|
||||
|
||||
// System tag event
|
||||
$context->registerEventListener(TagCreatedEvent::class, TagEventListener::class);
|
||||
}
|
||||
|
||||
#[\Override]
|
||||
|
|
@ -151,7 +154,6 @@ class Application extends App implements IBootstrap {
|
|||
$this->fileHooks($logger, $eventDispatcher);
|
||||
$this->trashbinHooks($logger);
|
||||
$this->versionsHooks($logger);
|
||||
$this->tagHooks($logger, $eventDispatcher);
|
||||
}
|
||||
|
||||
private function sharingLegacyHooks(IAuditLogger $logger): void {
|
||||
|
|
@ -163,14 +165,6 @@ class Application extends App implements IBootstrap {
|
|||
Util::connectHook(Share::class, 'share_link_access', $shareActions, 'shareAccessed');
|
||||
}
|
||||
|
||||
private function tagHooks(IAuditLogger $logger,
|
||||
IEventDispatcher $eventDispatcher): void {
|
||||
$eventDispatcher->addListener(ManagerEvent::EVENT_CREATE, function (ManagerEvent $event) use ($logger): void {
|
||||
$tagActions = new TagManagement($logger);
|
||||
$tagActions->createTag($event->getTag());
|
||||
});
|
||||
}
|
||||
|
||||
private function fileHooks(IAuditLogger $logger, IEventDispatcher $eventDispatcher): void {
|
||||
$fileActions = new Files($logger);
|
||||
|
||||
|
|
|
|||
40
apps/admin_audit/lib/Listener/TagEventListener.php
Normal file
40
apps/admin_audit/lib/Listener/TagEventListener.php
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
/**
|
||||
* SPDX-FileCopyrightText: 2026 Nextcloud GmbH
|
||||
* SPDX-FileContributor: Carl Schwan
|
||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
*/
|
||||
|
||||
namespace OCA\AdminAudit\Listener;
|
||||
|
||||
use OCA\AdminAudit\Actions\Action;
|
||||
use OCP\EventDispatcher\Event;
|
||||
use OCP\EventDispatcher\IEventListener;
|
||||
use OCP\SystemTag\Events\TagCreatedEvent;
|
||||
use Override;
|
||||
|
||||
/**
|
||||
* @template-implements IEventListener<TagCreatedEvent>
|
||||
*/
|
||||
class TagEventListener extends Action implements IEventListener {
|
||||
#[Override]
|
||||
public function handle(Event $event): void {
|
||||
if (!$event instanceof TagCreatedEvent) {
|
||||
return;
|
||||
}
|
||||
|
||||
$tag = $event->getTag();
|
||||
|
||||
$this->log('System tag "%s" (%s, %s) created',
|
||||
[
|
||||
'name' => $tag->getName(),
|
||||
'visibility' => $tag->isUserVisible() ? 'visible' : 'invisible',
|
||||
'assignable' => $tag->isUserAssignable() ? 'user assignable' : 'system only',
|
||||
],
|
||||
['name', 'visibility', 'assignable']
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
@ -7,9 +7,9 @@ $baseDir = $vendorDir;
|
|||
|
||||
return array(
|
||||
'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php',
|
||||
'OCA\\SystemTags\\Activity\\Listener' => $baseDir . '/../lib/Activity/Listener.php',
|
||||
'OCA\\SystemTags\\Activity\\Provider' => $baseDir . '/../lib/Activity/Provider.php',
|
||||
'OCA\\SystemTags\\Activity\\Setting' => $baseDir . '/../lib/Activity/Setting.php',
|
||||
'OCA\\SystemTags\\Activity\\TagListener' => $baseDir . '/../lib/Activity/TagListener.php',
|
||||
'OCA\\SystemTags\\AppInfo\\Application' => $baseDir . '/../lib/AppInfo/Application.php',
|
||||
'OCA\\SystemTags\\Capabilities' => $baseDir . '/../lib/Capabilities.php',
|
||||
'OCA\\SystemTags\\Command\\Files\\Add' => $baseDir . '/../lib/Command/Files/Add.php',
|
||||
|
|
|
|||
|
|
@ -22,9 +22,9 @@ class ComposerStaticInitSystemTags
|
|||
|
||||
public static $classMap = array (
|
||||
'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php',
|
||||
'OCA\\SystemTags\\Activity\\Listener' => __DIR__ . '/..' . '/../lib/Activity/Listener.php',
|
||||
'OCA\\SystemTags\\Activity\\Provider' => __DIR__ . '/..' . '/../lib/Activity/Provider.php',
|
||||
'OCA\\SystemTags\\Activity\\Setting' => __DIR__ . '/..' . '/../lib/Activity/Setting.php',
|
||||
'OCA\\SystemTags\\Activity\\TagListener' => __DIR__ . '/..' . '/../lib/Activity/TagListener.php',
|
||||
'OCA\\SystemTags\\AppInfo\\Application' => __DIR__ . '/..' . '/../lib/AppInfo/Application.php',
|
||||
'OCA\\SystemTags\\Capabilities' => __DIR__ . '/..' . '/../lib/Capabilities.php',
|
||||
'OCA\\SystemTags\\Command\\Files\\Add' => __DIR__ . '/..' . '/../lib/Command/Files/Add.php',
|
||||
|
|
|
|||
|
|
@ -1,222 +0,0 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
|
||||
* SPDX-FileCopyrightText: 2016 ownCloud, Inc.
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
|
||||
namespace OCA\SystemTags\Activity;
|
||||
|
||||
use OCP\Activity\IManager;
|
||||
use OCP\App\IAppManager;
|
||||
use OCP\Files\Config\IMountProviderCollection;
|
||||
use OCP\Files\IRootFolder;
|
||||
use OCP\Files\Node;
|
||||
use OCP\IConfig;
|
||||
use OCP\IGroup;
|
||||
use OCP\IGroupManager;
|
||||
use OCP\IUser;
|
||||
use OCP\IUserSession;
|
||||
use OCP\Share\IShareHelper;
|
||||
use OCP\SystemTag\ISystemTag;
|
||||
use OCP\SystemTag\ISystemTagManager;
|
||||
use OCP\SystemTag\ManagerEvent;
|
||||
use OCP\SystemTag\MapperEvent;
|
||||
use OCP\SystemTag\TagNotFoundException;
|
||||
|
||||
class Listener {
|
||||
/**
|
||||
* Listener constructor.
|
||||
*
|
||||
* @param IGroupManager $groupManager
|
||||
* @param IManager $activityManager
|
||||
* @param IUserSession $session
|
||||
* @param IConfig $config
|
||||
* @param ISystemTagManager $tagManager
|
||||
* @param IAppManager $appManager
|
||||
* @param IMountProviderCollection $mountCollection
|
||||
* @param IRootFolder $rootFolder
|
||||
* @param IShareHelper $shareHelper
|
||||
*/
|
||||
public function __construct(
|
||||
protected IGroupManager $groupManager,
|
||||
protected IManager $activityManager,
|
||||
protected IUserSession $session,
|
||||
protected IConfig $config,
|
||||
protected ISystemTagManager $tagManager,
|
||||
protected IAppManager $appManager,
|
||||
protected IMountProviderCollection $mountCollection,
|
||||
protected IRootFolder $rootFolder,
|
||||
protected IShareHelper $shareHelper,
|
||||
) {
|
||||
}
|
||||
|
||||
/**
|
||||
* @param ManagerEvent $event
|
||||
*/
|
||||
public function event(ManagerEvent $event) {
|
||||
$actor = $this->session->getUser();
|
||||
if ($actor instanceof IUser) {
|
||||
$actor = $actor->getUID();
|
||||
} else {
|
||||
$actor = '';
|
||||
}
|
||||
$tag = $event->getTag();
|
||||
|
||||
$activity = $this->activityManager->generateEvent();
|
||||
$activity->setApp('systemtags')
|
||||
->setType('systemtags')
|
||||
->setAuthor($actor)
|
||||
->setObject('systemtag', (int)$tag->getId(), $tag->getName());
|
||||
if ($event->getEvent() === ManagerEvent::EVENT_CREATE) {
|
||||
$activity->setSubject(Provider::CREATE_TAG, [
|
||||
$actor,
|
||||
$this->prepareTagAsParameter($event->getTag()),
|
||||
]);
|
||||
} elseif ($event->getEvent() === ManagerEvent::EVENT_UPDATE) {
|
||||
$activity->setSubject(Provider::UPDATE_TAG, [
|
||||
$actor,
|
||||
$this->prepareTagAsParameter($event->getTag()),
|
||||
$this->prepareTagAsParameter($event->getTagBefore()),
|
||||
]);
|
||||
} elseif ($event->getEvent() === ManagerEvent::EVENT_DELETE) {
|
||||
$activity->setSubject(Provider::DELETE_TAG, [
|
||||
$actor,
|
||||
$this->prepareTagAsParameter($event->getTag()),
|
||||
]);
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
|
||||
$group = $this->groupManager->get('admin');
|
||||
if ($group instanceof IGroup) {
|
||||
foreach ($group->getUsers() as $user) {
|
||||
$activity->setAffectedUser($user->getUID());
|
||||
$this->activityManager->publish($activity);
|
||||
}
|
||||
}
|
||||
|
||||
if ($actor !== '' && ($event->getEvent() === ManagerEvent::EVENT_CREATE || $event->getEvent() === ManagerEvent::EVENT_UPDATE)) {
|
||||
$this->updateLastUsedTags($actor, $event->getTag());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param MapperEvent $event
|
||||
*/
|
||||
public function mapperEvent(MapperEvent $event) {
|
||||
$tagIds = $event->getTags();
|
||||
if ($event->getObjectType() !== 'files' || empty($tagIds)
|
||||
|| !in_array($event->getEvent(), [MapperEvent::EVENT_ASSIGN, MapperEvent::EVENT_UNASSIGN])
|
||||
|| !$this->appManager->isEnabledForAnyone('activity')) {
|
||||
// System tags not for files, no tags, not (un-)assigning or no activity-app enabled (save the energy)
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
$tags = $this->tagManager->getTagsByIds($tagIds);
|
||||
} catch (TagNotFoundException $e) {
|
||||
// User assigned/unassigned a non-existing tag, ignore...
|
||||
return;
|
||||
}
|
||||
|
||||
if (empty($tags)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Get all mount point owners
|
||||
$cache = $this->mountCollection->getMountCache();
|
||||
$mounts = $cache->getMountsForFileId($event->getObjectId());
|
||||
if (empty($mounts)) {
|
||||
return;
|
||||
}
|
||||
|
||||
$users = [];
|
||||
foreach ($mounts as $mount) {
|
||||
$owner = $mount->getUser()->getUID();
|
||||
$ownerFolder = $this->rootFolder->getUserFolder($owner);
|
||||
$nodes = $ownerFolder->getById($event->getObjectId());
|
||||
if (!empty($nodes)) {
|
||||
/** @var Node $node */
|
||||
$node = array_shift($nodes);
|
||||
$al = $this->shareHelper->getPathsForAccessList($node);
|
||||
$users += $al['users'];
|
||||
}
|
||||
}
|
||||
|
||||
$actor = $this->session->getUser();
|
||||
if ($actor instanceof IUser) {
|
||||
$actor = $actor->getUID();
|
||||
} else {
|
||||
$actor = '';
|
||||
}
|
||||
|
||||
$activity = $this->activityManager->generateEvent();
|
||||
$activity->setApp('systemtags')
|
||||
->setType('systemtags')
|
||||
->setAuthor($actor)
|
||||
->setObject($event->getObjectType(), (int)$event->getObjectId());
|
||||
|
||||
foreach ($users as $user => $path) {
|
||||
$user = (string)$user; // numerical ids could be ints which are not accepted everywhere
|
||||
$activity->setAffectedUser($user);
|
||||
|
||||
foreach ($tags as $tag) {
|
||||
// don't publish activity for non-admins if tag is invisible
|
||||
if (!$tag->isUserVisible() && !$this->groupManager->isAdmin($user)) {
|
||||
continue;
|
||||
}
|
||||
if ($event->getEvent() === MapperEvent::EVENT_ASSIGN) {
|
||||
$activity->setSubject(Provider::ASSIGN_TAG, [
|
||||
$actor,
|
||||
$path,
|
||||
$this->prepareTagAsParameter($tag),
|
||||
]);
|
||||
} elseif ($event->getEvent() === MapperEvent::EVENT_UNASSIGN) {
|
||||
$activity->setSubject(Provider::UNASSIGN_TAG, [
|
||||
$actor,
|
||||
$path,
|
||||
$this->prepareTagAsParameter($tag),
|
||||
]);
|
||||
}
|
||||
|
||||
$this->activityManager->publish($activity);
|
||||
}
|
||||
}
|
||||
|
||||
if ($actor !== '' && $event->getEvent() === MapperEvent::EVENT_ASSIGN) {
|
||||
foreach ($tags as $tag) {
|
||||
$this->updateLastUsedTags($actor, $tag);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $actor
|
||||
* @param ISystemTag $tag
|
||||
*/
|
||||
protected function updateLastUsedTags($actor, ISystemTag $tag) {
|
||||
$lastUsedTags = $this->config->getUserValue($actor, 'systemtags', 'last_used', '[]');
|
||||
$lastUsedTags = json_decode($lastUsedTags, true);
|
||||
|
||||
array_unshift($lastUsedTags, $tag->getId());
|
||||
$lastUsedTags = array_unique($lastUsedTags);
|
||||
$lastUsedTags = array_slice($lastUsedTags, 0, 10);
|
||||
|
||||
$this->config->setUserValue($actor, 'systemtags', 'last_used', json_encode($lastUsedTags));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param ISystemTag $tag
|
||||
* @return string
|
||||
*/
|
||||
protected function prepareTagAsParameter(ISystemTag $tag) {
|
||||
return json_encode([
|
||||
'id' => $tag->getId(),
|
||||
'name' => $tag->getName(),
|
||||
'assignable' => $tag->isUserAssignable(),
|
||||
'visible' => $tag->isUserVisible(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
218
apps/systemtags/lib/Activity/TagListener.php
Normal file
218
apps/systemtags/lib/Activity/TagListener.php
Normal file
|
|
@ -0,0 +1,218 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
|
||||
* SPDX-FileCopyrightText: 2016 ownCloud, Inc.
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
|
||||
namespace OCA\SystemTags\Activity;
|
||||
|
||||
use OCP\Activity\IManager;
|
||||
use OCP\App\IAppManager;
|
||||
use OCP\Config\IUserConfig;
|
||||
use OCP\EventDispatcher\Event;
|
||||
use OCP\EventDispatcher\IEventListener;
|
||||
use OCP\Files\Config\IMountProviderCollection;
|
||||
use OCP\Files\IRootFolder;
|
||||
use OCP\Files\Node;
|
||||
use OCP\IGroup;
|
||||
use OCP\IGroupManager;
|
||||
use OCP\IUser;
|
||||
use OCP\IUserSession;
|
||||
use OCP\Share\IShareHelper;
|
||||
use OCP\SystemTag\Events\AbstractTagEvent;
|
||||
use OCP\SystemTag\Events\TagCreatedEvent;
|
||||
use OCP\SystemTag\Events\TagDeletedEvent;
|
||||
use OCP\SystemTag\Events\TagUpdatedEvent;
|
||||
use OCP\SystemTag\ISystemTag;
|
||||
use OCP\SystemTag\ISystemTagManager;
|
||||
use OCP\SystemTag\TagAssignedEvent;
|
||||
use OCP\SystemTag\TagNotFoundException;
|
||||
use OCP\SystemTag\TagUnassignedEvent;
|
||||
use Override;
|
||||
|
||||
/**
|
||||
* @template-implements IEventListener<TagAssignedEvent|TagUnassignedEvent|TagUpdatedEvent|TagCreatedEvent|TagDeletedEvent>
|
||||
*/
|
||||
class TagListener implements IEventListener {
|
||||
public function __construct(
|
||||
private readonly IGroupManager $groupManager,
|
||||
private readonly IManager $activityManager,
|
||||
private readonly IUserSession $session,
|
||||
private readonly IUserConfig $userConfig,
|
||||
private readonly ISystemTagManager $tagManager,
|
||||
private readonly IAppManager $appManager,
|
||||
private readonly IMountProviderCollection $mountCollection,
|
||||
private readonly IRootFolder $rootFolder,
|
||||
private readonly IShareHelper $shareHelper,
|
||||
) {
|
||||
}
|
||||
|
||||
#[Override]
|
||||
public function handle(Event $event): void {
|
||||
if ($event instanceof AbstractTagEvent) {
|
||||
$this->handleManagerEvent($event);
|
||||
} elseif ($event instanceof TagAssignedEvent || $event instanceof TagUnassignedEvent) {
|
||||
$this->handleTagEvent($event);
|
||||
}
|
||||
}
|
||||
|
||||
private function handleManagerEvent(AbstractTagEvent $event): void {
|
||||
if (!$this->appManager->isEnabledForAnyone('activity')) {
|
||||
return;
|
||||
}
|
||||
|
||||
$actor = $this->session->getUser();
|
||||
if ($actor instanceof IUser) {
|
||||
$actor = $actor->getUID();
|
||||
} else {
|
||||
$actor = '';
|
||||
}
|
||||
$tag = $event->getTag();
|
||||
|
||||
$activity = $this->activityManager->generateEvent();
|
||||
$activity->setApp('systemtags')
|
||||
->setType('systemtags')
|
||||
->setAuthor($actor)
|
||||
->setObject('systemtag', (int)$tag->getId(), $tag->getName());
|
||||
if ($event instanceof TagCreatedEvent) {
|
||||
$activity->setSubject(Provider::CREATE_TAG, [
|
||||
$actor,
|
||||
$this->prepareTagAsParameter($event->getTag()),
|
||||
]);
|
||||
} elseif ($event instanceof TagUpdatedEvent) {
|
||||
$activity->setSubject(Provider::UPDATE_TAG, [
|
||||
$actor,
|
||||
$this->prepareTagAsParameter($event->getTag()),
|
||||
$this->prepareTagAsParameter($event->getTagBefore()),
|
||||
]);
|
||||
} elseif ($event instanceof TagDeletedEvent) {
|
||||
$activity->setSubject(Provider::DELETE_TAG, [
|
||||
$actor,
|
||||
$this->prepareTagAsParameter($event->getTag()),
|
||||
]);
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
|
||||
$group = $this->groupManager->get('admin');
|
||||
if ($group instanceof IGroup) {
|
||||
foreach ($group->getUsers() as $user) {
|
||||
$activity->setAffectedUser($user->getUID());
|
||||
$this->activityManager->publish($activity);
|
||||
}
|
||||
}
|
||||
|
||||
if ($actor !== '' && ($event instanceof TagCreatedEvent || $event instanceof TagUpdatedEvent)) {
|
||||
$this->updateLastUsedTags($actor, $event->getTag());
|
||||
}
|
||||
}
|
||||
|
||||
private function handleTagEvent(TagAssignedEvent|TagUnassignedEvent $event) {
|
||||
$tagIds = $event->getTags();
|
||||
if ($event->getObjectType() !== 'files' || empty($tagIds)
|
||||
|| !$this->appManager->isEnabledForAnyone('activity')) {
|
||||
// System tags not for files, no tags, not (un-)assigning or no activity-app enabled (save the energy)
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
$tags = $this->tagManager->getTagsByIds($tagIds);
|
||||
} catch (TagNotFoundException $e) {
|
||||
// User assigned/unassigned a non-existing tag, ignore...
|
||||
return;
|
||||
}
|
||||
|
||||
if (empty($tags)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Get all mount point owners
|
||||
$cache = $this->mountCollection->getMountCache();
|
||||
foreach ($event->getObjectIds() as $objectId) {
|
||||
$mounts = $cache->getMountsForFileId((int)$objectId);
|
||||
if (empty($mounts)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$users = [];
|
||||
foreach ($mounts as $mount) {
|
||||
$owner = $mount->getUser()->getUID();
|
||||
$ownerFolder = $this->rootFolder->getUserFolder($owner);
|
||||
$nodes = $ownerFolder->getById((int)$objectId);
|
||||
if (!empty($nodes)) {
|
||||
/** @var Node $node */
|
||||
$node = array_shift($nodes);
|
||||
$al = $this->shareHelper->getPathsForAccessList($node);
|
||||
$users += $al['users'];
|
||||
}
|
||||
}
|
||||
|
||||
$actor = $this->session->getUser();
|
||||
if ($actor instanceof IUser) {
|
||||
$actor = $actor->getUID();
|
||||
} else {
|
||||
$actor = '';
|
||||
}
|
||||
|
||||
$activity = $this->activityManager->generateEvent();
|
||||
$activity->setApp('systemtags')
|
||||
->setType('systemtags')
|
||||
->setAuthor($actor)
|
||||
->setObject($event->getObjectType(), (int)$objectId);
|
||||
|
||||
foreach ($users as $user => $path) {
|
||||
$user = (string)$user; // numerical ids could be ints which are not accepted everywhere
|
||||
$activity->setAffectedUser($user);
|
||||
|
||||
foreach ($tags as $tag) {
|
||||
// don't publish activity for non-admins if tag is invisible
|
||||
if (!$tag->isUserVisible() && !$this->groupManager->isAdmin($user)) {
|
||||
continue;
|
||||
}
|
||||
if ($event instanceof TagAssignedEvent) {
|
||||
$activity->setSubject(Provider::ASSIGN_TAG, [
|
||||
$actor,
|
||||
$path,
|
||||
$this->prepareTagAsParameter($tag),
|
||||
]);
|
||||
} else {
|
||||
$activity->setSubject(Provider::UNASSIGN_TAG, [
|
||||
$actor,
|
||||
$path,
|
||||
$this->prepareTagAsParameter($tag),
|
||||
]);
|
||||
}
|
||||
|
||||
$this->activityManager->publish($activity);
|
||||
}
|
||||
}
|
||||
|
||||
if ($actor !== '' && $event instanceof TagAssignedEvent) {
|
||||
foreach ($tags as $tag) {
|
||||
$this->updateLastUsedTags($actor, $tag);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected function updateLastUsedTags(string $actor, ISystemTag $tag): void {
|
||||
$lastUsedTags = $this->userConfig->getValueArray($actor, 'systemtags', 'last_used');
|
||||
|
||||
array_unshift($lastUsedTags, $tag->getId());
|
||||
$lastUsedTags = array_unique($lastUsedTags);
|
||||
$lastUsedTags = array_slice($lastUsedTags, 0, 10);
|
||||
|
||||
$this->userConfig->setValueArray($actor, 'systemtags', 'last_used', $lastUsedTags);
|
||||
}
|
||||
|
||||
protected function prepareTagAsParameter(ISystemTag $tag): string {
|
||||
return json_encode([
|
||||
'id' => $tag->getId(),
|
||||
'name' => $tag->getName(),
|
||||
'assignable' => $tag->isUserAssignable(),
|
||||
'visible' => $tag->isUserVisible(),
|
||||
], flags: JSON_THROW_ON_ERROR);
|
||||
}
|
||||
}
|
||||
|
|
@ -11,7 +11,7 @@ namespace OCA\SystemTags\AppInfo;
|
|||
|
||||
use OCA\Files\Event\LoadAdditionalScriptsEvent;
|
||||
use OCA\Files_Sharing\Event\BeforeTemplateRenderedEvent;
|
||||
use OCA\SystemTags\Activity\Listener;
|
||||
use OCA\SystemTags\Activity\TagListener;
|
||||
use OCA\SystemTags\Capabilities;
|
||||
use OCA\SystemTags\Listeners\BeforeSabrePubliclyLoadedListener;
|
||||
use OCA\SystemTags\Listeners\BeforeTemplateRenderedListener;
|
||||
|
|
@ -22,9 +22,11 @@ use OCP\AppFramework\Bootstrap\IBootContext;
|
|||
use OCP\AppFramework\Bootstrap\IBootstrap;
|
||||
use OCP\AppFramework\Bootstrap\IRegistrationContext;
|
||||
use OCP\BeforeSabrePubliclyLoadedEvent;
|
||||
use OCP\EventDispatcher\IEventDispatcher;
|
||||
use OCP\SystemTag\ManagerEvent;
|
||||
use OCP\SystemTag\MapperEvent;
|
||||
use OCP\SystemTag\Events\TagCreatedEvent;
|
||||
use OCP\SystemTag\Events\TagDeletedEvent;
|
||||
use OCP\SystemTag\Events\TagUpdatedEvent;
|
||||
use OCP\SystemTag\TagAssignedEvent;
|
||||
use OCP\SystemTag\TagUnassignedEvent;
|
||||
|
||||
class Application extends App implements IBootstrap {
|
||||
public const APP_ID = 'systemtags';
|
||||
|
|
@ -40,27 +42,16 @@ class Application extends App implements IBootstrap {
|
|||
$context->registerEventListener(LoadAdditionalScriptsEvent::class, LoadAdditionalScriptsListener::class);
|
||||
$context->registerEventListener(BeforeTemplateRenderedEvent::class, BeforeTemplateRenderedListener::class);
|
||||
$context->registerEventListener(BeforeSabrePubliclyLoadedEvent::class, BeforeSabrePubliclyLoadedListener::class);
|
||||
|
||||
$context->registerEventListener(TagCreatedEvent::class, TagListener::class);
|
||||
$context->registerEventListener(TagDeletedEvent::class, TagListener::class);
|
||||
$context->registerEventListener(TagUpdatedEvent::class, TagListener::class);
|
||||
|
||||
$context->registerEventListener(TagAssignedEvent::class, TagListener::class);
|
||||
$context->registerEventListener(TagUnassignedEvent::class, TagListener::class);
|
||||
}
|
||||
|
||||
#[\Override]
|
||||
public function boot(IBootContext $context): void {
|
||||
$context->injectFn(function (IEventDispatcher $dispatcher) use ($context): void {
|
||||
$managerListener = function (ManagerEvent $event) use ($context): void {
|
||||
/** @var Listener $listener */
|
||||
$listener = $context->getServerContainer()->query(Listener::class);
|
||||
$listener->event($event);
|
||||
};
|
||||
$dispatcher->addListener(ManagerEvent::EVENT_CREATE, $managerListener);
|
||||
$dispatcher->addListener(ManagerEvent::EVENT_DELETE, $managerListener);
|
||||
$dispatcher->addListener(ManagerEvent::EVENT_UPDATE, $managerListener);
|
||||
|
||||
$mapperListener = function (MapperEvent $event) use ($context): void {
|
||||
/** @var Listener $listener */
|
||||
$listener = $context->getServerContainer()->query(Listener::class);
|
||||
$listener->mapperEvent($event);
|
||||
};
|
||||
$dispatcher->addListener(MapperEvent::EVENT_ASSIGN, $mapperListener);
|
||||
$dispatcher->addListener(MapperEvent::EVENT_UNASSIGN, $mapperListener);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -10,33 +10,23 @@ namespace OCA\SystemTags\Controller;
|
|||
use OCP\AppFramework\Controller;
|
||||
use OCP\AppFramework\Http\Attribute\NoAdminRequired;
|
||||
use OCP\AppFramework\Http\DataResponse;
|
||||
use OCP\IConfig;
|
||||
use OCP\Config\IUserConfig;
|
||||
use OCP\IRequest;
|
||||
use OCP\IUserSession;
|
||||
|
||||
class LastUsedController extends Controller {
|
||||
|
||||
/**
|
||||
* @param string $appName
|
||||
* @param IRequest $request
|
||||
* @param IConfig $config
|
||||
* @param IUserSession $userSession
|
||||
*/
|
||||
public function __construct(
|
||||
$appName,
|
||||
string $appName,
|
||||
IRequest $request,
|
||||
protected IConfig $config,
|
||||
protected IUserSession $userSession,
|
||||
protected readonly IUserConfig $config,
|
||||
protected readonly IUserSession $userSession,
|
||||
) {
|
||||
parent::__construct($appName, $request);
|
||||
}
|
||||
|
||||
#[NoAdminRequired]
|
||||
public function getLastUsedTagIds() {
|
||||
$lastUsed = $this->config->getUserValue($this->userSession->getUser()->getUID(), 'systemtags', 'last_used', '[]');
|
||||
$tagIds = json_decode($lastUsed, true);
|
||||
return new DataResponse(array_map(function ($id) {
|
||||
return (string)$id;
|
||||
}, $tagIds));
|
||||
public function getLastUsedTagIds(): DataResponse {
|
||||
$lastUsed = $this->config->getValueArray($this->userSession->getUser()->getUID(), 'systemtags', 'last_used');
|
||||
return new DataResponse(array_map(static fn ($id): string => (string)$id, $lastUsed));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,9 +7,6 @@
|
|||
<code><![CDATA[Share::class]]></code>
|
||||
<code><![CDATA[Share::class]]></code>
|
||||
</DeprecatedClass>
|
||||
<DeprecatedConstant>
|
||||
<code><![CDATA[ManagerEvent::EVENT_CREATE]]></code>
|
||||
</DeprecatedConstant>
|
||||
<DeprecatedMethod>
|
||||
<code><![CDATA[Util::connectHook('\OCA\Files_Trashbin\Trashbin', 'post_restore', $trashActions, 'restore')]]></code>
|
||||
<code><![CDATA[Util::connectHook('\OCP\Trashbin', 'preDelete', $trashActions, 'delete')]]></code>
|
||||
|
|
@ -2440,54 +2437,6 @@
|
|||
<code><![CDATA[getAppValue]]></code>
|
||||
</DeprecatedMethod>
|
||||
</file>
|
||||
<file src="apps/systemtags/lib/Activity/Listener.php">
|
||||
<DeprecatedConstant>
|
||||
<code><![CDATA[ManagerEvent::EVENT_CREATE]]></code>
|
||||
<code><![CDATA[ManagerEvent::EVENT_CREATE]]></code>
|
||||
<code><![CDATA[ManagerEvent::EVENT_DELETE]]></code>
|
||||
<code><![CDATA[ManagerEvent::EVENT_UPDATE]]></code>
|
||||
<code><![CDATA[ManagerEvent::EVENT_UPDATE]]></code>
|
||||
<code><![CDATA[MapperEvent::EVENT_ASSIGN]]></code>
|
||||
<code><![CDATA[MapperEvent::EVENT_ASSIGN]]></code>
|
||||
<code><![CDATA[MapperEvent::EVENT_ASSIGN]]></code>
|
||||
<code><![CDATA[MapperEvent::EVENT_UNASSIGN]]></code>
|
||||
<code><![CDATA[MapperEvent::EVENT_UNASSIGN]]></code>
|
||||
</DeprecatedConstant>
|
||||
<DeprecatedMethod>
|
||||
<code><![CDATA[getUserValue]]></code>
|
||||
<code><![CDATA[setUserValue]]></code>
|
||||
</DeprecatedMethod>
|
||||
<FalsableReturnStatement>
|
||||
<code><![CDATA[json_encode([
|
||||
'id' => $tag->getId(),
|
||||
'name' => $tag->getName(),
|
||||
'assignable' => $tag->isUserAssignable(),
|
||||
'visible' => $tag->isUserVisible(),
|
||||
])]]></code>
|
||||
</FalsableReturnStatement>
|
||||
<InvalidArgument>
|
||||
<code><![CDATA[$event->getObjectId()]]></code>
|
||||
<code><![CDATA[$event->getObjectId()]]></code>
|
||||
</InvalidArgument>
|
||||
</file>
|
||||
<file src="apps/systemtags/lib/AppInfo/Application.php">
|
||||
<DeprecatedConstant>
|
||||
<code><![CDATA[ManagerEvent::EVENT_CREATE]]></code>
|
||||
<code><![CDATA[ManagerEvent::EVENT_DELETE]]></code>
|
||||
<code><![CDATA[ManagerEvent::EVENT_UPDATE]]></code>
|
||||
<code><![CDATA[MapperEvent::EVENT_ASSIGN]]></code>
|
||||
<code><![CDATA[MapperEvent::EVENT_UNASSIGN]]></code>
|
||||
</DeprecatedConstant>
|
||||
<DeprecatedMethod>
|
||||
<code><![CDATA[query]]></code>
|
||||
<code><![CDATA[query]]></code>
|
||||
</DeprecatedMethod>
|
||||
</file>
|
||||
<file src="apps/systemtags/lib/Controller/LastUsedController.php">
|
||||
<DeprecatedMethod>
|
||||
<code><![CDATA[getUserValue]]></code>
|
||||
</DeprecatedMethod>
|
||||
</file>
|
||||
<file src="apps/testing/lib/AlternativeHomeUserBackend.php">
|
||||
<DeprecatedInterface>
|
||||
<code><![CDATA[AlternativeHomeUserBackend]]></code>
|
||||
|
|
|
|||
|
|
@ -895,6 +895,10 @@ return array(
|
|||
'OCP\\Support\\Subscription\\IRegistry' => $baseDir . '/lib/public/Support/Subscription/IRegistry.php',
|
||||
'OCP\\Support\\Subscription\\ISubscription' => $baseDir . '/lib/public/Support/Subscription/ISubscription.php',
|
||||
'OCP\\Support\\Subscription\\ISupportedApps' => $baseDir . '/lib/public/Support/Subscription/ISupportedApps.php',
|
||||
'OCP\\SystemTag\\Events\\AbstractTagEvent' => $baseDir . '/lib/public/SystemTag/Events/AbstractTagEvent.php',
|
||||
'OCP\\SystemTag\\Events\\TagCreatedEvent' => $baseDir . '/lib/public/SystemTag/Events/TagCreatedEvent.php',
|
||||
'OCP\\SystemTag\\Events\\TagDeletedEvent' => $baseDir . '/lib/public/SystemTag/Events/TagDeletedEvent.php',
|
||||
'OCP\\SystemTag\\Events\\TagUpdatedEvent' => $baseDir . '/lib/public/SystemTag/Events/TagUpdatedEvent.php',
|
||||
'OCP\\SystemTag\\ISystemTag' => $baseDir . '/lib/public/SystemTag/ISystemTag.php',
|
||||
'OCP\\SystemTag\\ISystemTagManager' => $baseDir . '/lib/public/SystemTag/ISystemTagManager.php',
|
||||
'OCP\\SystemTag\\ISystemTagManagerFactory' => $baseDir . '/lib/public/SystemTag/ISystemTagManagerFactory.php',
|
||||
|
|
|
|||
|
|
@ -936,6 +936,10 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2
|
|||
'OCP\\Support\\Subscription\\IRegistry' => __DIR__ . '/../../..' . '/lib/public/Support/Subscription/IRegistry.php',
|
||||
'OCP\\Support\\Subscription\\ISubscription' => __DIR__ . '/../../..' . '/lib/public/Support/Subscription/ISubscription.php',
|
||||
'OCP\\Support\\Subscription\\ISupportedApps' => __DIR__ . '/../../..' . '/lib/public/Support/Subscription/ISupportedApps.php',
|
||||
'OCP\\SystemTag\\Events\\AbstractTagEvent' => __DIR__ . '/../../..' . '/lib/public/SystemTag/Events/AbstractTagEvent.php',
|
||||
'OCP\\SystemTag\\Events\\TagCreatedEvent' => __DIR__ . '/../../..' . '/lib/public/SystemTag/Events/TagCreatedEvent.php',
|
||||
'OCP\\SystemTag\\Events\\TagDeletedEvent' => __DIR__ . '/../../..' . '/lib/public/SystemTag/Events/TagDeletedEvent.php',
|
||||
'OCP\\SystemTag\\Events\\TagUpdatedEvent' => __DIR__ . '/../../..' . '/lib/public/SystemTag/Events/TagUpdatedEvent.php',
|
||||
'OCP\\SystemTag\\ISystemTag' => __DIR__ . '/../../..' . '/lib/public/SystemTag/ISystemTag.php',
|
||||
'OCP\\SystemTag\\ISystemTagManager' => __DIR__ . '/../../..' . '/lib/public/SystemTag/ISystemTagManager.php',
|
||||
'OCP\\SystemTag\\ISystemTagManagerFactory' => __DIR__ . '/../../..' . '/lib/public/SystemTag/ISystemTagManagerFactory.php',
|
||||
|
|
|
|||
|
|
@ -17,6 +17,9 @@ use OCP\IDBConnection;
|
|||
use OCP\IGroupManager;
|
||||
use OCP\IUser;
|
||||
use OCP\IUserSession;
|
||||
use OCP\SystemTag\Events\TagCreatedEvent;
|
||||
use OCP\SystemTag\Events\TagDeletedEvent;
|
||||
use OCP\SystemTag\Events\TagUpdatedEvent;
|
||||
use OCP\SystemTag\ISystemTag;
|
||||
use OCP\SystemTag\ISystemTagManager;
|
||||
use OCP\SystemTag\ManagerEvent;
|
||||
|
|
@ -214,6 +217,7 @@ class SystemTagManager implements ISystemTagManager {
|
|||
$this->dispatcher->dispatch(ManagerEvent::EVENT_CREATE, new ManagerEvent(
|
||||
ManagerEvent::EVENT_CREATE, $tag
|
||||
));
|
||||
$this->dispatcher->dispatchTyped(new TagCreatedEvent($tag));
|
||||
|
||||
return $tag;
|
||||
}
|
||||
|
|
@ -295,6 +299,7 @@ class SystemTagManager implements ISystemTagManager {
|
|||
$this->dispatcher->dispatch(ManagerEvent::EVENT_UPDATE, new ManagerEvent(
|
||||
ManagerEvent::EVENT_UPDATE, $afterUpdate, $beforeUpdate
|
||||
));
|
||||
$this->dispatcher->dispatchTyped(new TagUpdatedEvent($afterUpdate, $beforeUpdate));
|
||||
}
|
||||
|
||||
#[\Override]
|
||||
|
|
@ -338,6 +343,7 @@ class SystemTagManager implements ISystemTagManager {
|
|||
$this->dispatcher->dispatch(ManagerEvent::EVENT_DELETE, new ManagerEvent(
|
||||
ManagerEvent::EVENT_DELETE, $tag
|
||||
));
|
||||
$this->dispatcher->dispatchTyped(new TagDeletedEvent($tag));
|
||||
}
|
||||
|
||||
if ($tagNotFoundException !== null) {
|
||||
|
|
|
|||
38
lib/public/SystemTag/Events/AbstractTagEvent.php
Normal file
38
lib/public/SystemTag/Events/AbstractTagEvent.php
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
/**
|
||||
* SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors
|
||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
*/
|
||||
|
||||
namespace OCP\SystemTag\Events;
|
||||
|
||||
use OCP\AppFramework\Attribute\Consumable;
|
||||
use OCP\EventDispatcher\Event;
|
||||
use OCP\SystemTag\ISystemTag;
|
||||
|
||||
/**
|
||||
* Abstract event related to the lifecycle of a tag.
|
||||
*
|
||||
* @since 35.0.0
|
||||
*/
|
||||
#[Consumable(since: '35.0.0')]
|
||||
abstract class AbstractTagEvent extends Event {
|
||||
/**
|
||||
* AbstractTagEvent constructor
|
||||
* @since 35.0.0
|
||||
*/
|
||||
public function __construct(
|
||||
private readonly ISystemTag $tag,
|
||||
) {
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 35.0.0
|
||||
*/
|
||||
public function getTag(): ISystemTag {
|
||||
return $this->tag;
|
||||
}
|
||||
}
|
||||
21
lib/public/SystemTag/Events/TagCreatedEvent.php
Normal file
21
lib/public/SystemTag/Events/TagCreatedEvent.php
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
/**
|
||||
* SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors
|
||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
*/
|
||||
|
||||
namespace OCP\SystemTag\Events;
|
||||
|
||||
use OCP\AppFramework\Attribute\Consumable;
|
||||
|
||||
/**
|
||||
* Event triggered when creating a new tag.
|
||||
*
|
||||
* @since 35.0.0
|
||||
*/
|
||||
#[Consumable(since: '35.0.0')]
|
||||
class TagCreatedEvent extends AbstractTagEvent {
|
||||
}
|
||||
21
lib/public/SystemTag/Events/TagDeletedEvent.php
Normal file
21
lib/public/SystemTag/Events/TagDeletedEvent.php
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
/**
|
||||
* SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors
|
||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
*/
|
||||
|
||||
namespace OCP\SystemTag\Events;
|
||||
|
||||
use OCP\AppFramework\Attribute\Consumable;
|
||||
|
||||
/**
|
||||
* Event triggered when deleting a new tag.
|
||||
*
|
||||
* @since 35.0.0
|
||||
*/
|
||||
#[Consumable(since: '35.0.0')]
|
||||
class TagDeletedEvent extends AbstractTagEvent {
|
||||
}
|
||||
42
lib/public/SystemTag/Events/TagUpdatedEvent.php
Normal file
42
lib/public/SystemTag/Events/TagUpdatedEvent.php
Normal file
|
|
@ -0,0 +1,42 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
/**
|
||||
* SPDX-FileCopyrightText: 2025 Nextcloud GmbH
|
||||
* SPDX-FileContributor: Carl Schwan
|
||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
*/
|
||||
|
||||
namespace OCP\SystemTag\Events;
|
||||
|
||||
use OCP\AppFramework\Attribute\Consumable;
|
||||
use OCP\SystemTag\ISystemTag;
|
||||
|
||||
/**
|
||||
* Event triggered when updated a tag.
|
||||
*
|
||||
* @since 35.0.0
|
||||
*/
|
||||
#[Consumable(since: '35.0.0')]
|
||||
class TagUpdatedEvent extends AbstractTagEvent {
|
||||
/**
|
||||
* TagUpdatedEvent constructor
|
||||
* @since 35.0.0
|
||||
*/
|
||||
public function __construct(
|
||||
ISystemTag $tag,
|
||||
private readonly ISystemTag $beforeTag,
|
||||
) {
|
||||
parent::__construct($tag);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the tag state before it was updated.
|
||||
*
|
||||
* @since 35.0.0
|
||||
*/
|
||||
public function getTagBefore(): ISystemTag {
|
||||
return $this->beforeTag;
|
||||
}
|
||||
}
|
||||
|
|
@ -15,6 +15,7 @@ use OCP\EventDispatcher\Event;
|
|||
* Class ManagerEvent
|
||||
*
|
||||
* @since 9.0.0
|
||||
* @deprecated 34.0.0
|
||||
*/
|
||||
class ManagerEvent extends Event {
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -35,6 +35,7 @@
|
|||
<file name="lib/public/DB/QueryBuilder/ITypedQueryBuilder.php"/>
|
||||
<file name="lib/private/Share20/ShareHelper.php"/>
|
||||
<file name="lib/public/Share/IShareHelper.php"/>
|
||||
<file name="lib/public/SystemTag/Events/*.php"/>
|
||||
<directory name="apps/appstore/lib" />
|
||||
<ignoreFiles>
|
||||
<!-- Missing types of the AppFetcher and the OC_Apps class for return types -->
|
||||
|
|
|
|||
Loading…
Reference in a new issue