コード例 #1
0
        private async Task LoadSitemapRecords(Store store, Sitemap sitemap, string baseUrl, Action <ExportImportProgressInfo> progressCallback = null)
        {
            var recordsLimitPerFile = SettingsManager.GetValue("Sitemap.RecordsLimitPerFile", 10000);
            var filenameSeparator   = SettingsManager.GetValue("Sitemap.FilenameSeparator", "--");

            var sitemapItemSearchCriteria = new SitemapItemSearchCriteria
            {
                SitemapId = sitemap.Id,
                Skip      = 0,
                Take      = int.MaxValue
            };

            sitemap.Items = (await SitemapItemService.SearchAsync(sitemapItemSearchCriteria)).Results;
            foreach (var recordProvider in SitemapItemRecordProviders)
            {
                //Log exceptions to prevent fail whole sitemap.xml generation
                try
                {
                    await recordProvider.LoadSitemapItemRecordsAsync(store, sitemap, baseUrl, progressCallback);
                }
                catch (Exception ex)
                {
                    Logger.LogError(ex, $"Failed to load sitemap item records for store #{store.Id}, sitemap #{sitemap.Id} and baseURL '{baseUrl}'");
                }
            }
            sitemap.PagedLocations.Clear();
            var totalRecordsCount = sitemap.Items.SelectMany(x => x.ItemsRecords).GroupBy(x => x.Url).Count();
            var pagesCount        = totalRecordsCount > 0 ? (int)Math.Ceiling(totalRecordsCount / (double)recordsLimitPerFile) : 0;

            for (var i = 1; i <= pagesCount; i++)
            {
                sitemap.PagedLocations.Add(new SitemapLocation(sitemap.Location, i, filenameSeparator).ToString(pagesCount > 1));
            }
        }
コード例 #2
0
        public async Task TestDataExport()
        {
            // Arrange
            var sitemapSearchCriteria = new SitemapSearchCriteria
            {
                Skip = 0,
                Take = int.MaxValue
            };
            var sitemapSearchResult = new GenericSearchResult <Sitemap>
            {
                TotalCount = TestSitemaps.Count,
                Results    = TestSitemaps
            };

            _sitemapService.Setup(service => service.SearchAsync(sitemapSearchCriteria))
            .ReturnsAsync(sitemapSearchResult);

            var sitemapItemSearchCriteria = new SitemapItemSearchCriteria
            {
                Skip = 0,
                Take = int.MaxValue
            };
            var sitemapItemsSearchResult = new GenericSearchResult <SitemapItem>
            {
                TotalCount = TestSitemapItems.Count,
                Results    = TestSitemapItems
            };

            _sitemapItemService.Setup(service => service.SearchAsync(sitemapItemSearchCriteria))
            .ReturnsAsync(sitemapItemsSearchResult);

            string expectedJson;

            using (var resourceStream = ReadEmbeddedResource("Resources.SerializedSitemapsData.json"))
                using (var textReader = new StreamReader(resourceStream))
                {
                    expectedJson = await textReader.ReadToEndAsync();
                }

            // Act
            string actualJson;

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

                var targetStreamContents = targetStream.ToArray();
                using (var copiedStream = new MemoryStream(targetStreamContents))
                    using (var textReader = new StreamReader(copiedStream))
                    {
                        actualJson = textReader.ReadToEnd();
                    }
            }

            // Assert
            var expectedJObject = JsonConvert.DeserializeObject <JObject>(expectedJson);
            var actualJObject   = JsonConvert.DeserializeObject <JObject>(actualJson);

            Assert.True(JToken.DeepEquals(expectedJObject, actualJObject));
        }
コード例 #3
0
        public async Task <IActionResult> SearchSitemapItems([FromBody] SitemapItemSearchCriteria request)
        {
            if (request == null)
            {
                return(BadRequest("request is null"));
            }

            var searchSitemapItemResponse = await _sitemapItemService.SearchAsync(request);

            return(Ok(searchSitemapItemResponse));
        }
コード例 #4
0
        public virtual async Task <SitemapItemsSearchResult> SearchAsync(SitemapItemSearchCriteria criteria)
        {
            if (criteria == null)
            {
                throw new ArgumentNullException(nameof(criteria));
            }

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

            using (var repository = _repositoryFactory())
            {
                var query = repository.SitemapItems;
                if (!string.IsNullOrEmpty(criteria.SitemapId))
                {
                    query = query.Where(x => x.SitemapId == criteria.SitemapId);
                }

                if (criteria.ObjectTypes != null)
                {
                    query = query.Where(i =>
                                        criteria.ObjectTypes.Contains(i.ObjectType, StringComparer.OrdinalIgnoreCase));
                }

                if (!string.IsNullOrEmpty(criteria.ObjectType))
                {
                    query = query.Where(i => i.ObjectType.EqualsInvariant(criteria.ObjectType));
                }

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

                query             = query.OrderBySortInfos(sortInfos);
                result.TotalCount = await query.CountAsync();

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

                    result.Results = (await _sitemapItemService.GetByIdsAsync(sitemapItemsIds)).AsQueryable().OrderBySortInfos(sortInfos).ToArray();
                }
            }
            return(result);
        }
コード例 #5
0
        public virtual async Task <GenericSearchResult <SitemapItem> > SearchAsync(SitemapItemSearchCriteria criteria)
        {
            if (criteria == null)
            {
                throw new ArgumentNullException(nameof(criteria));
            }

            var cacheKey = CacheKey.With(GetType(), nameof(SearchAsync), criteria.GetCacheKey());

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

                using (var repository = RepositoryFactory())
                {
                    var searchResponse = new GenericSearchResult <SitemapItem>();
                    var query = repository.SitemapItems;
                    if (!string.IsNullOrEmpty(criteria.SitemapId))
                    {
                        query = query.Where(x => x.SitemapId == criteria.SitemapId);
                    }

                    if (criteria.ObjectTypes != null)
                    {
                        query = query.Where(i =>
                                            criteria.ObjectTypes.Contains(i.ObjectType, StringComparer.OrdinalIgnoreCase));
                    }

                    if (!string.IsNullOrEmpty(criteria.ObjectType))
                    {
                        query = query.Where(i => i.ObjectType.EqualsInvariant(criteria.ObjectType));
                    }

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

                    query = query.OrderBySortInfos(sortInfos);
                    searchResponse.TotalCount = await query.CountAsync();

                    if (criteria.Take > 0)
                    {
                        var matchingSitemapItems = await query.Skip(criteria.Skip).Take(criteria.Take).ToArrayAsync();
                        foreach (var sitemapItemEntity in matchingSitemapItems)
                        {
                            var sitemapItem = AbstractTypeFactory <SitemapItem> .TryCreateInstance();
                            if (sitemapItem != null)
                            {
                                searchResponse.Results.Add(sitemapItemEntity.ToModel(sitemapItem));
                            }
                        }
                    }

                    return searchResponse;
                }
            }));
        }
コード例 #6
0
        public async Task <ActionResult <SitemapItemsSearchResult> > SearchSitemapItems([FromBody] SitemapItemSearchCriteria request)
        {
            if (request == null)
            {
                return(BadRequest("request is null"));
            }

            var result = await _sitemapItemSearchService.SearchAsync(request);

            return(Ok(result));
        }