diff --git a/app/controllers/general.php b/app/controllers/general.php index e972dccc36..8b0fbf8e09 100644 --- a/app/controllers/general.php +++ b/app/controllers/general.php @@ -47,7 +47,7 @@ App::init(function ($utopia, $request, $response, $console, $project, $dbForCons $requestFormat = $request->getHeader('x-appwrite-response-format', App::getEnv('_APP_SYSTEM_RESPONSE_FORMAT', '')); if ($requestFormat) { switch($requestFormat) { - case version_compare ($requestFormat , '0.11.0', '<=') : + case version_compare ($requestFormat , '0.12.0', '<') : Request::setFilter(new V12()); break; default: diff --git a/composer.json b/composer.json index fd744ed374..c60f897cee 100644 --- a/composer.json +++ b/composer.json @@ -38,7 +38,7 @@ "appwrite/php-clamav": "1.1.*", "appwrite/php-runtimes": "0.6.*", - "utopia-php/framework": "dev-fix-get-args-after-init", + "utopia-php/framework": "dev-fix-get-args-after-init as 0.19", "utopia-php/logger": "0.1.*", "utopia-php/abuse": "0.7.*", "utopia-php/analytics": "0.2.*", diff --git a/composer.lock b/composer.lock index 7fb2cd49a5..55c39bc517 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": "e0243d2a276d074c4af4ac21f521c953", + "content-hash": "d32b727a743b3a8811ec64c56f308694", "packages": [ { "name": "adhocore/jwt", @@ -2138,16 +2138,16 @@ }, { "name": "utopia-php/database", - "version": "0.13.1", + "version": "0.13.2", "source": { "type": "git", "url": "https://github.com/utopia-php/database.git", - "reference": "a1b2849c991b6384fe70e3c2d0633256a4fb795b" + "reference": "bf92279b707b3a10ee5ec5df5c065023b2221357" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/database/zipball/a1b2849c991b6384fe70e3c2d0633256a4fb795b", - "reference": "a1b2849c991b6384fe70e3c2d0633256a4fb795b", + "url": "https://api.github.com/repos/utopia-php/database/zipball/bf92279b707b3a10ee5ec5df5c065023b2221357", + "reference": "bf92279b707b3a10ee5ec5df5c065023b2221357", "shasum": "" }, "require": { @@ -2195,9 +2195,9 @@ ], "support": { "issues": "https://github.com/utopia-php/database/issues", - "source": "https://github.com/utopia-php/database/tree/0.13.1" + "source": "https://github.com/utopia-php/database/tree/0.13.2" }, - "time": "2021-12-29T14:04:55+00:00" + "time": "2022-01-04T10:51:22+00:00" }, { "name": "utopia-php/domains", @@ -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", @@ -3200,16 +3189,16 @@ }, { "name": "composer/semver", - "version": "3.2.6", + "version": "3.2.7", "source": { "type": "git", "url": "https://github.com/composer/semver.git", - "reference": "83e511e247de329283478496f7a1e114c9517506" + "reference": "deac27056b57e46faf136fae7b449eeaa71661ee" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/83e511e247de329283478496f7a1e114c9517506", - "reference": "83e511e247de329283478496f7a1e114c9517506", + "url": "https://api.github.com/repos/composer/semver/zipball/deac27056b57e46faf136fae7b449eeaa71661ee", + "reference": "deac27056b57e46faf136fae7b449eeaa71661ee", "shasum": "" }, "require": { @@ -3261,7 +3250,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.2.6" + "source": "https://github.com/composer/semver/tree/3.2.7" }, "funding": [ { @@ -3277,7 +3266,7 @@ "type": "tidelift" } ], - "time": "2021-10-25T11:34:17+00:00" + "time": "2022-01-04T09:57:54+00:00" }, { "name": "composer/xdebug-handler", @@ -6059,6 +6048,82 @@ ], "time": "2021-05-27T12:26:48+00:00" }, + { + "name": "symfony/polyfill-php72", + "version": "v1.23.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php72.git", + "reference": "9a142215a36a3888e30d0a9eeea9766764e96976" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/9a142215a36a3888e30d0a9eeea9766764e96976", + "reference": "9a142215a36a3888e30d0a9eeea9766764e96976", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php72\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php72/tree/v1.23.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-27T09:17:38+00:00" + }, { "name": "symfony/service-contracts", "version": "v3.0.0", @@ -6327,22 +6392,23 @@ }, { "name": "twig/twig", - "version": "v2.14.8", + "version": "v2.14.10", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "06b450a2326aa879faa2061ff72fe1588b3ab043" + "reference": "95fb194cd4dd6ac373a27af2bde2bad5d3f27aba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/06b450a2326aa879faa2061ff72fe1588b3ab043", - "reference": "06b450a2326aa879faa2061ff72fe1588b3ab043", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/95fb194cd4dd6ac373a27af2bde2bad5d3f27aba", + "reference": "95fb194cd4dd6ac373a27af2bde2bad5d3f27aba", "shasum": "" }, "require": { - "php": ">=7.2.5", + "php": ">=7.1.3", "symfony/polyfill-ctype": "^1.8", - "symfony/polyfill-mbstring": "^1.3" + "symfony/polyfill-mbstring": "^1.3", + "symfony/polyfill-php72": "^1.8" }, "require-dev": { "psr/container": "^1.0", @@ -6390,7 +6456,7 @@ ], "support": { "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v2.14.8" + "source": "https://github.com/twigphp/Twig/tree/v2.14.10" }, "funding": [ { @@ -6402,7 +6468,7 @@ "type": "tidelift" } ], - "time": "2021-11-25T13:38:06+00:00" + "time": "2022-01-03T21:13:26+00:00" }, { "name": "vimeo/psalm", @@ -6562,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 index 98dfffc0ea..d6ad3d8a85 100644 --- a/src/Appwrite/Utopia/Request.php +++ b/src/Appwrite/Utopia/Request.php @@ -28,39 +28,6 @@ class Request extends UtopiaRequest parent::__construct($request); } - /** - * 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); - } - - 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; - } - } - /** * Get Params * @@ -88,10 +55,10 @@ class Request extends UtopiaRequest 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; + $requestParameters = self::getFilter()->parse($requestParameters, $endpointIdentifier); } + + return $requestParameters; } diff --git a/src/Appwrite/Utopia/Request/Filters/V12.php b/src/Appwrite/Utopia/Request/Filters/V12.php index 4f8c4bc9dd..b06a561591 100644 --- a/src/Appwrite/Utopia/Request/Filters/V12.php +++ b/src/Appwrite/Utopia/Request/Filters/V12.php @@ -93,9 +93,9 @@ class V12 extends Filter protected function removeParentProperties(array $content): array { - unset($content['parentDocument']); - unset($content['parentProperty']); - unset($content['parentPropertyType']); + if (isset($content['parentDocument'])) unset($content['parentDocument']); + if (isset($content['parentProperty'])) unset($content['parentProperty']); + if (isset($content['parentPropertyType'])) unset($content['parentPropertyType']); return $content; } @@ -103,17 +103,23 @@ class V12 extends Filter protected function convertStatus(array $content): array { - $content['status'] = $content['status'] === 2 ? false : true; + if (isset($content['status'])) { + $content['status'] = $content['status'] === 2 ? false : true; + } return $content; } protected function convertOrder(array $content): array { - $content['orderAttributes'] = [ $content['orderField'] ]; - $content['orderTypes'] = [ $content['orderType'] ]; + if (isset($content['orderField'])) { + $content['orderAttributes'] = [ $content['orderField'] ]; + unset($content['orderField']); + } - unset($content['orderField']); - unset($content['orderType']); + if (isset($content['orderType'])) { + $content['orderTypes'] = [ $content['orderType'] ]; + unset($content['orderType']); + } return $content; } diff --git a/src/Appwrite/Utopia/Response/Filters/V11.php b/src/Appwrite/Utopia/Response/Filters/V11.php index d0e689012e..805e2a09c4 100644 --- a/src/Appwrite/Utopia/Response/Filters/V11.php +++ b/src/Appwrite/Utopia/Response/Filters/V11.php @@ -16,19 +16,41 @@ class V11 extends Filter switch ($model) { // Update permissions case Response::MODEL_DOCUMENT: + $parsedResponse = $this->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); @@ -48,32 +70,154 @@ class V11 extends Filter // Complex filters case Response::MODEL_COLLECTION: - $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); + $parsedResponse = $this->parseCollection($content); + break; + case Response::MODEL_COLLECTION_LIST: + $parsedResponse = $this->parseCollectionList($content); + break; + case Response::MODEL_LOG: - $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'); + $parsedResponse = $this->parseLog($content); + break; + case Response::MODEL_LOG_LIST: + $parsedResponse = $this->parseLogList($content); + break; + case Response::MODEL_PROJECT: - $parsedResponse = $this->addTasks($content); - $parsedResponse = $this->parseAuthLimit($content); - $parsedResponse = $this->parseOAuths($content); - $parsedResponse = $this->parseAuthsStatus($content); - $parsedResponse = $this->removeServicesStatus($content); + $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') { @@ -237,7 +381,6 @@ class V11 extends Filter $content['$permissions'] = [ 'read' => $content['$read'], 'write' => $content['$write'] ]; unset($content['$read']); unset($content['$write']); - return $content; }