diff --git a/app/http.php b/app/http.php index 1949afbfff..30f4013821 100644 --- a/app/http.php +++ b/app/http.php @@ -426,7 +426,7 @@ $http->on(Constant::EVENT_REQUEST, function (SwooleRequest $swooleRequest, Swool App::setResource('swooleResponse', fn () => $swooleResponse); $request = new Request($swooleRequest); - $response = new Response($swooleResponse, $request); + $response = new Response($swooleResponse); if (Files::isFileLoaded($request->getURI())) { $time = (60 * 60 * 24 * 365 * 2); // 45 days cache diff --git a/app/realtime.php b/app/realtime.php index 12559dd186..bb0d4da78c 100644 --- a/app/realtime.php +++ b/app/realtime.php @@ -504,7 +504,7 @@ $server->onWorkerStart(function (int $workerId) use ($server, $register, $stats, $server->onOpen(function (int $connection, SwooleRequest $request) use ($server, $register, $stats, &$realtime, $logError) { $app = new App('UTC'); $request = new Request($request); - $response = new Response(new SwooleResponse(), $request); + $response = new Response(new SwooleResponse()); Console::info("Connection open (user: {$connection})"); @@ -625,8 +625,7 @@ $server->onOpen(function (int $connection, SwooleRequest $request) use ($server, $server->onMessage(function (int $connection, string $message) use ($server, $register, $realtime, $containerId) { try { - $request = new Request(new SwooleRequest()); - $response = new Response(new SwooleResponse(), $request); + $response = new Response(new SwooleResponse()); $projectId = $realtime->connections[$connection]['projectId']; $database = getConsoleDB(); diff --git a/src/Appwrite/Platform/Modules/Compute/Base.php b/src/Appwrite/Platform/Modules/Compute/Base.php index e58f2b8664..5522dc1765 100644 --- a/src/Appwrite/Platform/Modules/Compute/Base.php +++ b/src/Appwrite/Platform/Modules/Compute/Base.php @@ -4,12 +4,14 @@ namespace Appwrite\Platform\Modules\Compute; use Appwrite\Event\Build; use Appwrite\Extend\Exception; +use Appwrite\Utopia\Response; use Utopia\Database\Database; use Utopia\Database\Document; use Utopia\Database\Exception\Duplicate; use Utopia\Database\Helpers\ID; use Utopia\Database\Helpers\Permission; use Utopia\Database\Helpers\Role; +use Utopia\Database\Query; use Utopia\Database\Validator\Authorization; use Utopia\Platform\Action; use Utopia\Swoole\Request; @@ -19,6 +21,47 @@ use Utopia\VCS\Exception\RepositoryNotFound; class Base extends Action { + /** + * Helper to apply select queries + * + * Method to respect request select queries in response format, + * to prevent default rule values from being applied on not-selected attributes + * + * @param Request $request + * @param Document $document + * @return void + */ + public function applySelectQueries(Request $request, Response $response, Document $document): void + { + $queries = $request->getParam('queries', []); + + $queries = Query::parseQueries($queries); + $selectQueries = Query::groupByType($queries)['selections'] ?? []; + + // No select queries means no filtering out + if (empty($selectQueries)) { + return; + } + + $attributes = []; + foreach ($selectQueries as $query) { + foreach ($query->getValues() as $attribute) { + $attributes[] = $attribute; + } + } + + // TODO: Apply for all models? pass model as param? + foreach ($response->getRules() as $ruleName => $rule) { + if (\str_starts_with($ruleName, '$')) { + continue; + } + + if (!\in_array($ruleName, $attributes)) { + $response->removeRule($ruleName); + } + } + } + public function redeployVcsFunction(Request $request, Document $function, Document $project, Document $installation, Database $dbForProject, Build $queueForBuilds, Document $template, GitHub $github, bool $activate, string $referenceType = 'branch', string $reference = ''): Document { $deploymentId = ID::unique(); diff --git a/src/Appwrite/Platform/Workers/Functions.php b/src/Appwrite/Platform/Workers/Functions.php index 6e349f3cce..df1833ad33 100644 --- a/src/Appwrite/Platform/Workers/Functions.php +++ b/src/Appwrite/Platform/Workers/Functions.php @@ -8,11 +8,9 @@ use Appwrite\Event\Func; use Appwrite\Event\Realtime; use Appwrite\Event\StatsUsage; use Appwrite\Event\Webhook; -use Appwrite\Utopia\Request; use Appwrite\Utopia\Response\Model\Execution; use Exception; use Executor\Executor; -use Swoole\Http\Request as SwooleRequest; use Utopia\CLI\Console; use Utopia\Config\Config; use Utopia\Database\Database; @@ -617,7 +615,7 @@ class Functions extends Action $execution = $dbForProject->updateDocument('executions', $executionId, $execution); $executionModel = new Execution(); - $realtimeExecution = $executionModel->filter(new Document($execution->getArrayCopy()), new Request(new SwooleRequest())); + $realtimeExecution = $executionModel->filter(new Document($execution->getArrayCopy())); $realtimeExecution = $realtimeExecution->getArrayCopy(\array_keys($executionModel->getRules())); $queueForEvents diff --git a/src/Appwrite/SDK/Method.php b/src/Appwrite/SDK/Method.php index 81c6dcc89e..8d11b07198 100644 --- a/src/Appwrite/SDK/Method.php +++ b/src/Appwrite/SDK/Method.php @@ -3,9 +3,7 @@ namespace Appwrite\SDK; use Appwrite\SDK\Response as SDKResponse; -use Appwrite\Utopia\Request; use Appwrite\Utopia\Response; -use Swoole\Http\Request as HttpRequest; use Swoole\Http\Response as HttpResponse; class Method @@ -103,8 +101,7 @@ class Method protected function validateResponseModel(string|array $responseModel): void { - $request = new Request(new HttpRequest()); - $response = new Response(new HttpResponse(), $request); + $response = new Response(new HttpResponse()); if (!\is_array($responseModel)) { $responseModel = [$responseModel]; diff --git a/src/Appwrite/Utopia/Response.php b/src/Appwrite/Utopia/Response.php index 92156654cd..e0ca38587d 100644 --- a/src/Appwrite/Utopia/Response.php +++ b/src/Appwrite/Utopia/Response.php @@ -403,9 +403,8 @@ class Response extends SwooleResponse * Response constructor. * * @param SwooleHTTPResponse $response Native response to be passed to parent constructor - * @param Request $request Relevant request object, useful for some response filters */ - public function __construct(SwooleHTTPResponse $response, protected Request $request) + public function __construct(SwooleHTTPResponse $response) { $this // General @@ -720,7 +719,7 @@ class Response extends SwooleResponse $model = $this->getModel($model); $output = []; - $data = $model->filter($data, $this->request); + $data = $model->filter($data); if ($model->isAny()) { $this->payload = $data->getArrayCopy(); diff --git a/src/Appwrite/Utopia/Response/Model.php b/src/Appwrite/Utopia/Response/Model.php index 95f26b3ca2..3ae40bd479 100644 --- a/src/Appwrite/Utopia/Response/Model.php +++ b/src/Appwrite/Utopia/Response/Model.php @@ -2,9 +2,7 @@ namespace Appwrite\Utopia\Response; -use Appwrite\Utopia\Request; use Utopia\Database\Document; -use Utopia\Database\Query; abstract class Model { @@ -47,11 +45,10 @@ abstract class Model /** * Filter Document Structure * @param Document $document Document to apply filter on - * @param Request $request Relevant request object, useful for select query filtering * * @return Document */ - public function filter(Document $document, Request $request): Document + public function filter(Document $document): Document { return $document; } @@ -190,44 +187,4 @@ abstract class Model { return $this->public; } - - /** - * Apply Select Queries - * - * Helper method to respect request select queries, - * to prevent default rule values from being applied on not-selected attributes - * - * @param Document $document - * @param Request $request - * @return void - */ - public function applySelectQueries(Document $document, Request $request): void - { - $queries = $request->getParam('queries', []); - - $queries = Query::parseQueries($queries); - $selectQueries = Query::groupByType($queries)['selections'] ?? []; - - // No select queries means no filtering out - if (empty($selectQueries)) { - return; - } - - $attributes = []; - foreach ($selectQueries as $query) { - foreach ($query->getValues() as $attribute) { - $attributes[] = $attribute; - } - } - - foreach ($this->getRules() as $ruleName => $rule) { - if (\str_starts_with($ruleName, '$')) { - continue; - } - - if (!\in_array($ruleName, $attributes)) { - $this->removeRule($ruleName); - } - } - } } diff --git a/src/Appwrite/Utopia/Response/Model/AttributeRelationship.php b/src/Appwrite/Utopia/Response/Model/AttributeRelationship.php index b4abb0d554..d88fbd1530 100644 --- a/src/Appwrite/Utopia/Response/Model/AttributeRelationship.php +++ b/src/Appwrite/Utopia/Response/Model/AttributeRelationship.php @@ -2,7 +2,6 @@ namespace Appwrite\Utopia\Response\Model; -use Appwrite\Utopia\Request; use Appwrite\Utopia\Response; use Utopia\Database\Document; @@ -81,7 +80,7 @@ class AttributeRelationship extends Attribute * * @return Document */ - public function filter(Document $document, Request $request): Document + public function filter(Document $document): Document { $options = $document->getAttribute('options'); if (!\is_null($options)) { diff --git a/src/Appwrite/Utopia/Response/Model/ColumnIndex.php b/src/Appwrite/Utopia/Response/Model/ColumnIndex.php index b345c96c02..547312d677 100644 --- a/src/Appwrite/Utopia/Response/Model/ColumnIndex.php +++ b/src/Appwrite/Utopia/Response/Model/ColumnIndex.php @@ -2,7 +2,6 @@ namespace Appwrite\Utopia\Response\Model; -use Appwrite\Utopia\Request; use Appwrite\Utopia\Response; use Appwrite\Utopia\Response\Model; use Utopia\Database\Document; @@ -94,7 +93,7 @@ class ColumnIndex extends Model return Response::MODEL_COLUMN_INDEX; } - public function filter(Document $document, Request $request): Document + public function filter(Document $document): Document { $columns = $document->getAttribute('attributes', []); $document diff --git a/src/Appwrite/Utopia/Response/Model/ColumnRelationship.php b/src/Appwrite/Utopia/Response/Model/ColumnRelationship.php index 33e7c1d4db..877982365b 100644 --- a/src/Appwrite/Utopia/Response/Model/ColumnRelationship.php +++ b/src/Appwrite/Utopia/Response/Model/ColumnRelationship.php @@ -2,7 +2,6 @@ namespace Appwrite\Utopia\Response\Model; -use Appwrite\Utopia\Request; use Appwrite\Utopia\Response; use Utopia\Database\Document; @@ -81,7 +80,7 @@ class ColumnRelationship extends Column * * @return Document */ - public function filter(Document $document, Request $request): Document + public function filter(Document $document): Document { $options = $document->getAttribute('options'); if (!\is_null($options)) { diff --git a/src/Appwrite/Utopia/Response/Model/Deployment.php b/src/Appwrite/Utopia/Response/Model/Deployment.php index 9b26c7ec7e..26194ad08d 100644 --- a/src/Appwrite/Utopia/Response/Model/Deployment.php +++ b/src/Appwrite/Utopia/Response/Model/Deployment.php @@ -2,7 +2,6 @@ namespace Appwrite\Utopia\Response\Model; -use Appwrite\Utopia\Request; use Appwrite\Utopia\Response; use Appwrite\Utopia\Response\Model; use Utopia\Database\Document; @@ -192,7 +191,7 @@ class Deployment extends Model return 'Deployment'; } - public function filter(Document $document, Request $request): Document + public function filter(Document $document): Document { $this->applySelectQueries($document, $request); return $document; diff --git a/src/Appwrite/Utopia/Response/Model/Execution.php b/src/Appwrite/Utopia/Response/Model/Execution.php index 58d6f49b76..39d2203bf9 100644 --- a/src/Appwrite/Utopia/Response/Model/Execution.php +++ b/src/Appwrite/Utopia/Response/Model/Execution.php @@ -2,7 +2,6 @@ namespace Appwrite\Utopia\Response\Model; -use Appwrite\Utopia\Request; use Appwrite\Utopia\Response; use Appwrite\Utopia\Response\Model; use Utopia\Database\DateTime; @@ -157,7 +156,7 @@ class Execution extends Model * * @return Document */ - public function filter(Document $document, Request $request): Document + public function filter(Document $document): Document { $document->removeAttribute('resourceType'); $document->setAttribute('functionId', $document->getAttribute('resourceId', '')); diff --git a/src/Appwrite/Utopia/Response/Model/Migration.php b/src/Appwrite/Utopia/Response/Model/Migration.php index 85890e69cd..76e00b3097 100644 --- a/src/Appwrite/Utopia/Response/Model/Migration.php +++ b/src/Appwrite/Utopia/Response/Model/Migration.php @@ -2,7 +2,6 @@ namespace Appwrite\Utopia\Response\Model; -use Appwrite\Utopia\Request; use Appwrite\Utopia\Response; use Appwrite\Utopia\Response\Model; use Utopia\Database\Document; @@ -110,7 +109,7 @@ class Migration extends Model return Response::MODEL_MIGRATION; } - public function filter(Document $document, Request $request): Document + public function filter(Document $document): Document { $errors = $document->getAttribute('errors', []); if (empty($errors)) { diff --git a/src/Appwrite/Utopia/Response/Model/Project.php b/src/Appwrite/Utopia/Response/Model/Project.php index 1c1c0bce62..abe67e7e86 100644 --- a/src/Appwrite/Utopia/Response/Model/Project.php +++ b/src/Appwrite/Utopia/Response/Model/Project.php @@ -3,7 +3,6 @@ namespace Appwrite\Utopia\Response\Model; use Appwrite\Auth\Auth; -use Appwrite\Utopia\Request; use Appwrite\Utopia\Response; use Appwrite\Utopia\Response\Model; use Utopia\Config\Config; @@ -341,7 +340,7 @@ class Project extends Model * * @return Document */ - public function filter(Document $document, Request $request): Document + public function filter(Document $document): Document { // SMTP $smtp = $document->getAttribute('smtp', []); diff --git a/src/Appwrite/Utopia/Response/Model/ResourceToken.php b/src/Appwrite/Utopia/Response/Model/ResourceToken.php index 1f6a30aa15..87ab66ab5d 100644 --- a/src/Appwrite/Utopia/Response/Model/ResourceToken.php +++ b/src/Appwrite/Utopia/Response/Model/ResourceToken.php @@ -3,7 +3,6 @@ namespace Appwrite\Utopia\Response\Model; use Ahc\Jwt\JWT; -use Appwrite\Utopia\Request; use Appwrite\Utopia\Response; use Appwrite\Utopia\Response\Model; use Utopia\Database\Document; @@ -60,7 +59,7 @@ class ResourceToken extends Model ; } - public function filter(Document $document, Request $request): Document + public function filter(Document $document): Document { $expire = $document->getAttribute('expire'); diff --git a/src/Appwrite/Utopia/Response/Model/Table.php b/src/Appwrite/Utopia/Response/Model/Table.php index 6fe6e6d42a..722edcd4cf 100644 --- a/src/Appwrite/Utopia/Response/Model/Table.php +++ b/src/Appwrite/Utopia/Response/Model/Table.php @@ -2,7 +2,6 @@ namespace Appwrite\Utopia\Response\Model; -use Appwrite\Utopia\Request; use Appwrite\Utopia\Response; use Appwrite\Utopia\Response\Model; use Utopia\Database\Document; @@ -112,7 +111,7 @@ class Table extends Model /** * Process Document before returning it to the client for backwards compatibility! */ - public function filter(Document $document, Request $request): Document + public function filter(Document $document): Document { $columns = $document->getAttribute('attributes', []); if (!empty($columns) && \is_array($columns)) { diff --git a/src/Appwrite/Utopia/Response/Model/Team.php b/src/Appwrite/Utopia/Response/Model/Team.php index 845603b7bd..d080a82bb1 100644 --- a/src/Appwrite/Utopia/Response/Model/Team.php +++ b/src/Appwrite/Utopia/Response/Model/Team.php @@ -2,7 +2,6 @@ namespace Appwrite\Utopia\Response\Model; -use Appwrite\Utopia\Request; use Appwrite\Utopia\Response; use Appwrite\Utopia\Response\Model; use Utopia\Database\Document; @@ -56,7 +55,7 @@ class Team extends Model * * @return Document */ - public function filter(Document $document, Request $request): Document + public function filter(Document $document): Document { $prefs = $document->getAttribute('prefs'); if ($prefs instanceof Document) { diff --git a/src/Appwrite/Utopia/Response/Model/User.php b/src/Appwrite/Utopia/Response/Model/User.php index e2a971179e..672b8885a0 100644 --- a/src/Appwrite/Utopia/Response/Model/User.php +++ b/src/Appwrite/Utopia/Response/Model/User.php @@ -2,7 +2,6 @@ namespace Appwrite\Utopia\Response\Model; -use Appwrite\Utopia\Request; use Appwrite\Utopia\Response; use Appwrite\Utopia\Response\Model; use Utopia\Database\Document; @@ -148,7 +147,7 @@ class User extends Model * * @return string */ - public function filter(Document $document, Request $request): Document + public function filter(Document $document): Document { $prefs = $document->getAttribute('prefs'); if ($prefs instanceof Document) { diff --git a/src/Appwrite/Utopia/Response/Model/Variable.php b/src/Appwrite/Utopia/Response/Model/Variable.php index 2a8fbfad72..22f76e44d4 100644 --- a/src/Appwrite/Utopia/Response/Model/Variable.php +++ b/src/Appwrite/Utopia/Response/Model/Variable.php @@ -2,7 +2,6 @@ namespace Appwrite\Utopia\Response\Model; -use Appwrite\Utopia\Request; use Appwrite\Utopia\Response; use Appwrite\Utopia\Response\Model; use Utopia\Database\Document; @@ -70,7 +69,7 @@ class Variable extends Model * @param Document $document * @return Document */ - public function filter(Document $document, Request $request): Document + public function filter(Document $document): Document { $secret = $document->getAttribute('secret'); if ($secret === true) {