こういう問い合わせを受けたわけですが、できるんですよ。そうRedmine APIならね。

背景


主に並び順的問題でグループ名にプレフィックス(AAAとかBBBとかで想像していただければ)を付けて運用しています。これらの中で特定のプレフィックスのグループのユーザ一覧を知りたい(一度だけでよい)という要望を受けました。ただし、グループの一覧ユーザは管理画面でしか確認できず、かつ、そのプレフィックスが付いているグループが結構な数存在したので、APIでシャシャッと取得することにしました。

環境


以下の環境で試しました。

  • Redmine 3.4
  • Node.js 8.11

言語はシャシャッと動かせるNode.jsにしました。Node.jsのAPIのみで完結するようにしました。

コード


ザックリ書くと下記のような感じじゃないかと思います。

1
'use strict';
2
3
function getRequest(url) {
4
  const https = require('https'); // Node.jsのhttps API
5
  // const http = require('http'); httpの場合はhttpのAPIにすること
6
7
  return new Promise((resolve, reject) => {
8
    https.get(url, (response) => {
9
      if (response.statusCode === 200) {
10
        resolve(response);
11
      } else {
12
        reject(response);
13
      }
14
    }).on("error", (error) => {
15
      reject(error);
16
    });
17
  });
18
}
19
20
// シャシャッとできるようにベーシック認証にした。管理者権限のユーザが必要
21
const BASE_URL = "https://userName:password@example.com"
22
23
getRequest(`${BASE_URL}/groups.json?include=users`).then((response) => {
24
25
  response.setEncoding('utf8');
26
  response.on('data', (body) => {
27
    const json = JSON.parse(body);
28
29
    json['groups']
30
      // filterで絞り込みたい条件書く。この場合はAAAで始まるグループで指定。
31
      .filter(group => group.name.startsWith('AAA'))
32
      .forEach((group) => {
33
        getRequest(`${BASE_URL}/groups/${group.id}.json?include=users`).then((response) => {
34
          response.setEncoding('utf8');
35
          response.on('data', (body) => {
36
            const json = JSON.parse(body);
37
            json['group']['users'].forEach((user) => {
38
              console.log(`${group.name}: ${user.name}`);
39
            });
40
          });
41
        }).catch((error) => {
42
          console.log(error);
43
        });
44
      });
45
  });
46
47
}).catch((error) => {
48
  console.log(error);
49
});

これをindex.jsとかなんか適当な名前で保存して実行します。

1
$ node index.js
2
3
AAA部: 田中太郎
4
AAA部: YoshinoriN
5
AAABB部: 保気保気田
6
...

そうすると上記のような感じでAAAから始まるグループ名のユーザが表示されます。

感想


やっぱりJavaScriptでJSONほげほげするの楽ですね。やった後にSQLでよかったのではないかと思いましたが。