【Apex】各種ホスト名の取得アクション

本記事は、Salesforceの各種ホスト名を取得するフローから利用可能なアクションの作成方法をまとめます。

## 各種ホスト名の取得方法
Apexの標準クラスで[System.DomainCreatorクラス](https://developer.salesforce.com/docs/atlas.ja-jp.apexref.meta/apexref/apex_class_System_DomainCreator.htm#apex_class_System_DomainCreator)があり、このクラスの各種メソッドによって各種ホスト名を取得することが可能です。

## Apexアクションの作成
フローから利用可能なアクションは下記のように作成することができます。
```apex:HostNameAction.cls
public class HostNameAction {
    public class Request {
        @InvocableVariable(label='Host Type' required=true)
        public String hostType;
        @InvocableVariable(label='Package Name' required=false)
        public String packageName;
    }
    public class Result {
        @InvocableVariable(label='Host Name')
        public String hostName;
    }
    @InvocableMethod(label='Get Host Name' description='Returns the hostname of the current org.' category='Utilities')
    public static List<Result> getHostNameAction( List<Request> requests ){
        List<Result> results = new List<Result>();
        for( Request request : requests ){
            Result result = new Result();
            result.hostName = getHostName( request.hostType , request.packageName );
            results.add( result );
        }
        return results;
    }
    private static String getHostName( String hostType , String packageName ){
        switch on hostType {
            when 'Content'                         { return DomainCreator.getContentHostname();                                  }
            when 'ExperienceCloudSitesBuilder'     { return DomainCreator.getExperienceCloudSitesBuilderHostname();              }
            when 'ExperienceCloudSites'            { return DomainCreator.getExperienceCloudSitesHostname();                     }
            when 'ExperienceCloudSitesLivePreview' { return DomainCreator.getExperienceCloudSitesLivePreviewHostname();          }
            when 'ExperienceCloudSitesPreview'     { return DomainCreator.getExperienceCloudSitesPreviewHostname();              }
            when 'LightningContainerComponent'     { return DomainCreator.getLightningContainerComponentHostname( packageName ); }
            when 'Lightning'                       { return DomainCreator.getLightningHostname();                                }
            when 'OrgMyDomain'                     { return DomainCreator.getOrgMyDomainHostname();                              }
            when 'SalesforceSites'                 { return DomainCreator.getSalesforceSitesHostname();                          }
            when 'Setup'                           { return DomainCreator.getSetupHostname();                                    }
            when 'Visualforce'                     { return DomainCreator.getVisualforceHostname( packageName );                 }
        }
        return null;
    }
}
```

#### 基本的な仕様
取得したいホスト名の種類を`hostType`に設定することで、対応したDomainCreatorクラスのメソッドによってホスト名を取得します。
取得したいホスト名の種類によっては`packageName`が必要になります。

#### ホスト名の種類と引数の対応
設定された引数（`hostType`）の値と取得するホスト名の種類は下記のような対応関係になります。

|     引数の値（`hostType`）      | 引数（`packageName`）の必要性 | 取得するホスト名                                                                                 |
| :-----------------------------: | :---------------------------: | :----------------------------------------------------------------------------------------------- |
|             Content             |             不要              | 組織に保存されているコンテンツ (ファイルなど) のホスト名                                         |
|   ExperienceCloudSitesBuilder   |             不要              | 組織の Experience Cloud サイトのエクスペリエンスビルダーにアクセスするホスト名                   |
|      ExperienceCloudSites       |             不要              | 組織の Experience Cloud サイトのシステム管理のホスト名                                           |
| ExperienceCloudSitesLivePreview |             不要              | 組織の Experience Cloud サイトのエクスペリエンスビルダーのライブプレビューにアクセスするホスト名 |
|   ExperienceCloudSitesPreview   |             不要              | 組織の Experience Cloud サイトのエクスペリエンスビルダーのプレビューにアクセスするホスト名       |
|   LightningContainerComponent   |             必要              | `packageName`に対応した組織の Lightning コンテナコンポーネントのホスト名                         |
|            Lightning            |             不要              | 組織の Lightning ページのホスト名                                                                |
|           OrgMyDomain           |             不要              | 組織の 私のドメイン のログインドメインのホスト名                                                 |
|         SalesforceSites         |             不要              | 組織の Salesforce サイトのホスト名                                                               |
|              Setup              |             不要              | 組織の設定ドメインのホスト名                                                                     |
|           Visualforce           |             必要              | `packageName`に対応した組織の Visualforce ページのホスト名                                       |