Slackのスタンプ押したらZubeにカード自動作成

2 min read読了の目安(約2500字

概要

社内の人からSlackで「こんなバグありましたよ」みたいなメッセージもらう事あるけど
卓球して席に戻ってきたら、忘れてる事とかよくあるので
スタンプぺこって貼ったらタスク管理ツールに自動でタスク(カード)が作成される仕組みを作ってみた

今職場ではタスク管理にZubeっていうツール使ってるので
そいつにカードが作成されるように作ってみました。

作ったコードはここに置いてます。(動かなかったらごめんちゃい)

https://github.com/shintaro-uchiyama/slack-suite/tree/main/functions/slack_event

全体図

GCP環境にデプロイしちゃいましたがアーキテクチャはこんな感じ
architecture

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層だけ変えれば動きそうなので素敵だなと思った

ただ、ドメイン駆動開発の強みが出るほど複雑なものではないので
今後も続けてみて、強さを感じるまでやってみたい