From fc58439d2e8549b3af9a19eb8d7c44f36f1135fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julius=20H=C3=A4rtl?= Date: Sun, 16 Feb 2020 14:30:50 +0100 Subject: [PATCH] Migrate CardMapper to query builder MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Julius Härtl --- lib/Db/CardMapper.php | 93 ++++++++++++++++++++++--------------- lib/Db/DeckMapper.php | 3 +- lib/Service/CardService.php | 6 +++ 3 files changed, 64 insertions(+), 38 deletions(-) diff --git a/lib/Db/CardMapper.php b/lib/Db/CardMapper.php index 453b987cb..a929bec3b 100644 --- a/lib/Db/CardMapper.php +++ b/lib/Db/CardMapper.php @@ -23,7 +23,9 @@ namespace OCA\Deck\Db; +use Exception; use OCP\AppFramework\Db\Entity; + use OCP\AppFramework\Db\QBMapper; use OCP\DB\QueryBuilder\IQueryBuilder; use OCP\IDBConnection; @@ -81,16 +83,20 @@ class CardMapper extends QBMapper implements IPermissionMapper { // make sure we only reset the notification flag if the duedate changes if (in_array('duedate', $entity->getUpdatedFields(), true)) { - $existing = $this->find($entity->getId()); - if ($existing->getDuedate() !== $entity->getDuedate()) { - $entity->setNotified(false); + /** @var Card $existing */ + try { + $existing = $this->find($entity->getId()); + if ($existing && $entity->getDuedate() !== $existing->getDuedate()) { + $entity->setNotified(false); + } + // remove pending notifications + $notification = $this->notificationManager->createNotification(); + $notification + ->setApp('deck') + ->setObject('card', $entity->getId()); + $this->notificationManager->markProcessed($notification); + } catch (Exception $e) { } - // remove pending notifications - $notification = $this->notificationManager->createNotification(); - $notification - ->setApp('deck') - ->setObject('card', $entity->getId()); - $this->notificationManager->markProcessed($notification); } return parent::update($entity); } @@ -102,19 +108,13 @@ class CardMapper extends QBMapper implements IPermissionMapper { return parent::update($cardUpdate); } - /** - * @param $id - * @return RelationalEntity if not found - * @throws \OCP\AppFramework\Db\MultipleObjectsReturnedException - * @throws \OCP\AppFramework\Db\DoesNotExistException - */ - public function find($id): Entity { + public function find($id): Card { $qb = $this->db->getQueryBuilder(); - $qb->select('*')->from('deck_cards') + $qb->select('*') + ->from('deck_cards') ->where($qb->expr()->eq('id', $qb->createNamedParameter($id, IQueryBuilder::PARAM_INT))) ->orderBy('order') ->addOrderBy('id'); - /** @var Card $card */ $card = $this->findEntity($qb); $labels = $this->labelMapper->findAssignedLabelsForCard($card->id); @@ -131,10 +131,9 @@ class CardMapper extends QBMapper implements IPermissionMapper { ->andWhere($qb->expr()->eq('archived', $qb->createNamedParameter(false, IQueryBuilder::PARAM_BOOL))) ->andWhere($qb->expr()->eq('deleted_at', $qb->createNamedParameter(0, IQueryBuilder::PARAM_INT))) ->andWhere($qb->expr()->gt('last_modified', $qb->createNamedParameter($since, IQueryBuilder::PARAM_INT))) + ->orderBy('order', 'id') ->setMaxResults($limit) - ->setFirstResult($offset) - ->orderBy('order') - ->addOrderBy('id'); + ->setFirstResult($offset); return $this->findEntities($qb); } @@ -153,17 +152,35 @@ class CardMapper extends QBMapper implements IPermissionMapper { ->from('deck_cards', 'c') ->innerJoin('c', 'deck_stacks', 's', $qb->expr()->eq('s.id', 'c.stack_id')) ->andWhere($qb->expr()->in('s.board_id', $qb->createNamedParameter($boardIds, IQueryBuilder::PARAM_INT_ARRAY))); - return $qb; } public function findDeleted($boardId, $limit = null, $offset = null) { - $qb = $this->queryCardsByBoard($boardId); - $qb->andWhere($qb->expr()->neq('c.deleted_at', $qb->createNamedParameter(0, IQueryBuilder::PARAM_INT))) + $qb = $this->db->getQueryBuilder(); + $qb->select('*') + ->from('deck_cards', 'c') + ->join('c', 'deck_stacks', 's', $qb->expr()->eq('s.id', 'c.stack_id')) + ->where($qb->expr()->eq('s.board_id', $qb->createNamedParameter($boardId))) + ->andWhere($qb->expr()->neq('c.archived', $qb->createNamedParameter(true))) + ->andWhere($qb->expr()->neq('c.deleted_at', $qb->createNamedParameter(0))) + ->orderBy('c.order') ->setMaxResults($limit) - ->setFirstResult($offset) - ->orderBy('order') - ->addOrderBy('id'); + ->setFirstResult($offset); + return $this->findEntities($qb); + } + + public function findCalendarEntries($boardId, $limit = null, $offset = null) { + $qb = $this->db->getQueryBuilder(); + $qb->select('c.*') + ->from('deck_cards', 'c') + ->join('c', 'deck_stacks', 's', 's.id = c.stack_id') + ->where($qb->expr()->eq('s.board_id', $qb->createNamedParameter($boardId))) + ->andWhere($qb->expr()->neq('c.archived', $qb->createNamedParameter(true))) + ->andWhere($qb->expr()->eq('c.deleted_at', $qb->createNamedParameter('0'))) + ->andWhere($qb->expr()->isNotNull('c.duedate')) + ->orderBy('c.duedate') + ->setMaxResults($limit) + ->setFirstResult($offset); return $this->findEntities($qb); } @@ -278,19 +295,21 @@ class CardMapper extends QBMapper implements IPermissionMapper { } public function assignLabel($card, $label) { - $sql = 'INSERT INTO `*PREFIX*deck_assigned_labels` (`label_id`,`card_id`) VALUES (?,?)'; - $stmt = $this->db->prepare($sql); - $stmt->bindParam(1, $label, \PDO::PARAM_INT); - $stmt->bindParam(2, $card, \PDO::PARAM_INT); - $stmt->execute(); + $qb = $this->db->getQueryBuilder(); + $qb->insert('deck_assigned_labels') + ->values([ + 'label_id' => $qb->createNamedParameter($label, IQueryBuilder::PARAM_INT), + 'card_id' => $qb->createNamedParameter($card, IQueryBuilder::PARAM_INT), + ]); + $qb->execute(); } public function removeLabel($card, $label) { - $sql = 'DELETE FROM `*PREFIX*deck_assigned_labels` WHERE card_id = ? AND label_id = ?'; - $stmt = $this->db->prepare($sql); - $stmt->bindParam(1, $card, \PDO::PARAM_INT); - $stmt->bindParam(2, $label, \PDO::PARAM_INT); - $stmt->execute(); + $qb = $this->db->getQueryBuilder(); + $qb->delete('deck_assigned_labels') + ->where($qb->expr()->eq('card_id', $qb->createNamedParameter($card))) + ->andWhere($qb->expr()->eq('label_id', $qb->createNamedParameter($label))); + $qb->execute(); } public function isOwner($userId, $cardId) { diff --git a/lib/Db/DeckMapper.php b/lib/Db/DeckMapper.php index e3a9b4a05..2dd0dd990 100644 --- a/lib/Db/DeckMapper.php +++ b/lib/Db/DeckMapper.php @@ -29,10 +29,11 @@ use OCP\AppFramework\Db\Mapper; * Class DeckMapper * * @package OCA\Deck\Db + * @deprecated use QBMapper * * TODO: Move to QBMapper once Nextcloud 14 is a minimum requirement */ -abstract class DeckMapper extends Mapper { +class DeckMapper extends Mapper { /** * @param $id diff --git a/lib/Service/CardService.php b/lib/Service/CardService.php index 50504bc07..31df0c48b 100644 --- a/lib/Service/CardService.php +++ b/lib/Service/CardService.php @@ -144,6 +144,12 @@ class CardService { return $card; } + public function findCalendarEntries($boardId) { + $this->permissionService->checkPermission($this->boardMapper, $boardId, Acl::PERMISSION_READ); + + return $this->cardMapper->findCalendarEntries($boardId); + } + /** * @param $title * @param $stackId