1
0
Fork 0
mirror of synced 2024-05-20 20:52:36 +12:00

WIP: Request filters refactor (into HTTP.php)

This commit is contained in:
Matej Baco 2021-12-30 17:17:01 +01:00
parent 9b749db89b
commit 592ab3ab00
7 changed files with 178 additions and 33 deletions

View file

@ -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 */

View file

@ -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));

View file

@ -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;

12
composer.lock generated
View file

@ -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",

View file

@ -0,0 +1,145 @@
<?php
namespace Appwrite\Utopia;
use Appwrite\Utopia\Request\Filter;
use Utopia\Route;
use Utopia\Swoole\Request as UtopiaRequest;
class Request extends UtopiaRequest
{
/**
* @var Filter
*/
private static $filter = null;
/**
* @var Route
*/
private static $route = null;
/**
* Get Param
*
* Get param by current method name
*
* @param string $key
* @param mixed $default
* @return mixed
*/
public function getParam(string $key, $default = null): mixed
{
switch($this->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;
}
}

View file

@ -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;
}

View file

@ -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);
}
}