コード例 #1
0
        public async Task Process()
        {
            var criteria = new SubscriptionSearchCriteria
            {
                Statuses = new[] { SubscriptionStatus.Active, SubscriptionStatus.PastDue, SubscriptionStatus.Trialing, SubscriptionStatus.Unpaid }.Select(x => x.ToString()).ToArray(),
                Take     = 0,
            };
            var result = await _subscriptionSearchService.SearchSubscriptionsAsync(criteria);

            var batchSize = 20;

            for (var i = 0; i < result.TotalCount; i += batchSize)
            {
                criteria.Skip = i;
                criteria.Take = batchSize;
                result        = await _subscriptionSearchService.SearchSubscriptionsAsync(criteria);

                var subscriptions = await _subscriptionService.GetByIdsAsync(result.Results.Select(x => x.Id).ToArray());

                foreach (var subscription in subscriptions)
                {
                    var subscriptionBuilder = await _subscriptionBuilder.TakeSubscription(subscription).ActualizeAsync();

                    var newOrder = await subscriptionBuilder.TryToCreateRecurrentOrderAsync();

                    if (newOrder != null)
                    {
                        await _customerOrderService.SaveChangesAsync(new[] { newOrder });
                    }
                }
            }
        }
コード例 #2
0
        // "DisableConcurrentExecutionAttribute" prevents to start simultaneous job payloads.
        // Should have short timeout, because this attribute implemented by following manner: newly started job falls into "processing" state immediately.
        // Then it tries to receive job lock during timeout. If the lock received, the job starts payload.
        // When the job is awaiting desired timeout for lock release, it stucks in "processing" anyway. (Therefore, you should not to set long timeouts (like 24*60*60), this will cause a lot of stucked jobs and performance degradation.)
        // Then, if timeout is over and the lock NOT acquired, the job falls into "scheduled" state (this is default fail-retry scenario).
        // Failed job goes to "Failed" state (by default) after retries exhausted.
        public async Task Process()
        {
            var criteria = new SubscriptionSearchCriteria
            {
                Statuses = new[] { SubscriptionStatus.Active, SubscriptionStatus.PastDue, SubscriptionStatus.Trialing, SubscriptionStatus.Unpaid }.Select(x => x.ToString()).ToArray(),
                Take     = 0
            };
            var result = await _subscriptionSearchService.SearchSubscriptionsAsync(criteria);

            var batchSize = 20;

            for (var i = 0; i < result.TotalCount; i += batchSize)
            {
                criteria.Skip = i;
                criteria.Take = batchSize;
                result        = await _subscriptionSearchService.SearchSubscriptionsAsync(criteria);

                var subscriptions = await _subscriptionService.GetByIdsAsync(result.Results.Select(x => x.Id).ToArray());

                foreach (var subscription in subscriptions)
                {
                    await _subscriptionBuilder.TakeSubscription(subscription).ActualizeAsync();
                }
                await _subscriptionService.SaveSubscriptionsAsync(subscriptions);
            }
        }
