GitHub の GraphQL API を使ってみる

GitHub に API アクセスしたかったので、使い方を調べたまとめ

## GitHub API

GitHub の API には、REST API と GraphQL API がある

* REST API (V3)　https://docs.github.com/ja/free-pro-team@latest/rest
* GraphQL API (V4)　https://docs.github.com/ja/free-pro-team@latest/graphql

以下では、GraphQL を使っていくことにする

## 試した環境

* GitHub アカウント
  * 登録しておく
* Insomnia
  * API クライアントソフトとして Insomnia を使う
  * Postman 等の他のクライアントソフトでもいい

## 準備

### アクセストークンを取得する

 [Creating a personal access token - GitHub Docs](https://docs.github.com/en/free-pro-team@latest/github/authenticating-to-github/creating-a-personal-access-token) に従ってトークンを取得する

1.  登録しているメールアドレスを検証する

2.  GitHub にログインし、ページ右上のメニューから [Settings] をクリックする
    ![20201123_graphql_001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/871926/a5dd1f59-e57c-9ca8-877e-1bdde4b6f76e.png)

3.  左側のメニューから、[Developer settings] をクリック
    ![20201123_graphql_002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/871926/8753afc3-a456-5bb5-6407-e2863bf7a909.png)

4.  左側のメニューから、[Personal access tokens] をクリック
    ![20201123_graphql_003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/871926/4044c49e-f528-8a52-d8d8-c76c6667f6f9.png)

5.  [Generate new token] をクリック

6.  Note にトークンの説明を記述

7.  Select scopes で以下の項目をチェックする（後から変更も可能）
    * repo
    * user
    * admin:org > read:org
    * admin:public_key > read:public_key
    * admin:repo_hook > read:repo_hook
    * admin:gpg_key > read:gpg_key

8.  [Generate token] をクリック

9.  生成されたトークンを記録しておく（再表示はできないので、確実に保存しておく）
    ![20201123_graphql_006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/871926/878c4a54-65d7-5123-41f3-2c49de29d471.png)

10. organizations がシングルサインオンを設定している場合は、[Enable SSO] を開いて、対象リポジトリを [Authorise] する
    ![20201123_graphql_021.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/871926/c7babf3f-889e-32d9-ca19-b035adb3f237.png)


### GraphQL API を投げてみる

1. Insomnia を起動する 

2. New Request で新しいリクエストを作る
    ![20201123_graphql_007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/871926/4df782f1-1685-d63d-86ea-95c6de883bf2.png)

3. エンドポイントに以下を入力

    ```
    https://api.github.com/graphql
    ```

4. Auth タブをクリックし [Basic Auth] を選択し、下記のように入力
   * USERNAME ： GitHub のアカウント名を入力
   * PASSWORD ： 先ほど生成したトークンを入力

5.  Body タブをクリックし、[GraphQL Query] を選択し、下記のように入力

    ```
    query{
      user(login: "ログインユーザー名"){
        login
        name
      }
    }
    ```

6.  [Send] をクリック

7.  うまくいっていれば JSON 形式のレスポンスが返ってくる

    ```json
    {
      "data": {
        "user": {
          "login": "ログインユーザー名",
          "name": "指定していた名前"
        }
      }
    }
    ```

![20201123_graphql_008.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/871926/fa9a8f27-5803-44d6-ff6e-887198940db5.png)


### スキーマを確認する

スキーマの定義を確認することができる

* Insomnia の [schema] をクリックし、[Show Documentation] をクリックする
![20201123_graphql_021.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/871926/b3c3749f-c222-28c8-95b5-c2e3a9d41112.png)

* ウィンドウの右側にスキーマ定義が表示される
![20201123_graphql_022.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/871926/0cd09a0f-8ba8-8fad-c1f2-9032df35ab9d.png)



## クエリ

何種類かクエリー、ミューテーションを試してみる

### リポジトリを取得

* ユーザ名（もしくは組織名）、リポジトリ名 でリポジトリを取得

![20201123_graphql_011.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/871926/1b7ea193-561d-aec0-9e59-c82417dd660e.png)

### エイリアス＆フラグメントを使ってユーザを取得

![20201123_graphql_013.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/871926/0b2de70f-cf04-4839-69e7-b5c369553ce9.png)

### プルリクエストを取得

![20201123_graphql_018.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/871926/918ffb7d-83af-8160-9cc9-09f0bf38b57d.png)

### 文字列でリポジトリを検索

* Variables の query に与えた文字列で検索する

![20201123_graphql_015.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/871926/e41e262d-953e-3ce1-c720-aee19f4de21e.png)


## ミューテーション

### スターを付ける

* `starrableId` は、repository クエリーで入手できる `id` を指定する

![20201123_graphql_014.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/871926/32e5d39b-dcab-a8d6-5801-85908791261c.png)

### プルリクを Approve する

* `pullRequests` で取得した `id` で指定する

![20201123_graphql_019.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/871926/a01eb523-7782-0f17-4c98-9f830f27550d.png)


### プルリクをマージする

* `pullRequests` で取得した `id` で指定する

![20201123_graphql_020.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/871926/450ff3a7-dc3b-a4b3-2f91-835c9325b000.png)