【Salesforce】Apex共通レスポンス基底クラス

# 目的
LWCでApexクラスを呼出す基底クラスを作成する方法を紹介します。
LWCでApexクラスを呼出すときの返却値は主に正常系、警告系と異常系がありますので、そのパターンにより共通レスポンス基底クラスを作成します。

# 実装
```BaseClass.cls
public abstract class BaseClass  {
    /**
     * LWCへのレスポンス.
     */
    public virtual class Response {
        //成功フラグ
        @AuraEnabled
        public Boolean success {
            get; set;
        }
        //エラーフラグ
        @AuraEnabled
        public Boolean error {
            get; set;
        }
        //メッセージ
        @AuraEnabled
        public String message {
            get; set;
        }
        //返却データ
        @AuraEnabled
        public Object data {
            get; set;
        }
    }

    /**
     * 成功時のレスポンス.
     */
    public class SuccessResponse extends Response {
       /**
         * メッセージなしの成功レスポンス.
         * @param {Object} data データ
         */
        public SuccessResponse(Object data) {
            this.success = true;
            this.error = false;
            this.message = null;
            this.data = data;
        }

        /**
         * メッセージ付きの成功レスポンス.
         * @param {Object} data データ
         * @param {String} message メッセージ
         */
        public SuccessResponse(Object data, String message) {
            this.success = true;
            this.error = false;
            this.message = message;
            this.data = data;
        }
    }
    /**
     * 警告のレスポンス.
     */
    public class WarnResponse extends Response {
        /**
         * データなしの警告レスポンス.
         * @param {String} message メッセージ
         */
        public WarnResponse(String message) {
            this.success = false;
            this.error = false;
            this.message = message;
            this.data = null;
        }
        /**
         * データ付きの警告レスポンス.
         * @param {Object} data データ
         * @param {String} message メッセージ
         */
        public WarnResponse(Object data, String message) {
            this.success = false;
            this.error = false;
            this.message = message;
            this.data = data;
        }
    }
    /**
     * エラーのレスポンス.
     */
    public class ErrorResponse extends Response {
        /**
         * データなしのエラーレスポンス.
         * @param {String} message メッセージ
         */
        public ErrorResponse(String message) {
            this.success = false;
            this.error = true;
            this.message = message;
            this.data = null;
        }

        /**
         * データ付きのエラーレスポンス.
         * @param {Object} data データ
         * @param {String} message メッセージ
         */
        public ErrorResponse(Object data, String message) {
            this.success = false;
            this.error = true;
            this.message = message;
            this.data = data;
        }
    }
}
```

```Demo.cls
public with sharing class Demo extends BaseClass{
    @AuraEnabled
    public static Response demoMethod(String test) {
        try {
            Integer count = [SELECT count() FROM User];
            if (count > 0) {
                List<User>  result =  [SELECT Id, Name FROM User];
                return new SuccessResponse(result, '検索に成功しました。');
            } else {
                return new WarnResponse('データが存在しません。');
            }
        } catch (Exception e) {
            return new ErrorResponse('予期せぬエラーが発生しました。システム管理者へお問い合わせください。 ');
        }
    }
}
```