Exemplo n.º 1
0
        public async Task SearchNotificationsAsync_ContainsActiveNotications()
        {
            //Arrange
            _notificationRegistrar.RegisterNotification <RegistrationEmailNotification>();
            _notificationRegistrar.RegisterNotification <InvoiceEmailNotification>();
            _notificationRegistrar.RegisterNotification <OrderSentEmailNotification>();

            var responseGroup  = NotificationResponseGroup.Default.ToString();
            var searchCriteria = new NotificationSearchCriteria()
            {
                ResponseGroup = responseGroup
            };

            _repositoryMock.Setup(n => n.GetByTypesAsync(
                                      new[]
            {
                nameof(RegistrationEmailNotification),
                nameof(InvoiceEmailNotification),
                nameof(OrderSentEmailNotification)
            }, null, null, responseGroup))
            .ReturnsAsync(new NotificationEntity[] { new EmailNotificationEntity {
                                                         IsActive = true, Type = nameof(OrderSentEmailNotification)
                                                     } });

            //Act
            var result = await _notificationSearchService.SearchNotificationsAsync(searchCriteria);

            //Assert
            Assert.Contains(result.Results, x => x.IsActive);
        }
Exemplo n.º 2
0
        public async Task <ApiPageResult> GetNotificationsForManager([FromBody] NotificationSearchCriteria criteria)
        {
            var page = await _notificationService.GetPageAsync(criteria);

            var result = new ApiPageResult
            {
                Code    = 200,
                Message = "获取通知列表成功",
                Page    = page,
            };

            return(result);
        }
Exemplo n.º 3
0
        public async Task <ApiResult> GetNotifications([FromBody] NotificationSearchCriteria criteria)
        {
            criteria.ToUserId = HttpContext.User.GetUserId();
            var page = await _notificationService.GetPageAsync(criteria);

            var result = new ApiPageResult
            {
                Code    = 200,
                Message = "获取通知列表成功",
                Page    = page,
            };

            return(result);
        }
Exemplo n.º 4
0
        public async Task SearchNotifications_ContainsTwitterNotification()
        {
            //Arrange
            var criteria = new NotificationSearchCriteria()
            {
                Take = int.MaxValue
            };

            //Act
            var result = await _notificationSearchService.SearchNotificationsAsync(criteria);

            //Assert
            Assert.Contains(result.Results, n => n.Type == nameof(PostTwitterNotification) && n.IsActive);
        }
Exemplo n.º 5
0
        public async Task SearchNotificationsAsync_GetNotifications()
        {
            //Arrange
            var searchCriteria = new NotificationSearchCriteria();

            _notificationRegistrar.RegisterNotification <RegistrationEmailNotification>();
            _notificationRegistrar.RegisterNotification <InvoiceEmailNotification>();
            _notificationRegistrar.RegisterNotification <OrderSentEmailNotification>();

            //Act
            var result = await _notificationSearchService.SearchNotificationsAsync(searchCriteria);

            //Assert
            Assert.NotEmpty(result.Results);
        }
Exemplo n.º 6
0
        protected virtual IList <SortInfo> BuildSortExpression(NotificationSearchCriteria criteria)
        {
            var sortInfos = criteria.SortInfos;

            if (sortInfos.IsNullOrEmpty())
            {
                sortInfos = new[]
                {
                    new SortInfo
                    {
                        SortColumn = nameof(NotificationEntity.Type)
                    }
                };
            }
            return(sortInfos);
        }
Exemplo n.º 7
0
        public async Task SearchNotificationsAsync_Get2Items()
        {
            //Arrange
            _notificationRegistrar.RegisterNotification <RegistrationEmailNotification>();
            _notificationRegistrar.RegisterNotification <InvoiceEmailNotification>();
            _notificationRegistrar.RegisterNotification <OrderSentEmailNotification>();
            var searchCriteria = new NotificationSearchCriteria
            {
                Take = 2,
                Skip = 0
            };

            //Act
            var result = await _notificationSearchService.SearchNotificationsAsync(searchCriteria);

            //Assert
            Assert.Equal(2, result.Results.Count);
        }
Exemplo n.º 8
0
        public async Task SaveChangesAsync_UpdateTwitterNotification()
        {
            //Arrange
            var criteria = new NotificationSearchCriteria()
            {
                Take = int.MaxValue
            };
            var notification = _notificationSearchService.SearchNotifications(criteria).Results.FirstOrDefault();

            if (notification is TwitterNotification twitterNotification)
            {
                twitterNotification.Post = $"Post {DateTime.Now}";
            }

            //Act
            await _notificationService.SaveChangesAsync(new [] { notification });

            //Assert
        }
