Beispiel #1
0
        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
                        )
                    );
            }
        }
Beispiel #2
0
 /// <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));
 }