diff --git a/js/controller/BoardController.js b/js/controller/BoardController.js index 69254c9c8..e3d4f91ec 100644 --- a/js/controller/BoardController.js +++ b/js/controller/BoardController.js @@ -214,7 +214,10 @@ app.controller('BoardController', function ($rootScope, $scope, $stateParams, St $scope.status.addSharee = null; }; $scope.aclDelete = function (acl) { - BoardService.deleteAcl(acl); + BoardService.deleteAcl(acl).then(function(data) { + $scope.loadDefault(); + $scope.refreshData(); + }); }; $scope.aclUpdate = function (acl) { BoardService.updateAcl(acl); 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 @@ 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 @@ public function __construct(array $urlParams = array()) { /** @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..5edab10d0 100644 --- a/lib/Db/AssignedUsersMapper.php +++ b/lib/Db/AssignedUsersMapper.php @@ -50,6 +50,12 @@ public function find($cardId) { return $users; } + public function findByUserId($uid) { + $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 @@ 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 @@ public function __construct( LabelMapper $labelMapper, AclMapper $aclMapper, PermissionService $permissionService, - NotificationHelper $notificationHelper + NotificationHelper $notificationHelper, + AssignedUsersMapper $assignedUsersMapper ) { $this->boardMapper = $boardMapper; $this->labelMapper = $labelMapper; @@ -58,6 +61,7 @@ public function __construct( $this->l10n = $l10n; $this->permissionService = $permissionService; $this->notificationHelper = $notificationHelper; + $this->assignedUsersMapper = $assignedUsersMapper; } public function findAll($userInfo) { @@ -243,6 +247,12 @@ public function deleteAcl($id) { /** @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); } diff --git a/templates/part.board.sidebarView.php b/templates/part.board.sidebarView.php index 8d44d34dd..45c2d394c 100644 --- a/templates/part.board.sidebarView.php +++ b/templates/part.board.sidebarView.php @@ -44,7 +44,7 @@ {{ boardservice.getCurrent().owner.displayname }} -
  • +
  • diff --git a/tests/unit/Service/BoardServiceTest.php b/tests/unit/Service/BoardServiceTest.php index ba0221742..c7b89e79f 100644 --- a/tests/unit/Service/BoardServiceTest.php +++ b/tests/unit/Service/BoardServiceTest.php @@ -26,6 +26,8 @@ use OC\L10N\L10N; use OCA\Deck\Db\Acl; use OCA\Deck\Db\AclMapper; +use OCA\Deck\Db\AssignedUsers; +use OCA\Deck\Db\AssignedUsersMapper; use OCA\Deck\Db\Board; use OCA\Deck\Db\BoardMapper; use OCA\Deck\Db\LabelMapper; @@ -49,6 +51,8 @@ class BoardServiceTest extends TestCase { private $permissionService; /** @var NotificationHelper */ private $notificationHelper; + /** @var AssignedUsersMapper */ + private $assignedUsersMapper; private $userId = 'admin'; @@ -60,6 +64,7 @@ public function setUp() { $this->labelMapper = $this->createMock(LabelMapper::class); $this->permissionService = $this->createMock(PermissionService::class); $this->notificationHelper = $this->createMock(NotificationHelper::class); + $this->assignedUsersMapper = $this->createMock(AssignedUsersMapper::class); $this->service = new BoardService( $this->boardMapper, @@ -67,7 +72,8 @@ public function setUp() { $this->labelMapper, $this->aclMapper, $this->permissionService, - $this->notificationHelper + $this->notificationHelper, + $this->assignedUsersMapper ); $user = $this->createMock(IUser::class); @@ -224,7 +230,7 @@ public function testUpdateAcl() { public function testDeleteAcl() { $acl = new Acl(); $acl->setBoardId(123); - $acl->setType('user'); + $acl->setType(Acl::PERMISSION_TYPE_USER); $acl->setParticipant('admin'); $acl->setPermissionEdit(true); $acl->setPermissionShare(true); @@ -233,6 +239,15 @@ public function testDeleteAcl() { ->method('find') ->with(123) ->willReturn($acl); + $assignment = new AssignedUsers(); + $assignment->setParticipant('admin'); + $this->assignedUsersMapper->expects($this->once()) + ->method('findByUserId') + ->with('admin') + ->willReturn([$assignment]); + $this->assignedUsersMapper->expects($this->once()) + ->method('delete') + ->with($assignment); $this->aclMapper->expects($this->once()) ->method('delete') ->with($acl)