Salesforce Apex SDK for Slackの使い方1

2022.7月現在パイロット状態です。今後のリリースによっておそらくアプローチ方法は変わると思いますが、現時点でのチュートリアルを記しておきます。自分用の備忘録です。

## オフィシャルのページはこちら

https://help.salesforce.com/s/articleView?id=sf.salesforce_slack_sdk_pilot.htm&type=5

## オプトインしましょう
以下のDev Hubに連動しますが、Dev Hub組織でSlackの機能をオプトインしてください。
僕の場合は、本番環境をDev Hub組織として使っていますので、本番環境でオプトインしました。

![Apex_で_Slack_アプリケーションを作成___Salesforce.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22294/74ad39d8-2dec-4b32-da90-c628a13f6292.png)

## DevHub組織を有効化
![Dev_Hub___Salesforce.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22294/30e2275f-94e3-5990-be66-ef09a69dea5a.png)

もし、Dev Hub組織が有効化されていない場合はSalesforceの設定画面より有効化しましょう。
ソース追跡の有効化はpushする際に必須ぽいのでしておいてください。
同時にマイドメインの設定が必要です。おそらくデフォルトのまま使っている人はいないと思いますが念の為。

## 権限セットを作る
アプリからSalesforceにアクセスするための権限セットが必要です。
![権限セット___Salesforce.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22294/74247c47-eb7b-7898-ba65-2a87972d6a74.png)

名前は任意です。作成したら、画像の下部にシステム権限という項目がありますのでそちらをクリックしてください。
必須な権限はこちらです

![権限セット___Salesforce.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22294/5694d065-82bc-6adb-a6dc-358bc25f5a30.png)

![権限セット___Salesforce.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22294/a6451216-2850-8b1b-0fdd-ac16dd328d25.png)

権限セットを作成したら、管理者ユーザー(僕の場合は自分ですが)に割り当てましょう。

## 接続アプリケーションを作る
Salesforceの設定画面から、アプリケーションマネージャを選択。新規接続アプリケーションボタンを押します。

![アプリケーションマネージャ___Salesforce.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22294/6c5cb2f9-7360-ab0d-cf33-036c08a620c4.png)

コールバックURLと権限はこのような形
http://localhost:1717/OauthRedirect
![アプリケーションマネージャ___Salesforce-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22294/0ba2830f-b692-1177-99ed-ba24d1442f50.png)

## VS CodeでDev Hub組織を認証します
まずは、作業フォルダを開いておいてください。
ターミナルを開き以下のコマンド

`sfdx force:project:create -n <project_name>`
弊社の場合は本番環境を使っているので
`sfdx force:project:create -n ProdOrg`
としました。

これで必要なファイルが作られますので、フォルダに移動します

`cd <project_name>`

以下のコマンドで認証をしましょう

`sfdx auth:web:login -a devhub -d -r https://<my_domain>.my.salesforce.com`

すると、SalesforceのOAuth画面に移動して認証が始まるのでメアドとパスを入れて認証します。

![作業の開始_—_salesforce_scratch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22294/9c4e9e9d-00d1-b417-5685-bccb513f34fe.png)

## プロジェクトの設定を変更する
### `config/project-scratch-def.json`を変更します。

![project-scratch-def_json_—_scratch_220711_と_SalesForecast_2021_cls_—_sf_full.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22294/d211c8bd-0697-d441-8f29-2c69b18e0bb4.png)

featuresにSLACKを追加です。パッケージアプリを作る場合は"SLACKPACKAGING" も必要になるようなので気をつけましょう。

![project-scratch-def_json_—_scratch_220711.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22294/f8426d57-08f4-9c22-e4e2-7057a7e66db4.png)

### `sfdx-project.json`を変更する

![sfdx-project_json_—_salesforce_scratch_と_Slack_____info_hd___Leave_a_Nest_Co__ltd_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22294/5808062a-706c-af4f-73d5-2a8694fd6640.png)

`"sfdcLoginUrl": "https://<my_domain>.my.salesforce.com",`

