Skip to content

Commit

Permalink
Merge pull request #828 from nextcloud/bugfix/noid/view-limit-columns
Browse files Browse the repository at this point in the history
fix: Pass all table columns along as we need them for filtering the rows
  • Loading branch information
juliusknorr authored Feb 9, 2024
2 parents 1c05ca4 + 45dbc4a commit 6c93262
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 9 deletions.
23 changes: 17 additions & 6 deletions lib/Db/Row2Mapper.php
Original file line number Diff line number Diff line change
Expand Up @@ -26,19 +26,23 @@ class Row2Mapper {
private IDBConnection $db;
private LoggerInterface $logger;
protected UserHelper $userHelper;
protected ColumnMapper $columnMapper;

/* @var Column[] $columns */
private array $columns = [];
/* @var Column[] $columns */
private array $allColumns = [];

private ColumnsHelper $columnsHelper;

public function __construct(?string $userId, IDBConnection $db, LoggerInterface $logger, UserHelper $userHelper, RowSleeveMapper $rowSleeveMapper, ColumnsHelper $columnsHelper) {
public function __construct(?string $userId, IDBConnection $db, LoggerInterface $logger, UserHelper $userHelper, RowSleeveMapper $rowSleeveMapper, ColumnsHelper $columnsHelper, ColumnMapper $columnMapper) {
$this->rowSleeveMapper = $rowSleeveMapper;
$this->userId = $userId;
$this->db = $db;
$this->logger = $logger;
$this->userHelper = $userHelper;
$this->columnsHelper = $columnsHelper;
$this->columnMapper = $columnMapper;
}

/**
Expand Down Expand Up @@ -166,8 +170,8 @@ private function getWantedRowIds(string $userId, int $tableId, ?array $filter =
* @return Row2[]
* @throws InternalError
*/
public function findAll(array $columns, int $tableId, int $limit = null, int $offset = null, array $filter = null, array $sort = null, string $userId = null): array {
$this->setColumns($columns);
public function findAll(array $tableColumns, array $columns, int $tableId, int $limit = null, int $offset = null, array $filter = null, array $sort = null, string $userId = null): array {
$this->setColumns($columns, $tableColumns);
$columnIdsArray = array_map(fn (Column $column) => $column->getId(), $columns);

$wantedRowIdsArray = $this->getWantedRowIds($userId, $tableId, $filter, $limit, $offset);
Expand Down Expand Up @@ -267,12 +271,13 @@ private function getFilter(IQueryBuilder &$qb, array $filterGroup): array {
$filterExpressions = [];
foreach ($filterGroup as $filter) {
$columnId = $filter['columnId'];
$column = $this->columns[$columnId] ?? $this->allColumns[$columnId];

// if is normal column
if ($columnId >= 0) {
$sql = $qb->expr()->in(
'id',
$qb->createFunction($this->getFilterExpression($qb, $this->columns[$filter['columnId']], $filter['operator'], $filter['value'])->getSQL())
$qb->createFunction($this->getFilterExpression($qb, $column, $filter['operator'], $filter['value'])->getSQL())
);

// if is meta data column
Expand All @@ -284,7 +289,7 @@ private function getFilter(IQueryBuilder &$qb, array $filterGroup): array {

// if column id is unknown
} else {
$e = new Exception("Needed column (" . $filter['columnId'] . ") not found.");
$e = new Exception("Needed column (" . $columnId . ") not found.");
$this->logger->error($e->getMessage(), ['exception' => $e]);
throw new InternalError(get_class($this) . ' - ' . __FUNCTION__ . ': '.$e->getMessage());
}
Expand Down Expand Up @@ -670,10 +675,16 @@ private function insertOrUpdateCell(int $rowId, int $columnId, $value): void {
/**
* @param Column[] $columns
*/
private function setColumns(array $columns): void {
private function setColumns(array $columns, array $tableColumns = []): void {
foreach ($columns as $column) {
$this->columns[$column->getId()] = $column;
}

// We hold a list of all table columns to be used in filter expression building for those not visible in the view
foreach ($tableColumns as $column) {
$this->allColumns[$column->getId()] = $column;
}

}

/**
Expand Down
9 changes: 6 additions & 3 deletions lib/Service/RowService.php
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,8 @@ public function formatRows(array $rows): array {
public function findAllByTable(int $tableId, string $userId, ?int $limit = null, ?int $offset = null): array {
try {
if ($this->permissionsService->canReadRowsByElementId($tableId, 'table', $userId)) {
return $this->row2Mapper->findAll($this->columnMapper->findAllByTable($tableId), $tableId, $limit, $offset, null, null, $userId);
$tableColumns = $this->columnMapper->findAllByTable($tableId);
return $this->row2Mapper->findAll($tableColumns, $tableColumns, $tableId, $limit, $offset, null, null, $userId);
} else {
throw new PermissionError('no read access to table id = '.$tableId);
}
Expand All @@ -91,8 +92,10 @@ public function findAllByView(int $viewId, string $userId, ?int $limit = null, ?
if ($this->permissionsService->canReadRowsByElementId($viewId, 'view', $userId)) {
$view = $this->viewMapper->find($viewId);
$columnsArray = $view->getColumnsArray();
$columns = $this->columnMapper->findAll($columnsArray);
return $this->row2Mapper->findAll($columns, $view->getTableId(), $limit, $offset, $view->getFilterArray(), $view->getSortArray(), $userId);
$filterColumns = $this->columnMapper->findAll($columnsArray);
$tableColumns = $this->columnMapper->findAllByTable($view->getTableId());

return $this->row2Mapper->findAll($tableColumns, $filterColumns, $view->getTableId(), $limit, $offset, $view->getFilterArray(), $view->getSortArray(), $userId);
} else {
throw new PermissionError('no read access to view id = '.$viewId);
}
Expand Down

0 comments on commit 6c93262

Please sign in to comment.