Finish refactor for internal select queries

This commit is contained in:
Matej Bačo
2025-09-02 11:16:47 +02:00
parent 6b8a4a03c3
commit b1c1acf36b
9 changed files with 32 additions and 32 deletions
@@ -31,7 +31,7 @@ class Base extends Action
* @param Document $document
* @return void
*/
public function applySelectQueries(Request $request, Response $response, Document $document): void
public function applySelectQueries(Request $request, Response $response, string $model): void
{
$queries = $request->getParam('queries', []);
@@ -50,14 +50,14 @@ class Base extends Action
}
}
// TODO: Apply for all models? pass model as param?
foreach ($response->getRules() as $ruleName => $rule) {
$responseModel = $response->getModel($model);
foreach ($responseModel->getRules() as $ruleName => $rule) {
if (\str_starts_with($ruleName, '$')) {
continue;
}
if (!\in_array($ruleName, $attributes)) {
$response->removeRule($ruleName);
$responseModel->removeRule($ruleName);
}
}
}
@@ -3,10 +3,12 @@
namespace Appwrite\Platform\Modules\Functions\Http\Deployments;
use Appwrite\Extend\Exception;
use Appwrite\Platform\Modules\Compute\Base;
use Appwrite\SDK\AuthType;
use Appwrite\SDK\Method;
use Appwrite\SDK\Response as SDKResponse;
use Appwrite\Utopia\Database\Validator\Queries\Deployments;
use Appwrite\Utopia\Request;
use Appwrite\Utopia\Response;
use Utopia\Database\Database;
use Utopia\Database\Document;
@@ -19,7 +21,7 @@ use Utopia\Platform\Action;
use Utopia\Platform\Scope\HTTP;
use Utopia\Validator\Text;
class XList extends Action
class XList extends Base
{
use HTTP;
@@ -55,6 +57,7 @@ class XList extends Action
->param('functionId', '', new UID(), 'Function ID.')
->param('queries', [], new Deployments(), 'Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https://appwrite.io/docs/queries). Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' queries are allowed, each ' . APP_LIMIT_ARRAY_ELEMENT_SIZE . ' characters long. You may filter on the following attributes: ' . implode(', ', Deployments::ALLOWED_ATTRIBUTES), true)
->param('search', '', new Text(256), 'Search term to filter your list results. Max length: 256 chars.', true)
->inject('request')
->inject('response')
->inject('dbForProject')
->callback($this->action(...));
@@ -64,6 +67,7 @@ class XList extends Action
string $functionId,
array $queries,
string $search,
Request $request,
Response $response,
Database $dbForProject
) {
@@ -121,6 +125,7 @@ class XList extends Action
throw new Exception(Exception::DATABASE_QUERY_ORDER_NULL, "The order attribute '{$e->getAttribute()}' had a null value. Cursor pagination requires all documents order attribute values are non-null.");
}
$this->applySelectQueries($request, $response, Response::MODEL_DEPLOYMENT);
$response->dynamic(new Document([
'deployments' => $results,
'total' => $total,
@@ -3,10 +3,12 @@
namespace Appwrite\Platform\Modules\Sites\Http\Deployments;
use Appwrite\Extend\Exception;
use Appwrite\Platform\Modules\Compute\Base;
use Appwrite\SDK\AuthType;
use Appwrite\SDK\Method;
use Appwrite\SDK\Response as SDKResponse;
use Appwrite\Utopia\Database\Validator\Queries\Deployments;
use Appwrite\Utopia\Request;
use Appwrite\Utopia\Response;
use Utopia\Database\Database;
use Utopia\Database\Document;
@@ -19,7 +21,7 @@ use Utopia\Platform\Action;
use Utopia\Platform\Scope\HTTP;
use Utopia\Validator\Text;
class XList extends Action
class XList extends Base
{
use HTTP;
@@ -55,13 +57,20 @@ class XList extends Action
->param('siteId', '', new UID(), 'Site ID.')
->param('queries', [], new Deployments(), 'Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https://appwrite.io/docs/queries). Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' queries are allowed, each ' . APP_LIMIT_ARRAY_ELEMENT_SIZE . ' characters long. You may filter on the following attributes: ' . implode(', ', Deployments::ALLOWED_ATTRIBUTES), true)
->param('search', '', new Text(256), 'Search term to filter your list results. Max length: 256 chars.', true)
->inject('request')
->inject('response')
->inject('dbForProject')
->callback($this->action(...));
}
public function action(string $siteId, array $queries, string $search, Response $response, Database $dbForProject)
{
public function action(
string $siteId,
array $queries,
string $search,
Request $request,
Response $response,
Database $dbForProject
) {
$site = $dbForProject->getDocument('sites', $siteId);
if ($site->isEmpty()) {
@@ -116,6 +125,7 @@ class XList extends Action
throw new Exception(Exception::DATABASE_QUERY_ORDER_NULL, "The order attribute '{$e->getAttribute()}' had a null value. Cursor pagination requires all documents order attribute values are non-null.");
}
$this->applySelectQueries($request, $response, Response::MODEL_DEPLOYMENT);
$response->dynamic(new Document([
'deployments' => $results,
'total' => $total,
+1 -1
View File
@@ -106,7 +106,7 @@ abstract class Model
* @param string $key
* @return Model
*/
protected function removeRule(string $key): self
public function removeRule(string $key): self
{
if (isset($this->rules[$key])) {
unset($this->rules[$key]);
@@ -4,7 +4,6 @@ namespace Appwrite\Utopia\Response\Model;
use Appwrite\Utopia\Response;
use Appwrite\Utopia\Response\Model;
use Utopia\Database\Document;
class Deployment extends Model
{
@@ -191,12 +190,6 @@ class Deployment extends Model
return 'Deployment';
}
public function filter(Document $document): Document
{
$this->applySelectQueries($document, $request);
return $document;
}
/**
* Get Type
*
@@ -2,7 +2,6 @@
namespace Appwrite\Utopia\Response\Model;
use Appwrite\Utopia\Request;
use Appwrite\Utopia\Response;
use Utopia\Database\Document as DatabaseDocument;
@@ -79,7 +78,7 @@ class Document extends Any
]);
}
public function filter(DatabaseDocument $document, Request $request): DatabaseDocument
public function filter(DatabaseDocument $document): DatabaseDocument
{
$document->removeAttribute('$collection');
$document->removeAttribute('$tenant');
@@ -89,11 +88,11 @@ class Document extends Any
if (\is_array($attribute)) {
foreach ($attribute as $subAttribute) {
if ($subAttribute instanceof DatabaseDocument) {
$this->filter($subAttribute, $request);
$this->filter($subAttribute);
}
}
} elseif ($attribute instanceof DatabaseDocument) {
$this->filter($attribute, $request);
$this->filter($attribute);
}
}
+3 -4
View File
@@ -2,7 +2,6 @@
namespace Appwrite\Utopia\Response\Model;
use Appwrite\Utopia\Request;
use Appwrite\Utopia\Response;
use Utopia\Database\Document as DatabaseDocument;
@@ -79,7 +78,7 @@ class Row extends Any
]);
}
public function filter(DatabaseDocument $document, Request $request): DatabaseDocument
public function filter(DatabaseDocument $document): DatabaseDocument
{
$document->removeAttribute('$collection');
$document->removeAttribute('$tenant');
@@ -89,11 +88,11 @@ class Row extends Any
if (\is_array($column)) {
foreach ($column as $subAttribute) {
if ($subAttribute instanceof DatabaseDocument) {
$this->filter($subAttribute, $request);
$this->filter($subAttribute);
}
}
} elseif ($column instanceof DatabaseDocument) {
$this->filter($column, $request);
$this->filter($column);
}
}
+1 -4
View File
@@ -3,10 +3,8 @@
namespace Tests\Unit\GraphQL;
use Appwrite\GraphQL\Types\Mapper;
use Appwrite\Utopia\Request;
use Appwrite\Utopia\Response;
use PHPUnit\Framework\TestCase;
use Swoole\Http\Request as SwooleRequest;
use Swoole\Http\Response as SwooleResponse;
class BuilderTest extends TestCase
@@ -15,8 +13,7 @@ class BuilderTest extends TestCase
public function setUp(): void
{
$request = new Request(new SwooleRequest());
$this->response = new Response(new SwooleResponse(), $request);
$this->response = new Response(new SwooleResponse());
Mapper::init($this->response->getModels());
}
+1 -4
View File
@@ -2,11 +2,9 @@
namespace Tests\Unit\Utopia;
use Appwrite\Utopia\Request;
use Appwrite\Utopia\Response;
use Exception;
use PHPUnit\Framework\TestCase;
use Swoole\Http\Request as SwooleRequest;
use Swoole\Http\Response as SwooleResponse;
use Tests\Unit\Utopia\Response\Filters\First;
use Tests\Unit\Utopia\Response\Filters\Second;
@@ -18,8 +16,7 @@ class ResponseTest extends TestCase
public function setUp(): void
{
$request = new Request(new SwooleRequest());
$this->response = new Response(new SwooleResponse(), $request);
$this->response = new Response(new SwooleResponse());
$this->response->setModel(new Single());
$this->response->setModel(new Lists());
$this->response->setModel(new Nested());