protected virtual async Task <IDictionary <string, Category> > PreloadCategoriesAsync(string catalogId) { var cacheKey = CacheKey.With(GetType(), "PreloadCategories", catalogId); return(await _platformMemoryCache.GetOrCreateExclusiveAsync(cacheKey, async (cacheEntry) => { cacheEntry.AddExpirationToken(CategoryCacheRegion.CreateChangeToken()); cacheEntry.AddExpirationToken(CatalogCacheRegion.CreateChangeToken()); CategoryEntity[] entities; using (var repository = _repositoryFactory()) { repository.DisableChangesTracking(); entities = await repository.GetCategoriesByIdsAsync(repository.Categories.Select(x => x.Id).ToArray(), CategoryResponseGroup.Full); } var result = entities.Select(x => x.ToModel(AbstractTypeFactory <Category> .TryCreateInstance())) .ToDictionary(x => x.Id, StringComparer.OrdinalIgnoreCase) .WithDefaultValue(null); await LoadDependenciesAsync(result.Values, result); ApplyInheritanceRules(result.Values); // Fill outlines for categories _outlineService.FillOutlinesForObjects(result.Values, catalogId); var objectsWithSeo = new List <ISeoSupport>(result.Values); var outlineItems = result.Values.Where(c => c.Outlines != null).SelectMany(c => c.Outlines.SelectMany(o => o.Items)); objectsWithSeo.AddRange(outlineItems); await _seoService.LoadSeoForObjectsAsync(objectsWithSeo.ToArray()); return result; })); }
public virtual async Task DeleteAsync(string[] categoryIds) { var categories = await GetByIdsAsync(categoryIds, CategoryResponseGroup.Info.ToString()); var changedEntries = categories .Select(c => new GenericChangedEntry <Category>(c, EntryState.Deleted)) .ToList(); using (var repository = _repositoryFactory()) { await _eventPublisher.Publish(new CategoryChangingEvent(changedEntries)); await repository.RemoveCategoriesAsync(categoryIds); await repository.UnitOfWork.CommitAsync(); CategoryCacheRegion.ExpireRegion(); await _eventPublisher.Publish(new CategoryChangedEvent(changedEntries)); } }
public virtual async Task SaveChangesAsync(Category[] categories) { var pkMap = new PrimaryKeyResolvingMap(); var changedEntries = new List <GenericChangedEntry <Category> >(); await ValidateCategoryPropertiesAsync(categories); using (var repository = _repositoryFactory()) { var dbExistCategories = await repository.GetCategoriesByIdsAsync(categories.Where(x => !x.IsTransient()).Select(x => x.Id).ToArray(), CategoryResponseGroup.Full); foreach (var category in categories) { var originalEntity = dbExistCategories.FirstOrDefault(x => x.Id == category.Id); var modifiedEntity = AbstractTypeFactory <CategoryEntity> .TryCreateInstance().FromModel(category, pkMap); if (originalEntity != null) { changedEntries.Add(new GenericChangedEntry <Category>(category, originalEntity.ToModel(AbstractTypeFactory <Category> .TryCreateInstance()), EntryState.Modified)); modifiedEntity.Patch(originalEntity); //Force set ModifiedDate property to mark a product changed. Special for partial update cases when product table not have changes originalEntity.ModifiedDate = DateTime.UtcNow; } else { repository.Add(modifiedEntity); changedEntries.Add(new GenericChangedEntry <Category>(category, EntryState.Added)); } } await _eventPublisher.Publish(new CategoryChangingEvent(changedEntries)); await repository.UnitOfWork.CommitAsync(); pkMap.ResolvePrimaryKeys(); CategoryCacheRegion.ExpireRegion(); await _eventPublisher.Publish(new CategoryChangedEvent(changedEntries)); } }