22
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

GitHub の Notifications を全て取得する

Last updated at Posted at 2015-09-06

JavaScript で GitHub の Notifications をアレするアプリを作りたいと思ってやってみました。
JavaScript はあまり得意ではないので、本当は素敵なライブラリとか使ってもっといい感じにできるんじゃないか、と思って突っ込み待ちの感じで書いてみます。

やりたいこと

  • GitHub の Notifications をいい感じに閲覧するためのアプリを JavaScript で書く
  • とりあえず自分の 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 のページと一致するのでどうやら問題なさそうです。
実装としてはなんと無くかっこ悪い気がしてるので、もっといいやり方あれば教えてください。

22
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?