diff --git a/app/Filters/DesignFilters.php b/app/Filters/DesignFilters.php index 0007a29d08f2..e1abed8c9a1b 100644 --- a/app/Filters/DesignFilters.php +++ b/app/Filters/DesignFilters.php @@ -54,6 +54,19 @@ class DesignFilters extends QueryFilters return $this->builder->orderBy($sort_col[0], $sort_col[1]); } + public function entities(string $entities = ''): Builder + { + + if (strlen($entities) == 0 || str_contains($entities, ',')) { + return $this->builder; + } + + return $this->builder + ->where('is_template', true) + ->whereRaw('FIND_IN_SET( ? ,entities)', [trim($entities)]); + + } + /** * Filters the query by the users company ID. * diff --git a/tests/Feature/DesignApiTest.php b/tests/Feature/DesignApiTest.php index 372bd1302291..c28b0f600ca2 100644 --- a/tests/Feature/DesignApiTest.php +++ b/tests/Feature/DesignApiTest.php @@ -52,6 +52,85 @@ class DesignApiTest extends TestCase Model::reguard(); } + public function testFindInSetQueries() + { + + $design = DesignFactory::create($this->company->id, $this->user->id); + $design->is_template = true; + $design->name = 'Test Template'; + $design->entities = 'searchable,payment,quote'; + $design->save(); + + $searchable = 'searchable'; + + $q = Design::query() + ->where('is_template', true) + ->whereRaw('FIND_IN_SET( ? ,entities)', [$searchable]); + + $this->assertEquals(1, $q->count()); + + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + ])->get('/api/v1/designs?entities=payment'); + + $response->assertStatus(200); + + $arr = $response->json(); + $this->assertCount(1, $arr['data']); + + + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + ])->get('/api/v1/designs?entities=,,,3,3,3,'); + + $response->assertStatus(200); + + $arr = $response->json(); + + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + ])->get('/api/v1/designs?entities=unsearchable'); + + $response->assertStatus(200); + + $arr = $response->json(); + $this->assertCount(0, $arr['data']); + + $design = DesignFactory::create($this->company->id, $this->user->id); + $design->is_template = true; + $design->name = 'Test Template'; + $design->entities = 'searchable,payment,quote'; + $design->save(); + + $searchable = 'unsearchable'; + + $q = Design::query() + ->where('is_template', true) + ->whereRaw('FIND_IN_SET( ? ,entities)', [$searchable]); + + $this->assertEquals(0, $q->count()); + + $design = DesignFactory::create($this->company->id, $this->user->id); + $design->is_template = true; + $design->name = 'Test Template'; + $design->entities = 'searchable,payment,quote'; + $design->save(); + + $searchable = 'searchable,payment'; + + $q = Design::query() + ->where('is_template', true) + ->whereRaw('FIND_IN_SET( ? ,entities)', [$searchable]); + + $this->assertEquals(0, $q->count()); + + + + } + public function testDesignTemplates() { $design = DesignFactory::create($this->company->id, $this->user->id);