diff --git a/modules/monitoring/library/Monitoring/DataView/DataView.php b/modules/monitoring/library/Monitoring/DataView/DataView.php index b945bb279..01bb00b74 100644 --- a/modules/monitoring/library/Monitoring/DataView/DataView.php +++ b/modules/monitoring/library/Monitoring/DataView/DataView.php @@ -11,6 +11,7 @@ use Icinga\Data\FilterColumns; use Icinga\Data\PivotTable; use Icinga\Data\QueryInterface; use Icinga\Data\SortRules; +use Icinga\Exception\Http\HttpBadRequestException; use Icinga\Exception\QueryException; use Icinga\Module\Monitoring\Backend\Ido\Query\IdoQuery; use Icinga\Module\Monitoring\Backend\MonitoringBackend; @@ -40,6 +41,13 @@ abstract class DataView implements QueryInterface, SortRules, FilterColumns, Ite */ protected $filterColumns; + /** + * Whether the data view requires a filter + * + * @var bool + */ + protected $requiresFilter = false; + /** * Create a new view * @@ -188,6 +196,29 @@ abstract class DataView implements QueryInterface, SortRules, FilterColumns, Ite return in_array($column, $this->getFilterColumns()); } + /** + * Get whether the data view requires a filter + * + * @return bool + */ + public function getRequiresFilter() + { + return $this->requiresFilter; + } + + /** + * Set whether the data view requires a filter + * + * @param bool $requiresFilter + * + * @return $this + */ + public function setRequiresFilter($requiresFilter = true) + { + $this->requiresFilter = (bool) $requiresFilter; + return $this; + } + /** * Return all filter columns with their optional label as key * @@ -638,7 +669,12 @@ abstract class DataView implements QueryInterface, SortRules, FilterColumns, Ite public function handleRequest(Request $request) { $params = $request->getUrl()->getParams(); - $this->applyFilter(Filter::fromQuerystring((string) $params)); + $filter = Filter::fromQuerystring((string) $params); + /** @var Filter $filter */ + if ($this->getRequiresFilter() && $filter->isEmpty()) { + throw new HttpBadRequestException('Filter must not be empty'); + } + $this->applyFilter($filter); return $this; } }