From dd99275f16dbb9b1844e4b3489d883e9d7c4e5e0 Mon Sep 17 00:00:00 2001 From: sualko Date: Thu, 24 Sep 2020 11:05:51 +0200 Subject: [PATCH] fix: clean up after user was deleted fix #80 --- lib/AppInfo/Application.php | 28 +++++++----- lib/Db/RoomShareMapper.php | 12 ++++++ lib/Listener/UserDeletedListener.php | 64 ++++++++++++++++++++++++++++ lib/Service/RoomShareService.php | 4 ++ 4 files changed, 98 insertions(+), 10 deletions(-) create mode 100644 lib/Listener/UserDeletedListener.php diff --git a/lib/AppInfo/Application.php b/lib/AppInfo/Application.php index 2a90d80..c27bbe2 100644 --- a/lib/AppInfo/Application.php +++ b/lib/AppInfo/Application.php @@ -12,12 +12,14 @@ use \OCA\BigBlueButton\Event\RoomCreatedEvent; use \OCA\BigBlueButton\Event\RoomDeletedEvent; use \OCA\BigBlueButton\Event\RoomShareCreatedEvent; use \OCA\BigBlueButton\Event\RoomShareDeletedEvent; +use \OCA\BigBlueButton\Listener\UserDeletedListener; use \OCA\BigBlueButton\Middleware\HookMiddleware; use \OCA\BigBlueButton\Middleware\JoinMiddleware; use \OCP\AppFramework\App; use \OCP\EventDispatcher\IEventDispatcher; use \OCP\IConfig; use \OCP\Settings\IManager as ISettingsManager; +use \OCP\User\Events\UserDeletedEvent; if ((@include_once __DIR__ . '/../../vendor/autoload.php') === false) { throw new \Exception('Cannot include autoload. Did you run install dependencies using composer?'); @@ -31,17 +33,9 @@ class Application extends App { $container = $this->getContainer(); - /* @var IEventDispatcher $eventDispatcher */ + /* @var IEventDispatcher $dispatcher */ $dispatcher = $container->query(IEventDispatcher::class); - $dispatcher->addServiceListener(RoomCreatedEvent::class, RoomListener::class); - $dispatcher->addServiceListener(RoomDeletedEvent::class, RoomListener::class); - - $dispatcher->addServiceListener(RoomShareCreatedEvent::class, RoomShareListener::class); - $dispatcher->addServiceListener(RoomShareDeletedEvent::class, RoomShareListener::class); - - $dispatcher->addServiceListener(MeetingStartedEvent::class, MeetingListener::class); - $dispatcher->addServiceListener(MeetingEndedEvent::class, MeetingListener::class); - $dispatcher->addServiceListener(RecordingReadyEvent::class, MeetingListener::class); + $this->registerServiceListener($dispatcher); $container->registerMiddleWare(JoinMiddleware::class); $container->registerMiddleWare(HookMiddleware::class); @@ -74,4 +68,18 @@ class Application extends App { ]; }); } + + private function registerServiceListener(IEventDispatcher $dispatcher) { + $dispatcher->addServiceListener(RoomCreatedEvent::class, RoomListener::class); + $dispatcher->addServiceListener(RoomDeletedEvent::class, RoomListener::class); + + $dispatcher->addServiceListener(RoomShareCreatedEvent::class, RoomShareListener::class); + $dispatcher->addServiceListener(RoomShareDeletedEvent::class, RoomShareListener::class); + + $dispatcher->addServiceListener(MeetingStartedEvent::class, MeetingListener::class); + $dispatcher->addServiceListener(MeetingEndedEvent::class, MeetingListener::class); + $dispatcher->addServiceListener(RecordingReadyEvent::class, MeetingListener::class); + + $dispatcher->addServiceListener(UserDeletedEvent::class, UserDeletedListener::class); + } } diff --git a/lib/Db/RoomShareMapper.php b/lib/Db/RoomShareMapper.php index 240b53c..511bbfd 100644 --- a/lib/Db/RoomShareMapper.php +++ b/lib/Db/RoomShareMapper.php @@ -44,6 +44,18 @@ class RoomShareMapper extends QBMapper { return $this->findEntity($qb); } + public function findByUserId(string $userId): array { + /* @var $qb IQueryBuilder */ + $qb = $this->db->getQueryBuilder(); + $qb->select('*') + ->from('bbb_room_shares') + ->where($qb->expr()->eq('share_with', $qb->createNamedParameter($userId))) + ->andWhere($qb->expr()->eq('share_type', $qb->createNamedParameter(RoomShare::SHARE_TYPE_USER, IQueryBuilder::PARAM_INT))); + + /** @var array */ + return $this->findEntities($qb); + } + /** * @return array */ diff --git a/lib/Listener/UserDeletedListener.php b/lib/Listener/UserDeletedListener.php new file mode 100644 index 0000000..aba00e0 --- /dev/null +++ b/lib/Listener/UserDeletedListener.php @@ -0,0 +1,64 @@ +activityManager = $activityManager; + $this->roomService = $roomService; + $this->shareService = $shareService; + } + + public function handle(Event $event): void { + if (!($event instanceof UserDeletedEvent)) { + return; + } + + $userId = $event->getUser()->getUID(); + $rooms = $this->roomService->findAll($userId, [], []); + + $this->deleteSharesByUserId($userId); + + foreach ($rooms as $room) { + $this->deleteSharesByRoomId($room->getId()); + + $this->roomService->delete($room->getId()); + } + } + + private function deleteSharesByRoomId(string $roomId) { + $shares = $this->shareService->findAll($roomId); + + foreach ($shares as $share) { + $this->shareService->delete($share->getId()); + } + } + + private function deleteSharesByUserId(string $userId) { + $shares = $this->shareService->findByUserId($userId); + + foreach ($shares as $share) { + $this->shareService->delete($share->getId()); + } + } +} diff --git a/lib/Service/RoomShareService.php b/lib/Service/RoomShareService.php index 5768237..5338419 100644 --- a/lib/Service/RoomShareService.php +++ b/lib/Service/RoomShareService.php @@ -32,6 +32,10 @@ class RoomShareService { return $this->mapper->findAll($roomId); } + public function findByUserId(string $userId): array { + return $this->mapper->findByUserId($userId); + } + private function handleException(Exception $e): void { if ($e instanceof DoesNotExistException || $e instanceof MultipleObjectsReturnedException) {