From 592ab3ab00f8e344e7bfe6b2512aba0355a78ab0 Mon Sep 17 00:00:00 2001 From: Matej Baco Date: Thu, 30 Dec 2021 17:17:01 +0100 Subject: [PATCH] WIP: Request filters refactor (into HTTP.php) --- app/controllers/general.php | 24 +---- app/http.php | 20 +++- app/realtime.php | 2 +- composer.lock | 12 +-- src/Appwrite/Utopia/Request.php | 145 +++++++++++++++++++++++++++++ src/Appwrite/Utopia/Response.php | 4 +- tests/unit/Utopia/ResponseTest.php | 4 +- 7 files changed, 178 insertions(+), 33 deletions(-) create mode 100644 src/Appwrite/Utopia/Request.php diff --git a/app/controllers/general.php b/app/controllers/general.php index a808517c5..ea8b79346 100644 --- a/app/controllers/general.php +++ b/app/controllers/general.php @@ -4,7 +4,7 @@ require_once __DIR__.'/../init.php'; use Appwrite\Utopia\Request\Filters\V11; use Utopia\App; -use Utopia\Swoole\Request; +use Appwrite\Utopia\Request; use Appwrite\Utopia\Response; use Appwrite\Utopia\View; use Utopia\Exception; @@ -24,7 +24,7 @@ Config::setParam('domainVerification', false); Config::setParam('cookieDomain', 'localhost'); Config::setParam('cookieSamesite', Response::COOKIE_SAMESITE_NONE); -App::init(function ($args, $utopia, $request, $response, $console, $project, $dbForConsole, $user, $locale, $clients) { +App::init(function ($utopia, $request, $response, $console, $project, $dbForConsole, $user, $locale, $clients) { /** @var Utopia\App $utopia */ /** @var Utopia\Swoole\Request $request */ /** @var Appwrite\Utopia\Response $response */ @@ -82,24 +82,6 @@ App::init(function ($args, $utopia, $request, $response, $console, $project, $db $route = $utopia->match($request); - /* - * Request format - */ - $requestFormat = $request->getHeader('x-appwrite-response-format', App::getEnv('_APP_SYSTEM_RESPONSE_FORMAT', '')); - if ($requestFormat) { - switch($requestFormat) { - // TODO: For some reason console is still on 0.12. We dont want this filter logic in console, console uses 0.12 SDK - case version_compare ($requestFormat , '0.11.0', '<=') : - $requestFilter = new V11(); - break; - } - } - if(isset($requestFilter)) { - $endpointIdentifier = $route->getLabel('sdk.namespace', 'unknown') . '.' . $route->getLabel('sdk.method', 'unknown'); - $newParams = $requestFilter->parse($args->get(), $endpointIdentifier); - $args->set($newParams); - } - $localeParam = (string) $request->getParam('locale', $request->getHeader('x-appwrite-locale', '')); if (\in_array($localeParam, Config::getParam('locale-codes'))) { $locale->setDefault($localeParam); @@ -298,7 +280,7 @@ App::init(function ($args, $utopia, $request, $response, $console, $project, $db throw new Exception('Password reset is required', 412); } -}, ['args', 'utopia', 'request', 'response', 'console', 'project', 'dbForConsole', 'user', 'locale', 'clients']); +}, ['utopia', 'request', 'response', 'console', 'project', 'dbForConsole', 'user', 'locale', 'clients']); App::options(function ($request, $response) { /** @var Utopia\Swoole\Request $request */ diff --git a/app/http.php b/app/http.php index 13223edfb..74fbe1d1b 100644 --- a/app/http.php +++ b/app/http.php @@ -2,6 +2,7 @@ require_once __DIR__.'/../vendor/autoload.php'; +use Appwrite\Utopia\Request\Filters\V11; use Appwrite\Utopia\Response; use Swoole\Process; use Swoole\Http\Server; @@ -15,7 +16,7 @@ use Utopia\Audit\Audit; use Utopia\Abuse\Adapters\TimeLimit; use Utopia\Database\Document; use Utopia\Swoole\Files; -use Utopia\Swoole\Request; +use Appwrite\Utopia\Request; $http = new Server("0.0.0.0", App::getEnv('PORT', 80)); @@ -184,6 +185,23 @@ $http->on('request', function (SwooleRequest $swooleRequest, SwooleResponse $swo Authorization::cleanRoles(); Authorization::setRole('role:all'); + /* + * Request format + */ + $route = $app->match($request); + Request::setRoute($route); + + $requestFormat = $request->getHeader('x-appwrite-response-format', App::getEnv('_APP_SYSTEM_RESPONSE_FORMAT', '')); + if ($requestFormat) { + switch($requestFormat) { + // TODO: For some reason console is still on 0.12. We dont want this filter logic in console, console uses 0.12 SDK + case version_compare ($requestFormat , '0.11.0', '<=') : + \var_dump("Matches 0.11"); + Request::setFilter(new V11()); + break; + } + } + $app->run($request, $response); } catch (\Throwable $th) { Console::error('[Error] Type: '.get_class($th)); diff --git a/app/realtime.php b/app/realtime.php index a671e149a..f3361ab89 100644 --- a/app/realtime.php +++ b/app/realtime.php @@ -22,7 +22,7 @@ use Utopia\Database\Document; use Utopia\Database\Query; use Utopia\Database\Validator\Authorization; use Utopia\Registry\Registry; -use Utopia\Swoole\Request; +use Appwrite\Utopia\Request; use Utopia\WebSocket\Server; use Utopia\WebSocket\Adapter; diff --git a/composer.lock b/composer.lock index 347db5efb..778756ca3 100644 --- a/composer.lock +++ b/composer.lock @@ -2255,16 +2255,16 @@ }, { "name": "utopia-php/framework", - "version": "0.19.3", + "version": "0.19.4", "source": { "type": "git", "url": "https://github.com/utopia-php/framework.git", - "reference": "4c6c841d738cec458b73fec5aedd40fd43bd41a7" + "reference": "b1c79f199a6adbf8526cea272d931213a8eb511d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/framework/zipball/4c6c841d738cec458b73fec5aedd40fd43bd41a7", - "reference": "4c6c841d738cec458b73fec5aedd40fd43bd41a7", + "url": "https://api.github.com/repos/utopia-php/framework/zipball/b1c79f199a6adbf8526cea272d931213a8eb511d", + "reference": "b1c79f199a6adbf8526cea272d931213a8eb511d", "shasum": "" }, "require": { @@ -2298,9 +2298,9 @@ ], "support": { "issues": "https://github.com/utopia-php/framework/issues", - "source": "https://github.com/utopia-php/framework/tree/0.19.3" + "source": "https://github.com/utopia-php/framework/tree/0.19.4" }, - "time": "2021-12-17T13:04:13+00:00" + "time": "2021-12-29T15:05:19+00:00" }, { "name": "utopia-php/image", diff --git a/src/Appwrite/Utopia/Request.php b/src/Appwrite/Utopia/Request.php new file mode 100644 index 000000000..a3533bddf --- /dev/null +++ b/src/Appwrite/Utopia/Request.php @@ -0,0 +1,145 @@ +getMethod()) { + case self::METHOD_GET: + return $this->getQuery($key, $default); + break; + case self::METHOD_POST: + case self::METHOD_PUT: + case self::METHOD_PATCH: + case self::METHOD_DELETE: + return $this->getPayload($key, $default); + break; + default: + return $this->getQuery($key, $default); + } + } + + /** + * Get Params + * + * Get all params of current method + * + * @return array + */ + public function getParams(): array + { + $requestParameters = []; + + switch($this->getMethod()) { + case self::METHOD_GET: + $requestParameters = (!empty($this->swoole->get)) ? $this->swoole->get : []; + break; + case self::METHOD_POST: + case self::METHOD_PUT: + case self::METHOD_PATCH: + case self::METHOD_DELETE: + $requestParameters = $this->generateInput(); + break; + default: + $requestParameters = (!empty($this->swoole->get)) ? $this->swoole->get : []; + } + + if (self::hasFilter() && self::hasRoute()) { + $endpointIdentifier = self::getRoute()->getLabel('sdk.namespace', 'unknown') . '.' . self::getRoute()->getLabel('sdk.method', 'unknown'); + return self::getFilter()->parse($requestParameters, $endpointIdentifier); + } else { + return $requestParameters; + } + } + + + /** + * Function to set a response filter + * + * @param $filter the response filter to set + * + * @return void + */ + public static function setFilter(?Filter $filter) + { + self::$filter = $filter; + } + + /** + * Return the currently set filter + * + * @return Filter + */ + public static function getFilter(): ?Filter + { + return self::$filter; + } + + /** + * Check if a filter has been set + * + * @return bool + */ + public static function hasFilter(): bool + { + return self::$filter != null; + } + + /** + * Function to set a request route + * + * @param Route $route the request route to set + * + * @return void + */ + public static function setRoute(?Route $route) + { + self::$route = $route; + } + + /** + * Return the currently get route + * + * @return Route + */ + public static function getRoute(): ?Route + { + return self::$route; + } + + /** + * Check if a route has been set + * + * @return bool + */ + public static function hasRoute(): bool + { + return self::$route != null; + } +} \ No newline at end of file diff --git a/src/Appwrite/Utopia/Response.php b/src/Appwrite/Utopia/Response.php index 8bf8b52ee..047ccb965 100644 --- a/src/Appwrite/Utopia/Response.php +++ b/src/Appwrite/Utopia/Response.php @@ -349,7 +349,7 @@ class Response extends SwooleResponse $output = $this->output($document, $model); // If filter is set, parse the output - if (self::isFilter()) { + if (self::hasFilter()) { $output = self::getFilter()->parse($output, $model); } @@ -488,7 +488,7 @@ class Response extends SwooleResponse * * @return bool */ - public static function isFilter(): bool + public static function hasFilter(): bool { return self::$filter != null; } diff --git a/tests/unit/Utopia/ResponseTest.php b/tests/unit/Utopia/ResponseTest.php index e8d99630f..da555fde0 100644 --- a/tests/unit/Utopia/ResponseTest.php +++ b/tests/unit/Utopia/ResponseTest.php @@ -22,13 +22,13 @@ class ResponseTest extends TestCase public function testSetFilter() { - $this->assertEquals($this->object->isFilter(), false); + $this->assertEquals($this->object->hasFilter(), false); $this->assertEquals($this->object->getFilter(), null); $filter = new V06(); $this->object->setFilter($filter); - $this->assertEquals($this->object->isFilter(), true); + $this->assertEquals($this->object->hasFilter(), true); $this->assertEquals($this->object->getFilter(), $filter); } } \ No newline at end of file