Skip to content

Commit c382497

Browse files
authoredSep 16, 2022
Merge pull request #55 from zanbaldwin/z/team-management-endpoints
API: Add SDK Methods for Team Management Endpoints
2 parents 61fabb0 + ac85d90 commit c382497

File tree

4 files changed

+303
-1
lines changed

4 files changed

+303
-1
lines changed
 

‎README.md

+78-1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,11 @@
1212
* [Trigger a full synchronization](#trigger-a-full-synchronization)
1313
* [Team](#team)
1414
* [List an organization's teams](#list-an-organizations-teams)
15+
* [Create a New Team](#create-a-new-team)
16+
* [Edit a Team](#edit-a-team)
17+
* [Delete a Team](#delete-a-team)
18+
* [Add Member to Team (by User ID)](#add-member-to-team-by-user-id)
19+
* [Remove Member from Team](#remove-member-from-team)
1520
* [List all private packages a team has access to](#list-all-private-packages-a-team-has-access-to)
1621
* [Grant a team access to a list of private packages](#grant-a-team-access-to-a-list-of-private-packages)
1722
* [Remove access for a package from a team](#remove-access-for-a-package-from-a-team)
@@ -108,7 +113,7 @@
108113
* [Validate incoming webhook payloads](#validate-incoming-webhook-payloads)
109114
* [License](#license)
110115

111-
<!-- Added by: zanbaldwin, at: Thu 18 Aug 12:50:05 CEST 2022 -->
116+
<!-- Added by: zanbaldwin, at: Fri 16 Sep 09:48:23 CEST 2022 -->
112117

113118
<!--te-->
114119

@@ -156,12 +161,84 @@ Returns an array of created jobs. One for every synchronization.
156161

157162
### Team
158163

164+
The permissions available for a team are:
165+
- `canEditTeamPackages`: members of the team can edit and remove packages, assign package permissions (only applies to packages assigned to team).
166+
- `canAddPackages`: members of the team can add packages to organization; add, edit and remove credentials and mirrored third-party repositories.
167+
- `canCreateSubrepositories`: members of the team can create subrepositories.
168+
- `canViewVendorCustomers`: members of the team can view customers, their Composer information, their packages, and their install statistics.
169+
- `canManageVendorCustomers`: members of the team can create and delete customers, add and remove packages, update their settings, view Composer information and install statistics.
170+
171+
```php
172+
use PrivatePackagist\ApiClient\TeamPermissions;
173+
174+
$permissions = new TeamPermissions;
175+
// Grant all permissions.
176+
$permissions->canEditTeamPackages = true;
177+
$permissions->canAddPackages = true;
178+
$permissions->canCreateSubrepositories = true;
179+
$permissions->canManageVendorCustomers = true;
180+
$permissions->canManageVendorCustomers = true;
181+
```
182+
183+
The permissions model can also be constructed via flags:
184+
185+
```php
186+
use PrivatePackagist\ApiClient\TeamPermissions;
187+
188+
$permissions = TeamPermissions::fromFlags(
189+
TeamPermissions::PERMISSION_CAN_EDIT_TEAM_PACKAGES | TeamPermissions::PERMISSION_CAN_ADD_PACKAGES,
190+
);
191+
```
192+
193+
Or from the permissions of an existing team:
194+
195+
```php
196+
use PrivatePackagist\ApiClient\TeamPermissions;
197+
198+
$team = $client->teams()->all()[0];
199+
$permissions = TeamPermissions::fromTeamResponse($team);
200+
```
201+
159202
#### List an organization's teams
160203
```php
161204
$teams = $client->teams()->all();
162205
```
163206
Returns an array of teams.
164207

208+
#### Create a New Team
209+
```php
210+
use PrivatePackagist\ApiClient\TeamPermissions;
211+
212+
$permissions = new TeamPermissions;
213+
$team = $client->teams()->create('New Team Name', $permissions);
214+
```
215+
Creates a team and sets permissions applied to team members. Returns the newly-created team.
216+
217+
#### Edit a Team
218+
```php
219+
use PrivatePackagist\ApiClient\TeamPermissions;
220+
221+
$permissions = new TeamPermissions;
222+
$team = $client->teams()->edit($teamId, 'Altered Team Name', $permissions);
223+
```
224+
Edits a team's name and permissions to be applied to team members. Returns the updated team.
225+
226+
#### Delete a Team
227+
```php
228+
$client->teams()->remove($teamId);
229+
```
230+
231+
#### Add Member to Team (by User ID)
232+
```php
233+
$team = $client->teams()->addMember($teamId, $userId);
234+
```
235+
Returns the team the user was added to.
236+
237+
#### Remove Member from Team
238+
```php
239+
$client->teams()->removeMember($teamId, $userId);
240+
```
241+
165242
#### List all private packages a team has access to
166243
```php
167244
$teamId = 1;

‎src/Api/Teams.php

+49
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,62 @@
99

1010
namespace PrivatePackagist\ApiClient\Api;
1111

12+
use PrivatePackagist\ApiClient\TeamPermissions;
13+
1214
class Teams extends AbstractApi
1315
{
1416
public function all()
1517
{
1618
return $this->get('/teams/');
1719
}
1820

21+
public function create(string $name, TeamPermissions $permissions): array
22+
{
23+
$parameters = [
24+
'name' => $name,
25+
'permissions' => [
26+
'canEditTeamPackages' => (bool) $permissions->canEditTeamPackages,
27+
'canAddPackages' => (bool) $permissions->canAddPackages,
28+
'canCreateSubrepositories' => (bool) $permissions->canCreateSubrepositories,
29+
'canViewVendorCustomers' => (bool) $permissions->canViewVendorCustomers,
30+
'canManageVendorCustomers' => (bool) $permissions->canManageVendorCustomers,
31+
],
32+
];
33+
34+
return $this->post('/teams/', $parameters);
35+
}
36+
37+
public function edit($teamId, string $name, TeamPermissions $permissions): array
38+
{
39+
$parameters = [
40+
'name' => $name,
41+
'permissions' => [
42+
'canEditTeamPackages' => (bool) $permissions->canEditTeamPackages,
43+
'canAddPackages' => (bool) $permissions->canAddPackages,
44+
'canCreateSubrepositories' => (bool) $permissions->canCreateSubrepositories,
45+
'canViewVendorCustomers' => (bool) $permissions->canViewVendorCustomers,
46+
'canManageVendorCustomers' => (bool) $permissions->canManageVendorCustomers,
47+
],
48+
];
49+
50+
return $this->put(sprintf('/teams/%s/', $teamId), $parameters);
51+
}
52+
53+
public function remove($teamId): array
54+
{
55+
return $this->delete(sprintf('/teams/%s/', $teamId));
56+
}
57+
58+
public function addMember($teamId, $userId): array
59+
{
60+
return $this->put(sprintf('/teams/%s/members/%s/', $teamId, $userId));
61+
}
62+
63+
public function removeMember($teamId, $userId): array
64+
{
65+
return $this->delete(sprintf('/teams/%s/members/%s/', $teamId, $userId));
66+
}
67+
1968
public function packages($teamId)
2069
{
2170
return $this->get(sprintf('/teams/%s/packages/', $teamId));

‎src/TeamPermissions.php

+52
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
<?php
2+
3+
/*
4+
* (c) Packagist Conductors GmbH <contact@packagist.com>
5+
*
6+
* For the full copyright and license information, please view the LICENSE
7+
* file that was distributed with this source code.
8+
*/
9+
10+
namespace PrivatePackagist\ApiClient;
11+
12+
final class TeamPermissions
13+
{
14+
public const PERMISSION_CAN_EDIT_TEAM_PACKAGES = 1 << 0;
15+
public const PERMISSION_CAN_ADD_PACKAGES = 1 << 1;
16+
public const PERMISSION_CAN_CREATE_SUBREPOSITORIES = 1 << 2;
17+
public const PERMISSION_CAN_VIEW_VENDOR_CUSTOMERS = 1 << 3;
18+
public const PERMISSION_CAN_MANAGE_VENDOR_CUSTOMERS = 1 << 4;
19+
20+
/** @var bool */
21+
public $canEditTeamPackages = false;
22+
/** @var bool */
23+
public $canAddPackages = false;
24+
/** @var bool */
25+
public $canCreateSubrepositories = false;
26+
/** @var bool */
27+
public $canViewVendorCustomers = false;
28+
/** @var bool */
29+
public $canManageVendorCustomers = false;
30+
31+
public static function fromFlags(int $flags): self
32+
{
33+
$permissions = new self;
34+
$permissions->canEditTeamPackages = ($flags & self::PERMISSION_CAN_EDIT_TEAM_PACKAGES) > 0;
35+
$permissions->canAddPackages = ($flags & self::PERMISSION_CAN_ADD_PACKAGES) > 0;
36+
$permissions->canCreateSubrepositories = ($flags & self::PERMISSION_CAN_CREATE_SUBREPOSITORIES) > 0;
37+
$permissions->canViewVendorCustomers = ($flags & self::PERMISSION_CAN_VIEW_VENDOR_CUSTOMERS) > 0;
38+
$permissions->canManageVendorCustomers = ($flags & self::PERMISSION_CAN_MANAGE_VENDOR_CUSTOMERS) > 0;
39+
return $permissions;
40+
}
41+
42+
public static function fromTeamResponse(array $team): self
43+
{
44+
$permissions = new self;
45+
$permissions->canEditTeamPackages = isset($team['permissions']['canEditTeamPackages']) && $team['permissions']['canEditTeamPackages'];
46+
$permissions->canAddPackages = isset($team['permissions']['canAddPackages']) && $team['permissions']['canAddPackages'];
47+
$permissions->canCreateSubrepositories = isset($team['permissions']['canCreateSubrepositories']) && $team['permissions']['canCreateSubrepositories'];
48+
$permissions->canViewVendorCustomers = isset($team['permissions']['canViewVendorCustomers']) && $team['permissions']['canViewVendorCustomers'];
49+
$permissions->canManageVendorCustomers = isset($team['permissions']['canManageVendorCustomers']) && $team['permissions']['canManageVendorCustomers'];
50+
return $permissions;
51+
}
52+
}

‎tests/Api/TeamsTest.php

+124
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
namespace PrivatePackagist\ApiClient\Api;
1111

1212
use PHPUnit\Framework\MockObject\MockObject;
13+
use PrivatePackagist\ApiClient\TeamPermissions;
1314

1415
class TeamsTest extends ApiTestCase
1516
{
@@ -93,6 +94,129 @@ public function testRemovePackage()
9394
$this->assertSame($expected, $api->removePackage(1, 'acme-website/package'));
9495
}
9596

97+
public function testCreateTeam(): void
98+
{
99+
$expected = [
100+
'id' => 1,
101+
'name' => 'New Team',
102+
'permissions' => [
103+
'canEditTeamPackages' => true,
104+
'canAddPackages' => false,
105+
'canCreateSubrepositories' => false,
106+
'canViewVendorCustomers' => true,
107+
'canManageVendorCustomers' => false,
108+
],
109+
];
110+
111+
/** @var Teams&MockObject $api */
112+
$api = $this->getApiMock();
113+
$api->expects($this->once())
114+
->method('post')
115+
->with($this->equalTo('/teams/'), $this->equalTo([
116+
'name' => 'New Team',
117+
'permissions' => [
118+
'canEditTeamPackages' => true,
119+
'canAddPackages' => false,
120+
'canCreateSubrepositories' => false,
121+
'canViewVendorCustomers' => true,
122+
'canManageVendorCustomers' => false,
123+
],
124+
]))
125+
->willReturn($expected);
126+
127+
$permissions = new TeamPermissions;
128+
$permissions->canEditTeamPackages = true;
129+
$permissions->canViewVendorCustomers = true;
130+
$this->assertSame($expected, $api->create('New Team', $permissions));
131+
}
132+
133+
public function testEditTeam(): void
134+
{
135+
$expected = [
136+
'id' => 123,
137+
'name' => 'New Team',
138+
'permissions' => [
139+
'canEditTeamPackages' => true,
140+
'canAddPackages' => false,
141+
'canCreateSubrepositories' => false,
142+
'canViewVendorCustomers' => true,
143+
'canManageVendorCustomers' => false,
144+
],
145+
];
146+
147+
/** @var Teams&MockObject $api */
148+
$api = $this->getApiMock();
149+
$api->expects($this->once())
150+
->method('put')
151+
->with($this->equalTo('/teams/123/'), $this->equalTo([
152+
'name' => 'New Team',
153+
'permissions' => [
154+
'canEditTeamPackages' => true,
155+
'canAddPackages' => false,
156+
'canCreateSubrepositories' => false,
157+
'canViewVendorCustomers' => true,
158+
'canManageVendorCustomers' => false,
159+
],
160+
]))
161+
->willReturn($expected);
162+
163+
$permissions = new TeamPermissions;
164+
$permissions->canEditTeamPackages = true;
165+
$permissions->canViewVendorCustomers = true;
166+
$this->assertSame($expected, $api->edit(123, 'New Team', $permissions));
167+
}
168+
169+
public function testDeleteTeam(): void
170+
{
171+
$expected = [];
172+
173+
/** @var Teams&MockObject $api */
174+
$api = $this->getApiMock();
175+
$api->expects($this->once())
176+
->method('delete')
177+
->with($this->equalTo('/teams/1/'))
178+
->willReturn($expected);
179+
180+
$this->assertSame($expected, $api->remove(1));
181+
}
182+
183+
public function testAddMember(): void
184+
{
185+
$expected = [
186+
'id' => 1,
187+
'name' => 'New Team',
188+
'members' => [
189+
[
190+
'id' => 12,
191+
'username' => 'username'
192+
]
193+
],
194+
];
195+
196+
/** @var Teams&MockObject $api */
197+
$api = $this->getApiMock();
198+
$api->expects($this->once())
199+
->method('put')
200+
->with($this->equalTo('/teams/1/members/12/'))
201+
->willReturn($expected);
202+
203+
$this->assertSame($expected, $api->addMember(1, 12));
204+
}
205+
206+
public function removeMember(): void
207+
{
208+
$expected = [];
209+
210+
/** @var Teams&MockObject $api */
211+
$api = $this->getApiMock();
212+
$api->expects($this->once())
213+
->method('delete')
214+
->with($this->equalTo('/teams/1/members/12/'))
215+
->willReturn($expected);
216+
217+
$this->assertSame($expected, $api->removeMember(1, 12));
218+
}
219+
96220
/**
97221
* @return string
98222
*/

0 commit comments

Comments
 (0)
Please sign in to comment.