コード例 #3
0
        public async Task <SubscriptionSearchResult> SearchAsync(SubscriptionSearchCriteria searchCriteria)
        {
            var cacheKey = CacheKey.With(GetType(), nameof(SearchAsync), searchCriteria.GetCacheKey());

            return(await _platformMemoryCache.GetOrCreateExclusiveAsync(cacheKey, async (cacheEntry) =>
            {
                cacheEntry.AddExpirationToken(SubscriptionSearchCacheRegion.CreateChangeToken());
                var result = new SubscriptionSearchResult();

                using (var repository = _subscriptionRepositoryFactory())
                {
                    repository.DisableChangesTracking();

                    var sortInfos = BuildSortExpression(searchCriteria);
                    var query = BuildQuery(searchCriteria, repository);

                    result.TotalCount = await query.CountAsync();

                    if (searchCriteria.Take > 0 && result.TotalCount > 0)
                    {
                        var subscriptionIds = query.OrderBySortInfos(sortInfos)
                                              .ThenBy(x => x.Id)
                                              .Select(x => x.Id)
                                              .Skip(searchCriteria.Skip)
                                              .Take(searchCriteria.Take)
                                              .ToArray();

                        result.Results = (await _subscriptionService.GetByIdsAsync(subscriptionIds, searchCriteria.ResponseGroup)).OrderBy(x => Array.IndexOf(subscriptionIds, x.Id)).ToArray();
                    }
                }

                return result;
            }));
        }
        public static Task WithUserSubscriptionsAsync(this IWorkContextBuilder builder)
        {
            if (builder.WorkContext.CurrentUser != null)
            {
                var serviceProvider     = builder.HttpContext.RequestServices;
                var subscriptionService = serviceProvider.GetRequiredService <ISubscriptionService>();

                Func <int, int, IEnumerable <SortInfo>, NameValueCollection, IPagedList <Subscription> > factory = (pageNumber, pageSize, sortInfos, @params) =>
                {
                    var subscriptionSearchCriteria = new SubscriptionSearchCriteria
                    {
                        PageNumber = pageNumber,
                        PageSize   = pageSize,
                        Sort       = sortInfos?.ToString(),
                        CustomerId = builder.WorkContext.CurrentUser.Id
                    };
                    if (@params != null)
                    {
                        subscriptionSearchCriteria.CopyFrom(@params);
                    }
                    return(subscriptionService.SearchSubscription(subscriptionSearchCriteria));
                };
                return(builder.WithUserSubscriptionsAsync(new MutablePagedList <Subscription>(factory, 1, SubscriptionSearchCriteria.DefaultPageSize)));
            }
            return(Task.CompletedTask);
        }
コード例 #5
0
        public IHttpActionResult SearchSubscriptions(SubscriptionSearchCriteria criteria)
        {
            var result = _subscriptionSearchService.SearchSubscriptions(criteria);
            var retVal = new SubscriptionSearchResult
            {
                Subscriptions = result.Results.ToList(),
                TotalCount    = result.TotalCount
            };

            return(Ok(retVal));
        }
コード例 #6
0
        public async Task <IActionResult> SearchSubscriptions([FromBody] SubscriptionSearchCriteria criteria)
        {
            var result = await _subscriptionSearchService.SearchSubscriptionsAsync(criteria);

            var retVal = new SubscriptionSearchResult
            {
                Subscriptions = result.Results.ToList(),
                TotalCount    = result.TotalCount
            };

            return(Ok(retVal));
        }
コード例 #7
0
        public async Task <ActionResult> SearchCustomerSubscriptions([FromBody] SubscriptionSearchCriteria searchCriteria)
        {
            if (searchCriteria == null)
            {
                searchCriteria = new SubscriptionSearchCriteria();
            }
            //Does not allow to see a other subscriptions
            searchCriteria.CustomerId = WorkContext.CurrentUser.Id;

            var result = await _subscriptionService.SearchSubscriptionsAsync(searchCriteria);

            return(Json(new { TotalCount = result.TotalItemCount, Results = result.ToArray() }));
        }
コード例 #8
0
        private async Task <Subscription> GetSubscriptionByNumberAsync(string number)
        {
            var criteria = new SubscriptionSearchCriteria
            {
                Number = number
            };
            var retVal = (await _subscriptionService.SearchSubscriptionsAsync(criteria)).FirstOrDefault();

            if (retVal == null || retVal.CustomerId != WorkContext.CurrentUser.Id)
            {
                throw new StorefrontException($"Subscription with number {{ number }} not found (or not belongs to current user)");
            }
            return(retVal);
        }
コード例 #9
0
        public static subscriptionDto.SubscriptionSearchCriteria ToSearchCriteriaDto(this SubscriptionSearchCriteria criteria)
        {
            var result = new subscriptionDto.SubscriptionSearchCriteria
            {
                CustomerId = criteria.CustomerId,
                Sort       = criteria.Sort,
                Number     = criteria.Number,
                Skip       = criteria.Start,
                Take       = criteria.PageSize
            };

            result.Sort = criteria.Sort;

            return(result);
        }
