Skip to content

API: Add SDK Methods for Team Management Endpoints #55

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 6 commits into from
Sep 16, 2022
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
79 changes: 78 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -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)

<!-- 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-->

@@ -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;
49 changes: 49 additions & 0 deletions src/Api/Teams.php
Original file line number Diff line number Diff line change
@@ -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));
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 <contact@packagist.com>
*
* 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
@@ -10,6 +10,7 @@
namespace PrivatePackagist\ApiClient\Api;

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

class TeamsTest extends ApiTestCase
{
@@ -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
*/