Apex トリガを使用した可能性の拡大

学習の目的

この単元を完了すると、次のことができるようになります。
  • リッチパブリッシャーアプリケーションでトリガを使用する使用事例を挙げる。
  • トリガを使用してインテリジェントなリッチパブリッシャーアプリケーションを作成する。
  • リッチパブリッシャーアプリケーション API を参照する。

Apex トリガスキルを利用する

「クリックして追加」を行うリッチパブリッシャーアプリケーションを設定できるだけでなく、メンバーが必要とする情報をインテリジェントに予測するアプリケーションも設定できます。たとえば、アプリケーションは、メンバーの投稿に対し、役に立つデータや、リッチパブリッシャーアプリケーションの選択で応答できます。メンバーはアプリケーションアイコンをクリックしません。代わりに、Salesforce が自動的に関連するリッチパブリッシャーアプリケーションをメンバーの投稿に追加します。

これを、Chatter オブジェクト用の Apex トリガの機能を使用して実現できます。Apex トリガを使用すると、Salesforce レコードに変更 (挿入、更新、削除など) を加える前または後にカスタムアクションを設定することができます。after insert FeedItem トリガを追加して、メンバーの投稿内容をリスンし、インテリジェントにリッチパブリッシャーアプリケーションを挿入できます。たとえば、他のオブジェクトへの変更 (コメントや回答など) に応じて、アプリケーションを更新するトリガを追加することもできます。

after insert トリガの実際の動作を見てみましょう。

Dreamforce の探索

Dreamforce の会場で面白そうなセッションを探しているところを想像してください。その目的を質問としてコミュニティに「Looking for some DF sessions」(DF セッションを探しています) と入力します。詳細「Looking for some cool DF sessions」(面白い DF セッションを探しています) とハッシュタグ「#lookingForSessions」を追加します。

Chatter パブリッシャーの質問およびその詳細とトピック

[質問する] をクリックすると、パブリッシャーによって自動的にリッチパブリッシャーアプリケーション (Dreamforce キャンパスの地図) が公開された投稿に追加されます。

after-insert トリガで投稿に添付された Google マップ

ここでは何を行ったのでしょうか? この結果を得るには、2 つのものを作成します。

  • コンテキストに基づいてフィード項目に地図を添付するリッチパブリッシャーアプリケーション
  • アプリケーションを自動挿入するトリガ

Dreamforce の地図

まず、単元 2 で作成したサポートケースアプリケーションと似たリッチパブリッシャーアプリケーションを作成しますが、今回は Google Maps API を使用します。

アイコンをクリックする代わりに、ユーザは特定のトピックをフィードに入力することで、地図アプリケーションをトリガします。ただし、リッチパブリッシャーアプリケーションプラットフォームにはアイコンが必要です。どうすればよいでしょうか? この場合、アイコン用の空白の画像と空の構成コンポーネントを追加できます。

または、標準的な「クリックして追加」アプリケーションを作成し、アドオン操作として after insert トリガを追加できます。

以下は、FeedItem の基本的なトリガを記述する方法の 1 つです。

trigger dreamforceMapInsertion on FeedItem (after insert) {
  // This is where we look for content in the post or topics. Based on our result, we can insert
  // a Rich Publisher App. Alternatively, we can continue adding a Rich Publisher App for each
  // post without the filtering. 
    
  // Get FeedItem Id & the body.
  String id = null;
  String body = “”;
  for(FeedItem f : Trigger.new) {
       id = f.id;
       body = f.body;
      }
  }
    
  if (id == null && !f.body.contains('#lookingForSessions’)) {
      return;
  }
  String communityId = Network.getNetworkId();
  String feedElementId = id;
  ConnectApi.FeedEntityIsEditable isEditable = 
    ConnectApi.ChatterFeeds.isFeedElementEditableByMe(communityId, feedElementId);
  
  // Make sure the post is user-editable before inserting the Rich Publisher App.
  if (isEditable.isEditableByMe == true) {


        // This is the setup for Rich Publisher App insertion. 
        ConnectApi.FeedItemInput feedItemInput = new ConnectApi.FeedItemInput();
        ConnectApi.FeedElementCapabilitiesInput feedElementCapabilitiesInput = 
          new ConnectApi.FeedElementCapabilitiesInput();
        feedItemInput.capabilities = feedElementCapabilitiesInput;
        feedItemInput.capabilities.extensions = new ConnectApi.ExtensionsCapabilityInput();
        feedItemInput.capabilities.extensions.itemsToAdd = new List<ConnectApi.ExtensionInput>();
        ConnectApi.ExtensionInput ext = new ConnectApi.ExtensionInput();
        
        // This is the id for your Rich Publisher App.     
        ext.extensionId = '<Insert your extensionId>'; // This would be something you get from 
          //Workbench which is the id for extension entity for example ‘0MYB00000001234567’
        
        // This is the payload associated with this instance of the app.
        ext.payload = '<Insert your payload>'; // This would be your JSON blob for example: 
          //‘{\”feedItemId\":\"'+id+’\”}’
        
        // This can change if you want to use multiple payload versions with different versions of
        // your app. Or you can just use 1 version. This is Optional.                	
        ext.payloadVersion = '<Insert your payloadVersion>'; // This can be anything like ‘1.0’


        // The following fields add metadata to your Rich Publisher App.
        // This is similar to our actions in Unit 2 when we added metadata to the lightning event.
	 alt.textRepresentation = '<Insert your text representation here>'; 
	 ConnectApi.AlternativeInput alt = new ConnectApi.AlternativeInput();
        ext.alternativeRepresentation = alt;
        
        // Add a Rich Publisher App to FeedItem capabilities.
        // Here you can add multiple Rich Publisher App instances in the itemsToAdd Array.
        feedItemInput.capabilities.extensions.itemsToAdd.add(ext);
    
        // Finally, edit the FeedItem to insert the Rich Publisher App.
        ConnectApi.FeedElement editedFeedElement = 
          ConnectApi.ChatterFeeds.updateFeedElement(communityId, feedElementId, feedItemInput);
  } 
}