Exemplo n.º 9
0
        public GenericSearchResult <Notification> SearchNotifications(NotificationSearchCriteria criteria)
        {
            var query = AbstractTypeFactory <Notification> .AllTypeInfos
                        .Where(t => t.AllSubclasses.Any(s => s != t.Type && s.IsSubclassOf(typeof(Notification))))
                        .Select(n => n.Type)
                        .AsQueryable();

            if (!string.IsNullOrEmpty(criteria.Keyword))
            {
                query = query.Where(n => n.Name.Contains(criteria.Keyword));
            }

            var totalCount = query.Count();

            var sortInfos = criteria.SortInfos;

            if (sortInfos.IsNullOrEmpty())
            {
                sortInfos = new[] { new SortInfo {
                                        SortColumn = ReflectionUtility.GetPropertyName <Notification>(x => x.Type), SortDirection = SortDirection.Ascending
                                    } };
            }

            var collection = query.OrderBySortInfos(sortInfos).Skip(criteria.Skip).Take(criteria.Take).ToList();

            var list = collection.Select(t =>
            {
                var result = AbstractTypeFactory <Notification> .TryCreateInstance(t.Name);
                NotificationEntity notificationEntity;
                using (var repository = _repositoryFactory())
                {
                    notificationEntity = repository.GetByTypeAsync(t.Name, criteria.TenantId, criteria.TenantType, criteria.ResponseGroup).GetAwaiter().GetResult();
                }
                return(notificationEntity != null ? notificationEntity.ToModel(result) : result);
            }).ToList();

            return(new GenericSearchResult <Notification>
            {
                Results = list,
                TotalCount = totalCount
            });
        }
Exemplo n.º 10
0
        public async Task <NotificationSearchResult> SearchNotificationsAsync(NotificationSearchCriteria criteria)
        {
            var cacheKey = CacheKey.With(GetType(), nameof(SearchNotificationsAsync), criteria.GetCacheKey());
            var notificationSearchResult = await _platformMemoryCache.GetOrCreateExclusiveAsync(cacheKey, async (cacheEntry) =>
            {
                cacheEntry.AddExpirationToken(NotificationSearchCacheRegion.CreateChangeToken());

                var result = AbstractTypeFactory <NotificationSearchResult> .TryCreateInstance();

                var sortInfos = BuildSortExpression(criteria);

                using (var repository = _repositoryFactory())
                {
                    //Optimize performance and CPU usage
                    repository.DisableChangesTracking();

                    var query         = BuildQuery(repository, criteria, sortInfos);
                    result.TotalCount = await query.CountAsync();

                    if (criteria.Take > 0)
                    {
                        var notificationIds = await query.OrderBySortInfos(sortInfos).ThenBy(x => x.Id)
                                              .Select(x => x.Id)
                                              .Skip(criteria.Skip).Take(criteria.Take)
                                              .ToArrayAsync();
                        var unorderedResults = await _notificationService.GetByIdsAsync(notificationIds, criteria.ResponseGroup);
                        result.Results       = unorderedResults.OrderBy(x => Array.IndexOf(notificationIds, x.Id)).ToArray();

                        foreach (var notification in result.Results)
                        {
                            notification.ReduceDetails(criteria.ResponseGroup);
                        }
                    }
                }

                return(result);
            });

            return(notificationSearchResult.Clone() as NotificationSearchResult);
        }
        protected virtual IQueryable <NotificationEntity> GetNotificationsQuery(INotificationRepository repository, NotificationSearchCriteria criteria, IEnumerable <SortInfo> sortInfos)
        {
            var query = repository.Notifications;

            if (!string.IsNullOrEmpty(criteria.NotificationType))
            {
                query = query.Where(x => x.Type == criteria.NotificationType);
            }

            if (!string.IsNullOrEmpty(criteria.TenantId))
            {
                query = query.Where(x => x.TenantId == criteria.TenantId);
            }

            if (!string.IsNullOrEmpty(criteria.TenantType))
            {
                query = query.Where(x => x.TenantType == criteria.TenantType);
            }

            query = query.OrderBySortInfos(sortInfos);
            return(query);
        }
