Skip to content

Commit d9c15df

Browse files
committed
Projects: add endpoints to manage mirrored repositories
1 parent d9cfc1b commit d9c15df

File tree

4 files changed

+307
-3
lines changed

4 files changed

+307
-3
lines changed

README.md

Lines changed: 67 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,72 @@ $token = $client->projects()->regenerateToken($projectName, $confirmation);
230230
```
231231
Returns the authentication token.
232232

233+
##### List a projects's mirrored repositories
234+
```php
235+
$projectName = 'project';
236+
$mirroredRepositories = $client->projects()->mirroredRepositories()->all($projectName);
237+
```
238+
Returns an array of mirrored repositories.
239+
240+
##### Show a mirrored repository
241+
```php
242+
$projectName = 'project';
243+
$mirroredRepositoryId = 42;
244+
$mirroredRepository = $client->projects()->mirroredRepositories()->show($projectName, $mirroredRepositoryId);
245+
```
246+
Returns the mirrored repository.
247+
248+
##### Add mirrored repositories to a project
249+
```php
250+
$projectName = 'project';
251+
$mirroredRepositoriesToAdd = [
252+
['id' => 12, 'mirroringBehavior' => 'add_on_use'],
253+
];
254+
$mirroredRepository = $client->projects()->mirroredRepositories()->add($projectName, $mirroredRepositoriesToAdd);
255+
```
256+
Returns a list of added mirrored repositories.
257+
258+
##### Edit the mirroring behaviour of mirrored repository in a project
259+
```php
260+
$projectName = 'project';
261+
$mirroredRepositoryId = 42;
262+
$mirroredRepository = $client->projects()->mirroredRepositories()->create($projectName, $mirroredRepositoryId, 'add_on_use');
263+
```
264+
Returns the edited mirrored repository.
265+
266+
##### Delete a mirrored repository from a project
267+
```php
268+
$projectName = 'project';
269+
$mirroredRepositoryId = 42;
270+
$client->projects()->mirroredRepositories()->remove($projectName, $mirroredRepositoryId);
271+
```
272+
273+
##### List all mirrored packages from a mirrored repository in a project
274+
```php
275+
$projectName = 'project';
276+
$mirroredRepositoryId = 42;
277+
$packages = $client->projects()->mirroredRepositories()->listPackages($projectName, $mirroredRepositoryId);
278+
```
279+
Returns an array of packages.
280+
281+
##### Add mirrored packages from one mirrored repository to a project
282+
```php
283+
$projectName = 'project';
284+
$mirroredRepositoryId = 42;
285+
$packages = [
286+
'acme/cool-lib
287+
];
288+
$jobs = $client->projects()->mirroredRepositories()->addPackages($projectName, $mirroredRepositoryId, $packages);
289+
```
290+
Returns an array of jobs.
291+
292+
##### Remove all mirrored packages from one mirrored repository in a project
293+
```php
294+
$projectName = 'project';
295+
$mirroredRepositoryId = 42;
296+
$client->projects()->mirroredRepositories()->removePackages($projectName, $mirroredRepositoryId);
297+
```
298+
233299
#### Package
234300

235301
##### List an organization's packages
@@ -348,7 +414,7 @@ Returns an array of mirrored repositories.
348414
$mirroredRepositoryId = 42;
349415
$mirroredRepository = $client->mirroredRepositories()->show($mirroredRepositoryId);
350416
```
351-
Returns the credential.
417+
Returns the mirrored repository.
352418

