Migrate CardMapper to query builder

Signed-off-by: Julius Härtl <jus@bitgrid.net>
This commit is contained in:
Julius Härtl
2020-02-16 14:30:50 +01:00
parent 3cb278f77f
commit fc58439d2e
3 changed files with 64 additions and 38 deletions

View File

@@ -23,7 +23,9 @@
namespace OCA\Deck\Db; namespace OCA\Deck\Db;
use Exception;
use OCP\AppFramework\Db\Entity; use OCP\AppFramework\Db\Entity;
use OCP\AppFramework\Db\QBMapper; use OCP\AppFramework\Db\QBMapper;
use OCP\DB\QueryBuilder\IQueryBuilder; use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\IDBConnection; 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 // make sure we only reset the notification flag if the duedate changes
if (in_array('duedate', $entity->getUpdatedFields(), true)) { if (in_array('duedate', $entity->getUpdatedFields(), true)) {
$existing = $this->find($entity->getId()); /** @var Card $existing */
if ($existing->getDuedate() !== $entity->getDuedate()) { try {
$entity->setNotified(false); $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); return parent::update($entity);
} }
@@ -102,19 +108,13 @@ class CardMapper extends QBMapper implements IPermissionMapper {
return parent::update($cardUpdate); return parent::update($cardUpdate);
} }
/** public function find($id): Card {
* @param $id
* @return RelationalEntity if not found
* @throws \OCP\AppFramework\Db\MultipleObjectsReturnedException
* @throws \OCP\AppFramework\Db\DoesNotExistException
*/
public function find($id): Entity {
$qb = $this->db->getQueryBuilder(); $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))) ->where($qb->expr()->eq('id', $qb->createNamedParameter($id, IQueryBuilder::PARAM_INT)))
->orderBy('order') ->orderBy('order')
->addOrderBy('id'); ->addOrderBy('id');
/** @var Card $card */ /** @var Card $card */
$card = $this->findEntity($qb); $card = $this->findEntity($qb);
$labels = $this->labelMapper->findAssignedLabelsForCard($card->id); $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('archived', $qb->createNamedParameter(false, IQueryBuilder::PARAM_BOOL)))
->andWhere($qb->expr()->eq('deleted_at', $qb->createNamedParameter(0, IQueryBuilder::PARAM_INT))) ->andWhere($qb->expr()->eq('deleted_at', $qb->createNamedParameter(0, IQueryBuilder::PARAM_INT)))
->andWhere($qb->expr()->gt('last_modified', $qb->createNamedParameter($since, IQueryBuilder::PARAM_INT))) ->andWhere($qb->expr()->gt('last_modified', $qb->createNamedParameter($since, IQueryBuilder::PARAM_INT)))
->orderBy('order', 'id')
->setMaxResults($limit) ->setMaxResults($limit)
->setFirstResult($offset) ->setFirstResult($offset);
->orderBy('order')
->addOrderBy('id');
return $this->findEntities($qb); return $this->findEntities($qb);
} }
@@ -153,17 +152,35 @@ class CardMapper extends QBMapper implements IPermissionMapper {
->from('deck_cards', 'c') ->from('deck_cards', 'c')
->innerJoin('c', 'deck_stacks', 's', $qb->expr()->eq('s.id', 'c.stack_id')) ->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))); ->andWhere($qb->expr()->in('s.board_id', $qb->createNamedParameter($boardIds, IQueryBuilder::PARAM_INT_ARRAY)));
return $qb; return $qb;
} }
public function findDeleted($boardId, $limit = null, $offset = null) { public function findDeleted($boardId, $limit = null, $offset = null) {
$qb = $this->queryCardsByBoard($boardId); $qb = $this->db->getQueryBuilder();
$qb->andWhere($qb->expr()->neq('c.deleted_at', $qb->createNamedParameter(0, IQueryBuilder::PARAM_INT))) $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) ->setMaxResults($limit)
->setFirstResult($offset) ->setFirstResult($offset);
->orderBy('order') return $this->findEntities($qb);
->addOrderBy('id'); }
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); return $this->findEntities($qb);
} }
@@ -278,19 +295,21 @@ class CardMapper extends QBMapper implements IPermissionMapper {
} }
public function assignLabel($card, $label) { public function assignLabel($card, $label) {
$sql = 'INSERT INTO `*PREFIX*deck_assigned_labels` (`label_id`,`card_id`) VALUES (?,?)'; $qb = $this->db->getQueryBuilder();
$stmt = $this->db->prepare($sql); $qb->insert('deck_assigned_labels')
$stmt->bindParam(1, $label, \PDO::PARAM_INT); ->values([
$stmt->bindParam(2, $card, \PDO::PARAM_INT); 'label_id' => $qb->createNamedParameter($label, IQueryBuilder::PARAM_INT),
$stmt->execute(); 'card_id' => $qb->createNamedParameter($card, IQueryBuilder::PARAM_INT),
]);
$qb->execute();
} }
public function removeLabel($card, $label) { public function removeLabel($card, $label) {
$sql = 'DELETE FROM `*PREFIX*deck_assigned_labels` WHERE card_id = ? AND label_id = ?'; $qb = $this->db->getQueryBuilder();
$stmt = $this->db->prepare($sql); $qb->delete('deck_assigned_labels')
$stmt->bindParam(1, $card, \PDO::PARAM_INT); ->where($qb->expr()->eq('card_id', $qb->createNamedParameter($card)))
$stmt->bindParam(2, $label, \PDO::PARAM_INT); ->andWhere($qb->expr()->eq('label_id', $qb->createNamedParameter($label)));
$stmt->execute(); $qb->execute();
} }
public function isOwner($userId, $cardId) { public function isOwner($userId, $cardId) {

View File

@@ -29,10 +29,11 @@ use OCP\AppFramework\Db\Mapper;
* Class DeckMapper * Class DeckMapper
* *
* @package OCA\Deck\Db * @package OCA\Deck\Db
* @deprecated use QBMapper
* *
* TODO: Move to QBMapper once Nextcloud 14 is a minimum requirement * TODO: Move to QBMapper once Nextcloud 14 is a minimum requirement
*/ */
abstract class DeckMapper extends Mapper { class DeckMapper extends Mapper {
/** /**
* @param $id * @param $id

View File

@@ -144,6 +144,12 @@ class CardService {
return $card; return $card;
} }
public function findCalendarEntries($boardId) {
$this->permissionService->checkPermission($this->boardMapper, $boardId, Acl::PERMISSION_READ);
return $this->cardMapper->findCalendarEntries($boardId);
}
/** /**
* @param $title * @param $title
* @param $stackId * @param $stackId