FormBrige、kViewer外部公開APIで登録済みデータの重複を許さない応募フォーム

FormSS

実現したいこと

下記記事を参考にkViewer外部公開APIを利用してメールアドレスの重複を許さない応募フォームを構築しています。
メールアドレスを入力後、チェックボックスをオンにしたときにkintoneから同じメールアドレスのレコードを取得します。
ヒットするレコードがあればバリデーションエラーを出し、チェックボックスをクリアするという処理をしています。
これで重複の検出はできている状態です。

発生した問題

元々バリデーションイベント発火のタイミングはメールアドレス欄の変更時にしていましたが、文字を入力するたびにAPIがコールされkintoneのAPIアクセス数が膨大になってしまうので今の形になりました。
初回にチェックボックスをオンにしたときは想定通りに動作するのですが、重複が検出された時にメールアドレス欄を修正しようとすると文字入力のたびにAPIがコールされてしまいます。
おそらくよくわからないまま使っている非同期処理のところがうまくいっていないと思うのですが、どなたか解決策をご教授いただけますでしょうか?
よろしくお願いいたします。

実行したコード

※文字列__1行_メアド:メールアドレス欄のフィールドコード
※チェック_メアド:チェックボックスのフィールドコード

(() => {
    'use strict';
/* ---------------------------------------------------------------------------------
    イベント処理
----------------------------------------------------------------------------------*/
// メアド確認チェックボックスが変更された時の処理
fb.events.fields.チェック_メアド.changed = [
    async function (state) {
        if (state.record.チェック_メアド.value == "確認しました") {
            await state.fields.find(({code}) => code === "文字列__1行_メアド").validations.push({
                            params: [],
                            rule: 'mailDupli_validation'
            });
        }
        return state;
    }
];

/* ---------------------------------------------------------------------------------
    バリデーションルール
----------------------------------------------------------------------------------*/
fb.addValidators = function (state) {
    return {
        // 応募済みメールアドレスでないか
        mailDupli_validation: {
            getMessage: function (fieldCode, params) {
                return '応募済みのメールアドレスです。';
            },
            validate: async function (value, params) {
                // kViewer の外部公開APIリンク
                const apiUrl = "外部公開APIのURL";
                // レコード絞り込み用の文字列
                const additional = "絞り込み用の文字列=";
                // 指定したメールアドレスと一致するレコードを呼び出すAPIリンク
                let url = apiUrl + additional + state.record.文字列__1行_メアド.value;
                let hitRecordNum = 0;

                await fetch(url)
                    .then((response) => response.json())
                        .then((res) =>{
                            hitRecordNum = res.records.length;  // ヒットしたレコードの件数
                            
                            // 重複レコードがヒットしたらチェックボックスをクリア
                            if (hitRecordNum !== 0) {
                                state.record.チェック_メアド.value = "";
                            }
                        });
                
                return hitRecordNum === 0;        
            }
        }
    }
};

})();

外部公開APIは、お店の支店情報や製品の型番情報などすべてのデータを見られても問題ない情報を選択するためにあるものです。

応募者のメールアドレスの重複確認をするためには使えません。

外部公開APIを作成する | kintone連携サービス 操作ガイド

注意
アクセス制限をかけていない場合、外部公開APIはURLにアクセスすると、公開した全ての情報を閲覧することができます。
個人情報などを扱う場合は Toyokumo kintoneApp認証を使用した絞り込み条件を設定してご利用ください。

参考
「kintoneの脆弱性ではない」 東京都医療者向けワクチン予約サイトの個人情報問題でサイボウズが見解 - ITmedia NEWS
https://www.itmedia.co.jp/news/articles/2104/27/news162.html

なるほど・・・
別の実装方法を模索してみます。
ありがとうございました。

外部公開APIでの実装は断念いたしますが
APIコールのタイミングの不備については引き続き情報提供いただければと思います。
よろしくお願いいたします。

名称がわかりにくい件

「外部公開API」というのは、kintoneサービスの外に公開するという意味ではなく、自社以外に公開するという目的でつけた名前のようです。

changeイベントでAPIを呼び出してしまう件

詳細はわかりませんが、
私だったら、以下のあたりにブレイクポイントを複数設定して動作を確認します。
あとは、
重複したときに、チェックボックスを戻す操作が動いているのか?

        if (state.record.チェック_メアド.value == "確認しました") {
            await state.fields.find(({code}) => code === "文字列__1行_メアド").validations.push({
                            params: [],
                            rule: 'mailDupli_validation'
            });
        }
        return state;

「外部公開API」の名称についてはまさにそのように認識していました。
危うく重大インシデントにつながるところでした。
重ねてありがとうございました。

API呼び出しの件はひとつひとつ動作確認していくのが近道ですね。
なにか分かればまた報告いたします。

このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。