Slackのスタンプ押したらZubeにカード自動作成
概要
社内の人からSlackで「こんなバグありましたよ」みたいなメッセージもらう事あるけど
卓球して席に戻ってきたら、忘れてる事とかよくあるので
スタンプぺこって貼ったらタスク管理ツールに自動でタスク(カード)が作成される仕組みを作ってみた
今職場ではタスク管理にZubeっていうツール使ってるので
そいつにカードが作成されるように作ってみました。
作ったコードはここに置いてます。(動かなかったらごめんちゃい)
全体図
GCP環境にデプロイしちゃいましたがアーキテクチャはこんな感じ
Slackからのスタンプ通知は3秒以内に200でレスポンスしないと
3回再送されちゃうので、GAEからPub/Subに投げてFunctionsに処理させちゃってます。
取り組んだポイント
Golangで書く
ここ数ヶ月仕事でGolang書いてるので基本Golangで書いてます
ドメイン駆動設計
最近ドメイン駆動設計入門 ボトムアップでわかる! ドメイン駆動設計の基本 読んだので、
軽量DDDですが雰囲気だけドメイン駆動開発的に書いてみた。
(結局ドメイン層をうまくいかせてる気がしない。DDDベースの素敵なコードとか探して勉強したい)
Layered Architectureを意識
これも上の本に出てたんで、やってみた
presentasion, application, domain, infrastructureをInterfaceで分離して
具体的な技術(infrastructure)や、受け渡し(presentation)に関する変更が
ユースケース(application)やメインロジック(domain)に影響しないことを意識してみた
DIツール入れてみた
WireっていうgolangのDIツール入れてみた
Firestore in Datastore mode
正直NoSQL的なDB使ったことほぼなかったので
ちょっと勉強も兼ねてFireStore in Datastore modeにデータ入れるようにした
機能
スタンプ押したらzubeにカード作成
- Firestoreからスタンプが飛んできたSlackチャネルに紐づく、Zubeプロジェクト(ワークスペース)を取得
- スタンプの種類に紐付くZubeラベル(例:Bug)もFirestoreから取得
- 取得したZubeプロジェクト(ワークスペース)に対象ラベルをつけて、新たにカード作成
- Slackメッセージの1行目をタイトル、全文を本文、対象メッセージのSlackリンクを記載
- 作成済みの場合は再度作成されない
スタンプ外したらzubeのカード削除
- Firestoreからスタンプが飛んできたSlackチャネルに紐づく、Zubeプロジェクト(ワークスペース)を取得
- スタンプの種類に紐付くZubeラベル(例:Bug)もFirestoreから取得
- ラベルが見つからない場合エラー(対象スタンプ以外対応させない)
- 取得したZubeプロジェクト(ワークスペース)の対象タスクを削除
- タスクが存在しない場合は対応しない
手順
細かい部分はGitHubみてもらえればいいんですが
ざっくりこんな感じ
- AppEngine
- Slackからのイベント受付口作成
- Slack
- スタンプ押したり外したりのEvent Subscriptions有効化
- メッセージ取得のためにUser Token Scopesにchannels:history scope追加
- secret情報をsecret managerに登録
- Slackの認証
- Zube
- 秘密鍵のダウンロード&secret manager登録
- Functions
- スタンプのevent通知にはメッセージの内容が入ってないので別途APIで取得
- Datastoreに詰め込んだり、zubeにカード作ったり
まとめ
Layered Architectureを意識したことで
ZubeがRedmineになろうがAsanaになろうが
Infrastructure層だけ変えれば動きそうなので素敵だなと思った
ただ、ドメイン駆動開発の強みが出るほど複雑なものではないので
今後も続けてみて、強さを感じるまでやってみたい
Discussion