コード例 #10
0
        public async Task <IPagedList <Subscription> > SearchSubscriptionsAsync(SubscriptionSearchCriteria criteria)
        {
            var workContext = _workContextAccessor.WorkContext;
            var cacheKey    = CacheKey.With(GetType(), "SearchSubscription", criteria.GetCacheKey());

            return(await _memoryCache.GetOrCreateExclusiveAsync(cacheKey, async (cacheEntry) =>
            {
                //Observe all subscriptions for current user and invalidate them in cache if any changed (one limitation - this toke doesn't detect subscriptions deletions)
                cacheEntry.AddExpirationToken(new PollingApiSubscriptionsChangeToken(_subscriptionApi, _options.ChangesPollingInterval));
                cacheEntry.AddExpirationToken(SubscriptionCacheRegion.CreateCustomerSubscriptionChangeToken(criteria.CustomerId));
                var result = await _subscriptionApi.SearchSubscriptionsAsync(criteria.ToSearchCriteriaDto());
                return new StaticPagedList <Subscription>(result.Subscriptions.Select(x => x.ToSubscription(workContext.AllCurrencies, workContext.CurrentLanguage)),
                                                          criteria.PageNumber, criteria.PageSize, result.TotalCount.Value);
            }));
        }
コード例 #11
0
        protected virtual async Task HandleEvent(DomainEvent domainEvent, CancellationToken cancellationToken)
        {
            var eventId  = domainEvent.GetType().FullName;
            var criteria = new SubscriptionSearchCriteria()
            {
                EventIds = new[] { eventId },
                Skip     = 0,
                Take     = int.MaxValue,
            };
            var searchResult = await _subscriptionSearchService.SearchAsync(criteria);

            if (searchResult.TotalCount > 0)
            {
                var entities = domainEvent.GetObjectsWithDerived <IEntity>()
                               .Select(x => new EventData {
                    ObjectId = x.Id, ObjectType = x.GetType().FullName, EventId = eventId
                })
                               .ToArray();
                var valueObjects = domainEvent.GetObjectsWithDerived <ValueObject>()
                                   .Select(x => new EventData {
                    ObjectId = x.GetCacheKey(), ObjectType = x.GetType().FullName, EventId = eventId
                })
                                   .ToArray();
                var eventData = entities.Union(valueObjects).ToArray();

                var activeSubscritions = new List <SubscriptionInfo>();

                foreach (var subscription in searchResult.Results)
                {
                    var provider = _eventBusFactory.CreateProvider(subscription.Provider);

                    if (provider != null)
                    {
                        var result = await provider.SendEventAsync(subscription, eventData);

                        subscription.Status = result.Status;
                        if (!string.IsNullOrEmpty(result.ErrorMessage))
                        {
                            subscription.ErrorMessage = new string(result.ErrorMessage.Take(1024).ToArray());
                        }

                        activeSubscritions.Add(subscription);
                    }
                }

                await _subscriptionService.SaveChangesAsync(activeSubscritions.ToArray());
            }
        }
コード例 #12
0
        protected virtual IQueryable <SubscriptionEntity> BuildQuery(SubscriptionSearchCriteria searchCriteria, ISubscriptionRepository repository)
        {
            var query = repository.Subscriptions;

            if (!string.IsNullOrEmpty(searchCriteria.Provider))
            {
                query = query.Where(x => x.Provider.Contains(searchCriteria.Provider));
            }

            if (!searchCriteria.EventIds.IsNullOrEmpty())
            {
                query = query.Where(x => x.Events.Any(y => searchCriteria.EventIds.Contains(y.EventId)));
            }

            return(query);
        }
コード例 #13
0
        protected virtual IList <SortInfo> BuildSortExpression(SubscriptionSearchCriteria criteria)
        {
            var sortInfos = criteria.SortInfos;

            if (sortInfos.IsNullOrEmpty())
            {
                sortInfos = new[]
                {
                    new SortInfo {
                        SortColumn = nameof(SubscriptionEntity.CreatedDate)
                    }
                };
            }

            return(sortInfos);
        }