sourceApiVersionは54.0以降である必要があります。

## Scratch 組織を作る(組織シェイプを利用する)
### Salesforce CLI で本番組織にログインする
ターミナルから以下のコマンドを打ちます。
`sfdx force:auth:web:login -a ProdOrg`
### ProdOrg から組織シェイプを作成する
ターミナルから以下のコマンドを打ちます。
`sfdx force:org:shape:create -u ProdOrg`
![sfdx-project_json_—_salesforce_prod.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22294/bacf7624-7549-2f86-96d4-e230492497ad.png)
### Scratch組織を組織シェイプから作成する
参考

https://qiita.com/hrk623/items/df12f7b8555cbf70250e

`config/` にファイルが必要なのでそれを作成してください。

```config/shape-scratch-def.json
{
    "orgName": "Scratch Org with Shape",
    "sourceOrg": "00DXXXXXXXXXXXXXXX"
}
```
sourceOrgはDev Hub組織の組織IDを入れます。

*弊社環境だと現状エラーで進めなかったので組織シェイプを利用する方法についてはここまでで保留。


## Scratch 組織を作る(組織シェイプを利用しない)
### シンプルにやる場合はこちら
ターミナルから以下のコマンドを打ちます。

`sfdx force:org:create -f config/project-scratch-def.json -a scratch1 -s -d 30`

すると、ユーザー名が表示されるはずです。

![sfdx-project_json_—_salesforce_scratch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22294/00a4acfe-8c4c-d888-1aa2-5434a4a3fead.png)

### Scratch 組織のユーザー情報をゲットします
ターミナルから以下のコマンドを打ちます。

`sfdx force:user:password:generate --targetusername scratch1`

こうすることで、ユーザーのパスワードを取得することが出来ます。

![sfdx-project_json_—_salesforce_scratch-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22294/d1121440-4445-3ee3-df2f-4f58d0049ba3.png)

### Scratch 組織情報を表示する
ターミナルから以下のコマンドを打ちます。

`sfdx force:user:display -u scratch1`

これでログインURL、ユーザー名、パスワードが取得できますので、スクラッチ組織にログインしていきましょう。

### Slackの規約に同意する
![Slack_for_Salesforce_を有効化___Salesforce.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22294/8f388235-9dee-501d-a18f-00bf6a1350cd.png)


### 権限セットを作成して割り当てる
先程Dev Hubで作成したものと同じものを作って、作成されたユーザに割り当ててください。

## Apex Classを作成する
ここはVS Codeから普通に作ります。

```classes/SayHello.cls
// SayHello.cls
public class SayHello {
   public String hello() {
      return 'Hello World!';
   }
}
```

meta.xmlも作れと書いてありますが、VS Codeが作ってくれると思いますので割愛。

`sfdx force:source:push` とかいてありますが、自分の環境では保存と同時にpushするようになってるのでこれもやらずに進みます。

以上がここまでの手順

https://developer.salesforce.com/docs/platform/salesforce-slack-sdk/guide/run-sfdx.html

## Slack アプリを作る

https://developer.salesforce.com/docs/platform/salesforce-slack-sdk/guide/run-deploy.html

ここからの部分を続けていきます。

### Slackアプリを作成

https://api.slack.com/apps

Slackアプリページを開いて、Create New Appの緑のボタンを押します。
Scratch ではなくてマニフェストから作るを選択してください。

![Slack_API__Applications___Slack.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22294/a9f97da1-7d3b-68fc-8cbd-aededa115169.png)

インストールしたいSlackワークスペースを選択してNextを押します。

するとマニフェスト貼り付け画面が出てきますので、ここに貼り付けます。

全部上書きでOKです。

![Slack_API__Applications___Slack-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22294/38d94108-6e61-7771-686c-4b000e3a612b.png)

貼り付けるとこんな感じなのでNextを押しましょう。

![Slack_API__Applications___Slack-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22294/457836a9-9080-4a88-8669-b9a6ec1282fd.png)

