Merge pull request #432 from nextcloud/auto-remove-assignments

Auto remove assignments
This commit is contained in:
Julius Härtl 2018-03-02 19:30:49 +01:00 коммит произвёл GitHub
Родитель 8cb92934b1 d362e0ad0e
Коммит ad9ce6cd26
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
6 изменённых файлов: 47 добавлений и 5 удалений

Просмотреть файл

@ -214,7 +214,10 @@ app.controller('BoardController', function ($rootScope, $scope, $stateParams, St
$scope.status.addSharee = null; $scope.status.addSharee = null;
}; };
$scope.aclDelete = function (acl) { $scope.aclDelete = function (acl) {
BoardService.deleteAcl(acl); BoardService.deleteAcl(acl).then(function(data) {
$scope.loadDefault();
$scope.refreshData();
});
}; };
$scope.aclUpdate = function (acl) { $scope.aclUpdate = function (acl) {
BoardService.updateAcl(acl); BoardService.updateAcl(acl);

Просмотреть файл

@ -25,6 +25,7 @@ namespace OCA\Deck\AppInfo;
use OCA\Deck\Db\Acl; use OCA\Deck\Db\Acl;
use OCA\Deck\Db\AclMapper; use OCA\Deck\Db\AclMapper;
use OCA\Deck\Db\AssignedUsersMapper;
use OCA\Deck\Notification\Notifier; use OCA\Deck\Notification\Notifier;
use OCP\AppFramework\App; use OCP\AppFramework\App;
use OCA\Deck\Middleware\SharingMiddleware; use OCA\Deck\Middleware\SharingMiddleware;
@ -65,12 +66,19 @@ class Application extends App {
/** @var IUserManager $userManager */ /** @var IUserManager $userManager */
$userManager = $server->getUserManager(); $userManager = $server->getUserManager();
$userManager->listen('\OC\User', 'postDelete', function(IUser $user) use ($container) { $userManager->listen('\OC\User', 'postDelete', function(IUser $user) use ($container) {
// delete existing acl entries for deleted user
/** @var AclMapper $aclMapper */ /** @var AclMapper $aclMapper */
$aclMapper = $container->query(AclMapper::class); $aclMapper = $container->query(AclMapper::class);
$acls = $aclMapper->findByParticipant(Acl::PERMISSION_TYPE_USER, $user->getUID()); $acls = $aclMapper->findByParticipant(Acl::PERMISSION_TYPE_USER, $user->getUID());
foreach ($acls as $acl) { foreach ($acls as $acl) {
$aclMapper->delete($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 */ /** @var IUserManager $userManager */

Просмотреть файл

@ -50,6 +50,12 @@ class AssignedUsersMapper extends DeckMapper implements IPermissionMapper {
return $users; 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) { public function isOwner($userId, $cardId) {
return $this->cardMapper->isOwner($userId, $cardId); return $this->cardMapper->isOwner($userId, $cardId);

Просмотреть файл

@ -25,6 +25,7 @@ namespace OCA\Deck\Service;
use OCA\Deck\Db\Acl; use OCA\Deck\Db\Acl;
use OCA\Deck\Db\AclMapper; use OCA\Deck\Db\AclMapper;
use OCA\Deck\Db\AssignedUsersMapper;
use OCA\Deck\Db\IPermissionMapper; use OCA\Deck\Db\IPermissionMapper;
use OCA\Deck\Db\Label; use OCA\Deck\Db\Label;
use OCA\Deck\Notification\NotificationHelper; use OCA\Deck\Notification\NotificationHelper;
@ -43,6 +44,7 @@ class BoardService {
private $l10n; private $l10n;
private $permissionService; private $permissionService;
private $notificationHelper; private $notificationHelper;
private $assignedUsersMapper;
public function __construct( public function __construct(
BoardMapper $boardMapper, BoardMapper $boardMapper,
@ -50,7 +52,8 @@ class BoardService {
LabelMapper $labelMapper, LabelMapper $labelMapper,
AclMapper $aclMapper, AclMapper $aclMapper,
PermissionService $permissionService, PermissionService $permissionService,
NotificationHelper $notificationHelper NotificationHelper $notificationHelper,
AssignedUsersMapper $assignedUsersMapper
) { ) {
$this->boardMapper = $boardMapper; $this->boardMapper = $boardMapper;
$this->labelMapper = $labelMapper; $this->labelMapper = $labelMapper;
@ -58,6 +61,7 @@ class BoardService {
$this->l10n = $l10n; $this->l10n = $l10n;
$this->permissionService = $permissionService; $this->permissionService = $permissionService;
$this->notificationHelper = $notificationHelper; $this->notificationHelper = $notificationHelper;
$this->assignedUsersMapper = $assignedUsersMapper;
} }
public function findAll($userInfo) { public function findAll($userInfo) {
@ -243,6 +247,12 @@ class BoardService {
/** @var Acl $acl */ /** @var Acl $acl */
$acl = $this->aclMapper->find($id); $acl = $this->aclMapper->find($id);
$this->boardMapper->mapAcl($acl); $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); return $this->aclMapper->delete($acl);
} }

Просмотреть файл

@ -44,7 +44,7 @@
{{ boardservice.getCurrent().owner.displayname }} {{ boardservice.getCurrent().owner.displayname }}
</span> </span>
</li> </li>
<li ng-repeat="acl in boardservice.getCurrent().acl track by $index"> <li ng-repeat="acl in boardservice.getCurrent().acl track by acl.participant.primaryKey">
<span class="icon-loading-small" style="display:none;" title="<?php p($l->t('Loading')); ?>"></span> <span class="icon-loading-small" style="display:none;" title="<?php p($l->t('Loading')); ?>"></span>
<div class="avatardiv" avatar data-contactsmenu="true" data-user="{{ acl.participant.uid }}" data-displayname="{{ acl.participant.displayname }}" ng-if="acl.type==OC.Share.SHARE_TYPE_USER"></div> <div class="avatardiv" avatar data-contactsmenu="true" data-user="{{ acl.participant.uid }}" data-displayname="{{ acl.participant.displayname }}" ng-if="acl.type==OC.Share.SHARE_TYPE_USER"></div>
<div class="avatardiv" ng-if="acl.type==OC.Share.SHARE_TYPE_GROUP"><i class="icon icon-{{aclTypeString(acl)}}" title="<?php p($l->t('Access for')); ?> {{aclTypeString(acl)}}"></i></div> <div class="avatardiv" ng-if="acl.type==OC.Share.SHARE_TYPE_GROUP"><i class="icon icon-{{aclTypeString(acl)}}" title="<?php p($l->t('Access for')); ?> {{aclTypeString(acl)}}"></i></div>

Просмотреть файл

@ -26,6 +26,8 @@ namespace OCA\Deck\Service;
use OC\L10N\L10N; use OC\L10N\L10N;
use OCA\Deck\Db\Acl; use OCA\Deck\Db\Acl;
use OCA\Deck\Db\AclMapper; use OCA\Deck\Db\AclMapper;
use OCA\Deck\Db\AssignedUsers;
use OCA\Deck\Db\AssignedUsersMapper;
use OCA\Deck\Db\Board; use OCA\Deck\Db\Board;
use OCA\Deck\Db\BoardMapper; use OCA\Deck\Db\BoardMapper;
use OCA\Deck\Db\LabelMapper; use OCA\Deck\Db\LabelMapper;
@ -49,6 +51,8 @@ class BoardServiceTest extends TestCase {
private $permissionService; private $permissionService;
/** @var NotificationHelper */ /** @var NotificationHelper */
private $notificationHelper; private $notificationHelper;
/** @var AssignedUsersMapper */
private $assignedUsersMapper;
private $userId = 'admin'; private $userId = 'admin';
@ -60,6 +64,7 @@ class BoardServiceTest extends TestCase {
$this->labelMapper = $this->createMock(LabelMapper::class); $this->labelMapper = $this->createMock(LabelMapper::class);
$this->permissionService = $this->createMock(PermissionService::class); $this->permissionService = $this->createMock(PermissionService::class);
$this->notificationHelper = $this->createMock(NotificationHelper::class); $this->notificationHelper = $this->createMock(NotificationHelper::class);
$this->assignedUsersMapper = $this->createMock(AssignedUsersMapper::class);
$this->service = new BoardService( $this->service = new BoardService(
$this->boardMapper, $this->boardMapper,
@ -67,7 +72,8 @@ class BoardServiceTest extends TestCase {
$this->labelMapper, $this->labelMapper,
$this->aclMapper, $this->aclMapper,
$this->permissionService, $this->permissionService,
$this->notificationHelper $this->notificationHelper,
$this->assignedUsersMapper
); );
$user = $this->createMock(IUser::class); $user = $this->createMock(IUser::class);
@ -224,7 +230,7 @@ class BoardServiceTest extends TestCase {
public function testDeleteAcl() { public function testDeleteAcl() {
$acl = new Acl(); $acl = new Acl();
$acl->setBoardId(123); $acl->setBoardId(123);
$acl->setType('user'); $acl->setType(Acl::PERMISSION_TYPE_USER);
$acl->setParticipant('admin'); $acl->setParticipant('admin');
$acl->setPermissionEdit(true); $acl->setPermissionEdit(true);
$acl->setPermissionShare(true); $acl->setPermissionShare(true);
@ -233,6 +239,15 @@ class BoardServiceTest extends TestCase {
->method('find') ->method('find')
->with(123) ->with(123)
->willReturn($acl); ->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()) $this->aclMapper->expects($this->once())
->method('delete') ->method('delete')
->with($acl) ->with($acl)