Select Validator
This commit is contained in:
parent
319698dab4
commit
60c54e2d10
8 changed files with 138 additions and 4 deletions
|
@ -1,5 +1,7 @@
|
|||
<?php
|
||||
|
||||
use Appwrite\Utopia\Database\Validator\Query\Filter;
|
||||
use Appwrite\Utopia\Database\Validator\Query\Select;
|
||||
use Utopia\App;
|
||||
use Appwrite\Event\Delete;
|
||||
use Appwrite\Extend\Exception;
|
||||
|
@ -2900,10 +2902,13 @@ App::get('/v1/databases/:databaseId/collections/:collectionId/documents/:documen
|
|||
->param('databaseId', '', new UID(), 'Database ID.')
|
||||
->param('collectionId', '', new UID(), 'Collection ID. You can create a new collection using the Database service [server integration](https://appwrite.io/docs/server/databases#databasesCreateCollection).')
|
||||
->param('documentId', '', new UID(), 'Document ID.')
|
||||
->param('queries', [], new Queries(new Select()), 'Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https://appwrite.io/docs/databases#querying-documents). Only supported methods are limit and offset', true)
|
||||
->inject('response')
|
||||
->inject('dbForProject')
|
||||
->inject('mode')
|
||||
->action(function (string $databaseId, string $collectionId, string $documentId, Response $response, Database $dbForProject, string $mode) {
|
||||
->action(function (string $databaseId, string $collectionId, string $documentId, array $queries, Response $response, Database $dbForProject, string $mode) {
|
||||
|
||||
var_dump($queries);
|
||||
|
||||
$database = Authorization::skip(fn () => $dbForProject->getDocument('databases', $databaseId));
|
||||
|
||||
|
@ -2927,9 +2932,9 @@ App::get('/v1/databases/:databaseId/collections/:collectionId/documents/:documen
|
|||
}
|
||||
|
||||
if ($documentSecurity && !$valid) {
|
||||
$document = $dbForProject->getDocument('database_' . $database->getInternalId() . '_collection_' . $collection->getInternalId(), $documentId);
|
||||
$document = $dbForProject->getDocument('database_' . $database->getInternalId() . '_collection_' . $collection->getInternalId(), $documentId, $queries);
|
||||
} else {
|
||||
$document = Authorization::skip(fn () => $dbForProject->getDocument('database_' . $database->getInternalId() . '_collection_' . $collection->getInternalId(), $documentId));
|
||||
$document = Authorization::skip(fn () => $dbForProject->getDocument('database_' . $database->getInternalId() . '_collection_' . $collection->getInternalId(), $documentId, $queries));
|
||||
}
|
||||
|
||||
if ($document->isEmpty()) {
|
||||
|
|
|
@ -57,7 +57,7 @@ class Queries extends Validator
|
|||
if (!$query instanceof Query) {
|
||||
try {
|
||||
$query = Query::parse($query);
|
||||
if (\str_contains($query->getAttribute(), '.')) {
|
||||
if (\str_contains($query->getAttribute(), '.')) { // todo: double check!
|
||||
return true;
|
||||
}
|
||||
} catch (\Throwable $th) {
|
||||
|
@ -69,6 +69,9 @@ class Queries extends Validator
|
|||
$method = $query->getMethod();
|
||||
$methodType = '';
|
||||
switch ($method) {
|
||||
case Query::TYPE_SELECT:
|
||||
$methodType = Base::METHOD_TYPE_SELECT;
|
||||
break;
|
||||
case Query::TYPE_LIMIT:
|
||||
$methodType = Base::METHOD_TYPE_LIMIT;
|
||||
break;
|
||||
|
|
|
@ -8,6 +8,7 @@ use Appwrite\Utopia\Database\Validator\Query\Offset;
|
|||
use Appwrite\Utopia\Database\Validator\Query\Cursor;
|
||||
use Appwrite\Utopia\Database\Validator\Query\Filter;
|
||||
use Appwrite\Utopia\Database\Validator\Query\Order;
|
||||
use Appwrite\Utopia\Database\Validator\Query\Select;
|
||||
use Utopia\Config\Config;
|
||||
use Utopia\Database\Database;
|
||||
use Utopia\Database\Document;
|
||||
|
@ -60,6 +61,7 @@ class Base extends Queries
|
|||
]);
|
||||
|
||||
$validators = [
|
||||
new Select(),
|
||||
new Limit(),
|
||||
new Offset(),
|
||||
new Cursor(),
|
||||
|
|
|
@ -8,6 +8,7 @@ use Appwrite\Utopia\Database\Validator\Query\Filter;
|
|||
use Appwrite\Utopia\Database\Validator\Query\Limit;
|
||||
use Appwrite\Utopia\Database\Validator\Query\Offset;
|
||||
use Appwrite\Utopia\Database\Validator\Query\Order;
|
||||
use Appwrite\Utopia\Database\Validator\Query\Select;
|
||||
use Utopia\Database\Database;
|
||||
use Utopia\Database\Document;
|
||||
|
||||
|
@ -38,6 +39,7 @@ class Documents extends Queries
|
|||
]);
|
||||
|
||||
$validators = [
|
||||
new Select(),
|
||||
new Limit(),
|
||||
new Offset(),
|
||||
new Cursor(),
|
||||
|
|
|
@ -12,6 +12,7 @@ abstract class Base extends Validator
|
|||
public const METHOD_TYPE_CURSOR = 'cursor';
|
||||
public const METHOD_TYPE_ORDER = 'order';
|
||||
public const METHOD_TYPE_FILTER = 'filter';
|
||||
public const METHOD_TYPE_SELECT = 'select';
|
||||
|
||||
/**
|
||||
* @var string
|
||||
|
|
56
src/Appwrite/Utopia/Database/Validator/Query/Select.php
Normal file
56
src/Appwrite/Utopia/Database/Validator/Query/Select.php
Normal file
|
@ -0,0 +1,56 @@
|
|||
<?php
|
||||
|
||||
namespace Appwrite\Utopia\Database\Validator\Query;
|
||||
|
||||
use Utopia\Database\Database;
|
||||
use Utopia\Database\Document;
|
||||
use Utopia\Database\Query;
|
||||
|
||||
class Select extends Base
|
||||
{
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
protected $schema = [];
|
||||
|
||||
/**
|
||||
* Query constructor
|
||||
*
|
||||
*/
|
||||
public function __construct(array $attributes = [])
|
||||
{
|
||||
foreach ($attributes as $attribute) {
|
||||
//$this->schema[$attribute->getAttribute('key')] = $attribute->getArrayCopy();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Is valid.
|
||||
*
|
||||
* Returns true if method is TYPE_SELECT selections are valid
|
||||
*
|
||||
* Otherwise, returns false
|
||||
*
|
||||
* @param $query
|
||||
* @return bool
|
||||
*/
|
||||
public function isValid($query): bool
|
||||
{
|
||||
/* @var $query Query */
|
||||
|
||||
if ($query->getMethod() === Query::TYPE_SELECT) {
|
||||
foreach ($query->getValues() as $attr) {
|
||||
var_dump($attr);
|
||||
// todo: Do some validations
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public function getMethodType(): string
|
||||
{
|
||||
return self::METHOD_TYPE_SELECT;
|
||||
}
|
||||
}
|
|
@ -1381,6 +1381,37 @@ trait DatabasesBase
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @depends testListDocuments
|
||||
*/
|
||||
public function testGetDocumentWithQueries(array $data): void
|
||||
{
|
||||
$databaseId = $data['databaseId'];
|
||||
foreach ($data['documents'] as $document) {
|
||||
$response = $this->client->call(Client::METHOD_GET, '/databases/' . $databaseId . '/collections/' . $document['$collectionId'] . '/documents/' . $document['$id'], array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
], $this->getHeaders()), [
|
||||
'queries' => ['select("title","releaseYear")'],
|
||||
]);
|
||||
|
||||
var_dump($response);
|
||||
//Query::select(['string', 'integer']),
|
||||
die;
|
||||
|
||||
$this->assertEquals(200, $response['headers']['status-code']);
|
||||
$this->assertEquals($response['body']['$id'], $document['$id']);
|
||||
$this->assertEquals($document['$collectionId'], $response['body']['$collectionId']);
|
||||
$this->assertArrayNotHasKey('$collection', $response['body']);
|
||||
$this->assertEquals($document['$databaseId'], $response['body']['$databaseId']);
|
||||
$this->assertEquals($response['body']['title'], $document['title']);
|
||||
$this->assertEquals($response['body']['releaseYear'], $document['releaseYear']);
|
||||
$this->assertEquals($response['body']['$permissions'], $document['$permissions']);
|
||||
$this->assertEquals($response['body']['birthDay'], $document['birthDay']);
|
||||
$this->assertFalse(array_key_exists('$internalId', $response['body']));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @depends testCreateDocument
|
||||
*/
|
||||
|
|
34
tests/unit/Utopia/Database/Validator/Query/SelectTest.php
Normal file
34
tests/unit/Utopia/Database/Validator/Query/SelectTest.php
Normal file
|
@ -0,0 +1,34 @@
|
|||
<?php
|
||||
|
||||
namespace Tests\Unit\Utopia\Database\Validator\Query;
|
||||
|
||||
use Appwrite\Utopia\Database\Validator\Query\Base;
|
||||
use Appwrite\Utopia\Database\Validator\Query\Select;
|
||||
use Utopia\Database\Query;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
class SelectTest extends TestCase
|
||||
{
|
||||
/**
|
||||
* @var Base
|
||||
*/
|
||||
protected $validator = null;
|
||||
|
||||
public function setUp(): void
|
||||
{
|
||||
$this->validator = new Select();
|
||||
}
|
||||
|
||||
public function tearDown(): void
|
||||
{
|
||||
}
|
||||
|
||||
public function testValue(): void
|
||||
{
|
||||
// Test for Success
|
||||
$this->assertEquals($this->validator->isValid(Query::select(['*', 'attr1', 'attr2', 'collection.id'])), true, $this->validator->getDescription());
|
||||
|
||||
// Test for Failure
|
||||
$this->assertEquals($this->validator->isValid(Query::limit(1)), false, $this->validator->getDescription());
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue