Skip to content

Commit

Permalink
add search endpoint to groups and projects
Browse files Browse the repository at this point in the history
  • Loading branch information
macbookandrew committed Nov 10, 2023
1 parent f8fc633 commit e9a0352
Show file tree
Hide file tree
Showing 4 changed files with 169 additions and 0 deletions.
51 changes: 51 additions & 0 deletions src/Api/Groups.php
Original file line number Diff line number Diff line change
Expand Up @@ -979,4 +979,55 @@ public function deleteDeployToken($group_id, int $token_id)
{
return $this->delete('groups/'.self::encodePath($group_id).'/deploy_tokens/'.self::encodePath($token_id));
}

/**
* @param int|string $id
* @param array $parameters {
*
* @var string $scope The scope to search in
* @var string $search The search query
* @var string $state Filter by state. Issues and merge requests are supported; it is ignored for other scopes.
* @var bool $confidential Filter by confidentiality. Issues scope is supported; it is ignored for other scopes.
* @var string $order_by Allowed values are created_at only. If this is not set, the results are either sorted by created_at in descending order for basic search, or by the most relevant documents when using advanced search.
* @var string $sort Return projects sorted in asc or desc order (default is desc)
* }
*
* @throws UndefinedOptionsException If an option name is undefined

Check failure on line 995 in src/Api/Groups.php

View workflow job for this annotation

GitHub Actions / Psalm

UndefinedDocblockClass

src/Api/Groups.php:995:16: UndefinedDocblockClass: Docblock-defined class, interface or enum named Gitlab\Api\UndefinedOptionsException does not exist (see https://psalm.dev/200)
* @throws InvalidOptionsException If an option doesn't fulfill the

Check failure on line 996 in src/Api/Groups.php

View workflow job for this annotation

GitHub Actions / Psalm

UndefinedDocblockClass

src/Api/Groups.php:996:16: UndefinedDocblockClass: Docblock-defined class, interface or enum named Gitlab\Api\InvalidOptionsException does not exist (see https://psalm.dev/200)
* specified validation rules
*
* @return mixed
*/
public function search($id, array $parameters = [])

Check failure on line 1001 in src/Api/Groups.php

View workflow job for this annotation

GitHub Actions / PHPStan

PHPDoc tag @throws with type Gitlab\Api\InvalidOptionsException|Gitlab\Api\UndefinedOptionsException is not subtype of Throwable
{
$resolver = $this->createOptionsResolver();
$booleanNormalizer = function (Options $resolver, $value): string {
return $value ? 'true' : 'false';
};
$resolver->setDefined('confidential')
->setAllowedTypes('confidential', 'bool')
->setNormalizer('confidential', $booleanNormalizer);
$scope = [
'issues',
'merge_requests',
'milestones',
'projects',
'users',
'blobs',
'commits',
'notes',
'wiki_blobs',
];
$resolver->setRequired('scope')
->setAllowedValues('scope', $scope);
$resolver->setRequired('search');
$resolver->setDefined('order_by')
->setAllowedValues('order_by', ['created_at']);
$resolver->setDefined('sort')
->setAllowedValues('sort', ['asc', 'desc']);
$resolver->setDefined('state')
->setAllowedValues('state', ['opened', 'closed']);

return $this->get('groups/'.self::encodePath($id).'/search', $resolver->resolve($parameters));
}
}
54 changes: 54 additions & 0 deletions src/Api/Projects.php
Original file line number Diff line number Diff line change
Expand Up @@ -1781,4 +1781,58 @@ public function deleteProtectedTag($project_id, string $tag_name)
{
return $this->delete($this->getProjectPath($project_id, 'protected_tags/'.self::encodePath($tag_name)));
}


/**
* @param int|string $id
* @param array $parameters {
*
* @var string $scope The scope to search in
* @var string $search The search query
* @var string $state Filter by state. Issues and merge requests are supported; it is ignored for other scopes.
* @var string $ref The name of a repository branch or tag to search on. The project’s default branch is used by default. Applicable only for scopes blobs, commits, and wiki_blobs.
* @var bool $confidential Filter by confidentiality. Issues scope is supported; it is ignored for other scopes.
* @var string $order_by Allowed values are created_at only. If this is not set, the results are either sorted by created_at in descending order for basic search, or by the most relevant documents when using advanced search.
* @var string $sort Return projects sorted in asc or desc order (default is desc)
* }
*
* @throws UndefinedOptionsException If an option name is undefined
* @throws InvalidOptionsException If an option doesn't fulfill the
* specified validation rules
*
* @return mixed
*/
public function search($id, array $parameters = [])
{
$resolver = $this->createOptionsResolver();
$booleanNormalizer = function (Options $resolver, $value): string {
return $value ? 'true' : 'false';
};
$resolver->setDefined('confidential')
->setAllowedTypes('confidential', 'bool')
->setNormalizer('confidential', $booleanNormalizer);
$scope = [
'blobs',
'commits',
'issues',
'merge_requests',
'milestones',
'notes',
'users',
'wiki_blobs',
];
$resolver->setRequired('scope')
->setAllowedValues('scope', $scope);
$resolver->setRequired('search');
$resolver->setDefined('ref')
->setAllowedTypes('ref', 'string');
$resolver->setDefined('order_by')
->setAllowedValues('order_by', ['created_at']);
$resolver->setDefined('sort')
->setAllowedValues('sort', ['asc', 'desc']);
$resolver->setDefined('state')
->setAllowedValues('state', ['opened', 'closed']);

return $this->get('projects/'.self::encodePath($id).'/search', $resolver->resolve($parameters));
}
}
32 changes: 32 additions & 0 deletions tests/Api/GroupsTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -940,4 +940,36 @@ public function shouldDeleteDeployToken(): void

$this->assertEquals($expectedBool, $api->deleteDeployToken(1, 2));
}

/**
* @test
*/
public function shouldSearchGroups(): void
{
$expectedArray = [
['id' => 6, 'name' => 'Project 6 bla'],
['id' => 7, 'name' => 'Project 7 bla'],
['id' => 8, 'name' => 'Project 8 bla'],
];

$api = $this->getApiMock();
$api->expects($this->once())
->method('get')
->with('groups/123/search', [
'scope' => 'projects',
'confidential' => 'false',
'search' => 'bla',
'order_by' => 'created_at',
'sort' => 'desc',
])
->will($this->returnValue($expectedArray));

$this->assertEquals($expectedArray, $api->search(123, [
'scope' => 'projects',
'confidential' => false,
'search' => 'bla',
'order_by' => 'created_at',
'sort' => 'desc',
]));
}
}
32 changes: 32 additions & 0 deletions tests/Api/ProjectsTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -3017,4 +3017,36 @@ protected function getApiClass()
{
return Projects::class;
}

/**
* @test
*/
public function shouldSearchGroups(): void
{
$expectedArray = [
['id' => 6, 'title' => 'Issue 6 bla'],
['id' => 7, 'title' => 'Issue 7 bla'],
['id' => 8, 'title' => 'Issue 8 bla'],
];

$api = $this->getApiMock();
$api->expects($this->once())
->method('get')
->with('projects/123/search', [
'scope' => 'issues',
'confidential' => 'false',
'search' => 'bla',
'order_by' => 'created_at',
'sort' => 'desc',
])
->will($this->returnValue($expectedArray));

$this->assertEquals($expectedArray, $api->search(123, [
'scope' => 'issues',
'confidential' => false,
'search' => 'bla',
'order_by' => 'created_at',
'sort' => 'desc',
]));
}
}

0 comments on commit e9a0352

Please sign in to comment.