From 8109ef3c50f89bb61fa2b407b166a14c5e7a9c68 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Mon, 3 Jan 2022 12:35:31 +1100 Subject: [PATCH] Company gateway Filters --- app/Filters/CompanyGatewayFilters.php | 115 ++++++++++++++++++ app/Filters/TaskStatusFilters.php | 115 ++++++++++++++++++ .../Controllers/CompanyGatewayController.php | 5 +- app/Models/CompanyGateway.php | 4 +- tests/Feature/CompanyGatewayApiTest.php | 15 +++ 5 files changed, 251 insertions(+), 3 deletions(-) create mode 100644 app/Filters/CompanyGatewayFilters.php create mode 100644 app/Filters/TaskStatusFilters.php diff --git a/app/Filters/CompanyGatewayFilters.php b/app/Filters/CompanyGatewayFilters.php new file mode 100644 index 000000000000..e2c66f43b5ab --- /dev/null +++ b/app/Filters/CompanyGatewayFilters.php @@ -0,0 +1,115 @@ +builder; + } + + return $this->builder->where(function ($query) use ($filter) { + $query->where('company_gateways.label', 'like', '%'.$filter.'%'); + }); + + } + + /** + * Filters the list based on the status + * archived, active, deleted. + * + * @param string filter + * @return Builder + */ + public function status(string $filter = '') : Builder + { + if (strlen($filter) == 0) { + return $this->builder; + } + + $table = 'company_gateways'; + $filters = explode(',', $filter); + + return $this->builder->where(function ($query) use ($filters, $table) { + $query->whereNull($table.'.id'); + + if (in_array(parent::STATUS_ACTIVE, $filters)) { + $query->orWhereNull($table.'.deleted_at'); + } + + if (in_array(parent::STATUS_ARCHIVED, $filters)) { + $query->orWhere(function ($query) use ($table) { + $query->whereNotNull($table.'.deleted_at'); + + if (! in_array($table, ['users'])) { + $query->where($table.'.is_deleted', '=', 0); + } + }); + } + + if (in_array(parent::STATUS_DELETED, $filters)) { + $query->orWhere($table.'.is_deleted', '=', 1); + } + }); + } + + /** + * Sorts the list based on $sort. + * + * @param string sort formatted as column|asc + * @return Builder + */ + public function sort(string $sort) : Builder + { + $sort_col = explode('|', $sort); + + return $this->builder->orderBy($sort_col[0], $sort_col[1]); + } + + /** + * Returns the base query. + * + * @param int company_id + * @param User $user + * @return Builder + * @deprecated + */ + public function baseQuery(int $company_id, User $user) : Builder + { + return $this->builder; + } + + /** + * Filters the query by the users company ID. + * + * @return Illuminate\Database\Query\Builder + */ + public function entityFilter() + { + return $this->builder->company(); + } +} diff --git a/app/Filters/TaskStatusFilters.php b/app/Filters/TaskStatusFilters.php new file mode 100644 index 000000000000..982edc52eaa1 --- /dev/null +++ b/app/Filters/TaskStatusFilters.php @@ -0,0 +1,115 @@ +builder; + } + + return $this->builder->where(function ($query) use ($filter) { + $query->where('task_statuses.name', 'like', '%'.$filter.'%'); + }); + + } + + /** + * Filters the list based on the status + * archived, active, deleted. + * + * @param string filter + * @return Builder + */ + public function status(string $filter = '') : Builder + { + if (strlen($filter) == 0) { + return $this->builder; + } + + $table = 'task_statuses'; + $filters = explode(',', $filter); + + return $this->builder->where(function ($query) use ($filters, $table) { + $query->whereNull($table.'.id'); + + if (in_array(parent::STATUS_ACTIVE, $filters)) { + $query->orWhereNull($table.'.deleted_at'); + } + + if (in_array(parent::STATUS_ARCHIVED, $filters)) { + $query->orWhere(function ($query) use ($table) { + $query->whereNotNull($table.'.deleted_at'); + + if (! in_array($table, ['users'])) { + $query->where($table.'.is_deleted', '=', 0); + } + }); + } + + if (in_array(parent::STATUS_DELETED, $filters)) { + $query->orWhere($table.'.is_deleted', '=', 1); + } + }); + } + + /** + * Sorts the list based on $sort. + * + * @param string sort formatted as column|asc + * @return Builder + */ + public function sort(string $sort) : Builder + { + $sort_col = explode('|', $sort); + + return $this->builder->orderBy($sort_col[0], $sort_col[1]); + } + + /** + * Returns the base query. + * + * @param int company_id + * @param User $user + * @return Builder + * @deprecated + */ + public function baseQuery(int $company_id, User $user) : Builder + { + return $this->builder; + } + + /** + * Filters the query by the users company ID. + * + * @return Illuminate\Database\Query\Builder + */ + public function entityFilter() + { + return $this->builder->company(); + } +} diff --git a/app/Http/Controllers/CompanyGatewayController.php b/app/Http/Controllers/CompanyGatewayController.php index ef5edc80cae2..f810c6e44ca0 100644 --- a/app/Http/Controllers/CompanyGatewayController.php +++ b/app/Http/Controllers/CompanyGatewayController.php @@ -13,6 +13,7 @@ namespace App\Http\Controllers; use App\DataMapper\FeesAndLimits; use App\Factory\CompanyGatewayFactory; +use App\Filters\CompanyGatewayFilters; use App\Http\Requests\CompanyGateway\CreateCompanyGatewayRequest; use App\Http\Requests\CompanyGateway\DestroyCompanyGatewayRequest; use App\Http\Requests\CompanyGateway\EditCompanyGatewayRequest; @@ -95,9 +96,9 @@ class CompanyGatewayController extends BaseController * ), * ) */ - public function index() + public function index(CompanyGatewayFilters $filters) { - $company_gateways = CompanyGateway::whereCompanyId(auth()->user()->company()->id); + $company_gateways = CompanyGateway::filter($filters); return $this->listResponse($company_gateways); } diff --git a/app/Models/CompanyGateway.php b/app/Models/CompanyGateway.php index 53a83e25275d..a31823a5541b 100644 --- a/app/Models/CompanyGateway.php +++ b/app/Models/CompanyGateway.php @@ -11,6 +11,7 @@ namespace App\Models; +use App\Models\Filterable; use App\Models\GatewayType; use App\Utils\Number; use Illuminate\Database\Eloquent\SoftDeletes; @@ -20,7 +21,8 @@ use stdClass; class CompanyGateway extends BaseModel { use SoftDeletes; - + use Filterable; + public const GATEWAY_CREDIT = 10000000; protected $casts = [ diff --git a/tests/Feature/CompanyGatewayApiTest.php b/tests/Feature/CompanyGatewayApiTest.php index 4896a3837c9d..373196c8e92b 100644 --- a/tests/Feature/CompanyGatewayApiTest.php +++ b/tests/Feature/CompanyGatewayApiTest.php @@ -167,6 +167,21 @@ class CompanyGatewayApiTest extends TestCase $cg = $response->json(); $response->assertStatus(200); + + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + ])->get('/api/v1/company_gateways'); + + $response->assertStatus(200); + + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + ])->get('/api/v1/company_gateways?filter=x'); + + $response->assertStatus(200); + } public function testCompanyGatewayFeesAndLimitsFails()