From 898d89f3221899e3439074c527f32beb89935f2f Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Tue, 22 Dec 2020 20:54:30 +0530 Subject: [PATCH 01/49] feat: starter code for Response Filters --- src/Appwrite/Utopia/Response.php | 40 ++++++++++++++++++++ src/Appwrite/Utopia/Response/Filter.php | 16 ++++++++ src/Appwrite/Utopia/Response/Filters/V06.php | 14 +++++++ 3 files changed, 70 insertions(+) create mode 100644 src/Appwrite/Utopia/Response/Filter.php create mode 100644 src/Appwrite/Utopia/Response/Filters/V06.php diff --git a/src/Appwrite/Utopia/Response.php b/src/Appwrite/Utopia/Response.php index a854416c3f..70e8e46d91 100644 --- a/src/Appwrite/Utopia/Response.php +++ b/src/Appwrite/Utopia/Response.php @@ -6,6 +6,8 @@ use Exception; use Utopia\Swoole\Response as SwooleResponse; use Swoole\Http\Response as SwooleHTTPResponse; use Appwrite\Database\Document; +use Appwrite\Utopia\Response\Filter; +use Appwrite\Utopia\Response\Filter\V06; use Appwrite\Utopia\Response\Model; use Appwrite\Utopia\Response\Model\None; use Appwrite\Utopia\Response\Model\Any; @@ -112,6 +114,11 @@ class Response extends SwooleResponse const MODEL_DOMAIN = 'domain'; const MODEL_DOMAIN_LIST = 'domainList'; + /** + * @var Filter + */ + private static $filter = null; + /** * @var array */ @@ -329,4 +336,37 @@ class Response extends SwooleResponse { return $this->payload; } + + + /** + * 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 isFilter(): bool + { + return self::$filter != null; + } } diff --git a/src/Appwrite/Utopia/Response/Filter.php b/src/Appwrite/Utopia/Response/Filter.php new file mode 100644 index 0000000000..9391624d6e --- /dev/null +++ b/src/Appwrite/Utopia/Response/Filter.php @@ -0,0 +1,16 @@ + Date: Sat, 26 Dec 2020 16:46:43 +0530 Subject: [PATCH 02/49] feat: added function to parse user object --- src/Appwrite/Utopia/Response/Filter.php | 3 +- src/Appwrite/Utopia/Response/Filters/V06.php | 51 ++++++++++++++++++-- src/Appwrite/Utopia/Response/Model/User.php | 2 +- 3 files changed, 51 insertions(+), 5 deletions(-) diff --git a/src/Appwrite/Utopia/Response/Filter.php b/src/Appwrite/Utopia/Response/Filter.php index 9391624d6e..6974c4ba89 100644 --- a/src/Appwrite/Utopia/Response/Filter.php +++ b/src/Appwrite/Utopia/Response/Filter.php @@ -8,9 +8,10 @@ abstract class Filter { * Parse the content to another format. * * @param array $content + * @param string $model * * @return array */ - abstract function parse(array $content): array; + abstract function parse(array $content, string $model): array; } \ No newline at end of file diff --git a/src/Appwrite/Utopia/Response/Filters/V06.php b/src/Appwrite/Utopia/Response/Filters/V06.php index 389cbb3d26..5d66ad2055 100644 --- a/src/Appwrite/Utopia/Response/Filters/V06.php +++ b/src/Appwrite/Utopia/Response/Filters/V06.php @@ -2,13 +2,58 @@ namespace Appwrite\Utopia\Response\Filter; +use Appwrite\Database\Validator\Authorization; +use Appwrite\Utopia\Response; use Appwrite\Utopia\Response\Filter; +use Exception; +use Utopia\Config\Config; class V06 extends Filter { - // Convert 0.7 Data format to 0.6 format - public function parse(array $content): array { - return array(); + public function parse(array $content, string $model): array { + + $parsedResponse = array(); + + switch($model) { + case Response::MODEL_PROJECT : + $parsedResponse = $this->parseProject($content); + break; + + case Response::MODEL_USER : + $parsedResponse = $this->parseUser($content); + break; + + default: + throw new Exception('Recevied invlaid model : '.$model); + } + + return $parsedResponse; + } + + private function parseProject(array $content) + { + + } + + private function parseUser(array $content){ + $parsedContent = []; + + $parsedContent['$id'] = $content['$id']; + $parsedContent['registration'] = $content['registration']; + $parsedContent['name'] = $content['name']; + $parsedContent['email'] = $content['email']; + + foreach (Config::getParam('providers') as $key => $provider) { + if (!$provider['enabled']) { + continue; + } + $parsedContent['oauth2'.ucfirst($key)] = ''; + $parsedContent['oauth2'.ucfirst($key).'AccessToken'] = ''; + } + + $parsedContent['roles'] = Authorization::getRoles(); + + return $parsedContent; } } \ No newline at end of file diff --git a/src/Appwrite/Utopia/Response/Model/User.php b/src/Appwrite/Utopia/Response/Model/User.php index 79c34db5ef..e11d49ed8f 100644 --- a/src/Appwrite/Utopia/Response/Model/User.php +++ b/src/Appwrite/Utopia/Response/Model/User.php @@ -27,7 +27,7 @@ class User extends Model ]) ->addRule('status', [ 'type' => self::TYPE_INTEGER, - 'description' => 'User status. 0 for Unavtivated, 1 for active and 2 is blocked.', + 'description' => 'User status. 0 for Unactivated, 1 for active and 2 is blocked.', 'example' => 0, ]) ->addRule('email', [ From d78e9566124a5bad9c9da82b4f9ef74a2f8cadac Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Sat, 26 Dec 2020 16:47:33 +0530 Subject: [PATCH 03/49] feat: added function to parse user object --- src/Appwrite/Utopia/Response/Filters/V06.php | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/Appwrite/Utopia/Response/Filters/V06.php b/src/Appwrite/Utopia/Response/Filters/V06.php index 5d66ad2055..7e2f0f579e 100644 --- a/src/Appwrite/Utopia/Response/Filters/V06.php +++ b/src/Appwrite/Utopia/Response/Filters/V06.php @@ -39,15 +39,16 @@ class V06 extends Filter { private function parseUser(array $content){ $parsedContent = []; - $parsedContent['$id'] = $content['$id']; - $parsedContent['registration'] = $content['registration']; - $parsedContent['name'] = $content['name']; - $parsedContent['email'] = $content['email']; + $parsedContent['$id'] = $content['$id'] ?? ''; + $parsedContent['registration'] = $content['registration'] ?? ''; + $parsedContent['name'] = $content['name'] ?? ''; + $parsedContent['email'] = $content['email'] ?? ''; foreach (Config::getParam('providers') as $key => $provider) { if (!$provider['enabled']) { continue; } + $parsedContent['oauth2'.ucfirst($key)] = ''; $parsedContent['oauth2'.ucfirst($key).'AccessToken'] = ''; } From a8c07c3381b89b17e91ccaf9b71d5a6010816f88 Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Sat, 26 Dec 2020 16:48:00 +0530 Subject: [PATCH 04/49] feat: added function to parse user object --- src/Appwrite/Utopia/Response/Filters/V06.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/Appwrite/Utopia/Response/Filters/V06.php b/src/Appwrite/Utopia/Response/Filters/V06.php index 7e2f0f579e..5166c9e6c5 100644 --- a/src/Appwrite/Utopia/Response/Filters/V06.php +++ b/src/Appwrite/Utopia/Response/Filters/V06.php @@ -38,7 +38,6 @@ class V06 extends Filter { private function parseUser(array $content){ $parsedContent = []; - $parsedContent['$id'] = $content['$id'] ?? ''; $parsedContent['registration'] = $content['registration'] ?? ''; $parsedContent['name'] = $content['name'] ?? ''; @@ -48,13 +47,12 @@ class V06 extends Filter { if (!$provider['enabled']) { continue; } - + $parsedContent['oauth2'.ucfirst($key)] = ''; $parsedContent['oauth2'.ucfirst($key).'AccessToken'] = ''; } $parsedContent['roles'] = Authorization::getRoles(); - return $parsedContent; } } \ No newline at end of file From 09f42797e32e3fb7dcc1ced469284a2a62df7545 Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Sat, 26 Dec 2020 16:48:16 +0530 Subject: [PATCH 05/49] feat: added parse method for user object --- src/Appwrite/Utopia/Response/Filters/V06.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Appwrite/Utopia/Response/Filters/V06.php b/src/Appwrite/Utopia/Response/Filters/V06.php index 5166c9e6c5..e4a9d0adf5 100644 --- a/src/Appwrite/Utopia/Response/Filters/V06.php +++ b/src/Appwrite/Utopia/Response/Filters/V06.php @@ -52,7 +52,7 @@ class V06 extends Filter { $parsedContent['oauth2'.ucfirst($key).'AccessToken'] = ''; } - $parsedContent['roles'] = Authorization::getRoles(); + $parsedContent['roles'] = Authorization::getRoles() ?? []; return $parsedContent; } } \ No newline at end of file From 89f35d733fa6bfa526ab07c8b16e78f9be33196a Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Sat, 26 Dec 2020 16:56:13 +0530 Subject: [PATCH 06/49] feat: parse session object --- src/Appwrite/Utopia/Response/Filters/V06.php | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/Appwrite/Utopia/Response/Filters/V06.php b/src/Appwrite/Utopia/Response/Filters/V06.php index e4a9d0adf5..4a6e3783fd 100644 --- a/src/Appwrite/Utopia/Response/Filters/V06.php +++ b/src/Appwrite/Utopia/Response/Filters/V06.php @@ -2,6 +2,7 @@ namespace Appwrite\Utopia\Response\Filter; +use Appwrite\Auth\Auth; use Appwrite\Database\Validator\Authorization; use Appwrite\Utopia\Response; use Appwrite\Utopia\Response\Filter; @@ -24,6 +25,10 @@ class V06 extends Filter { $parsedResponse = $this->parseUser($content); break; + case Response::MODEL_SESSION : + $parsedResponse = $this->parseSession($content); + break; + default: throw new Exception('Recevied invlaid model : '.$model); } @@ -36,6 +41,15 @@ class V06 extends Filter { } + private function parseSession(array $content) + { + $parsedContent = []; + $parsedContent['$id'] = $content['$id']; + $parsedContent['type'] = Auth::TOKEN_TYPE_LOGIN; + $parsedContent['expire'] = $content['exprire']; + return $parsedContent; + } + private function parseUser(array $content){ $parsedContent = []; $parsedContent['$id'] = $content['$id'] ?? ''; From 3a7dda5e102f390aef4753660f70ae35e071e1c1 Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Sat, 26 Dec 2020 17:47:43 +0530 Subject: [PATCH 07/49] feat: parse session object --- src/Appwrite/Utopia/Response/Filters/V06.php | 55 ++++++++++++++------ 1 file changed, 38 insertions(+), 17 deletions(-) diff --git a/src/Appwrite/Utopia/Response/Filters/V06.php b/src/Appwrite/Utopia/Response/Filters/V06.php index 4a6e3783fd..019b523d9b 100644 --- a/src/Appwrite/Utopia/Response/Filters/V06.php +++ b/src/Appwrite/Utopia/Response/Filters/V06.php @@ -28,6 +28,10 @@ class V06 extends Filter { case Response::MODEL_SESSION : $parsedResponse = $this->parseSession($content); break; + + case Response::MODEL_ANY : + $parsedResponse = $content; + break; default: throw new Exception('Recevied invlaid model : '.$model); @@ -43,30 +47,47 @@ class V06 extends Filter { private function parseSession(array $content) { - $parsedContent = []; - $parsedContent['$id'] = $content['$id']; - $parsedContent['type'] = Auth::TOKEN_TYPE_LOGIN; - $parsedContent['expire'] = $content['exprire']; - return $parsedContent; + // Handle list of sessions + if (isset($content['sum'])) { + $sessions = $content['sessions']; + + $parsedResponse = []; + foreach($sessions as $session) { + + // WIP + // $parsedResponse['$id'] = $token->getId(); + // $parsedResponse['OS'] = $dd->getOs(); + // $parsedResponse['client'] = $dd->getClient(); + // $parsedResponse['device'] = $dd->getDevice(); + // $parsedResponse['brand'] = $dd->getBrand(); + // $parsedResponse['model'] = $dd->getModel(); + // $parsedResponse['ip'] = $token->getAttribute('ip', ''); + // $parsedResponse['geo'] = []; + // $parsedResponse['current'] = ($current == $token->getId()) ? true : false; + // $parsedResponse[$index]['geo']['isoCode'] = '--'; + // $parsedResponse[$index]['geo']['country'] = Locale::getText('locale.country.unknown'); + + $parsedResponse[] = $session; + } + return $parsedResponse; + } else { + // Handle single session + $content['type'] = Auth::TOKEN_TYPE_LOGIN; + return $content; + } } - private function parseUser(array $content){ - $parsedContent = []; - $parsedContent['$id'] = $content['$id'] ?? ''; - $parsedContent['registration'] = $content['registration'] ?? ''; - $parsedContent['name'] = $content['name'] ?? ''; - $parsedContent['email'] = $content['email'] ?? ''; - + private function parseUser(array $content) + { foreach (Config::getParam('providers') as $key => $provider) { if (!$provider['enabled']) { continue; } - - $parsedContent['oauth2'.ucfirst($key)] = ''; - $parsedContent['oauth2'.ucfirst($key).'AccessToken'] = ''; + $content['oauth2'.ucfirst($key)] = ''; + $content['oauth2'.ucfirst($key).'AccessToken'] = ''; } - $parsedContent['roles'] = Authorization::getRoles() ?? []; - return $parsedContent; + $content['roles'] = Authorization::getRoles() ?? []; + return $content; } } \ No newline at end of file From bed4dcddef8d3df8c4979a8d0947ee54c426f657 Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Sun, 27 Dec 2020 22:01:18 +0530 Subject: [PATCH 08/49] feat: parse session object --- src/Appwrite/Utopia/Response/Filters/V06.php | 32 ++++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/Appwrite/Utopia/Response/Filters/V06.php b/src/Appwrite/Utopia/Response/Filters/V06.php index 019b523d9b..212e83c3f8 100644 --- a/src/Appwrite/Utopia/Response/Filters/V06.php +++ b/src/Appwrite/Utopia/Response/Filters/V06.php @@ -8,6 +8,7 @@ use Appwrite\Utopia\Response; use Appwrite\Utopia\Response\Filter; use Exception; use Utopia\Config\Config; +use Utopia\Locale\Locale as Locale; class V06 extends Filter { @@ -50,24 +51,23 @@ class V06 extends Filter { // Handle list of sessions if (isset($content['sum'])) { $sessions = $content['sessions']; - $parsedResponse = []; + $index = 0; foreach($sessions as $session) { - - // WIP - // $parsedResponse['$id'] = $token->getId(); - // $parsedResponse['OS'] = $dd->getOs(); - // $parsedResponse['client'] = $dd->getClient(); - // $parsedResponse['device'] = $dd->getDevice(); - // $parsedResponse['brand'] = $dd->getBrand(); - // $parsedResponse['model'] = $dd->getModel(); - // $parsedResponse['ip'] = $token->getAttribute('ip', ''); - // $parsedResponse['geo'] = []; - // $parsedResponse['current'] = ($current == $token->getId()) ? true : false; - // $parsedResponse[$index]['geo']['isoCode'] = '--'; - // $parsedResponse[$index]['geo']['country'] = Locale::getText('locale.country.unknown'); - - $parsedResponse[] = $session; + $parsedResponse[$index++] = [ + '$id' => $session['$id'], + 'OS' => $session['osName'].' '.$session['osVersion'], + 'client' => $session['clientName'].' '.$session['clientVersion'], + 'device' => $session['deviceName'], + 'brand' => $session['deviceBrand'], + 'model' => $session['deviceModel'], + 'ip' => $session['ip'], + 'current' => $session['current'], + 'geo' => [ + 'isoCode' => empty($session['countryCode']) ? '---' : $session['countryCode'] , + 'country' => empty($session['countryName'] ) ? Locale::getText('locale.country.unknown') : $session['countryName'] + ], + ]; } return $parsedResponse; } else { From 9690ce879404ecf60a3eeb2b098a7da64f3ef522 Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Sun, 27 Dec 2020 23:47:26 +0530 Subject: [PATCH 09/49] feat: parse log list --- src/Appwrite/Utopia/Response/Filters/V06.php | 85 +++++++++++++------- 1 file changed, 58 insertions(+), 27 deletions(-) diff --git a/src/Appwrite/Utopia/Response/Filters/V06.php b/src/Appwrite/Utopia/Response/Filters/V06.php index 212e83c3f8..638e49948d 100644 --- a/src/Appwrite/Utopia/Response/Filters/V06.php +++ b/src/Appwrite/Utopia/Response/Filters/V06.php @@ -29,6 +29,14 @@ class V06 extends Filter { case Response::MODEL_SESSION : $parsedResponse = $this->parseSession($content); break; + + case Response::MODEL_SESSION_LIST : + $parsedResponse = $this->parseSessionList($content); + break; + + case Response::MODEL_LOG_LIST : + $parsedResponse = $this->parseLogList($content); + break; case Response::MODEL_ANY : $parsedResponse = $content; @@ -46,35 +54,58 @@ class V06 extends Filter { } - private function parseSession(array $content) + private function parseLogList(array $content) { - // Handle list of sessions - if (isset($content['sum'])) { - $sessions = $content['sessions']; - $parsedResponse = []; - $index = 0; - foreach($sessions as $session) { - $parsedResponse[$index++] = [ - '$id' => $session['$id'], - 'OS' => $session['osName'].' '.$session['osVersion'], - 'client' => $session['clientName'].' '.$session['clientVersion'], - 'device' => $session['deviceName'], - 'brand' => $session['deviceBrand'], - 'model' => $session['deviceModel'], - 'ip' => $session['ip'], - 'current' => $session['current'], - 'geo' => [ - 'isoCode' => empty($session['countryCode']) ? '---' : $session['countryCode'] , - 'country' => empty($session['countryName'] ) ? Locale::getText('locale.country.unknown') : $session['countryName'] - ], - ]; - } - return $parsedResponse; - } else { - // Handle single session - $content['type'] = Auth::TOKEN_TYPE_LOGIN; - return $content; + $logs = $content['logs']; + $parsedResponse = []; + $index = 0; + foreach($logs as $log) { + $parsedResponse[$index++] = [ + 'event' => $log['event'], + 'ip' => $log['ip'], + 'time' => strtotime($log['time']), + 'OS' => $log['osName'].' '.$log['osVersion'], + 'client' => $log['clientName'].' '.$log['clientVersion'], + 'device' => $log['deviceName'], + 'brand' => $log['deviceBrand'], + 'model' => $log['deviceModel'], + 'geo' => [ + 'isoCode' => empty($log['countryCode']) ? '---' : $log['countryCode'] , + 'country' => empty($log['countryName'] ) ? Locale::getText('locale.country.unknown') : $log['countryName'] + ] + ]; } + return $parsedResponse; + } + + private function parseSessionList(array $content) + { + $sessions = $content['sessions']; + $parsedResponse = []; + $index = 0; + foreach($sessions as $session) { + $parsedResponse[$index++] = [ + '$id' => $session['$id'], + 'OS' => $session['osName'].' '.$session['osVersion'], + 'client' => $session['clientName'].' '.$session['clientVersion'], + 'device' => $session['deviceName'], + 'brand' => $session['deviceBrand'], + 'model' => $session['deviceModel'], + 'ip' => $session['ip'], + 'current' => $session['current'], + 'geo' => [ + 'isoCode' => empty($session['countryCode']) ? '---' : $session['countryCode'] , + 'country' => empty($session['countryName'] ) ? Locale::getText('locale.country.unknown') : $session['countryName'] + ], + ]; + } + return $parsedResponse; + } + + private function parseSession(array $content) + { + $content['type'] = Auth::TOKEN_TYPE_LOGIN; + return $content; } private function parseUser(array $content) From fde5183594b46214e71a832545234878d2c6784b Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Sun, 27 Dec 2020 23:52:05 +0530 Subject: [PATCH 10/49] feat: parse token --- src/Appwrite/Utopia/Response/Filters/V06.php | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/Appwrite/Utopia/Response/Filters/V06.php b/src/Appwrite/Utopia/Response/Filters/V06.php index 638e49948d..c1b138abe1 100644 --- a/src/Appwrite/Utopia/Response/Filters/V06.php +++ b/src/Appwrite/Utopia/Response/Filters/V06.php @@ -38,6 +38,9 @@ class V06 extends Filter { $parsedResponse = $this->parseLogList($content); break; + case Response::MODEL_TOKEN: + $parsedResponse = $this->parseToken($content); + break; case Response::MODEL_ANY : $parsedResponse = $content; break; @@ -54,6 +57,12 @@ class V06 extends Filter { } + private function parseToken(array $content) + { + $content['type'] = Auth::TOKEN_TYPE_RECOVERY; + return $content; + } + private function parseLogList(array $content) { $logs = $content['logs']; From 9177d659a1ff631a1d0f5106eac0c9f3f4f37a4b Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Mon, 28 Dec 2020 00:32:15 +0530 Subject: [PATCH 11/49] feat: parse locale --- src/Appwrite/Utopia/Response/Filters/V06.php | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/Appwrite/Utopia/Response/Filters/V06.php b/src/Appwrite/Utopia/Response/Filters/V06.php index c1b138abe1..f83007d9d0 100644 --- a/src/Appwrite/Utopia/Response/Filters/V06.php +++ b/src/Appwrite/Utopia/Response/Filters/V06.php @@ -41,12 +41,18 @@ class V06 extends Filter { case Response::MODEL_TOKEN: $parsedResponse = $this->parseToken($content); break; + + case Response::MODEL_LOCALE: + $parsedResponse = $this->parseLocale($content); + break; + + case Response::MODEL_ANY : $parsedResponse = $content; break; default: - throw new Exception('Recevied invlaid model : '.$model); + throw new Exception('Recevied invalid model : '.$model); } return $parsedResponse; @@ -57,6 +63,18 @@ class V06 extends Filter { } + private function parseLocale(array $content) + { + $content['ip'] = empty($content['ip']) ? '' : $content['ip']; + $content['countryCode'] = empty($content['countryCode']) ? '--' : $content['countryCode']; + $content['country'] = empty($content['country']) ? Locale::getText('locale.country.unknown') : $content['country']; + $content['continent'] = empty($content['continent']) ? Locale::getText('locale.country.unknown') : $content['continent']; + $content['continentCode'] = empty($content['continentCode']) ? '--' : $content['continentCode']; + $content['eu'] = empty($content['eu']) ? false : $content['eu']; + $content['currency'] = empty($content['currency']) ? null : $content['currency']; + return $content; + } + private function parseToken(array $content) { $content['type'] = Auth::TOKEN_TYPE_RECOVERY; From b57a2de8ee28327baf47807b029822a3b866543a Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Mon, 28 Dec 2020 12:34:33 +0530 Subject: [PATCH 12/49] feat: parse country list --- src/Appwrite/Utopia/Response/Filters/V06.php | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/Appwrite/Utopia/Response/Filters/V06.php b/src/Appwrite/Utopia/Response/Filters/V06.php index f83007d9d0..c1641089f5 100644 --- a/src/Appwrite/Utopia/Response/Filters/V06.php +++ b/src/Appwrite/Utopia/Response/Filters/V06.php @@ -46,6 +46,9 @@ class V06 extends Filter { $parsedResponse = $this->parseLocale($content); break; + case Response::MODEL_COUNTRY_LIST: + $parsedResponse = $this->parseCountryList($content); + break; case Response::MODEL_ANY : $parsedResponse = $content; @@ -63,6 +66,17 @@ class V06 extends Filter { } + private function parseCountryList(array $content) + { + $countries = $content['country']; + $parsedResponse = []; + foreach($countries as $country) { + $parsedResponse['code'] = $country['name']; + } + + return $parsedResponse; + } + private function parseLocale(array $content) { $content['ip'] = empty($content['ip']) ? '' : $content['ip']; From d0296db6e5133bc62656090cc1ee495cf1e7305f Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Mon, 28 Dec 2020 12:41:30 +0530 Subject: [PATCH 13/49] feat: parse phone list --- src/Appwrite/Utopia/Response/Filters/V06.php | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/Appwrite/Utopia/Response/Filters/V06.php b/src/Appwrite/Utopia/Response/Filters/V06.php index c1641089f5..8339c8d4a6 100644 --- a/src/Appwrite/Utopia/Response/Filters/V06.php +++ b/src/Appwrite/Utopia/Response/Filters/V06.php @@ -50,6 +50,10 @@ class V06 extends Filter { $parsedResponse = $this->parseCountryList($content); break; + case Response::MODEL_PHONE_LIST: + $parsedResponse = $this->parsePhoneList($content); + break; + case Response::MODEL_ANY : $parsedResponse = $content; break; @@ -66,14 +70,25 @@ class V06 extends Filter { } + private function parsePhoneList(array $content) + { + $phones = $content['phones']; + $parsedResponse = []; + foreach($phones as $phone) { + $parsedResponse['countryCode'] = $phone['code']; + } + + return $parsedResponse; + } + private function parseCountryList(array $content) { - $countries = $content['country']; + $countries = $content['countries']; $parsedResponse = []; foreach($countries as $country) { $parsedResponse['code'] = $country['name']; } - + return $parsedResponse; } From d5c7445c8868d6aa10702930775c6f218dd2b0f0 Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Mon, 28 Dec 2020 13:42:15 +0530 Subject: [PATCH 14/49] feat: parse continentlist --- src/Appwrite/Utopia/Response/Filters/V06.php | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/Appwrite/Utopia/Response/Filters/V06.php b/src/Appwrite/Utopia/Response/Filters/V06.php index 8339c8d4a6..7abfc9dc54 100644 --- a/src/Appwrite/Utopia/Response/Filters/V06.php +++ b/src/Appwrite/Utopia/Response/Filters/V06.php @@ -54,6 +54,10 @@ class V06 extends Filter { $parsedResponse = $this->parsePhoneList($content); break; + case Response::MODEL_CONTINENT_LIST: + $parsedResponse = $this->parseContinentList($content); + break; + case Response::MODEL_ANY : $parsedResponse = $content; break; @@ -70,6 +74,17 @@ class V06 extends Filter { } + private function parseContinentList(array $content) + { + $continents = $content['continents']; + $parsedResponse = []; + foreach($continents as $continent) { + $parsedResponse['code'] = $continent['name']; + } + + return $parsedResponse; + } + private function parsePhoneList(array $content) { $phones = $content['phones']; From 811fbd96bbc4d6bf44dea87d5b8f3be9c41aaf23 Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Mon, 28 Dec 2020 13:51:58 +0530 Subject: [PATCH 15/49] feat: parse currency list --- src/Appwrite/Utopia/Response/Filters/V06.php | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/Appwrite/Utopia/Response/Filters/V06.php b/src/Appwrite/Utopia/Response/Filters/V06.php index 7abfc9dc54..1c11393008 100644 --- a/src/Appwrite/Utopia/Response/Filters/V06.php +++ b/src/Appwrite/Utopia/Response/Filters/V06.php @@ -58,6 +58,10 @@ class V06 extends Filter { $parsedResponse = $this->parseContinentList($content); break; + case Response::MODEL_CURRENCY_LIST: + $parsedResponse = $this->parseCurrencyList($content); + break; + case Response::MODEL_ANY : $parsedResponse = $content; break; @@ -74,6 +78,12 @@ class V06 extends Filter { } + private function parseCurrencyList(array $content) + { + $content['locations'] = []; + return $content; + } + private function parseContinentList(array $content) { $continents = $content['continents']; From af774acf92d03b771fa84f116c93a486faa6d41e Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Mon, 28 Dec 2020 15:03:38 +0530 Subject: [PATCH 16/49] feat: parse users list --- src/Appwrite/Utopia/Response/Filters/V06.php | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/Appwrite/Utopia/Response/Filters/V06.php b/src/Appwrite/Utopia/Response/Filters/V06.php index 1c11393008..e2c89c9e8a 100644 --- a/src/Appwrite/Utopia/Response/Filters/V06.php +++ b/src/Appwrite/Utopia/Response/Filters/V06.php @@ -26,6 +26,10 @@ class V06 extends Filter { $parsedResponse = $this->parseUser($content); break; + case Response::MODEL_USER_LIST: + $parsedResponse = $this->parseUserList($content); + break; + case Response::MODEL_SESSION : $parsedResponse = $this->parseSession($content); break; @@ -189,6 +193,16 @@ class V06 extends Filter { return $content; } + private function parseUserList(array $content) + { + $users = $content['users']; + $parsedResponse = []; + foreach($users as $user) { + $parsedResponse[] = $this->parseUser($user); + } + return $parsedResponse; + } + private function parseUser(array $content) { foreach (Config::getParam('providers') as $key => $provider) { From f6c140d84a126e425697548d50acbce1638862ce Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Mon, 28 Dec 2020 15:12:54 +0530 Subject: [PATCH 17/49] feat: add status field to users response --- src/Appwrite/Utopia/Response/Filters/V06.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Appwrite/Utopia/Response/Filters/V06.php b/src/Appwrite/Utopia/Response/Filters/V06.php index e2c89c9e8a..77e0bd2582 100644 --- a/src/Appwrite/Utopia/Response/Filters/V06.php +++ b/src/Appwrite/Utopia/Response/Filters/V06.php @@ -212,7 +212,7 @@ class V06 extends Filter { $content['oauth2'.ucfirst($key)] = ''; $content['oauth2'.ucfirst($key).'AccessToken'] = ''; } - + $content['status'] = empty($content['status']) ? 0 : $content['status']; $content['roles'] = Authorization::getRoles() ?? []; return $content; } From ef0f886ce6b1f05c2f8a17b1a335bdac6f49d640 Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Mon, 28 Dec 2020 15:21:45 +0530 Subject: [PATCH 18/49] feat: added todos for some /users endpoints --- app/controllers/api/users.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/controllers/api/users.php b/app/controllers/api/users.php index 3b1b8bcef5..dd49e52f88 100644 --- a/app/controllers/api/users.php +++ b/app/controllers/api/users.php @@ -425,6 +425,7 @@ App::delete('/v1/users/:userId/sessions/:sessionId') } } + // TODO : Response filter implementation $response->noContent(); }, ['response', 'projectDB', 'events']); @@ -465,6 +466,7 @@ App::delete('/v1/users/:userId/sessions') ->setParam('payload', $response->output($user, Response::MODEL_USER)) ; + // TODO : Response filter implementation $response->noContent(); }, ['response', 'projectDB', 'events']); @@ -521,5 +523,6 @@ App::delete('/v1/users/:userId') ->setParam('payload', $response->output($user, Response::MODEL_USER)) ; + // TODO : Response filter implementation $response->noContent(); }, ['response', 'projectDB', 'events', 'deletes']); From 018a1e8bf54c619068b1f4845a22f144166711ca Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Mon, 28 Dec 2020 16:34:08 +0530 Subject: [PATCH 19/49] feat: parse membership --- src/Appwrite/Utopia/Response/Filters/V06.php | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/Appwrite/Utopia/Response/Filters/V06.php b/src/Appwrite/Utopia/Response/Filters/V06.php index 77e0bd2582..1396fb6c2a 100644 --- a/src/Appwrite/Utopia/Response/Filters/V06.php +++ b/src/Appwrite/Utopia/Response/Filters/V06.php @@ -18,9 +18,6 @@ class V06 extends Filter { $parsedResponse = array(); switch($model) { - case Response::MODEL_PROJECT : - $parsedResponse = $this->parseProject($content); - break; case Response::MODEL_USER : $parsedResponse = $this->parseUser($content); @@ -29,6 +26,18 @@ class V06 extends Filter { case Response::MODEL_USER_LIST: $parsedResponse = $this->parseUserList($content); break; + + case Response::MODEL_TEAM: + $parsedResponse = $content; + break; + + case Response::MODEL_TEAM_LIST: + $parsedResponse = $content['teams']; + break; + + case Response::MODEL_MEMBERSHIP: + $parsedResponse = $content; + break; case Response::MODEL_SESSION : $parsedResponse = $this->parseSession($content); @@ -77,11 +86,6 @@ class V06 extends Filter { return $parsedResponse; } - private function parseProject(array $content) - { - - } - private function parseCurrencyList(array $content) { $content['locations'] = []; From f1887d2d9b42cadfd5b73f7ef2e866e9deb9d295 Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Mon, 28 Dec 2020 22:12:13 +0530 Subject: [PATCH 20/49] feat: parse membership list --- src/Appwrite/Utopia/Response/Filters/V06.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Appwrite/Utopia/Response/Filters/V06.php b/src/Appwrite/Utopia/Response/Filters/V06.php index 1396fb6c2a..79f1ef92fc 100644 --- a/src/Appwrite/Utopia/Response/Filters/V06.php +++ b/src/Appwrite/Utopia/Response/Filters/V06.php @@ -38,6 +38,10 @@ class V06 extends Filter { case Response::MODEL_MEMBERSHIP: $parsedResponse = $content; break; + + case Response::MODEL_MEMBERSHIP_LIST: + $parsedResponse = $content['memberships']; + break; case Response::MODEL_SESSION : $parsedResponse = $this->parseSession($content); From 54f40c8ce2d0fd1764e3a55c917fda53b211811f Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Tue, 29 Dec 2020 01:01:26 +0530 Subject: [PATCH 21/49] feat: parse file --- src/Appwrite/Utopia/Response/Filters/V06.php | 22 ++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/Appwrite/Utopia/Response/Filters/V06.php b/src/Appwrite/Utopia/Response/Filters/V06.php index 79f1ef92fc..9d8d00a94b 100644 --- a/src/Appwrite/Utopia/Response/Filters/V06.php +++ b/src/Appwrite/Utopia/Response/Filters/V06.php @@ -3,7 +3,9 @@ namespace Appwrite\Utopia\Response\Filter; use Appwrite\Auth\Auth; +use Appwrite\Database\Database; use Appwrite\Database\Validator\Authorization; +use Appwrite\OpenSSL\OpenSSL; use Appwrite\Utopia\Response; use Appwrite\Utopia\Response\Filter; use Exception; @@ -19,6 +21,10 @@ class V06 extends Filter { switch($model) { + case Response::MODEL_FILE : + $parsedResponse = $this->parseFile($content); + break; + case Response::MODEL_USER : $parsedResponse = $this->parseUser($content); break; @@ -90,6 +96,22 @@ class V06 extends Filter { return $parsedResponse; } + private function parseFile(array $content) + { + $content['$collection'] = Database::SYSTEM_COLLECTION_FILES; + $content['algorithm'] = 'gzip'; + $content['comment'] = ''; + $content['fileOpenSSLCipher'] = OpenSSL::CIPHER_AES_128_GCM; + $content['fileOpenSSLIV'] = ''; + $content['fileOpenSSLTag'] = ''; + $content['fileOpenSSLVersion'] = ''; + $content['folderId'] = ''; + $content['path'] = ''; + $content['sizeActual'] = $content['sizeOriginal']; + $content['token'] = ''; + return $content; + } + private function parseCurrencyList(array $content) { $content['locations'] = []; From 450c3e6f88fc9acc2786900b2ab42e61dbd76cbb Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Tue, 29 Dec 2020 01:09:22 +0530 Subject: [PATCH 22/49] feat: parse file list --- src/Appwrite/Utopia/Response/Filters/V06.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Appwrite/Utopia/Response/Filters/V06.php b/src/Appwrite/Utopia/Response/Filters/V06.php index 9d8d00a94b..4627157fcc 100644 --- a/src/Appwrite/Utopia/Response/Filters/V06.php +++ b/src/Appwrite/Utopia/Response/Filters/V06.php @@ -25,6 +25,10 @@ class V06 extends Filter { $parsedResponse = $this->parseFile($content); break; + case Response::MODEL_FILE_LIST : + $parsedResponse = $content; + break; + case Response::MODEL_USER : $parsedResponse = $this->parseUser($content); break; From 9c01fb1ff60ddbeab887f0178b7693a8ad8622d9 Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Tue, 29 Dec 2020 22:21:51 +0530 Subject: [PATCH 23/49] feat: parse collection --- src/Appwrite/Utopia/Response/Filters/V06.php | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/Appwrite/Utopia/Response/Filters/V06.php b/src/Appwrite/Utopia/Response/Filters/V06.php index 4627157fcc..4f90e33174 100644 --- a/src/Appwrite/Utopia/Response/Filters/V06.php +++ b/src/Appwrite/Utopia/Response/Filters/V06.php @@ -21,6 +21,10 @@ class V06 extends Filter { switch($model) { + case Response::MODEL_COLLECTION: + $parsedResponse = $this->parseCollection($content); + break; + case Response::MODEL_FILE : $parsedResponse = $this->parseFile($content); break; @@ -100,6 +104,13 @@ class V06 extends Filter { return $parsedResponse; } + private function parseCollection(array $content) + { + $content['$collection'] = Database::SYSTEM_COLLECTION_COLLECTIONS; + $content['structure'] = true; + return $content; + } + private function parseFile(array $content) { $content['$collection'] = Database::SYSTEM_COLLECTION_FILES; From fa748b62306ece06279c7b62a50807eba0eb158a Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Tue, 29 Dec 2020 22:28:54 +0530 Subject: [PATCH 24/49] feat: parse collection list --- src/Appwrite/Utopia/Response/Filters/V06.php | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/Appwrite/Utopia/Response/Filters/V06.php b/src/Appwrite/Utopia/Response/Filters/V06.php index 4f90e33174..40cede4f73 100644 --- a/src/Appwrite/Utopia/Response/Filters/V06.php +++ b/src/Appwrite/Utopia/Response/Filters/V06.php @@ -25,6 +25,10 @@ class V06 extends Filter { $parsedResponse = $this->parseCollection($content); break; + case Response::MODEL_COLLECTION_LIST: + $parsedResponse = $this->parseCollectionList($content); + break; + case Response::MODEL_FILE : $parsedResponse = $this->parseFile($content); break; @@ -104,6 +108,14 @@ class V06 extends Filter { return $parsedResponse; } + private function parseCollectionList(array $content) + { + foreach($content['collections'] as $key => $collection){ + $content['collections'][$key] = $this->parseCollection($collection); + } + return $content; + } + private function parseCollection(array $content) { $content['$collection'] = Database::SYSTEM_COLLECTION_COLLECTIONS; From d67bcec7b9b876a7d2d3ec2ee0f3743b9d94b712 Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Tue, 29 Dec 2020 23:55:34 +0530 Subject: [PATCH 25/49] feat: parse document list --- src/Appwrite/Utopia/Response/Filters/V06.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Appwrite/Utopia/Response/Filters/V06.php b/src/Appwrite/Utopia/Response/Filters/V06.php index 40cede4f73..17c6d19932 100644 --- a/src/Appwrite/Utopia/Response/Filters/V06.php +++ b/src/Appwrite/Utopia/Response/Filters/V06.php @@ -21,6 +21,10 @@ class V06 extends Filter { switch($model) { + case Response::MODEL_DOCUMENT_LIST: + $parsedResponse = $content; + break; + case Response::MODEL_COLLECTION: $parsedResponse = $this->parseCollection($content); break; From 2ffb34fab14e26d99b7ddf2e1c6e379b702965e6 Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Wed, 30 Dec 2020 00:12:03 +0530 Subject: [PATCH 26/49] feat: added check for env variable on startup --- .env | 1 + Dockerfile | 3 ++- app/http.php | 7 +++++++ docker-compose.yml | 1 + 4 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.env b/.env index 9764cfe894..e3c45cbbb5 100644 --- a/.env +++ b/.env @@ -27,3 +27,4 @@ _APP_SMTP_PASSWORD= _APP_STORAGE_LIMIT=10000000 _APP_FUNCTIONS_TIMEOUT=900 _APP_FUNCTIONS_CONTAINERS=10 +_APP_SYSTEM_RESPONSE_FORMAT=0.6 diff --git a/Dockerfile b/Dockerfile index d41dbc50fd..0eba6f5624 100755 --- a/Dockerfile +++ b/Dockerfile @@ -93,7 +93,8 @@ ENV _APP_SERVER=swoole \ _APP_FUNCTIONS_TIMEOUT=900 \ _APP_FUNCTIONS_CONTAINERS=10 \ _APP_SETUP=self-hosted \ - _APP_VERSION=$VERSION + _APP_VERSION=$VERSION \ + _APP_SYSTEM_RESPONSE_FORMAT=0.6 #ENV _APP_SMTP_SECURE '' #ENV _APP_SMTP_USERNAME '' #ENV _APP_SMTP_PASSWORD '' diff --git a/app/http.php b/app/http.php index afb9411ec5..2f7859f110 100644 --- a/app/http.php +++ b/app/http.php @@ -23,6 +23,7 @@ error_reporting(E_ALL); $http = new Server("0.0.0.0", 80); $payloadSize = max(4000000 /* 4mb */, App::getEnv('_APP_STORAGE_LIMIT', 10000000 /* 10mb */)); +$responseFormat = App::getEnv('_APP_SYSTEM_RESPONSE_FORMAT', null); $http ->set([ @@ -48,6 +49,12 @@ $http->on('AfterReload', function($serv, $workerId) { }); $http->on('start', function (Server $http) use ($payloadSize) { + + if(empty($responseFormat)) { + Console::error('Missing value for environment variable _APP_SYSTEM_RESPONSE_FORMAT. Exiting ...'); + exit(1); + } + Console::success('Server started succefully (max payload is '.number_format($payloadSize).' bytes)'); Console::info("Master pid {$http->master_pid}, manager pid {$http->manager_pid}"); diff --git a/docker-compose.yml b/docker-compose.yml index a6bf759f56..f0f54f9939 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -102,6 +102,7 @@ services: - _APP_STORAGE_LIMIT - _APP_FUNCTIONS_TIMEOUT - _APP_FUNCTIONS_CONTAINERS + - _APP_SYSTEM_RESPONSE_FORMAT appwrite-worker-usage: entrypoint: worker-usage From 51600bc1d916bd37465d8f3419aa6430da18e24e Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Wed, 30 Dec 2020 00:37:33 +0530 Subject: [PATCH 27/49] feat: added check for header on api init --- app/controllers/general.php | 23 +++++++++++++++++++++++ app/http.php | 2 +- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/app/controllers/general.php b/app/controllers/general.php index 972cbf4110..85b8adce70 100644 --- a/app/controllers/general.php +++ b/app/controllers/general.php @@ -16,12 +16,23 @@ use Appwrite\Database\Validator\Authorization; use Appwrite\Network\Validator\Origin; use Appwrite\Storage\Device\Local; use Appwrite\Storage\Storage; +use Appwrite\Utopia\Response\Filter; +use Appwrite\Utopia\Response\Filter\V06; use Utopia\CLI\Console; Config::setParam('domainVerification', false); Config::setParam('cookieDomain', 'localhost'); Config::setParam('cookieSamesite', Response::COOKIE_SAMESITE_NONE); +function mapResponseFormatToClass(string $responseFormat): Filter { + switch($responseFormat) { + case preg_match($responseFormat, "/0\.[0-6]\.\d/"): + return new V06(); + default: + return null; + } +} + App::init(function ($utopia, $request, $response, $console, $project, $user, $locale, $events, $audits, $usage, $deletes, $clients) { /** @var Utopia\Swoole\Request $request */ /** @var Appwrite\Utopia\Response $response */ @@ -92,6 +103,18 @@ App::init(function ($utopia, $request, $response, $console, $project, $user, $lo Storage::setDevice('files', new Local(APP_STORAGE_UPLOADS.'/app-'.$project->getId())); Storage::setDevice('functions', new Local(APP_STORAGE_FUNCTIONS.'/app-'.$project->getId())); + /* + * Response format + */ + $responseFormatEnvVar = App::getEnv('_APP_SYSTEM_RESPONSE_FORMAT', ''); + $responseFormatHeader = $request->getHeader('x-appwrite-response-format', ''); + $responseFormat = empty($responseFormatHeader) ? $responseFormatEnvVar : $responseFormatHeader; + if (empty($responseFormat) || ($filter = mapResponseFormatToClass($responseFormat)) == null) { + throw new Exception('No filter available for response format : '.$responseFormat, 404); + } else { + Response::setFilter($filter); + } + /* * Security Headers * diff --git a/app/http.php b/app/http.php index 2f7859f110..a28af328fe 100644 --- a/app/http.php +++ b/app/http.php @@ -23,7 +23,7 @@ error_reporting(E_ALL); $http = new Server("0.0.0.0", 80); $payloadSize = max(4000000 /* 4mb */, App::getEnv('_APP_STORAGE_LIMIT', 10000000 /* 10mb */)); -$responseFormat = App::getEnv('_APP_SYSTEM_RESPONSE_FORMAT', null); +$responseFormat = App::getEnv('_APP_SYSTEM_RESPONSE_FORMAT', ''); $http ->set([ From cebd016282c9f1db3f5bda38fa6cf8c563e98680 Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Wed, 30 Dec 2020 00:38:48 +0530 Subject: [PATCH 28/49] feat: modified the regex --- app/controllers/general.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/general.php b/app/controllers/general.php index 85b8adce70..8c0404ce5f 100644 --- a/app/controllers/general.php +++ b/app/controllers/general.php @@ -26,7 +26,7 @@ Config::setParam('cookieSamesite', Response::COOKIE_SAMESITE_NONE); function mapResponseFormatToClass(string $responseFormat): Filter { switch($responseFormat) { - case preg_match($responseFormat, "/0\.[0-6]\.\d/"): + case preg_match($responseFormat, "/0\.[0-6]\.\d?/"): return new V06(); default: return null; From c508657a50fcd9d3f9300e614ea6b9594e0249b5 Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Wed, 30 Dec 2020 00:42:32 +0530 Subject: [PATCH 29/49] feat: apply parse method if filter is present --- src/Appwrite/Utopia/Response.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Appwrite/Utopia/Response.php b/src/Appwrite/Utopia/Response.php index 70e8e46d91..16fedaf8e1 100644 --- a/src/Appwrite/Utopia/Response.php +++ b/src/Appwrite/Utopia/Response.php @@ -293,6 +293,10 @@ class Response extends SwooleResponse } $item = $this->output($item, $rule['type']); + // If filter is set, parse the item + if(self::isFilter()){ + $item = self::getFilter()->parse($item, $rule['type']); + } } } } From a37a28fdc9ca6e6e9bccf04971c1bff2c81c1a71 Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Wed, 30 Dec 2020 16:24:11 +0530 Subject: [PATCH 30/49] feat: added unit test for setFilter --- src/Appwrite/Utopia/Response/Filters/V06.php | 4 +-- tests/unit/Utopia/ResponseTest.php | 34 ++++++++++++++++++++ 2 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 tests/unit/Utopia/ResponseTest.php diff --git a/src/Appwrite/Utopia/Response/Filters/V06.php b/src/Appwrite/Utopia/Response/Filters/V06.php index 17c6d19932..4e15862108 100644 --- a/src/Appwrite/Utopia/Response/Filters/V06.php +++ b/src/Appwrite/Utopia/Response/Filters/V06.php @@ -16,8 +16,8 @@ class V06 extends Filter { // Convert 0.7 Data format to 0.6 format public function parse(array $content, string $model): array { - - $parsedResponse = array(); + + $parsedResponse = []; switch($model) { diff --git a/tests/unit/Utopia/ResponseTest.php b/tests/unit/Utopia/ResponseTest.php new file mode 100644 index 0000000000..20df14058a --- /dev/null +++ b/tests/unit/Utopia/ResponseTest.php @@ -0,0 +1,34 @@ +object = new Response(new SwooleResponse()); + } + + public function testSetFilter() + { + $this->assertEquals($this->object->isFilter(), false); + $this->assertEquals($this->object->getFilter(), null); + + $filter = new V06(); + $this->object->setFilter($filter); + + $this->assertEquals($this->object->isFilter(), true); + $this->assertEquals($this->object->getFilter(), $filter); + } +} \ No newline at end of file From 28f003e5bed03d420fe04a3925737e1badfd9c77 Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Thu, 31 Dec 2020 01:07:30 +0530 Subject: [PATCH 31/49] feat: unit tests for response filters --- tests/unit/Utopia/Filters/V06Test.php | 237 ++++++++++++++++++++++++++ 1 file changed, 237 insertions(+) create mode 100644 tests/unit/Utopia/Filters/V06Test.php diff --git a/tests/unit/Utopia/Filters/V06Test.php b/tests/unit/Utopia/Filters/V06Test.php new file mode 100644 index 0000000000..a5d2bfaa85 --- /dev/null +++ b/tests/unit/Utopia/Filters/V06Test.php @@ -0,0 +1,237 @@ +filter = new V06(); + } + + public function testParseUser() + { + $content = [ + '$id' => '5e5ea5c16897e', + 'name' => 'John Doe', + 'registration' => 1592981250, + 'status' => 0, + 'email' => 'john@appwrite.io', + 'emailVerification' => false, + 'prefs' => [ + 'theme' => 'pink', + 'timezone' => 'UTC' + ] + ]; + + $model = Response::MODEL_USER; + $parsedResponse = $this->filter->parse($content, $model); + + $this->assertEquals($parsedResponse['$id'], '5e5ea5c16897e'); + $this->assertEquals($parsedResponse['name'], 'John Doe'); + $this->assertEquals($parsedResponse['registration'], 1592981250); + $this->assertEquals($parsedResponse['status'], 0); + $this->assertEquals($parsedResponse['email'], 'john@appwrite.io'); + $this->assertEquals($parsedResponse['emailVerification'], false); + $this->assertEquals($parsedResponse['prefs'], ['theme' => 'pink', 'timezone' => 'UTC']); + $this->assertEquals($parsedResponse['status'], 0); + $this->assertEquals($parsedResponse['roles'], Authorization::getRoles() ?? []); + } + + public function testParseUserList() + { + $content = [ + 'sum' => 1, + 'users' => [ + 0 => [ + '$id' => '5e5ea5c16897e', + 'name' => 'John Doe', + 'registration' => 1592981250, + 'status' => 0, + 'email' => 'john@appwrite.io', + 'emailVerification' => false, + 'prefs' => [ + 'theme' => 'pink', + 'timezone' => 'UTC' + ] + ] + ] + ]; + + $model = Response::MODEL_USER_LIST; + $parsedResponse = $this->filter->parse($content, $model); + + $this->assertEquals($parsedResponse['sum'], 1); + $this->assertEquals($parsedResponse['users'][0]['$id'], '5e5ea5c16897e'); + $this->assertEquals($parsedResponse['users'][0]['name'], 'John Doe'); + $this->assertEquals($parsedResponse['users'][0]['registration'], 1592981250); + $this->assertEquals($parsedResponse['users'][0]['status'], 0); + $this->assertEquals($parsedResponse['users'][0]['email'], 'john@appwrite.io'); + $this->assertEquals($parsedResponse['users'][0]['emailVerification'], false); + $this->assertEquals($parsedResponse['users'][0]['prefs'], ['theme' => 'pink', 'timezone' => 'UTC']); + $this->assertEquals($parsedResponse['users'][0]['status'], 0); + $this->assertEquals($parsedResponse['users'][0]['roles'], Authorization::getRoles() ?? []); + } + + public function testParseSession() + { + $content = [ + '$id' => '5e5ea5c16897e', + 'userId' => '5e5bb8c16897e', + 'expire' => 1592981250, + 'ip' => '127.0.0.1', + 'osCode' => 'Mac', + 'osName' => 'Mac', + 'osVersion' => 'Mac', + 'clientType' => 'browser', + 'clientCode' => 'CM', + 'clientName' => 'Chrome Mobile iOS', + 'clientVersion' => '84.0', + 'clientEngine' => 'WebKit', + 'clientEngineVersion' => '605.1.15', + 'deviceName' => 'smartphone', + 'deviceBrand' => 'Google', + 'deviceModel' => 'Nexus 5', + 'countryCode' => 'US', + 'countryName' => 'United States', + 'current' => true + ]; + + $model = Response::MODEL_SESSION; + $parsedResponse = $this->filter->parse($content, $model); + + $this->assertEquals($parsedResponse['$id'], '5e5ea5c16897e'); + $this->assertEquals($parsedResponse['userId'], '5e5bb8c16897e'); + $this->assertEquals($parsedResponse['expire'], 1592981250); + $this->assertEquals($parsedResponse['ip'], '127.0.0.1'); + $this->assertEquals($parsedResponse['osCode'], 'Mac'); + $this->assertEquals($parsedResponse['osName'], 'Mac'); + $this->assertEquals($parsedResponse['osVersion'], 'Mac'); + $this->assertEquals($parsedResponse['clientType'], 'browser'); + $this->assertEquals($parsedResponse['clientCode'], 'CM'); + $this->assertEquals($parsedResponse['clientName'], 'Chrome Mobile iOS'); + $this->assertEquals($parsedResponse['clientVersion'], '84.0'); + $this->assertEquals($parsedResponse['clientEngine'], 'WebKit'); + $this->assertEquals($parsedResponse['clientEngineVersion'], '605.1.15'); + $this->assertEquals($parsedResponse['deviceName'], 'smartphone'); + $this->assertEquals($parsedResponse['deviceBrand'], 'Google'); + $this->assertEquals($parsedResponse['deviceModel'], 'Nexus 5'); + $this->assertEquals($parsedResponse['countryCode'], 'US'); + $this->assertEquals($parsedResponse['countryName'], 'United States'); + $this->assertEquals($parsedResponse['current'], true); + $this->assertEquals($parsedResponse['type'], Auth::TOKEN_TYPE_LOGIN); + } + + public function testParseSessionList() + { + $content = [ + 'sum' => 1, + 'sessions' => [ + 0 => [ + '$id' => '5e5ea5c16897e', + 'userId' => '5e5bb8c16897e', + 'expire' => 1592981250, + 'ip' => '127.0.0.1', + 'osCode' => 'Mac', + 'osName' => 'Mac', + 'osVersion' => 'Mac', + 'clientType' => 'browser', + 'clientCode' => 'CM', + 'clientName' => 'Chrome Mobile iOS', + 'clientVersion' => '84.0', + 'clientEngine' => 'WebKit', + 'clientEngineVersion' => '605.1.15', + 'deviceName' => 'smartphone', + 'deviceBrand' => 'Google', + 'deviceModel' => 'Nexus 5', + 'countryCode' => 'US', + 'countryName' => 'United States', + 'current' => true + ] + ] + ]; + + $model = Response::MODEL_SESSION_LIST; + $parsedResponse = $this->filter->parse($content, $model); + + $this->assertEquals($parsedResponse['sum'], 1); + $this->assertEquals($parsedResponse['sessions'][0]['$id'], '5e5ea5c16897e'); + $this->assertEquals($parsedResponse['sessions'][0]['OS'], 'Mac Mac'); + $this->assertEquals($parsedResponse['sessions'][0]['client'], 'Chrome Mobile iOS 84.0'); + $this->assertEquals($parsedResponse['sessions'][0]['device'], 'smartphone'); + $this->assertEquals($parsedResponse['sessions'][0]['brand'], 'Google'); + $this->assertEquals($parsedResponse['sessions'][0]['model'], 'Nexus 5'); + $this->assertEquals($parsedResponse['sessions'][0]['ip'], '127.0.0.1'); + $this->assertEquals($parsedResponse['sessions'][0]['current'], true); + $this->assertEquals($parsedResponse['sessions'][0]['geo']['isoCode'], 'US'); + $this->assertEquals($parsedResponse['sessions'][0]['geo']['country'], 'United States'); + } + + public function testParseLogList() + { + $content = [ + 'sum' => 1, + 'logs' => [ + 0 => [ + 'event' => 'account.sessions.create', + 'ip' => '127.0.0.1', + 'time' => 1592981250, + 'osCode' => 'Mac', + 'osName' => 'Mac', + 'osVersion' => 'Mac', + 'clientType' => 'browser', + 'clientCode' => 'CM', + 'clientName' => 'Chrome Mobile iOS', + 'clientVersion' => '84.0', + 'clientEngine' => 'WebKit', + 'clientEngineVersion' => '605.1.15', + 'deviceName' => 'smartphone', + 'deviceBrand' => 'Google', + 'deviceModel' => 'Nexus 5', + 'countryCode' => 'US', + 'countryName' => 'United States' + ] + ] + ]; + + $model = Response::MODEL_LOG_LIST; + $parsedResponse = $this->filter->parse($content, $model); + + $this->assertEquals($parsedResponse['sum'], 1); + $this->assertEquals($parsedResponse['logs'][0]['event'], 'account.sessions.create'); + $this->assertEquals($parsedResponse['logs'][0]['ip'], '127.0.0.1'); + $this->assertEquals($parsedResponse['logs'][0]['time'], 1592981250); + $this->assertEquals($parsedResponse['logs'][0]['OS'], 'Mac Mac'); + $this->assertEquals($parsedResponse['logs'][0]['client'], 'Chrome Mobile iOS 84.0'); + $this->assertEquals($parsedResponse['logs'][0]['device'], 'smartphone'); + $this->assertEquals($parsedResponse['logs'][0]['brand'], 'Google'); + $this->assertEquals($parsedResponse['logs'][0]['model'], 'Nexus 5'); + $this->assertEquals($parsedResponse['logs'][0]['geo']['isoCode'], 'US'); + $this->assertEquals($parsedResponse['logs'][0]['geo']['country'], 'United States'); + } + + public function testParseToken() + { + $content = [ + '$id' => 'bb8ea5c16897e', + 'userId' => '5e5ea5c168bb8', + 'secret' => '', + 'expire' => 1592981250 + ]; + + $model = Response::MODEL_TOKEN; + $parsedResponse = $this->filter->parse($content, $model); + } +} \ No newline at end of file From 8cc10c683abb85bbf24da5635734a25471763fa9 Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Thu, 31 Dec 2020 12:42:23 +0530 Subject: [PATCH 32/49] feat: unit tests for response filters --- src/Appwrite/Utopia/Response/Filters/V06.php | 2 +- tests/unit/Utopia/Filters/V06Test.php | 49 ++++++++++++++++++++ 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/src/Appwrite/Utopia/Response/Filters/V06.php b/src/Appwrite/Utopia/Response/Filters/V06.php index 4e15862108..401bfd1a64 100644 --- a/src/Appwrite/Utopia/Response/Filters/V06.php +++ b/src/Appwrite/Utopia/Response/Filters/V06.php @@ -176,7 +176,7 @@ class V06 extends Filter { $countries = $content['countries']; $parsedResponse = []; foreach($countries as $country) { - $parsedResponse['code'] = $country['name']; + $parsedResponse[$country['code']] = $country['name']; } return $parsedResponse; diff --git a/tests/unit/Utopia/Filters/V06Test.php b/tests/unit/Utopia/Filters/V06Test.php index a5d2bfaa85..0c5935793c 100644 --- a/tests/unit/Utopia/Filters/V06Test.php +++ b/tests/unit/Utopia/Filters/V06Test.php @@ -233,5 +233,54 @@ class V06Test extends TestCase $model = Response::MODEL_TOKEN; $parsedResponse = $this->filter->parse($content, $model); + + $this->assertEquals($parsedResponse['$id'], 'bb8ea5c16897e'); + $this->assertEquals($parsedResponse['userId'], '5e5ea5c168bb8'); + $this->assertEquals($parsedResponse['expire'], 1592981250); + $this->assertEquals($parsedResponse['secret'], ''); + $this->assertEquals($parsedResponse['type'], Auth::TOKEN_TYPE_RECOVERY); + } + + public function testParseLocale() + { + $content = [ + 'ip' => '127.0.0.1', + 'countryCode' => 'US', + 'country' => 'United States', + 'continentCode' => 'NA', + 'continent' => 'North America', + 'eu' => false, + 'currency' => 'USD' + ]; + + $model = Response::MODEL_LOCALE; + $parsedResponse = $this->filter->parse($content, $model); + + $this->assertEquals($parsedResponse['ip'], '127.0.0.1'); + $this->assertEquals($parsedResponse['contryCode'], 'US'); + $this->assertEquals($parsedResponse['country'], 'United States'); + $this->assertEquals($parsedResponse['continentCode'], 'NA'); + $this->assertEquals($parsedResponse['continent'], 'North America'); + $this->assertEquals($parsedResponse['eu'], false); + $this->assertEquals($parsedResponse['currency'], 'USD'); + } + + public function testParseCountryList() + { + $content = [ + 'sum' => 1, + 'countries' => [ + 0 => [ + 'name' => 'United States', + 'code' => 'US' + ] + ] + ]; + + $model = Response::MODEL_COUNTRY_LIST; + $parsedResponse = $this->filter->parse($content, $model); + + $this->assertEquals($parsedResponse['sum'], 1); + $this->assertEquals($parsedResponse['countries']['US'], 'United States'); } } \ No newline at end of file From 4fc40a387af65ebcb389a20ef9b9de5242ff2df0 Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Thu, 31 Dec 2020 13:25:25 +0530 Subject: [PATCH 33/49] feat: unit tests for response filters --- src/Appwrite/Utopia/Response/Filters/V06.php | 20 ++- tests/unit/Utopia/Filters/V06Test.php | 136 +++++++++++++++++++ 2 files changed, 149 insertions(+), 7 deletions(-) diff --git a/src/Appwrite/Utopia/Response/Filters/V06.php b/src/Appwrite/Utopia/Response/Filters/V06.php index 401bfd1a64..bed31b48bc 100644 --- a/src/Appwrite/Utopia/Response/Filters/V06.php +++ b/src/Appwrite/Utopia/Response/Filters/V06.php @@ -146,7 +146,15 @@ class V06 extends Filter { private function parseCurrencyList(array $content) { $content['locations'] = []; - return $content; + + $currencies = $content['currencies']; + $parsedResponse = []; + foreach($currencies as $currency) { + $currency['locations'] = []; + $parsedResponse[] = $currency; + } + + return $parsedResponse; } private function parseContinentList(array $content) @@ -154,7 +162,7 @@ class V06 extends Filter { $continents = $content['continents']; $parsedResponse = []; foreach($continents as $continent) { - $parsedResponse['code'] = $continent['name']; + $parsedResponse[$continent['code']] = $continent['name']; } return $parsedResponse; @@ -165,7 +173,7 @@ class V06 extends Filter { $phones = $content['phones']; $parsedResponse = []; foreach($phones as $phone) { - $parsedResponse['countryCode'] = $phone['code']; + $parsedResponse[$phone['countryCode']] = $phone['code']; } return $parsedResponse; @@ -204,9 +212,8 @@ class V06 extends Filter { { $logs = $content['logs']; $parsedResponse = []; - $index = 0; foreach($logs as $log) { - $parsedResponse[$index++] = [ + $parsedResponse[] = [ 'event' => $log['event'], 'ip' => $log['ip'], 'time' => strtotime($log['time']), @@ -228,9 +235,8 @@ class V06 extends Filter { { $sessions = $content['sessions']; $parsedResponse = []; - $index = 0; foreach($sessions as $session) { - $parsedResponse[$index++] = [ + $parsedResponse[] = [ '$id' => $session['$id'], 'OS' => $session['osName'].' '.$session['osVersion'], 'client' => $session['clientName'].' '.$session['clientVersion'], diff --git a/tests/unit/Utopia/Filters/V06Test.php b/tests/unit/Utopia/Filters/V06Test.php index 0c5935793c..3c98fc192b 100644 --- a/tests/unit/Utopia/Filters/V06Test.php +++ b/tests/unit/Utopia/Filters/V06Test.php @@ -3,7 +3,9 @@ namespace Appwrite\Tests; use Appwrite\Auth\Auth; +use Appwrite\Database\Database; use Appwrite\Database\Validator\Authorization; +use Appwrite\OpenSSL\OpenSSL; use Appwrite\Utopia\Response; use Appwrite\Utopia\Response\Filter\V06; use PHPUnit\Framework\TestCase; @@ -283,4 +285,138 @@ class V06Test extends TestCase $this->assertEquals($parsedResponse['sum'], 1); $this->assertEquals($parsedResponse['countries']['US'], 'United States'); } + + public function testParsePhoneList() + { + $content = [ + 'sum' => 1, + 'phones' => [ + 0 => [ + 'code' => '+1', + 'countryCode' => 'US', + 'countryName' => 'United States' + ] + ] + ]; + + $model = Response::MODEL_PHONE_LIST; + $parsedResponse = $this->filter->parse($content, $model); + + $this->assertEquals($parsedResponse['sum'], 1); + $this->assertEquals($parsedResponse['phones']['US'], '+1'); + } + + public function testParseContinentList() + { + $content = [ + 'sum' => 1, + 'continents' => [ + 0 => [ + 'name' => 'Europe', + 'code' => 'EU', + ] + ] + ]; + + $model = Response::MODEL_CONTINENT_LIST; + $parsedResponse = $this->filter->parse($content, $model); + + $this->assertEquals($parsedResponse['sum'], 1); + $this->assertEquals($parsedResponse['continents']['EU'], 'Europe'); + } + + public function testParseCurrencyList() + { + $content = [ + 'sum' => 1, + 'currencies' => [ + 0 => [ + 'symbol' => '$', + 'name' => 'US dollar', + 'symbolNative' => '$', + 'decimalDigits' => 2, + 'rounding' => 0, + 'code' => 'USD', + 'namePlural' => 'US Dollars' + ] + ] + ]; + + $model = Response::MODEL_CURRENCY_LIST; + $parsedResponse = $this->filter->parse($content, $model); + + $this->assertEquals($parsedResponse['sum'], 1); + $this->assertEquals($parsedResponse['currencies'][0]['symbol'], '$'); + $this->assertEquals($parsedResponse['currencies'][0]['name'], 'US dollar'); + $this->assertEquals($parsedResponse['currencies'][0]['symbolNative'], '$'); + $this->assertEquals($parsedResponse['currencies'][0]['decimalDigits'], 2); + $this->assertEquals($parsedResponse['currencies'][0]['rounding'], 0); + $this->assertEquals($parsedResponse['currencies'][0]['code'], 'USD'); + $this->assertEquals($parsedResponse['currencies'][0]['namePlural'], 'US Dollars'); + $this->assertEquals($parsedResponse['currencies'][0]['locations'], []); + } + + public function testParseFile() + { + $content = [ + '$id' => '5e5ea5c16897e', + '$permissions' => ['read' => ['*'], 'write' => ['*']], + 'name' => 'Pink.png', + 'dateCreated' => 1592981250, + 'signature' => '5d529fd02b544198ae075bd57c1762bb', + 'mimeType' => 'image/png', + 'sizeOriginal' => 17890 + ]; + + $model = Response::MODEL_FILE; + $parsedResponse = $this->filter->parse($content, $model); + + $this->assertEquals($parsedResponse['$id'], '5e5ea5c16897e'); + $this->assertEquals($parsedResponse['$permissions'], ['read' => ['*'], 'write' => ['*']]); + $this->assertEquals($parsedResponse['name'], 'Pink.png'); + $this->assertEquals($parsedResponse['dateCreated'], 1592981250); + $this->assertEquals($parsedResponse['signature'], '5d529fd02b544198ae075bd57c1762bb'); + $this->assertEquals($parsedResponse['mimeType'], 'image/png'); + $this->assertEquals($parsedResponse['sizeOriginal'], 17890); + $this->assertEquals($parsedResponse['$collection'], Database::SYSTEM_COLLECTION_FILES); + $this->assertEquals($parsedResponse['algorithm'], 'gzip'); + $this->assertEquals($parsedResponse['comment'], ''); + $this->assertEquals($parsedResponse['fileOpenSSLCipher'], OpenSSL::CIPHER_AES_128_GCM); + $this->assertEquals($parsedResponse['fileOpenSSLIV'], ''); + $this->assertEquals($parsedResponse['fileOpenSSLTag'], ''); + $this->assertEquals($parsedResponse['fileOpenSSLVersion'], ''); + $this->assertEquals($parsedResponse['folderId'], ''); + $this->assertEquals($parsedResponse['path'], ''); + $this->assertEquals($parsedResponse['sizeActual'], $content['sizeOriginal']); + $this->assertEquals($parsedResponse['token'], ''); + } + + public function testParseCollection() + { + $content = [ + '$id' => '5e5ea5c16897e', + '$permissions' => ['read' => ['*'], 'write' => ['*']], + 'name' => 'Movies', + 'dateCreated' => 1592981250, + 'dateUpdated' => '5d529fd02b544198ae075bd57c1762bb', + 'rules' => [] + ]; + + $model = Response::MODEL_COLLECTION; + $parsedResponse = $this->filter->parse($content, $model); + + $this->assertEquals($parsedResponse['$id'], '5e5ea5c16897e'); + $this->assertEquals($parsedResponse['$permissions'], ['read' => ['*'], 'write' => ['*']]); + $this->assertEquals($parsedResponse['name'], 'Movies'); + $this->assertEquals($parsedResponse['dateCreated'], 1592981250); + $this->assertEquals($parsedResponse['dateUpdated'], '5d529fd02b544198ae075bd57c1762bb'); + $this->assertEquals($parsedResponse['rules'], []); + $this->assertEquals($parsedResponse['$collection'], Database::SYSTEM_COLLECTION_COLLECTIONS); + $this->assertEquals($parsedResponse['structure'], true); + } + + public function testParseCollectionList() + { + + } } \ No newline at end of file From 734e0c3a818c84be4fa5295af929949ca3c658eb Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Thu, 31 Dec 2020 13:42:01 +0530 Subject: [PATCH 34/49] feat: unit tests for response filters --- tests/unit/Utopia/Filters/V06Test.php | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/tests/unit/Utopia/Filters/V06Test.php b/tests/unit/Utopia/Filters/V06Test.php index 3c98fc192b..2db87c8eb7 100644 --- a/tests/unit/Utopia/Filters/V06Test.php +++ b/tests/unit/Utopia/Filters/V06Test.php @@ -418,5 +418,31 @@ class V06Test extends TestCase public function testParseCollectionList() { + $content = [ + 'sum' => 1, + 'collections' => [ + 0 => [ + '$id' => '5e5ea5c16897e', + '$permissions' => ['read' => ['*'], 'write' => ['*']], + 'name' => 'Movies', + 'dateCreated' => 1592981250, + 'dateUpdated' => '5d529fd02b544198ae075bd57c1762bb', + 'rules' => [] + ] + ] + ]; + + $model = Response::MODEL_COLLECTION_LIST; + $parsedResponse = $this->filter->parse($content, $model); + + $this->assertEquals($parsedResponse['sum'], 1); + $this->assertEquals($parsedResponse['collections'][0]['$id'], '5e5ea5c16897e'); + $this->assertEquals($parsedResponse['collections'][0]['$permissions'], ['read' => ['*'], 'write' => ['*']]); + $this->assertEquals($parsedResponse['collections'][0]['name'], 'Movies'); + $this->assertEquals($parsedResponse['collections'][0]['dateCreated'], 1592981250); + $this->assertEquals($parsedResponse['collections'][0]['dateUpdated'], '5d529fd02b544198ae075bd57c1762bb'); + $this->assertEquals($parsedResponse['collections'][0]['rules'], []); + $this->assertEquals($parsedResponse['collections'][0]['$collection'], Database::SYSTEM_COLLECTION_COLLECTIONS); + $this->assertEquals($parsedResponse['collections'][0]['structure'], true); } } \ No newline at end of file From d191a71593661fcfdf4cfb11dbb11f415a6f147a Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Fri, 1 Jan 2021 01:26:39 +0530 Subject: [PATCH 35/49] feat: review comments --- app/controllers/general.php | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/app/controllers/general.php b/app/controllers/general.php index 62ca0be580..316fb85e0c 100644 --- a/app/controllers/general.php +++ b/app/controllers/general.php @@ -24,15 +24,6 @@ Config::setParam('domainVerification', false); Config::setParam('cookieDomain', 'localhost'); Config::setParam('cookieSamesite', Response::COOKIE_SAMESITE_NONE); -function mapResponseFormatToClass(string $responseFormat): Filter { - switch($responseFormat) { - case preg_match($responseFormat, "/0\.[0-6]\.\d?/"): - return new V06(); - default: - return null; - } -} - App::init(function ($utopia, $request, $response, $console, $project, $user, $locale, $events, $audits, $usage, $deletes, $clients) { /** @var Utopia\Swoole\Request $request */ /** @var Appwrite\Utopia\Response $response */ @@ -108,14 +99,15 @@ App::init(function ($utopia, $request, $response, $console, $project, $user, $lo /* * Response format */ - $responseFormatEnvVar = App::getEnv('_APP_SYSTEM_RESPONSE_FORMAT', ''); - $responseFormatHeader = $request->getHeader('x-appwrite-response-format', ''); - $responseFormat = empty($responseFormatHeader) ? $responseFormatEnvVar : $responseFormatHeader; - if (empty($responseFormat) || ($filter = mapResponseFormatToClass($responseFormat)) == null) { - throw new Exception('No filter available for response format : '.$responseFormat, 404); - } else { - Response::setFilter($filter); + $responseFormat = $request->getHeader('x-appwrite-response-format', App::getEnv('_APP_SYSTEM_RESPONSE_FORMAT', '')); + switch($responseFormat) { + case version_compare ($responseFormat , '0.6.2', '=<') : + Response::setFilter(new V06()); + break; + default: + throw new Exception('No filter available for response format : '.$responseFormat, 404); } + /* * Security Headers From ad34b275dd7418ebabcaaf7887ef216d5d03cc7f Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Sat, 2 Jan 2021 21:05:21 +0530 Subject: [PATCH 36/49] feat: review comments --- app/controllers/general.php | 15 ++++++++------- app/http.php | 5 ----- 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/app/controllers/general.php b/app/controllers/general.php index 316fb85e0c..c56b312357 100644 --- a/app/controllers/general.php +++ b/app/controllers/general.php @@ -100,14 +100,15 @@ App::init(function ($utopia, $request, $response, $console, $project, $user, $lo * Response format */ $responseFormat = $request->getHeader('x-appwrite-response-format', App::getEnv('_APP_SYSTEM_RESPONSE_FORMAT', '')); - switch($responseFormat) { - case version_compare ($responseFormat , '0.6.2', '=<') : - Response::setFilter(new V06()); - break; - default: - throw new Exception('No filter available for response format : '.$responseFormat, 404); + if (!empty($responseFormat)) { + switch($responseFormat) { + case version_compare ($responseFormat , '0.6.2', '=<') : + Response::setFilter(new V06()); + break; + default: + throw new Exception('No filter available for response format : '.$responseFormat, 400); + } } - /* * Security Headers diff --git a/app/http.php b/app/http.php index c409230418..9e27f21375 100644 --- a/app/http.php +++ b/app/http.php @@ -50,11 +50,6 @@ $http->on('AfterReload', function($serv, $workerId) { $http->on('start', function (Server $http) use ($payloadSize) { - if(empty($responseFormat)) { - Console::error('Missing value for environment variable _APP_SYSTEM_RESPONSE_FORMAT. Exiting ...'); - exit(1); - } - Console::success('Server started succefully (max payload is '.number_format($payloadSize).' bytes)'); Console::info("Master pid {$http->master_pid}, manager pid {$http->manager_pid}"); From d8561d030a3442e5d427fa7aa1b22d2da355928d Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Sat, 2 Jan 2021 21:10:00 +0530 Subject: [PATCH 37/49] feat: added env varible --- .env | 2 +- Dockerfile | 2 +- app/config/variables.php | 6 ++++++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/.env b/.env index 5484ea858b..ef84b538c0 100644 --- a/.env +++ b/.env @@ -31,4 +31,4 @@ _APP_FUNCTIONS_CPUS=1 _APP_FUNCTIONS_MEMORY=128 _APP_FUNCTIONS_MEMORY_SWAP=128 _APP_MAINTENANCE_INTERVAL=86400 -_APP_SYSTEM_RESPONSE_FORMAT=0.6 \ No newline at end of file +_APP_SYSTEM_RESPONSE_FORMAT=0.7 \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index cc72b5b776..7adeb42a18 100755 --- a/Dockerfile +++ b/Dockerfile @@ -97,7 +97,7 @@ ENV _APP_SERVER=swoole \ _APP_FUNCTIONS_MEMORY_SWAP=128 \ _APP_SETUP=self-hosted \ _APP_VERSION=$VERSION \ - _APP_SYSTEM_RESPONSE_FORMAT=0.6 \ + _APP_SYSTEM_RESPONSE_FORMAT=0.7 \ # 1 Day = 86400 s _APP_MAINTENANCE_INTERVAL=86400 #ENV _APP_SMTP_SECURE '' diff --git a/app/config/variables.php b/app/config/variables.php index 0893dfd252..a0d4ba96c5 100644 --- a/app/config/variables.php +++ b/app/config/variables.php @@ -175,4 +175,10 @@ return [ 'required' => false, 'question' => '', ], + [ + 'name' => '_APP_SYSTEM_RESPONSE_FORMAT', + 'default' => '0.7', + 'required' => false, + 'question' => '', + ], ]; \ No newline at end of file From 92339fe66898e8c7908292d913093c556621f5bf Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Sat, 2 Jan 2021 21:45:14 +0530 Subject: [PATCH 38/49] fix: fix failing tests --- src/Appwrite/Utopia/Response.php | 2 +- tests/unit/Utopia/Filters/V06Test.php | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Appwrite/Utopia/Response.php b/src/Appwrite/Utopia/Response.php index 16fedaf8e1..9d1773a226 100644 --- a/src/Appwrite/Utopia/Response.php +++ b/src/Appwrite/Utopia/Response.php @@ -359,7 +359,7 @@ class Response extends SwooleResponse * * @return Filter */ - public static function getFilter(): Filter + public static function getFilter(): ?Filter { return self::$filter; } diff --git a/tests/unit/Utopia/Filters/V06Test.php b/tests/unit/Utopia/Filters/V06Test.php index 2db87c8eb7..42b1bba3f2 100644 --- a/tests/unit/Utopia/Filters/V06Test.php +++ b/tests/unit/Utopia/Filters/V06Test.php @@ -9,6 +9,7 @@ use Appwrite\OpenSSL\OpenSSL; use Appwrite\Utopia\Response; use Appwrite\Utopia\Response\Filter\V06; use PHPUnit\Framework\TestCase; +use Utopia\Config\Config; class V06Test extends TestCase { From e499db64eab3a279505ee8114bce63ff5a67a912 Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Sat, 2 Jan 2021 21:58:09 +0530 Subject: [PATCH 39/49] fix: fix failing tests --- .env | 2 +- Dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.env b/.env index ef84b538c0..5484ea858b 100644 --- a/.env +++ b/.env @@ -31,4 +31,4 @@ _APP_FUNCTIONS_CPUS=1 _APP_FUNCTIONS_MEMORY=128 _APP_FUNCTIONS_MEMORY_SWAP=128 _APP_MAINTENANCE_INTERVAL=86400 -_APP_SYSTEM_RESPONSE_FORMAT=0.7 \ No newline at end of file +_APP_SYSTEM_RESPONSE_FORMAT=0.6 \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 7adeb42a18..cc72b5b776 100755 --- a/Dockerfile +++ b/Dockerfile @@ -97,7 +97,7 @@ ENV _APP_SERVER=swoole \ _APP_FUNCTIONS_MEMORY_SWAP=128 \ _APP_SETUP=self-hosted \ _APP_VERSION=$VERSION \ - _APP_SYSTEM_RESPONSE_FORMAT=0.7 \ + _APP_SYSTEM_RESPONSE_FORMAT=0.6 \ # 1 Day = 86400 s _APP_MAINTENANCE_INTERVAL=86400 #ENV _APP_SMTP_SECURE '' From 83477651e60baa36a9c61efbd8a163cbc9086fcb Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Sat, 2 Jan 2021 22:23:31 +0530 Subject: [PATCH 40/49] fix: fix failing tests --- .env | 2 +- Dockerfile | 2 +- app/controllers/general.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.env b/.env index 5484ea858b..bf61b2fd6d 100644 --- a/.env +++ b/.env @@ -31,4 +31,4 @@ _APP_FUNCTIONS_CPUS=1 _APP_FUNCTIONS_MEMORY=128 _APP_FUNCTIONS_MEMORY_SWAP=128 _APP_MAINTENANCE_INTERVAL=86400 -_APP_SYSTEM_RESPONSE_FORMAT=0.6 \ No newline at end of file +_APP_SYSTEM_RESPONSE_FORMAT=0.6.2 \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index cc72b5b776..f591751706 100755 --- a/Dockerfile +++ b/Dockerfile @@ -97,7 +97,7 @@ ENV _APP_SERVER=swoole \ _APP_FUNCTIONS_MEMORY_SWAP=128 \ _APP_SETUP=self-hosted \ _APP_VERSION=$VERSION \ - _APP_SYSTEM_RESPONSE_FORMAT=0.6 \ + _APP_SYSTEM_RESPONSE_FORMAT=0.6.2 \ # 1 Day = 86400 s _APP_MAINTENANCE_INTERVAL=86400 #ENV _APP_SMTP_SECURE '' diff --git a/app/controllers/general.php b/app/controllers/general.php index c56b312357..ba0a64eb1e 100644 --- a/app/controllers/general.php +++ b/app/controllers/general.php @@ -102,7 +102,7 @@ App::init(function ($utopia, $request, $response, $console, $project, $user, $lo $responseFormat = $request->getHeader('x-appwrite-response-format', App::getEnv('_APP_SYSTEM_RESPONSE_FORMAT', '')); if (!empty($responseFormat)) { switch($responseFormat) { - case version_compare ($responseFormat , '0.6.2', '=<') : + case version_compare ($responseFormat , '0.6.2', '<=') : Response::setFilter(new V06()); break; default: From 9b1b5d3a7ee305887a9557ebf1b84143bac6758d Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Sun, 3 Jan 2021 23:37:19 +0530 Subject: [PATCH 41/49] feat: review comments --- app/controllers/general.php | 2 ++ app/http.php | 1 - src/Appwrite/Utopia/Response.php | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/controllers/general.php b/app/controllers/general.php index ba0a64eb1e..ed45f528dd 100644 --- a/app/controllers/general.php +++ b/app/controllers/general.php @@ -108,6 +108,8 @@ App::init(function ($utopia, $request, $response, $console, $project, $user, $lo default: throw new Exception('No filter available for response format : '.$responseFormat, 400); } + } else { + Response::setFilter(null); } /* diff --git a/app/http.php b/app/http.php index 9e27f21375..b3d7dcaac7 100644 --- a/app/http.php +++ b/app/http.php @@ -23,7 +23,6 @@ error_reporting(E_ALL); $http = new Server("0.0.0.0", 80); $payloadSize = max(4000000 /* 4mb */, App::getEnv('_APP_STORAGE_LIMIT', 10000000 /* 10mb */)); -$responseFormat = App::getEnv('_APP_SYSTEM_RESPONSE_FORMAT', ''); $http ->set([ diff --git a/src/Appwrite/Utopia/Response.php b/src/Appwrite/Utopia/Response.php index 9d1773a226..1fa4962bc7 100644 --- a/src/Appwrite/Utopia/Response.php +++ b/src/Appwrite/Utopia/Response.php @@ -349,7 +349,7 @@ class Response extends SwooleResponse * * @return void */ - public static function setFilter(Filter $filter) + public static function setFilter(?Filter $filter) { self::$filter = $filter; } From 50bca50d10e24674379b61b3f60d33c83d376594 Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Sun, 3 Jan 2021 23:42:11 +0530 Subject: [PATCH 42/49] feat: review comments --- .env | 2 +- Dockerfile | 1 - app/config/variables.php | 2 +- src/Appwrite/Utopia/Response.php | 14 +++++++++----- 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/.env b/.env index bf61b2fd6d..c3a0d93d8c 100644 --- a/.env +++ b/.env @@ -31,4 +31,4 @@ _APP_FUNCTIONS_CPUS=1 _APP_FUNCTIONS_MEMORY=128 _APP_FUNCTIONS_MEMORY_SWAP=128 _APP_MAINTENANCE_INTERVAL=86400 -_APP_SYSTEM_RESPONSE_FORMAT=0.6.2 \ No newline at end of file +_APP_SYSTEM_RESPONSE_FORMAT= \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index f591751706..fb578a6f1a 100755 --- a/Dockerfile +++ b/Dockerfile @@ -97,7 +97,6 @@ ENV _APP_SERVER=swoole \ _APP_FUNCTIONS_MEMORY_SWAP=128 \ _APP_SETUP=self-hosted \ _APP_VERSION=$VERSION \ - _APP_SYSTEM_RESPONSE_FORMAT=0.6.2 \ # 1 Day = 86400 s _APP_MAINTENANCE_INTERVAL=86400 #ENV _APP_SMTP_SECURE '' diff --git a/app/config/variables.php b/app/config/variables.php index a0d4ba96c5..82670c23a0 100644 --- a/app/config/variables.php +++ b/app/config/variables.php @@ -177,7 +177,7 @@ return [ ], [ 'name' => '_APP_SYSTEM_RESPONSE_FORMAT', - 'default' => '0.7', + 'default' => '', 'required' => false, 'question' => '', ], diff --git a/src/Appwrite/Utopia/Response.php b/src/Appwrite/Utopia/Response.php index 1fa4962bc7..ce22df225e 100644 --- a/src/Appwrite/Utopia/Response.php +++ b/src/Appwrite/Utopia/Response.php @@ -250,7 +250,15 @@ class Response extends SwooleResponse */ public function dynamic(Document $document, string $model): void { - $this->json($this->output($document, $model)); + $output = $this->output($document, $model); + + // If filter is set, parse the item + if(self::isFilter()){ + $item = self::getFilter()->parse($output, $model); + } + + $this->json($output); + } /** @@ -293,10 +301,6 @@ class Response extends SwooleResponse } $item = $this->output($item, $rule['type']); - // If filter is set, parse the item - if(self::isFilter()){ - $item = self::getFilter()->parse($item, $rule['type']); - } } } } From 98309e776e36af6806ab39f5ac130850e19b04ef Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Tue, 5 Jan 2021 00:00:20 +0530 Subject: [PATCH 43/49] feat: fixed failing tests --- src/Appwrite/Utopia/Response/Filters/V06.php | 30 +++++++++++--------- tests/unit/Utopia/Filters/V06Test.php | 6 +++- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/src/Appwrite/Utopia/Response/Filters/V06.php b/src/Appwrite/Utopia/Response/Filters/V06.php index bed31b48bc..9f7124f043 100644 --- a/src/Appwrite/Utopia/Response/Filters/V06.php +++ b/src/Appwrite/Utopia/Response/Filters/V06.php @@ -146,15 +146,14 @@ class V06 extends Filter { private function parseCurrencyList(array $content) { $content['locations'] = []; - $currencies = $content['currencies']; $parsedResponse = []; foreach($currencies as $currency) { $currency['locations'] = []; $parsedResponse[] = $currency; } - - return $parsedResponse; + $content['currencies'] = $parsedResponse; + return $content; } private function parseContinentList(array $content) @@ -164,8 +163,8 @@ class V06 extends Filter { foreach($continents as $continent) { $parsedResponse[$continent['code']] = $continent['name']; } - - return $parsedResponse; + $content['continents'] = $parsedResponse; + return $content; } private function parsePhoneList(array $content) @@ -175,8 +174,8 @@ class V06 extends Filter { foreach($phones as $phone) { $parsedResponse[$phone['countryCode']] = $phone['code']; } - - return $parsedResponse; + $content['phones'] = $parsedResponse; + return $content; } private function parseCountryList(array $content) @@ -186,8 +185,8 @@ class V06 extends Filter { foreach($countries as $country) { $parsedResponse[$country['code']] = $country['name']; } - - return $parsedResponse; + $content['countries'] = $parsedResponse; + return $content; } private function parseLocale(array $content) @@ -216,7 +215,7 @@ class V06 extends Filter { $parsedResponse[] = [ 'event' => $log['event'], 'ip' => $log['ip'], - 'time' => strtotime($log['time']), + 'time' => $log['time'], 'OS' => $log['osName'].' '.$log['osVersion'], 'client' => $log['clientName'].' '.$log['clientVersion'], 'device' => $log['deviceName'], @@ -228,7 +227,8 @@ class V06 extends Filter { ] ]; } - return $parsedResponse; + $content['logs'] = $parsedResponse; + return $content; } private function parseSessionList(array $content) @@ -251,7 +251,8 @@ class V06 extends Filter { ], ]; } - return $parsedResponse; + $content['sessions'] = $parsedResponse; + return $content; } private function parseSession(array $content) @@ -267,12 +268,13 @@ class V06 extends Filter { foreach($users as $user) { $parsedResponse[] = $this->parseUser($user); } - return $parsedResponse; + $content['users'] = $parsedResponse; + return $content; } private function parseUser(array $content) { - foreach (Config::getParam('providers') as $key => $provider) { + foreach (Config::getParam('providers', []) as $key => $provider) { if (!$provider['enabled']) { continue; } diff --git a/tests/unit/Utopia/Filters/V06Test.php b/tests/unit/Utopia/Filters/V06Test.php index 42b1bba3f2..71f8b4ca79 100644 --- a/tests/unit/Utopia/Filters/V06Test.php +++ b/tests/unit/Utopia/Filters/V06Test.php @@ -39,6 +39,8 @@ class V06Test extends TestCase ] ]; + Config::load('providers', __DIR__.'/../../../../app/config/providers.php'); + $model = Response::MODEL_USER; $parsedResponse = $this->filter->parse($content, $model); @@ -73,6 +75,8 @@ class V06Test extends TestCase ] ]; + Config::load('providers', __DIR__.'/../../../../app/config/providers.php'); + $model = Response::MODEL_USER_LIST; $parsedResponse = $this->filter->parse($content, $model); @@ -260,7 +264,7 @@ class V06Test extends TestCase $parsedResponse = $this->filter->parse($content, $model); $this->assertEquals($parsedResponse['ip'], '127.0.0.1'); - $this->assertEquals($parsedResponse['contryCode'], 'US'); + $this->assertEquals($parsedResponse['countryCode'], 'US'); $this->assertEquals($parsedResponse['country'], 'United States'); $this->assertEquals($parsedResponse['continentCode'], 'NA'); $this->assertEquals($parsedResponse['continent'], 'North America'); From b3e1c74803f881997d22ab1513ba0aac737ba952 Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Tue, 5 Jan 2021 17:33:54 +0530 Subject: [PATCH 44/49] feat: changed session structure --- src/Appwrite/Utopia/Response/Filters/V06.php | 23 +++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/src/Appwrite/Utopia/Response/Filters/V06.php b/src/Appwrite/Utopia/Response/Filters/V06.php index 9f7124f043..2e569406e9 100644 --- a/src/Appwrite/Utopia/Response/Filters/V06.php +++ b/src/Appwrite/Utopia/Response/Filters/V06.php @@ -12,6 +12,8 @@ use Exception; use Utopia\Config\Config; use Utopia\Locale\Locale as Locale; +use function PHPSTORM_META\map; + class V06 extends Filter { // Convert 0.7 Data format to 0.6 format @@ -238,17 +240,28 @@ class V06 extends Filter { foreach($sessions as $session) { $parsedResponse[] = [ '$id' => $session['$id'], - 'OS' => $session['osName'].' '.$session['osVersion'], - 'client' => $session['clientName'].' '.$session['clientVersion'], - 'device' => $session['deviceName'], 'brand' => $session['deviceBrand'], - 'model' => $session['deviceModel'], - 'ip' => $session['ip'], 'current' => $session['current'], + 'device' => $session['deviceName'], + 'ip' => $session['ip'], + 'model' => $session['deviceModel'], 'geo' => [ 'isoCode' => empty($session['countryCode']) ? '---' : $session['countryCode'] , 'country' => empty($session['countryName'] ) ? Locale::getText('locale.country.unknown') : $session['countryName'] ], + 'OS' => [ + 'name' => $session['osName'], + 'platform' => $session[''], + 'short_name' => $session['osCode'], + 'version' => $session['osVersion'] + ], + 'client' => [ + 'engine' => $session['clientEngine'], + 'name' => $session['clientName'], + 'short_name' => $session['clientCode'], + 'type' => $session['clientType'], + 'version' => $session['clientVersion'] + ] ]; } $content['sessions'] = $parsedResponse; From 2b9a9efca54791fc63ab7b0aa554b4c4cdc7247b Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Tue, 5 Jan 2021 17:43:14 +0530 Subject: [PATCH 45/49] feat: fixed tests for new sessions response --- src/Appwrite/Utopia/Response/Filters/V06.php | 2 +- tests/unit/Utopia/Filters/V06Test.php | 20 +++++++++++++++----- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/Appwrite/Utopia/Response/Filters/V06.php b/src/Appwrite/Utopia/Response/Filters/V06.php index 2e569406e9..7b89cbc52a 100644 --- a/src/Appwrite/Utopia/Response/Filters/V06.php +++ b/src/Appwrite/Utopia/Response/Filters/V06.php @@ -251,7 +251,7 @@ class V06 extends Filter { ], 'OS' => [ 'name' => $session['osName'], - 'platform' => $session[''], + 'platform' => '', 'short_name' => $session['osCode'], 'version' => $session['osVersion'] ], diff --git a/tests/unit/Utopia/Filters/V06Test.php b/tests/unit/Utopia/Filters/V06Test.php index 71f8b4ca79..6a0906a85f 100644 --- a/tests/unit/Utopia/Filters/V06Test.php +++ b/tests/unit/Utopia/Filters/V06Test.php @@ -175,13 +175,23 @@ class V06Test extends TestCase $this->assertEquals($parsedResponse['sum'], 1); $this->assertEquals($parsedResponse['sessions'][0]['$id'], '5e5ea5c16897e'); - $this->assertEquals($parsedResponse['sessions'][0]['OS'], 'Mac Mac'); - $this->assertEquals($parsedResponse['sessions'][0]['client'], 'Chrome Mobile iOS 84.0'); - $this->assertEquals($parsedResponse['sessions'][0]['device'], 'smartphone'); $this->assertEquals($parsedResponse['sessions'][0]['brand'], 'Google'); - $this->assertEquals($parsedResponse['sessions'][0]['model'], 'Nexus 5'); - $this->assertEquals($parsedResponse['sessions'][0]['ip'], '127.0.0.1'); $this->assertEquals($parsedResponse['sessions'][0]['current'], true); + $this->assertEquals($parsedResponse['sessions'][0]['device'], 'smartphone'); + $this->assertEquals($parsedResponse['sessions'][0]['ip'], '127.0.0.1'); + $this->assertEquals($parsedResponse['sessions'][0]['model'], 'Nexus 5'); + + $this->assertEquals($parsedResponse['sessions'][0]['OS']['name'], 'Mac'); + $this->assertEquals($parsedResponse['sessions'][0]['OS']['platform'], ''); + $this->assertEquals($parsedResponse['sessions'][0]['OS']['short_name'], 'Mac'); + $this->assertEquals($parsedResponse['sessions'][0]['OS']['version'], ''); + + $this->assertEquals($parsedResponse['sessions'][0]['client']['engine'], 'WebKit'); + $this->assertEquals($parsedResponse['sessions'][0]['client']['name'], 'Chrome Mobile iOS'); + $this->assertEquals($parsedResponse['sessions'][0]['client']['short_name'], 'CM'); + $this->assertEquals($parsedResponse['sessions'][0]['client']['type'], 'browser'); + $this->assertEquals($parsedResponse['sessions'][0]['client']['version'], '84.0'); + $this->assertEquals($parsedResponse['sessions'][0]['geo']['isoCode'], 'US'); $this->assertEquals($parsedResponse['sessions'][0]['geo']['country'], 'United States'); } From a58107b49cf18f03bc4874fc8645b7c286ad486f Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Tue, 5 Jan 2021 17:51:17 +0530 Subject: [PATCH 46/49] feat: changed log list response format and added tests --- src/Appwrite/Utopia/Response/Filters/V06.php | 21 ++++++++++++---- tests/unit/Utopia/Filters/V06Test.php | 26 ++++++++++++++------ 2 files changed, 34 insertions(+), 13 deletions(-) diff --git a/src/Appwrite/Utopia/Response/Filters/V06.php b/src/Appwrite/Utopia/Response/Filters/V06.php index 7b89cbc52a..f386edc6ad 100644 --- a/src/Appwrite/Utopia/Response/Filters/V06.php +++ b/src/Appwrite/Utopia/Response/Filters/V06.php @@ -215,17 +215,28 @@ class V06 extends Filter { $parsedResponse = []; foreach($logs as $log) { $parsedResponse[] = [ + 'brand' => $log['deviceBrand'], + 'device' => $log['deviceName'], 'event' => $log['event'], 'ip' => $log['ip'], - 'time' => $log['time'], - 'OS' => $log['osName'].' '.$log['osVersion'], - 'client' => $log['clientName'].' '.$log['clientVersion'], - 'device' => $log['deviceName'], - 'brand' => $log['deviceBrand'], 'model' => $log['deviceModel'], + 'time' => $log['time'], 'geo' => [ 'isoCode' => empty($log['countryCode']) ? '---' : $log['countryCode'] , 'country' => empty($log['countryName'] ) ? Locale::getText('locale.country.unknown') : $log['countryName'] + ], + 'OS' => [ + 'name' => $log['osName'], + 'platform' => '', + 'short_name' => $log['osCode'], + 'version' => $log['osVersion'] + ], + 'client' => [ + 'engine' => $log['clientEngine'], + 'name' => $log['clientName'], + 'short_name' => $log['clientCode'], + 'type' => $log['clientType'], + 'version' => $log['clientVersion'] ] ]; } diff --git a/tests/unit/Utopia/Filters/V06Test.php b/tests/unit/Utopia/Filters/V06Test.php index 6a0906a85f..97804acd32 100644 --- a/tests/unit/Utopia/Filters/V06Test.php +++ b/tests/unit/Utopia/Filters/V06Test.php @@ -184,7 +184,7 @@ class V06Test extends TestCase $this->assertEquals($parsedResponse['sessions'][0]['OS']['name'], 'Mac'); $this->assertEquals($parsedResponse['sessions'][0]['OS']['platform'], ''); $this->assertEquals($parsedResponse['sessions'][0]['OS']['short_name'], 'Mac'); - $this->assertEquals($parsedResponse['sessions'][0]['OS']['version'], ''); + $this->assertEquals($parsedResponse['sessions'][0]['OS']['version'], 'Mac'); $this->assertEquals($parsedResponse['sessions'][0]['client']['engine'], 'WebKit'); $this->assertEquals($parsedResponse['sessions'][0]['client']['name'], 'Chrome Mobile iOS'); @@ -227,16 +227,26 @@ class V06Test extends TestCase $parsedResponse = $this->filter->parse($content, $model); $this->assertEquals($parsedResponse['sum'], 1); + $this->assertEquals($parsedResponse['logs'][0]['brand'], 'Google'); + $this->assertEquals($parsedResponse['logs'][0]['device'], 'smartphone'); $this->assertEquals($parsedResponse['logs'][0]['event'], 'account.sessions.create'); $this->assertEquals($parsedResponse['logs'][0]['ip'], '127.0.0.1'); - $this->assertEquals($parsedResponse['logs'][0]['time'], 1592981250); - $this->assertEquals($parsedResponse['logs'][0]['OS'], 'Mac Mac'); - $this->assertEquals($parsedResponse['logs'][0]['client'], 'Chrome Mobile iOS 84.0'); - $this->assertEquals($parsedResponse['logs'][0]['device'], 'smartphone'); - $this->assertEquals($parsedResponse['logs'][0]['brand'], 'Google'); $this->assertEquals($parsedResponse['logs'][0]['model'], 'Nexus 5'); - $this->assertEquals($parsedResponse['logs'][0]['geo']['isoCode'], 'US'); - $this->assertEquals($parsedResponse['logs'][0]['geo']['country'], 'United States'); + $this->assertEquals($parsedResponse['logs'][0]['time'], 1592981250); + + $this->assertEquals($parsedResponse['sessions'][0]['OS']['name'], 'Mac'); + $this->assertEquals($parsedResponse['sessions'][0]['OS']['platform'], ''); + $this->assertEquals($parsedResponse['sessions'][0]['OS']['short_name'], 'Mac'); + $this->assertEquals($parsedResponse['sessions'][0]['OS']['version'], 'Mac'); + + $this->assertEquals($parsedResponse['sessions'][0]['client']['engine'], 'WebKit'); + $this->assertEquals($parsedResponse['sessions'][0]['client']['name'], 'Chrome Mobile iOS'); + $this->assertEquals($parsedResponse['sessions'][0]['client']['short_name'], 'CM'); + $this->assertEquals($parsedResponse['sessions'][0]['client']['type'], 'browser'); + $this->assertEquals($parsedResponse['sessions'][0]['client']['version'], '84.0'); + + $this->assertEquals($parsedResponse['sessions'][0]['geo']['isoCode'], 'US'); + $this->assertEquals($parsedResponse['sessions'][0]['geo']['country'], 'United States'); } public function testParseToken() From 075d46ba627ec657f2dbd5f894bbbe83559ff3ab Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Tue, 5 Jan 2021 18:27:18 +0530 Subject: [PATCH 47/49] feat: changed team and team list response format and added tests --- src/Appwrite/Utopia/Response/Filters/V06.php | 22 ++++++++- tests/unit/Utopia/Filters/V06Test.php | 47 ++++++++++++++++++++ 2 files changed, 67 insertions(+), 2 deletions(-) diff --git a/src/Appwrite/Utopia/Response/Filters/V06.php b/src/Appwrite/Utopia/Response/Filters/V06.php index f386edc6ad..4bbeccb83e 100644 --- a/src/Appwrite/Utopia/Response/Filters/V06.php +++ b/src/Appwrite/Utopia/Response/Filters/V06.php @@ -52,11 +52,11 @@ class V06 extends Filter { break; case Response::MODEL_TEAM: - $parsedResponse = $content; + $parsedResponse = $this->parseTeam($content); break; case Response::MODEL_TEAM_LIST: - $parsedResponse = $content['teams']; + $parsedResponse = $this->parseTeamList($content); break; case Response::MODEL_MEMBERSHIP: @@ -209,6 +209,24 @@ class V06 extends Filter { return $content; } + private function parseTeam(array $content) + { + $content['$collection'] = Database::SYSTEM_COLLECTION_TEAMS; + $content['$permissions'] = []; + return $content; + } + + private function parseTeamList(array $content) + { + $teams = $content['teams']; + $parsedResponse = []; + foreach($teams as $team) { + $parsedResponse[] = $this->parseTeam($team); + } + $content['teams'] = $parsedResponse; + return $content; + } + private function parseLogList(array $content) { $logs = $content['logs']; diff --git a/tests/unit/Utopia/Filters/V06Test.php b/tests/unit/Utopia/Filters/V06Test.php index 97804acd32..5f680fc547 100644 --- a/tests/unit/Utopia/Filters/V06Test.php +++ b/tests/unit/Utopia/Filters/V06Test.php @@ -249,6 +249,53 @@ class V06Test extends TestCase $this->assertEquals($parsedResponse['sessions'][0]['geo']['country'], 'United States'); } + public function testParseTeam() + { + $content = [ + '$id' => '5ff45ef261829', + 'name' => 'test', + 'dateCreated' => 1592981250, + 'sum' => 7 + ]; + + $model = Response::MODEL_TEAM; + $parsedResponse = $this->filter->parse($content, $model); + + $this->assertEquals($parsedResponse['$id'], '5ff45ef261829'); + $this->assertEquals($parsedResponse['name'], 'test'); + $this->assertEquals($parsedResponse['dateCreated'], 1592981250); + $this->assertEquals($parsedResponse['sum'], 7); + $this->assertEquals($parsedResponse['$collection'], 'teams'); + $this->assertEquals($parsedResponse['$permissions'], []); + } + + public function testParseTeamList() + { + $content = [ + 'sum' => 1, + 'teams' => [ + 0 => [ + '$id' => '5ff45ef261829', + 'name' => 'test', + 'dateCreated' => 1592981250, + 'sum' => 7 + ] + ] + ]; + + $model = Response::MODEL_TEAM_LIST; + $parsedResponse = $this->filter->parse($content, $model); + + $this->assertEquals($parsedResponse['sum'], 1); + $this->assertEquals($parsedResponse['teams'][0]['$id'], '5ff45ef261829'); + $this->assertEquals($parsedResponse['teams'][0]['name'], 'test'); + $this->assertEquals($parsedResponse['teams'][0]['dateCreated'], 1592981250); + $this->assertEquals($parsedResponse['teams'][0]['sum'], 7); + $this->assertEquals($parsedResponse['teams'][0]['$collection'], 'teams'); + $this->assertEquals($parsedResponse['teams'][0]['$permissions'], []); + + } + public function testParseToken() { $content = [ From 5db9c9b6253f3ae4c9601a391543f2a85668090d Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Tue, 5 Jan 2021 19:16:06 +0530 Subject: [PATCH 48/49] feat: review comments --- app/controllers/general.php | 2 +- src/Appwrite/Utopia/Response/Filters/V06.php | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/app/controllers/general.php b/app/controllers/general.php index ed45f528dd..55f196e266 100644 --- a/app/controllers/general.php +++ b/app/controllers/general.php @@ -100,7 +100,7 @@ App::init(function ($utopia, $request, $response, $console, $project, $user, $lo * Response format */ $responseFormat = $request->getHeader('x-appwrite-response-format', App::getEnv('_APP_SYSTEM_RESPONSE_FORMAT', '')); - if (!empty($responseFormat)) { + if ($responseFormat) { switch($responseFormat) { case version_compare ($responseFormat , '0.6.2', '<=') : Response::setFilter(new V06()); diff --git a/src/Appwrite/Utopia/Response/Filters/V06.php b/src/Appwrite/Utopia/Response/Filters/V06.php index 4bbeccb83e..d6bd85ac8f 100644 --- a/src/Appwrite/Utopia/Response/Filters/V06.php +++ b/src/Appwrite/Utopia/Response/Filters/V06.php @@ -193,13 +193,13 @@ class V06 extends Filter { private function parseLocale(array $content) { - $content['ip'] = empty($content['ip']) ? '' : $content['ip']; - $content['countryCode'] = empty($content['countryCode']) ? '--' : $content['countryCode']; - $content['country'] = empty($content['country']) ? Locale::getText('locale.country.unknown') : $content['country']; - $content['continent'] = empty($content['continent']) ? Locale::getText('locale.country.unknown') : $content['continent']; - $content['continentCode'] = empty($content['continentCode']) ? '--' : $content['continentCode']; - $content['eu'] = empty($content['eu']) ? false : $content['eu']; - $content['currency'] = empty($content['currency']) ? null : $content['currency']; + $content['ip'] = empty($content['ip']) ?? ''; + $content['countryCode'] = empty($content['countryCode']) ?? '--'; + $content['country'] = empty($content['country']) ?? Locale::getText('locale.country.unknown'); + $content['continent'] = empty($content['continent']) ?? Locale::getText('locale.country.unknown'); + $content['continentCode'] = empty($content['continentCode']) ?? '--'; + $content['eu'] = empty($content['eu']) ?? false; + $content['currency'] = empty($content['currency']) ?? null; return $content; } From 9c9ca6cc513b982092cad05321d3d0e852df5d3d Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Sat, 9 Jan 2021 12:29:55 +0530 Subject: [PATCH 49/49] feat: fixed issues in tests --- src/Appwrite/Utopia/Response/Filters/V06.php | 14 ++++++------- tests/unit/Utopia/Filters/V06Test.php | 22 ++++++++++---------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/Appwrite/Utopia/Response/Filters/V06.php b/src/Appwrite/Utopia/Response/Filters/V06.php index d6bd85ac8f..71080d1ddd 100644 --- a/src/Appwrite/Utopia/Response/Filters/V06.php +++ b/src/Appwrite/Utopia/Response/Filters/V06.php @@ -193,13 +193,13 @@ class V06 extends Filter { private function parseLocale(array $content) { - $content['ip'] = empty($content['ip']) ?? ''; - $content['countryCode'] = empty($content['countryCode']) ?? '--'; - $content['country'] = empty($content['country']) ?? Locale::getText('locale.country.unknown'); - $content['continent'] = empty($content['continent']) ?? Locale::getText('locale.country.unknown'); - $content['continentCode'] = empty($content['continentCode']) ?? '--'; - $content['eu'] = empty($content['eu']) ?? false; - $content['currency'] = empty($content['currency']) ?? null; + $content['ip'] = $content['ip'] ?? ''; + $content['countryCode'] = $content['countryCode'] ?? '--'; + $content['country'] = $content['country'] ?? Locale::getText('locale.country.unknown'); + $content['continent'] = $content['continent'] ?? Locale::getText('locale.country.unknown'); + $content['continentCode'] = $content['continentCode'] ?? '--'; + $content['eu'] = $content['eu'] ?? false; + $content['currency'] = $content['currency'] ?? null; return $content; } diff --git a/tests/unit/Utopia/Filters/V06Test.php b/tests/unit/Utopia/Filters/V06Test.php index 5f680fc547..59c688ea0d 100644 --- a/tests/unit/Utopia/Filters/V06Test.php +++ b/tests/unit/Utopia/Filters/V06Test.php @@ -234,19 +234,19 @@ class V06Test extends TestCase $this->assertEquals($parsedResponse['logs'][0]['model'], 'Nexus 5'); $this->assertEquals($parsedResponse['logs'][0]['time'], 1592981250); - $this->assertEquals($parsedResponse['sessions'][0]['OS']['name'], 'Mac'); - $this->assertEquals($parsedResponse['sessions'][0]['OS']['platform'], ''); - $this->assertEquals($parsedResponse['sessions'][0]['OS']['short_name'], 'Mac'); - $this->assertEquals($parsedResponse['sessions'][0]['OS']['version'], 'Mac'); + $this->assertEquals($parsedResponse['logs'][0]['OS']['name'], 'Mac'); + $this->assertEquals($parsedResponse['logs'][0]['OS']['platform'], ''); + $this->assertEquals($parsedResponse['logs'][0]['OS']['short_name'], 'Mac'); + $this->assertEquals($parsedResponse['logs'][0]['OS']['version'], 'Mac'); - $this->assertEquals($parsedResponse['sessions'][0]['client']['engine'], 'WebKit'); - $this->assertEquals($parsedResponse['sessions'][0]['client']['name'], 'Chrome Mobile iOS'); - $this->assertEquals($parsedResponse['sessions'][0]['client']['short_name'], 'CM'); - $this->assertEquals($parsedResponse['sessions'][0]['client']['type'], 'browser'); - $this->assertEquals($parsedResponse['sessions'][0]['client']['version'], '84.0'); + $this->assertEquals($parsedResponse['logs'][0]['client']['engine'], 'WebKit'); + $this->assertEquals($parsedResponse['logs'][0]['client']['name'], 'Chrome Mobile iOS'); + $this->assertEquals($parsedResponse['logs'][0]['client']['short_name'], 'CM'); + $this->assertEquals($parsedResponse['logs'][0]['client']['type'], 'browser'); + $this->assertEquals($parsedResponse['logs'][0]['client']['version'], '84.0'); - $this->assertEquals($parsedResponse['sessions'][0]['geo']['isoCode'], 'US'); - $this->assertEquals($parsedResponse['sessions'][0]['geo']['country'], 'United States'); + $this->assertEquals($parsedResponse['logs'][0]['geo']['isoCode'], 'US'); + $this->assertEquals($parsedResponse['logs'][0]['geo']['country'], 'United States'); } public function testParseTeam()