diff --git a/lib/Command/UserExport.php b/lib/Command/UserExport.php index 1d73e8dcf..090e2f072 100644 --- a/lib/Command/UserExport.php +++ b/lib/Command/UserExport.php @@ -27,6 +27,7 @@ use OCA\Deck\Db\AssignmentMapper; use OCA\Deck\Db\BoardMapper; use OCA\Deck\Db\CardMapper; use OCA\Deck\Db\StackMapper; +use OCA\Deck\Model\CardDetails; use OCA\Deck\Service\BoardService; use OCP\AppFramework\Db\DoesNotExistException; use OCP\AppFramework\Db\MultipleObjectsReturnedException; @@ -101,7 +102,9 @@ class UserExport extends Command { $fullCard = $this->cardMapper->find($card->getId()); $assignedUsers = $this->assignedUsersMapper->findAll($card->getId()); $fullCard->setAssignedUsers($assignedUsers); - $data[$board->getId()]['stacks'][$stack->getId()]['cards'][] = (array)$fullCard->jsonSerialize(); + + $cardDetails = new CardDetails($fullCard, $fullBoard); + $data[$board->getId()]['stacks'][$stack->getId()]['cards'][] = $cardDetails->jsonSerialize(); } } } diff --git a/lib/Controller/SearchController.php b/lib/Controller/SearchController.php index 154158454..04bd2644e 100644 --- a/lib/Controller/SearchController.php +++ b/lib/Controller/SearchController.php @@ -27,6 +27,7 @@ declare(strict_types=1); namespace OCA\Deck\Controller; use OCA\Deck\Db\Card; +use OCA\Deck\Model\CardDetails; use OCA\Deck\Service\SearchService; use OCP\AppFramework\Http\DataResponse; use OCP\AppFramework\OCSController; @@ -50,9 +51,12 @@ class SearchController extends OCSController { public function search(string $term, ?int $limit = null, ?int $cursor = null): DataResponse { $cards = $this->searchService->searchCards($term, $limit, $cursor); return new DataResponse(array_map(function (Card $card) { - $json = $card->jsonSerialize(); + $board = $card->getRelatedBoard(); + $json = (new CardDetails($card, $board))->jsonSerialize(); + + $json['relatedBoard'] = $board; $json['relatedStack'] = $card->getRelatedStack(); - $json['relatedBoard'] = $card->getRelatedBoard(); + return $json; }, $cards)); } diff --git a/lib/Db/CardMapper.php b/lib/Db/CardMapper.php index 219588f81..4f62dfa67 100644 --- a/lib/Db/CardMapper.php +++ b/lib/Db/CardMapper.php @@ -226,6 +226,21 @@ class CardMapper extends QBMapper implements IPermissionMapper { return $this->findEntities($qb); } + public function findAllByBoardId(int $boardId, ?int $limit = null, ?int $offset = null): array { + $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('board_id', $qb->createNamedParameter($boardId, IQueryBuilder::PARAM_INT))) + ->andWhere($qb->expr()->eq('archived', $qb->createNamedParameter(false, IQueryBuilder::PARAM_BOOL))) + ->setMaxResults($limit) + ->setFirstResult($offset) + ->orderBy('c.lastmodified') + ->addOrderBy('c.id'); + return $this->findEntities($qb); + } + public function findAllWithDue($boardId) { $qb = $this->db->getQueryBuilder(); $qb->select('c.*') diff --git a/lib/Service/OverviewService.php b/lib/Service/OverviewService.php index a8bb3990f..3d2152bc3 100644 --- a/lib/Service/OverviewService.php +++ b/lib/Service/OverviewService.php @@ -30,9 +30,9 @@ namespace OCA\Deck\Service; use OCA\Deck\Db\AssignmentMapper; use OCA\Deck\Db\Card; use OCA\Deck\Db\CardMapper; +use OCA\Deck\Model\CardDetails; use OCP\Comments\ICommentsManager; use OCP\IGroupManager; -use OCA\Deck\Db\Board; use OCA\Deck\Db\BoardMapper; use OCA\Deck\Db\LabelMapper; use OCP\IUserManager; @@ -96,42 +96,35 @@ class OverviewService { $userBoards = $this->findAllBoardsFromUser($userId); $allDueCards = []; foreach ($userBoards as $userBoard) { - $service = $this; - $allDueCards[] = array_map(static function ($card) use ($service, $userBoard, $userId) { - $service->enrich($card, $userId); - $cardData = $card->jsonSerialize(); - $cardData['boardId'] = $userBoard->getId(); - return $cardData; + $allDueCards[] = array_map(function ($card) use ($userBoard, $userId) { + $this->enrich($card, $userId); + return (new CardDetails($card, $userBoard))->jsonSerialize(); }, $this->cardMapper->findAllWithDue($userBoard->getId())); } - return $allDueCards; + return array_merge(...$allDueCards); } public function findUpcomingCards(string $userId): array { $userBoards = $this->findAllBoardsFromUser($userId); - $findCards = []; + $foundCards = []; foreach ($userBoards as $userBoard) { - $service = $this; - if (count($userBoard->getAcl()) === 0) { // private board: get cards with due date - $findCards[] = array_map(static function ($card) use ($service, $userBoard, $userId) { - $service->enrich($card, $userId); - $cardData = $card->jsonSerialize(); - $cardData['boardId'] = $userBoard->getId(); - return $cardData; - }, $this->cardMapper->findAllWithDue($userBoard->getId())); + $cards = $this->cardMapper->findAllWithDue($userBoard->getId()); } else { // shared board: get all my assigned or unassigned cards - $findCards[] = array_map(static function ($card) use ($service, $userBoard, $userId) { - $service->enrich($card, $userId); - $cardData = $card->jsonSerialize(); - $cardData['boardId'] = $userBoard->getId(); - return $cardData; - }, $this->cardMapper->findToMeOrNotAssignedCards($userBoard->getId(), $userId)); + $cards = $this->cardMapper->findToMeOrNotAssignedCards($userBoard->getId(), $userId); } + + $foundCards[] = array_map( + function (Card $card) use ($userBoard, $userId) { + $this->enrich($card, $userId); + return new CardDetails($card, $userBoard); + }, + $cards + ); } - return $findCards; + return array_merge(...$foundCards); } // FIXME: This is duplicate code with the board service diff --git a/lib/Service/StackService.php b/lib/Service/StackService.php index 79f659eba..a5fba8c9e 100644 --- a/lib/Service/StackService.php +++ b/lib/Service/StackService.php @@ -30,11 +30,13 @@ use OCA\Deck\BadRequestException; use OCA\Deck\Db\Acl; use OCA\Deck\Db\AssignmentMapper; use OCA\Deck\Db\BoardMapper; +use OCA\Deck\Db\Card; use OCA\Deck\Db\CardMapper; use OCA\Deck\Db\ChangeHelper; use OCA\Deck\Db\LabelMapper; use OCA\Deck\Db\Stack; use OCA\Deck\Db\StackMapper; +use OCA\Deck\Model\CardDetails; use OCA\Deck\NoPermissionException; use OCA\Deck\StatusException; @@ -84,9 +86,13 @@ class StackService { return; } - foreach ($cards as $card) { - $this->cardService->enrich($card); - } + $cards = array_map( + function (Card $card): CardDetails { + $this->cardService->enrich($card); + return new CardDetails($card); + }, + $cards + ); $stack->setCards($cards); } @@ -112,12 +118,18 @@ class StackService { $this->permissionService->checkPermission($this->stackMapper, $stackId, Acl::PERMISSION_READ); $stack = $this->stackMapper->find($stackId); - $cards = $this->cardMapper->findAll($stackId); - foreach ($cards as $cardIndex => $card) { - $assignedUsers = $this->assignedUsersMapper->findAll($card->getId()); - $card->setAssignedUsers($assignedUsers); - $card->setAttachmentCount($this->attachmentService->count($card->getId())); - } + + $cards = array_map( + function (Card $card): CardDetails { + $assignedUsers = $this->assignedUsersMapper->findAll($card->getId()); + $card->setAssignedUsers($assignedUsers); + $card->setAttachmentCount($this->attachmentService->count($card->getId())); + + return new CardDetails($card); + }, + $this->cardMapper->findAll($stackId) + ); + $stack->setCards($cards); return $stack;