diff --git a/lib/Db/AssignmentMapper.php b/lib/Db/AssignmentMapper.php index f2731431f..0904cd770 100644 --- a/lib/Db/AssignmentMapper.php +++ b/lib/Db/AssignmentMapper.php @@ -92,6 +92,21 @@ class AssignmentMapper extends DeckMapper implements IPermissionMapper { return $this->findEntities($qb); } + public function deleteByParticipantOnBoard(string $participant, int $boardId, $type = Assignment::TYPE_USER) { + $qb = $this->db->getQueryBuilder(); + $cardIdQuery = $this->db->getQueryBuilder(); + $cardIdQuery->select('a.card_id') + ->from('deck_assigned_users', 'a') + ->innerJoin('a', 'deck_cards', 'c', 'c.id = a.card_id') + ->innerJoin('c', 'deck_stacks', 's', 's.id = c.stack_id') + ->where($cardIdQuery->expr()->eq('a.participant', $qb->createNamedParameter($participant, IQueryBuilder::PARAM_STR))) + ->andWhere($cardIdQuery->expr()->eq('s.board_id', $qb->createNamedParameter($boardId, IQueryBuilder::PARAM_INT))) + ->andWhere($cardIdQuery->expr()->eq('a.type', $qb->createNamedParameter($type, IQueryBuilder::PARAM_INT))); + $qb->delete('deck_assigned_users') + ->where($qb->expr()->in('card_id', $qb->createFunction($cardIdQuery->getSQL()), IQueryBuilder::PARAM_INT_ARRAY)); + $qb->executeStatement(); + } + public function isOwner($userId, $id): bool { return $this->cardMapper->isOwner($userId, $id); diff --git a/lib/Service/BoardService.php b/lib/Service/BoardService.php index 0d0f32796..d3d3260d0 100644 --- a/lib/Service/BoardService.php +++ b/lib/Service/BoardService.php @@ -510,10 +510,7 @@ class BoardService { $acl = $this->aclMapper->find($id); $this->boardMapper->mapAcl($acl); if ($acl->getType() === Acl::PERMISSION_TYPE_USER) { - $assignements = $this->assignedUsersMapper->findByParticipant($acl->getParticipant()); - foreach ($assignements as $assignement) { - $this->assignedUsersMapper->delete($assignement); - } + $this->assignedUsersMapper->deleteByParticipantOnBoard($acl->getParticipant(), $acl->getBoardId()); } $this->activityManager->triggerEvent(ActivityManager::DECK_OBJECT_BOARD, $acl, ActivityManager::SUBJECT_BOARD_UNSHARE); diff --git a/tests/unit/Service/BoardServiceTest.php b/tests/unit/Service/BoardServiceTest.php index bba051cc5..3ab99b0a7 100644 --- a/tests/unit/Service/BoardServiceTest.php +++ b/tests/unit/Service/BoardServiceTest.php @@ -448,10 +448,10 @@ class BoardServiceTest extends TestCase { $assignment = new Assignment(); $assignment->setParticipant('admin'); $this->assignedUsersMapper->expects($this->once()) - ->method('findByParticipant') - ->with('admin') + ->method('deleteByParticipantOnBoard') + ->with('admin', 123) ->willReturn([$assignment]); - $this->assignedUsersMapper->expects($this->once()) + $this->assignedUsersMapper->expects($this->never()) ->method('delete') ->with($assignment); $this->aclMapper->expects($this->once())