Хотел бы немного рассказать о Chatter и его двух основных объектах: FeedItem и FeedComment. Если бегло посмотреть на эти объекты, то кажется, что все просто и понятно. Но когда начинаешь с ними работать, то всплывают разные нюансы, которые портят первое впечатление. Вот эти нюансы я и хотел описать.
Столкнулся с такой вот задачей: “Пользователи Salesforce ведут обсуждение в Chatter на объекте Account; нужно чтобы вся эта переписка дублировалась на всех зависимых Opportunity”.
Вот ссылка на документацию по FeedItem и FeedComment:
Дальше для понимания опишу кратко что эти объекты представляют и что с ними можно делать в Salesforce.
- FeedItem и FeedComment стандартные объекты, но им невозможно создать кастомные поля или отредактировать уже существующие.
- Эти объекты не видны через “Object Manager” но можно делать SOQL запросы, а также создавать, редактировать, удалять через Apex.
- FeedItem представляет Chatter пост, а FeedComment комментарии к этому посту, между ними связь "Master detail ".
- На эти объекты можно создавать trigger.
- 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 код. Подменить владельца записи вручную невозможно.