Compare commits

..

3 Commits

Author SHA1 Message Date
Carl Schwan
8ebeeaa755 perf: Use getBoard to get the board
So that this can benefit from a local cache

Signed-off-by: Carl Schwan <carl.schwan@nextclound.com>
2025-08-13 16:51:40 +02:00
Carl Schwan
ce81c89b03 perf: Only enrich with labels when no labels was prefetched
Signed-off-by: Carl Schwan <carl.schwan@nextclound.com>
2025-08-13 13:32:17 +02:00
Carl Schwan
1e59511d8d perf: Don't call twice the same query
Find entities will execute the query already, there is no need to do it
twice.

Signed-off-by: Carl Schwan <carl.schwan@nextclound.com>
2025-08-13 13:31:41 +02:00
6 changed files with 20 additions and 37 deletions

View File

@@ -45,8 +45,7 @@ class SessionMapper extends QBMapper {
$qb->select('id', 'board_id', 'last_contact', 'user_id', 'token')
->from($this->getTableName())
->where($qb->expr()->eq('board_id', $qb->createNamedParameter($boardId)))
->andWhere($qb->expr()->gt('last_contact', $qb->createNamedParameter(time() - SessionService::SESSION_VALID_TIME)))
->executeQuery();
->andWhere($qb->expr()->gt('last_contact', $qb->createNamedParameter(time() - SessionService::SESSION_VALID_TIME)));
return $this->findEntities($qb);
}

View File

@@ -621,7 +621,9 @@ class BoardService {
if ($fullDetails) {
$this->enrichWithStacks($board);
$this->enrichWithLabels($board);
if ($board->getLabels() === null) {
$this->enrichWithLabels($board);
}
$this->enrichWithUsers($board);
$this->enrichWithBoardSettings($board);
$this->enrichWithActiveSessions($board);

View File

@@ -19,7 +19,6 @@ use OCA\Deck\Db\CardMapper;
use OCA\Deck\Db\ChangeHelper;
use OCA\Deck\Db\Label;
use OCA\Deck\Db\LabelMapper;
use OCA\Deck\Db\Stack;
use OCA\Deck\Db\StackMapper;
use OCA\Deck\Event\CardCreatedEvent;
use OCA\Deck\Event\CardDeletedEvent;
@@ -65,47 +64,31 @@ class CardService {
) {
}
/**
* @param Card[] $cards
* @return CardDetails[]
*/
public function enrichCards(array $cards, Stack $stack = null): array {
if (!$cards) {
return [];
}
public function enrichCards($cards) {
$user = $this->userManager->get($this->userId);
$cardIds = array_map(function (Card $card) use ($user, $stack) {
$cardIds = array_map(function (Card $card) use ($user) {
// Everything done in here might be heavy as it is executed for every card
$cardId = $card->getId();
$this->cardMapper->mapOwner($card);
$card->setAttachmentCount($this->attachmentService->count($cardId));
if ($stack === null) {
$stack = $this->stackMapper->find($card->getStackId());
}
// TODO We should find a better way just to get the comment count so we can save 1-3 queries per card here
$countComments = $this->commentsManager->getNumberOfCommentsForObject('deckCard', (string)$card->getId());
$lastRead = $countComments > 0 ? $this->commentsManager->getReadMark('deckCard', (string)$card->getId(), $user) : null;
$countUnreadComments = $lastRead ? $this->commentsManager->getNumberOfCommentsForObject('deckCard', (string)$card->getId(), $lastRead) : 0;
$card->setCommentsUnread($countUnreadComments);
$card->setCommentsCount($countComments);
$stack = $this->stackMapper->find($card->getStackId());
$board = $this->boardService->find($stack->getBoardId(), false);
$card->setRelatedStack($stack);
$card->setRelatedBoard($board);
return $cardId;
return $card->getId();
}, $cards);
$commentsCountPerCardId = $this->commentsManager->getNumberOfCommentsForObjects('deckCard', $cardIds);
$unreadCommentsCountPerCardId = $this->commentsManager->getNumberOfUnreadCommentsForObjects('deckCard', $cardIds, $user);
foreach ($commentsCountPerCardId as $cardId => $commentCounts) {
foreach ($cards as $card) {
if ($card->getId() === $cardId) {
$card->setCommentsUnread($unreadCommentsCountPerCardId[$cardId]);
$card->setCommentsCount($commentCounts);
break;
}
}
}
$assignedLabels = $this->labelMapper->findAssignedLabelsForCards($cardIds);
$assignedUsers = $this->assignedUsersMapper->findIn($cardIds);

View File

@@ -214,7 +214,7 @@ class PermissionService {
}
try {
$board = $this->boardMapper->find($boardId);
$board = $this->getBoard($boardId);
} catch (DoesNotExistException $e) {
return [];
} catch (MultipleObjectsReturnedException $e) {
@@ -227,7 +227,7 @@ class PermissionService {
} else {
$users[$board->getOwner()] = new User($board->getOwner(), $this->userManager);
}
$acls = $this->aclMapper->findAll($boardId);
$acls = $board->getAcl();
/** @var Acl $acl */
foreach ($acls as $acl) {
if ($acl->getType() === Acl::PERMISSION_TYPE_USER) {

View File

@@ -82,7 +82,7 @@ class StackService {
return;
}
$stack->setCards($this->cardService->enrichCards($cards, $stack));
$stack->setCards($this->cardService->enrichCards($cards));
}
private function enrichStacksWithCards($stacks, $since = -1) {

View File

@@ -347,9 +347,8 @@ class PermissionServiceTest extends \Test\TestCase {
->method('__call')
->with('getOwner', [])
->willReturn('user1');
$this->aclMapper->expects($this->once())
->method('findAll')
->with(123)
$board->expects($this->any())
->method('getAcl')
->willReturn([$aclUser, $aclGroup]);
$this->boardMapper->expects($this->once())
->method('find')