diff --git a/app/controllers/api/teams.php b/app/controllers/api/teams.php index 3739803b30..7a14a10c82 100644 --- a/app/controllers/api/teams.php +++ b/app/controllers/api/teams.php @@ -423,8 +423,9 @@ App::post('/v1/teams/:teamId/memberships') $response->setStatusCode(Response::STATUS_CODE_CREATED); $response->dynamic($membership - ->setAttribute('email', $email) - ->setAttribute('name', $name) + ->setAttribute('teamName', $team->getAttribute('name')) + ->setAttribute('userName', $user->getAttribute('name')) + ->setAttribute('userEmail', $user->getAttribute('email')) , Response::MODEL_MEMBERSHIP); }); @@ -488,12 +489,13 @@ App::get('/v1/teams/:teamId/memberships') $memberships = array_filter($memberships, fn(Document $membership) => !empty($membership->getAttribute('userId'))); - $memberships = array_map(function($membership) use ($dbForProject) { + $memberships = array_map(function($membership) use ($dbForProject, $team) { $user = $dbForProject->getDocument('users', $membership->getAttribute('userId')); $membership - ->setAttribute('name', $user->getAttribute('name')) - ->setAttribute('email', $user->getAttribute('email')) + ->setAttribute('teamName', $team->getAttribute('name')) + ->setAttribute('userName', $user->getAttribute('name')) + ->setAttribute('userEmail', $user->getAttribute('email')) ; return $membership; @@ -537,8 +539,9 @@ App::get('/v1/teams/:teamId/memberships/:membershipId') $user = $dbForProject->getDocument('users', $membership->getAttribute('userId')); $membership - ->setAttribute('name', $user->getAttribute('name')) - ->setAttribute('email', $user->getAttribute('email')) + ->setAttribute('teamName', $team->getAttribute('name')) + ->setAttribute('userName', $user->getAttribute('name')) + ->setAttribute('userEmail', $user->getAttribute('email')) ; $response->dynamic($membership, Response::MODEL_MEMBERSHIP ); @@ -609,8 +612,9 @@ App::patch('/v1/teams/:teamId/memberships/:membershipId') $response->dynamic( $membership - ->setAttribute('email', $profile->getAttribute('email')) - ->setAttribute('name', $profile->getAttribute('name')), + ->setAttribute('teamName', $team->getAttribute('name')) + ->setAttribute('userName', $profile->getAttribute('name')) + ->setAttribute('userEmail', $profile->getAttribute('email')), Response::MODEL_MEMBERSHIP ); }); @@ -717,7 +721,7 @@ App::patch('/v1/teams/:teamId/memberships/:membershipId/status') $user = $dbForProject->updateDocument('users', $user->getId(), $user); $membership = $dbForProject->updateDocument('memberships', $membership->getId(), $membership); - + $dbForProject->deleteCachedDocument('users', $user->getId()); $team = Authorization::skip(fn() => $dbForProject->updateDocument('teams', $team->getId(), $team->setAttribute('total', $team->getAttribute('total', 0) + 1))); @@ -741,8 +745,9 @@ App::patch('/v1/teams/:teamId/memberships/:membershipId/status') ; $response->dynamic($membership - ->setAttribute('email', $user->getAttribute('email')) - ->setAttribute('name', $user->getAttribute('name')) + ->setAttribute('teamName', $team->getAttribute('name')) + ->setAttribute('userName', $user->getAttribute('name')) + ->setAttribute('userEmail', $user->getAttribute('email')) , Response::MODEL_MEMBERSHIP); }); diff --git a/app/controllers/api/users.php b/app/controllers/api/users.php index f62132c100..c87f08a75d 100644 --- a/app/controllers/api/users.php +++ b/app/controllers/api/users.php @@ -253,6 +253,50 @@ App::get('/v1/users/:userId/sessions') ]), Response::MODEL_SESSION_LIST); }); +App::get('/v1/users/:userId/memberships') + ->desc('Get User Memberships') + ->groups(['api', 'users']) + ->label('scope', 'users.read') + ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) + ->label('sdk.namespace', 'users') + ->label('sdk.method', 'getMemberships') + ->label('sdk.description', '/docs/references/users/get-user-memberships.md') + ->label('sdk.response.code', Response::STATUS_CODE_OK) + ->label('sdk.response.type', Response::CONTENT_TYPE_JSON) + ->label('sdk.response.model', Response::MODEL_MEMBERSHIP_LIST) + ->param('userId', '', new UID(), 'User ID.') + ->inject('response') + ->inject('dbForProject') + ->action(function ($userId, $response, $dbForProject) { + /** @var Appwrite\Utopia\Response $response */ + /** @var Utopia\Database\Database $dbForProject */ + /** @var Utopia\Locale\Locale $locale */ + /** @var Appwrite\Stats\Stats $usage */ + + $user = $dbForProject->getDocument('users', $userId); + + if ($user->isEmpty() || $user->getAttribute('deleted')) { + throw new Exception('User not found', 404, Exception::USER_NOT_FOUND); + } + + $memberships = array_map(function($membership) use ($dbForProject, $user) { + $team = $dbForProject->getDocument('teams', $membership->getAttribute('teamId')); + + $membership + ->setAttribute('teamName', $team->getAttribute('name')) + ->setAttribute('userName', $user->getAttribute('name')) + ->setAttribute('userEmail', $user->getAttribute('email')) + ; + + return $membership; + }, $user->getAttribute('memberships', [])); + + $response->dynamic(new Document([ + 'memberships' => $memberships, + 'total' => count($memberships), + ]), Response::MODEL_MEMBERSHIP_LIST); + }); + App::get('/v1/users/:userId/logs') ->desc('Get User Logs') ->groups(['api', 'users']) diff --git a/docs/references/users/get-user-memberships.md b/docs/references/users/get-user-memberships.md new file mode 100644 index 0000000000..4e06560800 --- /dev/null +++ b/docs/references/users/get-user-memberships.md @@ -0,0 +1 @@ +Get the user membership list by its unique ID. \ No newline at end of file diff --git a/src/Appwrite/Utopia/Response/Model/Membership.php b/src/Appwrite/Utopia/Response/Model/Membership.php index 2ea309ab36..2e093b7650 100644 --- a/src/Appwrite/Utopia/Response/Model/Membership.php +++ b/src/Appwrite/Utopia/Response/Model/Membership.php @@ -22,24 +22,30 @@ class Membership extends Model 'default' => '', 'example' => '5e5ea5c16897e', ]) + ->addRule('userName', [ + 'type' => self::TYPE_STRING, + 'description' => 'User name.', + 'default' => '', + 'example' => 'John Doe', + ]) + ->addRule('userEmail', [ + 'type' => self::TYPE_STRING, + 'description' => 'User email address.', + 'default' => '', + 'example' => 'john@appwrite.io', + ]) ->addRule('teamId', [ 'type' => self::TYPE_STRING, 'description' => 'Team ID.', 'default' => '', 'example' => '5e5ea5c16897e', ]) - ->addRule('name', [ + ->addRule('teamName', [ 'type' => self::TYPE_STRING, - 'description' => 'User name.', + 'description' => 'Team name.', 'default' => '', 'example' => 'VIP', ]) - ->addRule('email', [ - 'type' => self::TYPE_STRING, - 'description' => 'User email address.', - 'default' => '', - 'example' => 'john@appwrite.io', - ]) ->addRule('invited', [ 'type' => self::TYPE_INTEGER, 'description' => 'Date, the user has been invited to join the team in Unix timestamp.', diff --git a/tests/e2e/Services/Teams/TeamsBaseClient.php b/tests/e2e/Services/Teams/TeamsBaseClient.php index 31be119ca9..f298532947 100644 --- a/tests/e2e/Services/Teams/TeamsBaseClient.php +++ b/tests/e2e/Services/Teams/TeamsBaseClient.php @@ -12,6 +12,7 @@ trait TeamsBaseClient public function testGetTeamMemberships($data):array { $teamUid = $data['teamUid'] ?? ''; + $teamName = $data['teamName'] ?? ''; /** * Test for SUCCESS @@ -24,8 +25,9 @@ trait TeamsBaseClient $this->assertEquals(200, $response['headers']['status-code']); $this->assertIsInt($response['body']['total']); $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($this->getUser()['name'], $response['body']['memberships'][0]['userName']); + $this->assertEquals($this->getUser()['email'], $response['body']['memberships'][0]['userEmail']); + $this->assertEquals($teamName, $response['body']['memberships'][0]['teamName']); $this->assertEquals('owner', $response['body']['memberships'][0]['roles'][0]); $membershipId = $response['body']['memberships'][0]['$id']; @@ -40,8 +42,9 @@ trait TeamsBaseClient $this->assertEquals(200, $response['headers']['status-code']); $this->assertIsInt($response['body']['total']); $this->assertNotEmpty($response['body']['memberships'][0]); - $this->assertEquals($this->getUser()['name'], $response['body']['memberships'][0]['name']); - $this->assertEquals($this->getUser()['email'], $response['body']['memberships'][0]['email']); + $this->assertEquals($this->getUser()['name'], $response['body']['memberships'][0]['userName']); + $this->assertEquals($this->getUser()['email'], $response['body']['memberships'][0]['userEmail']); + $this->assertEquals($teamName, $response['body']['memberships'][0]['teamName']); $this->assertEquals('owner', $response['body']['memberships'][0]['roles'][0]); $response = $this->client->call(Client::METHOD_GET, '/teams/'.$teamUid.'/memberships', array_merge([ @@ -54,8 +57,9 @@ trait TeamsBaseClient $this->assertEquals(200, $response['headers']['status-code']); $this->assertIsInt($response['body']['total']); $this->assertNotEmpty($response['body']['memberships'][0]); - $this->assertEquals($this->getUser()['name'], $response['body']['memberships'][0]['name']); - $this->assertEquals($this->getUser()['email'], $response['body']['memberships'][0]['email']); + $this->assertEquals($this->getUser()['name'], $response['body']['memberships'][0]['userName']); + $this->assertEquals($this->getUser()['email'], $response['body']['memberships'][0]['userEmail']); + $this->assertEquals($teamName, $response['body']['memberships'][0]['teamName']); $this->assertEquals('owner', $response['body']['memberships'][0]['roles'][0]); $response = $this->client->call(Client::METHOD_GET, '/teams/'.$teamUid.'/memberships', array_merge([ @@ -104,6 +108,7 @@ trait TeamsBaseClient $this->assertNotEmpty($response['body']['$id']); $this->assertNotEmpty($response['body']['userId']); $this->assertNotEmpty($response['body']['teamId']); + $this->assertNotEmpty($response['body']['teamName']); $this->assertCount(2, $response['body']['roles']); $this->assertIsInt($response['body']['joined']); $this->assertEquals(false, $response['body']['confirm']); @@ -172,6 +177,7 @@ trait TeamsBaseClient return [ 'teamUid' => $teamUid, + 'teamName' => $teamName, 'secret' => $secret, 'membershipUid' => $membershipUid, 'userUid' => $userUid, diff --git a/tests/e2e/Services/Users/UsersBase.php b/tests/e2e/Services/Users/UsersBase.php index 1f5f2922d8..c2a96a87da 100644 --- a/tests/e2e/Services/Users/UsersBase.php +++ b/tests/e2e/Services/Users/UsersBase.php @@ -26,7 +26,7 @@ trait UsersBase $bodyString = $user['body']; $prefs = substr($bodyString, strpos($bodyString, '"prefs":')+8,2); $this->assertEquals('{}', $prefs); - + $body = json_decode($bodyString, true); $this->assertEquals($user['headers']['status-code'], 201);