Node.js
lambda
GraphQL

GraphQLに触れてみた

More than 1 year has passed since last update.

この記事は、ヴァル研究所 Advent Calendar 2017の10日目の記事です。

触れようと思ったきっかけ

Github APIがGraphQLを採用したということで存在を知って、東京Node学園祭2017でのGraphQLのセッションでメリットを聞き、さらに興味を持ったため。

GraphQLのメリット

  • 従来のREST APIであれば、複数回リクエストしなければ取得できないような情報を、GraphQLの場合は1回のリクエストで取得でき、通信が低コストで済む。
  • REST APIの場合、リクエストすると提供者側が定義した情報がレスポンスにすべて含まれるが、GraphQLの場合は利用者側が欲しい要素だけを指定でき、必要な情報だけを取得できるため、レスポンスが適切な量になる。

等々、便利な点があるそうです。

今回やってみた内容

  • GitHub上でマージされていない(Open)状態のプルリクエストをAPIで取得。
  • 取得した内容をSlack上で通知させてみる。

クエリを作ってみる

最初は全くわからず、どうやって作るのか戸惑いましたが、GitHubのGraphiQL(GraphQLをお試しできるブラウザ上のIDE)で組んでみると、クエリが試しやすく作りやすいです。
(実行前にエラーになるかどうかも判定してくれて大変便利です。)

また、Migrating from RESTというページにv3のAPI(REST API)に対応するGraphQLのクエリが書いてあって理解が進みました。

今回のクエリ

指定したリポジトリの最新10件のプルリクエストの中で、stateが「OPEN」になっているもののプルリクエスト番号を取得するようにしました。

{
  repository(owner: "${owner}", name: "${repo}") {
    pullRequests(last: 10, states:[OPEN]) {
      edges {
        node {
          number
        }
      }
    }
  }
}

(※ ${owner}${repo}となっている部分は実際に参照したいリポジトリのオーナー名・リポジトリ名に適宜変更します。)

上記のクエリを投げると、レスポンスは下記のようなデータが返ってきます。

{
  "data": {
    "repository": {
      "pullRequests": {
        "edges": [
          {
            "node": {
              "number": 14
            }
          },
          {
            "node": {
              "number": 16
            }
          },
          {
            "node": {
              "number": 18
            }
          }
        ]
      }
    }
  }
}

Slackに通知させてみる

とりあえずNode.jsでAWSのLambda関数にしてみました。
(コード自体は下記のGistに置いてみました。)
https://gist.github.com/nakano348/1f927f0cb189de30683b27e019f8f794

GraphQLでのリクエストをする場合は、graphql-requestが便利そうだったので使ってみています。

graphql-sample-slack.png

Lambda関数を実行してみると、地味ですが、上記画像のような通知が飛ばせるようになりました。
(通知メッセージに関しては、プルリクエストへのリンクを合わせて通知するなど、色々メッセージ内容は改修の余地がありますね:thinking:

まとめ

  • 最初はどうやってクエリを作るのか戸惑うものの、GraphiQLで実際に触ってみると理解が捗る。
  • 自分が指定した情報だけ返ってくるのというは、開発中に実際どんなデータが返ってきているのか内容を確認しやすくて便利に感じた。