Skip to content

Commit c93d722

Browse files
authored
Merge pull request #92 from packagist/feat/artifact-package-suborg
Add artifact endpoints for suborganization
2 parents ce2a89b + 2262f90 commit c93d722

5 files changed

Lines changed: 261 additions & 0 deletions

File tree

README.md

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,10 @@
7171
* [Edit a custom package in a suborganization](#edit-a-custom-package-in-a-suborganization)
7272
* [Delete a package from a suborganization](#delete-a-package-from-a-suborganization)
7373
* [List all dependents of a suborganization package](#list-all-dependents-of-a-suborganization-package)
74+
* [Create an artifact package file in a suborganization](#create-an-artifact-package-file-in-a-suborganization)
75+
* [Create an artifact package in a suborganization](#create-an-artifact-package-in-a-suborganization)
76+
* [Add an artifact file to an existing package in a suborganization](#add-an-artifact-file-to-an-existing-package-in-a-suborganization)
77+
* [Update or replace artifact files of a package in a suborganization](#update-or-replace-artifact-files-of-a-package-in-a-suborganization)
7478
* [List a suborganization's authentication tokens](#list-a-suborganizations-authentication-tokens)
7579
* [Create a suborganization authentication token](#create-a-suborganization-authentication-token)
7680
* [Delete a suborganization authentication token](#delete-a-suborganization-authentication-token)
@@ -702,6 +706,57 @@ $client->suborganizations()->packages()->listDependents($suborganizationName, 'a
702706
```
703707
Returns a list of packages.
704708

709+
#### Create an artifact package file in a suborganization
710+
711+
```php
712+
$suborganizationName = 'suborganization';
713+
$fileName = 'package1.zip'; // your package archive artifact containing a valid composer.json in root directory
714+
$file = file_get_contents($fileName);
715+
$client->suborganizations()->packages()->artifacts()->create($suborganizationName, $file, 'application/zip', $fileName);
716+
```
717+
718+
#### Create an artifact package in a suborganization
719+
720+
```php
721+
$suborganizationName = 'suborganization';
722+
$fileName = 'package1.zip';
723+
$file = file_get_contents($fileName);
724+
$response = $client->suborganizations()->packages()->artifacts()->create($suborganizationName, $file, 'application/zip', $fileName);
725+
$artifactId = $response['id'];
726+
$client->suborganizations()->packages()->createArtifactPackage($suborganizationName, [$artifactId]);
727+
```
728+
729+
#### Add an artifact file to an existing package in a suborganization
730+
731+
```php
732+
$suborganizationName = 'suborganization';
733+
$packageName = 'acme/artifact';
734+
$fileName = 'package1.zip';
735+
$file = file_get_contents($fileName);
736+
$client->suborganizations()->packages()->artifacts()->add($suborganizationName, $packageName, $file, 'application/zip', $fileName);
737+
```
738+
739+
#### Update or replace artifact files of a package in a suborganization
740+
741+
```php
742+
$suborganizationName = 'suborganization';
743+
// in case you want to replace the artifact file with a newly uploaded one
744+
// 1. get current artifact ids
745+
$result = $client->suborganizations()->packages()->artifacts()->showPackageArtifacts($suborganizationName, 'acme-website/package');
746+
$artifactIds = array_column($result, 'id'); // [41, 42]
747+
748+
// 2. upload the new artifact file
749+
$fileName = 'package1.zip';
750+
$file = file_get_contents($fileName);
751+
$response = $client->suborganizations()->packages()->artifacts()->create($suborganizationName, $file, 'application/zip', $fileName);
752+
$newArtifactId = $response['id'];
753+
754+
// 3. let's say we don't want to have the artifact file id = 41 and use the newly uploaded file instead
755+
array_shift($artifactIds);
756+
$artifactIds[] = $newArtifactId;
757+
$client->suborganizations()->packages()->editArtifactPackage($suborganizationName, 'acme-website/package', $artifactIds);
758+
```
759+
705760
#### List a suborganization's authentication tokens
706761
```php
707762
$suborganizationName = 'suborganization';

src/Api/Suborganizations/Packages.php

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@
1010
namespace PrivatePackagist\ApiClient\Api\Suborganizations;
1111

1212
use PrivatePackagist\ApiClient\Api\AbstractApi;
13+
use PrivatePackagist\ApiClient\Api\Suborganizations\Packages\Artifacts;
1314
use PrivatePackagist\ApiClient\Exception\InvalidArgumentException;
15+
use PrivatePackagist\ApiClient\Payload\ArtifactPackageConfig;
1416
use PrivatePackagist\ApiClient\Payload\CustomPackageConfig;
1517
use PrivatePackagist\ApiClient\Payload\VcsPackageConfig;
1618

@@ -44,6 +46,13 @@ public function createCustomPackage($suborganizationName, $customJson, $credenti
4446
return $this->post(sprintf('/suborganizations/%s/packages/', $suborganizationName), $data->toParameters());
4547
}
4648

49+
public function createArtifactPackage($suborganizationName, array $artifactPackageFileIds)
50+
{
51+
$data = new ArtifactPackageConfig($artifactPackageFileIds, null);
52+
53+
return $this->post(sprintf('/suborganizations/%s/packages/', $suborganizationName), $data->toParameters());
54+
}
55+
4756
public function editVcsPackage($suborganizationName, $packageIdOrName, $url, $credentialId = null, $type = 'vcs', $defaultSuborganizationAccess = null)
4857
{
4958
$data = new VcsPackageConfig($url, $credentialId, $type, $defaultSuborganizationAccess);
@@ -58,6 +67,13 @@ public function editCustomPackage($suborganizationName, $packageIdOrName, $custo
5867
return $this->put(sprintf('/suborganizations/%s/packages/%s/', $suborganizationName, $packageIdOrName), $data->toParameters());
5968
}
6069

70+
public function editArtifactPackage($suborganizationName, $packageIdOrName, array $artifactPackageFileIds)
71+
{
72+
$data = new ArtifactPackageConfig($artifactPackageFileIds, null);
73+
74+
return $this->put(sprintf('/suborganizations/%s/packages/%s/', $suborganizationName, $packageIdOrName), $data->toParameters());
75+
}
76+
6177
public function remove($suborganizationName, $packageIdOrName)
6278
{
6379
return $this->delete(sprintf('/suborganizations/%s/packages/%s/', $suborganizationName, $packageIdOrName));
@@ -67,4 +83,9 @@ public function listDependents($suborganizationName, $packageIdOrName)
6783
{
6884
return $this->getCollection(sprintf('/suborganizations/%s/packages/%s/dependents/', $suborganizationName, $packageIdOrName));
6985
}
86+
87+
public function artifacts()
88+
{
89+
return new Artifacts($this->client, $this->client->getResponseMediator());
90+
}
7091
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
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\Api\Suborganizations\Packages;
11+
12+
use PrivatePackagist\ApiClient\Api\AbstractApi;
13+
14+
class Artifacts extends AbstractApi
15+
{
16+
public function create($suborganizationName, $file, $contentType, $fileName)
17+
{
18+
return $this->postFile(sprintf('/suborganizations/%s/packages/artifacts/', $suborganizationName), $file, array_filter([
19+
'Content-Type' => $contentType,
20+
'X-FILENAME' => $fileName
21+
]));
22+
}
23+
24+
public function add($suborganizationName, $packageIdOrName, $file, $contentType, $fileName)
25+
{
26+
return $this->postFile(sprintf('/suborganizations/%s/packages/%s/artifacts/', $suborganizationName, $packageIdOrName), $file, array_filter([
27+
'Content-Type' => $contentType,
28+
'X-FILENAME' => $fileName
29+
]));
30+
}
31+
32+
public function show($suborganizationName, $artifactId)
33+
{
34+
return $this->get(sprintf('/suborganizations/%s/packages/artifacts/%s/', $suborganizationName, $artifactId));
35+
}
36+
37+
public function showPackageArtifacts($suborganizationName, $packageIdOrName)
38+
{
39+
return $this->getCollection(sprintf('/suborganizations/%s/packages/%s/artifacts/', $suborganizationName, $packageIdOrName));
40+
}
41+
}
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
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\Api\Suborganizations\Packages;
11+
12+
use PHPUnit\Framework\MockObject\MockObject;
13+
use PrivatePackagist\ApiClient\Api\ApiTestCase;
14+
15+
class ArtifactsTest extends ApiTestCase
16+
{
17+
public function testCreate()
18+
{
19+
$suborganizationName = 'suborganization';
20+
$expected = [
21+
'id' => 1,
22+
];
23+
$rawFileContent = 'foobar';
24+
$headers = [
25+
'Content-Type' => 'application/zip',
26+
'X-FILENAME' => 'file.zip'
27+
];
28+
29+
/** @var Artifacts&MockObject $api */
30+
$api = $this->getApiMock();
31+
$api->expects($this->once())
32+
->method('postFile')
33+
->with($this->equalTo('/suborganizations/suborganization/packages/artifacts/'), $rawFileContent, $headers)
34+
->willReturn($expected);
35+
36+
37+
$this->assertSame($expected, $api->create($suborganizationName, $rawFileContent, $headers['Content-Type'], $headers['X-FILENAME']));
38+
}
39+
40+
public function testAdd()
41+
{
42+
$suborganizationName = 'suborganization';
43+
$packageName = 'acme/artifact';
44+
$expected = [
45+
'id' => 1,
46+
];
47+
$rawFileContent = 'foobar';
48+
$headers = [
49+
'Content-Type' => 'application/zip',
50+
'X-FILENAME' => 'file.zip'
51+
];
52+
53+
/** @var Artifacts&MockObject $api */
54+
$api = $this->getApiMock();
55+
$api->expects($this->once())
56+
->method('postFile')
57+
->with($this->equalTo('/suborganizations/'.$suborganizationName.'/packages/'.$packageName.'/artifacts/'), $rawFileContent, $headers)
58+
->willReturn($expected);
59+
60+
61+
$this->assertSame($expected, $api->add($suborganizationName, $packageName, $rawFileContent, $headers['Content-Type'], $headers['X-FILENAME']));
62+
}
63+
64+
public function testShow()
65+
{
66+
$suborganizationName = 'suborganization';
67+
$expected = [
68+
'repoType' => 'artifact',
69+
'artifactPackageFileIds' =>[1, 2],
70+
];
71+
72+
/** @var Artifacts&MockObject $api */
73+
$api = $this->getApiMock();
74+
$api->expects($this->once())
75+
->method('get')
76+
->with($this->equalTo('/suborganizations/suborganization/packages/artifacts/1/'))
77+
->willReturn($expected);
78+
79+
$this->assertSame($expected, $api->show($suborganizationName, '1'));
80+
}
81+
82+
public function testShowPackageArtifacts()
83+
{
84+
$suborganizationName = 'suborganization';
85+
$expected = [
86+
'name' => 'acme-website/package',
87+
'repoType' => 'artifact',
88+
'artifactFiles' => 'artifact',
89+
];
90+
91+
/** @var Artifacts&MockObject $api */
92+
$api = $this->getApiMock();
93+
$api->expects($this->once())
94+
->method('getCollection')
95+
->with($this->equalTo('/suborganizations/suborganization/packages/acme-website/package/artifacts/'))
96+
->willReturn($expected);
97+
98+
$this->assertSame($expected, $api->showPackageArtifacts($suborganizationName, 'acme-website/package'));
99+
}
100+
101+
/**
102+
* @return string
103+
*/
104+
protected function getApiClass()
105+
{
106+
return Artifacts::class;
107+
}
108+
}

tests/Api/Suborganizations/PackagesTest.php

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,24 @@ public function customProvider()
141141
];
142142
}
143143

144+
public function testCreateArtifactPackage()
145+
{
146+
$suborganizationName = 'suborganization';
147+
$expected = [
148+
'id' => 'job-id',
149+
'status' => 'queued',
150+
];
151+
152+
/** @var Packages&MockObject $api */
153+
$api = $this->getApiMock();
154+
$api->expects($this->once())
155+
->method('post')
156+
->with($this->equalTo('/suborganizations/suborganization/packages/'), $this->equalTo(['repoType' => 'artifact', 'artifactIds' => [42]]))
157+
->willReturn($expected);
158+
159+
$this->assertSame($expected, $api->createArtifactPackage($suborganizationName, [42]));
160+
}
161+
144162
public function testEditVcsPackage()
145163
{
146164
$suborganizationName = 'suborganization';
@@ -177,6 +195,24 @@ public function testEditCustomPackage()
177195
$this->assertSame($expected, $api->editCustomPackage($suborganizationName, 'acme-website/package', '{}'));
178196
}
179197

198+
public function testEditArtifactPackage()
199+
{
200+
$suborganizationName = 'suborganization';
201+
$expected = [
202+
'id' => 'job-id',
203+
'status' => 'queued',
204+
];
205+
206+
/** @var Packages&MockObject $api */
207+
$api = $this->getApiMock();
208+
$api->expects($this->once())
209+
->method('put')
210+
->with($this->equalTo('/suborganizations/suborganization/packages/acme-website/package/'), $this->equalTo(['repoType' => 'artifact', 'artifactIds' => [1, 3]]))
211+
->willReturn($expected);
212+
213+
$this->assertSame($expected, $api->editArtifactPackage($suborganizationName, 'acme-website/package', [1, 3]));
214+
}
215+
180216
public function testRemove()
181217
{
182218
$suborganizationName = 'suborganization';

0 commit comments

Comments
 (0)