diff --git a/lib/Collaboration/Resources/ResourceProvider.php b/lib/Collaboration/Resources/ResourceProvider.php index b4677148d..974976b0f 100644 --- a/lib/Collaboration/Resources/ResourceProvider.php +++ b/lib/Collaboration/Resources/ResourceProvider.php @@ -108,7 +108,7 @@ class ResourceProvider implements IProvider { private function getBoard(IResource $resource) { try { - return $this->boardMapper->find($resource->getId(), false, true); + return $this->boardMapper->find((int)$resource->getId(), false, true); } catch (DoesNotExistException $e) { } catch (MultipleObjectsReturnedException $e) { return null; diff --git a/lib/Db/BoardMapper.php b/lib/Db/BoardMapper.php index 93be76d7e..5b1e6407e 100644 --- a/lib/Db/BoardMapper.php +++ b/lib/Db/BoardMapper.php @@ -79,12 +79,14 @@ class BoardMapper extends QBMapper implements IPermissionMapper { * @throws \OCP\AppFramework\Db\MultipleObjectsReturnedException * @throws DoesNotExistException */ - public function find($id, $withLabels = false, $withAcl = false): Board { + public function find(int $id, bool $withLabels = false, bool $withAcl = false, bool $allowDeleted = false): Board { if (!isset($this->boardCache[$id])) { $qb = $this->db->getQueryBuilder(); + $deletedWhere = $allowDeleted ? $qb->expr()->gte('deleted_at', $qb->createNamedParameter(0, IQueryBuilder::PARAM_INT)) : $qb->expr()->eq('deleted_at', $qb->createNamedParameter(0, IQueryBuilder::PARAM_INT)); $qb->select('*') ->from('deck_boards') ->where($qb->expr()->eq('id', $qb->createNamedParameter($id, IQueryBuilder::PARAM_INT))) + ->andWhere($deletedWhere) ->orderBy('id'); $this->boardCache[$id] = $this->findEntity($qb); } diff --git a/lib/Service/BoardService.php b/lib/Service/BoardService.php index 9a98decbf..2c3bca46b 100644 --- a/lib/Service/BoardService.php +++ b/lib/Service/BoardService.php @@ -181,7 +181,7 @@ class BoardService { * @throws \OCP\AppFramework\Db\MultipleObjectsReturnedException * @throws BadRequestException */ - public function find($boardId) { + public function find($boardId, bool $allowDeleted = false) { $this->boardServiceValidator->check(compact('boardId')); if ($this->boardsCache && isset($this->boardsCache[$boardId])) { return $this->boardsCache[$boardId]; @@ -192,7 +192,7 @@ class BoardService { $this->permissionService->checkPermission($this->boardMapper, $boardId, Acl::PERMISSION_READ); /** @var Board $board */ - $board = $this->boardMapper->find($boardId, true, true); + $board = $this->boardMapper->find($boardId, true, true, $allowDeleted); $this->boardMapper->mapOwner($board); if ($board->getAcl() !== null) { foreach ($board->getAcl() as $acl) { @@ -367,7 +367,7 @@ class BoardService { $this->boardServiceValidator->check(compact('id')); $this->permissionService->checkPermission($this->boardMapper, $id, Acl::PERMISSION_MANAGE); - $board = $this->find($id); + $board = $this->find($id, true); $board->setDeletedAt(0); $board = $this->boardMapper->update($board); $this->activityManager->triggerEvent(ActivityManager::DECK_OBJECT_BOARD, $board, ActivityManager::SUBJECT_BOARD_RESTORE); @@ -388,7 +388,7 @@ class BoardService { $this->boardServiceValidator->check(compact('id')); $this->permissionService->checkPermission($this->boardMapper, $id, Acl::PERMISSION_MANAGE); - $board = $this->find($id); + $board = $this->find($id, true); $delete = $this->boardMapper->delete($board); return $delete; diff --git a/lib/Service/CardService.php b/lib/Service/CardService.php index 8d8522790..c648e0979 100644 --- a/lib/Service/CardService.php +++ b/lib/Service/CardService.php @@ -274,6 +274,14 @@ class CardService { if ($archived !== null && $card->getArchived() && $archived === true) { throw new StatusException('Operation not allowed. This card is archived.'); } + + if ($card->getDeletedAt() !== 0) { + if ($deletedAt === null) { + // Only allow operations when restoring the card + throw new StatusException('Operation not allowed. This card was deleted.'); + } + } + $changes = new ChangeSet($card); if ($card->getLastEditor() !== $this->currentUser && $card->getLastEditor() !== null) { $this->activityManager->triggerEvent( diff --git a/lib/Service/PermissionService.php b/lib/Service/PermissionService.php index 06a6da62d..c42ca8045 100644 --- a/lib/Service/PermissionService.php +++ b/lib/Service/PermissionService.php @@ -194,11 +194,11 @@ class PermissionService { * @throws MultipleObjectsReturnedException * @throws DoesNotExistException */ - private function getBoard($boardId): Board { - if (!isset($this->boardCache[$boardId])) { - $this->boardCache[$boardId] = $this->boardMapper->find($boardId, false, true); + private function getBoard(int $boardId): Board { + if (!isset($this->boardCache[(string)$boardId])) { + $this->boardCache[(string)$boardId] = $this->boardMapper->find($boardId, false, true); } - return $this->boardCache[$boardId]; + return $this->boardCache[(string)$boardId]; } /** diff --git a/tests/unit/Activity/ActivityManagerTest.php b/tests/unit/Activity/ActivityManagerTest.php index d292d9023..f7b011c05 100644 --- a/tests/unit/Activity/ActivityManagerTest.php +++ b/tests/unit/Activity/ActivityManagerTest.php @@ -124,6 +124,7 @@ class ActivityManagerTest extends TestCase { public function testCreateEvent() { $board = new Board(); + $board->setId(123); $board->setTitle(''); $this->boardMapper->expects($this->once()) ->method('find')