Tech

GraphQL手習い

GraphQL何もわからない…初めてなので優しくしてほしい。

require 'graphql/client'
require 'graphql/client/http'
module ZenhubDone
  ACCESS_TOKEN = ENV['GITHUB_FOR_ZENHUB_TOKEN']
  ENDPOINT = 'https://api.github.com/graphql'
  http = GraphQL::Client::HTTP.new(ENDPOINT) do
    def headers(context)
      { "Authorization" => "Bearer #{ACCESS_TOKEN}"}
    end
  end
  schema = GraphQL::Client.load_schema(http)
  client = GraphQL::Client.new(schema: schema, execute: http)
  Query = client.parse <<-GraphQL
    query {
      viewer {
        login
      }
    }
  GraphQL
  response = client.query(Query)
  # => #<GraphQL::Client::Response:0x00007fd6dad6e5a8
  # @data=#< viewer=...>,
  # @errors=#<GraphQL::Client::Errors @messages={} @details={}>,
  # @extensions=nil,
  # @original_hash={"data"=>{"viewer"=>{"login"=>"katsumata-ryo"}}}>
end

なんか、何かが取れたっぽいんだけど全然わからない。

とりあえず動いたからなんとなくこれからドキュメント読んでいけばわかりやすくなりそう。RESTと比べると宣言的な感じがする(感じがするだけでなにもわからない)。

GithubのAPIドキュメントみながら試行錯誤してるけど、なんかちょっとずつ見えてきたぞ

# マイルストーン内のIssueをとってくる
  Query = client.parse <<-GraphQL
    query {
      repository(name: "XXXX", owner: "XXXXX") {
        milestones(last: 1) {
          nodes {
            id
            title
            issues(first: 100) {
              nodes {
                id
                number
                title
                closed
              }
            }
            pullRequests(first: 100) {
              nodes {
                id
                number
                title
                closed
              }
            }
          }
          totalCount
        }
      }
    }
  GraphQL
  response = client.query(Query)
  # => #<GraphQL::Client::Response:0x00007fd69a8a1448
  # @data=#< repository=...>,
  # @errors=#<GraphQL::Client::Errors @messages={} @details={}>,
  # @extensions=nil,
  # @original_hash=
  # {"data"=>
  # {"repository"=>
  # {"milestones"=>
  # {"nodes"=>
  # [{"id"=>"XXXX",
  # "title"=>"XXXXX",
  # "issues"=>
  # {"nodes"=>
  # [{"id"=>"xxxxxxx",
  # "number"=>0000,
  # "title"=>"XXXXX",
  # "closed"=>false},
  #
  # "pullRequests"=>{"nodes"=>[]}}],
  # "totalCount"=>000}}}}>

Node・Connection とかの概念が体に染み渡るともっとシュッとかけそうな気がする。それにしても宣言的、型みたいだ。

取りたい内容はなんとなく取れてきた。

一通り取れそうな感じになったらドキュメント読んでみよう。