Delete linked objects
This commit is contained in:
@@ -31,16 +31,14 @@ use Symfony\Component\Config\Definition\Exception\Exception;
|
|||||||
class BoardMapper extends DeckMapper implements IPermissionMapper {
|
class BoardMapper extends DeckMapper implements IPermissionMapper {
|
||||||
|
|
||||||
private $labelMapper;
|
private $labelMapper;
|
||||||
private $_relationMappers = array();
|
private $aclMapper;
|
||||||
|
private $stackMapper;
|
||||||
|
|
||||||
public function addRelationMapper($name, $mapper) {
|
public function __construct(IDb $db, LabelMapper $labelMapper, AclMapper $aclMapper, StackMapper $stackMapper) {
|
||||||
$this->_relationMappers[$name] = $mapper;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function __construct(IDb $db, LabelMapper $labelMapper, AclMapper $aclMapper) {
|
|
||||||
parent::__construct($db, 'deck_boards', '\OCA\Deck\Db\Board');
|
parent::__construct($db, 'deck_boards', '\OCA\Deck\Db\Board');
|
||||||
$this->labelMapper = $labelMapper;
|
$this->labelMapper = $labelMapper;
|
||||||
$this->aclMapper = $aclMapper;
|
$this->aclMapper = $aclMapper;
|
||||||
|
$this->stackMapper = $stackMapper;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -113,7 +111,23 @@ class BoardMapper extends DeckMapper implements IPermissionMapper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public function delete(\OCP\AppFramework\Db\Entity $entity) {
|
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);
|
return parent::delete($entity);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -67,10 +67,6 @@ class CardMapper extends Mapper implements IPermissionMapper {
|
|||||||
return $card;
|
return $card;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function findAllByBoard($boardId, $limit=null, $offset=null) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public function findAll($stackId, $limit=null, $offset=null) {
|
public function findAll($stackId, $limit=null, $offset=null) {
|
||||||
// TODO: Exclude fields like text
|
// TODO: Exclude fields like text
|
||||||
$sql = 'SELECT * FROM `*PREFIX*deck_cards`
|
$sql = 'SELECT * FROM `*PREFIX*deck_cards`
|
||||||
@@ -85,11 +81,28 @@ class CardMapper extends Mapper implements IPermissionMapper {
|
|||||||
return $entities;
|
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) {
|
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);
|
return parent::delete($entity);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function deleteByStack($stackId) {
|
||||||
|
$cards = $this->findAllByStack($stackId);
|
||||||
|
foreach ($cards as $card) {
|
||||||
|
$this->delete($card);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
public function assignLabel($card, $label) {
|
public function assignLabel($card, $label) {
|
||||||
$sql = 'INSERT INTO `*PREFIX*deck_assigned_labels` (`label_id`,`card_id`) VALUES (?,?)';
|
$sql = 'INSERT INTO `*PREFIX*deck_assigned_labels` (`label_id`,`card_id`) VALUES (?,?)';
|
||||||
$stmt = $this->db->prepare($sql);
|
$stmt = $this->db->prepare($sql);
|
||||||
|
|||||||
@@ -50,10 +50,8 @@ abstract class DeckMapper extends Mapper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected function execute($sql, array $params = [], $limit = null, $offset = null) {
|
protected function execute($sql, array $params = [], $limit = null, $offset = null) {
|
||||||
|
\OCP\Util::writeLog('deck', "DeckMapper SQL: " . $sql, \OCP\Util::DEBUG);
|
||||||
\OCP\Util::writeLog('deck', "SQL: " . $sql, \OCP\Util::DEBUG);
|
return parent::execute($sql, $params, $limit, $offset);
|
||||||
|
|
||||||
return parent::execute($sql, $params, $limit, $offset); // TODO: Change the autogenerated stub
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -27,6 +27,8 @@ namespace OCA\Deck\Db;
|
|||||||
|
|
||||||
interface IPermissionMapper {
|
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
|
* Check if $userId is owner of Entity with $id
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -40,11 +40,13 @@ class LabelMapper extends DeckMapper implements IPermissionMapper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public function delete(Entity $entity) {
|
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);
|
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';
|
$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);
|
return $this->findEntities($sql, [$cardId], $limit, $offset);
|
||||||
}
|
}
|
||||||
@@ -67,6 +69,20 @@ class LabelMapper extends DeckMapper implements IPermissionMapper {
|
|||||||
return $result;
|
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) {
|
public function isOwner($userId, $labelId) {
|
||||||
$sql = 'SELECT * FROM `*PREFIX*deck_boards` WHERE `id` IN (SELECT board_id FROM `*PREFIX*deck_labels` WHERE id = ?)';
|
$sql = 'SELECT * FROM `*PREFIX*deck_boards` WHERE `id` IN (SELECT board_id FROM `*PREFIX*deck_labels` WHERE id = ?)';
|
||||||
$stmt = $this->execute($sql, [$labelId]);
|
$stmt = $this->execute($sql, [$labelId]);
|
||||||
|
|||||||
@@ -56,7 +56,8 @@ class StackMapper extends Mapper implements IPermissionMapper {
|
|||||||
|
|
||||||
|
|
||||||
public function delete(Entity $entity) {
|
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);
|
return parent::delete($entity);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user