diff --git a/lib/AppInfo/Application.php b/lib/AppInfo/Application.php index 29b367db7..e8f89e6f7 100644 --- a/lib/AppInfo/Application.php +++ b/lib/AppInfo/Application.php @@ -25,6 +25,7 @@ namespace OCA\Deck\AppInfo; use OCA\Deck\Db\Acl; use OCA\Deck\Db\AclMapper; +use OCA\Deck\Db\AssignedUsersMapper; use OCA\Deck\Notification\Notifier; use OCP\AppFramework\App; use OCA\Deck\Middleware\SharingMiddleware; @@ -65,12 +66,19 @@ class Application extends App { /** @var IUserManager $userManager */ $userManager = $server->getUserManager(); $userManager->listen('\OC\User', 'postDelete', function(IUser $user) use ($container) { + // delete existing acl entries for deleted user /** @var AclMapper $aclMapper */ $aclMapper = $container->query(AclMapper::class); $acls = $aclMapper->findByParticipant(Acl::PERMISSION_TYPE_USER, $user->getUID()); foreach ($acls as $acl) { $aclMapper->delete($acl); } + // delete existing user assignments + $assignmentMapper = $container->query(AssignedUsersMapper::class); + $assignments = $assignmentMapper->findByUserId($user->getUID()); + foreach ($assignments as $assignment) { + $assignmentMapper->delete($assignment); + } }); /** @var IUserManager $userManager */ diff --git a/lib/Db/AssignedUsersMapper.php b/lib/Db/AssignedUsersMapper.php index d2500043c..f1797b0da 100644 --- a/lib/Db/AssignedUsersMapper.php +++ b/lib/Db/AssignedUsersMapper.php @@ -50,6 +50,12 @@ class AssignedUsersMapper extends DeckMapper implements IPermissionMapper { return $users; } + public function findByUserId(string $uid): array { + $sql = 'SELECT * FROM `*PREFIX*deck_assigned_users` ' . + 'WHERE `participant` = ?'; + return $this->findEntities($sql, [$uid]); + } + public function isOwner($userId, $cardId) { return $this->cardMapper->isOwner($userId, $cardId); diff --git a/lib/Service/BoardService.php b/lib/Service/BoardService.php index 072f7c1f5..36be5c341 100644 --- a/lib/Service/BoardService.php +++ b/lib/Service/BoardService.php @@ -25,6 +25,7 @@ namespace OCA\Deck\Service; use OCA\Deck\Db\Acl; use OCA\Deck\Db\AclMapper; +use OCA\Deck\Db\AssignedUsersMapper; use OCA\Deck\Db\IPermissionMapper; use OCA\Deck\Db\Label; use OCA\Deck\Notification\NotificationHelper; @@ -43,6 +44,7 @@ class BoardService { private $l10n; private $permissionService; private $notificationHelper; + private $assignedUsersMapper; public function __construct( BoardMapper $boardMapper, @@ -50,7 +52,8 @@ class BoardService { LabelMapper $labelMapper, AclMapper $aclMapper, PermissionService $permissionService, - NotificationHelper $notificationHelper + NotificationHelper $notificationHelper, + AssignedUsersMapper $assignedUsersMapper ) { $this->boardMapper = $boardMapper; $this->labelMapper = $labelMapper; @@ -58,6 +61,7 @@ class BoardService { $this->l10n = $l10n; $this->permissionService = $permissionService; $this->notificationHelper = $notificationHelper; + $this->assignedUsersMapper = $assignedUsersMapper; } public function findAll($userInfo) { @@ -243,6 +247,12 @@ class BoardService { /** @var Acl $acl */ $acl = $this->aclMapper->find($id); $this->boardMapper->mapAcl($acl); + if ($acl->getType() === Acl::PERMISSION_TYPE_USER) { + $assignements = $this->assignedUsersMapper->findByUserId($acl->getParticipant()); + foreach($assignements as $assignement) { + $this->assignedUsersMapper->delete($assignement); + } + } return $this->aclMapper->delete($acl); }