public virtual async Task PublishAsync( string pushRequestName, PushRequestData data = null, EntityIdentifier entityIdentifier = null, PushRequestPriority priority = PushRequestPriority.Normal, IUserIdentifier[] userIds = null, IUserIdentifier[] excludedUserIds = null, int?[] tenantIds = null) { if (pushRequestName.IsNullOrEmpty()) { throw new ArgumentException("PushRequestName can not be null or whitespace!", nameof(pushRequestName)); } 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 pushRequest = new PushRequest(GuidGenerator.Create()) { Name = pushRequestName, EntityTypeName = entityIdentifier?.Type.FullName, EntityTypeAssemblyQualifiedName = entityIdentifier?.Type.AssemblyQualifiedName, EntityId = entityIdentifier?.Id.ToJsonString(), Priority = priority, UserIds = userIds.IsNullOrEmpty() ? null : userIds.Select(uid => uid.ToUserIdentifier().ToUserIdentifierString()).JoinAsString(","), ExcludedUserIds = excludedUserIds.IsNullOrEmpty() ? null : excludedUserIds.Select(uid => uid.ToUserIdentifier().ToUserIdentifierString()).JoinAsString(","), TenantIds = PushRequest.ToTenantIds(tenantIds), Data = data?.ToJsonString(), DataTypeName = data?.GetType().AssemblyQualifiedName }; await RequestStore.InsertRequestAsync(pushRequest); await CurrentUnitOfWork.SaveChangesAsync(); //To get Id of the push request if (userIds != null && userIds.Length <= Configuration.MaxUserCountForForegroundDistribution) { //We can directly distribute the push request since there are not much receivers await RequestDistributor.DistributeAsync(pushRequest.Id); } else { //We enqueue a background job since distributing may get a long time await BackgroundJobManager.EnqueueAsync <PushRequestDistributionJob, PushRequestDistributionJobArgs>( new PushRequestDistributionJobArgs( pushRequest.Id ) ); } }
/// <summary> /// Publishes a new push request. /// </summary> /// <param name="pushRequestPublisher">Push Request publisher</param> /// <param name="pushRequestName">Unique push request name</param> /// <param name="data">Push request data (optional)</param> /// <param name="entityIdentifier">The entity identifier if this push request is related to an entity</param> /// <param name="priority">Push request priority</param> /// <param name="userIds">Target user id(s). Used to send push request to specific user(s). If this is null/empty, the notification is sent to all subscribed users</param> public static void Publish(this IPushRequestPublisher pushRequestPublisher, string pushRequestName, PushRequestData data = null, EntityIdentifier entityIdentifier = null, PushRequestPriority priority = PushRequestPriority.Normal, IUserIdentifier[] userIds = null) { AsyncHelper.RunSync(() => pushRequestPublisher.PublishAsync(pushRequestName, data, entityIdentifier, priority, userIds)); }