Amplie as possibilidades com os acionadores do Apex

Objetivos de aprendizagem

Após concluir esta unidade, você estará apto a:
  • Citar um caso de uso para o uso dos acionadores com os Rich Publisher Apps.
  • Criar um sistema inteligente de Rich Publisher App usando acionadores.
  • Descrever a API dos Rich Publisher Apps.

Use suas habilidades com acionadores do Apex

Além de poder configurar o “clique para adicionar” os Rich Publisher Apps, você também pode configurar aplicativos que preveem, de forma inteligente, a informação que um membro precisa. Por exemplo, seu aplicativo pode responder à publicação de um membro com dados úteis ou uma seleção do Rich Publisher App. Os membros não clicam em um ícone de aplicativo. Em vez disso, um Rich Publisher App relevante é incluído automaticamente na publicação do membro.

É possível conseguir essa funcionalidade usando o poder dos acionadores do Apex para objetos do Chatter. Com os acionadores do Apex, você tem a possibilidade de configurar ações personalizadas antes ou após as alterações dos registros do Salesforce — alterações como inserções, atualizações ou exclusões. Você pode adicionar um acionador after insert FeedItem para monitorar o conteúdo da publicação de um membro e inteligentemente inserir um Rich Publisher App. Também é possível adicionar acionadores que atualizam seu aplicativo em resposta às alterações a outros objetos, como comentários ou respostas.

Vamos ver um acionador after insert em ação.

Sonhos Dreamforce

Imagine que você está na Dreamforce e está procurando algumas sessões interessantes. Você insere sua missão como uma pergunta no seu site Procurando algumas sessões DF. Você adiciona o detalhe Procurando algumas sessões DF interessantes, com a hashtag #lookingForSessions.

Pergunta com detalhes e um tópico no editor do Chatter

Você clica em Perguntar e o editor inclui automaticamente um Rich Publisher App — um mapa do campus Dreamforce — com sua publicação.

Google Map anexado a uma publicação por meio de um acionador after insert

O que fizemos aqui? Para obter este resultado, você cria duas coisas.

  • Um Rich Publisher App para anexar um mapa a um item do feed baseado em algum contexto
  • Um acionador para inserir automaticamente o aplicativo

Mapas Dream

Primeiro, crie um Rich Publisher App semelhante ao aplicativo do caso de suporte da Unidade 2, mas desta vez use a API do Google Maps.

Em vez de clicar em um ícone, o usuário aciona nosso aplicativo do mapa ao introduzir um tópico específico no feed. Mas a plataforma Rich Publisher App requer um ícone. E o que você faz? Neste caso, é possível adicionar uma imagem em branco para o ícone e um componente da composição vazio.

Se preferir, é possível criar um aplicativo “clique para adicionar” e adicionar o acionador after insert como uma experiência complementar.

Aqui está uma maneira de escrever um acionador básico para o FeedItem.

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);
  } 
}

No nosso código de amostra, abrangemos muitos conceitos sobre como escrever um acionador after insert FeedItem e como trabalhar com a API Rich Publisher Apps.

Para adicionar uma instância Rich Publisher App a seu item do feed, a plataforma edita o FeedItem logo após ele ser criado no acionador after insert. Em seguida, ela insere o Rich Publisher App como parte da representação do FeedItem no acionador. É possível filtrar antes de fazer a edição para determinar se você deseja fazer a inserção.

No nosso exemplo, o acionador procura o tópico #lookingForSessions no corpo do feed. Então ele passa o conteúdo para fornecer contexto para o Rich Publisher App. Com o contexto, o Rich Publisher App sabe como exibir o mapa para o campus Dreamforce. Você pode fazer várias coisas para obter o contexto do corpo da publicação ou de seus anexos. Quando você tem contexto, é possível passá-lo como conteúdo para o Rich Publisher App; assim, ele pode renderizar algo em resposta. Também é possível fazer solicitações a serviços de terceiros. Por exemplo, é possível fazer uma solicitação de acesso a recursos de aprendizagem de máquina ou a outras APIs inteligentes. Estes agentes podem fornecer uma resposta inteligente em seus Rich Publisher Apps.

Extensão do Chatter

Em nossas APIs públicas, a API Rich Publisher Apps é referida como ChatterExtension. Você pode criar extensões do Chatter apenas usando a API SOAP por meio do Workbench. Mas também é possível buscá-la usando a API de conexão Extensões do Chatter (ou ConnectAPI no Apex). Quando você cria um Rich Publisher App, você basicamente cria um objeto ChatterExtension, como vimos na Unidade 2, Passo 3. O Salesforce insere Rich Publisher Apps como anexos de itens do feed, semelhante a anexar um arquivo. É por isso que você usa a Entrada de recurso de extensões (ou ConnectAPI no Apex) para inserir uma instância Rich Publisher com um item do feed.

Vamos voltar ao nosso exemplo. Alguém vê a sua pergunta, e responde com Como criar Rich Publisher Apps em Moscone North.

O Google Maps atualizado

Instantaneamente, o mapa é atualizado com um pino na localização de Moscone North.

Outra resposta recomenda uma sessão no hotel Intercontinental. O mapa atualiza novamente, desta vez com um pino na localização do hotel.

O Google Maps atualizado

Aqui, junto com o acionador FeedItem, temos um acionador FeedComment que está monitorando os comentários. Após um membro inserir um comentário, seu aplicativo combina o conteúdo do corpo do comentário com a lista de sessões da Dreamforce. Então, o acionador edita o FeedItem para atualizar o conteúdo com um pino no local mencionado. Como alternativa, é possível ter o Rich Publisher App monitorando um serviço de terceiros para colocar o pino na lista de locais. Neste caso, seu acionador FeedComment pode atualizar esse serviço de terceiros, em vez de editar o FeedItem. Desta forma, você obtém a experiência de atualização dinâmica de pinos no mapa.