Salesforce Winter'17 リリースノートより（API）

本記事は
[Salesforce Winter'17リリースノート](https://releasenotes.docs.salesforce.com/ja-jp/winter17/release-notes/salesforce_release_notes.htm)から
開発 -> API の部分を(適当に)抜粋したものです。

---

# 新規追加分

## オブジェクト
* ISV系のオブジェクト
ISV系のAPI機能強化に伴って関連するオブジェクトが追加された

    |オブジェクト|概要|
    |:--|:--|
    |PackagePushError|転送要求中に発生したエラーを表します。作成される PackagePushError レコードの数は、エラーになった要 求での転送ジョブ数に基づきます。|
    |PackagePushJob|組織で、あるバージョンから別のバージョンへパッケージをアップグレードするための個々の転送ジョブ を表します。|
    |PackagePushRequest|1 つまたは複数の組織で、あるバージョンから別のバージョンへパッケージをアップグレードするための転 送要求を表します。|
    |PackageSubscriber|組織でのパッケージのインストールを表します。|
など

---

* フィールドサービス系
フィールドサービス製品強化に伴って関連するオブジェクトが追加された

    |オブジェクト|概要|
    |:--|:--|
    |ServiceResource|フィールドサービスのサービス技術者または派遣担当者を表します。|
    |ServiceTerritory|フィールドサービス作業を実行できる地域を表します。|
など

---

# 変更分

## オブジェクト
* Account/Contact/Lead
    * クリーンアップルールによる地理位置情報項目の更新
<img width="1224" alt="sfdc_CleanRules.png" src="https://qiita-image-store.s3.amazonaws.com/0/1840/c6b1d01b-ac8f-9621-2e86-3fc575257926.png">

---
* Profile系
    * 既存のカスタムプロファイルのオブジェクト権限、項目権限、および設定オブジェクトへのアクセスが可能
    * データローダを使用して、いくつかのプロファイルの項目レベル権限を一括更新可能
    * Apexクラスを作成して、プロファイルを更新可能
        * [Profile and Permission Objects](https://developer.salesforce.com/docs/atlas.en-us.object_reference.meta/object_reference/sforce_api_erd_profile_permissions.htm)も参考に

```java
// 例: オブジェクト権限を追加する

PermissionSet ps = [Select Id
  From PermissionSet
  Where ProfileId IN (Select Id From Profile Where Name = 'std')];

ObjectPermissions o = new ObjectPermissions(
    parentid = ps.Id,
    permissionscreate = true,
    permissionsdelete = true,
    permissionsedit = true,
    permissionsread = true,
    sobjecttype = 'ABC__c' // <- 事前に定義したカスタムオブジェクトAPI
);
insert o;
```

---

## Chatter REST API

* 投稿とコメントを不適切またはスパムとしてフラグ設定が可能
* コメントにリッチテキストやインライン画像を追加可能

---

# パイロット版

## REST API

* Flow / Flow Interview
    * VisualWorkFlowの独自ランタイム環境を作成できるとか
* Composite
    * 1回のコールで複数要求を実行できて、あるサブ要求の結果を後続のサブ要求で参照可能
        * 現行のBatchリソースではできない
    * クライアントとサーバー間の通信回数を減らせる
        * 例えばモバイルアプリでは有効

---

## Messaging

* プラットフォームイベントを定義して、Salesforce内または外部ソースからカスタム通知を配信できるようにする
* プラットフォームイベントの定義はClassicでのみ
* パブリッシャーは、Apex or API経由でイベントを発行可能
* サブスクライバは、Apex or CometDクライアントを使って、イベント通知に対するアクションを実行する

---

### プラットフォームイベントの定義と制約

* プラットフォームイベントはSオブジェクトであり、カスタムオブジェクトを定義するのとほぼ同じ
* サフィックスは ```__e``` (例: ```Low_Ink__e``` など)
* プラットフォームイベントのインスタンスがイベント通知に相当する

---

* インスタンスは、作成のみで更新不可
* 画面から参照できない
* SOQLでクエリできない
    * ```EventBusSubscriber```を使ってクエリ可能

```sql

// 例
Select ExternalId,Name,Position,Status,Type,Topic
From EventBusSubscriber
Where Topic = 'Low_Ink__e'
```

* ```EventBus.publish``` を使ってインスタンスを作成する

---

### Apex内での利用(イベント発行)

プラットフォームイベントのインスタンスを作成する

```java
List<Low_Ink__e> inkEvents = new List<Low_Ink__e>();

inkEvents.add(
  new Low_Ink__e(
    Printer_Model__c = 'xxx',
    Ink_Percentage__c = 0.2
  )
);

// イベント発行
List<Database.SaveResult> res = EventBus.publish(inkEvents);
```

---

### Apex内での利用(イベント応答)

プラットフォームイベントのトリガを実装することで応答する

```java
trigger LowInkTrigger on Low_Ink__e (after insert) {

  for(Low_Ink__e e : Trigger.new){
    System.debug('printer: ' + e.Printer_Model__c);

    if(e.Ink_Percentage__c < 0.3){
      // 何か特定のアクション: Caseを作成するとか
    }
}
```

---

### Apex内での利用(リトライ)

* ```EventBus.RetryableException``` を投げると、システム側でイベントを再通知する
    * プラットフォームイベントの標準フィールド ```ReplayID``` を新規採番してイベントを再発行する模様

※従来のカスタムオブジェクトとは異なるポイント

---

### API経由での利用(イベント発行)

REST APIを使ってプラットフォームイベントのインスタンスを作成することでイベント発行する

REST EndPoint:

```
/services/data/v37.0/sobjects/Low_Ink__e
```

Request Body:

```
{
  "Printer_Model__c": "xxx",
  "Ink_Percentage__c: 0.3
}
```

---

### CometDを使ったイベントのサブスクライブ

|項目|値|
|:--|:--|
|Channel|```/event/<プラットフォームイベントAPI>```<br/><br/>例:<br/> ```/event/Low_Ink__e```|
|Streaming EndPoint|```/cometd/37.0```|
|(認証情報)|セッションID or UserName/Password ?|

※PushTopicを準備する必要はない模様