Add visibility to filters

This commit is contained in:
Toby Zerner 2021-01-15 08:36:55 +10:30
parent f9bba44336
commit 5d69048ef8
5 changed files with 60 additions and 28 deletions

View File

@ -21,6 +21,8 @@ GET /users?filter[postCount]=>=10
GET /users?filter[postCount]=5..15 GET /users?filter[postCount]=5..15
``` ```
## Custom Filters
To define filters with custom logic, or ones that do not correspond to an attribute, use the `filter` method: To define filters with custom logic, or ones that do not correspond to an attribute, use the `filter` method:
```php ```php
@ -28,3 +30,12 @@ $type->filter('minPosts', function ($query, $value, Context $context) {
$query->where('postCount', '>=', $value); $query->where('postCount', '>=', $value);
}); });
``` ```
Just like [fields](visibility.md), filters can be made conditionally `visible` or `hidden`:
```php
$type->filter('email', $callback)
->visible(function (Context $context) {
return $context->getRequest()->getAttribute('isAdmin');
});
```

View File

@ -244,7 +244,7 @@ class Index
continue; continue;
} }
if (isset($filters[$name])) { if (isset($filters[$name]) && evaluate($filters[$name]->getVisible(), [$this->context])) {
$filters[$name]->getCallback()($query, $value, $context); $filters[$name]->getCallback()($query, $value, $context);
continue; continue;
} }

View File

@ -0,0 +1,44 @@
<?php
/*
* This file is part of tobyz/json-api-server.
*
* (c) Toby Zerner <toby.zerner@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Tobyz\JsonApiServer\Schema\Concerns;
use function Tobyz\JsonApiServer\negate;
trait HasVisibility
{
private $visible = true;
/**
* Allow this field to be seen.
*/
public function visible(callable $condition = null)
{
$this->visible = $condition ?: true;
return $this;
}
/**
* Disallow this field to be seen.
*/
public function hidden(callable $condition = null)
{
$this->visible = $condition ? negate($condition) : false;
return $this;
}
public function getVisible()
{
return $this->visible;
}
}

View File

@ -13,6 +13,7 @@ namespace Tobyz\JsonApiServer\Schema;
use Tobyz\JsonApiServer\Schema\Concerns\HasDescription; use Tobyz\JsonApiServer\Schema\Concerns\HasDescription;
use Tobyz\JsonApiServer\Schema\Concerns\HasListeners; use Tobyz\JsonApiServer\Schema\Concerns\HasListeners;
use Tobyz\JsonApiServer\Schema\Concerns\HasVisibility;
use function Tobyz\JsonApiServer\negate; use function Tobyz\JsonApiServer\negate;
use function Tobyz\JsonApiServer\wrap; use function Tobyz\JsonApiServer\wrap;
@ -20,11 +21,10 @@ abstract class Field
{ {
use HasListeners; use HasListeners;
use HasDescription; use HasDescription;
use HasVisibility;
private $name; private $name;
private $property; private $property;
private $visible = true;
private $single = false;
private $writable = false; private $writable = false;
private $writableOnce = false; private $writableOnce = false;
private $getCallback; private $getCallback;
@ -54,26 +54,6 @@ abstract class Field
return $this; return $this;
} }
/**
* Allow this field to be seen.
*/
public function visible(callable $condition = null)
{
$this->visible = $condition ?: true;
return $this;
}
/**
* Disallow this field to be seen.
*/
public function hidden(callable $condition = null)
{
$this->visible = $condition ? negate($condition) : false;
return $this;
}
/** /**
* Allow this field to be written. * Allow this field to be written.
*/ */
@ -214,11 +194,6 @@ abstract class Field
return $this->property; return $this->property;
} }
public function getVisible()
{
return $this->visible;
}
public function getWritable() public function getWritable()
{ {
return $this->writable; return $this->writable;

View File

@ -12,10 +12,12 @@
namespace Tobyz\JsonApiServer\Schema; namespace Tobyz\JsonApiServer\Schema;
use Tobyz\JsonApiServer\Schema\Concerns\HasDescription; use Tobyz\JsonApiServer\Schema\Concerns\HasDescription;
use Tobyz\JsonApiServer\Schema\Concerns\HasVisibility;
final class Filter final class Filter
{ {
use HasDescription; use HasDescription;
use HasVisibility;
private $name; private $name;
private $callback; private $callback;