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

背景


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

環境


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

  • Redmine 3.4
  • Node.js 8.11

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

コード


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

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
'use strict';

function getRequest(url) {
const https = require('https'); // Node.jsのhttps API
// const http = require('http'); httpの場合はhttpのAPIにすること

return new Promise((resolve, reject) => {
https.get(url, (response) => {
if (response.statusCode === 200) {
resolve(response);
} else {
reject(response);
}
}).on("error", (error) => {
reject(error);
});
});
}

// シャシャッとできるようにベーシック認証にした。管理者権限のユーザが必要
const BASE_URL = "https://userName:password@example.com"

getRequest(`${BASE_URL}/groups.json?include=users`).then((response) => {

response.setEncoding('utf8');
response.on('data', (body) => {
const json = JSON.parse(body);

json['groups']
// filterで絞り込みたい条件書く。この場合はAAAで始まるグループで指定。
.filter(group => group.name.startsWith('AAA'))
.forEach((group) => {
getRequest(`${BASE_URL}/groups/${group.id}.json?include=users`).then((response) => {
response.setEncoding('utf8');
response.on('data', (body) => {
const json = JSON.parse(body);
json['group']['users'].forEach((user) => {
console.log(`${group.name}: ${user.name}`);
});
});
}).catch((error) => {
console.log(error);
});
});
});

}).catch((error) => {
console.log(error);
});

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

1
2
3
4
5
6
$ node index.js

AAA部: 田中太郎
AAA部: YoshinoriN
AAABB部: 保気保気田
...

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

感想


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