コード例 #14
0
        protected virtual IMutablePagedList <Subscription> LazyLoadCustomerSubscriptions(Contact customer)
        {
            var subscriptionSearchcriteria = new SubscriptionSearchCriteria
            {
                CustomerId = customer.Id
            };

            Func <int, int, IEnumerable <SortInfo>, IPagedList <Subscription> > subscriptionGetter = (pageNumber, pageSize, sortInfos) =>
            {
                subscriptionSearchcriteria.PageNumber = pageNumber;
                subscriptionSearchcriteria.PageSize   = pageSize;
                return(_subscriptionService.SearchSubscription(subscriptionSearchcriteria));
            };

            return(new MutablePagedList <Subscription>(subscriptionGetter, 1, SubscriptionSearchCriteria.DefaultPageSize));
        }
コード例 #15
0
        public IPagedList <Subscription> SearchSubscription(SubscriptionSearchCriteria criteria)
        {
            var workContext = _workContextAccessor.WorkContext;
            //It is very important to have both versions for Sync and Async methods with same cache key due to performance for multithreaded requests
            //you should avoid of call async version with TaskFactory.StartNew() out of the cache getter function
            var cacheKey = CacheKey.With(GetType(), "SearchSubscription", criteria.GetCacheKey());

            return(_memoryCache.GetOrCreateExclusive(cacheKey, (cacheEntry) =>
            {
                //Observe all subscriptions for current user and invalidate them in cache if any changed (one limitation - this toke doesn't detect subscriptions deletions)
                cacheEntry.AddExpirationToken(new PoolingApiSubscriptionsChangeToken(_subscriptionApi, _options.ChangesPoolingInterval));
                cacheEntry.AddExpirationToken(SubscriptionCacheRegion.CreateCustomerSubscriptionChangeToken(criteria.CustomerId));
                var result = _subscriptionApi.SearchSubscriptions(criteria.ToSearchCriteriaDto());
                return new StaticPagedList <Subscription>(result.Subscriptions.Select(x => x.ToSubscription(workContext.AllCurrencies, workContext.CurrentLanguage)),
                                                          criteria.PageNumber, criteria.PageSize, result.TotalCount.Value);
            }));
        }
コード例 #16
0
        public async Task <ActionResult> SearchCustomerSubscriptions(SubscriptionSearchCriteria searchCriteria)
        {
            if (searchCriteria == null)
            {
                searchCriteria = new SubscriptionSearchCriteria();
            }
            //Does not allow to see a other subscriptions
            searchCriteria.CustomerId = WorkContext.CurrentCustomer.Id;

            var result = await _subscriptionApi.SubscriptionModule.SearchAsync(searchCriteria.ToSearchCriteriaDto());

            return(Json(new
            {
                Results = result.Subscriptions.Select(x => x.ToSubscription(WorkContext.AllCurrencies, WorkContext.CurrentLanguage)).ToArray(),
                TotalCount = result.TotalCount,
            }));
        }
コード例 #17
0
        public static subscriptionDto.SubscriptionSearchCriteria ToSearchCriteriaDto(this SubscriptionSearchCriteria criteria)
        {
            var result = new subscriptionDto.SubscriptionSearchCriteria
            {
                CustomerId        = criteria.CustomerId,
                Sort              = criteria.Sort,
                Number            = criteria.Number,
                Skip              = criteria.Start,
                Take              = criteria.PageSize,
                ResponseGroup     = ((int)criteria.ResponseGroup).ToString(),
                ModifiedSinceDate = criteria.ModifiedSinceDate
            };

            result.Sort = criteria.Sort;

            return(result);
        }
コード例 #18
0
        public void Process()
        {
            var criteria = new SubscriptionSearchCriteria
            {
                Statuses = new[] { SubscriptionStatus.Active, SubscriptionStatus.PastDue, SubscriptionStatus.Trialing, SubscriptionStatus.Unpaid }.Select(x => x.ToString()).ToArray(),
            };
            var result    = _subscriptionSearchService.SearchSubscriptions(criteria);
            var batchSize = 20;

            for (int i = 0; i < result.TotalCount; i += batchSize)
            {
                var subscriptions = _subscriptionService.GetByIds(result.Results.Skip(i).Take(batchSize).Select(x => x.Id).ToArray());
                foreach (var subscription in subscriptions)
                {
                    _subscriptionBuilder.TakeSubscription(subscription).Actualize();
                }
                _subscriptionService.SaveSubscriptions(subscriptions);
            }
        }
