Delete linked objects

This commit is contained in:
Julius Haertl
2016-10-15 12:05:27 +02:00
parent db97043c97
commit b82b1ef2f0
6 changed files with 63 additions and 19 deletions

View File

@@ -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);
}

View File

@@ -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);

View File

@@ -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);
}
}

View File

@@ -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
*

View File

@@ -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]);

View File

@@ -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);
}