Skip to content

Commit bb0fdfb

Browse files
glaubinixm1guelpf
authored andcommitted
Groups: add subgroup endpoint
1 parent bfb6e48 commit bb0fdfb

File tree

3 files changed

+93
-30
lines changed

3 files changed

+93
-30
lines changed

lib/Gitlab/Api/Groups.php

Lines changed: 58 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -19,36 +19,7 @@ class Groups extends AbstractApi
1919
*/
2020
public function all(array $parameters = [])
2121
{
22-
$resolver = $this->createOptionsResolver();
23-
$booleanNormalizer = function (Options $resolver, $value) {
24-
return $value ? 'true' : 'false';
25-
};
26-
27-
$resolver->setDefined('skip_groups')
28-
->setAllowedTypes('skip_groups', 'array')
29-
->setAllowedValues('skip_groups', function (array $value) {
30-
return count($value) == count(array_filter($value, 'is_int'));
31-
})
32-
;
33-
$resolver->setDefined('all_available')
34-
->setAllowedTypes('all_available', 'bool')
35-
->setNormalizer('all_available', $booleanNormalizer)
36-
;
37-
$resolver->setDefined('search');
38-
$resolver->setDefined('order_by')
39-
->setAllowedValues('order_by', ['name', 'path'])
40-
;
41-
$resolver->setDefined('sort')
42-
->setAllowedValues('sort', ['asc', 'desc'])
43-
;
44-
$resolver->setDefined('statistics')
45-
->setAllowedTypes('statistics', 'bool')
46-
->setNormalizer('statistics', $booleanNormalizer)
47-
;
48-
$resolver->setDefined('owned')
49-
->setAllowedTypes('owned', 'bool')
50-
->setNormalizer('owned', $booleanNormalizer)
51-
;
22+
$resolver = $this->getGroupSearchResolver();
5223

5324
return $this->get('groups', $resolver->resolve($parameters));
5425
}
@@ -225,4 +196,61 @@ public function projects($id, array $parameters = [])
225196

226197
return $this->get('groups/'.$this->encodePath($id).'/projects', $resolver->resolve($parameters));
227198
}
199+
200+
/**
201+
* @param int $groupId
202+
* @param array $parameters (
203+
*
204+
* @var int[] $skip_groups Skip the group IDs passes.
205+
* @var bool $all_available Show all the groups you have access to.
206+
* @var string $search Return list of authorized groups matching the search criteria.
207+
* @var string $order_by Order groups by name or path. Default is name.
208+
* @var string $sort Order groups in asc or desc order. Default is asc.
209+
* @var bool $statistics Include group statistics (admins only).
210+
* @var bool $owned Limit by groups owned by the current user.
211+
* )
212+
* @return mixed
213+
*/
214+
public function subgroups($groupId, array $parameters = [])
215+
{
216+
$resolver = $this->getGroupSearchResolver();
217+
218+
return $this->get('groups/'.$this->encodePath($groupId).'/subgroups', $resolver->resolve($parameters));
219+
}
220+
221+
private function getGroupSearchResolver()
222+
{
223+
$resolver = $this->createOptionsResolver();
224+
$booleanNormalizer = function (Options $resolver, $value) {
225+
return $value ? 'true' : 'false';
226+
};
227+
228+
$resolver->setDefined('skip_groups')
229+
->setAllowedTypes('skip_groups', 'array')
230+
->setAllowedValues('skip_groups', function (array $value) {
231+
return count($value) == count(array_filter($value, 'is_int'));
232+
})
233+
;
234+
$resolver->setDefined('all_available')
235+
->setAllowedTypes('all_available', 'bool')
236+
->setNormalizer('all_available', $booleanNormalizer)
237+
;
238+
$resolver->setDefined('search');
239+
$resolver->setDefined('order_by')
240+
->setAllowedValues('order_by', ['name', 'path'])
241+
;
242+
$resolver->setDefined('sort')
243+
->setAllowedValues('sort', ['asc', 'desc'])
244+
;
245+
$resolver->setDefined('statistics')
246+
->setAllowedTypes('statistics', 'bool')
247+
->setNormalizer('statistics', $booleanNormalizer)
248+
;
249+
$resolver->setDefined('owned')
250+
->setAllowedTypes('owned', 'bool')
251+
->setNormalizer('owned', $booleanNormalizer)
252+
;
253+
254+
return $resolver;
255+
}
228256
}

lib/Gitlab/Model/Group.php

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,4 +135,19 @@ public function projects()
135135

136136
return Group::fromArray($this->getClient(), $data);
137137
}
138+
139+
/**
140+
* @return Group[]
141+
*/
142+
public function subgroups()
143+
{
144+
$data = $this->client->groups()->subgroups($this->id);
145+
146+
$groups = array();
147+
foreach ($data as $group) {
148+
$groups[] = Group::fromArray($this->getClient(), $group);
149+
}
150+
151+
return $groups;
152+
}
138153
}

test/Gitlab/Tests/Api/GroupsTest.php

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,26 @@ public function shouldRemoveGroup()
274274
$this->assertEquals($expectedBool, $api->remove(1));
275275
}
276276

277+
/**
278+
* @test
279+
*/
280+
public function shouldGetAllSubgroups()
281+
{
282+
$expectedArray = array(
283+
array('id' => 101, 'name' => 'A subgroup'),
284+
array('id' => 1-2, 'name' => 'Another subggroup'),
285+
);
286+
287+
$api = $this->getApiMock();
288+
$api->expects($this->once())
289+
->method('get')
290+
->with('groups/1/subgroups', array('page' => 1, 'per_page' => 10))
291+
->will($this->returnValue($expectedArray))
292+
;
293+
294+
$this->assertEquals($expectedArray, $api->subgroups(1, ['page' => 1, 'per_page' => 10]));
295+
}
296+
277297
protected function getApiClass()
278298
{
279299
return 'Gitlab\Api\Groups';

0 commit comments

Comments
 (0)