出来たらまずこのボタンを押してワークスペースにインストールします

![Slack_API__Applications___Leave_a_Nest_Co__ltd__Slack.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22294/930fc3ca-f430-6279-fb21-6905f677ce2e.png)

インストールしたら、App IDをコピーしてからApp Manifest画面を開いてください。

![Slack_API__Applications___Leave_a_Nest_Co__ltd__Slack-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22294/dca8a0bc-fa49-b209-64b3-2ce505f1ca00.png)

<your-app-ID>となっている部分を先程コピーしたApp IDに置き換えて保存します。

![Slack___Slack_API__Applications___Leave_a_Nest_Co__ltd_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22294/b07ab0a2-032b-6119-b698-ff0113341cf5.png)

うまくいったかどうかは、Click here to verifyを押せば分かります。

### App-Level Tokensの作成
Basic Informationsの真ん中あたりに、App-Level TokensというブロックがあるのでGenerate Token and Scopesボタンを押して作ります。こんな感じです。

![Slack_API__Applications___Leave_a_Nest_Co__ltd__Slack-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22294/8676eb68-3aac-6672-227d-80e469951024.png)
ここで出てくるTokenは、後で出てくる　HelloSlackApp.slackapp-meta.xml　のappTokenに使います。


## Scratch組織をVS Codeで開く
VS Codeで新しいウィンドウを開き、先程作ったスクラッチ組織で環境構築してください。
マニフェストを使ってプロジェクトを作成し、Sandbox環境で先程手に入れたIDとパスワードでログインすればOKです。

### viewdefinitions を作成する
`force-app/main/default`の中にフォルダを作成しましょう。
`force-app/main/default/viewdefinitions`

注意：Sandboxでも行けるかとおもって試してみたのですが、viewdefinitionsがアップ出来ないみたいです。

この中にファイルを２つ作ってください。

```YAML:force-app/main/default/viewdefinitions/hello.view
description: 'Say Hello Example'
schema:
    properties:
        name:
            type: string
            required: true
components:
    - definition: modal
      properties:
          title: 'Hello {!view.properties.name}'
      components:
          - definition: section
            properties:
                text: 'You did it!'
```

このアプリでは、/apex-hello World
とスラッシュコマンドを打つと、モーダルでYou did it!　と返してくれるというシンプルなアプリなのですが、Slackに戻す部分はviewdefinitionsの.viewファイルが担うみたいですね。
Bolt使ってると、JSONで書くのですが、こっちのほうがわかりやすくて良いかもしれない。

```XML:force-app/main/default/viewdefinitions/hello.view-meta.xml
<?xml version="1.0" encoding="UTF-8"?>
<ViewDefinition xmlns="http://soap.sforce.com/2006/04/metadata">
    <apiVersion>54.0</apiVersion>
    <isProtected>false</isProtected>
    <masterLabel>Hello World Example</masterLabel>
    <targetType>slack</targetType>
</ViewDefinition>
```

Sandboxではなく、Scratch組織だとうまく転送がかかるはずです。

### slackappsフォルダを作成

`force-app/main/default/slackapps`を作成してください
その中にファイルを２つ作ります

```force-app/main/default/slackapps/HelloSlackApp.slackapp
description: Hello World Example App
commands:
    /apex-hello:
        action:
            definition: apex__action__SayHello
        title: Say Hello
        description: A command to say Hello
```

```force-app/main/default/slackapps/HelloSlackApp.slackapp-meta.xml
<?xml version="1.0" encoding="UTF-8"?>
<SlackApp xmlns="http://soap.sforce.com/2006/04/metadata">
    <appKey>*</appKey>
    <appToken>*</appToken>
    <botScopes>
        chat:write,chat:write.public,incoming-webhook,channels:history,groups:history,channels:read,reactions:read,commands
    </botScopes>
    <clientKey>*</clientKey>
    <clientSecret>*</clientSecret>
    <isProtected>false</isProtected>
    <masterLabel>Hello Slack App</masterLabel>
    <signingSecret>*</signingSecret>
    <userScopes>
        im:read,im:write,channels:read,channels:write,chat:write,groups:read,mpim:read,mpim:write,users:read,groups:write
    </userScopes>
</SlackApp>
```