コード例 #19
0
        public void Process()
        {
            var criteria = new SubscriptionSearchCriteria
            {
                Statuses = new[] { SubscriptionStatus.Active, SubscriptionStatus.PastDue, SubscriptionStatus.Trialing, SubscriptionStatus.Unpaid }.Select(x => x.ToString()).ToArray(),
            };
            var result    = _subscriptionSearchService.SearchSubscriptions(criteria);
            var batchSize = 20;

            for (int i = 0; i < result.TotalCount; i += batchSize)
            {
                var subscriptions = _subscriptionService.GetByIds(result.Results.Skip(i).Take(batchSize).Select(x => x.Id).ToArray());
                foreach (var subscription in subscriptions)
                {
                    var newOrder = _subscriptionBuilder.TakeSubscription(subscription).Actualize().TryToCreateRecurrentOrder();
                    if (newOrder != null)
                    {
                        _customerOrderService.SaveChanges(new[] { newOrder });
                    }
                }
            }
        }
        public async Task TestDataExportImport()
        {
            // Arrange
            var firstSubscriptionCriteria = new SubscriptionSearchCriteria {
                Take = 0, ResponseGroup = SubscriptionResponseGroup.Default.ToString()
            };
            var firstSubscriptionResult = new SubscriptionSearchResult {
                TotalCount = TestSubscriptions.Count
            };

            _subscriptionSearchService
            .Setup(subscriptionSearchService => subscriptionSearchService.SearchSubscriptionsAsync(firstSubscriptionCriteria))
            .ReturnsAsync(firstSubscriptionResult);

            var secondSubscriptionCriteria = new SubscriptionSearchCriteria {
                Skip = 0, Take = ExpectedBatchSize, ResponseGroup = SubscriptionResponseGroup.Default.ToString()
            };
            var secondSubscriptionResult = new SubscriptionSearchResult {
                TotalCount = TestSubscriptions.Count, Results = TestSubscriptions
            };

            _subscriptionSearchService
            .Setup(subscriptionSearchService => subscriptionSearchService.SearchSubscriptionsAsync(secondSubscriptionCriteria))
            .ReturnsAsync(secondSubscriptionResult);

            var firstPaymentPlanCriteria = new PaymentPlanSearchCriteria {
                Take = 0
            };
            var firstPaymentPlanResult = new PaymentPlanSearchResult {
                TotalCount = TestPaymentPlans.Count
            };

            _paymentPlanSearchService.Setup(service => service.SearchPlansAsync(firstPaymentPlanCriteria))
            .ReturnsAsync(firstPaymentPlanResult);

            var secondPaymentPlanCriteria = new PaymentPlanSearchCriteria {
                Skip = 0, Take = ExpectedBatchSize
            };
            var secondPaymentPlanResult = new PaymentPlanSearchResult {
                TotalCount = TestPaymentPlans.Count, Results = TestPaymentPlans
            };

            _paymentPlanSearchService.Setup(service => service.SearchPlansAsync(secondPaymentPlanCriteria))
            .ReturnsAsync(secondPaymentPlanResult);

            Subscription[] actualSubscriptions = null;
            _subscriptionService.Setup(service => service.SaveSubscriptionsAsync(It.IsAny <Subscription[]>()))
            .Callback <Subscription[]>(subscriptions => actualSubscriptions = subscriptions)
            .Returns(Task.CompletedTask);

            PaymentPlan[] actualPaymentPlans = null;
            _paymentPlanService.Setup(service => service.SavePlansAsync(It.IsAny <PaymentPlan[]>()))
            .Callback <PaymentPlan[]>(paymentPlans => actualPaymentPlans = paymentPlans)
            .Returns(Task.CompletedTask);

            // Act
            string actualJson;

            using (var targetStream = new MemoryStream())
            {
                await _subscriptionExportImport.DoExportAsync(targetStream, IgnoreProgressInfo, _cancellationToken.Object);

                // DoExportAsync() closes targetStream, so extracting data from it is a bit tricky...
                var streamContents = targetStream.ToArray();
                using (var copiedStream = new MemoryStream(streamContents))
                    using (var textReader = new StreamReader(copiedStream))
                    {
                        actualJson = await textReader.ReadToEndAsync();
                    }
            }

            var importStream = GetStreamFromString(actualJson);
            await _subscriptionExportImport.DoImportAsync(importStream, IgnoreProgressInfo, _cancellationToken.Object);

            //Assert
            TestSubscriptions.Should().BeEquivalentTo(actualSubscriptions);
            TestPaymentPlans.Should().BeEquivalentTo(actualPaymentPlans);
        }
