Merge pull request #3720 from nextcloud/bugfix/deck_mapper/use_qb_mapper

Update `DeckMapper` to extend `QBMapper`
This commit is contained in:
Julius Härtl
2022-04-20 16:21:18 +02:00
committed by GitHub
10 changed files with 292 additions and 147 deletions

View File

@@ -33,18 +33,45 @@ class AclMapper extends DeckMapper implements IPermissionMapper {
parent::__construct($db, 'deck_board_acl', Acl::class); parent::__construct($db, 'deck_board_acl', Acl::class);
} }
/**
* @param numeric $boardId
* @param int|null $limit
* @param int|null $offset
* @return Acl[]
* @throws \OCP\DB\Exception
*/
public function findAll($boardId, $limit = null, $offset = null) { public function findAll($boardId, $limit = null, $offset = null) {
$sql = 'SELECT id, board_id, type, participant, permission_edit, permission_share, permission_manage FROM `*PREFIX*deck_board_acl` WHERE `board_id` = ? '; $qb = $this->db->getQueryBuilder();
return $this->findEntities($sql, [$boardId], $limit, $offset); $qb->select('id', 'board_id', 'type', 'participant', 'permission_edit', 'permission_share', 'permission_manage')
->from('deck_board_acl')
->where($qb->expr()->eq('board_id', $qb->createNamedParameter($boardId, IQueryBuilder::PARAM_INT)))
->setMaxResults($limit)
->setFirstResult($offset);
return $this->findEntities($qb);
} }
/**
* @param numeric $userId
* @param numeric $aclId
* @return bool
* @throws \OCP\DB\Exception
*/
public function isOwner($userId, $aclId): bool { public function isOwner($userId, $aclId): bool {
$sql = 'SELECT owner FROM `*PREFIX*deck_boards` WHERE `id` IN (SELECT board_id FROM `*PREFIX*deck_board_acl` WHERE id = ?)'; $qb = $this->db->getQueryBuilder();
$stmt = $this->execute($sql, [$aclId]); $qb->select('acl.id')
$row = $stmt->fetch(); ->from($this->getTableName(), 'acl')
return ($row['owner'] === $userId); ->innerJoin('acl', 'deck_boards', 'b', 'acl.board_id = b.id')
->where($qb->expr()->eq('owner', $qb->createNamedParameter($userId, IQueryBuilder::PARAM_STR)))
->andWhere($qb->expr()->eq('acl.id', $qb->createNamedParameter($aclId, IQueryBuilder::PARAM_INT)));
return count($qb->executeQuery()->fetchAll()) > 0;
} }
/**
* @param numeric $id
* @return int|null
*/
public function findBoardId($id): ?int { public function findBoardId($id): ?int {
try { try {
$entity = $this->find($id); $entity = $this->find($id);
@@ -54,9 +81,21 @@ class AclMapper extends DeckMapper implements IPermissionMapper {
return null; return null;
} }
/**
* @param int $type
* @param string $participant
* @return Acl[]
* @throws \OCP\DB\Exception
*/
public function findByParticipant($type, $participant): array { public function findByParticipant($type, $participant): array {
$sql = 'SELECT * from *PREFIX*deck_board_acl WHERE type = ? AND participant = ?'; $qb = $this->db->getQueryBuilder();
return $this->findEntities($sql, [$type, $participant]);
$qb->select('*')
->from($this->getTableName())
->where($qb->expr()->eq('type', $qb->createNamedParameter($type, IQueryBuilder::PARAM_INT)))
->andWhere($qb->expr()->eq('participant', $qb->createNamedParameter($participant, IQueryBuilder::PARAM_STR)));
return $this->findEntities($qb);
} }
/** /**

View File

@@ -55,9 +55,6 @@ class AssignmentMapper extends QBMapper implements IPermissionMapper {
$this->circleService = $circleService; $this->circleService = $circleService;
} }
/**
* @return Assignment[]
*/
public function findAll(int $cardId): array { public function findAll(int $cardId): array {
$qb = $this->db->getQueryBuilder(); $qb = $this->db->getQueryBuilder();
$qb->select('*') $qb->select('*')

View File

@@ -30,7 +30,6 @@ use OCP\AppFramework\Db\MultipleObjectsReturnedException;
use OCP\DB\QueryBuilder\IQueryBuilder; use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\IDBConnection; use OCP\IDBConnection;
use OCP\IUserManager; use OCP\IUserManager;
use PDO;
class AttachmentMapper extends DeckMapper implements IPermissionMapper { class AttachmentMapper extends DeckMapper implements IPermissionMapper {
private $cardMapper; private $cardMapper;
@@ -52,70 +51,53 @@ class AttachmentMapper extends DeckMapper implements IPermissionMapper {
} }
/** /**
* @param $id * @param int $id
* @return Entity|Attachment * @return Attachment
* @throws \OCP\AppFramework\Db\DoesNotExistException * @throws DoesNotExistException
* @throws \OCP\AppFramework\Db\MultipleObjectsReturnedException * @throws MultipleObjectsReturnedException
* @throws \OCP\DB\Exception
*/ */
public function find($id) { public function find($id) {
$qb = $this->db->getQueryBuilder(); $qb = $this->db->getQueryBuilder();
$qb->select('*') $qb->select('*')
->from('deck_attachment') ->from($this->getTableName())
->where($qb->expr()->eq('id', $qb->createNamedParameter($id, IQueryBuilder::PARAM_INT))); ->where($qb->expr()->eq('id', $qb->createNamedParameter($id, IQueryBuilder::PARAM_INT)));
$cursor = $qb->execute(); return $this->findEntity($qb);
$row = $cursor->fetch(PDO::FETCH_ASSOC); }
if ($row === false) {
$cursor->closeCursor(); /**
throw new DoesNotExistException('Did expect one result but found none when executing' . $qb); * @param int $cardId
} * @param string $data
* @return Attachment
$row2 = $cursor->fetch(); * @throws DoesNotExistException
$cursor->closeCursor(); * @throws MultipleObjectsReturnedException
if ($row2 !== false) { * @throws \OCP\DB\Exception
throw new MultipleObjectsReturnedException('Did not expect more than one result when executing' . $query); */
} public function findByData($cardId, $data) {
$qb = $this->db->getQueryBuilder();
return $this->mapRowToEntity($row); $qb->select('*')
} ->from($this->getTableName())
->where($qb->expr()->eq('card_id', $qb->createNamedParameter($cardId, IQueryBuilder::PARAM_INT)))
public function findByData($cardId, $data) { ->andWhere($qb->expr()->eq('data', $qb->createNamedParameter($data, IQueryBuilder::PARAM_STR)));
$qb = $this->db->getQueryBuilder();
$qb->select('*') return $this->findEntity($qb);
->from('deck_attachment')
->where($qb->expr()->eq('card_id', $qb->createNamedParameter($cardId, IQueryBuilder::PARAM_INT)))
->andWhere($qb->expr()->eq('data', $qb->createNamedParameter($data, IQueryBuilder::PARAM_STR)));
$cursor = $qb->execute();
$row = $cursor->fetch(PDO::FETCH_ASSOC);
if ($row === false) {
$cursor->closeCursor();
throw new DoesNotExistException('Did expect one result but found none when executing' . $qb);
}
$cursor->closeCursor();
return $this->mapRowToEntity($row);
} }
/** /**
* Find all attachments for a card
*
* @param $cardId * @param $cardId
* @return array * @return Entity[]
* @throws \OCP\DB\Exception
*/ */
public function findAll($cardId) { public function findAll($cardId) {
$qb = $this->db->getQueryBuilder(); $qb = $this->db->getQueryBuilder();
$qb->select('*') $qb->select('*')
->from('deck_attachment') ->from($this->getTableName())
->where($qb->expr()->eq('card_id', $qb->createNamedParameter($cardId, IQueryBuilder::PARAM_INT))) ->where($qb->expr()->eq('card_id', $qb->createNamedParameter($cardId, IQueryBuilder::PARAM_INT)))
->andWhere($qb->expr()->eq('deleted_at', $qb->createNamedParameter(0, IQueryBuilder::PARAM_INT))); ->andWhere($qb->expr()->eq('deleted_at', $qb->createNamedParameter(0, IQueryBuilder::PARAM_INT)));
$entities = []; return $this->findEntities($qb);
$cursor = $qb->execute();
while ($row = $cursor->fetch()) {
$entities[] = $this->mapRowToEntity($row);
}
$cursor->closeCursor();
return $entities;
} }
/** /**
@@ -128,7 +110,7 @@ class AttachmentMapper extends DeckMapper implements IPermissionMapper {
$timeLimit = time() - (60 * 5); $timeLimit = time() - (60 * 5);
$qb = $this->db->getQueryBuilder(); $qb = $this->db->getQueryBuilder();
$qb->select('*') $qb->select('*')
->from('deck_attachment') ->from($this->getTableName())
->where($qb->expr()->gt('deleted_at', $qb->createNamedParameter(0, IQueryBuilder::PARAM_INT))); ->where($qb->expr()->gt('deleted_at', $qb->createNamedParameter(0, IQueryBuilder::PARAM_INT)));
if ($withOffset) { if ($withOffset) {
$qb $qb
@@ -139,13 +121,7 @@ class AttachmentMapper extends DeckMapper implements IPermissionMapper {
->andWhere($qb->expr()->eq('card_id', $qb->createNamedParameter($cardId, IQueryBuilder::PARAM_INT))); ->andWhere($qb->expr()->eq('card_id', $qb->createNamedParameter($cardId, IQueryBuilder::PARAM_INT)));
} }
$entities = []; return $this->findEntities($qb);
$cursor = $qb->execute();
while ($row = $cursor->fetch()) {
$entities[] = $this->mapRowToEntity($row);
}
$cursor->closeCursor();
return $entities;
} }

View File

@@ -23,17 +23,15 @@
namespace OCA\Deck\Db; namespace OCA\Deck\Db;
use OCP\AppFramework\Db\Mapper; use OCP\AppFramework\Db\QBMapper;
use OCP\DB\QueryBuilder\IQueryBuilder;
/** /**
* 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
*/ */
class DeckMapper extends Mapper { class DeckMapper extends QBMapper {
/** /**
* @param $id * @param $id
@@ -42,11 +40,11 @@ class DeckMapper extends Mapper {
* @throws \OCP\AppFramework\Db\DoesNotExistException * @throws \OCP\AppFramework\Db\DoesNotExistException
*/ */
public function find($id) { public function find($id) {
$sql = 'SELECT * FROM `' . $this->tableName . '` ' . 'WHERE `id` = ?'; $qb = $this->db->getQueryBuilder();
return $this->findEntity($sql, [$id]); $qb->select('*')
} ->from($this->getTableName())
->where($qb->expr()->eq('id', $qb->createNamedParameter($id, IQueryBuilder::PARAM_INT)));
protected function execute($sql, array $params = [], $limit = null, $offset = null) { return $this->findEntity($qb);
return parent::execute($sql, $params, $limit, $offset);
} }
} }

View File

@@ -26,6 +26,7 @@ namespace OCA\Deck\Db;
use OCP\AppFramework\Db\DoesNotExistException; use OCP\AppFramework\Db\DoesNotExistException;
use OCP\AppFramework\Db\Entity; use OCP\AppFramework\Db\Entity;
use OCP\AppFramework\Db\MultipleObjectsReturnedException; use OCP\AppFramework\Db\MultipleObjectsReturnedException;
use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\IDBConnection; use OCP\IDBConnection;
class LabelMapper extends DeckMapper implements IPermissionMapper { class LabelMapper extends DeckMapper implements IPermissionMapper {
@@ -33,41 +34,105 @@ class LabelMapper extends DeckMapper implements IPermissionMapper {
parent::__construct($db, 'deck_labels', Label::class); parent::__construct($db, 'deck_labels', Label::class);
} }
public function findAll($boardId, $limit = null, $offset = null) { /**
$sql = 'SELECT * FROM `*PREFIX*deck_labels` WHERE `board_id` = ? ORDER BY `id`'; * @param numeric $boardId
return $this->findEntities($sql, [$boardId], $limit, $offset); * @param int|null $limit
* @param int|null $offset
* @return Label[]
* @throws \OCP\DB\Exception
*/
public function findAll($boardId, $limit = null, $offset = null): array {
$qb = $this->db->getQueryBuilder();
$qb->select('*')
->from($this->getTableName())
->where($qb->expr()->eq('board_id', $qb->createNamedParameter($boardId, IQueryBuilder::PARAM_INT)))
->setMaxResults($limit)
->setFirstResult($offset);
return $this->findEntities($qb);
} }
public function delete(\OCP\AppFramework\Db\Entity $entity) { /**
* @param Entity $entity
* @return Entity
* @throws \OCP\DB\Exception
*/
public function delete(Entity $entity): Entity {
// delete assigned labels // delete assigned labels
$this->deleteLabelAssignments($entity->getId()); $this->deleteLabelAssignments($entity->getId());
// delete label // delete label
return parent::delete($entity); return parent::delete($entity);
} }
public function findAssignedLabelsForCard($cardId, $limit = null, $offset = null) { /**
$sql = 'SELECT l.*,card_id 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'; * @param numeric $cardId
return $this->findEntities($sql, [$cardId], $limit, $offset); * @param int|null $limit
} * @param int|null $offset
public function findAssignedLabelsForBoard($boardId, $limit = null, $offset = null) { * @return Label[]
$sql = 'SELECT c.id as card_id, l.id as id, l.title as title, l.color as color FROM `*PREFIX*deck_cards` as c ' . * @throws \OCP\DB\Exception
' INNER JOIN `*PREFIX*deck_assigned_labels` as al ON al.card_id = c.id INNER JOIN `*PREFIX*deck_labels` as l ON al.label_id = l.id WHERE board_id=? ORDER BY l.id'; */
return $this->findEntities($sql, [$boardId], $limit, $offset); public function findAssignedLabelsForCard($cardId, $limit = null, $offset = null): array {
$qb = $this->db->getQueryBuilder();
$qb->select('l.*', 'card_id')
->from($this->getTableName(), 'l')
->innerJoin('l', 'deck_assigned_labels', 'al', 'l.id = al.label_id')
->where($qb->expr()->eq('card_id', $qb->createNamedParameter($cardId, IQueryBuilder::PARAM_INT)))
->orderBy('l.id')
->setMaxResults($limit)
->setFirstResult($offset);
return $this->findEntities($qb);
} }
public function insert(Entity $entity) { /**
* @param numeric $boardId
* @param int|null $limit
* @param int|null $offset
* @return Label[]
* @throws \OCP\DB\Exception
*/
public function findAssignedLabelsForBoard($boardId, $limit = null, $offset = null): array {
$qb = $this->db->getQueryBuilder();
$qb->select('l.id as id', 'l.title as title', 'l.color as color')
->selectAlias('c.id', 'card_id')
->from($this->getTableName(), 'l')
->innerJoin('l', 'deck_assigned_labels', 'al', 'al.label_id = l.id')
->innerJoin('l', 'deck_cards', 'c', 'al.card_id = c.id')
->where($qb->expr()->eq('board_id', $qb->createNamedParameter($boardId, IQueryBuilder::PARAM_INT)))
->orderBy('l.id')
->setMaxResults($limit)
->setFirstResult($offset);
return $this->findEntities($qb);
}
/**
* @param Entity $entity
* @return Entity
* @throws \OCP\DB\Exception
*/
public function insert(Entity $entity): Entity {
$entity->setLastModified(time()); $entity->setLastModified(time());
return parent::insert($entity); return parent::insert($entity);
} }
public function update(Entity $entity, $updateModified = true) { /**
* @param Entity $entity
* @param bool $updateModified
* @return Entity
* @throws \OCP\DB\Exception
*/
public function update(Entity $entity, $updateModified = true): Entity {
if ($updateModified) { if ($updateModified) {
$entity->setLastModified(time()); $entity->setLastModified(time());
} }
return parent::update($entity); return parent::update($entity);
} }
/**
* @param numeric $boardId
* @return array
* @throws \OCP\DB\Exception
*/
public function getAssignedLabelsForBoard($boardId) { public function getAssignedLabelsForBoard($boardId) {
$labels = $this->findAssignedLabelsForBoard($boardId); $labels = $this->findAssignedLabelsForBoard($boardId);
$result = []; $result = [];
@@ -80,27 +145,51 @@ class LabelMapper extends DeckMapper implements IPermissionMapper {
return $result; return $result;
} }
/**
* @param numeric $labelId
* @return void
* @throws \OCP\DB\Exception
*/
public function deleteLabelAssignments($labelId) { public function deleteLabelAssignments($labelId) {
$sql = 'DELETE FROM `*PREFIX*deck_assigned_labels` WHERE label_id = ?'; $qb = $this->db->getQueryBuilder();
$stmt = $this->db->prepare($sql); $qb->delete('deck_assigned_labels')
$stmt->bindParam(1, $labelId, \PDO::PARAM_INT, 0); ->where($qb->expr()->eq('label_id', $qb->createNamedParameter($labelId, IQueryBuilder::PARAM_INT)));
$stmt->execute(); $qb->executeStatement();
} }
/**
* @param numeric $cardId
* @return void
* @throws \OCP\DB\Exception
*/
public function deleteLabelAssignmentsForCard($cardId) { public function deleteLabelAssignmentsForCard($cardId) {
$sql = 'DELETE FROM `*PREFIX*deck_assigned_labels` WHERE card_id = ?'; $qb = $this->db->getQueryBuilder();
$stmt = $this->db->prepare($sql); $qb->delete('deck_assigned_labels')
$stmt->bindParam(1, $cardId, \PDO::PARAM_INT, 0); ->where($qb->expr()->eq('card_id', $qb->createNamedParameter($cardId, IQueryBuilder::PARAM_INT)));
$stmt->execute(); $qb->executeStatement();
} }
/**
* @param string $userId
* @param numeric $labelId
* @return bool
* @throws \OCP\DB\Exception
*/
public function isOwner($userId, $labelId): bool { public function isOwner($userId, $labelId): bool {
$sql = 'SELECT owner FROM `*PREFIX*deck_boards` WHERE `id` IN (SELECT board_id FROM `*PREFIX*deck_labels` WHERE id = ?)'; $qb = $this->db->getQueryBuilder();
$stmt = $this->execute($sql, [$labelId]); $qb->select('l.id')
$row = $stmt->fetch(); ->from($this->getTableName(), 'l')
return ($row['owner'] === $userId); ->innerJoin('l', 'deck_boards', 'b', 'l.board_id = b.id')
->where($qb->expr()->eq('l.id', $qb->createNamedParameter($labelId, IQueryBuilder::PARAM_INT)))
->andWhere($qb->expr()->eq('b.owner', $qb->createNamedParameter($userId, IQueryBuilder::PARAM_STR)));
return count($qb->executeQuery()->fetchAll()) > 0;
} }
/**
* @param numeric $id
* @return int|null
*/
public function findBoardId($id): ?int { public function findBoardId($id): ?int {
try { try {
$entity = $this->find($id); $entity = $this->find($id);

View File

@@ -26,6 +26,7 @@ namespace OCA\Deck\Db;
use OCP\AppFramework\Db\DoesNotExistException; use OCP\AppFramework\Db\DoesNotExistException;
use OCP\AppFramework\Db\Entity; use OCP\AppFramework\Db\Entity;
use OCP\AppFramework\Db\MultipleObjectsReturnedException; use OCP\AppFramework\Db\MultipleObjectsReturnedException;
use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\IDBConnection; use OCP\IDBConnection;
class StackMapper extends DeckMapper implements IPermissionMapper { class StackMapper extends DeckMapper implements IPermissionMapper {
@@ -38,62 +39,112 @@ class StackMapper extends DeckMapper implements IPermissionMapper {
/** /**
* @param $id * @param numeric $id
* @throws MultipleObjectsReturnedException * @return Stack
* @throws DoesNotExistException * @throws DoesNotExistException
* @throws MultipleObjectsReturnedException
* @throws \OCP\DB\Exception
*/ */
public function find($id): Stack { public function find($id): Stack {
$sql = 'SELECT * FROM `*PREFIX*deck_stacks` ' . $qb = $this->db->getQueryBuilder();
'WHERE `id` = ?'; $qb->select('*')
return $this->findEntity($sql, [$id]); ->from($this->getTableName())
->where($qb->expr()->eq('id', $qb->createNamedParameter($id, IQueryBuilder::PARAM_INT)));
return $this->findEntity($qb);
} }
/** /**
* @param $cardId * @param $cardId
* @return Stack|null * @return Stack|null
* @throws \OCP\DB\Exception
*/ */
public function findStackFromCardId($cardId): ?Stack { public function findStackFromCardId($cardId): ?Stack {
$sql = <<<SQL $qb = $this->db->getQueryBuilder();
SELECT s.* $qb->select('*')
FROM `*PREFIX*deck_stacks` as `s` ->from($this->getTableName(), 's')
INNER JOIN `*PREFIX*deck_cards` as `c` ON s.id = c.stack_id ->innerJoin('s', 'deck_cards', 'c', 's.id = c.stack_id')
WHERE c.id = ? ->where($qb->expr()->eq('c.id', $qb->createNamedParameter($cardId, IQueryBuilder::PARAM_INT)));
SQL;
try { try {
return $this->findEntity($sql, [$cardId]); return $this->findEntity($qb);
} catch (MultipleObjectsReturnedException|DoesNotExistException $e) { } catch (MultipleObjectsReturnedException|DoesNotExistException $e) {
} }
return null; return null;
} }
/**
* @param numeric $boardId
* @param int|null $limit
* @param int|null $offset
* @return Stack[]
* @throws \OCP\DB\Exception
*/
public function findAll($boardId, $limit = null, $offset = null): array {
$qb = $this->db->getQueryBuilder();
$qb->select('*')
->from($this->getTableName())
->where($qb->expr()->eq('board_id', $qb->createNamedParameter($boardId, IQueryBuilder::PARAM_INT)))
->andWhere($qb->expr()->eq('deleted_at', $qb->createNamedParameter(0, IQueryBuilder::PARAM_INT)))
->setFirstResult($offset)
->setMaxResults($limit);
public function findAll($boardId, $limit = null, $offset = null) { return $this->findEntities($qb);
$sql = 'SELECT * FROM `*PREFIX*deck_stacks` WHERE `board_id` = ? AND deleted_at = 0 ORDER BY `order`, `id`';
return $this->findEntities($sql, [$boardId], $limit, $offset);
} }
/**
* @param numeric $boardId
* @param int|null $limit
* @param int|null $offset
* @return Stack[]
* @throws \OCP\DB\Exception
*/
public function findDeleted($boardId, $limit = null, $offset = null) { public function findDeleted($boardId, $limit = null, $offset = null) {
$sql = 'SELECT * FROM `*PREFIX*deck_stacks` s $qb = $this->db->getQueryBuilder();
WHERE `s`.`board_id` = ? AND NOT s.deleted_at = 0'; $qb->select('*')
return $this->findEntities($sql, [$boardId], $limit, $offset); ->from($this->getTableName())
->where($qb->expr()->eq('board_id', $qb->createNamedParameter($boardId, IQueryBuilder::PARAM_INT)))
->andWhere($qb->expr()->neq('deleted_at', $qb->createNamedParameter(0, IQueryBuilder::PARAM_INT)))
->setFirstResult($offset)
->setMaxResults($limit);
return $this->findEntities($qb);
} }
/**
public function delete(Entity $entity) { * @param Entity $entity
* @return Entity
* @throws \OCP\DB\Exception
*/
public function delete(Entity $entity): Entity {
// delete cards on stack // delete cards on stack
$this->cardMapper->deleteByStack($entity->getId()); $this->cardMapper->deleteByStack($entity->getId());
return parent::delete($entity); return parent::delete($entity);
} }
/**
* @param numeric $userId
* @param numeric $stackId
* @return bool
* @throws \OCP\DB\Exception
*/
public function isOwner($userId, $stackId): bool { public function isOwner($userId, $stackId): bool {
$sql = 'SELECT owner FROM `*PREFIX*deck_boards` WHERE `id` IN (SELECT board_id FROM `*PREFIX*deck_stacks` WHERE id = ?)'; $qb = $this->db->getQueryBuilder();
$stmt = $this->execute($sql, [$stackId]); $qb->select('s.id')
$row = $stmt->fetch(); ->from($this->getTableName(), 's')
return ($row['owner'] === $userId); ->innerJoin('s', 'deck_boards', 'b', 'b.id = s.board_id')
->where($qb->expr()->eq('s.id', $qb->createNamedParameter($stackId, IQueryBuilder::PARAM_INT)))
->andWhere($qb->expr()->eq('owner', $qb->createNamedParameter($userId, IQueryBuilder::PARAM_STR)));
return count($qb->executeQuery()->fetchAll()) > 0;
} }
/**
* @param numeric $id
* @return int|null
* @throws \OCP\DB\Exception
*/
public function findBoardId($id): ?int { public function findBoardId($id): ?int {
try { try {
$entity = $this->find($id); $entity = $this->find($id);

View File

@@ -625,11 +625,9 @@ class BoardService {
} catch (\Exception $e) { } catch (\Exception $e) {
} }
} }
$delete = $this->aclMapper->delete($acl);
$this->eventDispatcher->dispatchTyped(new AclDeletedEvent($acl)); $this->eventDispatcher->dispatchTyped(new AclDeletedEvent($acl));
return (bool) $this->aclMapper->delete($acl);
return $delete;
} }
/** /**

View File

@@ -91,14 +91,12 @@ class LabelService {
$this->permissionService->checkPermission(null, $boardId, Acl::PERMISSION_MANAGE); $this->permissionService->checkPermission(null, $boardId, Acl::PERMISSION_MANAGE);
$boardLabels = $this->labelMapper->findAll($boardId); $boardLabels = $this->labelMapper->findAll($boardId);
if (\is_array($boardLabels)) {
foreach ($boardLabels as $boardLabel) { foreach ($boardLabels as $boardLabel) {
if ($boardLabel->getTitle() === $title) { if ($boardLabel->getTitle() === $title) {
throw new BadRequestException('title must be unique'); throw new BadRequestException('title must be unique');
break; break;
} }
} }
}
if ($this->boardService->isArchived(null, $boardId)) { if ($this->boardService->isArchived(null, $boardId)) {
throw new StatusException('Operation not allowed. This board is archived.'); throw new StatusException('Operation not allowed. This board is archived.');
@@ -163,7 +161,6 @@ class LabelService {
$label = $this->find($id); $label = $this->find($id);
$boardLabels = $this->labelMapper->findAll($label->getBoardId()); $boardLabels = $this->labelMapper->findAll($label->getBoardId());
if (\is_array($boardLabels)) {
foreach ($boardLabels as $boardLabel) { foreach ($boardLabels as $boardLabel) {
if ($boardLabel->getId() === $label->getId()) { if ($boardLabel->getId() === $label->getId()) {
continue; continue;
@@ -173,7 +170,6 @@ class LabelService {
break; break;
} }
} }
}
if ($this->boardService->isArchived($this->labelMapper, $id)) { if ($this->boardService->isArchived($this->labelMapper, $id)) {
throw new StatusException('Operation not allowed. This board is archived.'); throw new StatusException('Operation not allowed. This board is archived.');

View File

@@ -420,7 +420,7 @@ class BoardServiceTest extends TestCase {
$this->aclMapper->expects($this->once()) $this->aclMapper->expects($this->once())
->method('delete') ->method('delete')
->with($acl) ->with($acl)
->willReturn(true); ->willReturn($acl);
$this->assertTrue($this->service->deleteAcl(123)); $this->assertTrue($this->service->deleteAcl(123));
} }
} }

View File

@@ -160,6 +160,7 @@ class CardServiceTest extends TestCase {
$cardExpected->setAssignedUsers(['user1', 'user2']); $cardExpected->setAssignedUsers(['user1', 'user2']);
$cardExpected->setRelatedBoard($boardMock); $cardExpected->setRelatedBoard($boardMock);
$cardExpected->setRelatedStack($stackMock); $cardExpected->setRelatedStack($stackMock);
$cardExpected->setLabels([]);
$this->assertEquals($cardExpected, $this->cardService->find(123)); $this->assertEquals($cardExpected, $this->cardService->find(123));
} }