Backlogの更新通知をPharoで受けてChatWorkに整形して流す

Backlogの更新通知をChatWorkに流します。


BacklogのWebhookに関する説明です。URLを指定すると、更新時、そこにJSONをPostしてくれます。
http://www.backlog.jp/help/adminsguide/webhook-setting/userguide2493.html


ここではこの通知をPharoで受けて、ChatWoｒｋに投稿します。
Web系のサービスの連携をサポートするサービスや事例はいろいろありますが、まぁ自前でやります。



## 参考する過去記事

- Smalltalk Web開発編 その0（Teapot）
    - http://qiita.com/kaminami/items/26ed2a12886107d13657
- Pharo Smalltalkでチャットワーク（ChatWork）にメッセージを投稿したりする
  - http://qiita.com/kaminami/items/a65ec28a147707ffc8f5

## Pharoの準備
この辺から環境に応じてPharoを入手、インストールしてください。
http://pharo.org/download


## Pharoへの使用するライブラリ導入
以下のスクリプトをPharoのWorkspace等でdoItして必要なライブラリを導入します。
Pharo5であれば、HTTPサーバはデフォルト導入済みです。

```smalltalk
"テンプレートエンジン Mustache"
Gofer new
    smalltalkhubUser: 'NorbertHartl' project: 'Mustache';
    configuration;
    loadStable.

"JSON操作ライブラリ Neo-JSON"
Gofer new
 url: 'http://mc.stfx.eu/Neo';
package: 'Neo-JSON-Core';
load.

"マイクロウェブフレームワーク Teapot"
Gofer it
    smalltalkhubUser: 'zeroflag' project: 'Teapot';
    configuration;
    loadStable.

"ChatWorkAPIクライアント ChatWork4S"
Gofer new smalltalkhubUser: 'kaminami'
    project: 'ChatWork4S';
    package: 'ChatWork4S';
    load.
```


## BacklogでWebhookをテスト実行した際に送信されるJSON
実際はもう少し値が埋まって来ます。
必要な部分だけ抜き出して使用します。

```json

{
    "id": 3153,
    "project": {
        "id": 92,
        "projectKey": "SUB",
        "name": "SUBTASK",
        "chartEnabled": true,
        "subtaskingEnabled": true,
        "projectLeaderCanEditProjectLeader": false,
        "textFormattingRule": null,
        "archived": false,
        "displayOrder": 0
    },
    "type": 2,
    "content": {
        "id": 4809,
        "key_id": 121,
        "summary": "COMMENT",
        "description": "",
        "comment": {
            "id": 7237,
            "content": ""
        },
        "changes": [
            {
                "field": "milestone",
                "new_value": "R2014-07-23",
                "old_value": "",
                "type": "standard"
            },
            {
                "field": "status",
                "new_value": "4",
                "old_value": "1",
                "type": "standard"
            }
        ]
    },
    "notifications": [
        {
            "id": 25,
            "alreadyRead": false,
            "reason": 2,
            "user": {
                "id": 5686,
                "userId": "takada",
                "name": "takada",
                "roleType": 2,
                "lang": "ja",
                "mailAddress": "takada@nulab.example"
            }
            "resourceAlreadyRead":false
        },
    ],
    "createdUser": {
        "id": 1,
        "userId": "admin",
        "name": "admin",
        "roleType": 1,
        "lang": "ja",
        "mailAddress": "eguchi@nulab.example"
    },
    "created": "2013-12-27T07:50:44Z"
}

```

## Backlogから受けた通知をChatWorkへ整形して送信
以下、最小限の実装です。
本当に運用する場合はもう少しクラスを分けて、テンプレートはファイルに分けて、Teapotインスタンスもクラスインスタンス変数かシングルトンにバインドしましょう。

WorkspaceでdoItした状態でImageを保存しておくと、他所の環境でPharoを起動させた際、サービスが起動した状態で起ち上がります。
手抜きしたい場合には便利です。


```smalltalk
| teapot templateSrc template |

templateSrc := '
Backlogが更新されました
https://YOUR_PROJECT.backlog.jp/view/{{projectKey}}-{{contentKeyId}}

[info][title]{{projectName}}: {{summary}}[/title]
{{description}}
[/info]
'.

template := MustacheTemplate on: templateSrc.


Teapot stopAll.
teapot := Teapot configure: {
    #port -> 8888.
}.

teapot
    POST: '/webhook/backlog' -> [:req | 
        | json client message |
        json := NeoJSONObject fromString: req contents.
        
        message := template value: { 
            'projectKey' -> json project projectKey.
            'projectName' -> json project name.
            'contentKeyId' -> json content key_id.
            'summary' -> json content summary.
            'description' -> json content description.
        } asDictionary.

        
        client := CWClient token: 'YOUR_CHATWORK_TOKEN'.
        client 
            sendMessage: message
            to: 'YOUR_CHATWORK_ROOM_ID'.
                
                
        TeaResponse ok];
    start.

teapot inspect.
```


## おわりに
BacklogでWebhookをテスト実行したり、実際に課題を更新したりすると、ChatWorkに枠付きメッセージが投稿される、はずです。
ChatWorkはユーザ名のなりすましができないので、更新通知だけに使用するアカウントをとって運用したほうがよいですね。