このコードサンプルには、after insert FeedItem トリガを記述する方法とリッチパブリッシャーアプリケーション API の使用方法に関する多くの概念が含まれています。

リッチパブリッシャーアプリケーションインスタンスをフィード項目に追加するために、プラットフォームは、after insert トリガで作成された直後の FeedItem を編集します。その後で、リッチパブリッシャーアプリケーションインスタンスを、FeedItem 表現の一部としてトリガに挿入します。編集をする前に絞り込んで、挿入するかどうかを決定できます。

この例では、トリガはフィード本文内に #lookingForSessions トピックがあるか探します。次に、ペイロードでコンテキストをリッチパブリッシャーアプリケーションに提供します。コンテキストで、リッチパブリッシャーアプリケーションに Dreamforce キャンパスの地図を表示することを通知します。投稿の本文またはその添付ファイルからコンテキストを取得してさまざまな処理を行うことができます。コンテキストがあると、ペイロードとしてリッチパブリッシャーアプリケーションに渡し、それに応じて表示操作を行うことができます。サードパーティサービスへの要求を実行することもできます。たとえば、機械学習リソースや他のインテリジェント API にアクセスするように要求できます。こうしたエージェントは、リッチパブリッシャーアプリケーションでスマート応答を提供できます。

Chatter 拡張

公開 API で、リッチパブリッシャーアプリケーション API は ChatterExtension として参照されます。Chatter 拡張は、ワークベンチで SOAP API を使用してのみ作成できます。ただし、Chatter Extensions Connect API (または ConnectAPI in Apex). を使用して取得できます。単元 2 のステップ 3 で説明したように、リッチパブリッシャーアプリケーションを作成するとき、基本的に ChatterExtension オブジェクトを作成します。Salesforce は、ファイルを添付するのと同様に、リッチパブリッシャーアプリケーションをフィード項目への添付ファイルとして挿入します。こうした理由から、Extensions Capability Input (または ConnectAPI in Apex) を使用してリッチパブリッシャーアプリケーションインスタンスをフィード項目に挿入します。

例に戻りましょう。誰かが質問を見て、「How to build Rich Publisher Apps at Moscone North」(Moscone North でリッチパブリッシャーアプリケーション作成方法) と応答しています。

更新された Google マップ

即座に地図が更新され、ピンが Moscone North の位置を示しています。

別の回答コメントは、Intercontinental ホテルのセッションを勧めています。地図が再度更新されます。今度は、ピンがホテルの位置を示しています。

更新された Google マップ

ここでは、FeedItem トリガと一緒に、コメントをリスンする FeedComment トリガも使用されています。メンバーがコメントを挿入すると、アプリケーションはコメントの本文内容を Dreamforce セッションのリストを照合します。次に、トリガが FeedItem を編集し、メンションされた場所を示すピンでペイロードを更新します。または、リッチパブリッシャーアプリケーションに、外部のサードパーティサービスをリスンさせてピンを立てる場所のリストを取得することもできます。この場合、FeedComment トリガは FeedItem を編集するのではなく、そのサードパーティサービスを更新できます。このように、地図上でピンが更新される動的な環境を実現できます。