diff --git a/apps/admin_audit/composer/composer/autoload_classmap.php b/apps/admin_audit/composer/composer/autoload_classmap.php
index d5643b0d5432f..9f496d408eccb 100644
--- a/apps/admin_audit/composer/composer/autoload_classmap.php
+++ b/apps/admin_audit/composer/composer/autoload_classmap.php
@@ -10,7 +10,6 @@
'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 @@
'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',
);
diff --git a/apps/admin_audit/composer/composer/autoload_static.php b/apps/admin_audit/composer/composer/autoload_static.php
index 70affe657e781..4be8380ff543a 100644
--- a/apps/admin_audit/composer/composer/autoload_static.php
+++ b/apps/admin_audit/composer/composer/autoload_static.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',
);
diff --git a/apps/admin_audit/lib/Actions/TagManagement.php b/apps/admin_audit/lib/Actions/TagManagement.php
deleted file mode 100644
index 77a94de3df3c0..0000000000000
--- a/apps/admin_audit/lib/Actions/TagManagement.php
+++ /dev/null
@@ -1,27 +0,0 @@
-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']
- );
- }
-}
diff --git a/apps/admin_audit/lib/AppInfo/Application.php b/apps/admin_audit/lib/AppInfo/Application.php
index 077cc4c47adc0..a606f2d502c68 100644
--- a/apps/admin_audit/lib/AppInfo/Application.php
+++ b/apps/admin_audit/lib/AppInfo/Application.php
@@ -13,7 +13,6 @@
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\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;
@@ -60,7 +60,7 @@
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;
@@ -130,6 +130,9 @@ public function register(IRegistrationContext $context): void {
// Cache events
$context->registerEventListener(CacheEntryInsertedEvent::class, CacheEventListener::class);
$context->registerEventListener(CacheEntryRemovedEvent::class, CacheEventListener::class);
+
+ // System tag event
+ $context->registerEventListener(TagCreatedEvent::class, TagEventListener::class);
}
public function boot(IBootContext $context): void {
@@ -153,7 +156,6 @@ private function registerLegacyHooks(IAuditLogger $logger, ContainerInterface $s
$this->fileHooks($logger, $eventDispatcher);
$this->trashbinHooks($logger);
$this->versionsHooks($logger);
- $this->tagHooks($logger, $eventDispatcher);
}
private function sharingLegacyHooks(IAuditLogger $logger): void {
@@ -165,14 +167,6 @@ private function sharingLegacyHooks(IAuditLogger $logger): void {
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);
diff --git a/apps/admin_audit/lib/Listener/TagEventListener.php b/apps/admin_audit/lib/Listener/TagEventListener.php
new file mode 100644
index 0000000000000..67af542a97968
--- /dev/null
+++ b/apps/admin_audit/lib/Listener/TagEventListener.php
@@ -0,0 +1,40 @@
+
+ */
+class TagEventListener extends Action implements IEventListener {
+ 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']
+ );
+ }
+}
diff --git a/apps/systemtags/composer/composer/autoload_classmap.php b/apps/systemtags/composer/composer/autoload_classmap.php
index 450a387cd7264..3692437be327f 100644
--- a/apps/systemtags/composer/composer/autoload_classmap.php
+++ b/apps/systemtags/composer/composer/autoload_classmap.php
@@ -7,9 +7,9 @@
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',
diff --git a/apps/systemtags/composer/composer/autoload_static.php b/apps/systemtags/composer/composer/autoload_static.php
index 89e57424c4960..f3cccf211cf92 100644
--- a/apps/systemtags/composer/composer/autoload_static.php
+++ b/apps/systemtags/composer/composer/autoload_static.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',
diff --git a/apps/systemtags/lib/Activity/Listener.php b/apps/systemtags/lib/Activity/Listener.php
deleted file mode 100644
index 93e3f102c94b9..0000000000000
--- a/apps/systemtags/lib/Activity/Listener.php
+++ /dev/null
@@ -1,222 +0,0 @@
-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(),
- ]);
- }
-}
diff --git a/apps/systemtags/lib/Activity/TagListener.php b/apps/systemtags/lib/Activity/TagListener.php
new file mode 100644
index 0000000000000..0f2cb1c328469
--- /dev/null
+++ b/apps/systemtags/lib/Activity/TagListener.php
@@ -0,0 +1,212 @@
+
+ */
+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,
+ ) {
+ }
+
+ public function handle(Event $event): void {
+ if ($event instanceof AbstractTagEvent) {
+ $this->handleManagerEvent($event);
+ } elseif ($event instanceof TagAssignedEvent || $event instanceof TagUnassignedEvent) {
+ $this->handleTagEvent($event);
+ }
+ }
+
+ public function handleManagerEvent(AbstractTagEvent $event): void {
+ $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)) {
+ return;
+ }
+
+ $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(),
+ ]);
+ }
+}
diff --git a/apps/systemtags/lib/AppInfo/Application.php b/apps/systemtags/lib/AppInfo/Application.php
index e0cb0a56d77da..3042599fc4ade 100644
--- a/apps/systemtags/lib/AppInfo/Application.php
+++ b/apps/systemtags/lib/AppInfo/Application.php
@@ -10,7 +10,7 @@
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;
@@ -21,9 +21,11 @@
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';
@@ -38,26 +40,15 @@ public function register(IRegistrationContext $context): void {
$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);
}
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);
- });
}
}
diff --git a/apps/systemtags/lib/Controller/LastUsedController.php b/apps/systemtags/lib/Controller/LastUsedController.php
index 617c502d5c692..30f74f27426bf 100644
--- a/apps/systemtags/lib/Controller/LastUsedController.php
+++ b/apps/systemtags/lib/Controller/LastUsedController.php
@@ -9,33 +9,23 @@
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));
}
}
diff --git a/build/psalm-baseline.xml b/build/psalm-baseline.xml
index 9936d3543d934..7eff082e840c8 100644
--- a/build/psalm-baseline.xml
+++ b/build/psalm-baseline.xml
@@ -7,9 +7,6 @@
-
-
-
@@ -2309,46 +2306,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- getObjectId()]]>
- getObjectId()]]>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/lib/composer/composer/autoload_classmap.php b/lib/composer/composer/autoload_classmap.php
index 5b6de5ff356d1..208a7ba5a86aa 100644
--- a/lib/composer/composer/autoload_classmap.php
+++ b/lib/composer/composer/autoload_classmap.php
@@ -893,6 +893,10 @@
'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',
diff --git a/lib/composer/composer/autoload_static.php b/lib/composer/composer/autoload_static.php
index fbee07dafc6b4..d6357f100de78 100644
--- a/lib/composer/composer/autoload_static.php
+++ b/lib/composer/composer/autoload_static.php
@@ -934,6 +934,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',
diff --git a/lib/private/SystemTag/SystemTagManager.php b/lib/private/SystemTag/SystemTagManager.php
index 2b8992f0aef35..e6fcff8178fc4 100644
--- a/lib/private/SystemTag/SystemTagManager.php
+++ b/lib/private/SystemTag/SystemTagManager.php
@@ -16,6 +16,9 @@
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;
@@ -200,6 +203,7 @@ public function createTag(string $tagName, bool $userVisible, bool $userAssignab
$this->dispatcher->dispatch(ManagerEvent::EVENT_CREATE, new ManagerEvent(
ManagerEvent::EVENT_CREATE, $tag
));
+ $this->dispatcher->dispatchTyped(new TagCreatedEvent($tag));
return $tag;
}
@@ -279,6 +283,7 @@ public function updateTag(
$this->dispatcher->dispatch(ManagerEvent::EVENT_UPDATE, new ManagerEvent(
ManagerEvent::EVENT_UPDATE, $afterUpdate, $beforeUpdate
));
+ $this->dispatcher->dispatchTyped(new TagUpdatedEvent($afterUpdate, $beforeUpdate));
}
public function deleteTags($tagIds): void {
@@ -321,6 +326,7 @@ public function deleteTags($tagIds): void {
$this->dispatcher->dispatch(ManagerEvent::EVENT_DELETE, new ManagerEvent(
ManagerEvent::EVENT_DELETE, $tag
));
+ $this->dispatcher->dispatchTyped(new TagDeletedEvent($tag));
}
if ($tagNotFoundException !== null) {
diff --git a/lib/public/SystemTag/Events/AbstractTagEvent.php b/lib/public/SystemTag/Events/AbstractTagEvent.php
new file mode 100644
index 0000000000000..73dba9cad4ad3
--- /dev/null
+++ b/lib/public/SystemTag/Events/AbstractTagEvent.php
@@ -0,0 +1,36 @@
+tag;
+ }
+}
diff --git a/lib/public/SystemTag/Events/TagCreatedEvent.php b/lib/public/SystemTag/Events/TagCreatedEvent.php
new file mode 100644
index 0000000000000..d6228c1d98dff
--- /dev/null
+++ b/lib/public/SystemTag/Events/TagCreatedEvent.php
@@ -0,0 +1,26 @@
+beforeTag;
+ }
+}
diff --git a/lib/public/SystemTag/ManagerEvent.php b/lib/public/SystemTag/ManagerEvent.php
index adfe64f8658c9..6c9369e9816e8 100644
--- a/lib/public/SystemTag/ManagerEvent.php
+++ b/lib/public/SystemTag/ManagerEvent.php
@@ -14,6 +14,7 @@
* Class ManagerEvent
*
* @since 9.0.0
+ * @deprecated 34.0.0
*/
class ManagerEvent extends Event {
/**
diff --git a/psalm-strict.xml b/psalm-strict.xml
index 23cd2081c0b70..a8a173ff93aaf 100644
--- a/psalm-strict.xml
+++ b/psalm-strict.xml
@@ -30,6 +30,7 @@
+