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 @@ +