Fixes API sorting and filtering. Closes #1489

This commit is contained in:
Joseph Cohen
2016-02-23 13:34:22 -06:00
committed by James Brooks
parent 98550c31c9
commit 919c7127e7
10 changed files with 136 additions and 14 deletions

View File

@@ -161,12 +161,6 @@ abstract class AbstractApiController extends Controller
$items = $paginator->getCollection();
if ($sortBy = $request->get('sort')) {
$direction = $request->has('order') && $request->get('order') == 'desc';
$items = $items->sortBy($sortBy, SORT_REGULAR, $direction);
}
return $this->setMetaData($pagination)->setData(AutoPresenter::decorate($items->values()))->respond();
}

View File

@@ -37,7 +37,15 @@ class ComponentController extends AbstractApiController
$components = Component::enabled();
}
return $this->paginator($components->paginate(Binput::get('per_page', 20)), Request::instance());
if ($sortBy = Binput::get('sort')) {
$direction = Binput::has('order') && Binput::get('order') == 'desc';
$components->sort($sortBy, $direction);
}
$components = $components->paginate(Binput::get('per_page', 20));
return $this->paginator($components, Request::instance());
}
/**

View File

@@ -29,7 +29,15 @@ class ComponentGroupController extends AbstractApiController
*/
public function getGroups()
{
$groups = ComponentGroup::paginate(Binput::get('per_page', 20));
$groups = ComponentGroup::whereRaw('1=1');
if ($sortBy = Binput::get('sort')) {
$direction = Binput::has('order') && Binput::get('order') == 'desc';
$groups->sort($sortBy, $direction);
}
$groups = $groups->paginate(Binput::get('per_page', 20));
return $this->paginator($groups, Request::instance());
}

View File

@@ -32,7 +32,15 @@ class IncidentController extends AbstractApiController
{
$incidentVisibility = app(Guard::class)->check() ? 0 : 1;
$incidents = Incident::where('visible', '>=', $incidentVisibility)->paginate(Binput::get('per_page', 20));
$incidents = Incident::where('visible', '>=', $incidentVisibility);
if ($sortBy = Binput::get('sort')) {
$direction = Binput::has('order') && Binput::get('order') == 'desc';
$incidents->sort($sortBy, $direction);
}
$incidents = $incidents->paginate(Binput::get('per_page', 20));
return $this->paginator($incidents, Request::instance());
}

View File

@@ -29,7 +29,15 @@ class MetricController extends AbstractApiController
*/
public function getMetrics()
{
$metrics = Metric::paginate(Binput::get('per_page', 20));
$metrics = Metric::whereRaw('1=1');
if ($sortBy = Binput::get('sort')) {
$direction = Binput::has('order') && Binput::get('order') == 'desc';
$metrics->sort($sortBy, $direction);
}
$metrics = $metrics->paginate(Binput::get('per_page', 20));
return $this->paginator($metrics, Request::instance());
}

View File

@@ -12,6 +12,7 @@
namespace CachetHQ\Cachet\Models;
use AltThree\Validator\ValidatingTrait;
use CachetHQ\Cachet\Models\Traits\SortableTrait;
use CachetHQ\Cachet\Presenters\ComponentPresenter;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
@@ -20,7 +21,7 @@ use McCool\LaravelAutoPresenter\HasPresenter;
class Component extends Model implements HasPresenter
{
use SoftDeletes, ValidatingTrait;
use SoftDeletes, SortableTrait, ValidatingTrait;
/**
* List of attributes that have default values.
@@ -76,6 +77,20 @@ class Component extends Model implements HasPresenter
'link' => 'url',
];
/**
* The sortable fields.
*
* @var string[]
*/
protected $sortable = [
'id',
'name',
'status',
'order',
'group_id',
'enabled',
];
/**
* Components can belong to a group.
*

View File

@@ -12,13 +12,14 @@
namespace CachetHQ\Cachet\Models;
use AltThree\Validator\ValidatingTrait;
use CachetHQ\Cachet\Models\Traits\SortableTrait;
use CachetHQ\Cachet\Presenters\ComponentGroupPresenter;
use Illuminate\Database\Eloquent\Model;
use McCool\LaravelAutoPresenter\HasPresenter;
class ComponentGroup extends Model implements HasPresenter
{
use ValidatingTrait;
use SortableTrait, ValidatingTrait;
/**
* The attributes that should be casted to native types.
@@ -49,6 +50,18 @@ class ComponentGroup extends Model implements HasPresenter
'collapsed' => 'bool',
];
/**
* The sortable fields.
*
* @var string[]
*/
protected $sortable = [
'id',
'name',
'order',
'collapsed',
];
/**
* The relations to eager load on every query.
*

View File

@@ -12,6 +12,7 @@
namespace CachetHQ\Cachet\Models;
use AltThree\Validator\ValidatingTrait;
use CachetHQ\Cachet\Models\Traits\SortableTrait;
use CachetHQ\Cachet\Presenters\IncidentPresenter;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Model;
@@ -20,7 +21,7 @@ use McCool\LaravelAutoPresenter\HasPresenter;
class Incident extends Model implements HasPresenter
{
use SoftDeletes, ValidatingTrait;
use SoftDeletes, SortableTrait, ValidatingTrait;
/**
* The attributes that should be casted to native types.
@@ -62,6 +63,19 @@ class Incident extends Model implements HasPresenter
'message' => 'required',
];
/**
* The sortable fields.
*
* @var string[]
*/
protected $sortable = [
'id',
'name',
'status',
'visible',
'message',
];
/**
* Finds all visible incidents.
*

View File

@@ -12,13 +12,14 @@
namespace CachetHQ\Cachet\Models;
use AltThree\Validator\ValidatingTrait;
use CachetHQ\Cachet\Models\Traits\SortableTrait;
use CachetHQ\Cachet\Presenters\MetricPresenter;
use Illuminate\Database\Eloquent\Model;
use McCool\LaravelAutoPresenter\HasPresenter;
class Metric extends Model implements HasPresenter
{
use ValidatingTrait;
use SortableTrait, ValidatingTrait;
/**
* The calculation type of sum.
@@ -92,6 +93,19 @@ class Metric extends Model implements HasPresenter
'default_view' => 'numeric|between:0,3',
];
/**
* The sortable fields.
*
* @var string[]
*/
protected $sortable = [
'id',
'name',
'display_chart',
'default_value',
'calc_type',
];
/**
* Metrics contain many metric points.
*

View File

@@ -0,0 +1,40 @@
<?php
/*
* This file is part of Cachet.
*
* (c) Alt Three Services Limited
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace CachetHQ\Cachet\Models\Traits;
use Illuminate\Database\Eloquent\Builder;
/**
* This is the sortable trait.
*
* @author James Brooks <james@alt-three.com>
*/
trait SortableTrait
{
/**
* Adds a sort scope.
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param string $column
* @param string $direction
*
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeSort(Builder $query, $column, $direction)
{
if (!in_array($column, $this->sortable)) {
return $query;
}
return $query->orderBy($column, $direction);
}
}