[Hasura]イベントトリガーを使ったカスタムロジックの実行を試してみる

2021.10.26

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Hasuraでは、Postgresデータベースのテーブルにイベントトリガーを作成できます。 イベントトリガーは、指定されたテーブルのイベントを確実にキャプチャし、Webhookを呼び出してカスタムロジックを実行します。

テーブルのイベントは、データの追加、削除、更新です。

やってみる

hasuraにサンプルが用意されているので、それを動かしていきたいと思います。

テーブルの用意は事前に行っておきましょう。

今回は以前の記事で使用したテーブルを使います。

カスタムロジックの作成

Webhookで呼び出されるカスタムロジックを作成し、デプロイする必要があります。

今回はサンプルで用意されているコードを使わせてもらいます。

サンプルはこちら

glitchというサービスを使っています。

shareボタンを押すとProject linksの箇所にURLが記載されています。

Live site のURLをイベントトリガーの設定で使うので控えておきましょう。

なお、実行されるロジックですが、

function echo(event) {
   let responseBody = '';
    if (event.op === "INSERT") {
        responseBody = `New user ${event.data.new.id} inserted, with data: ${event.data.new.name}`;
    }
    else if (event.op === "UPDATE") {
        responseBody = `User ${event.data.new.id} updated, with data: ${event.data.new.name}`;
    }
    else if (event.op === "DELETE") {
        responseBody = `User ${event.data.old.id} deleted, with data: ${event.data.old.name}`;
    }

    return responseBody;
};

POSTの時は上記のコードが実行されます。

event.data.new.idevent.data.new.nameなどは使うテーブルのカラムに変更しておきましょう。

イベントトリガーの作成

hasuraのプロジェクトページのEventsページのCreateボタンを押して新規作成します。

基本設定として、

  • Trigger Name
    • イベントトリガーの名前
  • Database
    • Hasuraと接続しているPostgresデータベースの中から選択する
  • Schema/Table
    • 選択したデータベースのスキーマとテーブルを選択する
  • Trigger Operations
    • トリガーが発火するテーブルのイベントを選択(複数選択可能)
  • Webhook URL
    • イベントペイロードとともに呼び出されるHTTP(s)URL。POSTハンドラーである必要があります。

追加設定として

  • Listen columns for update
    • 特定の列が変更された場合にのみWebhookをトリガーしたい場合に選択する列
  • Retry Logic
    • num_retries : 失敗した時に再試行する回数。デフォルト値は0です
    • interval_sec: 失敗した時に再試行されるまでの秒数です。デフォルト値は10です。
    • timeout_sec: クライアントがWebhookへの接続を閉じるまでの秒数。デフォルト値は60です。
  • Headers
    • イベントトリガーにカスタムヘッダーを追加することができます。各Webhookリクエストには、これらのヘッダーが追加されます

今回、Webhook URLはサンプルとして用意されているglitchのLive siteのURLをコピペします。

入力が終わったら、Create event Triggerボタンを押して作成しましょう。

動作確認

では実際にGraphQLを実行してトリガーの確認をしてみます。

GraphiQLのエディタに以下のクエリを入力して実行してみます。

mutation insertMemo {
  insert_memo(
    objects: [
      {
        content: "イベントトリガーの動作確認を行う",
      }
    ]
  ) {
    affected_rows
  }
}

データが追加されたので、イベントトリガーが起動したかみてみます。

作成したイベントの画面で、Invocation Logsタブをクリックすると、実行されたイベント一覧が表示されます。

expandのアイコンをクリックすると、リクエストとレスポンスの情報が確認できます。

今回のサンプルコードで実装した内容が返却されていることが確認できました。

データ更新、削除でも同じように動くか確認してみてください。

最後に

イベントトリガーという機能を使ってデータベースのテーブルにイベントがあった時にカスタムロジックを動かしてみました。

イベントトリガーを使うことにより、別の場所にデータを連携したり、ユーザーに通知を送ったりする時に使えそうな感じです。