From 0b3483fb8a34b3ee72182067aaa0f525d457a7a0 Mon Sep 17 00:00:00 2001 From: James Brooks Date: Tue, 1 Mar 2016 15:05:41 +0000 Subject: [PATCH] Implement very basic API searching. Closes #1348 --- .../Controllers/Api/ComponentController.php | 2 + .../Api/ComponentGroupController.php | 2 + .../Controllers/Api/IncidentController.php | 2 + app/Models/Component.php | 17 +++++++- app/Models/ComponentGroup.php | 15 ++++++- app/Models/Incident.php | 15 ++++++- app/Models/Traits/SearchableTrait.php | 43 +++++++++++++++++++ 7 files changed, 93 insertions(+), 3 deletions(-) create mode 100644 app/Models/Traits/SearchableTrait.php diff --git a/app/Http/Controllers/Api/ComponentController.php b/app/Http/Controllers/Api/ComponentController.php index 84ba8fc6..1a0de881 100644 --- a/app/Http/Controllers/Api/ComponentController.php +++ b/app/Http/Controllers/Api/ComponentController.php @@ -37,6 +37,8 @@ class ComponentController extends AbstractApiController $components = Component::enabled(); } + $components->search(Binput::except(['sort', 'order', 'per_page'])); + if ($sortBy = Binput::get('sort')) { $direction = Binput::has('order') && Binput::get('order') == 'desc'; diff --git a/app/Http/Controllers/Api/ComponentGroupController.php b/app/Http/Controllers/Api/ComponentGroupController.php index f0969d5d..9b747d25 100644 --- a/app/Http/Controllers/Api/ComponentGroupController.php +++ b/app/Http/Controllers/Api/ComponentGroupController.php @@ -31,6 +31,8 @@ class ComponentGroupController extends AbstractApiController { $groups = ComponentGroup::whereRaw('1=1'); + $groups->search(Binput::except(['sort', 'order', 'per_page'])); + if ($sortBy = Binput::get('sort')) { $direction = Binput::has('order') && Binput::get('order') == 'desc'; diff --git a/app/Http/Controllers/Api/IncidentController.php b/app/Http/Controllers/Api/IncidentController.php index e0c60c88..3a3066e6 100644 --- a/app/Http/Controllers/Api/IncidentController.php +++ b/app/Http/Controllers/Api/IncidentController.php @@ -34,6 +34,8 @@ class IncidentController extends AbstractApiController $incidents = Incident::where('visible', '>=', $incidentVisibility); + $incidents->search(Binput::except(['sort', 'order', 'per_page'])); + if ($sortBy = Binput::get('sort')) { $direction = Binput::has('order') && Binput::get('order') == 'desc'; diff --git a/app/Models/Component.php b/app/Models/Component.php index 1d9d2d87..a07d052d 100644 --- a/app/Models/Component.php +++ b/app/Models/Component.php @@ -12,6 +12,7 @@ namespace CachetHQ\Cachet\Models; use AltThree\Validator\ValidatingTrait; +use CachetHQ\Cachet\Models\Traits\SearchableTrait; use CachetHQ\Cachet\Models\Traits\SortableTrait; use CachetHQ\Cachet\Presenters\ComponentPresenter; use Illuminate\Database\Eloquent\Builder; @@ -21,7 +22,7 @@ use McCool\LaravelAutoPresenter\HasPresenter; class Component extends Model implements HasPresenter { - use SoftDeletes, SortableTrait, ValidatingTrait; + use SearchableTrait, SoftDeletes, SortableTrait, ValidatingTrait; /** * List of attributes that have default values. @@ -77,6 +78,20 @@ class Component extends Model implements HasPresenter 'link' => 'url', ]; + /** + * The searchable fields. + * + * @var string[] + */ + protected $searchable = [ + 'id', + 'name', + 'status', + 'order', + 'group_id', + 'enabled', + ]; + /** * The sortable fields. * diff --git a/app/Models/ComponentGroup.php b/app/Models/ComponentGroup.php index 72a192eb..d68563e0 100644 --- a/app/Models/ComponentGroup.php +++ b/app/Models/ComponentGroup.php @@ -12,6 +12,7 @@ namespace CachetHQ\Cachet\Models; use AltThree\Validator\ValidatingTrait; +use CachetHQ\Cachet\Models\Traits\SearchableTrait; use CachetHQ\Cachet\Models\Traits\SortableTrait; use CachetHQ\Cachet\Presenters\ComponentGroupPresenter; use Illuminate\Database\Eloquent\Model; @@ -19,7 +20,7 @@ use McCool\LaravelAutoPresenter\HasPresenter; class ComponentGroup extends Model implements HasPresenter { - use SortableTrait, ValidatingTrait; + use SearchableTrait, SortableTrait, ValidatingTrait; /** * The attributes that should be casted to native types. @@ -50,6 +51,18 @@ class ComponentGroup extends Model implements HasPresenter 'collapsed' => 'bool', ]; + /** + * The searchable fields. + * + * @var string[] + */ + protected $searchable = [ + 'id', + 'name', + 'order', + 'collapsed', + ]; + /** * The sortable fields. * diff --git a/app/Models/Incident.php b/app/Models/Incident.php index 694d32f9..0eb04288 100644 --- a/app/Models/Incident.php +++ b/app/Models/Incident.php @@ -12,6 +12,7 @@ namespace CachetHQ\Cachet\Models; use AltThree\Validator\ValidatingTrait; +use CachetHQ\Cachet\Models\Traits\SearchableTrait; use CachetHQ\Cachet\Models\Traits\SortableTrait; use CachetHQ\Cachet\Presenters\IncidentPresenter; use Carbon\Carbon; @@ -21,7 +22,7 @@ use McCool\LaravelAutoPresenter\HasPresenter; class Incident extends Model implements HasPresenter { - use SoftDeletes, SortableTrait, ValidatingTrait; + use SearchableTrait, SoftDeletes, SortableTrait, ValidatingTrait; /** * The attributes that should be casted to native types. @@ -63,6 +64,18 @@ class Incident extends Model implements HasPresenter 'message' => 'required', ]; + /** + * The searchable fields. + * + * @var string[] + */ + protected $searchable = [ + 'id', + 'name', + 'status', + 'visible', + ]; + /** * The sortable fields. * diff --git a/app/Models/Traits/SearchableTrait.php b/app/Models/Traits/SearchableTrait.php new file mode 100644 index 00000000..13cc4f3d --- /dev/null +++ b/app/Models/Traits/SearchableTrait.php @@ -0,0 +1,43 @@ + + */ +trait SearchableTrait +{ + /** + * Adds a sort scope. + * + * @param \Illuminate\Database\Eloquent\Builder $query + * @param array $column + * + * @return \Illuminate\Database\Eloquent\Builder + */ + public function scopeSearch(Builder $query, array $search = []) + { + if (empty($search)) { + return $query; + } + + if (!array_intersect(array_keys($search), $this->searchable)) { + return $query; + } + + return $query->where($search); + } +}