3

My customer wants to send bell notifications whenever you add an Attendant to an Event.

Is there a way to create custom bell notifications via apex code?

If not, is it possible to achieve this without any mail provider integration?

enter image description here

  • 1
    I am not sure if it is the best option, but I had a very similar requirement. I archived thru an apex that create a FeedItem. – m Peixoto Apr 8 at 13:57
  • @mPeixoto How did you achieve that? Cause I'm not finding anything usefull for my particular case – molinet Apr 8 at 14:11
  • You could create a FeedItem and the Parent ID will be the user that will receive the Bell Notification. In this case, a chatter will be created mentioned the user and a notification will be created – m Peixoto Apr 8 at 14:37
  • Another approach, if you want to use a Chatter Post. Could you trigger a Process Builder when a new attendant is created? So, you could use Process Builder to create a chatter post. – m Peixoto Apr 8 at 14:38
2

I am not sure if it is the best approach, but I had a situation very close of that. I needed to create a notification for an user linked with a Case.

    List<FeedItem> FeedItemList = New List<FeedItem>();

    for (Case caseitem : CaseCreateAlert) {

        FeedItem post = new FeedItem();

        post.ParentId = caseitem.OwnerId;
        post.Body = caseitem.Message_To_Alert__c;
        post.Title = 'Case';
        post.LinkUrl = '/lightning/r/Case/' + caseitem.ID + '/view';

    }

    if (FeedItemList.size()>0) {         
            insert FeedItemList;                
    }

This source code is not perfect and it is for reference only. You could have issue if the case owner is a Queue, for example.

  • Thanks! I'll try that! – molinet Apr 8 at 14:47
  • Welcome, I hope if somebody have a better solution! – m Peixoto Apr 8 at 14:48
  • So basically the answer is to create any Chatter post directly to the User, or @mentions would probably work in certain scenarios. – Adrian Larson Apr 8 at 16:32
3

You can achieve the bell notification through the new Summer '19 Custom Notifications feature however, it's not triggerable via APEX just yet. I know this doesn't directly answer the question re: APEX, but it's a pretty simple process builder.

https://developer.salesforce.com/blogs/2019/06/get-buildspiration-with-custom-notifications-in-summer-19.html

Upside of this is that you can also deliver these as push notifications to the user's mobile device/watch etc. (so long as they have the Salesforce1 app installed).

1

You can definitely send Bell Notifications via apex. Andrew Fawcett explained this feature in detail in his article https://andyinthecloud.com/2019/06/30/getting-your-users-attention-with-custom-notifications/.

A month ago I had a task to send a notification to my user when deletion of test data is finished. This is an example code how it was done:

public class MyBellNotification
{   
    public static void notifyCurrentUser(String message)
    {
        Http h = new Http();
        HttpRequest req = new HttpRequest();
        req.setEndpoint(Url.getOrgDomainUrl().toExternalForm()
            + '/services/data/v46.0/actions/standard/customNotificationAction');
        req.setMethod('POST');
        req.setHeader('Authorization', 'Bearer ' + UserInfo.getSessionId());
        req.setHeader('Content-Type', 'application/json');
        CustomNotificationActionInput input = new CustomNotificationActionInput();
        input.customNotifTypeId = '0ML0b000000KyjGGAS';
        input.recipientIds = new List<String>{UserInfo.getUserId()};
        input.title = 'Test Data Operation Completed';
        input.body = message;
        input.targetId = '0ML0b000000KyjGGAS';
        CustomNotificationAction action = new CustomNotificationAction();
        action.inputs = new List<CustomNotificationActionInput>{input};
        req.setBody(JSON.serialize(action));
        HttpResponse res = h.send(req);
        System.debug(res.getBody());
    }

    public class CustomNotificationAction
    {
        public List<CustomNotificationActionInput> inputs { get; set; }
    }

    public class CustomNotificationActionInput
    {
        public String customNotifTypeId { get; set; }
        public List<String> recipientIds { get; set; }
        public String title { get; set; }
        public String body { get; set; }
        public String targetId { get; set; }
    }
}

A few things to note:

  1. You need to define a new Notification Type under the Setup menu.
  2. Get the Id of the Notification Type you created. Just run the following query in the Developer Console's Query Editor SELECT Id, DeveloperName FROM CustomNotificationType.
  3. Use this ID in the input.customNotifTypeId = '0ML0b000000KyjGGAS'; and input.targetId = '0ML0b000000KyjGGAS'; fields. If you want you can use the id of an Attendant record in the targetId field. It will generate a link to that record in the notification text.
  4. Since this implementation requires an API callout, you cannot perform DML operations in the same transaction prior to calling this code or in triggers. A workaround to this is to define a Queueable class and call that class instead. See below:

public without sharing class Notification implements Queueable, Database.AllowsCallouts { String message;

public Notification(String message)
{
    this.message = message;
}

public void execute(QueueableContext context)
{
    MyBellNotification.notifyCurrentUser(message);
}

}

Then in your code you use it like this:

Database.delete(Database.query('SELECT Id FROM Account LIMIT 10000'));
System.enqueueJob(new Notification('Records deleted'));
0

I know this may be a little late, but for all those who are still looking for implementation custom notification(Bell notification) via Apex:

The way you solve this requirement is to create an Object called "Custom_Push_Notification__c" with few fields mentioned in below blog link. Once record is inserted into this object, custom notification will be triggered.

Here is the link for more details on my blog Shoot Your Custom Notifications Via Apex

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.