コード例 #21
0
        protected virtual IQueryable <SubscriptionEntity> BuildQuery(ISubscriptionRepository repository, SubscriptionSearchCriteria criteria)
        {
            var query = repository.Subscriptions;

            if (!string.IsNullOrEmpty(criteria.Number))
            {
                query = query.Where(x => x.Number == criteria.Number);
            }
            else if (criteria.Keyword != null)
            {
                query = query.Where(x => x.Number.Contains(criteria.Keyword));
            }

            if (criteria.CustomerId != null)
            {
                query = query.Where(x => x.CustomerId == criteria.CustomerId);
            }
            if (criteria.Statuses != null && criteria.Statuses.Any())
            {
                query = query.Where(x => criteria.Statuses.Contains(x.Status));
            }
            if (criteria.StoreId != null)
            {
                query = query.Where(x => criteria.StoreId == x.StoreId);
            }

            if (criteria.StartDate != null)
            {
                query = query.Where(x => x.CreatedDate >= criteria.StartDate);
            }

            if (criteria.EndDate != null)
            {
                query = query.Where(x => x.CreatedDate <= criteria.EndDate);
            }

            if (criteria.ModifiedSinceDate != null)
            {
                query = query.Where(x => x.ModifiedDate >= criteria.ModifiedSinceDate);
            }

            if (!string.IsNullOrEmpty(criteria.CustomerOrderId))
            {
                var order = _customerOrderService.GetByIdsAsync(new[] { criteria.CustomerOrderId }).GetAwaiter().GetResult().FirstOrDefault();
                if (order != null && !string.IsNullOrEmpty(order.SubscriptionId))
                {
                    query = query.Where(x => x.Id == order.SubscriptionId);
                }
                else
                {
                    query = query.Where(x => false);
                }
            }

            if (criteria.OuterId != null)
            {
                query = query.Where(x => x.OuterId == criteria.OuterId);
            }
            return(query);
        }
コード例 #22
0
        public virtual async Task <SubscriptionSearchResult> SearchSubscriptionsAsync(SubscriptionSearchCriteria criteria)
        {
            var cacheKey = CacheKey.With(GetType(), nameof(SearchSubscriptionsAsync), criteria.GetCacheKey());

            return(await _platformMemoryCache.GetOrCreateExclusiveAsync(cacheKey, async cacheEntry =>
            {
                cacheEntry.AddExpirationToken(SubscriptionSearchCacheRegion.CreateChangeToken());

                var retVal = AbstractTypeFactory <SubscriptionSearchResult> .TryCreateInstance();
                using (var repository = _subscriptionRepositoryFactory())
                {
                    repository.DisableChangesTracking();

                    var query = BuildQuery(repository, criteria);
                    var sortInfos = BuildSortExpression(criteria);

                    retVal.TotalCount = await query.CountAsync();

                    if (criteria.Take > 0)
                    {
                        var subscriptionsIds = await query.OrderBySortInfos(sortInfos).ThenBy(x => x.Id)
                                               .Select(x => x.Id)
                                               .Skip(criteria.Skip).Take(criteria.Take)
                                               .ToArrayAsync();

                        //Load subscriptions with preserving sorting order
                        var unorderedResults = await _subscriptionService.GetByIdsAsync(subscriptionsIds, criteria.ResponseGroup);
                        retVal.Results = unorderedResults.OrderBy(x => Array.IndexOf(subscriptionsIds, x.Id)).ToArray();
                    }

                    return retVal;
                }
            }));
        }
