Hexabaseでアイテムの更新時にアクションスクリプトを実行する

[Hexabase](https://www.hexabase.com/)はエンタープライズ向けのBaaS（Backend as a Service）を提供しています。主な機能としてはデータベース、ファイルストレージ、認証、リアルタイム通信などを提供しています。

データベースに関連した機能として紹介したいのがアクションスクリプトです。作成時、更新時などにスクリプト（Node.js）を実行する機能になります。トリガーとして利用できます。

今回はそのアクションスクリプトの使い方と、blastengineを使って更新通知メール送信を行う（ネットワーク通信を行う）方法を解説します。

## 開発者機能を有効にしてください

アクションスクリプトを使う場合には、Hexabaseの個人設定で `開発者向け機能` を有効にします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/02e868fa-a23f-011c-50df-9d8f49eed241.png)


## アクションスクリプトを開く

データの詳細を開き、メニューの設定を開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/86757de6-b797-33d0-24c3-57bd67079840.png)

その中にアクションスクリプトを追加するという項目があります。そして、アクションスクリプトの編集をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/938b960c-968f-2917-0eeb-731a96700d64.png)



## コードについて

アクションスクリプトの編集をクリックするとモーダルウィンドウが開いて、エディタが開きます。左側が関数に送られてくるデータ、右側がエディタになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/afc452b2-6115-3d82-e3df-e4e16cdce6f0.png)


アクションスクリプトは更新前（プレ）と更新後（ポスト）に実行できます。希望する側にコードを記述してください。

## データについて

データは対象となるデータベースのアイテムになります。添付ファイル情報、アクションステータス、更新したユーザー情報なども送られてきます。

## コードの書き方

アクション拡張プログラムでは必ず `main` 関数が呼ばれます。そして、1つ目の引数に上記アイテム情報が入ります。以下が基本形です。

```jsx
async function main(data) {
  // 呼ばれた際のコード
}
```

### コードで使えるオブジェクト

アクション拡張プログラムでは `require` は使えません。あらかじめ下記グローバルオブジェクトが用意されていますので、ご利用ください。

- process
- request
- lodash
- crypto
- fs
- FormData
- Readable
- Writable
- ftp
- jwt
- axios
- sendgridMail
- httpCallAsync

### サンプル

Hexabaseでも幾つかのサンプルコードを用意しています。その中にSendGridを使ってメール送信を行うコードがありますが、実装は `sendgridMail` を使って隠蔽化されています。

そこでシンプルなAPI呼び出しを行うコードをblastengineを使って実装してみます。

今回はrequestを使っています。requestは [request/request: 🏊🏾 Simplified HTTP request client.](https://github.com/request/request#forms) になります。コードの内容は[blastengineを使ってNode.jsでメールを送信する - Qiita](https://qiita.com/goofmint/items/88d9019be54567c542be)を参考してください。blastengineではNode.js SDKも提供していますが、今回は素のAPIコールを行っています。

```jsx
async function main(data) {
    const userId = 'YOUR_USER_ID';
    const APIKEY = 'YOUR_API_KEY';
    const str = `${userId}${APIKEY}`;
    const hashHex = crypto
        .createHash('sha256')
        .update(str, 'utf8')
        .digest('hex');
    const token = Buffer
        .from(hashHex.toLowerCase())
        .toString('base64');
    const text_part = `Hexabaseのデータに更新がありました

更新ユーザー: ${data.user_name}
更新日時: ${data.updated_at}
更新データ：${data.i_id}

タイトル：${data.title}
`;
		const params = {
			from: {
					email: 'no-reply@example.jp',
					name: '管理者'
			},
			to: 'user@example.com',
			subject: 'Hexabase 更新通知',
			encode: 'UTF-8',
			text_part,
		};
    const res = await request
        .post({
            url: 'https://app.engn.jp/api/v1/deliveries/transaction',
            headers: {
                'Authorization': `Bearer ${token}`,
                'Content-Type': 'application/json',
            },
            json: params,
        });
    return "OK";
}
```

## 呼び出し方

コードが書き終わったら、後は実際にデータを更新してみましょう。メールが無事に届けば問題ありません。

![スクリーンショット 2023-01-27 15.55.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/d9817c36-913c-1e2f-69c5-545dee7f97d5.png)


## まとめ

アクションスクリプトを使えば更新時にメッセージを送る、別なシステムと連携するなど実現可能性が大きく広がります。トリガーとして、ぜひ活用してください。

サーバーレスな業務システム開発を実現するために、Hexabaseをご利用ください。

[株式会社 Hexabaseー法人向けクラウドシステム『Hexabase』ー](https://www.hexabase.com/)