- appKeyは、SlackアプリのApp ID
- appTokenは、先程作ったApp-Level Tokensです
- clientKeyは、Client ID
- clientSecretはそのままですね
- signingSecretもそのままです

作成したら、sfdx force:source:pushでプッシュしましょう。
![hello_view-meta_xml_—_scratch_org.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22294/6f9a92e9-85c2-6bee-c11d-bbc121f75cbb.png)


## Slack Actionをデプロイします
これは先程作ったSayHello.clsを更新します。

```force-app/main/default/classes/SayHello.cls
public class SayHello extends Slack.SlashCommandDispatcher {

   public override Slack.ActionHandler invoke(Slack.SlashCommandParameters parameters, Slack.RequestContext context) {
       return Slack.ActionHandler.modal(new Handler(parameters, context), 'Say Hello');
   }

   public class Handler implements Slack.ModalHandler {

       Slack.SlashCommandParameters parameters;
       Slack.RequestContext context;

       public Handler(Slack.SlashCommandParameters parameters, Slack.RequestContext context){
           this.parameters = parameters;
           this.context = context;
       }

       public Slack.ModalView call() {
           String name = parameters.getText();
           Slack.ViewReference viewReference = Slack.View.hello.get();
           viewReference.setParameter('name', name);
           Slack.ModalView modalView = new Slack.ModalView.builder()
               .viewReference(viewReference)
               .build();
           return modalView;
       }
   }
}
```

## Scratch組織にも接続アプリケーションを作る
設定は先程行ったものと同じでOKです。

## Slackからテストしてみる

### 適当なチャンネルにアプリを招待する
チャンネルにアプリを入れたあとにスラッシュコマンドを入れてみましょう
/apex-hello

すると、Salesforceと接続するボタンが出てきます。

![Slack___05-george___Leave_a_Nest_Co__ltd____1_個の新しいアイテム.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22294/511a7610-e19c-27a4-79b0-cba11f3b9f74.png)

ボタンを押したらOAuth画面が出ますので、Sandbox側を選んでください

![Slack_Connect___Salesforce.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22294/c7c3fc88-e277-73ee-d655-cd4b1d7048e6.png)

携帯の認証登録画面になるので、SMSで認証します

![携帯電話を登録___Salesforce.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22294/0386da0b-35d8-a4ec-2d57-bab4242508c4.png)


Slackのインストール画面にいくので、チャンネルを選択してインストール

![_your-name__Say_Hello_App_が_Leave_a_Nest_Co__ltd__Slack_ワークスペースにアクセスする権限をリクエストしています___Leave_a_Nest_Co__ltd__Slack.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22294/e4bc59be-c4cc-3272-c3b0-f5d30c79d1c5.png)

今度はSalesforceの権限確認画面にいくので「Slack に Salesforce アカウントへのアクセスを許可することに同意します」にチェックをいれて許可ボタンを押しましょう。

:tada:これで接続成功です

![Slack_の接続に成功しました___Salesforce.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22294/543c7bfa-d5ea-28a0-b312-ea0a7e43dbdd.png)

### もう一度Slackからコマンドを試す
/apex-hello World

するとこんな風に返ってきます。
You did it ！

![Slack___05-george___Leave_a_Nest_Co__ltd____2_個の新しいアイテム-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22294/44403c70-a27a-5ec8-83b1-d3bd1d4ffd53.png)

https://developer.salesforce.com/docs/platform/salesforce-slack-sdk/guide/run-deploy.html

## 以上です
覚えることが多い…
一通りチュートリアルが終わったので、その他のサンプルを見ながら、なれていきたいと思います。

https://developer.salesforce.com/docs/platform/salesforce-slack-sdk/guide/setup-install-app.html

## 続きはこちら

https://qiita.com/geeorgey/items/65a512abbcce2a39e49e