/// <summary>
        /// Add Notification
        /// </summary>
        /// <param name="userId"></param>
        /// <param name="subject"></param>
        /// <param name="htmlText"></param>
        /// <returns></returns>
        public async Task <RServiceResult <RUserNotificationViewModel> > PushNotification(Guid userId, string subject, string htmlText)
        {
            try
            {
                RUserNotification notification =
                    new RUserNotification()
                {
                    UserId   = userId,
                    DateTime = DateTime.Now,
                    Status   = NotificationStatus.Unread,
                    Subject  = subject,
                    HtmlText = htmlText
                };
                _context.Notifications.Add(notification);
                await _context.SaveChangesAsync();

                return(new RServiceResult <RUserNotificationViewModel>
                       (
                           new RUserNotificationViewModel()
                {
                    Id = notification.Id,
                    DateTime = notification.DateTime,
                    Status = notification.Status,
                    Subject = notification.Subject,
                    HtmlText = notification.HtmlText
                }
                       ));
            }
            catch (Exception exp)
            {
                return(new RServiceResult <RUserNotificationViewModel>(null, exp.ToString()));
            }
        }
        /// <summary>
        /// Switch Notification Status
        /// </summary>
        /// <param name="notificationId"></param>
        /// <param name="userId"></param>
        /// <returns>updated notification object</returns>
        public async Task <RServiceResult <RUserNotificationViewModel> > SwitchNotificationStatus(Guid notificationId, Guid userId)
        {
            try
            {
                RUserNotification notification =
                    await _context.Notifications.Where(n => n.Id == notificationId && n.UserId == userId).SingleAsync();

                notification.Status = notification.Status == NotificationStatus.Unread ? NotificationStatus.Read : NotificationStatus.Unread;
                _context.Notifications.Update(notification);
                await _context.SaveChangesAsync();

                return(new RServiceResult <RUserNotificationViewModel>
                       (
                           new RUserNotificationViewModel()
                {
                    Id = notification.Id,
                    DateTime = notification.DateTime,
                    Status = notification.Status,
                    Subject = notification.Subject,
                    HtmlText = notification.HtmlText
                }

                       ));
            }
            catch (Exception exp)
            {
                return(new RServiceResult <RUserNotificationViewModel>(null, exp.ToString()));
            }
        }
        /// <summary>
        /// Delete Notification
        /// </summary>
        /// <param name="notificationId">if empty deletes all read notifications</param>
        /// <param name="userId"></param>
        /// <returns></returns>
        public async Task <RServiceResult <bool> > DeleteNotification(Guid notificationId, Guid userId)
        {
            try
            {
                if (notificationId == Guid.Empty)
                {
                    var notifications = await _context.Notifications.Where(n => n.UserId == userId && n.Status == NotificationStatus.Read).ToListAsync();

                    _context.Notifications.RemoveRange(notifications);
                    await _context.SaveChangesAsync();
                }
                else
                {
                    RUserNotification notification =
                        await _context.Notifications.Where(n => n.Id == notificationId && n.UserId == userId).SingleAsync();

                    _context.Notifications.Remove(notification);
                    await _context.SaveChangesAsync();
                }
                return(new RServiceResult <bool>(true));
            }
            catch (Exception exp)
            {
                return(new RServiceResult <bool>(false, exp.ToString()));
            }
        }