Octokitを使用してGithubのIssueを取得・追加する

## はじめに 
本記事は、GitHub APIとのやり取りを簡単にするためのライブラリであるOctokitを使用して得た知見をまとめることを目的としています。

## 事前準備
はじめに、GitHubにアクセスするためのトークンが必要なので作成します。
詳しいやり方は[こちら](https://qiita.com/kz800/items/497ec70bff3e555dacd0)がわかりやすいので参考にしてください。
なお、GitHubで作成したトークンは忘れてしまうと後で見ることができないので、使用するまではどこかに控えておいた方がいいです。
続いて、OctokitをNugetパッケージからインストールします。インストール先のプロジェクトをVisualStudio上で右クリックして、[NuGetパッケージの管理]をクリックします。参照タブを選択して[Octokit]と検索ボックスに入力すると先頭に出るので、画面右側のインストールボタンを押してインストールします。
![2020-06-30_11h43_52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562946/11e41d8f-4860-0274-4097-c8c744edc179.png)


## GitHub Issueを取得・追加してみる
準備ができました。以下がGitHub Issueの取得・追加している実際のコードです。たった数行書くだけで簡単にできてしまいます。

```csharp
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Octokit;

namespace DensoCreate.Lakewood.Extensions.GitHubIntegration.Services
{
    /// <summary>
	/// GitHub Issueを取得・追加するために必要なサービスを提供するクラス
	/// </summary>
	public class GithubService
	{
		/// <summary>
		/// Github Issueを取得する
		/// </summary>
		/// <param name="settings">GitHubにアクセスするためのトークン、
        /// Issueを取得するリポジトリを指定するための情報(リポジトリのオーナー名とリポジトリ名)</param>
        /// <returns>GitHub Issueのリスト</returns>
		public async Task<List<Issue>> GetIssues(GitHubExtensionSettings settings)
        {
	        // 接続情報の設定
	        var tokenAuth = new Credentials(settings.Token);
	        var client = new GitHubClient(new ProductHeaderValue("lr")) {Credentials = tokenAuth};

            // GitHub Issueの取得
	        var gitHubIssues = new List<Issue>();
		    var issuesAsync = await client.Issue.GetAllForRepository(settings.Owner, settings.Repository);
		    gitHubIssues = issuesAsync.ToList();

            return gitHubIssues
        }

        /// <summary>
		/// Github IssueにIssueを追加する
		/// </summary>
		/// <param name="settings">GitHubにアクセスするためのトークン、
        /// Issueを取得するリポジトリを指定するための情報(リポジトリのオーナー名とリポジトリ名)</param>
        /// <param name="issueTitle">Issueのタイトル</param>
        /// <param name="issueBody">Issueの本文</param>
		/// <returns></returns>
		public async Task AddIssue(GitHubExtensionSettings settings, string issueTitle, string issueBody)
		{
            // 接続情報の設定
			var tokenAuth = new Credentials(settings.Token);
			var client = new GitHubClient(new ProductHeaderValue(settings.Owner)) {Credentials = tokenAuth};

		    // Issueを作成し、本文を設定
			var createIssue = new NewIssue(issueTitle);
			createIssue.Body = issueBody;
	
			// Issueを追加
			var newIssue = await client.Issue.Create(settings.Owner, settings.Repository, createIssue);
		}
    }
}


```

順番に解説したいと思います。

GitHubにアクセスするにはOctokitのGitHubClientのオブジェクトを作成する必要があります。GitHubClientのコンストラクタ引数にアプリケーション名を入れたProductHeaderValueオブジェクトを渡すことでGitHubへの接続が可能になります。
ただし、プライベートリポジトリへのアクセスやIssueの追加などをする場合にはユーザー認証が必要になるので、GitHubClientオブジェクトに認証情報(OctokitのCredentialsオブジェクト)を渡してやる必要があります。

```csharp

 // 接続情報の設定
 var tokenAuth = new Credentials(settings.Token);
 var client = new GitHubClient(new ProductHeaderValue("lr")) {Credentials = tokenAuth};

```

以上で、GitHub Issueへのアクセスが可能になりました。
続いて、GitHub Issueの取得について説明します。
Octokitのデータ取得、追加、更新の各メソッドは全て非同期になっているので、それを前提にコード書く必要があります。

GitHubClientオブジェクトのIssueのGetAllForRepositoryメソッドで引数にリポジトリのオーナーとリポジトリ名を指定することで、すべてのIssueを取得することができます。

```csharp
// GitHub Issueの取得
var gitHubIssues = new List<Issue>();
var issuesAsync = await client.Issue.GetAllForRepository(settings.Owner, settings.Repository);
gitHubIssues = issuesAsync.ToList();

```

また、 RepositoryIssueRequestオブジェクトをGetAllForRepositoryメソッドの引数に指定することで取得するIssueにフィルタをかけることもできます。以下の例はOpenなIssueかつ特定のユーザーが Assignee に指定されているものを取得しています。

```csharp
 // GitHub Issueの取得
var gitHubIssues = new List<Issue>();
var assigneeFilter = new RepositoryIssueRequest { State = ItemState.Open, Assignee = username };
var issuesAsync = await client.Issue.GetAllForRepository(settings.Owner, settings.Repository, assigneeFilter);
gitHubIssues = issuesAsync.ToList();

```

最後に、GitHub Issueへの追加について説明します。
NewIssueオブジェクトのコンストラクタ引数にタイトル、Bodyに本文を設定することができます。なお、タイトルは必ず設定する必要があります。他にもAssignee、MileStoneやLabelを設定できます。ただし、MileStoneとLabelに関しては、あらかじめリポジトリ内に存在する必要があります。
GitHubClientオブジェクトのIssueのCreateメソッドにリポジトリのオーナー名、リポジトリ名、NewIssueオブジェクトを渡すことでIssueを追加できます。

```csharp
// Issueを作成し、本文を設定
var createIssue = new NewIssue(issueTitle);
createIssue.Body = issueBody;
	
// Issueを追加
var newIssue = await client.Issue.Create(settings.Owner, settings.Repository, createIssue);

```

## さいごに
今回はIssueの取得・追加を簡単にまとめてみました。すごく簡単にGitHubへアクセスできるので、興味のある方は是非お試しください。Githubへのコミットなどまだまだできることはありますので、色々試してみてください！

## 参考サイト
https://github.com/octokit/octokit.net
https://octokitnet.readthedocs.io/en/latest/issues/