diff --git a/lib/Db/Stack.php b/lib/Db/Stack.php index 63e85ca03..0d1f14e6d 100644 --- a/lib/Db/Stack.php +++ b/lib/Db/Stack.php @@ -25,6 +25,13 @@ namespace OCA\Deck\Db; use Sabre\VObject\Component\VCalendar; +/** + * @method int getId() + * @method int getBoardId() + * @method int getDeletedAt() + * @method int getLastModified() + * @method int getOrder() + */ class Stack extends RelationalEntity { protected $title; protected $boardId; diff --git a/lib/Db/StackMapper.php b/lib/Db/StackMapper.php index 6f900f45f..300cfd335 100644 --- a/lib/Db/StackMapper.php +++ b/lib/Db/StackMapper.php @@ -48,6 +48,25 @@ class StackMapper extends DeckMapper implements IPermissionMapper { return $this->findEntity($sql, [$id]); } + /** + * @param $cardId + * @return Stack|null + */ + public function findStackFromCardId($cardId): ?Stack { + $sql = <<findEntity($sql, [$cardId]); + } catch (MultipleObjectsReturnedException|DoesNotExistException $e) { + } + + return null; + } + public function findAll($boardId, $limit = null, $offset = null) { $sql = 'SELECT * FROM `*PREFIX*deck_stacks` WHERE `board_id` = ? AND deleted_at = 0 ORDER BY `order`, `id`'; diff --git a/lib/Notification/Notifier.php b/lib/Notification/Notifier.php index fe2676ef8..dac50bcb2 100644 --- a/lib/Notification/Notifier.php +++ b/lib/Notification/Notifier.php @@ -101,15 +101,12 @@ class Notifier implements INotifier { switch ($notification->getSubject()) { case 'card-assigned': $cardId = $notification->getObjectId(); - $boardId = $this->cardMapper->findBoardId($cardId); + $stack = $this->stackMapper->findStackFromCardId($cardId); + $boardId = $stack ? $stack->getBoardId() : null; if (!$boardId) { throw new AlreadyProcessedException(); } - $card = $this->cardMapper->find($cardId); - $stackId = $card->getStackId(); - $stack = $this->stackMapper->find($stackId); - $initiator = $this->userManager->get($params[2]); if ($initiator !== null) { $dn = $initiator->getDisplayName(); @@ -147,15 +144,12 @@ class Notifier implements INotifier { break; case 'card-overdue': $cardId = $notification->getObjectId(); - $boardId = $this->cardMapper->findBoardId($cardId); + $stack = $this->stackMapper->findStackFromCardId($cardId); + $boardId = $stack ? $stack->getBoardId() : null; if (!$boardId) { throw new AlreadyProcessedException(); } - $card = $this->cardMapper->find($cardId); - $stackId = $card->getStackId(); - $stack = $this->stackMapper->find($stackId); - $notification->setParsedSubject( (string) $l->t('The card "%s" on "%s" has reached its due date.', $params) ); @@ -182,15 +176,12 @@ class Notifier implements INotifier { break; case 'card-comment-mentioned': $cardId = $notification->getObjectId(); - $boardId = $this->cardMapper->findBoardId($cardId); + $stack = $this->stackMapper->findStackFromCardId($cardId); + $boardId = $stack ? $stack->getBoardId() : null; if (!$boardId) { throw new AlreadyProcessedException(); } - $card = $this->cardMapper->find($cardId); - $stackId = $card->getStackId(); - $stack = $this->stackMapper->find($stackId); - $initiator = $this->userManager->get($params[2]); if ($initiator !== null) { $dn = $initiator->getDisplayName(); diff --git a/tests/unit/Notification/NotifierTest.php b/tests/unit/Notification/NotifierTest.php index a26d8db92..52edf7dd4 100644 --- a/tests/unit/Notification/NotifierTest.php +++ b/tests/unit/Notification/NotifierTest.php @@ -25,6 +25,7 @@ namespace OCA\Deck\Notification; use OCA\Deck\Db\BoardMapper; use OCA\Deck\Db\CardMapper; +use OCA\Deck\Db\Stack; use OCA\Deck\Db\StackMapper; use OCP\IL10N; use OCP\IURLGenerator; @@ -103,9 +104,9 @@ class NotifierTest extends \Test\TestCase { $notification->expects($this->once()) ->method('getObjectId') ->willReturn('123'); - $this->cardMapper->expects($this->once()) - ->method('findBoardId') - ->willReturn(999); + $this->stackMapper->expects($this->once()) + ->method('findStackFromCardId') + ->willReturn($this->buildMockStack()); $expectedMessage = 'The card "Card title" on "Board title" has reached its due date.'; $notification->expects($this->once()) ->method('setParsedSubject') @@ -146,9 +147,9 @@ class NotifierTest extends \Test\TestCase { $notification->expects($this->once()) ->method('getObjectId') ->willReturn('123'); - $this->cardMapper->expects($this->once()) - ->method('findBoardId') - ->willReturn(999); + $this->stackMapper->expects($this->once()) + ->method('findStackFromCardId') + ->willReturn($this->buildMockStack()); $expectedMessage = 'admin has mentioned you in a comment on "Card title".'; $notification->expects($this->once()) ->method('setParsedSubject') @@ -183,9 +184,9 @@ class NotifierTest extends \Test\TestCase { /** @dataProvider dataPrepareCardAssigned */ public function testPrepareCardAssigned($withUserFound = true) { - $this->cardMapper->expects($this->once()) - ->method('findBoardId') - ->willReturn(123); + $this->stackMapper->expects($this->once()) + ->method('findStackFromCardId') + ->willReturn($this->buildMockStack(123)); /** @var INotification $notification */ $notification = $this->createMock(INotification::class); @@ -338,4 +339,17 @@ class NotifierTest extends \Test\TestCase { $this->assertEquals($notification, $actualNotification); } + + /** + * @param int $boardId + * @return Stack|MockObject + */ + private function buildMockStack(int $boardId = 999) { + $mockStack = $this->getMockBuilder(Stack::class) + ->addMethods(['getBoardId']) + ->getMock(); + + $mockStack->method('getBoardId')->willReturn($boardId); + return $mockStack; + } }