diff --git a/lib/Db/CardMapper.php b/lib/Db/CardMapper.php index 0b5170a54..ac070aebf 100644 --- a/lib/Db/CardMapper.php +++ b/lib/Db/CardMapper.php @@ -254,13 +254,13 @@ class CardMapper extends QBMapper implements IPermissionMapper { return $this->findEntities($qb); } - public function findAllWithDue($boardId) { + public function findAllWithDue(array $boardIds) { $qb = $this->db->getQueryBuilder(); $qb->select('c.*') ->from('deck_cards', 'c') ->innerJoin('c', 'deck_stacks', 's', 's.id = c.stack_id') ->innerJoin('s', 'deck_boards', 'b', 'b.id = s.board_id') - ->where($qb->expr()->eq('s.board_id', $qb->createNamedParameter($boardId, IQueryBuilder::PARAM_INT))) + ->where($qb->expr()->in('s.board_id', $qb->createNamedParameter($boardIds, IQueryBuilder::PARAM_INT_ARRAY))) ->andWhere($qb->expr()->isNotNull('c.duedate')) ->andWhere($qb->expr()->eq('c.archived', $qb->createNamedParameter(false, IQueryBuilder::PARAM_BOOL))) ->andWhere($qb->expr()->eq('c.deleted_at', $qb->createNamedParameter(0, IQueryBuilder::PARAM_INT))) @@ -270,14 +270,14 @@ class CardMapper extends QBMapper implements IPermissionMapper { return $this->findEntities($qb); } - public function findToMeOrNotAssignedCards($boardId, $username) { + public function findToMeOrNotAssignedCards(array $boardIds, string $username) { $qb = $this->db->getQueryBuilder(); $qb->select('c.*') ->from('deck_cards', 'c') ->innerJoin('c', 'deck_stacks', 's', 's.id = c.stack_id') ->innerJoin('s', 'deck_boards', 'b', 'b.id = s.board_id') ->leftJoin('c', 'deck_assigned_users', 'u', 'c.id = u.card_id') - ->where($qb->expr()->eq('s.board_id', $qb->createNamedParameter($boardId, IQueryBuilder::PARAM_INT))) + ->where($qb->expr()->in('s.board_id', $qb->createNamedParameter($boardIds, IQueryBuilder::PARAM_INT_ARRAY))) ->andWhere($qb->expr()->orX( $qb->expr()->eq('u.participant', $qb->createNamedParameter($username, IQueryBuilder::PARAM_STR)), $qb->expr()->isNull('u.participant')) diff --git a/lib/Service/CardService.php b/lib/Service/CardService.php index d581ae18b..ad134e225 100644 --- a/lib/Service/CardService.php +++ b/lib/Service/CardService.php @@ -145,12 +145,12 @@ class CardService { $assignedUsers = $this->assignedUsersMapper->findIn($cardIds); foreach ($cards as $card) { - $cardLabels = array_filter($assignedLabels, function (Label $label) use ($card) { + $cardLabels = array_values(array_filter($assignedLabels, function (Label $label) use ($card) { return $label->getCardId() === $card->getId(); - }); - $cardAssignedUsers = array_filter($assignedUsers, function (Assignment $assignment) use ($card) { + })); + $cardAssignedUsers = array_values(array_filter($assignedUsers, function (Assignment $assignment) use ($card) { return $assignment->getCardId() === $card->getId(); - }); + })); $card->setLabels($cardLabels); $card->setAssignedUsers($cardAssignedUsers); } diff --git a/lib/Service/OverviewService.php b/lib/Service/OverviewService.php index b877939f3..7c1f4479f 100644 --- a/lib/Service/OverviewService.php +++ b/lib/Service/OverviewService.php @@ -28,6 +28,7 @@ declare(strict_types=1); namespace OCA\Deck\Service; use OCA\Deck\Db\AssignmentMapper; +use OCA\Deck\Db\Board; use OCA\Deck\Db\CardMapper; use OCA\Deck\Model\CardDetails; use OCP\Comments\ICommentsManager; @@ -65,34 +66,25 @@ class OverviewService { $this->attachmentService = $attachmentService; } - public function findAllWithDue(string $userId): array { - $userBoards = $this->boardMapper->findAllForUser($userId); - $allDueCards = []; - foreach ($userBoards as $userBoard) { - $allDueCards[] = array_map(function ($card) use ($userBoard, $userId) { - return (new CardDetails($card, $userBoard))->jsonSerialize(); - }, $this->cardMapper->findAllWithDue($userBoard->getId())); - } - return $this->cardService->enrichCards(array_merge(...$allDueCards)); - } - public function findUpcomingCards(string $userId): array { $userBoards = $this->boardMapper->findAllForUser($userId); - $overview = []; - foreach ($userBoards as $userBoard) { - if (count($userBoard->getAcl()) === 0) { - // private board: get cards with due date - $cards = $this->cardMapper->findAllWithDue($userBoard->getId()); - } else { - // shared board: get all my assigned or unassigned cards - $cards = $this->cardMapper->findToMeOrNotAssignedCards($userBoard->getId(), $userId); - } - $foundCards[] = $cards; - } + $boardOwnerIds = array_filter(array_map(function (Board $board) { + return count($board->getAcl()) === 0 ? $board->getId() : null; + }, $userBoards)); + $boardSharedIds = array_filter(array_map(function (Board $board) { + return count($board->getAcl()) > 0 ? $board->getId() : null; + }, $userBoards)); + + $foundCards = array_merge( + // private board: get cards with due date + $this->cardMapper->findAllWithDue($boardOwnerIds), + // shared board: get all my assigned or unassigned cards + $this->cardMapper->findToMeOrNotAssignedCards($boardSharedIds, $userId) + ); - $foundCards = array_merge(...$foundCards); $this->cardService->enrichCards($foundCards); + $overview = []; foreach ($foundCards as $card) { $diffDays = $card->getDaysUntilDue(); @@ -109,7 +101,7 @@ class OverviewService { $key = 'nextSevenDays'; } - $card = (new CardDetails($card, $userBoard)); + $card = (new CardDetails($card, $card->getRelatedBoard())); $overview[$key][] = $card->jsonSerialize(); } return $overview;