public virtual async Task PublishAsync(string notificationName, NotificationData data = null, EntityIdentifier entityIdentifier = null, NotificationSeverity severity = NotificationSeverity.Info, long[] userIds = null) { if (notificationName.IsNullOrEmpty()) { throw new ArgumentException("NotificationName can not be null or whitespace!", "notificationName"); } var notificationInfo = new NotificationInfo { NotificationName = notificationName, EntityTypeName = entityIdentifier == null ? null : entityIdentifier.Type.FullName, EntityTypeAssemblyQualifiedName = entityIdentifier == null ? null : entityIdentifier.Type.AssemblyQualifiedName, EntityId = entityIdentifier == null ? null : entityIdentifier.Id.ToJsonString(), Severity = severity, UserIds = userIds.IsNullOrEmpty() ? null : userIds.JoinAsString(","), Data = data == null ? null : data.ToJsonString(), DataTypeName = data == null ? null : data.GetType().AssemblyQualifiedName }; await _store.InsertNotificationAsync(notificationInfo); await _backgroundJobManager.EnqueueAsync<NotificationDistributionJob, NotificationDistributionJobArgs>( new NotificationDistributionJobArgs( notificationInfo.Id ) ); }
public virtual async Task InsertNotificationAsync(NotificationInfo notification) { using (_unitOfWorkManager.Current.SetTenantId(null)) { await _notificationRepository.InsertAsync(notification); await _unitOfWorkManager.Current.SaveChangesAsync(); } }
public NotificationPublishOptions(NotificationInfo notification) { if (notification == null) { throw new ArgumentNullException("notification"); } Notification = notification; }
public virtual async Task PublishAsync(NotificationPublishOptions options) { var notificationInfo = new NotificationInfo { NotificationName = options.NotificationName, EntityType = options.EntityType == null ? null : options.EntityType.AssemblyQualifiedName, EntityId = options.EntityId == null ? null : options.EntityId.ToString(), //TODO: ToString() can be problem for some types, use JSON serialization instead, based on entity's primary key type Severity = options.Severity, UserIds = options.UserIds.IsNullOrEmpty() ? null : options.UserIds.JoinAsString(","), Data = options.Data.ToJsonString() }; await _store.InsertNotificationAsync(notificationInfo); await _backgroundJobManager.EnqueueAsync<NotificationDistributionJob, NotificationDistributionJobArgs>( new NotificationDistributionJobArgs( notificationInfo.Id ) ); }
public virtual async Task PublishAsync(NotificationPublishOptions options) { CheckNotificationName(options.NotificationName); var notificationInfo = new NotificationInfo { NotificationName = options.NotificationName, EntityType = options.EntityType, EntityId = options.EntityId, Severity = options.Severity, UserIds = options.UserIds.IsNullOrEmpty() ? null : options.UserIds.JoinAsString(",") }; await _store.InsertNotificationAsync(notificationInfo); await _backgroundJobManager.EnqueueAsync<NotificationDistributionJob, NotificationDistributionJobArgs>( new NotificationDistributionJobArgs( notificationInfo.Id ) ); }
public virtual async Task PublishAsync(NotificationPublishOptions options) { var notificationInfo = new NotificationInfo { NotificationName = options.NotificationName, EntityTypeName = options.EntityType == null ? null : options.EntityType.FullName, EntityTypeAssemblyQualifiedName = options.EntityType == null ? null : options.EntityType.AssemblyQualifiedName, EntityId = options.EntityId == null ? null : options.EntityId.ToJsonString(), Severity = options.Severity, UserIds = options.UserIds.IsNullOrEmpty() ? null : options.UserIds.JoinAsString(","), Data = options.Data.ToJsonString(), DataTypeName = options.Data.GetType().AssemblyQualifiedName }; await _store.InsertNotificationAsync(notificationInfo); await _backgroundJobManager.EnqueueAsync<NotificationDistributionJob, NotificationDistributionJobArgs>( new NotificationDistributionJobArgs( notificationInfo.Id ) ); }
/// <inheritdoc/> public Task SendNotificationAsync(NotificationInfo notification, List<UserNotificationInfo> userNotifications) { foreach (var userNotification in userNotifications) { try { var onlineClient = _onlineClientManager.GetByUserIdOrNull(userNotification.UserId); if (onlineClient == null) { //User is not online. No problem, go to the next user. continue; } var signalRClient = CommonHub.Clients.Client(onlineClient.ConnectionId); if (signalRClient == null) { Logger.Debug("Can not get user " + userNotification.UserId + " from SignalR hub!"); continue; } //TODO: Send real notification data //TODO: await call or not? signalRClient.getNotification(new { subject = notification.NotificationName, body = "test body for " + notification.NotificationName }); } catch (Exception ex) { Logger.Warn("Could not send notification to userId: " + userNotification.UserId); Logger.Warn(ex.ToString(), ex); } } return Task.FromResult(0); }
protected virtual async Task<long[]> GetUserIds(NotificationInfo notificationInfo) { List<long> userIds; if (!notificationInfo.UserIds.IsNullOrEmpty()) { //Directly get from UserIds userIds = notificationInfo .UserIds .Split(",") .Select(uidAsStr => uidAsStr.To<long>()) .Where(uid => SettingManager.GetSettingValueForUser<bool>(NotificationSettingNames.ReceiveNotifications, null, uid)) .ToList(); } else { //Get subscribed users var tenantIds = GetTenantIds(notificationInfo); List<NotificationSubscriptionInfo> subscriptions; if (tenantIds.IsNullOrEmpty()) { //Get all subscribed users of all tenants subscriptions = await _notificationStore.GetSubscriptionsAsync( notificationInfo.NotificationName, notificationInfo.EntityTypeName, notificationInfo.EntityId ); } else { //Get all subscribed users of specified tenant(s) subscriptions = await _notificationStore.GetSubscriptionsAsync( tenantIds, notificationInfo.NotificationName, notificationInfo.EntityTypeName, notificationInfo.EntityId ); } //Remove invalid subscriptions var invalidSubscriptions = new Dictionary<Guid, NotificationSubscriptionInfo>(); using (CurrentUnitOfWork.DisableFilter(AbpDataFilters.MayHaveTenant)) { foreach (var subscription in subscriptions) { if (!await _notificationDefinitionManager.IsAvailableAsync(notificationInfo.NotificationName, subscription.TenantId, subscription.UserId) || !SettingManager.GetSettingValueForUser<bool>(NotificationSettingNames.ReceiveNotifications, subscription.TenantId, subscription.UserId)) { invalidSubscriptions[subscription.Id] = subscription; } } } subscriptions.RemoveAll(s => invalidSubscriptions.ContainsKey(s.Id)); //Get user ids userIds = subscriptions .Select(s => s.UserId) .ToList(); } if (!notificationInfo.ExcludedUserIds.IsNullOrEmpty()) { //Exclude specified users. var excludedUserIds = notificationInfo .ExcludedUserIds .Split(",") .Select(uidAsStr => uidAsStr.To<long>()) .ToList(); userIds.RemoveAll(uid => excludedUserIds.Contains(uid)); } return userIds.ToArray(); }
public virtual Task InsertNotificationAsync(NotificationInfo notification) { return _notificationRepository.InsertAsync(notification); }
public static Task PublishAsync(this INotificationManager notificationManager,NotificationInfo notification) { return notificationManager.PublishAsync(new NotificationPublishOptions(notification)); }
public virtual async Task PublishAsync( string notificationName, NotificationData data = null, EntityIdentifier entityIdentifier = null, NotificationSeverity severity = NotificationSeverity.Info, UserIdentifier[] userIds = null, UserIdentifier[] excludedUserIds = null, int?[] tenantIds = null) { if (notificationName.IsNullOrEmpty()) { throw new ArgumentException("NotificationName can not be null or whitespace!", "notificationName"); } if (!tenantIds.IsNullOrEmpty() && !userIds.IsNullOrEmpty()) { throw new ArgumentException("tenantIds can be set only if userIds is not set!", "tenantIds"); } if (tenantIds.IsNullOrEmpty() && userIds.IsNullOrEmpty()) { tenantIds = new[] {AbpSession.TenantId}; } var notificationInfo = new NotificationInfo { NotificationName = notificationName, EntityTypeName = entityIdentifier == null ? null : entityIdentifier.Type.FullName, EntityTypeAssemblyQualifiedName = entityIdentifier == null ? null : entityIdentifier.Type.AssemblyQualifiedName, EntityId = entityIdentifier == null ? null : entityIdentifier.Id.ToJsonString(), Severity = severity, UserIds = userIds.IsNullOrEmpty() ? null : userIds.Select(uid => uid.ToUserIdentifierString()).JoinAsString(","), ExcludedUserIds = excludedUserIds.IsNullOrEmpty() ? null : excludedUserIds.Select(uid => uid.ToUserIdentifierString()).JoinAsString(","), TenantIds = tenantIds.IsNullOrEmpty() ? null : tenantIds.JoinAsString(","), Data = data == null ? null : data.ToJsonString(), DataTypeName = data == null ? null : data.GetType().AssemblyQualifiedName }; await _store.InsertNotificationAsync(notificationInfo); await CurrentUnitOfWork.SaveChangesAsync(); //To get Id of the notification if (userIds != null && userIds.Length <= MaxUserCountToDirectlyDistributeANotification) { //We can directly distribute the notification since there are not much receivers await _notificationDistributer.DistributeAsync(notificationInfo.Id); } else { //We enqueue a background job since distributing may get a long time await _backgroundJobManager.EnqueueAsync<NotificationDistributionJob, NotificationDistributionJobArgs>( new NotificationDistributionJobArgs( notificationInfo.Id ) ); } }
public virtual Task DeleteNotificationAsync(NotificationInfo notification) { return _notificationRepository.DeleteAsync(notification); }
public Task<List<NotificationSubscriptionInfo>> GetSubscriptions(NotificationInfo notification) { return Task.FromResult(new List<NotificationSubscriptionInfo>()); }
/// <summary> /// 插入通知-异步 /// </summary> /// <param name="notification">通知信息</param> /// <returns></returns> public Task InsertNotificationAsync(NotificationInfo notification) { return Task.FromResult(0); }
protected virtual async Task<List<UserNotification>> SaveUserNotifications(UserIdentifier[] users, NotificationInfo notificationInfo) { var userNotifications = new List<UserNotification>(); var tenantGroups = users.GroupBy(user => user.TenantId); foreach (var tenantGroup in tenantGroups) { using (_unitOfWorkManager.Current.SetTenantId(tenantGroup.Key)) { var tenantNotificationInfo = new TenantNotificationInfo(tenantGroup.Key, notificationInfo); await _notificationStore.InsertTenantNotificationAsync(tenantNotificationInfo); await _unitOfWorkManager.Current.SaveChangesAsync(); //To get tenantNotification.Id. var tenantNotification = tenantNotificationInfo.ToTenantNotification(); foreach (var user in tenantGroup) { var userNotification = new UserNotificationInfo { TenantId = tenantGroup.Key, UserId = user.UserId, TenantNotificationId = tenantNotificationInfo.Id }; await _notificationStore.InsertUserNotificationAsync(userNotification); userNotifications.Add(userNotification.ToUserNotification(tenantNotification)); } await CurrentUnitOfWork.SaveChangesAsync(); //To get Ids of the notifications } } return userNotifications; }
public UserNotificationQueueItem(NotificationInfo notification) { Notification = notification; }
public void Add(NotificationInfo notification) { _queue.Enqueue(new UserNotificationQueueItem(notification)); //TODO: Trigger processing }
public Task DeleteNotificationAsync(NotificationInfo notification) { return Task.FromResult(0); }
public virtual Task DeleteNotificationAsync(NotificationInfo notification) { return(_notificationRepository.DeleteAsync(notification)); }
private static int?[] GetTenantIds(NotificationInfo notificationInfo) { if (notificationInfo.TenantIds.IsNullOrEmpty()) { return null; } return notificationInfo .TenantIds .Split(",") .Select(tenantIdAsStr => tenantIdAsStr == "null" ? (int?)null : (int?)tenantIdAsStr.To<int>()) .ToArray(); }
public virtual async Task PublishAsync( string notificationName, NotificationData data = null, EntityIdentifier entityIdentifier = null, NotificationSeverity severity = NotificationSeverity.Info, UserIdentifier[] userIds = null, UserIdentifier[] excludedUserIds = null, long?[] tenantIds = null) { if (notificationName.IsNullOrEmpty()) { throw new ArgumentException("NotificationName can not be null or whitespace!", nameof(notificationName)); } if (!tenantIds.IsNullOrEmpty() && !userIds.IsNullOrEmpty()) { throw new ArgumentException("tenantIds can be set only if userIds is not set!", nameof(tenantIds)); } if (tenantIds.IsNullOrEmpty() && userIds.IsNullOrEmpty()) { tenantIds = new[] { AbpSession.TenantId }; } var notificationInfo = new NotificationInfo(_guidGenerator.Create()) { NotificationName = notificationName, EntityTypeName = entityIdentifier?.Type.FullName, EntityTypeAssemblyQualifiedName = entityIdentifier?.Type.AssemblyQualifiedName, EntityId = entityIdentifier?.Id.ToJsonString(), Severity = severity, UserIds = userIds.IsNullOrEmpty() ? null : userIds.Select(uid => uid.ToUserIdentifierString()).JoinAsString(","), ExcludedUserIds = excludedUserIds.IsNullOrEmpty() ? null : excludedUserIds.Select(uid => uid.ToUserIdentifierString()).JoinAsString(","), TenantIds = GetTenantIdsAsStr(tenantIds), Data = data?.ToJsonString(), DataTypeName = data?.GetType().AssemblyQualifiedName }; await _store.InsertNotificationAsync(notificationInfo); await CurrentUnitOfWork.SaveChangesAsync(); //To get Id of the notification if (userIds != null && userIds.Length <= MaxUserCountToDirectlyDistributeANotification) { //We can directly distribute the notification since there are not much receivers foreach (var notificationDistributorType in _notificationConfiguration.Distributers) { using (var notificationDistributer = _iocResolver.ResolveAsDisposable <INotificationDistributer>(notificationDistributorType)) { await notificationDistributer.Object.DistributeAsync(notificationInfo.Id); } } } else { //We enqueue a background job since distributing may get a long time await _backgroundJobManager.EnqueueAsync <NotificationDistributionJob, NotificationDistributionJobArgs>( new NotificationDistributionJobArgs( notificationInfo.Id ) ); } }
protected virtual async Task<UserIdentifier[]> GetUsers(NotificationInfo notificationInfo) { List<UserIdentifier> userIds; if (!notificationInfo.UserIds.IsNullOrEmpty()) { //Directly get from UserIds userIds = notificationInfo .UserIds .Split(",") .Select(uidAsStr => UserIdentifier.Parse(uidAsStr)) .Where(uid => SettingManager.GetSettingValueForUser<bool>(NotificationSettingNames.ReceiveNotifications, uid.TenantId, uid.UserId)) .ToList(); } else { //Get subscribed users var tenantIds = GetTenantIds(notificationInfo); List<NotificationSubscriptionInfo> subscriptions; if (tenantIds.IsNullOrEmpty() || (tenantIds.Length == 1 && tenantIds[0] == NotificationInfo.AllTenantIds.To<int>())) { //Get all subscribed users of all tenants subscriptions = await _notificationStore.GetSubscriptionsAsync( notificationInfo.NotificationName, notificationInfo.EntityTypeName, notificationInfo.EntityId ); } else { //Get all subscribed users of specified tenant(s) subscriptions = await _notificationStore.GetSubscriptionsAsync( tenantIds, notificationInfo.NotificationName, notificationInfo.EntityTypeName, notificationInfo.EntityId ); } //Remove invalid subscriptions var invalidSubscriptions = new Dictionary<Guid, NotificationSubscriptionInfo>(); foreach (var subscription in subscriptions) { using (CurrentUnitOfWork.SetTenantId(subscription.TenantId)) { if (!await _notificationDefinitionManager.IsAvailableAsync(notificationInfo.NotificationName, new UserIdentifier(subscription.TenantId, subscription.UserId)) || !SettingManager.GetSettingValueForUser<bool>(NotificationSettingNames.ReceiveNotifications, subscription.TenantId, subscription.UserId)) { invalidSubscriptions[subscription.Id] = subscription; } } } subscriptions.RemoveAll(s => invalidSubscriptions.ContainsKey(s.Id)); //Get user ids userIds = subscriptions .Select(s => new UserIdentifier(s.TenantId, s.UserId)) .ToList(); } if (!notificationInfo.ExcludedUserIds.IsNullOrEmpty()) { //Exclude specified users. var excludedUserIds = notificationInfo .ExcludedUserIds .Split(",") .Select(uidAsStr => UserIdentifier.Parse(uidAsStr)) .ToList(); userIds.RemoveAll(uid => excludedUserIds.Any(euid => euid.Equals(uid))); } return userIds.ToArray(); }
public Task SendNotificationAsync(long[] userIds, NotificationInfo notification) { return Task.FromResult(0); }
public virtual async Task PublishAsync( string notificationName, NotificationData data = null, EntityIdentifier entityIdentifier = null, NotificationSeverity severity = NotificationSeverity.Info, long[] userIds = null, int[] tenantIds = null) { if (notificationName.IsNullOrEmpty()) { throw new ArgumentException("NotificationName can not be null or whitespace!", "notificationName"); } if (tenantIds.IsNullOrEmpty()) { tenantIds = AbpSession.TenantId.HasValue ? new[] { AbpSession.TenantId.Value } : AllTenants; } else if (!userIds.IsNullOrEmpty()) { throw new ArgumentException("tenantIds can be set only userIds is not set!", "tenantIds"); } var notificationInfo = new NotificationInfo { NotificationName = notificationName, EntityTypeName = entityIdentifier == null ? null : entityIdentifier.Type.FullName, EntityTypeAssemblyQualifiedName = entityIdentifier == null ? null : entityIdentifier.Type.AssemblyQualifiedName, EntityId = entityIdentifier == null ? null : entityIdentifier.Id.ToJsonString(), Severity = severity, UserIds = userIds.IsNullOrEmpty() ? null : userIds.JoinAsString(","), TenantIds = tenantIds.IsNullOrEmpty() ? null : tenantIds.JoinAsString(","), Data = data == null ? null : data.ToJsonString(), DataTypeName = data == null ? null : data.GetType().AssemblyQualifiedName }; await _store.InsertNotificationAsync(notificationInfo); await CurrentUnitOfWork.SaveChangesAsync(); //To get Id of the notification await _backgroundJobManager.EnqueueAsync<NotificationDistributionJob, NotificationDistributionJobArgs>( new NotificationDistributionJobArgs( notificationInfo.Id ) ); }
public Task SendNotificationAsync(NotificationInfo notification, IEnumerable<UserNotificationInfo> userNotifications) { return Task.FromResult(0); }