RailsでzenhubAPIを使ってみる
今回は仕事でタスク管理ツールとしてzenhubを使用しているのですが、zenhubが最近GraphqlAPIを公開したので、zenhubのAPIをRailsで使いながら遊んでみようと思います
API Keyを作成する
左下のユーザー名をクリックして、アカウントマネジメントページの移動し、api
タブをクリックすると下記のページに行くのでそこからAPI keyを作成してください
API Keyは外部に公開してはいけないので、API Keyを作成したら、.env
ファイルに入力しましょう
Zenhubのエンドポイントを定数で管理する
zenhubのエンドポイントはhttps://api.zenhub.com/public/graphql
を定数で管理します
定数管理はこちらの記事を参考にしました
module Constants
ZEN_HUB_URL = https://api.zenhub.com/public/graphql
end
issueを取得するためのqueryを確認する
zenhubのgraphqlの使用はExplorerで確認することができます
以下のqueryでissueの情報を取得することができます
query getIssueInfo($repositoryGhId: Int!, $issueNumber: Int!, $workspaceId: ID!) {
issueByInfo(repositoryGhId: $repositoryGhId, issueNumber: $issueNumber) {
id
title
body
}
}
queryを書いてみるとissueを取得するにはrepositoryGhIdが必要なことが分かります。
query getRecentlyViewedWorkspaces{
recentlyViewedWorkspaces {
nodes {
id
repositoriesConnection {
nodes {
id
ghId
}
}
}
}
}
上記のqueryでrepositoryGhIdを取得することができます
必要なqueryが分かったところで実際にRailsでqueryを取得してみましょう
rubyでgraphqlのqueryを取得する
ここからが本題です
RubyでzenhubのAPIを使ってissueを取得するための実装をします
- graphql-clientのgemを追加します
gem 'graphql-client'
- graphql-clientの設定ファイルを実装する
require "graphql/client"
require "graphql/client/http"
module ZenhubApi
HTTP = GraphQL::Client::HTTP.new("https://api.zenhub.com/public/graphql") do
def headers(context)
{ "Authorization": "Bearer " + ENV["ZENHUB_API_KEY"] }
end
end
schema = GraphQL::Client.load_schema("db/schema.json")
Client = GraphQL::Client.new(schema: schema, execute: HTTP)
end
基本はdocument通りに実装していますが、
注意点はdb/schema.json
ファイルの存在です
graphql-clientを使うには、スキーマファイルが必要なのですが、zenhubのdocumentにはschema.jsonファイルは見つけられません
そこで、自分でzenhub apiのschema.json
ファイルを作る必要があります。
上記の記事を参考にschema.json
ファイルを作成しましょう
npm install -g get-graphql-schema
get-graphql-schema -j -h 'Authorization=Bearer <先程作成したAPI KEY>' https://api.zenhub.com/public/graphql > schema.json
こちらのコマンドを実行するとschema.json
ファイルを作成することができます
- routesを設定します
resources :issues, only: [:show]
- showメソッドを実装する
class ApplicationController < ActionController::API
include ZenhubApi
end
class V1::IssuesController < ApplicationController
def show
workspace = ZenhubApi::Client.query(RecentlyViewedWorkspacesQuery)
ghId = workspace.to_h["data"]["recentlyViewedWorkspaces"]["nodes"][0]["repositoriesConnection"]["nodes"][0]["ghId"]
issueInfo = ZenhubApi::Client.query(IssueInfoQuery, variables: { repositoryGhId: ghId, issueNumber: 1659 })
render json: issueInfo.to_h
end
private
RecentlyViewedWorkspacesQuery = ZenhubApi::Client.parse <<~'GRAPHQL'
query {
recentlyViewedWorkspaces {
nodes {
id
name
repositoriesConnection {
nodes {
id
ghId
name
}
}
}
}
}
GRAPHQL
IssueInfoQuery = ZenhubApi::Client.parse <<~'GRAPHQL'
query($repositoryGhId: Int!, $issueNumber: Int!) {
issueByInfo(repositoryGhId: $repositoryGhId, issueNumber: $issueNumber) {
id
title
body
}
}
GRAPHQL
end
これでissue情報を取得することができるはずです
今回はzenhubのAPIを使ってissue情報を取得するための方法を詳解しました。
graphql-client
をRailsで使うことや、schema.jsonを作ることに対して馴染みがなかったのでつまりましたが、なんとかissue情報を取得することができました。
Discussion