diff --git a/src/Api.php b/src/Api.php index 7d77ad2a4a76714549eaa58d4648dfa8f44edc61..bde2a938b13c6eacc65b6e8620d7b1ca5aea2d1c 100644 --- a/src/Api.php +++ b/src/Api.php @@ -7,6 +7,7 @@ use Drupal\Core\Config\ImmutableConfig; use Drupal\gitlab_api\Entity\GitlabServer; use Gitlab\Client; use Gitlab\ResultPager; +use Http\Client\Exception; /** * GitLab API wrapper class. @@ -25,9 +26,9 @@ class Api { /** * The GitLab client. * - * @var \Gitlab\Client + * @var \Gitlab\Client|null */ - protected Client $client; + protected ?Client $client; /** * The GitLab server entity. @@ -53,17 +54,18 @@ class Api { if (!isset($this->server)) { $this->switchServer(); } - if (!isset($this->client)) { - $this->client = Client::createWithHttpClient(); - - $this->client = Client::create($this->server->getUrl()); - $this->client->authenticate($this->server->getAuthToken(), Client::AUTH_URL_TOKEN); + if ($this->client === NULL) { + $client = new Client(); + $client->setUrl($this->server->getUrl()); + $client->authenticate($this->server->getAuthToken(), Client::AUTH_HTTP_TOKEN); } } /** * Allow to switch between gitlab server. - * @param string $server_id + * + * @param string|null $server_id + * The GitLab server config entity ID. */ public function switchServer(string $server_id = NULL): void { if ($server_id && $server = GitlabServer::load($server_id)) { @@ -76,18 +78,24 @@ class Api { } /** + * Creates a new GitLab project. + * * @param string $namespace + * The namespace. * @param string $path + * The path. * @param string $name + * The name. * * @return array + * The created project. */ - public function createProject($namespace, $path, $name): array { + public function createProject(string $namespace, string $path, string $name): array { $this->init(); $gitlab_namespace = $this->client->namespaces()->show($namespace); if (!$gitlab_namespace) { - throw new InvalidArgumentException('Invalid namespace'); + throw new \InvalidArgumentException('Invalid namespace'); } return $this->client->projects()->create($name, [ @@ -97,124 +105,209 @@ class Api { } /** - * @param int|string $project_id + * Triggers a GitLab pipeline. + * + * @param int $project_id + * The project ID. * @param string $commit_ref - * @param array|null $variables + * The commit reference. + * @param array $variables + * Optional extra variables. * * @return array + * The created pipeline. */ - public function createPipeline($project_id, $commit_ref, $variables = null): array { + public function createPipeline(int $project_id, string $commit_ref, array $variables = []): array { $this->init(); - return $this->client->projects()->createPipeline($project_id, $commit_ref, $variables); + return $this->client->projects() + ->createPipeline($project_id, $commit_ref, $variables); } /** + * Create an issue. + * * @param int $project_id - * @param array $additionalParams + * The project ID. + * @param string $title + * The issue title. + * @param string $body + * The issue body text. + * @param int[] $assignee_ids + * The list of user ids of assignees. + * @param \DateTime|null $due_date + * The due date. + * @param array $labels + * The issue labels. * * @return array - * @throws \Http\Client\Exception + * The issue. */ - public function listPipelines(int $project_id, $additionalParams = []): array { + public function createIssue(int $project_id, string $title, string $body, array $assignee_ids = [], \DateTime $due_date = NULL, array $labels = []): array { $this->init(); - $pager = new ResultPager($this->client); + $params = [ + 'title' => $title, + 'description' => $body, + 'assignee_ids' => $assignee_ids, + ]; + if ($due_date) { + $params['due_date'] = $due_date->format('Y-m-d'); + } + if ($labels && count($labels) > 0) { + $params['labels'] = implode(',', $labels); + } - $params = []; - $params += $additionalParams; - return $pager->fetchAll($this->client->projects(), 'pipelines', [$project_id, $params]); + return $this->client->issues()->create($project_id, $params); } - /** - * @param int|string $project_id - * @param int $pipeline_id + * Gets a list of namespaces. * - * @return mixed + * @return array + * The list of namespaces. */ - public function getPipeline($project_id, $pipeline_id): array { + public function namespaces(): array { $this->init(); - return $this->client->projects()->pipeline($project_id, $pipeline_id); + return $this->client->namespaces()->all(); } /** - * @param int|string $project_id - * @param int $pipeline_id + * Gets a list of projects. + * + * @param bool $simple + * If TRUE, only limited number of fields for each projects get returned. + * @param bool $includeArchived + * If TRUE, also archived projects will be returned. + * @param array $additionalParams + * Optional extra arguments. * - * @return mixed + * @return array + * The list of projects. */ - public function getPipelineJobs($project_id, $pipeline_id): array { + public function projects(bool $simple = TRUE, bool $includeArchived = FALSE, array $additionalParams = []): array { $this->init(); - return $this->client->jobs()->pipelineJobs($project_id, $pipeline_id); + $pager = new ResultPager($this->client); + $params = [ + 'simple' => $simple, + 'archived' => FALSE, + ]; + if ($includeArchived) { + unset($params['archived']); + } + $params += $additionalParams; + try { + return $pager->fetchAll($this->client->projects(), 'all', [$params]); + } + catch (Exception $e) { + return []; + } } /** - * @param int|string $project_id - * @param int $job_id + * Gets a project. * - * @return mixed + * @param int $project_id + * The project ID. + * + * @return array + * The project. */ - public function getPipelineJob($project_id, $job_id): array { + public function project(int $project_id): array { $this->init(); - return $this->client->jobs()->show($project_id, $job_id); + return $this->client->projects()->show($project_id); } /** - * @param int|string $project_id + * Gets a list of project pipelines. * - * @return mixed + * @param int $project_id + * The project ID. + * @param array $additionalParams + * Optional extra arguments. + * + * @return array + * The list of project pipelines. */ - public function listBranches($project_id): array { + public function pipelines(int $project_id, array $additionalParams = []): array { $this->init(); - return $this->client->repositories->branches($project_id); + $pager = new ResultPager($this->client); + + $params = []; + $params += $additionalParams; + try { + return $pager->fetchAll($this->client->projects(), 'pipelines', [ + $project_id, + $params, + ]); + } + catch (Exception $e) { + return []; + } } /** - * @param int|string $project_id - * @param string $branch - * @return mixed + * Get a project pipeline. + * + * @param int $project_id + * The project ID. + * @param int $pipeline_id + * The pipeline ID. + * + * @return array + * The project pipeline. */ - public function listBranch($project_id, string $branch): array { + public function pipeline(int $project_id, int $pipeline_id): array { $this->init(); - return $this->client->repositories->branch($project_id); + return $this->client->projects()->pipeline($project_id, $pipeline_id); } /** + * Get the jobs of a pipeline. + * * @param int $project_id - * @param string $title - * @param string $body - * @param array $assignee_ids - * @param DateTime|null $due_date - * @param array $labels + * The project ID. + * @param int $pipeline_id + * The pipeline ID. * * @return array + * The list of pipeline jobs. */ - public function createIssue(int $project_id, string $title, string $body, $assignee_ids = [], DateTime $due_date = NULL, array $labels = []): array { + public function jobs(int $project_id, int $pipeline_id): array { $this->init(); - $params = [ - 'title' => $title, - 'description' => $body, - 'assignee_ids' => $assignee_ids, - ]; - if ($due_date) { - $params['due_date'] = $due_date->format('Y-m-d'); - } - if ($labels && count($labels) > 0) { - $params['labels'] = implode(',', $labels); - } + return $this->client->jobs()->pipelineJobs($project_id, $pipeline_id); + } - return $this->client->issues->create($project_id, $params); + /** + * Get a project's pipeline job. + * + * @param int $project_id + * The project ID. + * @param int $job_id + * The job ID. + * + * @return array + * The job. + */ + public function job(int $project_id, int $job_id): array { + $this->init(); + return $this->client->jobs()->show($project_id, $job_id); } /** + * Gets a list of project issues. + * * @param int $project_id + * The project ID. * @param string|null $state + * The state of issues to retrieve, can be "opened" or "closed". * @param int|null $assignee_id + * The assignee ID. * @param array $additionalParams + * Optional extra arguments. * * @return array - * @throws \Http\Client\Exception + * The list of project issues. */ - public function listIssues(int $project_id, string $state = NULL, int $assignee_id = NULL, $additionalParams = []): array { + public function issues(int $project_id, string $state = NULL, int $assignee_id = NULL, array $additionalParams = []): array { $this->init(); $pager = new ResultPager($this->client); $params = []; @@ -225,77 +318,86 @@ class Api { $params['assignee_id'] = $assignee_id; } $params += $additionalParams; - return $pager->fetchAll($this->client->issues(), 'all', [$project_id, $params]); + try { + return $pager->fetchAll($this->client->issues(), 'all', [ + $project_id, + $params, + ]); + } + catch (Exception $e) { + return []; + } } /** - * Return an issue by it's project and id. + * Gets a project issue. + * * @param int $project_id + * The project ID. * @param int $issue_iid + * The issue ID. * - * @return mixed - */ - public function showIssue(int $project_id, int $issue_iid) { - $this->init(); - return $this->client->issues()->show($project_id, $issue_iid); - } - - /** - * Returns all namespaces on the server * @return array + * The issue. */ - public function listNamespaces() : array{ + public function issue(int $project_id, int $issue_iid): array { $this->init(); - return $this->client->namespaces()->all(); + return $this->client->issues()->show($project_id, $issue_iid); } /** - * Returns all projects on the server + * Gets a list of issue links. * - * @param bool $simple - * @param bool $includeArchived - * @param array $additionalParams + * @param int $project_id + * The project ID. + * @param int $issue_iid + * The issue ID. * * @return array - * @throws \Http\Client\Exception + * The issue links. */ - public function listProjects(bool $simple = TRUE, $includeArchived = FALSE, $additionalParams = []) : array { + public function issueLinks(int $project_id, int $issue_iid): array { $this->init(); $pager = new ResultPager($this->client); - $params = [ - 'simple' => $simple, - 'archived' => FALSE, - ]; - if ($includeArchived) { - unset($params['archived']); + try { + return $pager->fetchAll($this->client->issueLinks(), 'all', [ + $project_id, + $issue_iid, + ]); + } + catch (Exception $e) { + return []; } - $params += $additionalParams; - return $pager->fetchAll($this->client->projects(), 'all', [$params]); } /** - * Returns information about a given project. + * Get a list of project branches. * - * @param $project_id + * @param int $project_id + * The project ID. * * @return array + * The list of branches. */ - public function showProject($project_id) : array { + public function branches(int $project_id): array { $this->init(); - return $this->client->projects->show($project_id); + return $this->client->repositories()->branches($project_id); } /** + * Get a project branch. + * * @param int $project_id - * @param int $issue_iid + * The project ID. + * @param string $branch + * The branch. * * @return array - * @throws \Http\Client\Exception + * The branch. */ - public function listIssueLinks(int $project_id, int $issue_iid): array { + public function branch(int $project_id, string $branch): array { $this->init(); - $pager = new ResultPager($this->client); - return $pager->fetchAll($this->client->issueLinks(), 'all', [$project_id, $issue_iid]); + return $this->client->repositories()->branch($project_id, $branch); } }