From 5a469ab3622aaf949d1b78bebaf442e791cdf965 Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Sat, 29 May 2021 01:51:56 +0530 Subject: [PATCH 1/7] fix(memberships): logic for decremmenting membership count --- app/controllers/api/teams.php | 6 ++++++ app/workers/deletes.php | 23 +++++++++++++++++++---- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/app/controllers/api/teams.php b/app/controllers/api/teams.php index 238e6248a..ec10b519c 100644 --- a/app/controllers/api/teams.php +++ b/app/controllers/api/teams.php @@ -310,6 +310,8 @@ App::post('/v1/teams/:teamId/memberships') ], ]); + var_dump($invitee); + if (empty($invitee)) { // Create new user if no user with same email found $limit = $project->getAttribute('usersAuthLimit', 0); @@ -419,6 +421,8 @@ App::post('/v1/teams/:teamId/memberships') $membership = $projectDB->createDocument($membership->getArrayCopy()); } + var_dump($membership); + if (false === $membership) { throw new Exception('Failed saving membership to DB', 500); } @@ -764,6 +768,8 @@ App::delete('/v1/teams/:teamId/memberships/:membershipId') $membership = $projectDB->getDocument($membershipId); + var_dump($membership); + if (empty($membership->getId()) || Database::SYSTEM_COLLECTION_MEMBERSHIPS != $membership->getCollection()) { throw new Exception('Invite not found', 404); } diff --git a/app/workers/deletes.php b/app/workers/deletes.php index cda60b78e..3ae366afd 100644 --- a/app/workers/deletes.php +++ b/app/workers/deletes.php @@ -5,6 +5,7 @@ use Appwrite\Database\Adapter\MySQL as MySQLAdapter; use Appwrite\Database\Adapter\Redis as RedisAdapter; use Appwrite\Database\Document; use Appwrite\Database\Validator\Authorization; +use phpDocumentor\Reflection\DocBlock\Tags\Var_; use Utopia\Storage\Device\Local; use Utopia\Abuse\Abuse; use Utopia\Abuse\Adapters\TimeLimit; @@ -31,8 +32,8 @@ class DeletesV1 } public function perform() - { - $projectId = $this->args['projectId']; + { + $projectId = isset($this->args['projectId']) ? $this->args['projectId'] : ''; $type = $this->args['type']; switch (strval($type)) { @@ -127,11 +128,25 @@ class DeletesV1 } } - // Delete Memberships + var_dump("Hi there! Gonna delete memberships"); + // Delete Memberships and update the team membership counts $this->deleteByGroup([ '$collection='.Database::SYSTEM_COLLECTION_MEMBERSHIPS, 'userId='.$document->getId(), - ], $this->getProjectDB($projectId)); + ], $this->getProjectDB($projectId), function(Document $document) use ($projectId,){ + var_dump("In call back "); + print_r($document); + + if ($document->getAttribute('confirm')) { // Count only confirmed members + $teamId = $document->getAttribute('teamId'); + $team = $this->getProjectDB($projectId)->getDocument($teamId); + print_r($team); + // $team = $this->getProjectDB($projectId)->updateDocument(\array_merge($team->getArrayCopy(), [ + // 'sum' => $team->getAttribute('sum', 0) - 1, + // ])); + } + + }); } protected function deleteExecutionLogs($timestamp) From b0e74b6d7b07d944c5dac86af1b08d52707d9b6a Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Sat, 29 May 2021 02:25:22 +0530 Subject: [PATCH 2/7] fix(teams): incorrect membership count in teams --- app/controllers/api/teams.php | 2 +- app/views/console/users/user.phtml | 2 +- app/workers/deletes.php | 17 +++++++---------- 3 files changed, 9 insertions(+), 12 deletions(-) diff --git a/app/controllers/api/teams.php b/app/controllers/api/teams.php index ec10b519c..f2c417911 100644 --- a/app/controllers/api/teams.php +++ b/app/controllers/api/teams.php @@ -790,7 +790,7 @@ App::delete('/v1/teams/:teamId/memberships/:membershipId') if ($membership->getAttribute('confirm')) { // Count only confirmed members $team = $projectDB->updateDocument(\array_merge($team->getArrayCopy(), [ - 'sum' => $team->getAttribute('sum', 0) - 1, + 'sum' => \max($team->getAttribute('sum', 0) - 1, 0), ])); } diff --git a/app/views/console/users/user.phtml b/app/views/console/users/user.phtml index 14724c79a..e8b3b04ea 100644 --- a/app/views/console/users/user.phtml +++ b/app/views/console/users/user.phtml @@ -110,7 +110,7 @@ data-analytics-event="submit" data-analytics-category="console" data-analytics-label="Delete User" - data-service="users.deleteUser" + data-service="users.delete" data-event="submit" data-param-user-id="{{router.params.id}}" data-success="alert,trigger,redirect" diff --git a/app/workers/deletes.php b/app/workers/deletes.php index 3ae366afd..005a4e083 100644 --- a/app/workers/deletes.php +++ b/app/workers/deletes.php @@ -128,24 +128,21 @@ class DeletesV1 } } - var_dump("Hi there! Gonna delete memberships"); - // Delete Memberships and update the team membership counts + // Delete Memberships and decrement team membership counts $this->deleteByGroup([ '$collection='.Database::SYSTEM_COLLECTION_MEMBERSHIPS, 'userId='.$document->getId(), - ], $this->getProjectDB($projectId), function(Document $document) use ($projectId,){ - var_dump("In call back "); - print_r($document); + ], $this->getProjectDB($projectId), function(Document $document) use ($projectId) { if ($document->getAttribute('confirm')) { // Count only confirmed members $teamId = $document->getAttribute('teamId'); $team = $this->getProjectDB($projectId)->getDocument($teamId); - print_r($team); - // $team = $this->getProjectDB($projectId)->updateDocument(\array_merge($team->getArrayCopy(), [ - // 'sum' => $team->getAttribute('sum', 0) - 1, - // ])); + if(!$team->isEmpty()) { + $team = $this->getProjectDB($projectId)->updateDocument(\array_merge($team->getArrayCopy(), [ + 'sum' => \max($team->getAttribute('sum', 0) - 1, 0), + ])); + } } - }); } From 744d8b9b485220c5fbccc80f75b6df9e859f0d11 Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Sat, 29 May 2021 02:27:44 +0530 Subject: [PATCH 3/7] fix(teams): removed var_dump --- app/controllers/api/teams.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/controllers/api/teams.php b/app/controllers/api/teams.php index f2c417911..f295f9a55 100644 --- a/app/controllers/api/teams.php +++ b/app/controllers/api/teams.php @@ -768,8 +768,6 @@ App::delete('/v1/teams/:teamId/memberships/:membershipId') $membership = $projectDB->getDocument($membershipId); - var_dump($membership); - if (empty($membership->getId()) || Database::SYSTEM_COLLECTION_MEMBERSHIPS != $membership->getCollection()) { throw new Exception('Invite not found', 404); } From a7a744afb106c5b1089efa61f2949d7c4b739043 Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Sat, 29 May 2021 02:28:38 +0530 Subject: [PATCH 4/7] fix(teams): removed var_dump --- app/controllers/api/teams.php | 4 ---- 1 file changed, 4 deletions(-) diff --git a/app/controllers/api/teams.php b/app/controllers/api/teams.php index f295f9a55..88b893341 100644 --- a/app/controllers/api/teams.php +++ b/app/controllers/api/teams.php @@ -310,8 +310,6 @@ App::post('/v1/teams/:teamId/memberships') ], ]); - var_dump($invitee); - if (empty($invitee)) { // Create new user if no user with same email found $limit = $project->getAttribute('usersAuthLimit', 0); @@ -421,8 +419,6 @@ App::post('/v1/teams/:teamId/memberships') $membership = $projectDB->createDocument($membership->getArrayCopy()); } - var_dump($membership); - if (false === $membership) { throw new Exception('Failed saving membership to DB', 500); } From a6db680641e4e5c679c94b63c85a25b7f65a1571 Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Sat, 29 May 2021 02:29:15 +0530 Subject: [PATCH 5/7] fix(teams): removed unused import --- app/workers/deletes.php | 1 - 1 file changed, 1 deletion(-) diff --git a/app/workers/deletes.php b/app/workers/deletes.php index 005a4e083..949733916 100644 --- a/app/workers/deletes.php +++ b/app/workers/deletes.php @@ -5,7 +5,6 @@ use Appwrite\Database\Adapter\MySQL as MySQLAdapter; use Appwrite\Database\Adapter\Redis as RedisAdapter; use Appwrite\Database\Document; use Appwrite\Database\Validator\Authorization; -use phpDocumentor\Reflection\DocBlock\Tags\Var_; use Utopia\Storage\Device\Local; use Utopia\Abuse\Abuse; use Utopia\Abuse\Adapters\TimeLimit; From b7efefa40fa3352c6b48ab60064db20978e62aae Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Sat, 29 May 2021 13:02:26 +0530 Subject: [PATCH 6/7] fix(teams): added comment --- app/controllers/api/teams.php | 2 +- app/workers/deletes.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/api/teams.php b/app/controllers/api/teams.php index 88b893341..e2e270cd2 100644 --- a/app/controllers/api/teams.php +++ b/app/controllers/api/teams.php @@ -784,7 +784,7 @@ App::delete('/v1/teams/:teamId/memberships/:membershipId') if ($membership->getAttribute('confirm')) { // Count only confirmed members $team = $projectDB->updateDocument(\array_merge($team->getArrayCopy(), [ - 'sum' => \max($team->getAttribute('sum', 0) - 1, 0), + 'sum' => \max($team->getAttribute('sum', 0) - 1, 0), // Ensure that sum is always >= 0 ])); } diff --git a/app/workers/deletes.php b/app/workers/deletes.php index 949733916..6e20a6528 100644 --- a/app/workers/deletes.php +++ b/app/workers/deletes.php @@ -138,7 +138,7 @@ class DeletesV1 $team = $this->getProjectDB($projectId)->getDocument($teamId); if(!$team->isEmpty()) { $team = $this->getProjectDB($projectId)->updateDocument(\array_merge($team->getArrayCopy(), [ - 'sum' => \max($team->getAttribute('sum', 0) - 1, 0), + 'sum' => \max($team->getAttribute('sum', 0) - 1, 0), // Ensure that sum is always >= 0 ])); } } From 404e1ace9190fc068a27cd181c02500e65cf25d5 Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Mon, 31 May 2021 10:26:06 +0530 Subject: [PATCH 7/7] fix(teams): added unit test --- app/controllers/api/teams.php | 2 +- app/workers/deletes.php | 2 +- tests/e2e/Services/Teams/TeamsBaseServer.php | 50 ++++++++++++++++++++ 3 files changed, 52 insertions(+), 2 deletions(-) diff --git a/app/controllers/api/teams.php b/app/controllers/api/teams.php index e2e270cd2..685402b61 100644 --- a/app/controllers/api/teams.php +++ b/app/controllers/api/teams.php @@ -784,7 +784,7 @@ App::delete('/v1/teams/:teamId/memberships/:membershipId') if ($membership->getAttribute('confirm')) { // Count only confirmed members $team = $projectDB->updateDocument(\array_merge($team->getArrayCopy(), [ - 'sum' => \max($team->getAttribute('sum', 0) - 1, 0), // Ensure that sum is always >= 0 + 'sum' => \max($team->getAttribute('sum', 0) - 1, 0), // Ensure that sum >= 0 ])); } diff --git a/app/workers/deletes.php b/app/workers/deletes.php index 6e20a6528..5316783c4 100644 --- a/app/workers/deletes.php +++ b/app/workers/deletes.php @@ -138,7 +138,7 @@ class DeletesV1 $team = $this->getProjectDB($projectId)->getDocument($teamId); if(!$team->isEmpty()) { $team = $this->getProjectDB($projectId)->updateDocument(\array_merge($team->getArrayCopy(), [ - 'sum' => \max($team->getAttribute('sum', 0) - 1, 0), // Ensure that sum is always >= 0 + 'sum' => \max($team->getAttribute('sum', 0) - 1, 0), // Ensure that sum >= 0 ])); } } diff --git a/tests/e2e/Services/Teams/TeamsBaseServer.php b/tests/e2e/Services/Teams/TeamsBaseServer.php index 44d75fdb3..3b5958eec 100644 --- a/tests/e2e/Services/Teams/TeamsBaseServer.php +++ b/tests/e2e/Services/Teams/TeamsBaseServer.php @@ -168,5 +168,55 @@ trait TeamsBaseServer $this->assertEquals(401, $response['headers']['status-code']); + return $data; + } + + /** + * @depends testUpdateMembershipRoles + */ + public function testDeleteUserUpdatesTeamMembershipCount($data) { + $teamUid = $data['teamUid'] ?? ''; + $userUid = $data['userUid'] ?? ''; + + /** Get Team Count */ + $response = $this->client->call(Client::METHOD_GET, '/teams/'.$teamUid, array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders())); + + + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertNotEmpty($response['body']['$id']); + $this->assertEquals('Arsenal', $response['body']['name']); + $this->assertEquals(1, $response['body']['sum']); + $this->assertIsInt($response['body']['sum']); + $this->assertIsInt($response['body']['dateCreated']); + + + /** Delete User */ + $user = $this->client->call(Client::METHOD_DELETE, '/users/' . $userUid, array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders())); + + $this->assertEquals($user['headers']['status-code'], 204); + + /** Wait for deletes worker to delete membership and update team membership count */ + sleep(5); + + /** Get Team Count */ + $response = $this->client->call(Client::METHOD_GET, '/teams/'.$teamUid, array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders())); + + + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertNotEmpty($response['body']['$id']); + $this->assertEquals('Arsenal', $response['body']['name']); + $this->assertEquals(0, $response['body']['sum']); + $this->assertIsInt($response['body']['sum']); + $this->assertIsInt($response['body']['dateCreated']); + } } \ No newline at end of file