Exemplo n.º 12
0
        public async Task <IActionResult> GetNotifications(NotificationSearchCriteria searchCriteria)
        {
            var notifications = await _notificationSearchService.SearchNotificationsAsync(searchCriteria);

            return(Ok(notifications));
        }
        public IActionResult GetNotifications(NotificationSearchCriteria searchCriteria)
        {
            var notifications = _notificationSearchService.SearchNotifications(searchCriteria);

            return(Ok(notifications));
        }
Exemplo n.º 14
0
 public async Task <Page <NotificationUser> > GetPageAsync(NotificationSearchCriteria criteria)
 {
     return(await _notificationRepository.GetPageAsync(criteria));
 }
        public async Task <ActionResult <NotificationSearchResult> > GetNotifications([FromBody] NotificationSearchCriteria searchCriteria)
        {
            var notifications = await _notificationSearchService.SearchNotificationsAsync(searchCriteria);

            return(Ok(notifications));
        }
        public async Task <NotificationSearchResult> SearchNotificationsAsync(NotificationSearchCriteria criteria)
        {
            var result = AbstractTypeFactory <NotificationSearchResult> .TryCreateInstance();

            var sortInfos = criteria.SortInfos;

            if (sortInfos.IsNullOrEmpty())
            {
                sortInfos = new[]
                {
                    new SortInfo
                    {
                        SortColumn = "Name"
                    }
                };
            }

            var tmpSkip = 0;
            var tmpTake = 0;

            using (var repository = _repositoryFactory())
            {
                var query = GetNotificationsQuery(repository, criteria, sortInfos);

                result.TotalCount = await query.CountAsync();

                if (criteria.Take > 0)
                {
                    var notificationIds = await query.Select(x => x.Id).Skip(criteria.Skip).Take(criteria.Take).ToArrayAsync();

                    result.Results = (await _notificationService.GetByIdsAsync(notificationIds, criteria.ResponseGroup)).AsQueryable().OrderBySortInfos(sortInfos).ToList();
                }
            }
            tmpSkip = Math.Min(result.TotalCount, criteria.Skip);
            tmpTake = Math.Min(criteria.Take, Math.Max(0, result.TotalCount - criteria.Skip));

            criteria.Skip = criteria.Skip - tmpSkip;
            criteria.Take = criteria.Take - tmpTake;

            if (criteria.Take > 0)
            {
                var transientNotificationsQuery = AbstractTypeFactory <Notification> .AllTypeInfos.Select(x => AbstractTypeFactory <Notification> .TryCreateInstance(x.Type.Name))
                                                  .OfType <Notification>().AsQueryable();

                if (!string.IsNullOrEmpty(criteria.NotificationType))
                {
                    transientNotificationsQuery = transientNotificationsQuery.Where(x => x.Type.EqualsInvariant(criteria.NotificationType));
                }

                var allPersistentProvidersTypes = result.Results.Select(x => x.GetType()).Distinct();
                transientNotificationsQuery = transientNotificationsQuery.Where(x => !allPersistentProvidersTypes.Contains(x.GetType()));

                transientNotificationsQuery = transientNotificationsQuery.Where(x => !x.Kind.EqualsInvariant(x.Type));

                result.TotalCount += transientNotificationsQuery.Count();
                var transientNotifications = transientNotificationsQuery.Skip(criteria.Skip).Take(criteria.Take).ToList();

                result.Results = result.Results.Concat(transientNotifications).AsQueryable().OrderBySortInfos(sortInfos).ToList();
            }
            return(result);
        }
Exemplo n.º 17
0
        protected virtual IQueryable <NotificationEntity> BuildQuery(INotificationRepository repository, NotificationSearchCriteria criteria, IEnumerable <SortInfo> sortInfos)
        {
            var query = repository.Notifications;

            if (!string.IsNullOrEmpty(criteria.NotificationType))
            {
                var notificationType = GetNotificationType(criteria.NotificationType);
                query = query.Where(x => x.Type == notificationType);
            }

            query = query.Where(x => x.TenantId == criteria.TenantId);
            query = query.Where(x => x.TenantType == criteria.TenantType);

            if (!string.IsNullOrEmpty(criteria.Keyword))
            {
                var words = Regex
                            .Split(criteria.Keyword, @"\W")
                            .Where(x => !string.IsNullOrWhiteSpace(x));

                foreach (var word in words)
                {
                    query = query.Where(x => x.Type.Contains(word));
                }
            }

            if (criteria.IsActive)
            {
                query = query.Where(x => x.IsActive == null || x.IsActive.Value);
            }

            query = query.OrderBySortInfos(sortInfos);
            return(query);
        }