diff options
author | Julius Härtl <jus@bitgrid.net> | 2022-11-11 00:59:41 +0300 |
---|---|---|
committer | Julius Härtl <jus@bitgrid.net> | 2022-11-11 12:24:03 +0300 |
commit | 2ba8fb9afc79d00842c7a5fa88338372671bb7bc (patch) | |
tree | e5522bffe932d0055dfa0d20e3acbd9000f2dd52 | |
parent | 76fd901062caf6fa365279192442b49da1d60e2d (diff) |
Also handle user/group deletion in the listener
Signed-off-by: Julius Härtl <jus@bitgrid.net>
-rw-r--r-- | lib/AppInfo/Application.php | 60 | ||||
-rw-r--r-- | lib/Listeners/CircleEventListener.php | 36 | ||||
-rw-r--r-- | lib/Listeners/ParticipantCleanupListener.php | 57 |
3 files changed, 61 insertions, 92 deletions
diff --git a/lib/AppInfo/Application.php b/lib/AppInfo/Application.php index d53f440c..1f973619 100644 --- a/lib/AppInfo/Application.php +++ b/lib/AppInfo/Application.php @@ -33,9 +33,6 @@ use OCA\Deck\Collaboration\Resources\ResourceProvider; use OCA\Deck\Collaboration\Resources\ResourceProviderCard; use OCA\Deck\Dashboard\DeckWidget; use OCA\Deck\Db\Acl; -use OCA\Deck\Db\AclMapper; -use OCA\Deck\Db\AssignmentMapper; -use OCA\Deck\Db\BoardMapper; use OCA\Deck\Db\CardMapper; use OCA\Deck\Event\AclCreatedEvent; use OCA\Deck\Event\AclDeletedEvent; @@ -44,7 +41,7 @@ use OCA\Deck\Event\CardCreatedEvent; use OCA\Deck\Event\CardDeletedEvent; use OCA\Deck\Event\CardUpdatedEvent; use OCA\Deck\Listeners\BeforeTemplateRenderedListener; -use OCA\Deck\Listeners\CircleEventListener; +use OCA\Deck\Listeners\ParticipantCleanupListener; use OCA\Deck\Listeners\FullTextSearchEventListener; use OCA\Deck\Listeners\ResourceListener; use OCA\Deck\Middleware\DefaultBoardMiddleware; @@ -65,15 +62,12 @@ use OCP\Collaboration\Reference\RenderReferenceEvent; use OCP\Collaboration\Resources\IProviderManager; use OCP\Comments\CommentsEntityEvent; use OCP\Comments\ICommentsManager; -use OCP\EventDispatcher\Event; use OCP\EventDispatcher\IEventDispatcher; use OCP\Group\Events\GroupDeletedEvent; use OCP\IConfig; use OCP\IDBConnection; -use OCP\IGroupManager; use OCP\IRequest; use OCP\Server; -use OCP\IUserManager; use OCP\Notification\IManager as NotificationManager; use OCP\Share\IManager; use OCP\User\Events\UserDeletedEvent; @@ -98,7 +92,6 @@ class Application extends App implements IBootstrap { } public function boot(IBootContext $context): void { - $context->injectFn(Closure::fromCallable([$this, 'registerUserGroupHooks'])); $context->injectFn(Closure::fromCallable([$this, 'registerCommentsEntity'])); $context->injectFn(Closure::fromCallable([$this, 'registerCommentsEventHandler'])); $context->injectFn(Closure::fromCallable([$this, 'registerNotifications'])); @@ -151,60 +144,15 @@ class Application extends App implements IBootstrap { $context->registerEventListener(AclCreatedEvent::class, ResourceListener::class); $context->registerEventListener(AclDeletedEvent::class, ResourceListener::class); - $context->registerEventListener(CircleDestroyedEvent::class, CircleEventListener::class); + $context->registerEventListener(UserDeletedEvent::class, ParticipantCleanupListener::class); + $context->registerEventListener(GroupDeletedEvent::class, ParticipantCleanupListener::class); + $context->registerEventListener(CircleDestroyedEvent::class, ParticipantCleanupListener::class); } public function registerNotifications(NotificationManager $notificationManager): void { $notificationManager->registerNotifierService(Notifier::class); } - private function registerUserGroupHooks(IUserManager $userManager, IGroupManager $groupManager): void { - $container = $this->getContainer(); - /** @var IEventDispatcher $eventDispatcher */ - $eventDispatcher = $container->get(IEventDispatcher::class); - // Delete user/group acl entries when they get deleted - $eventDispatcher->addListener(UserDeletedEvent::class, static function (Event $event) use ($container): void { - if (!($event instanceof UserDeletedEvent)) { - return; - } - $user = $event->getUser(); - // delete existing acl entries for deleted user - /** @var AclMapper $aclMapper */ - $aclMapper = $container->get(AclMapper::class); - $acls = $aclMapper->findByParticipant(Acl::PERMISSION_TYPE_USER, $user->getUID()); - foreach ($acls as $acl) { - $aclMapper->delete($acl); - } - // delete existing user assignments - $assignmentMapper = $container->get(AssignmentMapper::class); - $assignments = $assignmentMapper->findByParticipant($user->getUID()); - foreach ($assignments as $assignment) { - $assignmentMapper->delete($assignment); - } - - /** @var BoardMapper $boardMapper */ - $boardMapper = $container->get(BoardMapper::class); - $boards = $boardMapper->findAllByOwner($user->getUID()); - foreach ($boards as $board) { - $boardMapper->delete($board); - } - }); - - $eventDispatcher->addListener(GroupDeletedEvent::class, static function (Event $event) use ($container): void { - if (!($event instanceof GroupDeletedEvent)) { - return; - } - $group = $event->getGroup(); - /** @var AclMapper $aclMapper */ - $aclMapper = $container->get(AclMapper::class); - $aclMapper->findByParticipant(Acl::PERMISSION_TYPE_GROUP, $group->getGID()); - $acls = $aclMapper->findByParticipant(Acl::PERMISSION_TYPE_GROUP, $group->getGID()); - foreach ($acls as $acl) { - $aclMapper->delete($acl); - } - }); - } - public function registerCommentsEntity(IEventDispatcher $eventDispatcher): void { $eventDispatcher->addListener(CommentsEntityEvent::EVENT_ENTITY, function (CommentsEntityEvent $event) { $event->addEntityCollection(self::COMMENT_ENTITY_TYPE, function ($name) { diff --git a/lib/Listeners/CircleEventListener.php b/lib/Listeners/CircleEventListener.php deleted file mode 100644 index 676c8356..00000000 --- a/lib/Listeners/CircleEventListener.php +++ /dev/null @@ -1,36 +0,0 @@ -<?php - -namespace OCA\Deck\Listeners; - -use OCA\Circles\Events\CircleDestroyedEvent; -use OCA\Deck\Db\Acl; -use OCA\Deck\Db\AclMapper; -use OCA\Deck\Event\AclDeletedEvent; -use OCP\EventDispatcher\Event; -use OCP\EventDispatcher\IEventDispatcher; -use OCP\EventDispatcher\IEventListener; - -class CircleEventListener implements IEventListener { - - /** @var AclMapper */ - private $aclMapper; - - /** @var IEventDispatcher */ - private $eventDispatcher; - - public function __construct(AclMapper $aclMapper, IEventDispatcher $eventDispatcher) { - $this->aclMapper = $aclMapper; - $this->eventDispatcher = $eventDispatcher; - } - - public function handle(Event $event): void { - if ($event instanceof CircleDestroyedEvent) { - $circleId = $event->getCircle()->getSingleId(); - $acls = $this->aclMapper->findByParticipant(Acl::PERMISSION_TYPE_CIRCLE, $circleId); - foreach ($acls as $acl) { - $this->aclMapper->delete($acl); - $this->eventDispatcher->dispatchTyped(new AclDeletedEvent($acl)); - } - } - } -} diff --git a/lib/Listeners/ParticipantCleanupListener.php b/lib/Listeners/ParticipantCleanupListener.php new file mode 100644 index 00000000..aa159107 --- /dev/null +++ b/lib/Listeners/ParticipantCleanupListener.php @@ -0,0 +1,57 @@ +<?php + +namespace OCA\Deck\Listeners; + +use OCA\Circles\Events\CircleDestroyedEvent; +use OCA\Deck\Db\Acl; +use OCA\Deck\Db\AclMapper; +use OCA\Deck\Db\AssignmentMapper; +use OCA\Deck\Db\BoardMapper; +use OCP\EventDispatcher\Event; +use OCP\EventDispatcher\IEventListener; +use OCP\Group\Events\GroupDeletedEvent; +use OCP\User\Events\UserDeletedEvent; + +class ParticipantCleanupListener implements IEventListener { + private AclMapper $aclMapper; + private AssignmentMapper $assignmentMapper; + private BoardMapper $boardMapper; + + public function __construct(AclMapper $aclMapper, AssignmentMapper $assignmentMapper, BoardMapper $boardMapper) { + $this->aclMapper = $aclMapper; + $this->assignmentMapper = $assignmentMapper; + $this->boardMapper = $boardMapper; + } + + public function handle(Event $event): void { + if ($event instanceof UserDeletedEvent) { + $boards = $this->boardMapper->findAllByOwner($event->getUser()->getUID()); + foreach ($boards as $board) { + $this->boardMapper->delete($board); + } + + $this->cleanupByParticipant(Acl::PERMISSION_TYPE_USER, $event->getUser()->getUID()); + } + + if ($event instanceof GroupDeletedEvent) { + $this->cleanupByParticipant(Acl::PERMISSION_TYPE_GROUP, $event->getGroup()->getGID()); + } + + if ($event instanceof CircleDestroyedEvent) { + $circleId = $event->getCircle()->getSingleId(); + $this->cleanupByParticipant(Acl::PERMISSION_TYPE_CIRCLE, $circleId); + } + } + + private function cleanupByParticipant(int $type, string $participant): void { + $acls = $this->aclMapper->findByParticipant($type, $participant); + foreach ($acls as $acl) { + $this->aclMapper->delete($acl); + } + + $assignments = $this->assignmentMapper->findByParticipant($participant, $type); + foreach ($assignments as $assignment) { + $this->assignmentMapper->delete($assignment); + } + } +} |