diff --git a/app/controllers/api/account.php b/app/controllers/api/account.php index 1b0aa1889..5316ba6ef 100644 --- a/app/controllers/api/account.php +++ b/app/controllers/api/account.php @@ -55,7 +55,7 @@ App::post('/v1/account') ->inject('audits') ->inject('usage') ->action(function ($userId, $email, $password, $name, $request, $response, $project, $dbForProject, $audits, $usage) { - /** @var Utopia\Swoole\Request $request */ + /** @var Appwrite\Utopia\Request $request */ /** @var Appwrite\Utopia\Response $response */ /** @var Utopia\Database\Document $project */ /** @var Utopia\Database\Database $dbForProject */ @@ -155,7 +155,7 @@ App::post('/v1/account/sessions') ->inject('audits') ->inject('usage') ->action(function ($email, $password, $request, $response, $dbForProject, $locale, $geodb, $audits, $usage) { - /** @var Utopia\Swoole\Request $request */ + /** @var Appwrite\Utopia\Request $request */ /** @var Appwrite\Utopia\Response $response */ /** @var Utopia\Database\Database $dbForProject */ /** @var Utopia\Locale\Locale $locale */ @@ -267,7 +267,7 @@ App::get('/v1/account/sessions/oauth2/:provider') ->inject('response') ->inject('project') ->action(function ($provider, $success, $failure, $scopes, $request, $response, $project) use ($oauthDefaultSuccess, $oauthDefaultFailure) { - /** @var Utopia\Swoole\Request $request */ + /** @var Appwrite\Utopia\Request $request */ /** @var Appwrite\Utopia\Response $response */ /** @var Utopia\Database\Document $project */ @@ -320,7 +320,7 @@ App::get('/v1/account/sessions/oauth2/callback/:provider/:projectId') ->inject('request') ->inject('response') ->action(function ($projectId, $provider, $code, $state, $request, $response) { - /** @var Utopia\Swoole\Request $request */ + /** @var Appwrite\Utopia\Request $request */ /** @var Appwrite\Utopia\Response $response */ $domain = $request->getHostname(); @@ -347,7 +347,7 @@ App::post('/v1/account/sessions/oauth2/callback/:provider/:projectId') ->inject('request') ->inject('response') ->action(function ($projectId, $provider, $code, $state, $request, $response) { - /** @var Utopia\Swoole\Request $request */ + /** @var Appwrite\Utopia\Request $request */ /** @var Appwrite\Utopia\Response $response */ $domain = $request->getHostname(); @@ -382,7 +382,7 @@ App::get('/v1/account/sessions/oauth2/:provider/redirect') ->inject('events') ->inject('usage') ->action(function ($provider, $code, $state, $request, $response, $project, $user, $dbForProject, $geodb, $audits, $events, $usage) use ($oauthDefaultSuccess) { - /** @var Utopia\Swoole\Request $request */ + /** @var Appwrite\Utopia\Request $request */ /** @var Appwrite\Utopia\Response $response */ /** @var Utopia\Database\Document $project */ /** @var Utopia\Database\Document $user */ @@ -627,7 +627,7 @@ App::post('/v1/account/sessions/magic-url') ->inject('events') ->inject('mails') ->action(function ($userId, $email, $url, $request, $response, $project, $dbForProject, $locale, $audits, $events, $mails) { - /** @var Utopia\Swoole\Request $request */ + /** @var Appwrite\Utopia\Request $request */ /** @var Appwrite\Utopia\Response $response */ /** @var Utopia\Database\Document $project */ /** @var Utopia\Database\Database $dbForProject */ @@ -773,7 +773,7 @@ App::put('/v1/account/sessions/magic-url') ->action(function ($userId, $secret, $request, $response, $dbForProject, $locale, $geodb, $audits) { /** @var string $userId */ /** @var string $secret */ - /** @var Utopia\Swoole\Request $request */ + /** @var Appwrite\Utopia\Request $request */ /** @var Appwrite\Utopia\Response $response */ /** @var Utopia\Database\Database $dbForProject */ /** @var Utopia\Locale\Locale $locale */ @@ -899,7 +899,7 @@ App::post('/v1/account/sessions/anonymous') ->inject('audits') ->inject('usage') ->action(function ($request, $response, $locale, $user, $project, $dbForProject, $geodb, $audits, $usage) { - /** @var Utopia\Swoole\Request $request */ + /** @var Appwrite\Utopia\Request $request */ /** @var Appwrite\Utopia\Response $response */ /** @var Utopia\Locale\Locale $locale */ /** @var Utopia\Database\Document $user */ @@ -1512,7 +1512,7 @@ App::delete('/v1/account') ->inject('events') ->inject('usage') ->action(function ($request, $response, $user, $dbForProject, $audits, $events, $usage) { - /** @var Utopia\Swoole\Request $request */ + /** @var Appwrite\Utopia\Request $request */ /** @var Appwrite\Utopia\Response $response */ /** @var Utopia\Database\Document $user */ /** @var Utopia\Database\Database $dbForProject */ @@ -1582,7 +1582,7 @@ App::delete('/v1/account/sessions/:sessionId') ->inject('events') ->inject('usage') ->action(function ($sessionId, $request, $response, $user, $dbForProject, $locale, $audits, $events, $usage) { - /** @var Utopia\Swoole\Request $request */ + /** @var Appwrite\Utopia\Request $request */ /** @var Appwrite\Utopia\Response $response */ /** @var Utopia\Database\Document $user */ /** @var Utopia\Database\Database $dbForProject */ @@ -1668,7 +1668,7 @@ App::delete('/v1/account/sessions') ->inject('events') ->inject('usage') ->action(function ($request, $response, $user, $dbForProject, $locale, $audits, $events, $usage) { - /** @var Utopia\Swoole\Request $request */ + /** @var Appwrite\Utopia\Request $request */ /** @var Appwrite\Utopia\Response $response */ /** @var Utopia\Database\Document $user */ /** @var Utopia\Database\Database $dbForProject */ @@ -1753,7 +1753,7 @@ App::post('/v1/account/recovery') ->inject('events') ->inject('usage') ->action(function ($email, $url, $request, $response, $dbForProject, $project, $locale, $mails, $audits, $events, $usage) { - /** @var Utopia\Swoole\Request $request */ + /** @var Appwrite\Utopia\Request $request */ /** @var Appwrite\Utopia\Response $response */ /** @var Utopia\Database\Database $dbForProject */ /** @var Utopia\Database\Document $project */ @@ -1945,7 +1945,7 @@ App::post('/v1/account/verification') ->inject('mails') ->inject('usage') ->action(function ($url, $request, $response, $project, $user, $dbForProject, $locale, $audits, $events, $mails, $usage) { - /** @var Utopia\Swoole\Request $request */ + /** @var Appwrite\Utopia\Request $request */ /** @var Appwrite\Utopia\Response $response */ /** @var Utopia\Database\Document $project */ /** @var Utopia\Database\Document $user */ diff --git a/app/controllers/api/functions.php b/app/controllers/api/functions.php index 673d84ba4..eab8f322a 100644 --- a/app/controllers/api/functions.php +++ b/app/controllers/api/functions.php @@ -453,7 +453,7 @@ App::post('/v1/functions/:functionId/tags') ->inject('dbForProject') ->inject('usage') ->action(function ($functionId, $command, $file, $request, $response, $dbForProject, $usage) { - /** @var Utopia\Swoole\Request $request */ + /** @var Appwrite\Utopia\Request $request */ /** @var Appwrite\Utopia\Response $response */ /** @var Utopia\Database\Database $dbForProject */ /** @var Appwrite\Event\Event $usage */ diff --git a/app/controllers/api/locale.php b/app/controllers/api/locale.php index d5e2feb17..9c9e152e5 100644 --- a/app/controllers/api/locale.php +++ b/app/controllers/api/locale.php @@ -21,7 +21,7 @@ App::get('/v1/locale') ->inject('locale') ->inject('geodb') ->action(function ($request, $response, $locale, $geodb) { - /** @var Utopia\Swoole\Request $request */ + /** @var Appwrite\Utopia\Request $request */ /** @var Appwrite\Utopia\Response $response */ /** @var Utopia\Locale\Locale $locale */ /** @var MaxMind\Db\Reader $geodb */ diff --git a/app/controllers/api/storage.php b/app/controllers/api/storage.php index 39d18e3d3..4a5fb7cfe 100644 --- a/app/controllers/api/storage.php +++ b/app/controllers/api/storage.php @@ -52,7 +52,7 @@ App::post('/v1/storage/files') ->inject('audits') ->inject('usage') ->action(function ($fileId, $file, $read, $write, $request, $response, $dbForProject, $user, $audits, $usage) { - /** @var Utopia\Swoole\Request $request */ + /** @var Appwrite\Utopia\Request $request */ /** @var Appwrite\Utopia\Response $response */ /** @var Utopia\Database\Database $dbForProject */ /** @var Utopia\Database\Document $user */ @@ -295,7 +295,7 @@ App::get('/v1/storage/files/:fileId/preview') ->inject('dbForProject') ->inject('usage') ->action(function ($fileId, $width, $height, $gravity, $quality, $borderWidth, $borderColor, $borderRadius, $opacity, $rotation, $background, $output, $request, $response, $project, $dbForProject, $usage) { - /** @var Utopia\Swoole\Request $request */ + /** @var Appwrite\Utopia\Request $request */ /** @var Appwrite\Utopia\Response $response */ /** @var Utopia\Database\Document $project */ /** @var Utopia\Database\Database $dbForProject */ diff --git a/app/controllers/api/teams.php b/app/controllers/api/teams.php index c2f26159b..ab5534edc 100644 --- a/app/controllers/api/teams.php +++ b/app/controllers/api/teams.php @@ -541,7 +541,7 @@ App::patch('/v1/teams/:teamId/memberships/:membershipId') ->inject('dbForProject') ->inject('audits') ->action(function ($teamId, $membershipId, $roles, $request, $response, $user, $dbForProject, $audits) { - /** @var Utopia\Swoole\Request $request */ + /** @var Appwrite\Utopia\Request $request */ /** @var Appwrite\Utopia\Response $response */ /** @var Utopia\Database\Document $user */ /** @var Utopia\Database\Database $dbForProject */ @@ -608,7 +608,7 @@ App::patch('/v1/teams/:teamId/memberships/:membershipId/status') ->inject('geodb') ->inject('audits') ->action(function ($teamId, $membershipId, $userId, $secret, $request, $response, $user, $dbForProject, $geodb, $audits) { - /** @var Utopia\Swoole\Request $request */ + /** @var Appwrite\Utopia\Request $request */ /** @var Appwrite\Utopia\Response $response */ /** @var Utopia\Database\Document $user */ /** @var Utopia\Database\Database $dbForProject */ diff --git a/app/controllers/general.php b/app/controllers/general.php index e82ed60b1..8b0fbf8e0 100644 --- a/app/controllers/general.php +++ b/app/controllers/general.php @@ -5,7 +5,7 @@ require_once __DIR__.'/../init.php'; use Utopia\App; use Utopia\Logger\Log; use Utopia\Logger\Log\User; -use Utopia\Swoole\Request; +use Appwrite\Utopia\Request; use Appwrite\Utopia\Response; use Appwrite\Utopia\View; use Utopia\Exception; @@ -16,10 +16,12 @@ use Appwrite\Network\Validator\Origin; use Appwrite\Utopia\Response\Filters\V06; use Appwrite\Utopia\Response\Filters\V07; use Appwrite\Utopia\Response\Filters\V08; +use Appwrite\Utopia\Response\Filters\V11; use Utopia\CLI\Console; use Utopia\Database\Document; use Utopia\Database\Query; use Utopia\Database\Validator\Authorization; +use Appwrite\Utopia\Request\Filters\V12; Config::setParam('domainVerification', false); Config::setParam('cookieDomain', 'localhost'); @@ -27,7 +29,7 @@ Config::setParam('cookieSamesite', Response::COOKIE_SAMESITE_NONE); App::init(function ($utopia, $request, $response, $console, $project, $dbForConsole, $user, $locale, $clients) { /** @var Utopia\App $utopia */ - /** @var Utopia\Swoole\Request $request */ + /** @var Appwrite\Utopia\Request $request */ /** @var Appwrite\Utopia\Response $response */ /** @var Utopia\Database\Document $console */ /** @var Utopia\Database\Document $project */ @@ -36,6 +38,25 @@ App::init(function ($utopia, $request, $response, $console, $project, $dbForCons /** @var Utopia\Locale\Locale $locale */ /** @var array $clients */ + /* + * Request format + */ + $route = $utopia->match($request); + Request::setRoute($route); + + $requestFormat = $request->getHeader('x-appwrite-response-format', App::getEnv('_APP_SYSTEM_RESPONSE_FORMAT', '')); + if ($requestFormat) { + switch($requestFormat) { + case version_compare ($requestFormat , '0.12.0', '<') : + Request::setFilter(new V12()); + break; + default: + Request::setFilter(null); + } + } else { + Request::setFilter(null); + } + $domain = $request->getHostname(); $domains = Config::getParam('domains', []); if (!array_key_exists($domain, $domains)) { @@ -82,12 +103,9 @@ App::init(function ($utopia, $request, $response, $console, $project, $dbForCons } $localeParam = (string) $request->getParam('locale', $request->getHeader('x-appwrite-locale', '')); - if (\in_array($localeParam, Config::getParam('locale-codes'))) { $locale->setDefault($localeParam); - }; - - $route = $utopia->match($request); + } if ($project->isEmpty()) { throw new Exception('Project not found', 404); @@ -149,6 +167,8 @@ App::init(function ($utopia, $request, $response, $console, $project, $dbForCons break; case version_compare ($responseFormat , '0.8.0', '<=') : Response::setFilter(new V08()); + case version_compare ($responseFormat , '0.11.0', '<=') : + Response::setFilter(new V11()); break; default: Response::setFilter(null); @@ -285,7 +305,7 @@ App::init(function ($utopia, $request, $response, $console, $project, $dbForCons }, ['utopia', 'request', 'response', 'console', 'project', 'dbForConsole', 'user', 'locale', 'clients']); App::options(function ($request, $response) { - /** @var Utopia\Swoole\Request $request */ + /** @var Appwrite\Utopia\Request $request */ /** @var Appwrite\Utopia\Response $response */ $origin = $request->getOrigin(); @@ -303,7 +323,7 @@ App::options(function ($request, $response) { App::error(function ($error, $utopia, $request, $response, $layout, $project, $logger, $loggerBreadcrumbs) { /** @var Exception $error */ /** @var Utopia\App $utopia */ - /** @var Utopia\Swoole\Request $request */ + /** @var Appwrite\Utopia\Request $request */ /** @var Appwrite\Utopia\Response $response */ /** @var Appwrite\Utopia\View $layout */ /** @var Utopia\Database\Document $project */ diff --git a/app/controllers/mock.php b/app/controllers/mock.php index 5020614ba..ab9cbfc8e 100644 --- a/app/controllers/mock.php +++ b/app/controllers/mock.php @@ -205,7 +205,7 @@ App::get('/v1/mock/tests/general/download') ->label('sdk.mock', true) ->inject('response') ->action(function ($response) { - /** @var Utopia\Swoole\Request $request */ + /** @var Appwrite\Utopia\Request $request */ $response ->setContentType('text/plain') @@ -236,7 +236,7 @@ App::post('/v1/mock/tests/general/upload') ->inject('request') ->inject('response') ->action(function ($x, $y, $z, $file, $request, $response) { - /** @var Utopia\Swoole\Request $request */ + /** @var Appwrite\Utopia\Request $request */ /** @var Utopia\Swoole\Response $response */ $file = $request->getFiles('file'); @@ -373,7 +373,7 @@ App::get('/v1/mock/tests/general/get-cookie') ->label('sdk.mock', true) ->inject('request') ->action(function ($request) { - /** @var Utopia\Swoole\Request $request */ + /** @var Appwrite\Utopia\Request $request */ if ($request->getCookie('cookieName', '') !== 'cookieValue') { throw new Exception('Missing cookie value', 400); @@ -551,7 +551,7 @@ App::get('/v1/mock/tests/general/oauth2/failure') App::shutdown(function($utopia, $response, $request) { /** @var Utopia\App $utopia */ - /** @var Utopia\Swoole\Request $request */ + /** @var Appwrite\Utopia\Request $request */ /** @var Appwrite\Utopia\Response $response */ $result = []; diff --git a/app/controllers/shared/api.php b/app/controllers/shared/api.php index 990b6280c..47b1b9a4d 100644 --- a/app/controllers/shared/api.php +++ b/app/controllers/shared/api.php @@ -13,7 +13,7 @@ use Utopia\Storage\Storage; App::init(function ($utopia, $request, $response, $project, $user, $events, $audits, $usage, $deletes, $database, $dbForProject, $mode) { /** @var Utopia\App $utopia */ - /** @var Utopia\Swoole\Request $request */ + /** @var Appwrite\Utopia\Request $request */ /** @var Appwrite\Utopia\Response $response */ /** @var Utopia\Database\Document $project */ /** @var Utopia\Database\Document $user */ @@ -134,7 +134,7 @@ App::init(function ($utopia, $request, $response, $project, $user, $events, $aud App::init(function ($utopia, $request, $project) { /** @var Utopia\App $utopia */ - /** @var Utopia\Swoole\Request $request */ + /** @var Appwrite\Utopia\Request $request */ /** @var Utopia\Database\Document $project */ $route = $utopia->match($request); @@ -187,7 +187,7 @@ App::init(function ($utopia, $request, $project) { App::shutdown(function ($utopia, $request, $response, $project, $events, $audits, $usage, $deletes, $database, $mode) { /** @var Utopia\App $utopia */ - /** @var Utopia\Swoole\Request $request */ + /** @var Appwrite\Utopia\Request $request */ /** @var Appwrite\Utopia\Response $response */ /** @var Utopia\Database\Document $project */ /** @var Appwrite\Event\Event $events */ diff --git a/app/controllers/shared/web.php b/app/controllers/shared/web.php index 37bfb0130..e45333808 100644 --- a/app/controllers/shared/web.php +++ b/app/controllers/shared/web.php @@ -5,7 +5,7 @@ use Utopia\Config\Config; App::init(function ($utopia, $request, $response, $layout) { /** @var Utopia\App $utopia */ - /** @var Utopia\Swoole\Request $request */ + /** @var Appwrite\Utopia\Request $request */ /** @var Appwrite\Utopia\Response $response */ /** @var Appwrite\Utopia\View $layout */ diff --git a/app/http.php b/app/http.php index d37bcbf9a..a73daa256 100644 --- a/app/http.php +++ b/app/http.php @@ -15,7 +15,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; use Utopia\Logger\Log; use Utopia\Logger\Log\User; diff --git a/app/init.php b/app/init.php index 89f2361d2..632a733c8 100644 --- a/app/init.php +++ b/app/init.php @@ -664,7 +664,7 @@ App::setResource('clients', function ($request, $console, $project) { }, ['request', 'console', 'project']); App::setResource('user', function($mode, $project, $console, $request, $response, $dbForProject, $dbForConsole) { - /** @var Utopia\Swoole\Request $request */ + /** @var Appwrite\Utopia\Request $request */ /** @var Appwrite\Utopia\Response $response */ /** @var Utopia\Database\Document $project */ /** @var Utopia\Database\Database $dbForProject */ @@ -748,7 +748,7 @@ App::setResource('user', function($mode, $project, $console, $request, $response }, ['mode', 'project', 'console', 'request', 'response', 'dbForProject', 'dbForConsole']); App::setResource('project', function($dbForConsole, $request, $console) { - /** @var Utopia\Swoole\Request $request */ + /** @var Appwrite\Utopia\Request $request */ /** @var Utopia\Database\Database $dbForConsole */ /** @var Utopia\Database\Document $console */ @@ -828,7 +828,7 @@ App::setResource('dbForConsole', function($db, $cache) { }, ['db', 'cache']); App::setResource('mode', function($request) { - /** @var Utopia\Swoole\Request $request */ + /** @var Appwrite\Utopia\Request $request */ /** * Defines the mode for the request: diff --git a/app/realtime.php b/app/realtime.php index 633fb114a..9acb37570 100644 --- a/app/realtime.php +++ b/app/realtime.php @@ -23,7 +23,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.json b/composer.json index 2c346d806..28b1c0f3e 100644 --- a/composer.json +++ b/composer.json @@ -38,7 +38,7 @@ "appwrite/php-clamav": "1.1.*", "appwrite/php-runtimes": "0.6.*", - "utopia-php/framework": "0.19.*", + "utopia-php/framework": "0.19.5", "utopia-php/logger": "0.1.*", "utopia-php/abuse": "0.7.*", "utopia-php/analytics": "0.2.*", @@ -66,7 +66,6 @@ "adhocore/jwt": "1.1.2", "slickdeals/statsd": "3.1.0" }, - "repositories": [], "require-dev": { "appwrite/sdk-generator": "0.17.0", "phpunit/phpunit": "9.5.10", diff --git a/composer.lock b/composer.lock index 1c2967993..55c39bc51 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "c602e99a298c00b57253651a3108a6df", + "content-hash": "d32b727a743b3a8811ec64c56f308694", "packages": [ { "name": "adhocore/jwt", @@ -2255,17 +2255,11 @@ }, { "name": "utopia-php/framework", - "version": "0.19.4", + "version": "dev-fix-get-args-after-init", "source": { "type": "git", - "url": "https://github.com/utopia-php/framework.git", - "reference": "b1c79f199a6adbf8526cea272d931213a8eb511d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/utopia-php/framework/zipball/b1c79f199a6adbf8526cea272d931213a8eb511d", - "reference": "b1c79f199a6adbf8526cea272d931213a8eb511d", - "shasum": "" + "url": "https://github.com/utopia-php/framework", + "reference": "36a42dce039f043288673f0ff46284353543624d" }, "require": { "php": ">=8.0.0" @@ -2280,7 +2274,6 @@ "Utopia\\": "src/" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -2296,11 +2289,7 @@ "php", "upf" ], - "support": { - "issues": "https://github.com/utopia-php/framework/issues", - "source": "https://github.com/utopia-php/framework/tree/0.19.4" - }, - "time": "2021-12-29T15:05:19+00:00" + "time": "2022-01-03T08:38:34+00:00" }, { "name": "utopia-php/image", @@ -3080,16 +3069,16 @@ }, { "name": "appwrite/sdk-generator", - "version": "0.17.0", + "version": "0.16.3", "source": { "type": "git", "url": "https://github.com/appwrite/sdk-generator.git", - "reference": "a68e072170a81532cfb0ff914864d8f074a73a37" + "reference": "6185cdfe4c4261287240639f3a7fdc05e7ae2337" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/appwrite/sdk-generator/zipball/a68e072170a81532cfb0ff914864d8f074a73a37", - "reference": "a68e072170a81532cfb0ff914864d8f074a73a37", + "url": "https://api.github.com/repos/appwrite/sdk-generator/zipball/6185cdfe4c4261287240639f3a7fdc05e7ae2337", + "reference": "6185cdfe4c4261287240639f3a7fdc05e7ae2337", "shasum": "" }, "require": { @@ -3123,9 +3112,9 @@ "description": "Appwrite PHP library for generating API SDKs for multiple programming languages and platforms", "support": { "issues": "https://github.com/appwrite/sdk-generator/issues", - "source": "https://github.com/appwrite/sdk-generator/tree/0.17.0" + "source": "https://github.com/appwrite/sdk-generator/tree/0.16.3" }, - "time": "2022-01-04T09:24:44+00:00" + "time": "2021-12-16T23:56:47+00:00" }, { "name": "composer/pcre", @@ -6639,9 +6628,18 @@ "time": "2015-12-17T08:42:14+00:00" } ], - "aliases": [], + "aliases": [ + { + "package": "utopia-php/framework", + "version": "dev-fix-get-args-after-init", + "alias": "0.19", + "alias_normalized": "0.19.0.0" + } + ], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": { + "utopia-php/framework": 20 + }, "prefer-stable": false, "prefer-lowest": false, "platform": { diff --git a/src/Appwrite/Utopia/Request.php b/src/Appwrite/Utopia/Request.php new file mode 100644 index 000000000..d6ad3d8a8 --- /dev/null +++ b/src/Appwrite/Utopia/Request.php @@ -0,0 +1,128 @@ +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'); + $requestParameters = self::getFilter()->parse($requestParameters, $endpointIdentifier); + } + + 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/Request/Filter.php b/src/Appwrite/Utopia/Request/Filter.php new file mode 100644 index 000000000..9f3e94bb3 --- /dev/null +++ b/src/Appwrite/Utopia/Request/Filter.php @@ -0,0 +1,17 @@ + Custom IDs + case "account.create": + case "account.createMagicURLSession": + case "users.create": + $content = $this->addId($content, 'userId'); + break; + case "functions.create": + $content = $this->addId($content, 'functionId'); + break; + case "teams.create": + $content = $this->addId($content, 'teamId'); + break; + + // Status integer -> boolean + case "users.updateStatus": + $content = $this->convertStatus($content); + break; + + // Deprecating order type + case "functions.listExecutions": + $content = $this->removeOrderType($content); + break; + + // The rest (more complex) formats + case "database.createDocument": + $content = $this->addId($content, 'documentId'); + $content = $this->removeParentProperties($content); + break; + case "database.listDocuments": + $content = $this->removeOrderCast($content); + $content = $this->convertOrder($content); + $content = $this->convertQueries($content); + break; + case "database.createCollection": + $content = $this->addId($content, 'collectionId'); + $content = $this->removeRules($content); + $content = $this->addCollectionPermissionLevel($content); + break; + case "database.updateCollection": + $content = $this->removeRules($content); + $content = $this->addCollectionPermissionLevel($content); + break; + } + + return $content; + } + + // New parameters + + protected function addId(array $content, string $key): array + { + $content[$key] = 'unique()'; + return $content; + } + + protected function addCollectionPermissionLevel(array $content): array + { + $content['permission'] = 'document'; + return $content; + } + + // Deprecated parameters + + protected function removeRules(array $content): array + { + unset($content['rules']); + return $content; + } + + protected function removeOrderType(array $content): array + { + unset($content['orderType']); + return $content; + } + + protected function removeOrderCast(array $content): array + { + unset($content['orderCast']); + return $content; + } + + protected function removeParentProperties(array $content): array + { + if (isset($content['parentDocument'])) unset($content['parentDocument']); + if (isset($content['parentProperty'])) unset($content['parentProperty']); + if (isset($content['parentPropertyType'])) unset($content['parentPropertyType']); + return $content; + } + + // Modified parameters + + protected function convertStatus(array $content): array + { + if (isset($content['status'])) { + $content['status'] = $content['status'] === 2 ? false : true; + } + return $content; + } + + protected function convertOrder(array $content): array + { + if (isset($content['orderField'])) { + $content['orderAttributes'] = [ $content['orderField'] ]; + unset($content['orderField']); + } + + if (isset($content['orderType'])) { + $content['orderTypes'] = [ $content['orderType'] ]; + unset($content['orderType']); + } + + return $content; + } + + protected function convertQueries(array $content): array + { + $queries = []; + + if(!empty($content['filters'])) { + foreach ($content['filters'] as $filter) { + $operators = ['=' => 'equal', '!=' => 'notEqual', '>' => 'greater', '<' => 'lesser', '<=' => 'lesserEqual', '>=' => 'greaterEqual']; + foreach ($operators as $operator => $operatorVerbose) { + if (\str_contains($filter, $operator)) { + $usedOperator = $operator; + break; + } + } + + if(isset($usedOperator)) { + [ $attributeKey, $filterValue ] = \explode($usedOperator, $filter); + + $filterValue = \is_numeric($filterValue) ? $filterValue : '"' . $filterValue . '"'; + $query = $attributeKey . '.' . $operators[$usedOperator] . '(' . $filterValue . ')'; + \array_push($queries, $query); + } + } + } + + // We cannot migrate search properly + unset($content['search']); + + unset($content['filters']); + unset($content['search']); + $content['queries'] = $queries; + + return $content; + } +} 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/src/Appwrite/Utopia/Response/Filters/V11.php b/src/Appwrite/Utopia/Response/Filters/V11.php new file mode 100644 index 000000000..805e2a09c --- /dev/null +++ b/src/Appwrite/Utopia/Response/Filters/V11.php @@ -0,0 +1,402 @@ +parsePermissions($content); + break; + case Response::MODEL_DOCUMENT_LIST: + $parsedResponse = $this->parseDocumentList($content); + break; + + case Response::MODEL_FILE: + $parsedResponse = $this->parsePermissions($content); + break; + case Response::MODEL_FILE_LIST: + $parsedResponse = $this->parseFileList($content); + break; + + case Response::MODEL_EXECUTION: + $parsedResponse = $this->parseExecutionPermissions($content); + break; + case Response::MODEL_EXECUTION_LIST: + $parsedResponse = $this->parseExecutionsList($content); + break; + + case Response::MODEL_FUNCTION: + $parsedResponse = $this->parseFunctionPermissions($content); + break; + case Response::MODEL_FUNCTION_LIST: + $parsedResponse = $this->parseFunctionsList($content); + break; + + // Convert status from boolean to int + case Response::MODEL_USER: + $parsedResponse = $this->parseStatus($content); + break; + case Response::MODEL_USER_LIST: + $parsedResponse = $this->parseUserList($content); + break; + + // Convert all Health responses back to original + case Response::MODEL_HEALTH_STATUS: + $parsedResponse = $this->parseHealthStatus($content); + break; + case Response::MODEL_HEALTH_VERSION: + $parsedResponse = $this->parseHealthVersion($content); + break; + case Response::MODEL_HEALTH_TIME: + $parsedResponse = $this->parseHealthTime($content); + break; + case Response::MODEL_HEALTH_QUEUE: + $parsedResponse = $this->parseHealthQueue($content); + break; + case Response::MODEL_HEALTH_ANTIVIRUS: + $parsedResponse = $this->parseHealthAntivirus($content); + break; + + // Complex filters + case Response::MODEL_COLLECTION: + $parsedResponse = $this->parseCollection($content); + break; + case Response::MODEL_COLLECTION_LIST: + $parsedResponse = $this->parseCollectionList($content); + break; + + case Response::MODEL_LOG: + $parsedResponse = $this->parseLog($content); + break; + case Response::MODEL_LOG_LIST: + $parsedResponse = $this->parseLogList($content); + break; + + case Response::MODEL_PROJECT: + $parsedResponse = $this->parseProject($content); + break; + case Response::MODEL_PROJECT_LIST: + $parsedResponse = $this->parseProjectList($content); + break; + } + + return $parsedResponse; + } + + protected function parseDocumentList(array $content) + { + $documents = $content['documents']; + $parsedResponse = []; + foreach ($documents as $document) { + $parsedResponse[] = $this->parsePermissions($document); + } + $content['documents'] = $parsedResponse; + return $content; + } + + protected function parseFileList(array $content) + { + $files = $content['files']; + $parsedResponse = []; + foreach ($files as $file) { + $parsedResponse[] = $this->parsePermissions($file); + } + $content['files'] = $parsedResponse; + return $content; + } + + protected function parseExecutionsList(array $content) + { + $executions = $content['executions']; + $parsedResponse = []; + foreach ($executions as $execution) { + $parsedResponse[] = $this->parseExecutionPermissions($execution); + } + $content['executions'] = $parsedResponse; + return $content; + } + + protected function parseFunctionsList(array $content) + { + $functions = $content['functions']; + $parsedResponse = []; + foreach ($functions as $function) { + $parsedResponse[] = $this->parseFunctionPermissions($function); + } + $content['functions'] = $parsedResponse; + return $content; + } + + protected function parseUserList(array $content) + { + $users = $content['users']; + $parsedResponse = []; + foreach ($users as $user) { + $parsedResponse[] = $this->parseStatus($user); + } + $content['users'] = $parsedResponse; + return $content; + } + + protected function parseCollection(array $content) + { + $parsedResponse = []; + $parsedResponse = $this->parsePermissions($content); + $parsedResponse = $this->removeRule($content, 'enabled'); + $parsedResponse = $this->removeRule($content, 'permission'); + $parsedResponse = $this->removeRule($content, 'indexes'); + $parsedResponse = $this->removeRule($content, 'enabled'); + $parsedResponse = $this->addDate($content, 'dateCreated'); + $parsedResponse = $this->addDate($content, 'dateUpdated'); + $parsedResponse = $this->parseAttributes($content); + return $parsedResponse; + } + + protected function parseCollectionList(array $content) + { + $collections = $content['collections']; + $parsedResponse = []; + foreach ($collections as $collection) { + $parsedResponse[] = $this->parseCollection($collection); + } + $content['collections'] = $parsedResponse; + return $content; + } + + protected function parseLog(array $content) + { + $parsedResponse = []; + $parsedResponse = $this->removeRule($content, 'userId'); + $parsedResponse = $this->removeRule($content, 'userEmail'); + $parsedResponse = $this->removeRule($content, 'userName'); + $parsedResponse = $this->removeRule($content, 'mode'); + $parsedResponse = $this->removeRule($content, 'sum'); + return $parsedResponse; + } + + protected function parseLogList(array $content) + { + $logs = $content['logs']; + $parsedResponse = []; + foreach ($logs as $log) { + $parsedResponse[] = $this->parseLog($log); + } + $content['logs'] = $parsedResponse; + return $content; + } + + protected function parseProject(array $content) + { + $parsedResponse = []; + $parsedResponse = $this->addTasks($content); + $parsedResponse = $this->parseAuthLimit($content); + $parsedResponse = $this->parseOAuths($content); + $parsedResponse = $this->parseAuthsStatus($content); + $parsedResponse = $this->removeServicesStatus($content); + return $parsedResponse; + } + + protected function parseProjectList(array $content) + { + $projects = $content['projects']; + $parsedResponse = []; + foreach ($projects as $project) { + $parsedResponse[] = $this->parseProject($project); + } + $content['projects'] = $parsedResponse; + return $content; + } + + protected function parseHealthAntivirus(array $content) + { + if($content['status'] === 'pass') { + $content['status'] = 'online'; + } + + if($content['status'] === 'fail') { + $content['status'] = 'offline'; + } + + return $content; + } + + protected function parseHealthTime(array $content) + { + $content['remote'] = $content['remoteTime']; + unset($content['remoteTime']); + + $content['local'] = $content['localTime']; + unset($content['localTime']); + + return $content; + } + + protected function parseHealthVersion(array $content) + { + // Did not change + + return $content; + } + + + protected function parseHealthQueue(array $content) + { + // Did not change + + return $content; + } + + protected function parseHealthStatus(array $content) + { + $content['status'] = 'OK'; // Is always returning pass, was always returning OK + unset($content['ping']); + + return $content; + } + + protected function parseStatus(array $content) + { + $content['status'] = $content['status'] === true ? + $content['emailVerification'] === true ? 1 : 0 + : 2; + + return $content; + } + + protected function parseAttributes(array $content) + { + $content['rules'] = \array_map(function($attribute) use($content) { + return [ + '$id' => $attribute['key'], + '$collection' => $content['$id'], + 'type' => $attribute['type'], + 'key' => $attribute['key'], + 'label' => $attribute['key'], + 'default' => $attribute['default'], + 'array' => $attribute['array'], + 'required' => $attribute['required'], + 'list' => $attribute['elements'], + ]; + }, $content['attributes']); + unset($content['attributes']); + + return $content; + } + + protected function parseAuthLimit(array $content) + { + $content['usersAuthLimit'] = $content['authLimit']; + unset($content['authLimit']); + + return $content; + } + + protected function parseOAuths(array $content) + { + $regexPattern = "/provider([a-zA-Z0-9]+)(Appid|Secret)/"; + + foreach ($content as $key => $value) { + \preg_match_all($regexPattern, $key, $regexGroups); + if(\count($regexGroups[1]) > 0 && \count($regexGroups[2]) > 0) { + $providerName = $regexGroups[1][0]; + $valueKey = $regexGroups[2][0]; + $content['usersOauth2' . $providerName . $valueKey] = $value; + unset($content['provider' . $providerName . $valueKey]); + } + } + + return $content; + } + + protected function parseAuthsStatus(array $content) + { + $regexPattern = "/auth([a-zA-Z0-9]+)/"; + + foreach ($content as $key => $value) { + \preg_match_all($regexPattern, $key, $regexGroups); + if(\count($regexGroups[1]) > 0) { + $providerName = $regexGroups[1][0]; + + $content[$providerName] = $value; + unset($content['auth' . $providerName]); + } + } + + return $content; + } + + protected function removeServicesStatus(array $content) + { + // Such a key is part of new response, but is not part of old one. We simply remove it, older version never + // expected it anyway. + foreach ($content as $key => $value) { + if(\str_starts_with($key, 'serviceStatusFor')) { + unset($content[$key]); + } + } + + return $content; + } + + protected function removeRule(array $content, $key) + { + // Such a key is part of new response, but is not part of old one. We simply remove it, older version never + // expected it anyway. + unset($content[$key]); + + return $content; + } + + protected function addDate(array $content, $key) + { + // We simply don't have the date available in the content anymore. + // We set it to valid integer that indicates the value is not right + $content[$key] = 0; + + return $content; + } + + protected function addTasks(array $content) + { + // We simply don't have the date available in the content anymore. + // We set it to valid array + $content['tasks'] = []; + + return $content; + } + + protected function parsePermissions(array $content) + { + $content['$permissions'] = [ 'read' => $content['$read'], 'write' => $content['$write'] ]; + unset($content['$read']); + unset($content['$write']); + return $content; + } + + protected function parseFunctionPermissions(array $content) + { + $content['$permissions'] = [ 'execute' => $content['execute'] ]; + unset($content['execute']); + + return $content; + } + + protected function parseExecutionPermissions(array $content) + { + $content['$permissions'] = [ 'read' => $content['$read'] ]; + unset($content['$read']); + + return $content; + } +} diff --git a/tests/e2e/General/HTTPTest.php b/tests/e2e/General/HTTPTest.php index 9129d7b4b..a83237928 100644 --- a/tests/e2e/General/HTTPTest.php +++ b/tests/e2e/General/HTTPTest.php @@ -18,7 +18,7 @@ class HTTPTest extends Scope /** * Test for SUCCESS */ - $response = $this->client->call(Client::METHOD_OPTIONS, '/', array_merge([ + $response = $this->client->call(Client::METHOD_OPTIONS, '/', \array_merge([ 'origin' => 'http://localhost', 'content-type' => 'application/json', ]), []); @@ -38,7 +38,7 @@ class HTTPTest extends Scope /** * Test for SUCCESS */ - $response = $this->client->call(Client::METHOD_GET, '/error', array_merge([ + $response = $this->client->call(Client::METHOD_GET, '/error', \array_merge([ 'origin' => 'http://localhost', 'content-type' => 'application/json', ]), []); @@ -54,7 +54,7 @@ class HTTPTest extends Scope /** * Test for SUCCESS */ - $response = $this->client->call(Client::METHOD_GET, '/manifest.json', array_merge([ + $response = $this->client->call(Client::METHOD_GET, '/manifest.json', \array_merge([ 'origin' => 'http://localhost', 'content-type' => 'application/json', ]), []); @@ -73,7 +73,7 @@ class HTTPTest extends Scope /** * Test for SUCCESS */ - $response = $this->client->call(Client::METHOD_GET, '/humans.txt', array_merge([ + $response = $this->client->call(Client::METHOD_GET, '/humans.txt', \array_merge([ 'origin' => 'http://localhost', ]), []); @@ -86,7 +86,7 @@ class HTTPTest extends Scope /** * Test for SUCCESS */ - $response = $this->client->call(Client::METHOD_GET, '/robots.txt', array_merge([ + $response = $this->client->call(Client::METHOD_GET, '/robots.txt', \array_merge([ 'origin' => 'http://localhost', ]), []); @@ -165,7 +165,7 @@ class HTTPTest extends Scope /** * Test without header */ - $response = $this->client->call(Client::METHOD_GET, '/locale/continents', array_merge([ + $response = $this->client->call(Client::METHOD_GET, '/locale/continents', \array_merge([ 'content-type' => 'application/json', 'x-appwrite-project' => 'console', ], $this->getHeaders())); @@ -183,7 +183,7 @@ class HTTPTest extends Scope /** * Test with header */ - $response = $this->client->call(Client::METHOD_GET, '/locale/continents', array_merge([ + $response = $this->client->call(Client::METHOD_GET, '/locale/continents', \array_merge([ 'content-type' => 'application/json', 'x-appwrite-project' => 'console', 'x-appwrite-response-format' => '0.6.2' @@ -202,7 +202,7 @@ class HTTPTest extends Scope /** * Test without header */ - $response = $this->client->call(Client::METHOD_GET, '/versions', array_merge([ + $response = $this->client->call(Client::METHOD_GET, '/versions', \array_merge([ 'content-type' => 'application/json', ], $this->getHeaders())); diff --git a/tests/e2e/Services/Health/HealthCustomServerTest.php b/tests/e2e/Services/Health/HealthCustomServerTest.php index f7483d797..a15e456e5 100644 --- a/tests/e2e/Services/Health/HealthCustomServerTest.php +++ b/tests/e2e/Services/Health/HealthCustomServerTest.php @@ -158,7 +158,7 @@ class HealthCustomServerTest extends Scope $this->assertEquals(200, $response['headers']['status-code']); $this->assertIsInt($response['body']['size']); - $this->assertLessThan(160, $response['body']['size']); + $this->assertLessThan(200, $response['body']['size']); /** * Test for FAILURE diff --git a/tests/e2e/Services/Teams/TeamsConsoleClientTest.php b/tests/e2e/Services/Teams/TeamsConsoleClientTest.php index 7ced83c4e..7b7e24aee 100644 --- a/tests/e2e/Services/Teams/TeamsConsoleClientTest.php +++ b/tests/e2e/Services/Teams/TeamsConsoleClientTest.php @@ -2,6 +2,7 @@ namespace Tests\E2E\Services\Teams; +use Tests\E2E\Client; use Tests\E2E\Scopes\Scope; use Tests\E2E\Scopes\ProjectConsole; use Tests\E2E\Scopes\SideClient; @@ -12,4 +13,52 @@ class TeamsConsoleClientTest extends Scope use TeamsBaseClient; use ProjectConsole; use SideClient; + + public function testRequestHeader() { + /** + * Test without header + */ + $response = $this->client->call(Client::METHOD_POST, '/teams', \array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => 'console' + ], $this->getHeaders()), [ + 'name' => 'Latest version Team', + 'teamId' => 'unique()' + ]); + + $this->assertEquals(201, $response['headers']['status-code']); + $team1Id = $response['body']['$id']; + + /** + * Test with header + */ + $response = $this->client->call(Client::METHOD_POST, '/teams', \array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => 'console', + 'x-appwrite-response-format' => '0.11.0' + ], $this->getHeaders()), [ + 'name' => 'Latest version Team' + // Notice "teamId' is not defined + ]); + + $this->assertEquals(201, $response['headers']['status-code']); + $team2Id = $response['body']['$id']; + + /** + * Cleanup, so I don't invalidate some listTeams requests by mistake + */ + $response = $this->client->call(Client::METHOD_DELETE, '/teams/' . $team1Id, \array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => 'console', + ], $this->getHeaders())); + + $this->assertEquals(204, $response['headers']['status-code']); + + $response = $this->client->call(Client::METHOD_DELETE, '/teams/' . $team2Id, \array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => 'console', + ], $this->getHeaders())); + + $this->assertEquals(204, $response['headers']['status-code']); + } } \ No newline at end of file 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