Skip to content

Commit

Permalink
Merge pull request #55 from zanbaldwin/z/team-management-endpoints
Browse files Browse the repository at this point in the history
API: Add SDK Methods for Team Management Endpoints
  • Loading branch information
glaubinix authored Sep 16, 2022
2 parents 61fabb0 + ac85d90 commit c382497
Show file tree
Hide file tree
Showing 4 changed files with 303 additions and 1 deletion.
79 changes: 78 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -108,7 +113,7 @@
* [Validate incoming webhook payloads](#validate-incoming-webhook-payloads)
* [License](#license)

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

<!--te-->

Expand Down Expand Up @@ -156,12 +161,84 @@ 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,
);
```

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();
```
Returns an array of teams.

#### Create a New Team
```php
use PrivatePackagist\ApiClient\TeamPermissions;

$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
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.

#### 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;
Expand Down
49 changes: 49 additions & 0 deletions src/Api/Teams.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,62 @@

namespace PrivatePackagist\ApiClient\Api;

use PrivatePackagist\ApiClient\TeamPermissions;

class Teams extends AbstractApi
{
public function all()
{
return $this->get('/teams/');
}

public function create(string $name, TeamPermissions $permissions): array
{
$parameters = [
'name' => $name,
'permissions' => [
'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, string $name, TeamPermissions $permissions): array
{
$parameters = [
'name' => $name,
'permissions' => [
'canEditTeamPackages' => (bool) $permissions->canEditTeamPackages,
'canAddPackages' => (bool) $permissions->canAddPackages,
'canCreateSubrepositories' => (bool) $permissions->canCreateSubrepositories,
'canViewVendorCustomers' => (bool) $permissions->canViewVendorCustomers,
'canManageVendorCustomers' => (bool) $permissions->canManageVendorCustomers,
],
];

return $this->put(sprintf('/teams/%s/', $teamId), $parameters);
}

public function remove($teamId): array
{
return $this->delete(sprintf('/teams/%s/', $teamId));
}

public function addMember($teamId, $userId): array
{
return $this->put(sprintf('/teams/%s/members/%s/', $teamId, $userId));
}

public function removeMember($teamId, $userId): array
{
return $this->delete(sprintf('/teams/%s/members/%s/', $teamId, $userId));
}

public function packages($teamId)
{
return $this->get(sprintf('/teams/%s/packages/', $teamId));
Expand Down
52 changes: 52 additions & 0 deletions src/TeamPermissions.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
<?php

/*
* (c) Packagist Conductors GmbH <[email protected]>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

namespace PrivatePackagist\ApiClient;

final 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;
}

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;
}
}
124 changes: 124 additions & 0 deletions tests/Api/TeamsTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
namespace PrivatePackagist\ApiClient\Api;

use PHPUnit\Framework\MockObject\MockObject;
use PrivatePackagist\ApiClient\TeamPermissions;

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

public function testCreateTeam(): void
{
$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);

$permissions = new TeamPermissions;
$permissions->canEditTeamPackages = true;
$permissions->canViewVendorCustomers = true;
$this->assertSame($expected, $api->create('New Team', $permissions));
}

public function testEditTeam(): void
{
$expected = [
'id' => 123,
'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);

$permissions = new TeamPermissions;
$permissions->canEditTeamPackages = true;
$permissions->canViewVendorCustomers = true;
$this->assertSame($expected, $api->edit(123, 'New Team', $permissions));
}

public function testDeleteTeam(): void
{
$expected = [];

/** @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(): void
{
$expected = [
'id' => 1,
'name' => 'New Team',
'members' => [
[
'id' => 12,
'username' => 'username'
]
],
];

/** @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(): void
{
$expected = [];

/** @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
*/
Expand Down

0 comments on commit c382497

Please sign in to comment.