NocoBaseからSlackにメッセージを送る

2024.04.17

やりたいこと

NocoBaseで作成したアプリケーションで管理しているユーザー向けにSlackのメッセージを送りたい。

ユースケースとしては、アンケートの返信期限が迫っている人だけに送る、所有しているソフトウェアの更新期限が迫っている人に送る などです。

どう対応すればいいの?

この様な場合はワークフローを使ってプロセスを自動化することができます。

各ワークフローは、トリガーと複数のノードを通じて構成され、各ノードの特定の機能を通じて、システム内の対応するイベントの後に処理する必要があるビジネス ロジックが記述されます。

対象となるユーザーを抽出 -> Slackにメッセージを送信する という流れをワークフローで構築してみます。

  • 対象となるユーザー
    • 所持しているソフトウェアライセンスの期限が迫っている

メッセージの送信はSlackのAPIを使用します。

SlackのユーザーIDが必要なので、NocoBaseのユーザー情報にSlackIDが入っていることが前提とします。

ワークフロー作成画面

NocoBaseのヘッダーにある歯車アイコンからワークフローにアクセスできます。

アクセスしたページに追加ボタンがあるので、それをクリックすると追加画面が起動します。

以下のトリガーを選択できます。

  • トリガータイプ
    • コレクションイベント: レコードの追加、更新、削除後など、コレクション内のデータが変更されたときにトリガーされます
    • スケジュールイベント: あらかじめ設定された時間条件に従ってトリガーされます。通知の送信やスケジュールによるデータのクリーニングなど、1回限りのタスクや定期的なタスクに適しています。
    • Post-action イベント: データの追加、更新、削除、「ワークフローに送信」など、アクションボタンやAPIを介して開始されたリクエストの完了後にトリガーされます。アクション完了後のデータ処理、通知送信などに適しています

今回のケースだとスケジュールイベントが適していそうです。

同期モードとして、非同期か同期かを選択できます、

  • Execute mode
    • Asynchronously: キューイングされたタスクとしてバックグラウンドで実行される
    • Synchronously: 即時のフィードバックが必要なユーザーアクション用

スケジュールイベントではAsynchronously固定となっています

  • Auto delete history when execution is on end status
    • 実行終了時に履歴を自動削除する場合、ワークフローのステータスを選択します

今回は何も選択しないでおきます。

送信ボタンを押せば作成できます。

ワークフローの中身を作成

作成したワークフローの設定をクリックすると、ノードを追加できる画面に遷移します。

+を押して必要なノードを追加していきます。

対象となるユーザーを抽出するノード

まずは、対象となるユーザーを抽出 する処理を追加しました。

これはノードタイプ クエリ レコードで作成します。

抽出対象のコレクションを選択し、フィルター条件を適用するなどして抽出を作成します。

今回のシナリオでは、ソフトウェアライセンスの割り当て情報から対象となるユーザー、終了日が2024/5/1より前で、slackIDが入っているユーザー でフィルターを作成

Preload associationsでは、後続のノードで使用できる関連フィールドを選択できます。

Loopノード

対象となるユーザーが複数存在する想定なので、繰り返し処理のためにノードタイプLoopを作成します

Loop targetで、前のノードの結果を使えます。

Slackにメッセージを送信するノード

作成したLoopノードの中でメッセージを送信します。

NocoBaseで外部のサービスAPIを呼び出すには、HTTP requestノードをつかいます。

chat.postMessage を参考に設定していきます。

  • HTTP method
    • POST
  • URL
    • https://slack.com/api/chat.postMessage
  • Headers
    • Content-Type: application/x-www-form-urlencoded
    • Authorization: Bearer <<SlackのAPIトークン>>
  • Body
    • { "text": "<<送信するメッセージ内容>>", "channel": "<<スコープ変数から取得できるSlackID>>" }

※ chat.postMessageやその他のWeb API書き込みメソッドに、整形されたapplication/json POSTボディを送信することが可能

Bodyに入れるSlackIDですが、Loop内で使用できるScoop variablesから対象のものを選択し、クリックするとテキストエリアに変数名が挿入されます

ワークフローを実行

トリガーの設定画面から開始時間を決定して保存します。

今回は1度きりの通知のため、繰り返しは行いませんでした。

ワークフローは作成時点では無効なので、ワークフローの設定画面の右上にあるトグルを手動で有効にします。

この状態で時間がくれば裏で実行されます

実行結果を見てみる

ワークフローの一覧のExecutedの数字をクリックすると、実行結果を見れます。

表示をクリックすると、ワークフローの設定画面と同じようなページにいきます

各ノードの右上にあるチェックマークをクリックすると詳細が確認できます。

対象ユーザーの抽出

ノードの結果に抽出できたレコードの内容が配列の形式で記載されていました

Loop

Loopの結果は配列にあるアイテムの数の合計が表示されていました。

Slackにメッセージを送信する

繰り返し処理ごとに結果を確認できます。

実行したHTTPリクエストの結果が表示されます。

"ok": true となっているので、Slack APIを介してメッセージの送信が成功していることがわかります。

できなそうなこと

現時点で(2024/04)HTTP Requestの結果で返ってくるJSONをパースして後ろのノードで使用することはできなそうでした。

ユーザーのメールアドレスからSlackのIDを取得する -> 取得したIDに対してメッセージを送信 といった流れを最初に考えていました。

この辺りができるようになるともっと利便性が上がるかな~といった感じです。