コード例 #23
0
        public GenericSearchResult <Subscription> SearchSubscriptions(SubscriptionSearchCriteria criteria)
        {
            var retVal = new GenericSearchResult <Subscription>();

            using (var repository = _subscriptionRepositoryFactory())
            {
                repository.DisableChangesTracking();

                var query = repository.Subscriptions;

                if (!string.IsNullOrEmpty(criteria.Number))
                {
                    query = query.Where(x => x.Number == criteria.Number);
                }
                else if (criteria.Keyword != null)
                {
                    query = query.Where(x => x.Number.Contains(criteria.Keyword));
                }

                if (criteria.CustomerId != null)
                {
                    query = query.Where(x => x.CustomerId == criteria.CustomerId);
                }
                if (criteria.Statuses != null && criteria.Statuses.Any())
                {
                    query = query.Where(x => criteria.Statuses.Contains(x.Status));
                }
                if (criteria.StoreId != null)
                {
                    query = query.Where(x => criteria.StoreId == x.StoreId);
                }

                if (criteria.StartDate != null)
                {
                    query = query.Where(x => x.CreatedDate >= criteria.StartDate);
                }

                if (criteria.EndDate != null)
                {
                    query = query.Where(x => x.CreatedDate <= criteria.EndDate);
                }

                if (criteria.ModifiedSinceDate != null)
                {
                    query = query.Where(x => x.ModifiedDate >= criteria.ModifiedSinceDate);
                }

                if (!string.IsNullOrEmpty(criteria.CustomerOrderId))
                {
                    var order = _customerOrderService.GetByIds(new[] { criteria.CustomerOrderId }).FirstOrDefault();
                    if (order != null && !string.IsNullOrEmpty(order.SubscriptionId))
                    {
                        query = query.Where(x => x.Id == order.SubscriptionId);
                    }
                    else
                    {
                        query = query.Where(x => false);
                    }
                }

                if (criteria.OuterId != null)
                {
                    query = query.Where(x => x.OuterId == criteria.OuterId);
                }

                var sortInfos = criteria.SortInfos;
                if (sortInfos.IsNullOrEmpty())
                {
                    sortInfos = new[] { new SortInfo {
                                            SortColumn = ReflectionUtility.GetPropertyName <Subscription>(x => x.CreatedDate), SortDirection = SortDirection.Descending
                                        } };
                }
                query = query.OrderBySortInfos(sortInfos);

                retVal.TotalCount = query.Count();

                var subscriptionsIds = query.Skip(criteria.Skip)
                                       .Take(criteria.Take)
                                       .ToArray()
                                       .Select(x => x.Id)
                                       .ToArray();

                //Load subscriptions with preserving sorting order
                retVal.Results = GetByIds(subscriptionsIds, criteria.ResponseGroup).OrderBy(x => Array.IndexOf(subscriptionsIds, x.Id)).ToArray();
                return(retVal);
            }
        }
コード例 #24
0
        public async Task <IPagedList <Subscription> > SearchSubscriptionsAsync(SubscriptionSearchCriteria criteria)
        {
            var workContext = _workContextAccessor.WorkContext;

            return(await InnerSearchSubscriptionsAsync(criteria, workContext));
        }
コード例 #25
0
        protected virtual async Task <IPagedList <Subscription> > InnerSearchSubscriptionsAsync(SubscriptionSearchCriteria criteria, WorkContext workContext)
        {
            if (criteria == null)
            {
                throw new ArgumentNullException(nameof(criteria));
            }
            var result = await _subscriptionApi.SearchSubscriptionsAsync(criteria.ToSearchCriteriaDto());

            return(new StaticPagedList <Subscription>(result.Subscriptions.Select(x => x.ToSubscription(workContext.AllCurrencies, workContext.CurrentLanguage)),
                                                      criteria.PageNumber, criteria.PageSize, result.TotalCount.Value));
        }
