完全にただのメモです。以前の続きっぽいやつです。

なんで?


以前書いた通り「もっと細かい自分のGitHubのアクティビティを取得・集計したい」というのが動機です。そのためのアプリを開発していたのですが、テーブル設計からやり直しせざるを得なくなり、加えてv3のAPIでは目的のデータを取得するには複数回APIを叩かなければならないなど、完全にやる気が消滅する案件が発生したり、その他風邪ひいたり珍しく残業が続いたりでモチベーションが上がらず、いつも通り作りかけで頓挫してしまっていました。

GraphQLがあるやん


「せや、GraphQLがあるやん。GraphQLならなんとかできるのでは…?」と思ったんですね。もっと簡単に必要なデータだけ取得してデコードも簡単なのでは…?v3のAPIだと返ってきたJSONがゴテゴテしすぎてて必要なデータを見つけるのもツライ。トラバースするのも手間。これがなんとかなるのかもしれない…と思いました。

GitHub API v4


こういうのはとりあえずGraphQLの仕様がどうことかそういうのは置いておいたらいいと思うんですよね。とりあえず実際に叩いて見ればいいんですよ。というわけで、ドキュメントとExplorer(IDE)でGitHubAPI v4を試します。

書くまでもないですが、Explorer(IDE)は実際のGitHubのデータを使うので作成・更新・削除する場合は(今回は取得しかしませんが)自分のリポジトリでやりましょう。

とりあえず叩いてみる


以下、とりあえずこんなことできるかな?と試して叩いて見たものリストとその結果。ダラダラと長いのでこんなのができるくらいをオーラで感じていただければと思います。どういったデータが取得できるかは前述のドキュメント見てください。だいたいなんでも取得できそうです。

コメントしたもの最新3件を取得する

投げたクエリ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
query {
user(login:"YoshinoriN") {
issueComments(last:3){
edges {
node {
databaseId,
issue {
title,
number,
url
}
repository {
owner {
login
}
name,
url
}
createdAt
}
}
}
}
}

結果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
{
"data": {
"user": {
"issueComments": {
"edges": [
{
"node": {
"databaseId": 495632028,
"issue": {
"title": "feat: add 'hexo-blog-client' app",
"number": 1067,
"url": "https://github.com/electron/apps/pull/1067"
},
"repository": {
"owner": {
"login": "electron"
},
"name": "apps",
"url": "https://github.com/electron/apps"
},
"createdAt": "2019-05-24T13:37:49Z"
}
},
{
"node": {
"databaseId": 495646087,
"issue": {
"title": "markdown table with a indentation displays unsuccessfully on website.",
"number": 3560,
"url": "https://github.com/hexojs/hexo/issues/3560"
},
"repository": {
"owner": {
"login": "hexojs"
},
"name": "hexo",
"url": "https://github.com/hexojs/hexo"
},
"createdAt": "2019-05-24T14:09:58Z"
}
},
...
]
}
}
}
}

2019年5月20以降で自分が関与したIssueもしくはPullRequestのうち最新3件

投げたクエリ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
query {
search(query: "involves:YoshinoriN created:>=2019-05-20", type: ISSUE, first: 3) {
issueCount
edges {
node {
... on Issue {
title,
url,
state,
createdAt,
repository {
name,
url,
owner {
login
}
},
}
... on PullRequest {
title,
url,
state,
createdAt,
repository {
name,
url,
owner {
login
}
},
}
}
}
}
}

結果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
{
"data": {
"search": {
"issueCount": 12,
"edges": [
{
"node": {
"title": "Cleanup and update dependencies",
"url": "https://github.com/hexojs/hexo-front-matter/pull/14",
"state": "OPEN",
"createdAt": "2019-05-26T06:33:54Z",
"repository": {
"name": "hexo-front-matter",
"url": "https://github.com/hexojs/hexo-front-matter",
"owner": {
"login": "hexojs"
}
}
}
},
{
"node": {
"title": "updating ISSUE_TEMPLATE.md",
"url": "https://github.com/hexojs/hexo/pull/3562",
"state": "MERGED",
"createdAt": "2019-05-24T18:59:50Z",
"repository": {
"name": "hexo",
"url": "https://github.com/hexojs/hexo",
"owner": {
"login": "hexojs"
}
}
}
},
{
"node": {
"title": "markdown table with a indentation displays unsuccessfully on website.",
"url": "https://github.com/hexojs/hexo/issues/3560",
"state": "OPEN",
"createdAt": "2019-05-24T05:12:34Z",
"repository": {
"name": "hexo",
"url": "https://github.com/hexojs/hexo",
"owner": {
"login": "hexojs"
}
}
}
}
]
}
}
}

自分がレビューしたもののうち最新3件

投げたクエリ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
query {
search(query: "reviewed-by:YoshinoriN", type: ISSUE, first: 3) {
issueCount
edges {
node {
... on PullRequest {
title,
url,
state,
repository {
name,
owner {
login
}
},
}
}
}
}
}

結果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
{
"data": {
"search": {
"issueCount": 147,
"edges": [
{
"node": {
"title": "updating ISSUE_TEMPLATE.md",
"url": "https://github.com/hexojs/hexo/pull/3562",
"state": "MERGED",
"repository": {
"name": "hexo",
"owner": {
"login": "hexojs"
}
}
}
},
{
"node": {
"title": "Refactor(es2015)",
"url": "https://github.com/hexojs/hexo-renderer-marked/pull/97",
"state": "MERGED",
"repository": {
"name": "hexo-renderer-marked",
"owner": {
"login": "hexojs"
}
}
}
},
{
"node": {
"title": "Bump resolve from 1.10.1 to 1.11.0",
"url": "https://github.com/hexojs/hexo-cli/pull/68",
"state": "MERGED",
"repository": {
"name": "hexo-cli",
"owner": {
"login": "hexojs"
}
}
}
}
]
}
}
}

感想


IDEはエラーの表記がされていても実際には問題なく動作するケース等もあるものの、補完が効くし使いやすいです。こういったすぐに試すことができる環境があるのは非常にありがたいですね。

また、上の実行結果のとおり、必要な値だけ取得できるのでイイですね。これはイイ。以前は返ってくるJSONがバラバラな上にキーが大量にあったのでそれぞれのイベントに応じたcase classも大量に作成しなければならず大変厳しかったのですが、ある程度共通化できそうです。これでcirceでごちゃごちゃとトラバースしなくてもセミオートでデコードできそうです。

あっ、これ最初からv4使っておけばよかったのでは?案件ですね。

う~ん、頑張れば2週間くらいでサーバサイドはできるんじゃないかという気がしてきました。とりあえず、取得する項目を再度決めて、今のリポジトリを放棄して新しくやるかそれとも今のリポジトリの延長でやるかといったところの判断からでしょうか。そもそもやる気が出るかどうかが最も難しいところなんですが…