Chatter FeedItem and FeedComment. Тонкости при создании, клонировании

Хотел бы немного рассказать о Chatter и его двух основных объектах: FeedItem и FeedComment. Если бегло посмотреть на эти объекты, то кажется, что все просто и понятно. Но когда начинаешь с ними работать, то всплывают разные нюансы, которые портят первое впечатление. Вот эти нюансы я и хотел описать.

Столкнулся с такой вот задачей: “Пользователи Salesforce ведут обсуждение в Chatter на объекте Account; нужно чтобы вся эта переписка дублировалась на всех зависимых Opportunity”.

Вот ссылка на документацию по FeedItem и FeedComment:


Дальше для понимания опишу кратко что эти объекты представляют и что с ними можно делать в Salesforce.

  1. FeedItem и FeedComment стандартные объекты, но им невозможно создать кастомные поля или отредактировать уже существующие.
  2. Эти объекты не видны через “Object Manager” но можно делать SOQL запросы, а также создавать, редактировать, удалять через Apex.
  3. FeedItem представляет Chatter пост, а FeedComment комментарии к этому посту, между ними связь "Master detail ".
  4. На эти объекты можно создавать trigger.
  5. FeedItem может иметь различное поведение при создании клонировании. Это зависит от типа указанного в поле “Type”.

Отдельно хочу рассказать о некоторых специфических полях FeedItem.

Body - это textarea может быть как required так и нет зависит от значения поля "Type".
ParentId - (required) здесь хранится Id объекта на котором создается пост. Могут быть любые объекты Account, Opportunity, Contact, Custom object и другие. Посмотреть к какому объекту принадлежит FeedItem можно например вот так:

(FeedItem обьект).ParentId.getSObjectType().getDescribe().getName() == 'Account'

Type - это pickList где порядка 30 значений в зависимости от которых меняется поведение объекта и свойства его полей. Опишу для примера одно значение из этого поля “TrackedChange”.
И так FeedItem с типом “TrackedChange” создается автоматически в том случае если на объекта на котором создается пост включено Feed Tracking для какого-то из полей.

Включить/отключить Feed Tracking можно здесь:


Это нужно для того, чтобы получать сообщения в Chatter, когда значение этих полей меняется.

Но записи FeedItem с типом “TrackedChange” невозможно клонировать. В моем случае я получал странную ошибку, когда выбирал все записи FeedItem для определенного объекта и пытался их клонировать и присвоить другому объекту. Чтобы не было таких ошибок — нужно фильтровать записи FeedItem и игнорить, где поле “Type” равно “TrackedChange”.

Как создать или клонировать FeedItem, FeedComment через Apex.

Здесь все просто, но есть нюанс при клонировании.
Создать можно вот так:

FeedItem feed = new FeedItem();
feed.Body = 'Test Post';
feed.Title = 'Post Titel';
feed.ParentId = 'ID объекта для которого создается пост'; 
insert feed;

FeedComment comment = new FeedComment();
comment.CommentBody = 'Text Comment';
comment.FeedItemId = feed.Id; // required
comment.ParentId = feed.ParentId; // ID объекта которому принадлежит пост required
insert comment;

Что бы корректно клонировать все значения нужно это сделать вот так:

FeedItem feed = feedPost.clone(); // feedPost - запись которую нужно клонировать

В таком случае в дубликате владельцем записи будет пользователь который создал эту запись.
Если это делать вот так:

FeedItem feed = new FeedItem();
feed.Body = feedPost.Body;      // feedPost - запись которую нужно клонировать
feed.Title = feedPost.Titel;
feed.ParentId = 'ID объекта для которого создается пост'; 
insert feed;

В данном случае владельцем дубликата будет не оригинальный пользователь, который создал пост, а пользователь, от имени которого был запущен Apex код. Подменить владельца записи вручную невозможно.

3 Likes