implement filterable query models

This commit is contained in:
David Bomba 2019-03-28 21:07:45 +11:00
parent 7d86c8306a
commit fd8c19d911
6 changed files with 55 additions and 10 deletions

View File

@ -4,7 +4,7 @@ namespace App\Filters;
use App\Models\Client;
use App\Models\User;
use Illuminate\Database\Query\Builder;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Gate;
@ -167,4 +167,12 @@ class ClientFilters extends QueryFilters
return $query;
}
public function company()
{
$entity = strtolower(class_basename(Client::class));
$this->builder->where($entity .'.company_id', '=', auth()->user()->company()->id);
}
}

View File

@ -46,11 +46,9 @@ abstract class QueryFilters
*
* @param Request $request
*/
public function __construct(Request $request, Builder $builder)
public function __construct(Request $request)
{
$this->request = $request;
$this->builder = $builder;
}
/**
@ -59,9 +57,9 @@ abstract class QueryFilters
* @param Builder $builder
* @return Builder
*/
public function apply(int $company_id, User $user)
public function apply(Builder $builder)
{
$this->builder = $this->baseQuery($company_id, $user);
$this->builder = $builder;
foreach ($this->filters() as $name => $value) {
if (! method_exists($this, $name)) {

View File

@ -4,6 +4,7 @@ namespace App\Http\Controllers;
use App\DataMapper\ClientSettings;
use App\Factory\ClientFactory;
use App\Filters\ClientFilters;
use App\Http\Requests\Client\CreateClientRequest;
use App\Http\Requests\Client\EditClientRequest;
use App\Http\Requests\Client\ShowClientRequest;
@ -50,9 +51,11 @@ class ClientController extends Controller
/**
* @return \Illuminate\Contracts\View\Factory|\Illuminate\Http\JsonResponse|\Illuminate\View\View
*/
public function index()
public function index(ClientFilters $filters)
{
return response()->json(Client::scope());
$clients = Client::filter($filters)->get();
return response()->json($clients);
}
/**

View File

@ -5,6 +5,7 @@ namespace App\Models;
use App\DataMapper\ClientSettings;
use App\Models\Company;
use App\Models\Country;
use App\Models\Filterable;
use App\Utils\Traits\MakesHash;
use Hashids\Hashids;
use Illuminate\Database\Eloquent\SoftDeletes;
@ -15,7 +16,8 @@ class Client extends BaseModel
use PresentableTrait;
use MakesHash;
use SoftDeletes;
use Filterable;
protected $presenter = 'App\Models\Presenters\ClientPresenter';
protected $appends = [

20
app/Models/Filterable.php Normal file
View File

@ -0,0 +1,20 @@
<?php
namespace App\Models;
use App\Filters\QueryFilters;
use Illuminate\Database\Eloquent\Builder;
trait Filterable
{
/**
* Filter a result set.
*
* @param Builder $query
* @param QueryFilters $filters
* @return Builder
*/
public function scopeFilter($query, QueryFilters $filters)
{
return $filters->apply($query);
}
}

View File

@ -63,11 +63,21 @@ class User extends Authenticatable implements MustVerifyEmail
'slack_webhook_url',
];
/**
* Returns a account.
*
* @return Collection
*/
public function account()
{
return $this->belongsTo(Account::class);
}
/**
* Returns all company tokens.
*
* @return Collection
*/
public function tokens()
{
return $this->hasMany(CompanyToken::class)->orderBy('id');
@ -83,7 +93,11 @@ class User extends Authenticatable implements MustVerifyEmail
return $this->belongsToMany(Company::class)->withPivot('permissions', 'settings', 'is_admin', 'is_owner', 'is_locked');
}
/**
* Returns the current company
*
* @return Collection
*/
public function company()
{
return $this->tokens()->whereRaw("BINARY `token`= ?", [request()->header('X-API-TOKEN')])->first()->company;