設計情報

投稿者: SPIRERS ナレッジ向上チーム 2023年1月24日 (火)

カスタムプログラムの使いどころ

ver.2.22 より、カスタムプログラムがアクションに追加されました。
本記事では、活用例やサンプルプログラムなどを紹介しますので、活用する際にぜひ参考にしてください。
サポートサイトのスケジュールトリガのカスタムプログラムアクション(2.22)も合わせてご確認ください。

カスタムプログラムとは

カスタムプログラムは、アプリ管理のアクション機能の1つで、スケジュールトリガに紐づけて利用します。
スケジュールトリガに紐づけて利用することで、定期的にプログラムの実行をすることが可能です。
カスタムプログラムに記載できる言語は、PHP(ver.2.22 時点では、PHP 7.4)となります。

活用例

1. 外部チャットツールへの通知
活用例
・お問い合わせDBで未対応かつ一定時間経過している場合に通知
設定時の注意点
1. カスタムプログラムでは、発動条件が指定できないため、APIで未対応のレコードの存在チェックが必要
2. 通知にリンクを含める場合は、アプリ利用画面の検索パラメータに値が入る形で設定
3. 通知する件数によっては多くのAPIを使用するため、実行時間の制限(30秒)に引っかからないように注意
 ※ 検索条件付きアプリ利用画面URLの取得方法は、こちらの記事の「検索条件付きアプリ利用画面URLの取得方法」を参照ください
 ※ チャットサービスとの連携は、SLACKTeams のサンプルプログラムを参考にしてください
2. 外部サービスとのデータ連携
設定時の注意点
1. ファイルフィールドを連携する場合は、API を多く使用するためAPI上限の拡張 及び、深夜の実行を推奨
2. 外部サービス側でプログラムを実行できる場合は、「レコード一括登録依頼を作成」「レコード一括登録依頼を取得」などのAPIを利用することで、カスタムプログラムによる連携を使用しない設計も可能
3. 一定期間経過したレコードを一括更新・削除
活用例
・社員DBで退職日が当日になっているレコードを取得し、退職フラグを立てる
・お問い合わせDBで一定期間更新のないレコードを取得し、終了ステータスに変更
・WEB申請DBでステータスが対応済みかつ、30日経過したレコードの削除
設定時の注意点
1. 更新時は、一定期間経過したレコード一覧の取得を行い、複数レコードの更新を行う必要あり
2. 削除時は、レコード一括削除依頼 のAPIを利用することで1回のAPIで削除可能
サンプルプログラム
PHP - 日付フィールドがアクション実行日より7日以上前のレコード削除
<?php
//------------------------------
// 設定値用モジュール
//------------------------------
define("API_URL", "https://api.spiral-platform.com/v1");
define("API_KEY", "");
define("APP_ROLE", "");
define("APP_ID", "");
define("DB_ID", "");

//------------------------------
// API実行
//------------------------------
$commonBase = CommonBase::getInstance();

$requestBody = array(
	// 例
	"where" => "@date <= DATE(NOW()) - INTERVAL('7 days')" // 日付フィールド(識別名:date)に登録されている日付が実行日より7日以上前の場合
);

$resultBatch = $commonBase->apiCurlAction("POST", "/apps/". APP_ID. "/dbs/". DB_ID. "/records/batchDeletes", $requestBody);
// 実行結果出力
var_dump($resultBatch);


//------------------------------
// 共通用モジュール
//------------------------------
class CommonBase {
    /**
     * シングルトンインスタンス
     * @var UserManager
     */
    protected static $singleton;

    public function __construct() {
        if (self::$singleton) {
            throw new Exception('must be singleton');
        }
        self::$singleton = $this;
    }
    /**
     * シングルトンインスタンスを返す
     * @return UserManager
     */
    public static function getInstance() {
        if (!self::$singleton) {
            return new CommonBase();
        } else {
            return self::$singleton;
        }
    }
    /**
     * V2用 API送信ロジック
     * @return Result
     */
    function apiCurlAction($method, $addUrlPass, $data = null, $multiPart = null, $jsonDecode = null) {
        $header = array(
            "Authorization:Bearer ". API_KEY,
            "X-Spiral-Api-Version: 1.1",
        );
        if($multiPart) {
            $header = array_merge($header, array($multiPart));
        } else {
            $header = array_merge($header, array("Content-Type:application/json"));
        }
        if(APP_ROLE){
			$header = array_merge($header, array("X-Spiral-App-Role: ".APP_ROLE));
		}
        // curl
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_URL, API_URL. $addUrlPass);
        curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
        if ($method == "POST") {
            if ($multiPart) {
                curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
            } else {
                curl_setopt($curl, CURLOPT_POSTFIELDS , json_encode($data));
            }
            curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
        }
        if ($method == "PATCH") {
            curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data));
            curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
        }
        if ($method == "DELETE") {
            curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data));
            curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
        }
        $response = curl_exec($curl);
        if (curl_errno($curl)) echo curl_error($curl);
        curl_close($curl);
        if($jsonDecode){
			return $response;
		}else{
            return json_decode($response, true);
		}
    }
}
APIの設定に関しては、APIメソッドごとのサンプルコードまとめ Record (batch)の記事を参考にしてください。
カスタムプログラムでは、PHP環境変数から値を取得することができないため、設定値は直接入力ください。
また、where文では、SPIRAL ver.2の独自関数なども使用することもできるので、
条件式や計算式の記法を参考にして記載してください。

手動実行

カスタムプログラムは、手動実行ができるためPHPプログラムの動作確認を行うことが可能です。
実行結果を出力する関数(echoなど)も使用できるため、プログラムの動作確認等でも利用することができます。
サイト側で動作確認を行う場合、出力結果を Thymeleaf に渡して表示させるひと手間が必要でしたが、
カスタムプログラムの手動実行では不要です。

PHP
実行結果

最後に

他の活用方法が知りたい等あれば、下記の「コンテンツに関しての要望はこちら」からご連絡ください。
解決しない場合はこちら コンテンツに関しての
要望はこちら