From b82b1ef2f030c0876fc4201dafad505efbb50589 Mon Sep 17 00:00:00 2001 From: Julius Haertl Date: Sat, 15 Oct 2016 12:05:27 +0200 Subject: [PATCH] Delete linked objects --- lib/Db/BoardMapper.php | 28 +++++++++++++++++++++------- lib/Db/CardMapper.php | 23 ++++++++++++++++++----- lib/Db/DeckMapper.php | 6 ++---- lib/Db/IPermissionMapper.php | 2 ++ lib/Db/LabelMapper.php | 20 ++++++++++++++++++-- lib/Db/StackMapper.php | 3 ++- 6 files changed, 63 insertions(+), 19 deletions(-) diff --git a/lib/Db/BoardMapper.php b/lib/Db/BoardMapper.php index e20e83545..60f84917f 100644 --- a/lib/Db/BoardMapper.php +++ b/lib/Db/BoardMapper.php @@ -31,16 +31,14 @@ use Symfony\Component\Config\Definition\Exception\Exception; class BoardMapper extends DeckMapper implements IPermissionMapper { private $labelMapper; - private $_relationMappers = array(); + private $aclMapper; + private $stackMapper; - public function addRelationMapper($name, $mapper) { - $this->_relationMappers[$name] = $mapper; - } - - public function __construct(IDb $db, LabelMapper $labelMapper, AclMapper $aclMapper) { + public function __construct(IDb $db, LabelMapper $labelMapper, AclMapper $aclMapper, StackMapper $stackMapper) { parent::__construct($db, 'deck_boards', '\OCA\Deck\Db\Board'); $this->labelMapper = $labelMapper; $this->aclMapper = $aclMapper; + $this->stackMapper = $stackMapper; } @@ -113,7 +111,23 @@ class BoardMapper extends DeckMapper implements IPermissionMapper { } public function delete(\OCP\AppFramework\Db\Entity $entity) { - //$this->deleteRelationalEntities('label', $entity); + // delete acl + $acl = $this->aclMapper->findAll($entity->getId()); + foreach ($acl as $item) { + $this->aclMapper->delete($item); + } + + // delete stacks ( includes cards, assigned labels) + $stacks = $this->stackMapper->findAll($entity->getId()); + foreach ($stacks as $stack) { + $this->stackMapper->delete($stack); + } + // delete labels + $labels = $this->labelMapper->findAll($entity->getId()); + foreach ($labels as $label) { + $this->labelMapper->delete($label); + } + return parent::delete($entity); } diff --git a/lib/Db/CardMapper.php b/lib/Db/CardMapper.php index 9408d1b4a..3863f8c4c 100644 --- a/lib/Db/CardMapper.php +++ b/lib/Db/CardMapper.php @@ -67,10 +67,6 @@ class CardMapper extends Mapper implements IPermissionMapper { return $card; } - public function findAllByBoard($boardId, $limit=null, $offset=null) { - - } - public function findAll($stackId, $limit=null, $offset=null) { // TODO: Exclude fields like text $sql = 'SELECT * FROM `*PREFIX*deck_cards` @@ -85,11 +81,28 @@ class CardMapper extends Mapper implements IPermissionMapper { return $entities; } + public function findAllByStack($stackId, $limit=null, $offset=null) { + $sql = 'SELECT id FROM `*PREFIX*deck_cards` + WHERE `stack_id` = ?'; + $entities = $this->findEntities($sql, [$stackId], $limit, $offset); + return $entities; + } + public function delete(Entity $entity) { - // FIXME: delete linked elements, because owncloud doesn't support foreign keys for apps + // delete assigned labels + $this->labelMapper->deleteLabelAssignmentsForCard($entity->getId()); + // delete card return parent::delete($entity); } + public function deleteByStack($stackId) { + $cards = $this->findAllByStack($stackId); + foreach ($cards as $card) { + $this->delete($card); + } + + } + public function assignLabel($card, $label) { $sql = 'INSERT INTO `*PREFIX*deck_assigned_labels` (`label_id`,`card_id`) VALUES (?,?)'; $stmt = $this->db->prepare($sql); diff --git a/lib/Db/DeckMapper.php b/lib/Db/DeckMapper.php index 96b557175..a5ce17104 100644 --- a/lib/Db/DeckMapper.php +++ b/lib/Db/DeckMapper.php @@ -50,10 +50,8 @@ abstract class DeckMapper extends Mapper { } protected function execute($sql, array $params = [], $limit = null, $offset = null) { - - \OCP\Util::writeLog('deck', "SQL: " . $sql, \OCP\Util::DEBUG); - - return parent::execute($sql, $params, $limit, $offset); // TODO: Change the autogenerated stub + \OCP\Util::writeLog('deck', "DeckMapper SQL: " . $sql, \OCP\Util::DEBUG); + return parent::execute($sql, $params, $limit, $offset); } } \ No newline at end of file diff --git a/lib/Db/IPermissionMapper.php b/lib/Db/IPermissionMapper.php index c41509176..ba8d7f204 100644 --- a/lib/Db/IPermissionMapper.php +++ b/lib/Db/IPermissionMapper.php @@ -27,6 +27,8 @@ namespace OCA\Deck\Db; interface IPermissionMapper { + // FIXME: Optimize implementations as e.g. BoardMapper::isOwner doesn't need to select all fields + /** * Check if $userId is owner of Entity with $id * diff --git a/lib/Db/LabelMapper.php b/lib/Db/LabelMapper.php index 9a4ca6a86..6c13b598b 100644 --- a/lib/Db/LabelMapper.php +++ b/lib/Db/LabelMapper.php @@ -40,11 +40,13 @@ class LabelMapper extends DeckMapper implements IPermissionMapper { } public function delete(Entity $entity) { - // FIXME: delete linked elements, because owncloud doesn't support foreign keys for apps + // delete assigned labels + $this->deleteLabelAssignments($entity->getId()); + // delete label return parent::delete($entity); } - public function findAssignedLabelsForCard($cardId) { + public function findAssignedLabelsForCard($cardId, $limit=null, $offset=null) { $sql = 'SELECT l.* FROM `*PREFIX*deck_assigned_labels` as al INNER JOIN *PREFIX*deck_labels as l ON l.id = al.label_id WHERE `card_id` = ? ORDER BY l.id'; return $this->findEntities($sql, [$cardId], $limit, $offset); } @@ -67,6 +69,20 @@ class LabelMapper extends DeckMapper implements IPermissionMapper { return $result; } + public function deleteLabelAssignments($labelId, $limit=null, $offset=null) { + $sql = 'DELETE FROM `*PREFIX*deck_assigned_labels` WHERE label_id = ?'; + $stmt = $this->db->prepare($sql); + $stmt->bindParam(1, $labelId, \PDO::PARAM_INT); + $stmt->execute(); + } + + public function deleteLabelAssignmentsForCard($cardId, $limit=null, $offset=null) { + $sql = 'DELETE FROM `*PREFIX*deck_assigned_labels` WHERE card_id = ?'; + $stmt = $this->db->prepare($sql); + $stmt->bindParam(1, $cardId, \PDO::PARAM_INT); + $stmt->execute(); + } + public function isOwner($userId, $labelId) { $sql = 'SELECT * FROM `*PREFIX*deck_boards` WHERE `id` IN (SELECT board_id FROM `*PREFIX*deck_labels` WHERE id = ?)'; $stmt = $this->execute($sql, [$labelId]); diff --git a/lib/Db/StackMapper.php b/lib/Db/StackMapper.php index 8a7bcd4e0..a07b9e4c8 100644 --- a/lib/Db/StackMapper.php +++ b/lib/Db/StackMapper.php @@ -56,7 +56,8 @@ class StackMapper extends Mapper implements IPermissionMapper { public function delete(Entity $entity) { - // FIXME: delete linked elements, because owncloud doesn't support foreign keys for apps + // delete cards on stack + $this->cardMapper->deleteByStack($entity->getId()); return parent::delete($entity); }