Subscribe to news items comments: Implement ICommentNotificationsStrategy interface

You need to implement the ICommentNotificationsStrategy interface with a new CustomCommentNotificationsStrategy class that inherits from the  Telerik.Sitefinity.Services.Comments.Impl.Notifications.CommentNotificationsStrategy. To do this:

  1. In Visual Studio, open your Sitefinity CMS project.

  2. In the context menu of the project, click Add » Class...

  3. Name the class CustomCommentNotificationsStrategy.
    The new class must inherit the CommentNotificationStrategy class.

  4. Override the ShouldNotify method.
    The ShouldNotify method discriminates notifications based on the current comment event. By default, this method specifies that only published comments should raise notifications. Therefore, you need to override this method to return true without checking the comment status.

  5. Provide custom subscription keys.
    Sitefinity CMS uses different patterns for constructing the subscription keys for the different types of subscription. That is, the structure of the subscription key used for notification by thread differs from the structure of the subscription key used for notification by thread type. The unique structure of the subscription keys enables you to get the subscription list that is associated with certain event.

    You need to provide a unique pattern for constructing the subscription keys associated with the custom notification strategy and to integrate them with the existing notification type

  6. Notify the subscribers that have subscribed for this specific comment status.
    By default, when a comment event occurs Sitefinity CMS notifies all subscribers that have subscribed for the respective thread key or type.

Use the following code sample:

C#
using System;
using System.Collections.Generic;
using Telerik.Sitefinity.Services;
using Telerik.Sitefinity.Services.Comments;
using Telerik.Sitefinity.Services.Comments.Impl.Notifications;
using Telerik.Sitefinity.Services.Comments.Notifications;

namespace SitefinityWebApp
{
   public class CustomCommentNotificationsStrategy : CommentNotificationsStrategy
   {

       /// <summary>
       /// Checks whether subscribers should be notified for the given comment event.
       /// </summary>
       /// <param name="@event">The event.</param>
       protected override bool ShouldNotify(ICommentEvent @event)
       {
           var isExpectedEvent = @event != null && (@event is ICommentCreatedEvent || @event is ICommentUpdatedEvent);
           return isExpectedEvent && @event.Item != null;
       }

       /// <summary>
       /// Gets the subscription list resolve key.
       /// </summary>
       /// <param name="subscriptionData">The subscription data.</param>
       /// <exception cref="System.InvalidOperationException">Insufficient subscription data. Please provide ThreadKey or ThreadType.</exception>
       protected override string GetSubscriptionListResolveKey(SubscriptionData subscriptionData)
       {
           if (subscriptionData is CustomSubscriptionData)
           {
               var customSubscrData = (CustomSubscriptionData)subscriptionData;
               if (customSubscrData.CommentStatus.IsNullOrWhitespace())
               {
                   return base.GetSubscriptionListResolveKey(subscriptionData);
               }
               else
               {
                   return this.GetTypeAndStatusResolveKey(customSubscrData.ThreadType, customSubscrData.CommentStatus);
               }
           }
           else
           {
               return base.GetSubscriptionListResolveKey(subscriptionData);
           }
       }

       private string GetTypeAndStatusResolveKey(string type, string status)
       {
           return string.Format("{0}|{1}|ByThreadTypeAndCommentStatus", type, status);
       }

       /// <summary>
       /// Gets the subscription list keys that should be notified for the specified event.
       /// </summary>
       /// <param name="event">The event.</param>
       protected override IEnumerable<string> GetSubscriptionListKeys(ICommentEvent @event)
       {
           var comment = @event.Item;
           var thread = SystemManager.GetCommentsService().GetThread(comment.ThreadKey);

           var result = new List<string>(3);
           if (comment.Status == StatusConstants.WaitingForApproval)
           {
               result.Add(comment.ThreadKey + "|ByThreadKey");

               result.Add(thread.Type + "|ByThreadType");
           }

           result.Add(this.GetTypeAndStatusResolveKey(thread.Type, comment.Status));

           return result;
       }

   }
}

Create a new class and name it CustomSubscriptionData.
The methods of the ICommentNotificationsStrategy interface for subscriptions expect a SubscriptionData object as a parameter. You can extend the SubscriptionData class to provide any additional information that you might need to use - in this case the comment status:

Use the following code sample:

C#
using Telerik.Sitefinity.Services.Comments.Notifications;

namespace SitefinityWebApp
{
   public class CustomSubscriptionData : SubscriptionData
   {
       public string CommentStatus { get; set; }
   }
}
Want to learn more?
Enhance your Sitefinity skills by enrolling in free training sessions. Become Sitefinity certified through Progress Education Community to strengthen your professional credentials.
New to Sitefinity?