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 {
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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
|
||||
*
|
||||
|
||||
@@ -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]);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user