From 9c03bd5561f43c0edac7ae11d686e618c22bf2a6 Mon Sep 17 00:00:00 2001 From: Zan Baldwin Date: Thu, 15 Sep 2022 11:49:12 +0200 Subject: [PATCH 1/6] API: Add SDK Methods for Team Management Endpoints --- README.md | 43 ++++++++++++- src/Api/Teams.php | 47 ++++++++++++++ tests/Api/TeamsTest.php | 135 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 224 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index eaf3ac1..11fcc00 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,11 @@ * [Trigger a full synchronization](#trigger-a-full-synchronization) * [Team](#team) * [List an organization's teams](#list-an-organizations-teams) + * [Create a New Team](#create-a-new-team) + * [Edit a Team](#edit-a-team) + * [Delete a Team](#delete-a-team) + * [Add Member to Team (by User ID)](#add-member-to-team-by-user-id) + * [Remove Member from Team](#remove-member-from-team) * [List all private packages a team has access to](#list-all-private-packages-a-team-has-access-to) * [Grant a team access to a list of private packages](#grant-a-team-access-to-a-list-of-private-packages) * [Remove access for a package from a team](#remove-access-for-a-package-from-a-team) @@ -108,7 +113,7 @@ * [Validate incoming webhook payloads](#validate-incoming-webhook-payloads) * [License](#license) - + @@ -162,6 +167,42 @@ $teams = $client->teams()->all(); ``` Returns an array of teams. +#### Create a New Team +```php +$team = $client->teams()->create('New Team Name', true, false, false, true, false); +``` +Creates a team and sets permissions applied to team members. Those permissions are (in order): + +- `canEditTeamPackages`: members of the team can edit and remove packages, assign package permissions (only applies to packages assigned to team). +- `canAddPackages`: members of the team can add packages to organization; add, edit and remove credentials and mirrored third-party repositories. +- `canCreateSubrepositories`: members of the team can create subrepositories. +- `canViewVendorCustomers`: members of the team can view customers, their Composer information, their packages, and their install statistics. +- `canManageVendorCustomers`: members of the team can create and delete customers, add and remove packages, update their settings, view Composer information and install statistics. + +Returns the newly-created team. + +#### Edit a Team +```php +$team = $client->teams()->edit($teamId, 'Altered Team Name', true, false, false, true, false); +``` +Edits a team's name and permissions to be applied to team members. Returns the updated team. + +#### Delete a Team +```php +$client->teams()->remove($teamId); +``` + +#### Add Member to Team (by User ID) +```php +$team = $client->teams()->addMember($teamId, $userId); +``` +Returns the team the user was added to. + +#### Remove Member from Team +```php +$client->teams()->removeMember($teamId, $userId); +``` + #### List all private packages a team has access to ```php $teamId = 1; diff --git a/src/Api/Teams.php b/src/Api/Teams.php index 9f1aa36..c6eb70b 100644 --- a/src/Api/Teams.php +++ b/src/Api/Teams.php @@ -16,6 +16,53 @@ public function all() return $this->get('/teams/'); } + public function create($name, $canEditTeamPackages = false, $canAddPackages = false, $canCreateSubrepositories = false, $canViewVendorCustomers = false, $canManageVendorCustomers = false) + { + $parameters = [ + 'name' => $name, + 'permissions' => [ + 'canEditTeamPackages' => $canEditTeamPackages, + 'canAddPackages' => $canAddPackages, + 'canCreateSubrepositories' => $canCreateSubrepositories, + 'canViewVendorCustomers' => $canViewVendorCustomers, + 'canManageVendorCustomers' => $canManageVendorCustomers, + ], + ]; + + return $this->post('/teams/', $parameters); + } + + public function edit($teamId, $name, $canEditTeamPackages, $canAddPackages, $canCreateSubrepositories, $canViewVendorCustomers, $canManageVendorCustomers) + { + $parameters = [ + 'name' => $name, + 'permissions' => [ + 'canEditTeamPackages' => $canEditTeamPackages, + 'canAddPackages' => $canAddPackages, + 'canCreateSubrepositories' => $canCreateSubrepositories, + 'canViewVendorCustomers' => $canViewVendorCustomers, + 'canManageVendorCustomers' => $canManageVendorCustomers, + ], + ]; + + return $this->put(sprintf('/teams/%s/', $teamId), $parameters); + } + + public function remove($teamId) + { + return $this->delete(sprintf('/teams/%s/', $teamId)); + } + + public function addMember($teamId, $userId) + { + return $this->put(sprintf('/teams/%s/members/%s/', $teamId, $userId)); + } + + public function removeMember($teamId, $userId) + { + return $this->delete(sprintf('/teams/%s/members/%s/', $teamId, $userId)); + } + public function packages($teamId) { return $this->get(sprintf('/teams/%s/packages/', $teamId)); diff --git a/tests/Api/TeamsTest.php b/tests/Api/TeamsTest.php index 8594983..4297e17 100644 --- a/tests/Api/TeamsTest.php +++ b/tests/Api/TeamsTest.php @@ -93,6 +93,141 @@ public function testRemovePackage() $this->assertSame($expected, $api->removePackage(1, 'acme-website/package')); } + public function testCreateTeam() + { + $expected = [ + [ + 'id' => 1, + 'name' => 'New Team', + 'permissions' => [ + 'canEditTeamPackages' => true, + 'canAddPackages' => false, + 'canCreateSubrepositories' => false, + 'canViewVendorCustomers' => true, + 'canManageVendorCustomers' => false, + ], + ], + ]; + + /** @var Teams&MockObject $api */ + $api = $this->getApiMock(); + $api->expects($this->once()) + ->method('post') + ->with($this->equalTo('/teams/'), $this->equalTo([ + 'name' => 'New Team', + 'permissions' => [ + 'canEditTeamPackages' => true, + 'canAddPackages' => false, + 'canCreateSubrepositories' => false, + 'canViewVendorCustomers' => true, + 'canManageVendorCustomers' => false, + ], + ])) + ->willReturn($expected); + + $this->assertSame($expected, $api->create('New Team', true, false, false, true, false)); + } + + public function testEditTeam() + { + $expected = [ + [ + 'id' => 1, + 'name' => 'New Team', + 'permissions' => [ + 'canEditTeamPackages' => true, + 'canAddPackages' => false, + 'canCreateSubrepositories' => false, + 'canViewVendorCustomers' => true, + 'canManageVendorCustomers' => false, + ], + ], + ]; + + /** @var Teams&MockObject $api */ + $api = $this->getApiMock(); + $api->expects($this->once()) + ->method('put') + ->with($this->equalTo('/teams/123/'), $this->equalTo([ + 'name' => 'New Team', + 'permissions' => [ + 'canEditTeamPackages' => true, + 'canAddPackages' => false, + 'canCreateSubrepositories' => false, + 'canViewVendorCustomers' => true, + 'canManageVendorCustomers' => false, + ], + ])) + ->willReturn($expected); + + $this->assertSame($expected, $api->edit(123, 'New Team', true, false, false, true, false)); + } + + public function testDeleteTeam() + { + $expected = null; + + /** @var Teams&MockObject $api */ + $api = $this->getApiMock(); + $api->expects($this->once()) + ->method('delete') + ->with($this->equalTo('/teams/1/')) + ->willReturn($expected); + + $this->assertSame($expected, $api->remove(1)); + } + + public function testAddMember() + { + $expected = [ + [ + 'id' => 1, + 'name' => 'New Team', + 'permission' => 'view', + 'members' => [ + [ + 'id' => 12, + 'username' => 'username' + ] + ], + 'projects' => [ + ], + ] + ]; + + /** @var Teams&MockObject $api */ + $api = $this->getApiMock(); + $api->expects($this->once()) + ->method('put') + ->with($this->equalTo('/teams/1/members/12/')) + ->willReturn($expected); + + $this->assertSame($expected, $api->addMember(1, 12)); + } + + public function removeMember() + { + $expected = [ + [ + 'id' => 1, + 'name' => 'New Team', + 'permission' => 'view', + 'members' => [], + 'projects' => [ + ], + ] + ]; + + /** @var Teams&MockObject $api */ + $api = $this->getApiMock(); + $api->expects($this->once()) + ->method('delete') + ->with($this->equalTo('/teams/1/members/12/')) + ->willReturn($expected); + + $this->assertSame($expected, $api->removeMember(1, 12)); + } + /** * @return string */ From 3bc74b7a578ce8ceb2704a3f6ad53f27f2402752 Mon Sep 17 00:00:00 2001 From: Zan Baldwin Date: Fri, 16 Sep 2022 09:51:59 +0200 Subject: [PATCH 2/6] Team Permissions Model --- README.md | 51 +++++++++++++++++++++++++++++++---------- src/Api/Teams.php | 26 +++++++++++---------- src/TeamPermissions.php | 41 +++++++++++++++++++++++++++++++++ tests/Api/TeamsTest.php | 11 +++++++-- 4 files changed, 103 insertions(+), 26 deletions(-) create mode 100644 src/TeamPermissions.php diff --git a/README.md b/README.md index 11fcc00..091d74a 100644 --- a/README.md +++ b/README.md @@ -113,7 +113,7 @@ * [Validate incoming webhook payloads](#validate-incoming-webhook-payloads) * [License](#license) - + @@ -161,6 +161,35 @@ Returns an array of created jobs. One for every synchronization. ### Team +The permissions available for a team are: +- `canEditTeamPackages`: members of the team can edit and remove packages, assign package permissions (only applies to packages assigned to team). +- `canAddPackages`: members of the team can add packages to organization; add, edit and remove credentials and mirrored third-party repositories. +- `canCreateSubrepositories`: members of the team can create subrepositories. +- `canViewVendorCustomers`: members of the team can view customers, their Composer information, their packages, and their install statistics. +- `canManageVendorCustomers`: members of the team can create and delete customers, add and remove packages, update their settings, view Composer information and install statistics. + +```php +use PrivatePackagist\ApiClient\TeamPermissions; + +$permissions = new TeamPermissions; +// Grant all permissions. +$permissions->canEditTeamPackages = true; +$permissions->canAddPackages = true; +$permissions->canCreateSubrepositories = true; +$permissions->canManageVendorCustomers = true; +$permissions->canManageVendorCustomers = true; +``` + +The permissions model can also be constructed via flags: + +```php +use PrivatePackagist\ApiClient\TeamPermissions; + +$permissions = TeamPermissions::fromFlags( + TeamPermissions::PERMISSION_CAN_EDIT_TEAM_PACKAGES | TeamPermissions::PERMISSION_CAN_ADD_PACKAGES, +); +``` + #### List an organization's teams ```php $teams = $client->teams()->all(); @@ -169,21 +198,19 @@ Returns an array of teams. #### Create a New Team ```php -$team = $client->teams()->create('New Team Name', true, false, false, true, false); -``` -Creates a team and sets permissions applied to team members. Those permissions are (in order): - -- `canEditTeamPackages`: members of the team can edit and remove packages, assign package permissions (only applies to packages assigned to team). -- `canAddPackages`: members of the team can add packages to organization; add, edit and remove credentials and mirrored third-party repositories. -- `canCreateSubrepositories`: members of the team can create subrepositories. -- `canViewVendorCustomers`: members of the team can view customers, their Composer information, their packages, and their install statistics. -- `canManageVendorCustomers`: members of the team can create and delete customers, add and remove packages, update their settings, view Composer information and install statistics. +use PrivatePackagist\ApiClient\TeamPermissions; -Returns the newly-created team. +$permissions = new TeamPermissions; +$team = $client->teams()->create('New Team Name', $permissions); +``` +Creates a team and sets permissions applied to team members. Returns the newly-created team. #### Edit a Team ```php -$team = $client->teams()->edit($teamId, 'Altered Team Name', true, false, false, true, false); +use PrivatePackagist\ApiClient\TeamPermissions; + +$permissions = new TeamPermissions; +$team = $client->teams()->edit($teamId, 'Altered Team Name', $permissions); ``` Edits a team's name and permissions to be applied to team members. Returns the updated team. diff --git a/src/Api/Teams.php b/src/Api/Teams.php index c6eb70b..2f53c3a 100644 --- a/src/Api/Teams.php +++ b/src/Api/Teams.php @@ -9,6 +9,8 @@ namespace PrivatePackagist\ApiClient\Api; +use PrivatePackagist\ApiClient\TeamPermissions; + class Teams extends AbstractApi { public function all() @@ -16,32 +18,32 @@ public function all() return $this->get('/teams/'); } - public function create($name, $canEditTeamPackages = false, $canAddPackages = false, $canCreateSubrepositories = false, $canViewVendorCustomers = false, $canManageVendorCustomers = false) + public function create($name, TeamPermissions $permissions) { $parameters = [ 'name' => $name, 'permissions' => [ - 'canEditTeamPackages' => $canEditTeamPackages, - 'canAddPackages' => $canAddPackages, - 'canCreateSubrepositories' => $canCreateSubrepositories, - 'canViewVendorCustomers' => $canViewVendorCustomers, - 'canManageVendorCustomers' => $canManageVendorCustomers, + 'canEditTeamPackages' => (bool) $permissions->canEditTeamPackages, + 'canAddPackages' => (bool) $permissions->canAddPackages, + 'canCreateSubrepositories' => (bool) $permissions->canCreateSubrepositories, + 'canViewVendorCustomers' => (bool) $permissions->canViewVendorCustomers, + 'canManageVendorCustomers' => (bool) $permissions->canManageVendorCustomers, ], ]; return $this->post('/teams/', $parameters); } - public function edit($teamId, $name, $canEditTeamPackages, $canAddPackages, $canCreateSubrepositories, $canViewVendorCustomers, $canManageVendorCustomers) + public function edit($teamId, $name, TeamPermissions $permissions) { $parameters = [ 'name' => $name, 'permissions' => [ - 'canEditTeamPackages' => $canEditTeamPackages, - 'canAddPackages' => $canAddPackages, - 'canCreateSubrepositories' => $canCreateSubrepositories, - 'canViewVendorCustomers' => $canViewVendorCustomers, - 'canManageVendorCustomers' => $canManageVendorCustomers, + 'canEditTeamPackages' => (bool) $permissions->canEditTeamPackages, + 'canAddPackages' => (bool) $permissions->canAddPackages, + 'canCreateSubrepositories' => (bool) $permissions->canCreateSubrepositories, + 'canViewVendorCustomers' => (bool) $permissions->canViewVendorCustomers, + 'canManageVendorCustomers' => (bool) $permissions->canManageVendorCustomers, ], ]; diff --git a/src/TeamPermissions.php b/src/TeamPermissions.php new file mode 100644 index 0000000..6804f1f --- /dev/null +++ b/src/TeamPermissions.php @@ -0,0 +1,41 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace PrivatePackagist\ApiClient; + +class TeamPermissions +{ + public const PERMISSION_CAN_EDIT_TEAM_PACKAGES = 1 << 0; + public const PERMISSION_CAN_ADD_PACKAGES = 1 << 1; + public const PERMISSION_CAN_CREATE_SUBREPOSITORIES = 1 << 2; + public const PERMISSION_CAN_VIEW_VENDOR_CUSTOMERS = 1 << 3; + public const PERMISSION_CAN_MANAGE_VENDOR_CUSTOMERS = 1 << 4; + + /** @var bool */ + public $canEditTeamPackages = false; + /** @var bool */ + public $canAddPackages = false; + /** @var bool */ + public $canCreateSubrepositories = false; + /** @var bool */ + public $canViewVendorCustomers = false; + /** @var bool */ + public $canManageVendorCustomers = false; + + public static function fromFlags(int $flags): self + { + $permissions = new self; + $permissions->canEditTeamPackages = ($flags & self::PERMISSION_CAN_EDIT_TEAM_PACKAGES) > 0; + $permissions->canAddPackages = ($flags & self::PERMISSION_CAN_ADD_PACKAGES) > 0; + $permissions->canCreateSubrepositories = ($flags & self::PERMISSION_CAN_CREATE_SUBREPOSITORIES) > 0; + $permissions->canViewVendorCustomers = ($flags & self::PERMISSION_CAN_VIEW_VENDOR_CUSTOMERS) > 0; + $permissions->canManageVendorCustomers = ($flags & self::PERMISSION_CAN_MANAGE_VENDOR_CUSTOMERS) > 0; + return $permissions; + } +} diff --git a/tests/Api/TeamsTest.php b/tests/Api/TeamsTest.php index 4297e17..8ffd62e 100644 --- a/tests/Api/TeamsTest.php +++ b/tests/Api/TeamsTest.php @@ -10,6 +10,7 @@ namespace PrivatePackagist\ApiClient\Api; use PHPUnit\Framework\MockObject\MockObject; +use PrivatePackagist\ApiClient\TeamPermissions; class TeamsTest extends ApiTestCase { @@ -125,7 +126,10 @@ public function testCreateTeam() ])) ->willReturn($expected); - $this->assertSame($expected, $api->create('New Team', true, false, false, true, false)); + $permissions = new TeamPermissions; + $permissions->canEditTeamPackages = true; + $permissions->canViewVendorCustomers = true; + $this->assertSame($expected, $api->create('New Team', $permissions)); } public function testEditTeam() @@ -160,7 +164,10 @@ public function testEditTeam() ])) ->willReturn($expected); - $this->assertSame($expected, $api->edit(123, 'New Team', true, false, false, true, false)); + $permissions = new TeamPermissions; + $permissions->canEditTeamPackages = true; + $permissions->canViewVendorCustomers = true; + $this->assertSame($expected, $api->edit(123, 'New Team', $permissions)); } public function testDeleteTeam() From d668dcad37734d81b519b32a21cc957ac1f17314 Mon Sep 17 00:00:00 2001 From: Zan Baldwin Date: Fri, 16 Sep 2022 10:26:36 +0200 Subject: [PATCH 3/6] Team: Add Type-honts and Update Tests --- src/Api/Teams.php | 18 +++++---- tests/Api/TeamsTest.php | 90 ++++++++++++++++------------------------- 2 files changed, 46 insertions(+), 62 deletions(-) diff --git a/src/Api/Teams.php b/src/Api/Teams.php index 2f53c3a..3626f41 100644 --- a/src/Api/Teams.php +++ b/src/Api/Teams.php @@ -18,7 +18,7 @@ public function all() return $this->get('/teams/'); } - public function create($name, TeamPermissions $permissions) + public function create(string $name, TeamPermissions $permissions): array { $parameters = [ 'name' => $name, @@ -34,7 +34,7 @@ public function create($name, TeamPermissions $permissions) return $this->post('/teams/', $parameters); } - public function edit($teamId, $name, TeamPermissions $permissions) + public function edit($teamId, string $name, TeamPermissions $permissions): array { $parameters = [ 'name' => $name, @@ -50,19 +50,23 @@ public function edit($teamId, $name, TeamPermissions $permissions) return $this->put(sprintf('/teams/%s/', $teamId), $parameters); } - public function remove($teamId) + public function remove($teamId): bool { - return $this->delete(sprintf('/teams/%s/', $teamId)); + // Returns empty response on success. + $this->delete(sprintf('/teams/%s/', $teamId)); + return true; } - public function addMember($teamId, $userId) + public function addMember($teamId, $userId): array { return $this->put(sprintf('/teams/%s/members/%s/', $teamId, $userId)); } - public function removeMember($teamId, $userId) + public function removeMember($teamId, $userId): bool { - return $this->delete(sprintf('/teams/%s/members/%s/', $teamId, $userId)); + // Returns empty response on success. + $this->delete(sprintf('/teams/%s/members/%s/', $teamId, $userId)); + return true; } public function packages($teamId) diff --git a/tests/Api/TeamsTest.php b/tests/Api/TeamsTest.php index 8ffd62e..c1c0d12 100644 --- a/tests/Api/TeamsTest.php +++ b/tests/Api/TeamsTest.php @@ -94,19 +94,17 @@ public function testRemovePackage() $this->assertSame($expected, $api->removePackage(1, 'acme-website/package')); } - public function testCreateTeam() + public function testCreateTeam(): void { $expected = [ - [ - 'id' => 1, - 'name' => 'New Team', - 'permissions' => [ - 'canEditTeamPackages' => true, - 'canAddPackages' => false, - 'canCreateSubrepositories' => false, - 'canViewVendorCustomers' => true, - 'canManageVendorCustomers' => false, - ], + 'id' => 1, + 'name' => 'New Team', + 'permissions' => [ + 'canEditTeamPackages' => true, + 'canAddPackages' => false, + 'canCreateSubrepositories' => false, + 'canViewVendorCustomers' => true, + 'canManageVendorCustomers' => false, ], ]; @@ -132,19 +130,17 @@ public function testCreateTeam() $this->assertSame($expected, $api->create('New Team', $permissions)); } - public function testEditTeam() + public function testEditTeam(): void { $expected = [ - [ - 'id' => 1, - 'name' => 'New Team', - 'permissions' => [ - 'canEditTeamPackages' => true, - 'canAddPackages' => false, - 'canCreateSubrepositories' => false, - 'canViewVendorCustomers' => true, - 'canManageVendorCustomers' => false, - ], + 'id' => 123, + 'name' => 'New Team', + 'permissions' => [ + 'canEditTeamPackages' => true, + 'canAddPackages' => false, + 'canCreateSubrepositories' => false, + 'canViewVendorCustomers' => true, + 'canManageVendorCustomers' => false, ], ]; @@ -170,36 +166,30 @@ public function testEditTeam() $this->assertSame($expected, $api->edit(123, 'New Team', $permissions)); } - public function testDeleteTeam() + public function testDeleteTeam(): void { - $expected = null; - /** @var Teams&MockObject $api */ $api = $this->getApiMock(); $api->expects($this->once()) ->method('delete') ->with($this->equalTo('/teams/1/')) - ->willReturn($expected); + // Will return empty response. + ->willReturn([]); - $this->assertSame($expected, $api->remove(1)); + $this->assertSame(true, $api->remove(1)); } - public function testAddMember() + public function testAddMember(): void { $expected = [ - [ - 'id' => 1, - 'name' => 'New Team', - 'permission' => 'view', - 'members' => [ - [ - 'id' => 12, - 'username' => 'username' - ] - ], - 'projects' => [ - ], - ] + 'id' => 1, + 'name' => 'New Team', + 'members' => [ + [ + 'id' => 12, + 'username' => 'username' + ] + ], ]; /** @var Teams&MockObject $api */ @@ -212,27 +202,17 @@ public function testAddMember() $this->assertSame($expected, $api->addMember(1, 12)); } - public function removeMember() + public function removeMember(): void { - $expected = [ - [ - 'id' => 1, - 'name' => 'New Team', - 'permission' => 'view', - 'members' => [], - 'projects' => [ - ], - ] - ]; - /** @var Teams&MockObject $api */ $api = $this->getApiMock(); $api->expects($this->once()) ->method('delete') ->with($this->equalTo('/teams/1/members/12/')) - ->willReturn($expected); + // Will return empty response. + ->willReturn([]); - $this->assertSame($expected, $api->removeMember(1, 12)); + $this->assertSame(true, $api->removeMember(1, 12)); } /** From b4f9b36f01746efa3d091e50b9aa4a729ea33ac8 Mon Sep 17 00:00:00 2001 From: Zan Baldwin Date: Fri, 16 Sep 2022 11:03:21 +0200 Subject: [PATCH 4/6] Team: Permissions from Team Response --- README.md | 9 +++++++++ src/TeamPermissions.php | 11 +++++++++++ 2 files changed, 20 insertions(+) diff --git a/README.md b/README.md index 091d74a..e5b14ab 100644 --- a/README.md +++ b/README.md @@ -190,6 +190,15 @@ $permissions = TeamPermissions::fromFlags( ); ``` +Or from the permissions of an existing team: + +```php +use PrivatePackagist\ApiClient\TeamPermissions; + +$team = $client->teams()->all()[0]; +$permissions = TeamPermissions::fromTeamResponse($team); +``` + #### List an organization's teams ```php $teams = $client->teams()->all(); diff --git a/src/TeamPermissions.php b/src/TeamPermissions.php index 6804f1f..373350d 100644 --- a/src/TeamPermissions.php +++ b/src/TeamPermissions.php @@ -38,4 +38,15 @@ public static function fromFlags(int $flags): self $permissions->canManageVendorCustomers = ($flags & self::PERMISSION_CAN_MANAGE_VENDOR_CUSTOMERS) > 0; return $permissions; } + + public static function fromTeamResponse(array $team): self + { + $permissions = new self; + $permissions->canEditTeamPackages = isset($team['permissions']['canEditTeamPackages']) && $team['permissions']['canEditTeamPackages']; + $permissions->canAddPackages = isset($team['permissions']['canAddPackages']) && $team['permissions']['canAddPackages']; + $permissions->canCreateSubrepositories = isset($team['permissions']['canCreateSubrepositories']) && $team['permissions']['canCreateSubrepositories']; + $permissions->canViewVendorCustomers = isset($team['permissions']['canViewVendorCustomers']) && $team['permissions']['canViewVendorCustomers']; + $permissions->canManageVendorCustomers = isset($team['permissions']['canManageVendorCustomers']) && $team['permissions']['canManageVendorCustomers']; + return $permissions; + } } From d1d9c3b4e22ea52d6eb54e88a03f81dfef7e0f9b Mon Sep 17 00:00:00 2001 From: Zan Baldwin Date: Fri, 16 Sep 2022 17:33:41 +0200 Subject: [PATCH 5/6] Team: DELETE Requests should return empty response, consistent with the rest of SDK --- src/Api/Teams.php | 12 ++++-------- tests/Api/TeamsTest.php | 14 ++++++++------ 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/src/Api/Teams.php b/src/Api/Teams.php index 3626f41..9ded3c3 100644 --- a/src/Api/Teams.php +++ b/src/Api/Teams.php @@ -50,11 +50,9 @@ public function edit($teamId, string $name, TeamPermissions $permissions): array return $this->put(sprintf('/teams/%s/', $teamId), $parameters); } - public function remove($teamId): bool + public function remove($teamId): array { - // Returns empty response on success. - $this->delete(sprintf('/teams/%s/', $teamId)); - return true; + return $this->delete(sprintf('/teams/%s/', $teamId)); } public function addMember($teamId, $userId): array @@ -62,11 +60,9 @@ public function addMember($teamId, $userId): array return $this->put(sprintf('/teams/%s/members/%s/', $teamId, $userId)); } - public function removeMember($teamId, $userId): bool + public function removeMember($teamId, $userId): array { - // Returns empty response on success. - $this->delete(sprintf('/teams/%s/members/%s/', $teamId, $userId)); - return true; + return $this->delete(sprintf('/teams/%s/members/%s/', $teamId, $userId)); } public function packages($teamId) diff --git a/tests/Api/TeamsTest.php b/tests/Api/TeamsTest.php index c1c0d12..59c7421 100644 --- a/tests/Api/TeamsTest.php +++ b/tests/Api/TeamsTest.php @@ -168,15 +168,16 @@ public function testEditTeam(): void public function testDeleteTeam(): void { + $expected = []; + /** @var Teams&MockObject $api */ $api = $this->getApiMock(); $api->expects($this->once()) ->method('delete') ->with($this->equalTo('/teams/1/')) - // Will return empty response. - ->willReturn([]); + ->willReturn($expected); - $this->assertSame(true, $api->remove(1)); + $this->assertSame($expected, $api->remove(1)); } public function testAddMember(): void @@ -204,15 +205,16 @@ public function testAddMember(): void public function removeMember(): void { + $expected = []; + /** @var Teams&MockObject $api */ $api = $this->getApiMock(); $api->expects($this->once()) ->method('delete') ->with($this->equalTo('/teams/1/members/12/')) - // Will return empty response. - ->willReturn([]); + ->willReturn($expected); - $this->assertSame(true, $api->removeMember(1, 12)); + $this->assertSame($expected, $api->removeMember(1, 12)); } /** From ac85d90849dabaac2994caecc0774eb710747fcc Mon Sep 17 00:00:00 2001 From: Zan Baldwin Date: Fri, 16 Sep 2022 17:40:38 +0200 Subject: [PATCH 6/6] Team: Make Permissions Model Final --- src/TeamPermissions.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/TeamPermissions.php b/src/TeamPermissions.php index 373350d..1b2576f 100644 --- a/src/TeamPermissions.php +++ b/src/TeamPermissions.php @@ -9,7 +9,7 @@ namespace PrivatePackagist\ApiClient; -class TeamPermissions +final class TeamPermissions { public const PERMISSION_CAN_EDIT_TEAM_PACKAGES = 1 << 0; public const PERMISSION_CAN_ADD_PACKAGES = 1 << 1;