From 7fc3b955413be648c6d1b8d149d3a0131f597945 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Wed, 21 Apr 2021 13:13:37 +0300 Subject: [PATCH 01/82] Updated SDK version --- app/config/platforms.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/config/platforms.php b/app/config/platforms.php index c6718e6027..139680b419 100644 --- a/app/config/platforms.php +++ b/app/config/platforms.php @@ -331,7 +331,7 @@ return [ [ 'key' => 'cli', 'name' => 'Command Line', - 'version' => '0.7.0', + 'version' => '0.8.0', 'url' => 'https://github.com/appwrite/sdk-for-cli', 'package' => 'https://github.com/appwrite/sdk-for-cli', 'enabled' => true, From 252249e56c67208c32c937f6e29103c5d0c47e3a Mon Sep 17 00:00:00 2001 From: "Eldad A. Fux" Date: Fri, 30 Apr 2021 07:58:00 +0300 Subject: [PATCH 02/82] Update README.md --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index 16d8b6ce96..879da0e559 100644 --- a/README.md +++ b/README.md @@ -123,12 +123,11 @@ Below is a list of currently supported platforms and languages. If you wish to h #### Server * ✅   [NodeJS](https://github.com/appwrite/sdk-for-node) (Maintained by the Appwrite Team) * ✅   [PHP](https://github.com/appwrite/sdk-for-php) (Maintained by the Appwrite Team) +* ✅   [Dart](https://github.com/appwrite/sdk-for-dart) **Beta** (Maintained by the Appwrite Team) * ✅   [Deno](https://github.com/appwrite/sdk-for-deno) - **Beta** (Maintained by the Appwrite Team) * ✅   [Ruby](https://github.com/appwrite/sdk-for-ruby) - **Beta** (Maintained by the Appwrite Team) * ✅   [Python](https://github.com/appwrite/sdk-for-python) - **Beta** (Maintained by the Appwrite Team) * ✅   [.NET](https://github.com/appwrite/sdk-for-dotnet) - **Experimental** (Maintained by the Appwrite Team) -* ✅   [Dart](https://github.com/appwrite/sdk-for-dart) **Experimental** (Maintained by the Appwrite Team) -* ✅   [Go](https://github.com/appwrite/sdk-for-go) **Work in progress** (Maintained by the Appwrite Team) Looking for more SDKs? - Help us by contributing a pull request to our [SDK Generator](https://github.com/appwrite/sdk-generator)! From 34dfa8785a20fa5541e8dc0d0b62247066d2414f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 4 May 2021 17:46:06 +0000 Subject: [PATCH 03/82] Bump phpmailer/phpmailer from 6.3.0 to 6.4.1 Bumps [phpmailer/phpmailer](https://github.com/PHPMailer/PHPMailer) from 6.3.0 to 6.4.1. - [Release notes](https://github.com/PHPMailer/PHPMailer/releases) - [Changelog](https://github.com/PHPMailer/PHPMailer/blob/master/changelog.md) - [Commits](https://github.com/PHPMailer/PHPMailer/compare/v6.3.0...v6.4.1) Signed-off-by: dependabot[bot] --- composer.json | 2 +- composer.lock | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/composer.json b/composer.json index e02c17d16f..bdbb9543c3 100644 --- a/composer.json +++ b/composer.json @@ -57,7 +57,7 @@ "matomo/device-detector": "4.1.0", "dragonmantank/cron-expression": "3.1.0", "influxdb/influxdb-php": "1.15.2", - "phpmailer/phpmailer": "6.3.0", + "phpmailer/phpmailer": "6.4.1", "chillerlan/php-qrcode": "4.3.0", "adhocore/jwt": "1.1.2", "slickdeals/statsd": "~3.0" diff --git a/composer.lock b/composer.lock index 46a4fb4e52..723654a0dc 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "a2e0fa49ac6df10ab340396b51546c3d", + "content-hash": "370390f068a8308603f857c40984de72", "packages": [ { "name": "adhocore/jwt", @@ -786,16 +786,16 @@ }, { "name": "phpmailer/phpmailer", - "version": "v6.3.0", + "version": "v6.4.1", "source": { "type": "git", "url": "https://github.com/PHPMailer/PHPMailer.git", - "reference": "4a08cf4cdd2c38d12ee2b9fa69e5d235f37a6dcb" + "reference": "9256f12d8fb0cd0500f93b19e18c356906cbed3d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/4a08cf4cdd2c38d12ee2b9fa69e5d235f37a6dcb", - "reference": "4a08cf4cdd2c38d12ee2b9fa69e5d235f37a6dcb", + "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/9256f12d8fb0cd0500f93b19e18c356906cbed3d", + "reference": "9256f12d8fb0cd0500f93b19e18c356906cbed3d", "shasum": "" }, "require": { @@ -813,7 +813,7 @@ "yoast/phpunit-polyfills": "^0.2.0" }, "suggest": { - "ext-mbstring": "Needed to send email in multibyte encoding charset", + "ext-mbstring": "Needed to send email in multibyte encoding charset or decode encoded addresses", "hayageek/oauth2-yahoo": "Needed for Yahoo XOAUTH2 authentication", "league/oauth2-google": "Needed for Google XOAUTH2 authentication", "psr/log": "For optional PSR-3 debug logging", @@ -850,7 +850,7 @@ "description": "PHPMailer is a full-featured email creation and transfer class for PHP", "support": { "issues": "https://github.com/PHPMailer/PHPMailer/issues", - "source": "https://github.com/PHPMailer/PHPMailer/tree/v6.3.0" + "source": "https://github.com/PHPMailer/PHPMailer/tree/v6.4.1" }, "funding": [ { @@ -858,7 +858,7 @@ "type": "github" } ], - "time": "2021-02-19T15:28:08+00:00" + "time": "2021-04-29T12:25:04+00:00" }, { "name": "psr/http-client", From b3badfeb8d0a4daa8203d9ca540a1d11a55e2081 Mon Sep 17 00:00:00 2001 From: Torsten Dittmann Date: Thu, 6 May 2021 17:45:32 +0200 Subject: [PATCH 04/82] feat(mock): add text response error --- app/controllers/mock.php | 21 +++++++++++++++++++++ src/Appwrite/Utopia/Response.php | 2 +- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/app/controllers/mock.php b/app/controllers/mock.php index 7e65e2d936..e92e0613be 100644 --- a/app/controllers/mock.php +++ b/app/controllers/mock.php @@ -359,6 +359,27 @@ App::get('/v1/mock/tests/general/500-error') throw new Exception('Mock 500 error', 500); }); +App::get('/v1/mock/tests/general/502-error') + ->desc('502 Error') + ->groups(['mock']) + ->label('scope', 'public') + ->label('sdk.auth', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) + ->label('sdk.namespace', 'general') + ->label('sdk.method', 'error502') + ->label('sdk.description', 'Mock a an 502 bad gateway.') + ->label('sdk.response.code', Response::STATUS_CODE_BAD_GATEWAY) + ->label('sdk.response.type', Response::CONTENT_TYPE_TEXT) + ->label('sdk.mock', true) + ->inject('response') + ->action(function ($response) { + /** @var Appwrite\Utopia\Response $response */ + + $response + ->setStatusCode(502) + ->text('This is a text error') + ; + }); + App::get('/v1/mock/tests/general/oauth2') ->desc('OAuth Login') ->groups(['mock']) diff --git a/src/Appwrite/Utopia/Response.php b/src/Appwrite/Utopia/Response.php index e7f7e4e84e..72aea479e1 100644 --- a/src/Appwrite/Utopia/Response.php +++ b/src/Appwrite/Utopia/Response.php @@ -43,7 +43,7 @@ use Appwrite\Utopia\Response\Model\Mock; // Keep last use stdClass; /** - * @method public function setStatusCode(int $code = 200): Response + * @method Response public function setStatusCode(int $code = 200): */ class Response extends SwooleResponse { From c2849a53eb6a05c8b92d2cefc547b9d1897988a4 Mon Sep 17 00:00:00 2001 From: Torsten Dittmann Date: Thu, 6 May 2021 17:48:22 +0200 Subject: [PATCH 05/82] fix(phpdocs): remove unused char --- src/Appwrite/Utopia/Response.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Appwrite/Utopia/Response.php b/src/Appwrite/Utopia/Response.php index 72aea479e1..c527de3c34 100644 --- a/src/Appwrite/Utopia/Response.php +++ b/src/Appwrite/Utopia/Response.php @@ -43,7 +43,7 @@ use Appwrite\Utopia\Response\Model\Mock; // Keep last use stdClass; /** - * @method Response public function setStatusCode(int $code = 200): + * @method Response public function setStatusCode(int $code = 200) */ class Response extends SwooleResponse { From 1894ea649076ad30f3c72efc259bd88bf96c908b Mon Sep 17 00:00:00 2001 From: Torsten Dittmann Date: Thu, 6 May 2021 17:53:07 +0200 Subject: [PATCH 06/82] fix(docs): typos --- app/controllers/mock.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/controllers/mock.php b/app/controllers/mock.php index e92e0613be..f0e0d7b50f 100644 --- a/app/controllers/mock.php +++ b/app/controllers/mock.php @@ -316,7 +316,7 @@ App::get('/v1/mock/tests/general/empty') ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'general') ->label('sdk.method', 'empty') - ->label('sdk.description', 'Mock a an empty response.') + ->label('sdk.description', 'Mock an empty response.') ->label('sdk.response.code', Response::STATUS_CODE_NOCONTENT) ->label('sdk.response.model', Response::MODEL_NONE) ->label('sdk.mock', true) @@ -334,7 +334,7 @@ App::get('/v1/mock/tests/general/400-error') ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'general') ->label('sdk.method', 'error400') - ->label('sdk.description', 'Mock a an 400 failed request.') + ->label('sdk.description', 'Mock an 400 failed request.') ->label('sdk.response.code', Response::STATUS_CODE_BAD_REQUEST) ->label('sdk.response.type', Response::CONTENT_TYPE_JSON) ->label('sdk.response.model', Response::MODEL_ERROR) @@ -350,7 +350,7 @@ App::get('/v1/mock/tests/general/500-error') ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'general') ->label('sdk.method', 'error500') - ->label('sdk.description', 'Mock a an 500 failed request.') + ->label('sdk.description', 'Mock an 500 failed request.') ->label('sdk.response.code', Response::STATUS_CODE_INTERNAL_SERVER_ERROR) ->label('sdk.response.type', Response::CONTENT_TYPE_JSON) ->label('sdk.response.model', Response::MODEL_ERROR) @@ -366,7 +366,7 @@ App::get('/v1/mock/tests/general/502-error') ->label('sdk.auth', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'general') ->label('sdk.method', 'error502') - ->label('sdk.description', 'Mock a an 502 bad gateway.') + ->label('sdk.description', 'Mock an 502 bad gateway.') ->label('sdk.response.code', Response::STATUS_CODE_BAD_GATEWAY) ->label('sdk.response.type', Response::CONTENT_TYPE_TEXT) ->label('sdk.mock', true) From 1f91e8a4605a991bf0bfb740ce13e5a3968a91aa Mon Sep 17 00:00:00 2001 From: Torsten Dittmann Date: Thu, 6 May 2021 17:53:48 +0200 Subject: [PATCH 07/82] fix(docs): typos --- app/controllers/mock.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/controllers/mock.php b/app/controllers/mock.php index f0e0d7b50f..91318bbb80 100644 --- a/app/controllers/mock.php +++ b/app/controllers/mock.php @@ -334,7 +334,7 @@ App::get('/v1/mock/tests/general/400-error') ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'general') ->label('sdk.method', 'error400') - ->label('sdk.description', 'Mock an 400 failed request.') + ->label('sdk.description', 'Mock a 400 failed request.') ->label('sdk.response.code', Response::STATUS_CODE_BAD_REQUEST) ->label('sdk.response.type', Response::CONTENT_TYPE_JSON) ->label('sdk.response.model', Response::MODEL_ERROR) @@ -350,7 +350,7 @@ App::get('/v1/mock/tests/general/500-error') ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'general') ->label('sdk.method', 'error500') - ->label('sdk.description', 'Mock an 500 failed request.') + ->label('sdk.description', 'Mock a 500 failed request.') ->label('sdk.response.code', Response::STATUS_CODE_INTERNAL_SERVER_ERROR) ->label('sdk.response.type', Response::CONTENT_TYPE_JSON) ->label('sdk.response.model', Response::MODEL_ERROR) @@ -366,7 +366,7 @@ App::get('/v1/mock/tests/general/502-error') ->label('sdk.auth', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'general') ->label('sdk.method', 'error502') - ->label('sdk.description', 'Mock an 502 bad gateway.') + ->label('sdk.description', 'Mock a 502 bad gateway.') ->label('sdk.response.code', Response::STATUS_CODE_BAD_GATEWAY) ->label('sdk.response.type', Response::CONTENT_TYPE_TEXT) ->label('sdk.mock', true) From ded3cbbb73cee03981f3642e69f698711a040ca8 Mon Sep 17 00:00:00 2001 From: Torsten Dittmann Date: Fri, 7 May 2021 15:52:40 +0200 Subject: [PATCH 08/82] fix(mock): 502 error spec --- app/controllers/mock.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/mock.php b/app/controllers/mock.php index 91318bbb80..d70830a64f 100644 --- a/app/controllers/mock.php +++ b/app/controllers/mock.php @@ -363,7 +363,7 @@ App::get('/v1/mock/tests/general/502-error') ->desc('502 Error') ->groups(['mock']) ->label('scope', 'public') - ->label('sdk.auth', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) + ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'general') ->label('sdk.method', 'error502') ->label('sdk.description', 'Mock a 502 bad gateway.') From 618324222f039a45e1f370da60c2c9d080df25af Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 8 May 2021 18:39:59 +0000 Subject: [PATCH 09/82] Bump lodash from 4.17.20 to 4.17.21 Bumps [lodash](https://github.com/lodash/lodash) from 4.17.20 to 4.17.21. - [Release notes](https://github.com/lodash/lodash/releases) - [Commits](https://github.com/lodash/lodash/compare/4.17.20...4.17.21) Signed-off-by: dependabot[bot] --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0640d4fd5e..d217ca7ca8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5821,9 +5821,9 @@ } }, "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, "lodash._escapehtmlchar": { From 72c3434860de6c14040f2d9151140f2b121a26b1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 May 2021 08:49:42 +0000 Subject: [PATCH 10/82] Bump hosted-git-info from 2.7.1 to 2.8.9 Bumps [hosted-git-info](https://github.com/npm/hosted-git-info) from 2.7.1 to 2.8.9. - [Release notes](https://github.com/npm/hosted-git-info/releases) - [Changelog](https://github.com/npm/hosted-git-info/blob/v2.8.9/CHANGELOG.md) - [Commits](https://github.com/npm/hosted-git-info/compare/v2.7.1...v2.8.9) Signed-off-by: dependabot[bot] --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0640d4fd5e..be7ac409d5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3905,9 +3905,9 @@ } }, "hosted-git-info": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", - "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "dev": true }, "html-encoding-sniffer": { From 33ca604f0277037203af91fad28a662472a66099 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 12 May 2021 00:05:26 +0000 Subject: [PATCH 11/82] Bump lodash from 4.17.20 to 4.17.21 in /tests/resources/functions/node Bumps [lodash](https://github.com/lodash/lodash) from 4.17.20 to 4.17.21. - [Release notes](https://github.com/lodash/lodash/releases) - [Commits](https://github.com/lodash/lodash/compare/4.17.20...4.17.21) Signed-off-by: dependabot[bot] --- tests/resources/functions/node/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/resources/functions/node/package-lock.json b/tests/resources/functions/node/package-lock.json index faeedef7fb..0602482860 100644 --- a/tests/resources/functions/node/package-lock.json +++ b/tests/resources/functions/node/package-lock.json @@ -200,9 +200,9 @@ } }, "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "mime-db": { "version": "1.44.0", From 9097cf2d4235eed4830c19c8dc82fcf11b7599bf Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Wed, 12 May 2021 13:57:33 +0545 Subject: [PATCH 12/82] unattended installl --- app/tasks/install.php | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/app/tasks/install.php b/app/tasks/install.php index b1b882a215..db858743eb 100644 --- a/app/tasks/install.php +++ b/app/tasks/install.php @@ -8,11 +8,15 @@ use Utopia\Analytics\GoogleAnalytics; use Utopia\CLI\Console; use Utopia\Config\Config; use Utopia\View; +use Utopia\Validator\Text; $cli ->task('install') ->desc('Install Appwrite') - ->action(function () { + ->param('httpPort', '', new Text(4), 'Server HTTP port', true) + ->param('httpsPort', '', new Text(4), 'Server HTTPS port', true) + ->param('unattended','N', new Text(1), 'A secure encryption key, make sure to make a backup of your key in a secure location') + ->action(function ($httpPort, $httpsPort, $unattended) { /** * 1. Start - DONE * 2. Check for older setup and get older version - DONE @@ -108,16 +112,20 @@ $cli } } - $httpPort = Console::confirm('Choose your server HTTP port: (default: '.$defaultHTTPPort.')'); - $httpPort = ($httpPort) ? $httpPort : $defaultHTTPPort; + if(empty($httpPort)) { + $httpPort = Console::confirm('Choose your server HTTP port: (default: '.$defaultHTTPPort.')'); + $httpPort = ($httpPort) ? $httpPort : $defaultHTTPPort; + } - $httpsPort = Console::confirm('Choose your server HTTPS port: (default: '.$defaultHTTPSPort.')'); - $httpsPort = ($httpsPort) ? $httpsPort : $defaultHTTPSPort; + if(empty($httpsPort)) { + $httpsPort = Console::confirm('Choose your server HTTPS port: (default: '.$defaultHTTPSPort.')'); + $httpsPort = ($httpsPort) ? $httpsPort : $defaultHTTPSPort; + } $input = []; foreach($vars as $key => $var) { - if(!$var['required']) { + if(!$var['required'] || $unattended === 'Y') { $input[$var['name']] = $var['default']; continue; } From d198977e5da8342a3b4f0429b5935f2af1e40fa5 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Wed, 12 May 2021 16:39:14 +0545 Subject: [PATCH 13/82] check interactive with a param --- app/tasks/install.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/tasks/install.php b/app/tasks/install.php index db858743eb..34cd6c4dfa 100644 --- a/app/tasks/install.php +++ b/app/tasks/install.php @@ -15,8 +15,8 @@ $cli ->desc('Install Appwrite') ->param('httpPort', '', new Text(4), 'Server HTTP port', true) ->param('httpsPort', '', new Text(4), 'Server HTTPS port', true) - ->param('unattended','N', new Text(1), 'A secure encryption key, make sure to make a backup of your key in a secure location') - ->action(function ($httpPort, $httpsPort, $unattended) { + ->param('interactive','Y', new Text(1), 'A secure encryption key, make sure to make a backup of your key in a secure location') + ->action(function ($httpPort, $httpsPort, $interactive) { /** * 1. Start - DONE * 2. Check for older setup and get older version - DONE @@ -125,7 +125,7 @@ $cli $input = []; foreach($vars as $key => $var) { - if(!$var['required'] || $unattended === 'Y') { + if(!$var['required'] || !Console::isInteractive() || $interactive !== 'Y') { $input[$var['name']] = $var['default']; continue; } From c20d5785d4f267f40c0212b992f61124783111d8 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Wed, 12 May 2021 18:00:22 +0545 Subject: [PATCH 14/82] signup to newsletter option in console signup --- app/views/home/auth/signup.phtml | 10 +- gulpfile.js | 1 + package-lock.json | 190 ++------------------- public/dist/scripts/app-all.js | 3 +- public/dist/scripts/app.js | 3 +- public/scripts/views/general/newsletter.js | 33 ++++ 6 files changed, 64 insertions(+), 176 deletions(-) create mode 100644 public/scripts/views/general/newsletter.js diff --git a/app/views/home/auth/signup.phtml b/app/views/home/auth/signup.phtml index b5aac01436..22a1e10ef7 100644 --- a/app/views/home/auth/signup.phtml +++ b/app/views/home/auth/signup.phtml @@ -9,6 +9,7 @@
Terms and Conditions and Privacy Policy + +
@@ -46,4 +54,4 @@ \ No newline at end of file + diff --git a/gulpfile.js b/gulpfile.js index 28204f0d08..5f5daf5a48 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -74,6 +74,7 @@ const configApp = { 'public/scripts/views/general/switch.js', 'public/scripts/views/general/theme.js', 'public/scripts/views/general/version.js', + 'public/scripts/views/general/newsletter.js', 'public/scripts/views/paging/back.js', 'public/scripts/views/paging/next.js', diff --git a/package-lock.json b/package-lock.json index a975e8049b..b156a38f59 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8077,181 +8077,25 @@ } } }, - "jest-runtime": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.4.2.tgz", - "integrity": "sha512-4Pe7Uk5a80FnbHwSOk7ojNCJvz3Ks2CNQWT5Z7MJo4tX0jb3V/LThKvD9tKPNVNyeMH98J/nzGlcwc00R2dSHQ==", + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", "dev": true, "requires": { - "@jest/console": "^26.3.0", - "@jest/environment": "^26.3.0", - "@jest/fake-timers": "^26.3.0", - "@jest/globals": "^26.4.2", - "@jest/source-map": "^26.3.0", - "@jest/test-result": "^26.3.0", - "@jest/transform": "^26.3.0", - "@jest/types": "^26.3.0", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.4", - "jest-config": "^26.4.2", - "jest-haste-map": "^26.3.0", - "jest-message-util": "^26.3.0", - "jest-mock": "^26.3.0", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.4.0", - "jest-snapshot": "^26.4.2", - "jest-util": "^26.3.0", - "jest-validate": "^26.4.2", - "slash": "^3.0.0", - "strip-bom": "^4.0.0", - "yargs": "^15.3.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "y18n": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", - "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", - "dev": true - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } + "number-is-nan": "^1.0.0" } }, "is-fullwidth-code-point": { diff --git a/public/dist/scripts/app-all.js b/public/dist/scripts/app-all.js index a780aeb287..4e813a45e7 100644 --- a/public/dist/scripts/app-all.js +++ b/public/dist/scripts/app-all.js @@ -2386,7 +2386,8 @@ for(var i=0;ib)return true if(a=sum){element.disabled=true;}else{element.disabled=false;element.value=offset+limit;}};check();for(let i=0;ires.json()).then(data=>console.log(data)).catch(erro=>console.log(error))}};element.addEventListener("submit",function(){subscribe();});}});})(window);(function(window){window.ls.container.get("view").add({selector:"data-paging-back",controller:function(element,container,expression,env){let paths=[];let limit=env.PAGING_LIMIT;let check=function(){let offset=parseInt(expression.parse(element.dataset["offset"])||"0");paths=paths.concat(expression.getPaths());if(offset-limit<0){element.disabled=true;}else{element.disabled=false;element.value=offset-limit;}};check();for(let i=0;i=sum){element.disabled=true;}else{element.disabled=false;element.value=offset+limit;}};check();for(let i=0;ib)return true if(a=sum){element.disabled=true;}else{element.disabled=false;element.value=offset+limit;}};check();for(let i=0;ires.json()).then(data=>console.log(data)).catch(erro=>console.log(error))}};element.addEventListener("submit",function(){subscribe();});}});})(window);(function(window){window.ls.container.get("view").add({selector:"data-paging-back",controller:function(element,container,expression,env){let paths=[];let limit=env.PAGING_LIMIT;let check=function(){let offset=parseInt(expression.parse(element.dataset["offset"])||"0");paths=paths.concat(expression.getPaths());if(offset-limit<0){element.disabled=true;}else{element.disabled=false;element.value=offset-limit;}};check();for(let i=0;i=sum){element.disabled=true;}else{element.disabled=false;element.value=offset+limit;}};check();for(let i=0;i res.json()) + .then(data => console.log(data)) + .catch(erro => console.log(error)) + } + }; + + element.addEventListener("submit", function () { + subscribe(); + }); + } + }); +})(window); From a38678f30d6ba7984e175e81380f551cb0dd09c8 Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Wed, 12 May 2021 19:14:41 +0530 Subject: [PATCH 15/82] feat: adding update membership role --- app/config/events.php | 5 + app/controllers/api/teams.php | 106 ++++++- tests/e2e/Services/Teams/TeamsBaseClient.php | 280 +++++++++++-------- 3 files changed, 270 insertions(+), 121 deletions(-) diff --git a/app/config/events.php b/app/config/events.php index bbccb62de9..b27a5eafb9 100644 --- a/app/config/events.php +++ b/app/config/events.php @@ -197,6 +197,11 @@ return [ 'model' => Response::MODEL_MEMBERSHIP, 'note' => 'version >= 0.7', ], + 'teams.memberships.update' => [ + 'description' => 'This event triggers when a team membership is updated.', + 'model' => Response::MODEL_MEMBERSHIP, + 'note' => 'version >= 0.8', + ], 'teams.memberships.update.status' => [ 'description' => 'This event triggers when a team memberships status is updated.', 'model' => Response::MODEL_MEMBERSHIP, diff --git a/app/controllers/api/teams.php b/app/controllers/api/teams.php index 62836ea428..79c8b502c6 100644 --- a/app/controllers/api/teams.php +++ b/app/controllers/api/teams.php @@ -444,7 +444,7 @@ App::post('/v1/teams/:teamId/memberships') ->setParam('{{text-cta}}', '#ffffff') ; - if (!$isPrivilegedUser && !$isAppUser) { // No need in comfirmation when in admin or app mode + if (!$isPrivilegedUser && !$isAppUser) { // No need of confirmation when in admin or app mode $mails ->setParam('event', 'teams.membership.create') ->setParam('from', ($project->getId() === 'console') ? '' : \sprintf($locale->getText('account.emails.team'), $project->getAttribute('name'))) @@ -471,6 +471,110 @@ App::post('/v1/teams/:teamId/memberships') ; }); +App::patch('/v1/teams/:teamId/memberships/:membershipId') + ->desc('Update Membership Roles') + ->groups(['api', 'teams']) + ->label('event', 'teams.memberships.update') + ->label('scope', 'public') + ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_KEY]) + ->label('sdk.namespace', 'teams') + ->label('sdk.method', 'updateMembershipRoles') + ->label('sdk.description', '/docs/references/teams/update-team-membership-roles.md') + ->label('sdk.response.code', Response::STATUS_CODE_OK) + ->label('sdk.response.type', Response::CONTENT_TYPE_JSON) + ->label('sdk.response.model', Response::MODEL_MEMBERSHIP) + ->param('teamId', '', new UID(), 'Team unique ID.') + ->param('membershipId', '', new UID(), 'Membership ID.') + ->param('roles', [], new ArrayList(new Key()), 'Array of strings. Use this param to set the user roles in the team. A role can be any string. Learn more about [roles and permissions](/docs/permissions). Max length for each role is 32 chars.') + ->inject('request') + ->inject('response') + ->inject('user') + ->inject('projectDB') + ->inject('audits') + ->action(function ($teamId, $membershipId, $roles, $request, $response, $user, $projectDB,$audits) { + /** @var Utopia\Swoole\Request $request */ + /** @var Appwrite\Utopia\Response $response */ + /** @var Appwrite\Database\Document $user */ + /** @var Appwrite\Database\Database $projectDB */ + /** @var Appwrite\Event\Event $audits */ + + $membership = $projectDB->getDocument($membershipId); + if (empty($membership->getId()) || Database::SYSTEM_COLLECTION_MEMBERSHIPS != $membership->getCollection()) { + throw new Exception('Membership not found', 404); + } + + if ($membership->getAttribute('teamId') !== $teamId) { + throw new Exception('Team IDs don\'t match', 404); + } + + $team = $projectDB->getDocument($teamId); + if (empty($team->getId()) || Database::SYSTEM_COLLECTION_TEAMS != $team->getCollection()) { + throw new Exception('Team not found', 404); + } + + $userId = $membership->getAttribute('userId', ''); + $user = $projectDB->getCollectionFirst([ // Get user + 'limit' => 1, + 'filters' => [ + '$collection='.Database::SYSTEM_COLLECTION_USERS, + '$id='.$userId, + ], + ]); + + if (empty($user) || $user->getId() === null) { + throw new Exception("User associated with Membership Id not found", 404); + } + + $membership // Update the roles + ->setAttribute('roles', $roles) + ; + + $user + ->setAttribute('memberships', $membership, Document::SET_TYPE_APPEND) + ; + + $user = $projectDB->updateDocument($user->getArrayCopy()); + + if (false === $user) { + throw new Exception('Failed saving user to DB', 500); + } + + Authorization::disable(); + + $team = $projectDB->updateDocument(\array_merge($team->getArrayCopy(), [ + 'sum' => $team->getAttribute('sum', 0) + 1, + ])); + + Authorization::reset(); + + if (false === $team) { + throw new Exception('Failed saving team to DB', 500); + } + + $audits + ->setParam('userId', $user->getId()) + ->setParam('event', 'teams.membership.update') + ->setParam('resource', 'teams/'.$teamId) + ; + + if (!Config::getParam('domainVerification')) { + $response + ->addHeader('X-Fallback-Cookies', \json_encode([Auth::$cookieName => Auth::encodeSession($user->getId(), $secret)])) + ; + } + + $response + ->addCookie(Auth::$cookieName.'_legacy', Auth::encodeSession($user->getId(), $secret), $expiry, '/', Config::getParam('cookieDomain'), ('https' == $protocol), true, null) + ->addCookie(Auth::$cookieName, Auth::encodeSession($user->getId(), $secret), $expiry, '/', Config::getParam('cookieDomain'), ('https' == $protocol), true, Config::getParam('cookieSamesite')) + ; + + $response->dynamic(new Document(\array_merge($membership->getArrayCopy(), [ + 'email' => $user->getAttribute('email'), + 'name' => $user->getAttribute('name'), + ])), Response::MODEL_MEMBERSHIP); + + }); + App::get('/v1/teams/:teamId/memberships') ->desc('Get Team Memberships') ->groups(['api', 'teams']) diff --git a/tests/e2e/Services/Teams/TeamsBaseClient.php b/tests/e2e/Services/Teams/TeamsBaseClient.php index e41e5531ff..084f5c6aa4 100644 --- a/tests/e2e/Services/Teams/TeamsBaseClient.php +++ b/tests/e2e/Services/Teams/TeamsBaseClient.php @@ -6,34 +6,34 @@ use Tests\E2E\Client; trait TeamsBaseClient { - /** - * @depends testCreateTeam - */ - public function testGetTeamMemberships($data):array - { - $teamUid = $data['teamUid'] ?? ''; + // /** + // * @depends testCreateTeam + // */ + // public function testGetTeamMemberships($data):array + // { + // $teamUid = $data['teamUid'] ?? ''; - /** - * Test for SUCCESS - */ - $response = $this->client->call(Client::METHOD_GET, '/teams/'.$teamUid.'/memberships', array_merge([ - 'content-type' => 'application/json', - 'x-appwrite-project' => $this->getProject()['$id'], - ], $this->getHeaders())); + // /** + // * Test for SUCCESS + // */ + // $response = $this->client->call(Client::METHOD_GET, '/teams/'.$teamUid.'/memberships', array_merge([ + // 'content-type' => 'application/json', + // 'x-appwrite-project' => $this->getProject()['$id'], + // ], $this->getHeaders())); - $this->assertEquals(200, $response['headers']['status-code']); - $this->assertIsInt($response['body']['sum']); - $this->assertNotEmpty($response['body']['memberships'][0]['$id']); - $this->assertEquals($this->getUser()['name'], $response['body']['memberships'][0]['name']); - $this->assertEquals($this->getUser()['email'], $response['body']['memberships'][0]['email']); - $this->assertEquals('owner', $response['body']['memberships'][0]['roles'][0]); + // $this->assertEquals(200, $response['headers']['status-code']); + // $this->assertIsInt($response['body']['sum']); + // $this->assertNotEmpty($response['body']['memberships'][0]['$id']); + // $this->assertEquals($this->getUser()['name'], $response['body']['memberships'][0]['name']); + // $this->assertEquals($this->getUser()['email'], $response['body']['memberships'][0]['email']); + // $this->assertEquals('owner', $response['body']['memberships'][0]['roles'][0]); - /** - * Test for FAILURE - */ + // /** + // * Test for FAILURE + // */ - return $data; - } + // return $data; + // } /** * @depends testCreateTeam @@ -122,118 +122,158 @@ trait TeamsBaseClient ]; } + // /** + // * @depends testCreateTeamMembership + // */ + // public function testUpdateTeamMembership($data):array + // { + // $teamUid = $data['teamUid'] ?? ''; + // $secret = $data['secret'] ?? ''; + // $membershipUid = $data['membershipUid'] ?? ''; + // $userUid = $data['userUid'] ?? ''; + + // /** + // * Test for SUCCESS + // */ + // $response = $this->client->call(Client::METHOD_PATCH, '/teams/'.$teamUid.'/memberships/'.$membershipUid.'/status', array_merge([ + // 'origin' => 'http://localhost', + // 'content-type' => 'application/json', + // 'x-appwrite-project' => $this->getProject()['$id'], + // ]), [ + // 'secret' => $secret, + // 'userId' => $userUid, + // ]); + + // $this->assertEquals(200, $response['headers']['status-code']); + // $this->assertNotEmpty($response['body']['$id']); + // $this->assertNotEmpty($response['body']['userId']); + // $this->assertNotEmpty($response['body']['teamId']); + // $this->assertCount(2, $response['body']['roles']); + // $this->assertIsInt($response['body']['joined']); + // $this->assertEquals(true, $response['body']['confirm']); + + // /** + // * Test for FAILURE + // */ + // $response = $this->client->call(Client::METHOD_PATCH, '/teams/'.$teamUid.'/memberships/'.$membershipUid.'/status', array_merge([ + // 'origin' => 'http://localhost', + // 'content-type' => 'application/json', + // 'x-appwrite-project' => $this->getProject()['$id'], + // ]), [ + // 'secret' => 'sdasdasd', + // 'userId' => $userUid, + // ]); + + // $this->assertEquals(401, $response['headers']['status-code']); + + // $response = $this->client->call(Client::METHOD_PATCH, '/teams/'.$teamUid.'/memberships/'.$membershipUid.'/status', array_merge([ + // 'origin' => 'http://localhost', + // 'content-type' => 'application/json', + // 'x-appwrite-project' => $this->getProject()['$id'], + // ]), [ + // 'secret' => '', + // 'userId' => $userUid, + // ]); + + // $this->assertEquals(400, $response['headers']['status-code']); + + // $response = $this->client->call(Client::METHOD_PATCH, '/teams/'.$teamUid.'/memberships/'.$membershipUid.'/status', array_merge([ + // 'origin' => 'http://localhost', + // 'content-type' => 'application/json', + // 'x-appwrite-project' => $this->getProject()['$id'], + // ]), [ + // 'secret' => $secret, + // 'userId' => 'sdasd', + // ]); + + // $this->assertEquals(401, $response['headers']['status-code']); + + // $response = $this->client->call(Client::METHOD_PATCH, '/teams/'.$teamUid.'/memberships/'.$membershipUid.'/status', array_merge([ + // 'origin' => 'http://localhost', + // 'content-type' => 'application/json', + // 'x-appwrite-project' => $this->getProject()['$id'], + // ]), [ + // 'secret' => $secret, + // 'userId' => '', + // ]); + + // $this->assertEquals(400, $response['headers']['status-code']); + + // return $data; + // } + + // /** + // * @depends testUpdateTeamMembership + // */ + // public function testDeleteTeamMembership($data):array + // { + // $teamUid = $data['teamUid'] ?? ''; + // $membershipUid = $data['membershipUid'] ?? ''; + + // /** + // * Test for SUCCESS + // */ + // $response = $this->client->call(Client::METHOD_DELETE, '/teams/'.$teamUid.'/memberships/'.$membershipUid, array_merge([ + // 'origin' => 'http://localhost', + // 'content-type' => 'application/json', + // 'x-appwrite-project' => $this->getProject()['$id'], + // ], $this->getHeaders())); + + // $this->assertEquals(204, $response['headers']['status-code']); + // $this->assertEmpty($response['body']); + + // /** + // * Test for FAILURE + // */ + // $response = $this->client->call(Client::METHOD_GET, '/teams/'.$teamUid.'/memberships/'.$membershipUid, array_merge([ + // 'origin' => 'http://localhost', + // 'content-type' => 'application/json', + // 'x-appwrite-project' => $this->getProject()['$id'], + // ], $this->getHeaders())); + + // $this->assertEquals(200, $response['headers']['status-code']); + // $this->assertCount(1, $response['body']['memberships']); + + // return []; + // } + /** * @depends testCreateTeamMembership */ - public function testUpdateTeamMembership($data):array - { - $teamUid = $data['teamUid'] ?? ''; - $secret = $data['secret'] ?? ''; - $membershipUid = $data['membershipUid'] ?? ''; - $userUid = $data['userUid'] ?? ''; - - /** - * Test for SUCCESS - */ - $response = $this->client->call(Client::METHOD_PATCH, '/teams/'.$teamUid.'/memberships/'.$membershipUid.'/status', array_merge([ - 'origin' => 'http://localhost', - 'content-type' => 'application/json', - 'x-appwrite-project' => $this->getProject()['$id'], - ]), [ - 'secret' => $secret, - 'userId' => $userUid, - ]); - - $this->assertEquals(200, $response['headers']['status-code']); - $this->assertNotEmpty($response['body']['$id']); - $this->assertNotEmpty($response['body']['userId']); - $this->assertNotEmpty($response['body']['teamId']); - $this->assertCount(2, $response['body']['roles']); - $this->assertIsInt($response['body']['joined']); - $this->assertEquals(true, $response['body']['confirm']); - - /** - * Test for FAILURE - */ - $response = $this->client->call(Client::METHOD_PATCH, '/teams/'.$teamUid.'/memberships/'.$membershipUid.'/status', array_merge([ - 'origin' => 'http://localhost', - 'content-type' => 'application/json', - 'x-appwrite-project' => $this->getProject()['$id'], - ]), [ - 'secret' => 'sdasdasd', - 'userId' => $userUid, - ]); - - $this->assertEquals(401, $response['headers']['status-code']); - - $response = $this->client->call(Client::METHOD_PATCH, '/teams/'.$teamUid.'/memberships/'.$membershipUid.'/status', array_merge([ - 'origin' => 'http://localhost', - 'content-type' => 'application/json', - 'x-appwrite-project' => $this->getProject()['$id'], - ]), [ - 'secret' => '', - 'userId' => $userUid, - ]); - - $this->assertEquals(400, $response['headers']['status-code']); - - $response = $this->client->call(Client::METHOD_PATCH, '/teams/'.$teamUid.'/memberships/'.$membershipUid.'/status', array_merge([ - 'origin' => 'http://localhost', - 'content-type' => 'application/json', - 'x-appwrite-project' => $this->getProject()['$id'], - ]), [ - 'secret' => $secret, - 'userId' => 'sdasd', - ]); - - $this->assertEquals(401, $response['headers']['status-code']); - - $response = $this->client->call(Client::METHOD_PATCH, '/teams/'.$teamUid.'/memberships/'.$membershipUid.'/status', array_merge([ - 'origin' => 'http://localhost', - 'content-type' => 'application/json', - 'x-appwrite-project' => $this->getProject()['$id'], - ]), [ - 'secret' => $secret, - 'userId' => '', - ]); - - $this->assertEquals(400, $response['headers']['status-code']); - - return $data; - } - - /** - * @depends testUpdateTeamMembership - */ - public function testDeleteTeamMembership($data):array + public function testUpdateTeamMembershipRoles($data):array { $teamUid = $data['teamUid'] ?? ''; $membershipUid = $data['membershipUid'] ?? ''; - + /** * Test for SUCCESS */ - $response = $this->client->call(Client::METHOD_DELETE, '/teams/'.$teamUid.'/memberships/'.$membershipUid, array_merge([ + $response = $this->client->call(Client::METHOD_PATCH, '/teams/'.$teamUid.'/memberships/'.$membershipUid, array_merge([ 'origin' => 'http://localhost', 'content-type' => 'application/json', 'x-appwrite-project' => $this->getProject()['$id'], - ], $this->getHeaders())); + ], $this->getHeaders(), [ + + ])); - $this->assertEquals(204, $response['headers']['status-code']); - $this->assertEmpty($response['body']); + var_dump($response); + var_dump($teamUid); + var_dump($membershipUid); + exit(); - /** - * Test for FAILURE - */ - $response = $this->client->call(Client::METHOD_GET, '/teams/'.$teamUid.'/memberships/'.$membershipUid, array_merge([ - 'origin' => 'http://localhost', - 'content-type' => 'application/json', - 'x-appwrite-project' => $this->getProject()['$id'], - ], $this->getHeaders())); + // /** + // * Test for FAILURE + // */ + // $response = $this->client->call(Client::METHOD_GET, '/teams/'.$teamUid.'/memberships/'.$membershipUid, array_merge([ + // 'origin' => 'http://localhost', + // 'content-type' => 'application/json', + // 'x-appwrite-project' => $this->getProject()['$id'], + // ], $this->getHeaders())); - $this->assertEquals(200, $response['headers']['status-code']); - $this->assertCount(1, $response['body']['memberships']); + // $this->assertEquals(200, $response['headers']['status-code']); + // $this->assertCount(1, $response['body']['memberships']); return []; } + } \ No newline at end of file From 10435d43927a26cdf8fbd934f9622b7d81f37283 Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Wed, 12 May 2021 20:17:56 +0530 Subject: [PATCH 16/82] feat: update membership roles --- app/controllers/api/teams.php | 61 ++++++----------------------------- 1 file changed, 10 insertions(+), 51 deletions(-) diff --git a/app/controllers/api/teams.php b/app/controllers/api/teams.php index 79c8b502c6..3e34df1b53 100644 --- a/app/controllers/api/teams.php +++ b/app/controllers/api/teams.php @@ -498,6 +498,11 @@ App::patch('/v1/teams/:teamId/memberships/:membershipId') /** @var Appwrite\Database\Database $projectDB */ /** @var Appwrite\Event\Event $audits */ + $team = $projectDB->getDocument($teamId); + if (empty($team->getId()) || Database::SYSTEM_COLLECTION_TEAMS != $team->getCollection()) { + throw new Exception('Team not found', 404); + } + $membership = $projectDB->getDocument($membershipId); if (empty($membership->getId()) || Database::SYSTEM_COLLECTION_MEMBERSHIPS != $membership->getCollection()) { throw new Exception('Membership not found', 404); @@ -507,48 +512,16 @@ App::patch('/v1/teams/:teamId/memberships/:membershipId') throw new Exception('Team IDs don\'t match', 404); } - $team = $projectDB->getDocument($teamId); - if (empty($team->getId()) || Database::SYSTEM_COLLECTION_TEAMS != $team->getCollection()) { - throw new Exception('Team not found', 404); - } - - $userId = $membership->getAttribute('userId', ''); - $user = $projectDB->getCollectionFirst([ // Get user - 'limit' => 1, - 'filters' => [ - '$collection='.Database::SYSTEM_COLLECTION_USERS, - '$id='.$userId, - ], - ]); - - if (empty($user) || $user->getId() === null) { - throw new Exception("User associated with Membership Id not found", 404); - } + // Only team owner or api key should be allowed to make this request. $membership // Update the roles ->setAttribute('roles', $roles) ; - $user - ->setAttribute('memberships', $membership, Document::SET_TYPE_APPEND) - ; + $membership = $projectDB->updateDocument($membership->getArrayCopy()); - $user = $projectDB->updateDocument($user->getArrayCopy()); - - if (false === $user) { - throw new Exception('Failed saving user to DB', 500); - } - - Authorization::disable(); - - $team = $projectDB->updateDocument(\array_merge($team->getArrayCopy(), [ - 'sum' => $team->getAttribute('sum', 0) + 1, - ])); - - Authorization::reset(); - - if (false === $team) { - throw new Exception('Failed saving team to DB', 500); + if (false === $membership) { + throw new Exception('Failed updating membership', 500); } $audits @@ -557,21 +530,7 @@ App::patch('/v1/teams/:teamId/memberships/:membershipId') ->setParam('resource', 'teams/'.$teamId) ; - if (!Config::getParam('domainVerification')) { - $response - ->addHeader('X-Fallback-Cookies', \json_encode([Auth::$cookieName => Auth::encodeSession($user->getId(), $secret)])) - ; - } - - $response - ->addCookie(Auth::$cookieName.'_legacy', Auth::encodeSession($user->getId(), $secret), $expiry, '/', Config::getParam('cookieDomain'), ('https' == $protocol), true, null) - ->addCookie(Auth::$cookieName, Auth::encodeSession($user->getId(), $secret), $expiry, '/', Config::getParam('cookieDomain'), ('https' == $protocol), true, Config::getParam('cookieSamesite')) - ; - - $response->dynamic(new Document(\array_merge($membership->getArrayCopy(), [ - 'email' => $user->getAttribute('email'), - 'name' => $user->getAttribute('name'), - ])), Response::MODEL_MEMBERSHIP); + $response->dynamic(new Document($membership->getArrayCopy()), Response::MODEL_MEMBERSHIP); }); From 31dc2d79eb27e86c4549161b725589cd9f4e39cf Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Wed, 12 May 2021 22:30:22 +0530 Subject: [PATCH 17/82] feat: added enpoint for updating membership roles --- app/controllers/api/teams.php | 34 ++- tests/e2e/Services/Teams/TeamsBaseClient.php | 213 +++++++++++-------- 2 files changed, 150 insertions(+), 97 deletions(-) diff --git a/app/controllers/api/teams.php b/app/controllers/api/teams.php index 3e34df1b53..7c5614d700 100644 --- a/app/controllers/api/teams.php +++ b/app/controllers/api/teams.php @@ -508,16 +508,31 @@ App::patch('/v1/teams/:teamId/memberships/:membershipId') throw new Exception('Membership not found', 404); } - if ($membership->getAttribute('teamId') !== $teamId) { - throw new Exception('Team IDs don\'t match', 404); + $memberships = $projectDB->getCollection([ + 'limit' => 2000, + 'offset' => 0, + 'filters' => [ + '$collection='.Database::SYSTEM_COLLECTION_MEMBERSHIPS, + 'teamId='.$team->getId(), + ], + ]); + + $isPrivilegedUser = Auth::isPrivilegedUser(Authorization::$roles); + $isAppUser = Auth::isAppUser(Authorization::$roles); + $isOwner = false; + + foreach ($memberships as $member) { + if ($member->getAttribute('userId') == $user->getId() && \in_array('owner', $member->getAttribute('roles', []))) { + $isOwner = true; + } + } + + if (!$isOwner && !$isPrivilegedUser && !$isAppUser) { // Not owner, not admin, not app (server) + throw new Exception('User is not allowed to modify roles', 401); } - // Only team owner or api key should be allowed to make this request. - - $membership // Update the roles - ->setAttribute('roles', $roles) - ; - + // Update the roles + $membership->setAttribute('roles', $roles); $membership = $projectDB->updateDocument($membership->getArrayCopy()); if (false === $membership) { @@ -526,12 +541,11 @@ App::patch('/v1/teams/:teamId/memberships/:membershipId') $audits ->setParam('userId', $user->getId()) - ->setParam('event', 'teams.membership.update') + ->setParam('event', 'teams.memberships.update') ->setParam('resource', 'teams/'.$teamId) ; $response->dynamic(new Document($membership->getArrayCopy()), Response::MODEL_MEMBERSHIP); - }); App::get('/v1/teams/:teamId/memberships') diff --git a/tests/e2e/Services/Teams/TeamsBaseClient.php b/tests/e2e/Services/Teams/TeamsBaseClient.php index 084f5c6aa4..478eccb943 100644 --- a/tests/e2e/Services/Teams/TeamsBaseClient.php +++ b/tests/e2e/Services/Teams/TeamsBaseClient.php @@ -122,85 +122,88 @@ trait TeamsBaseClient ]; } - // /** - // * @depends testCreateTeamMembership - // */ - // public function testUpdateTeamMembership($data):array - // { - // $teamUid = $data['teamUid'] ?? ''; - // $secret = $data['secret'] ?? ''; - // $membershipUid = $data['membershipUid'] ?? ''; - // $userUid = $data['userUid'] ?? ''; + /** + * @depends testCreateTeamMembership + */ + public function testUpdateTeamMembership($data):array + { + $teamUid = $data['teamUid'] ?? ''; + $secret = $data['secret'] ?? ''; + $membershipUid = $data['membershipUid'] ?? ''; + $userUid = $data['userUid'] ?? ''; - // /** - // * Test for SUCCESS - // */ - // $response = $this->client->call(Client::METHOD_PATCH, '/teams/'.$teamUid.'/memberships/'.$membershipUid.'/status', array_merge([ - // 'origin' => 'http://localhost', - // 'content-type' => 'application/json', - // 'x-appwrite-project' => $this->getProject()['$id'], - // ]), [ - // 'secret' => $secret, - // 'userId' => $userUid, - // ]); + /** + * Test for SUCCESS + */ + $response = $this->client->call(Client::METHOD_PATCH, '/teams/'.$teamUid.'/memberships/'.$membershipUid.'/status', array_merge([ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ]), [ + 'secret' => $secret, + 'userId' => $userUid, + ]); - // $this->assertEquals(200, $response['headers']['status-code']); - // $this->assertNotEmpty($response['body']['$id']); - // $this->assertNotEmpty($response['body']['userId']); - // $this->assertNotEmpty($response['body']['teamId']); - // $this->assertCount(2, $response['body']['roles']); - // $this->assertIsInt($response['body']['joined']); - // $this->assertEquals(true, $response['body']['confirm']); + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertNotEmpty($response['body']['$id']); + $this->assertNotEmpty($response['body']['userId']); + $this->assertNotEmpty($response['body']['teamId']); + $this->assertCount(2, $response['body']['roles']); + $this->assertIsInt($response['body']['joined']); + $this->assertEquals(true, $response['body']['confirm']); - // /** - // * Test for FAILURE - // */ - // $response = $this->client->call(Client::METHOD_PATCH, '/teams/'.$teamUid.'/memberships/'.$membershipUid.'/status', array_merge([ - // 'origin' => 'http://localhost', - // 'content-type' => 'application/json', - // 'x-appwrite-project' => $this->getProject()['$id'], - // ]), [ - // 'secret' => 'sdasdasd', - // 'userId' => $userUid, - // ]); + $session = $this->client->parseCookie((string)$response['headers']['set-cookie'])['a_session_'.$this->getProject()['$id']]; + $data['session'] = $session; - // $this->assertEquals(401, $response['headers']['status-code']); + /** + * Test for FAILURE + */ + $response = $this->client->call(Client::METHOD_PATCH, '/teams/'.$teamUid.'/memberships/'.$membershipUid.'/status', array_merge([ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ]), [ + 'secret' => 'sdasdasd', + 'userId' => $userUid, + ]); - // $response = $this->client->call(Client::METHOD_PATCH, '/teams/'.$teamUid.'/memberships/'.$membershipUid.'/status', array_merge([ - // 'origin' => 'http://localhost', - // 'content-type' => 'application/json', - // 'x-appwrite-project' => $this->getProject()['$id'], - // ]), [ - // 'secret' => '', - // 'userId' => $userUid, - // ]); + $this->assertEquals(401, $response['headers']['status-code']); - // $this->assertEquals(400, $response['headers']['status-code']); + $response = $this->client->call(Client::METHOD_PATCH, '/teams/'.$teamUid.'/memberships/'.$membershipUid.'/status', array_merge([ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ]), [ + 'secret' => '', + 'userId' => $userUid, + ]); - // $response = $this->client->call(Client::METHOD_PATCH, '/teams/'.$teamUid.'/memberships/'.$membershipUid.'/status', array_merge([ - // 'origin' => 'http://localhost', - // 'content-type' => 'application/json', - // 'x-appwrite-project' => $this->getProject()['$id'], - // ]), [ - // 'secret' => $secret, - // 'userId' => 'sdasd', - // ]); + $this->assertEquals(400, $response['headers']['status-code']); - // $this->assertEquals(401, $response['headers']['status-code']); + $response = $this->client->call(Client::METHOD_PATCH, '/teams/'.$teamUid.'/memberships/'.$membershipUid.'/status', array_merge([ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ]), [ + 'secret' => $secret, + 'userId' => 'sdasd', + ]); - // $response = $this->client->call(Client::METHOD_PATCH, '/teams/'.$teamUid.'/memberships/'.$membershipUid.'/status', array_merge([ - // 'origin' => 'http://localhost', - // 'content-type' => 'application/json', - // 'x-appwrite-project' => $this->getProject()['$id'], - // ]), [ - // 'secret' => $secret, - // 'userId' => '', - // ]); + $this->assertEquals(401, $response['headers']['status-code']); - // $this->assertEquals(400, $response['headers']['status-code']); + $response = $this->client->call(Client::METHOD_PATCH, '/teams/'.$teamUid.'/memberships/'.$membershipUid.'/status', array_merge([ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ]), [ + 'secret' => $secret, + 'userId' => '', + ]); - // return $data; - // } + $this->assertEquals(400, $response['headers']['status-code']); + + return $data; + } // /** // * @depends testUpdateTeamMembership @@ -238,41 +241,77 @@ trait TeamsBaseClient // } /** - * @depends testCreateTeamMembership + * @depends testUpdateTeamMembership */ public function testUpdateTeamMembershipRoles($data):array { $teamUid = $data['teamUid'] ?? ''; $membershipUid = $data['membershipUid'] ?? ''; - + $session = $data['session'] ?? ''; + /** * Test for SUCCESS */ + $roles = ['admin', 'editor', 'uncle']; $response = $this->client->call(Client::METHOD_PATCH, '/teams/'.$teamUid.'/memberships/'.$membershipUid, array_merge([ 'origin' => 'http://localhost', 'content-type' => 'application/json', 'x-appwrite-project' => $this->getProject()['$id'], - ], $this->getHeaders(), [ - - ])); + ], $this->getHeaders()), [ + 'roles' => $roles + ]); - var_dump($response); - var_dump($teamUid); - var_dump($membershipUid); - exit(); + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertNotEmpty($response['body']['$id']); + $this->assertNotEmpty($response['body']['userId']); + $this->assertNotEmpty($response['body']['teamId']); + $this->assertCount(count($roles), $response['body']['roles']); + $this->assertEquals($roles[0], $response['body']['roles'][0]); + $this->assertEquals($roles[1], $response['body']['roles'][1]); + $this->assertEquals($roles[2], $response['body']['roles'][2]); - // /** - // * Test for FAILURE - // */ - // $response = $this->client->call(Client::METHOD_GET, '/teams/'.$teamUid.'/memberships/'.$membershipUid, array_merge([ - // 'origin' => 'http://localhost', - // 'content-type' => 'application/json', - // 'x-appwrite-project' => $this->getProject()['$id'], - // ], $this->getHeaders())); + /** + * Test for unknown team + */ + $response = $this->client->call(Client::METHOD_PATCH, '/teams/'.'abc'.'/memberships/'.$membershipUid, array_merge([ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'roles' => $roles + ]); - // $this->assertEquals(200, $response['headers']['status-code']); - // $this->assertCount(1, $response['body']['memberships']); + $this->assertEquals(404, $response['headers']['status-code']); + /** + * Test for unknown membership ID + */ + $response = $this->client->call(Client::METHOD_PATCH, '/teams/'.$teamUid.'/memberships/'.'abc', array_merge([ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'roles' => $roles + ]); + + $this->assertEquals(404, $response['headers']['status-code']); + + + /** + * Test for when a user other than the owner tries to update membership + */ + $response = $this->client->call(Client::METHOD_PATCH, '/teams/'.$teamUid.'/memberships/'.$membershipUid, [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + 'cookie' => 'a_session_'.$this->getProject()['$id'].'=' . $session, + ], [ + 'roles' => $roles + ]); + + $this->assertEquals(401, $response['headers']['status-code']); + $this->assertEquals('User is not allowed to modify roles', $response['body']['message']); + return []; } From 978f6463fca5232aaf0445f2c69351fc69345c8d Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Wed, 12 May 2021 22:32:08 +0530 Subject: [PATCH 18/82] feat: uncomment tests --- tests/e2e/Services/Teams/TeamsBaseClient.php | 106 +++++++++---------- 1 file changed, 53 insertions(+), 53 deletions(-) diff --git a/tests/e2e/Services/Teams/TeamsBaseClient.php b/tests/e2e/Services/Teams/TeamsBaseClient.php index 478eccb943..1f8a9ec950 100644 --- a/tests/e2e/Services/Teams/TeamsBaseClient.php +++ b/tests/e2e/Services/Teams/TeamsBaseClient.php @@ -6,34 +6,34 @@ use Tests\E2E\Client; trait TeamsBaseClient { - // /** - // * @depends testCreateTeam - // */ - // public function testGetTeamMemberships($data):array - // { - // $teamUid = $data['teamUid'] ?? ''; + /** + * @depends testCreateTeam + */ + public function testGetTeamMemberships($data):array + { + $teamUid = $data['teamUid'] ?? ''; - // /** - // * Test for SUCCESS - // */ - // $response = $this->client->call(Client::METHOD_GET, '/teams/'.$teamUid.'/memberships', array_merge([ - // 'content-type' => 'application/json', - // 'x-appwrite-project' => $this->getProject()['$id'], - // ], $this->getHeaders())); + /** + * Test for SUCCESS + */ + $response = $this->client->call(Client::METHOD_GET, '/teams/'.$teamUid.'/memberships', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders())); - // $this->assertEquals(200, $response['headers']['status-code']); - // $this->assertIsInt($response['body']['sum']); - // $this->assertNotEmpty($response['body']['memberships'][0]['$id']); - // $this->assertEquals($this->getUser()['name'], $response['body']['memberships'][0]['name']); - // $this->assertEquals($this->getUser()['email'], $response['body']['memberships'][0]['email']); - // $this->assertEquals('owner', $response['body']['memberships'][0]['roles'][0]); + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertIsInt($response['body']['sum']); + $this->assertNotEmpty($response['body']['memberships'][0]['$id']); + $this->assertEquals($this->getUser()['name'], $response['body']['memberships'][0]['name']); + $this->assertEquals($this->getUser()['email'], $response['body']['memberships'][0]['email']); + $this->assertEquals('owner', $response['body']['memberships'][0]['roles'][0]); - // /** - // * Test for FAILURE - // */ + /** + * Test for FAILURE + */ - // return $data; - // } + return $data; + } /** * @depends testCreateTeam @@ -205,40 +205,40 @@ trait TeamsBaseClient return $data; } - // /** - // * @depends testUpdateTeamMembership - // */ - // public function testDeleteTeamMembership($data):array - // { - // $teamUid = $data['teamUid'] ?? ''; - // $membershipUid = $data['membershipUid'] ?? ''; + /** + * @depends testUpdateTeamMembership + */ + public function testDeleteTeamMembership($data):array + { + $teamUid = $data['teamUid'] ?? ''; + $membershipUid = $data['membershipUid'] ?? ''; - // /** - // * Test for SUCCESS - // */ - // $response = $this->client->call(Client::METHOD_DELETE, '/teams/'.$teamUid.'/memberships/'.$membershipUid, array_merge([ - // 'origin' => 'http://localhost', - // 'content-type' => 'application/json', - // 'x-appwrite-project' => $this->getProject()['$id'], - // ], $this->getHeaders())); + /** + * Test for SUCCESS + */ + $response = $this->client->call(Client::METHOD_DELETE, '/teams/'.$teamUid.'/memberships/'.$membershipUid, array_merge([ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders())); - // $this->assertEquals(204, $response['headers']['status-code']); - // $this->assertEmpty($response['body']); + $this->assertEquals(204, $response['headers']['status-code']); + $this->assertEmpty($response['body']); - // /** - // * Test for FAILURE - // */ - // $response = $this->client->call(Client::METHOD_GET, '/teams/'.$teamUid.'/memberships/'.$membershipUid, array_merge([ - // 'origin' => 'http://localhost', - // 'content-type' => 'application/json', - // 'x-appwrite-project' => $this->getProject()['$id'], - // ], $this->getHeaders())); + /** + * Test for FAILURE + */ + $response = $this->client->call(Client::METHOD_GET, '/teams/'.$teamUid.'/memberships/'.$membershipUid, array_merge([ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders())); - // $this->assertEquals(200, $response['headers']['status-code']); - // $this->assertCount(1, $response['body']['memberships']); + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertCount(1, $response['body']['memberships']); - // return []; - // } + return []; + } /** * @depends testUpdateTeamMembership From df3f2d73e3b00464b00fd9f7369f62f314dc4826 Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Wed, 12 May 2021 22:40:44 +0530 Subject: [PATCH 19/82] feat: reorder tests --- tests/e2e/Services/Teams/TeamsBaseClient.php | 70 ++++++++++---------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/tests/e2e/Services/Teams/TeamsBaseClient.php b/tests/e2e/Services/Teams/TeamsBaseClient.php index 1f8a9ec950..f62329f7f3 100644 --- a/tests/e2e/Services/Teams/TeamsBaseClient.php +++ b/tests/e2e/Services/Teams/TeamsBaseClient.php @@ -205,41 +205,6 @@ trait TeamsBaseClient return $data; } - /** - * @depends testUpdateTeamMembership - */ - public function testDeleteTeamMembership($data):array - { - $teamUid = $data['teamUid'] ?? ''; - $membershipUid = $data['membershipUid'] ?? ''; - - /** - * Test for SUCCESS - */ - $response = $this->client->call(Client::METHOD_DELETE, '/teams/'.$teamUid.'/memberships/'.$membershipUid, array_merge([ - 'origin' => 'http://localhost', - 'content-type' => 'application/json', - 'x-appwrite-project' => $this->getProject()['$id'], - ], $this->getHeaders())); - - $this->assertEquals(204, $response['headers']['status-code']); - $this->assertEmpty($response['body']); - - /** - * Test for FAILURE - */ - $response = $this->client->call(Client::METHOD_GET, '/teams/'.$teamUid.'/memberships/'.$membershipUid, array_merge([ - 'origin' => 'http://localhost', - 'content-type' => 'application/json', - 'x-appwrite-project' => $this->getProject()['$id'], - ], $this->getHeaders())); - - $this->assertEquals(200, $response['headers']['status-code']); - $this->assertCount(1, $response['body']['memberships']); - - return []; - } - /** * @depends testUpdateTeamMembership */ @@ -312,6 +277,41 @@ trait TeamsBaseClient $this->assertEquals(401, $response['headers']['status-code']); $this->assertEquals('User is not allowed to modify roles', $response['body']['message']); + return $data; + } + + /** + * @depends testUpdateTeamMembershipRoles + */ + public function testDeleteTeamMembership($data):array + { + $teamUid = $data['teamUid'] ?? ''; + $membershipUid = $data['membershipUid'] ?? ''; + + /** + * Test for SUCCESS + */ + $response = $this->client->call(Client::METHOD_DELETE, '/teams/'.$teamUid.'/memberships/'.$membershipUid, array_merge([ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders())); + + $this->assertEquals(204, $response['headers']['status-code']); + $this->assertEmpty($response['body']); + + /** + * Test for FAILURE + */ + $response = $this->client->call(Client::METHOD_GET, '/teams/'.$teamUid.'/memberships/'.$membershipUid, array_merge([ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders())); + + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertCount(1, $response['body']['memberships']); + return []; } From 5206d5888348418defb1ae0cf8b118afabc89d3c Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Thu, 13 May 2021 18:22:54 +0545 Subject: [PATCH 20/82] updated signup process --- gulpfile.js | 1 - public/dist/scripts/app-all.js | 5 ++- public/dist/scripts/app.js | 5 ++- public/scripts/init.js | 39 +++++++++++++++++----- public/scripts/views/general/newsletter.js | 33 ------------------ 5 files changed, 35 insertions(+), 48 deletions(-) delete mode 100644 public/scripts/views/general/newsletter.js diff --git a/gulpfile.js b/gulpfile.js index 5f5daf5a48..28204f0d08 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -74,7 +74,6 @@ const configApp = { 'public/scripts/views/general/switch.js', 'public/scripts/views/general/theme.js', 'public/scripts/views/general/version.js', - 'public/scripts/views/general/newsletter.js', 'public/scripts/views/paging/back.js', 'public/scripts/views/paging/next.js', diff --git a/public/dist/scripts/app-all.js b/public/dist/scripts/app-all.js index 4e813a45e7..4d688118db 100644 --- a/public/dist/scripts/app-all.js +++ b/public/dist/scripts/app-all.js @@ -2100,7 +2100,7 @@ element.dispatchEvent(new Event('looped'));};let template=(element.children.leng else{if(debug){console.error('Missing template "'+source+'"');}} if(!init){view.render(element);} return;} -http.get(source).then(function(element){return function(data){element.innerHTML=data;view.render(element);element.dispatchEvent(new CustomEvent('template-loaded',{bubbles:true,cancelable:false}));}}(element),function(){throw new Error('Failed loading template');});};check(true);for(let i=0;iscope.max){scope.list.pop();scope.counter--;} +http.get(source).then(function(element){return function(data){element.innerHTML=data;view.render(element);element.dispatchEvent(new CustomEvent('template-loaded',{bubbles:true,cancelable:false}));}}(element),function(){throw new Error('Failed loading template');});};check(true);for(let i=0;iscope.max){scope.list.pop();scope.counter--;} if(time>0){window.setTimeout(function(message){return function(){scope.remove(message.id)}}(message),time);} return message.id;},remove:function(id){let scope=this;for(let index=0;indexres.json()).then(data=>console.log(data)).catch(erro=>console.log(error))}};element.addEventListener("submit",function(){subscribe();});}});})(window);(function(window){window.ls.container.get("view").add({selector:"data-paging-back",controller:function(element,container,expression,env){let paths=[];let limit=env.PAGING_LIMIT;let check=function(){let offset=parseInt(expression.parse(element.dataset["offset"])||"0");paths=paths.concat(expression.getPaths());if(offset-limit<0){element.disabled=true;}else{element.disabled=false;element.value=offset-limit;}};check();for(let i=0;i=sum){element.disabled=true;}else{element.disabled=false;element.value=offset+limit;}};check();for(let i=0;i=sum){element.disabled=true;}else{element.disabled=false;element.value=offset+limit;}};check();for(let i=0;iscope.max){scope.list.pop();scope.counter--;} +http.get(source).then(function(element){return function(data){element.innerHTML=data;view.render(element);element.dispatchEvent(new CustomEvent('template-loaded',{bubbles:true,cancelable:false}));}}(element),function(){throw new Error('Failed loading template');});};check(true);for(let i=0;iscope.max){scope.list.pop();scope.counter--;} if(time>0){window.setTimeout(function(message){return function(){scope.remove(message.id)}}(message),time);} return message.id;},remove:function(id){let scope=this;for(let index=0;indexres.json()).then(data=>console.log(data)).catch(erro=>console.log(error))}};element.addEventListener("submit",function(){subscribe();});}});})(window);(function(window){window.ls.container.get("view").add({selector:"data-paging-back",controller:function(element,container,expression,env){let paths=[];let limit=env.PAGING_LIMIT;let check=function(){let offset=parseInt(expression.parse(element.dataset["offset"])||"0");paths=paths.concat(expression.getPaths());if(offset-limit<0){element.disabled=true;}else{element.disabled=false;element.value=offset-limit;}};check();for(let i=0;i=sum){element.disabled=true;}else{element.disabled=false;element.value=offset+limit;}};check();for(let i=0;i=sum){element.disabled=true;}else{element.disabled=false;element.value=offset+limit;}};check();for(let i=0;i res.json()) - .then(data => console.log(data)) - .catch(erro => console.log(error)) - } - }; - - element.addEventListener("submit", function () { - subscribe(); - }); - } - }); -})(window); From 40c334a10912badc3c817f18ba901068a55c8757 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Thu, 13 May 2021 19:01:30 +0545 Subject: [PATCH 21/82] adding loading alert on signup --- public/dist/scripts/app-all.js | 2 +- public/dist/scripts/app.js | 2 +- public/scripts/init.js | 12 ++++-------- 3 files changed, 6 insertions(+), 10 deletions(-) diff --git a/public/dist/scripts/app-all.js b/public/dist/scripts/app-all.js index 4d688118db..604bf23816 100644 --- a/public/dist/scripts/app-all.js +++ b/public/dist/scripts/app-all.js @@ -2100,7 +2100,7 @@ element.dispatchEvent(new Event('looped'));};let template=(element.children.leng else{if(debug){console.error('Missing template "'+source+'"');}} if(!init){view.render(element);} return;} -http.get(source).then(function(element){return function(data){element.innerHTML=data;view.render(element);element.dispatchEvent(new CustomEvent('template-loaded',{bubbles:true,cancelable:false}));}}(element),function(){throw new Error('Failed loading template');});};check(true);for(let i=0;iscope.max){scope.list.pop();scope.counter--;} +http.get(source).then(function(element){return function(data){element.innerHTML=data;view.render(element);element.dispatchEvent(new CustomEvent('template-loaded',{bubbles:true,cancelable:false}));}}(element),function(){throw new Error('Failed loading template');});};check(true);for(let i=0;iscope.max){scope.list.pop();scope.counter--;} if(time>0){window.setTimeout(function(message){return function(){scope.remove(message.id)}}(message),time);} return message.id;},remove:function(id){let scope=this;for(let index=0;indexscope.max){scope.list.pop();scope.counter--;} +http.get(source).then(function(element){return function(data){element.innerHTML=data;view.render(element);element.dispatchEvent(new CustomEvent('template-loaded',{bubbles:true,cancelable:false}));}}(element),function(){throw new Error('Failed loading template');});};check(true);for(let i=0;iscope.max){scope.list.pop();scope.counter--;} if(time>0){window.setTimeout(function(message){return function(){scope.remove(message.id)}}(message),time);} return message.id;},remove:function(id){let scope=this;for(let index=0;index Date: Thu, 13 May 2021 19:31:52 +0530 Subject: [PATCH 22/82] Apply suggestions from code review Co-authored-by: Eldad A. Fux --- app/controllers/api/teams.php | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/app/controllers/api/teams.php b/app/controllers/api/teams.php index 7c5614d700..22459ca970 100644 --- a/app/controllers/api/teams.php +++ b/app/controllers/api/teams.php @@ -508,24 +508,10 @@ App::patch('/v1/teams/:teamId/memberships/:membershipId') throw new Exception('Membership not found', 404); } - $memberships = $projectDB->getCollection([ - 'limit' => 2000, - 'offset' => 0, - 'filters' => [ - '$collection='.Database::SYSTEM_COLLECTION_MEMBERSHIPS, - 'teamId='.$team->getId(), - ], - ]); $isPrivilegedUser = Auth::isPrivilegedUser(Authorization::$roles); $isAppUser = Auth::isAppUser(Authorization::$roles); - $isOwner = false; - - foreach ($memberships as $member) { - if ($member->getAttribute('userId') == $user->getId() && \in_array('owner', $member->getAttribute('roles', []))) { - $isOwner = true; - } - } + $isOwner = Authorization::isRole('team:'.$team->getId().'/owner');; if (!$isOwner && !$isPrivilegedUser && !$isAppUser) { // Not owner, not admin, not app (server) throw new Exception('User is not allowed to modify roles', 401); From a35a567e0e7033cc7780561e371c55eb13ed3c85 Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Thu, 13 May 2021 20:17:35 +0530 Subject: [PATCH 23/82] feat: added server side test --- app/controllers/api/teams.php | 4 +- tests/e2e/Scopes/ProjectCustom.php | 21 ++++++++ tests/e2e/Services/Teams/TeamsBaseServer.php | 50 ++++++++++++++++++++ 3 files changed, 73 insertions(+), 2 deletions(-) diff --git a/app/controllers/api/teams.php b/app/controllers/api/teams.php index 22459ca970..e9785fba7c 100644 --- a/app/controllers/api/teams.php +++ b/app/controllers/api/teams.php @@ -475,8 +475,8 @@ App::patch('/v1/teams/:teamId/memberships/:membershipId') ->desc('Update Membership Roles') ->groups(['api', 'teams']) ->label('event', 'teams.memberships.update') - ->label('scope', 'public') - ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_KEY]) + ->label('scope', 'teams.write') + ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_KEY, APP_AUTH_TYPE_JWT]) ->label('sdk.namespace', 'teams') ->label('sdk.method', 'updateMembershipRoles') ->label('sdk.description', '/docs/references/teams/update-team-membership-roles.md') diff --git a/tests/e2e/Scopes/ProjectCustom.php b/tests/e2e/Scopes/ProjectCustom.php index fc35f1ddae..3f80285282 100644 --- a/tests/e2e/Scopes/ProjectCustom.php +++ b/tests/e2e/Scopes/ProjectCustom.php @@ -154,4 +154,25 @@ trait ProjectCustom return self::$project; } + + public function getNewKey(array $scopes) { + + $projectId = self::$project['$id']; + + $key = $this->client->call(Client::METHOD_POST, '/projects/' . $projectId . '/keys', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'cookie' => 'a_session_console=' . $this->getRoot()['session'], + 'x-appwrite-project' => 'console', + ], [ + 'name' => 'Demo Project Key', + 'scopes' => $scopes, + ]); + + $this->assertEquals(201, $key['headers']['status-code']); + $this->assertNotEmpty($key['body']); + $this->assertNotEmpty($key['body']['secret']); + + return $key['body']['secret']; + } } diff --git a/tests/e2e/Services/Teams/TeamsBaseServer.php b/tests/e2e/Services/Teams/TeamsBaseServer.php index 846c321b1b..44d75fdb32 100644 --- a/tests/e2e/Services/Teams/TeamsBaseServer.php +++ b/tests/e2e/Services/Teams/TeamsBaseServer.php @@ -64,6 +64,7 @@ trait TeamsBaseServer $this->assertEquals(true, $response['body']['confirm']); $userUid = $response['body']['userId']; + $membershipUid = $response['body']['$id']; // $response = $this->client->call(Client::METHOD_GET, '/users/'.$userUid, array_merge([ // 'content-type' => 'application/json', @@ -117,6 +118,55 @@ trait TeamsBaseServer return [ 'teamUid' => $teamUid, 'userUid' => $userUid, + 'membershipUid' => $membershipUid ]; } + + /** + * @depends testCreateTeamMembership + */ + public function testUpdateMembershipRoles($data) + { + $teamUid = $data['teamUid'] ?? ''; + $membershipUid = $data['membershipUid'] ?? ''; + + /** + * Test for SUCCESS + */ + $roles = ['admin', 'editor', 'uncle']; + $response = $this->client->call(Client::METHOD_PATCH, '/teams/'.$teamUid.'/memberships/'.$membershipUid, array_merge([ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'roles' => $roles + ]); + + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertNotEmpty($response['body']['$id']); + $this->assertNotEmpty($response['body']['userId']); + $this->assertNotEmpty($response['body']['teamId']); + $this->assertCount(count($roles), $response['body']['roles']); + $this->assertEquals($roles[0], $response['body']['roles'][0]); + $this->assertEquals($roles[1], $response['body']['roles'][1]); + $this->assertEquals($roles[2], $response['body']['roles'][2]); + + + /** + * Test for FAILURE + */ + $apiKey = $this->getNewKey(['teams.read']); + $roles = ['admin', 'editor', 'uncle']; + $response = $this->client->call(Client::METHOD_PATCH, '/teams/'.$teamUid.'/memberships/'.$membershipUid, [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + 'x-appwrite-key' => $apiKey + ], [ + 'roles' => $roles + ]); + + $this->assertEquals(401, $response['headers']['status-code']); + + } } \ No newline at end of file From bd02cc83706a73e980aab02e880d10b0b5cd2ec2 Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Thu, 13 May 2021 20:36:10 +0530 Subject: [PATCH 24/82] feat: added changelog --- CHANGES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.md b/CHANGES.md index 89f4609190..e44d04c8bc 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -22,6 +22,7 @@ - Added a new env var named `_APP_LOCALE` that allow to change the default `en` locale value (#1056) - Updated all the console bottom control to be consistent. Dropped the `+` icon (#1062) - Added Response Models for Documents and Preferences (#1075, #1102) +- Added new endpoint to update team membership roles (#1142) ## Bugs From 732163bf9f0f7b54de56b016eeac3eb8b8f80c0c Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Thu, 13 May 2021 20:05:19 +0300 Subject: [PATCH 25/82] Debug --- tests/e2e/Services/Teams/TeamsBaseClient.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/e2e/Services/Teams/TeamsBaseClient.php b/tests/e2e/Services/Teams/TeamsBaseClient.php index f62329f7f3..7dfb171b58 100644 --- a/tests/e2e/Services/Teams/TeamsBaseClient.php +++ b/tests/e2e/Services/Teams/TeamsBaseClient.php @@ -152,6 +152,8 @@ trait TeamsBaseClient $this->assertIsInt($response['body']['joined']); $this->assertEquals(true, $response['body']['confirm']); + var_dump($response); + $session = $this->client->parseCookie((string)$response['headers']['set-cookie'])['a_session_'.$this->getProject()['$id']]; $data['session'] = $session; From 2c838bfa77ed797bd5e60e8663ef27ad50e2d62a Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Thu, 13 May 2021 23:29:54 +0530 Subject: [PATCH 26/82] fix: failing tests --- tests/e2e/Services/Teams/TeamsBaseClient.php | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/tests/e2e/Services/Teams/TeamsBaseClient.php b/tests/e2e/Services/Teams/TeamsBaseClient.php index d5df4d4ebd..d1ced3ca11 100644 --- a/tests/e2e/Services/Teams/TeamsBaseClient.php +++ b/tests/e2e/Services/Teams/TeamsBaseClient.php @@ -157,6 +157,7 @@ trait TeamsBaseClient $this->assertIsInt($response['body']['joined']); $this->assertEquals(true, $response['body']['confirm']); $session = $this->client->parseCookie((string)$response['headers']['set-cookie'])['a_session_'.$this->getProject()['$id']]; + $data['session'] = $session; /** * New User tries to update password without old password -> SHOULD PASS @@ -212,11 +213,6 @@ trait TeamsBaseClient $this->assertEquals($response['body']['email'], $email); $this->assertEquals($response['body']['name'], $name); - var_dump($response); - - $session = $this->client->parseCookie((string)$response['headers']['set-cookie'])['a_session_'.$this->getProject()['$id']]; - $data['session'] = $session; - /** * Test for FAILURE */ From 6a9d9edc01b60a8e3c16c4bc75e0d5bec7f99d35 Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Thu, 13 May 2021 23:31:57 +0530 Subject: [PATCH 27/82] feat: some comments --- tests/e2e/Services/Teams/TeamsBaseClient.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/e2e/Services/Teams/TeamsBaseClient.php b/tests/e2e/Services/Teams/TeamsBaseClient.php index d1ced3ca11..00ae8c186e 100644 --- a/tests/e2e/Services/Teams/TeamsBaseClient.php +++ b/tests/e2e/Services/Teams/TeamsBaseClient.php @@ -159,6 +159,8 @@ trait TeamsBaseClient $session = $this->client->parseCookie((string)$response['headers']['set-cookie'])['a_session_'.$this->getProject()['$id']]; $data['session'] = $session; + + /** [START] TESTS TO CHECK PASSWORD UPDATE OF NEW USER CREATED USING TEAM INVITE */ /** * New User tries to update password without old password -> SHOULD PASS */ @@ -213,6 +215,8 @@ trait TeamsBaseClient $this->assertEquals($response['body']['email'], $email); $this->assertEquals($response['body']['name'], $name); + /** [END] TESTS TO CHECK PASSWORD UPDATE OF NEW USER CREATED USING TEAM INVITE */ + /** * Test for FAILURE */ From bb39d90da6099d6895142df5f34018e09c48c033 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Fri, 14 May 2021 11:43:45 +0545 Subject: [PATCH 28/82] updating description for param --- app/tasks/install.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/tasks/install.php b/app/tasks/install.php index 34cd6c4dfa..cb70e090e6 100644 --- a/app/tasks/install.php +++ b/app/tasks/install.php @@ -15,7 +15,7 @@ $cli ->desc('Install Appwrite') ->param('httpPort', '', new Text(4), 'Server HTTP port', true) ->param('httpsPort', '', new Text(4), 'Server HTTPS port', true) - ->param('interactive','Y', new Text(1), 'A secure encryption key, make sure to make a backup of your key in a secure location') + ->param('interactive','Y', new Text(1), 'Run a interactive session', true) ->action(function ($httpPort, $httpsPort, $interactive) { /** * 1. Start - DONE From 52dc0a9f17e4bf1ddb46477a0a8069d3279d6b2a Mon Sep 17 00:00:00 2001 From: "Eldad A. Fux" Date: Fri, 14 May 2021 09:58:18 +0300 Subject: [PATCH 29/82] Update app/tasks/install.php --- app/tasks/install.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/tasks/install.php b/app/tasks/install.php index cb70e090e6..e2d141f6e4 100644 --- a/app/tasks/install.php +++ b/app/tasks/install.php @@ -15,7 +15,7 @@ $cli ->desc('Install Appwrite') ->param('httpPort', '', new Text(4), 'Server HTTP port', true) ->param('httpsPort', '', new Text(4), 'Server HTTPS port', true) - ->param('interactive','Y', new Text(1), 'Run a interactive session', true) + ->param('interactive','Y', new Text(1), 'Run an interactive session', true) ->action(function ($httpPort, $httpsPort, $interactive) { /** * 1. Start - DONE From d7e411cb4f94a854b864ab64420de35af7a4f770 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Fri, 14 May 2021 14:26:15 +0300 Subject: [PATCH 30/82] Fix redirect from signup --- app/views/home/auth/signup.phtml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/app/views/home/auth/signup.phtml b/app/views/home/auth/signup.phtml index 7e0532199a..d64557a686 100644 --- a/app/views/home/auth/signup.phtml +++ b/app/views/home/auth/signup.phtml @@ -1,7 +1,14 @@ getParam('root') !== 'disabled'); ?> -