Beispiel #1
0
        public virtual async Task SaveChangesAsync(SitemapItem[] sitemapItems)
        {
            if (sitemapItems == null)
            {
                throw new ArgumentNullException(nameof(sitemapItems));
            }

            using (var repository = RepositoryFactory())
            {
                var pkMap         = new PrimaryKeyResolvingMap();
                var itemsIds      = sitemapItems.Select(x => x.Id).Where(x => x != null).Distinct().ToArray();
                var existEntities = await repository.SitemapItems.Where(s => itemsIds.Contains(s.Id)).ToArrayAsync();

                foreach (var sitemapItem in sitemapItems)
                {
                    var changedEntity = AbstractTypeFactory <SitemapItemEntity> .TryCreateInstance().FromModel(sitemapItem, pkMap);

                    var existEntity = existEntities.FirstOrDefault(x => x.Id == sitemapItem.Id);
                    if (existEntity != null)
                    {
                        changedEntity.Patch(existEntity);
                    }
                    else
                    {
                        repository.Add(changedEntity);
                    }
                }

                await repository.UnitOfWork.CommitAsync();

                pkMap.ResolvePrimaryKeys();
            }

            SitemapItemSearchCacheRegion.ExpireRegion();
        }
Beispiel #2
0
        public virtual async Task RemoveAsync(string[] itemIds)
        {
            if (itemIds == null)
            {
                throw new ArgumentNullException(nameof(itemIds));
            }

            using (var repository = RepositoryFactory())
            {
                var sitemapItemEntities = await repository.SitemapItems.Where(i => itemIds.Contains(i.Id)).ToArrayAsync();

                if (sitemapItemEntities.Any())
                {
                    foreach (var sitemapItemEntity in sitemapItemEntities)
                    {
                        repository.Remove(sitemapItemEntity);
                    }
                    await repository.UnitOfWork.CommitAsync();
                }
            }

            SitemapItemSearchCacheRegion.ExpireRegion();
        }
Beispiel #3
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;
                }
            }));
        }