353419
##### Create a mirrored repository
354420
```php

src/Api/Projects.php

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,9 @@ public function remove($projectName)
3333
return $this->delete(sprintf('/projects/%s/', $projectName));
3434
}
3535

36-
public function listTeams($projectsName)
36+
public function listTeams($projectName)
3737
{
38-
return $this->get(sprintf('/projects/%s/teams/', $projectsName));
38+
return $this->get(sprintf('/projects/%s/teams/', $projectName));
3939
}
4040

4141
/**
@@ -94,4 +94,9 @@ public function regenerateToken($projectName, $tokenId, array $confirmation)
9494

9595
return $this->post(sprintf('/projects/%s/tokens/%s/regenerate', $projectName, $tokenId), $confirmation);
9696
}
97+
98+
public function mirroredRepositories()
99+
{
100+
return new Projects\MirroredRepositories($this->client);
101+
}
97102
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
<?php
2+
3+
/*
4+
* (c) Packagist Conductors UG (haftungsbeschränkt) <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\Projects;
11+
12+
use PrivatePackagist\ApiClient\Api\AbstractApi;
13+
use PrivatePackagist\ApiClient\Exception\InvalidArgumentException;
14+
15+
class MirroredRepositories extends AbstractApi
16+
{
17+
public function all($projectName)
18+
{
19+
return $this->get(sprintf('/projects/%s/mirrored-repositories/', $projectName));
20+
}
21+
22+
public function add($projectName, array $mirroredRepositories)
23+
{
24+
foreach ($mirroredRepositories as $mirroredRepository) {
25+
if (!isset($mirroredRepository['id'], $mirroredRepository['mirroringBehavior'])) {
26+
throw new InvalidArgumentException('The "id" and the "mirroringBehavior" are required to add a mirrored repository to a project');
27+
}
28+
}
29+
30+
return $this->post(sprintf('/projects/%s/mirrored-repositories/', $projectName), $mirroredRepositories);
31+
}
32+
33+
public function show($projectName, $mirroredRepositoryId)
34+
{
35+
return $this->get(sprintf('/projects/%s/mirrored-repositories/%s/', $projectName, $mirroredRepositoryId));
36+
}
37+
38+
public function edit($projectName, $mirroredRepositoryId, $mirroringBehavior)
39+
{
40+
return $this->put(sprintf('/projects/%s/mirrored-repositories/%s/', $projectName, $mirroredRepositoryId), [
41+
'mirroringBehavior' => $mirroringBehavior,
42+
]);
43+
}
44+
45+
public function remove($projectName, $mirroredRepositoryId)
46+
{
47+
return $this->delete(sprintf('/projects/%s/mirrored-repositories/%s/', $projectName, $mirroredRepositoryId));
48+
}
49+
50+
public function listPackages($projectName, $mirroredRepositoryId)
51+
{
52+
return $this->get(sprintf('/projects/%s/mirrored-repositories/%s/packages/', $projectName, $mirroredRepositoryId));
53+
}
54+
55+
public function addPackages($projectName, $mirroredRepositoryId, array $packages)
56+
{
57+
return $this->post(sprintf('/projects/%s/mirrored-repositories/%s/packages/', $projectName, $mirroredRepositoryId), $packages);
58+
}
59+
60+
public function removePackages($projectName, $mirroredRepositoryId)
61+
{
62+
return $this->delete(sprintf('/projects/%s/mirrored-repositories/%s/packages/', $projectName, $mirroredRepositoryId));
63+
}
64+
}
Lines changed: 169 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,169 @@
1+
<?php
2+
3+
/*
4+
* (c) Packagist Conductors UG (haftungsbeschränkt) <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\Projects;
11+
12+
use PrivatePackagist\ApiClient\Api\ApiTestCase;
13+
14+
class MirroredRepositoriesTest extends ApiTestCase
15+
{
16+
public function testAll()
17+
{
18+
$projectName = 'project';
19+
$expected = [
20+
$this->getProjectMirroredRepositoryDefinition(),
21+
];
22+
23+
/** @var MirroredRepositories&\PHPUnit_Framework_MockObject_MockObject $api */
24+
$api = $this->getApiMock();
25+
$api->expects($this->once())
26+
->method('get')
27+
->with($this->equalTo('/projects/project/mirrored-repositories/'))
28+
->willReturn($expected);
29+
30+
$this->assertSame($expected, $api->all($projectName));
31+
}
32+
33+
public function testShow()
34+
{
35+
$projectName = 'project';
36+
$expected = $this->getProjectMirroredRepositoryDefinition();
37+
38+
/** @var MirroredRepositories&\PHPUnit_Framework_MockObject_MockObject $api */
39+
$api = $this->getApiMock();
40+
$api->expects($this->once())
41+
->method('get')
42+
->with($this->equalTo('/projects/project/mirrored-repositories/1/'))
43+
->willReturn($expected);
44+
45+
$this->assertSame($expected, $api->show($projectName, 1));
46+
}
47+
48+
public function testAdd()
49+
{
50+
$projectName = 'project';
51+
$expected = $this->getProjectMirroredRepositoryDefinition();
52+
$data = [
53+
'id' => $expected['mirroredRepository']['id'],
54+
'mirroringBehavior' => $expected['mirroringBehavior'],
55+
];
56+
57+
/** @var MirroredRepositories&\PHPUnit_Framework_MockObject_MockObject $api */
58+
$api = $this->getApiMock();
59+
$api->expects($this->once())
60+
->method('post')
61+
->with($this->equalTo('/projects/project/mirrored-repositories/'), $this->equalTo([$data]))
62+
->willReturn([$expected]);
63+
64+
$this->assertSame([$expected], $api->add($projectName, [$data]));
65+
}
66+
67+
public function testEdit()
68+
{
69+
$projectName = 'project';
70+
$expected = $this->getProjectMirroredRepositoryDefinition();
71+
$mirroredRepositoryId = $expected['mirroredRepository']['id'];
72+
$data = [
73+
'mirroringBehavior' => $mirroringBehaviour = $expected['mirroringBehavior'],
74+
];
75+
76+
/** @var MirroredRepositories&\PHPUnit_Framework_MockObject_MockObject $api */
77+
$api = $this->getApiMock();
78+
$api->expects($this->once())
79+
->method('put')
80+
->with($this->equalTo('/projects/project/mirrored-repositories/1/'), $this->equalTo($data))
81+
->willReturn($expected);
82+
83+
$this->assertSame($expected, $api->edit($projectName, $mirroredRepositoryId, $mirroringBehaviour));
84+
}
85+
public function testRemove()
86+
{
87+
$projectName = 'project';
88+
/** @var MirroredRepositories&\PHPUnit_Framework_MockObject_MockObject $api */
89+
$api = $this->getApiMock();
90+
$api->expects($this->once())
91+
->method('delete')
92+
->with($this->equalTo('/projects/project/mirrored-repositories/1/'))
93+
->willReturn([]);
94+
95+
$this->assertSame([], $api->remove($projectName, 1));
96+
}
97+
98+
public function testListPackages()
99+
{
100+
$projectName = 'project';
101+
$expected = [[
102+
'name' => 'acme/cool-lib',
103+
'origin' => 'public-mirror',
104+
'credentials' => null,
105+
]];
106+
/** @var MirroredRepositories&\PHPUnit_Framework_MockObject_MockObject $api */
107+
$api = $this->getApiMock();
108+
$api->expects($this->once())
109+
->method('get')
110+
->with($this->equalTo('/projects/project/mirrored-repositories/1/packages/'))
111+
->willReturn($expected);
112+
113+
$this->assertSame($expected, $api->listPackages($projectName, 1));
114+
}
115+
116+
public function testAddPackages()
117+
{
118+
$projectName = 'project';
119+
$expected = [[
120+
'id' => 'job-id',
121+
'status' => 'queued',
122+
]];
123+
124+
$packages = [
125+
'acme/cool-lib',
126+
];
127+
128+
/** @var MirroredRepositories&\PHPUnit_Framework_MockObject_MockObject $api */
129+
$api = $this->getApiMock();
130+
$api->expects($this->once())
131+
->method('post')
132+
->with($this->equalTo('/projects/project/mirrored-repositories/1/packages/'), $this->equalTo($packages))
133+
->willReturn($expected);
134+
135+
$this->assertSame($expected, $api->addPackages($projectName, 1, $packages));
136+
}
137+
138+
public function testRemovePackages()
139+
{
140+
$projectName = 'project';
141+
/** @var MirroredRepositories&\PHPUnit_Framework_MockObject_MockObject $api */
142+
$api = $this->getApiMock();
143+
$api->expects($this->once())
144+
->method('delete')
145+
->with($this->equalTo('/projects/project/mirrored-repositories/1/packages/'))
146+
->willReturn([]);
147+
148+
$this->assertSame([], $api->removePackages($projectName, 1));
149+
}
150+
151+
protected function getApiClass()
152+
{
153+
return MirroredRepositories::class;
154+
}
155+
156+
private function getProjectMirroredRepositoryDefinition()
157+
{
158+
return [
159+
'mirroringBehavior' => 'add_on_use',
160+
'mirroredRepository' => [
161+
'id' => 1,
162+
'name' => 'Packagist.org',
163+
'url' => 'https://packagist.org',
164+
'mirroringBehavior' => 'add_on_use',
165+
'credentials' => null,
166+
]
167+
];
168+
}
169+
}

0 commit comments

Comments
 (0)