JavaScript で GitHub の Notifications をアレするアプリを作りたいと思ってやってみました。
JavaScript はあまり得意ではないので、本当は素敵なライブラリとか使ってもっといい感じにできるんじゃないか、と思って突っ込み待ちの感じで書いてみます。
やりたいこと
- GitHub の Notifications をいい感じに閲覧するためのアプリを JavaScript で書く
- 必要に応じて Electron とかでもいいが、できれば GitHub Pages 上で済ませたい
- とりあえず自分の Notifications を全部取って来たい
- 最終的にはフィルタしたりソートしたりした上でレンダリングする
使用ライブラリの選定
結論としては npm の github-api というのを使ってみました。
ブラウザ・Node.js の両方で動きます。
ただ、Notifications の取得時にパラメータの指定ができないことがわかったので、プルリクを送って見てるところです。
package.json は以下のように指定します。
{
"dependencies": {
"github-api": "yuya-takeyama/github#options_for_notifications_api"
}
}
最初は octokat というのを試してみましたが Notifications についての説明がドキュメント上に無く、ソースコードも何やら高尚な感じでよくわからなかったので諦めました。
実装
アクセストークンはこの辺から取得してください。
Node.js でも動きますし Browserify とかすればブラウザでも動きます。
ここでは参加している Issue/Pull Request の Notifications のみを全て取得し、タイトルを console.log()
していってます。
var Github = require('github-api');
var github = new Github({
token: YOUR_ACCESS_TOKEN,
auth: 'oauth'
});
var fetchNotifications = function(options, cb) {
options = options || {};
github.getUser().notifications(options, function(err, notifications) {
var lastUpdatedAt;
notifications.forEach(function(n) {
lastUpdatedAt = n.updated_at;
});
if (!err && notifications.length >= 50) {
options.before = lastUpdatedAt;
fetchNotifications(options, cb);
}
cb(err, notifications);
});
};
fetchNotifications({participating: true}, function(err, notifications) {
if (err) {
throw err;
}
notifications.forEach(function(n) {
console.log(n.subject.title);
});
});
fetchNotifications()
という関数を実装し、再帰的に呼び出しています。
その際、 before
パラメータでどんどん古いものにさかのぼるようにしています。
page
パラメータを使った場合、読み込み中に Issue に更新があったりすると重複や漏れが起こる可能性があるので、このようにしています。
とはいえこれも秒単位で同時に更新された Issue/Pull Request があると問題にはなり得るのを無視した実装です。
件数を見ても GitHub 上の Notifications のページと一致するのでどうやら問題なさそうです。
実装としてはなんと無くかっこ悪い気がしてるので、もっといいやり方あれば教えてください。