コード例 #26
0
        public virtual async Task <GenericSearchResult <Subscription> > SearchSubscriptionsAsync(SubscriptionSearchCriteria criteria)
        {
            var cacheKey = CacheKey.With(GetType(), nameof(SearchSubscriptionsAsync), criteria.GetCacheKey());

            return(await PlatformMemoryCache.GetOrCreateExclusiveAsync(cacheKey, async cacheEntry =>
            {
                cacheEntry.AddExpirationToken(SubscriptionSearchCacheRegion.CreateChangeToken());

                var retVal = new GenericSearchResult <Subscription>();
                using (var repository = SubscriptionRepositoryFactory())
                {
                    repository.DisableChangesTracking();

                    var query = await GetSubscriptionsQueryForCriteria(repository, criteria);

                    retVal.TotalCount = await query.CountAsync();

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

                        //Load subscriptions with preserving sorting order
                        var unorderedResults = await GetByIdsAsync(subscriptionsIds, criteria.ResponseGroup);
                        retVal.Results = unorderedResults.OrderBy(x => Array.IndexOf(subscriptionsIds, x.Id)).ToArray();
                    }

                    return retVal;
                }
            }));
        }
コード例 #27
0
 public static subscriptionDto.SubscriptionSearchCriteria ToSearchCriteriaDto(this SubscriptionSearchCriteria criteria)
 {
     return(SubscriptionConverterInstance.ToSearchCriteriaDto(criteria));
 }
コード例 #28
0
        protected virtual async Task <IQueryable <SubscriptionEntity> > GetSubscriptionsQueryForCriteria(
            ISubscriptionRepository repository, SubscriptionSearchCriteria criteria)
        {
            var query = repository.Subscriptions;

            if (!string.IsNullOrEmpty(criteria.Number))
            {
                query = query.Where(x => x.Number == criteria.Number);
            }
            else if (criteria.Keyword != null)
            {
                query = query.Where(x => x.Number.Contains(criteria.Keyword));
            }

            if (criteria.CustomerId != null)
            {
                query = query.Where(x => x.CustomerId == criteria.CustomerId);
            }
            if (criteria.Statuses != null && criteria.Statuses.Any())
            {
                query = query.Where(x => criteria.Statuses.Contains(x.Status));
            }
            if (criteria.StoreId != null)
            {
                query = query.Where(x => criteria.StoreId == x.StoreId);
            }

            if (criteria.StartDate != null)
            {
                query = query.Where(x => x.CreatedDate >= criteria.StartDate);
            }

            if (criteria.EndDate != null)
            {
                query = query.Where(x => x.CreatedDate <= criteria.EndDate);
            }

            if (criteria.ModifiedSinceDate != null)
            {
                query = query.Where(x => x.ModifiedDate >= criteria.ModifiedSinceDate);
            }

            if (!string.IsNullOrEmpty(criteria.CustomerOrderId))
            {
                var order = (await _customerOrderService.GetByIdsAsync(new[] { criteria.CustomerOrderId })).FirstOrDefault();
                if (order != null && !string.IsNullOrEmpty(order.SubscriptionId))
                {
                    query = query.Where(x => x.Id == order.SubscriptionId);
                }
                else
                {
                    query = query.Where(x => false);
                }
            }

            if (criteria.OuterId != null)
            {
                query = query.Where(x => x.OuterId == criteria.OuterId);
            }

            var sortInfos = criteria.SortInfos;

            if (sortInfos.IsNullOrEmpty())
            {
                sortInfos = new[] { new SortInfo {
                                        SortColumn = ReflectionUtility.GetPropertyName <Subscription>(x => x.CreatedDate), SortDirection = SortDirection.Descending
                                    } };
            }
            query = query.OrderBySortInfos(sortInfos);

            return(query);
        }
コード例 #29
0
        public virtual subscriptionDto.SubscriptionSearchCriteria ToSearchCriteriaDto(SubscriptionSearchCriteria criteria)
        {
            var result = new subscriptionDto.SubscriptionSearchCriteria();

            result.InjectFrom(criteria);

            result.Skip = criteria.Start;
            result.Take = criteria.PageSize;
            result.Sort = criteria.Sort;

            return(result);
        }
コード例 #30
0
        public async Task <ActionResult <SubscriptionSearchResult> > Search([FromBody] SubscriptionSearchCriteria searchCriteria)
        {
            var searchResult = await _subscriptionSearchService.SearchAsync(searchCriteria);

            return(Ok(searchResult));
        }