【Salesforce】ContentDistributionを使ってファイルをパスワード化！

# はじめに
ContentDistributionを使用すると以下のことができました！

- アップロードしたファイルへのアクセスに対してパスワードを付与する
- ファイルに対してURLを発行し、ログインせずにアクセスできる
- URLをメールの文章に置き換えることによって、メールで共有できる
# 実際に作ってみた

想定シチュエーションはこんな感じ

**＼(^o^)／はじまり**

1. ケース(Case)を作成する
2. ケースにファイルをアップロードする
3. ケースの状況(Status)を[Closed]に変更する
4. ケースのトリガが動く(BeforeUpdate)
5. 2.でアップロードしたファイル(ContentVersion)を取得する
6. ContentDistributionを作成する
7. ContentDistributionのContentDownloadUrlを1.で作成したケースの説明(Description)に設定する
8. ワークフローにてメールを送信する

**＼(^o^)／おわり**

# コードはこんな感じ
## CaseTrigger

```CaseTrigger.trigger
trigger CaseTrigger on Case(before update) {
　　if(Trigger.isUpdate && Trigger.isBefore){
　　　　CaseTriggerHandler handler = new CaseTriggerHandler();
　　　　handler.onBeforeUpdate(Trigger.new, Trigger.newMap, Trigger.old, Trigger.oldMap);
　　}
}
```

## CaseTriggerHandler

```CaseTriggerHandler.cls
public void onBeforeUpdate(Case[] newList, Map<Id, Case> newMap, Case[] oldList, Map<Id, Case> oldMap){
　　// 処理対象のケースを保持するため、変数を用意する(今回は単一レコードの処理を想定)
　　Case targetCase = new Case();
　　// 状況が[Closed]に変更されたケースを取得する
　　if(newList[0].Status == 'Closed' && oldList[0].Status != 'Closed'){
　　　　targetCase = newList[0];
　　}

　　// 処理対象のケースが存在する場合、紐づいているファイルを取得する
　　ContentVersion targetCV = new ContentVersion();
　　if(targetCase.Id != NULL){
　　　　targetCV = [SELECT Id, Title, VersionData
　　　　　　　　　　　FROM ContentVersion
　　　　　　　　　　　WHERE FirstPublishLocationId = :targetCase.Id
　　　　　　　　　　　ORDER BY CreatedDate Desc
　　　　　　　　　　　LIMIT 1];
　　}

　　// 処理対象のファイルが存在する場合、ContentDistributionを作成する
　　if(targetCV.Id != NULL){
　　　　ContentDistribution cD = new ContentDistribution();
　　　　cD.Name = targetCV.Title;
　　　　cD.ContentVersionId = targetCV.Id;
　　　　cD.PreferencesPasswordRequired = true;
　　　　insert cD;
　　　　// URL、パスワードがNULLの状態のため、再取得を行う
　　　　cD = [SELECT DistributionPublicUrl, Password FROM ContentDistribution WHERE Id = :cD.Id];

　　　　targetCase.Description = cD.DistributionPublicUrl;
　　　　targetCase.Description += '\r\n';
　　　　targetCase.Description += cD.Password;
　　}
}
```

#動作時のキャプチャ
### 1.ケース(Case)を作成する
<img width="660" alt="無題.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492812/27577e53-3cd3-4fa5-1639-8970d2b1af5d.png">
<img width="942" alt="無題.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492812/1f132453-319c-56d8-5712-b9a4010771d9.png">
### 2.ケースにファイルをアップロードする
<img width="940" alt="無題.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492812/a0d15090-9ff0-7a29-5d3f-dea5ad02ed66.png">
### 3.ケースの状況(Status)を[Closed]に変更する
<img width="945" alt="無題.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492812/e297c070-b04d-f2c2-84c0-1fadab14cdbb.png">
### 4.5.6は割愛
### 7.ContentDistributionのContentDownloadUrlを1.で作成したケースの説明(Description)に設定する
※insert直後だとまだ値が設定されていないので再度取得すること！
<img width="230" alt="無題.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492812/ed9fb5b1-07d7-66a7-c9ee-0eaacad82ea6.png">
パスワードは大文字小文字含めた英字8文字です。
**数字を組み合わせたり、文字数を変更することはできませんでした。**
※画像は手修正後のものです
<img width="597" alt="無題.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492812/75561712-60ea-c79d-30f4-73cdfaa30a59.png">
### 8.ワークフローにてメールを送信する
送れた～！
<img width="709" alt="無題.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492812/584e57bb-30d0-cb41-f184-ad4c1279e3fc.png">
### URLをクリックしてダウンロードしてみた
こんな感じの画面に遷移します！
※URLがSalesforceです！って感じなのでお客さんによっては嫌がるだろうなあ・・・
<img width="325" alt="無題.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492812/7fdea804-e843-20ef-a0c1-e593bbe44826.png">
パスワードを間違えるとこんな感じになります！
<img width="327" alt="無題.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492812/644c7624-8409-2b2e-c900-62aa63ce2229.png">
パスワード入力時はマスクがかかります！
<img width="319" alt="無題.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492812/cc6914fa-ceaa-5816-5fe6-cfe898575319.png">
正しいパスワードを入力すると、以下の画面に遷移！
<img width="951" alt="無題.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492812/6841b8b1-066f-4776-5a2b-15a1b68ea6ad.png">
ダウンロードボタンを押下すれば問題なくダウンロードできました！
<img width="961" alt="無題.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492812/c372739e-6c9f-1f89-8c4e-d6128a791321.png">

# こんなことはできないのかなあ？
- アップロードしたファイル自体にパスワードを付与する
- パスワードの桁数や設定文字を開発者が決める

などなど・・・

# 参考リンク
[SOAP API 開発者ガイド：ContentVersion](https://developer.salesforce.com/docs/atlas.ja-jp.220.0.api.meta/api/sforce_api_objects_contentversion.htm)
[SOAP API 開発者ガイド：ContentDistribution](https://developer.salesforce.com/docs/atlas.ja-jp.220.0.api.meta/api/sforce_api_objects_contentdistribution.htm)


~~ワークフローで久しぶりにメール送った~~

こんなもんで あぁ～～イイッすかねェェェェェ～～と