private ProductExplorerViewModel GetExplorerModel(int?categoryId) { ProductExplorerViewModel model = new ProductExplorerViewModel(); model.CurrentCategoryId = categoryId; IEnumerable <CategoryDto> categoryList = null; using (IUnitOfWork uow = UnitOfWorkFactory.Instance.Start(DataStoreResolver.CRMDataStoreKey)) { CRM.Component.CategoryFacade facade = new CRM.Component.CategoryFacade(uow); categoryList = facade.RetrieveCategoryTree(WebContext.Current.ApplicationOption.GlobalProductCatalogId, new CategoryConverter(CurrentLanguageId)); } if (categoryList != null) { CategoryTreeBuilder treeBuilder = new CategoryTreeBuilder(categoryList); model.CategoryTree = treeBuilder.CategoryTree; } else { model.CategoryTree = new CategoryNode(); } return(model); }
async Task BuildIndexCategory() { FsBuilder.EnsureDirectoryEmpty("categories"); var(tree, map) = CategoryTreeBuilder.BuildFromPosts(Data); Queue <CategoryTree.Node> q = new Queue <CategoryTree.Node>(); foreach (var v in tree.Root.Children.Values) { q.Enqueue(v); } while (q.Count > 0) { var node = q.Dequeue(); string subdir = Path.Join("categories", Path.Combine(node.Category.Items.Select(NameUtility.Encode).ToArray())); PagingProvider <string> paging = new PagingProvider <string>(Path.Join(RootPath, subdir)); await paging.Build(map[node].Select(x => x.Id).ToArray(), PagingConfig).ConfigureAwait(false); foreach (var v in node.Children.Values) { q.Enqueue(v); } } using var st = FsBuilder.GetFileRewriteStream("categories/all.json"); await JsonSerializer.SerializeAsync(st, tree).ConfigureAwait(false); }
async Task BuildIndexCategory(IList <Post> data) { FSStaticBuilder.EnsureDirectoryEmpty(Paths.GetCategoryRoot(RootPath)); var(tree, map) = await CategoryTreeBuilder.BuildFromPosts(data.ToAsyncEnumerable()); Queue <CategoryTree.CategoryTreeNode> q = new Queue <CategoryTree.CategoryTreeNode>(); foreach (var v in tree.Root.Children.Values) { q.Enqueue(v); } while (q.Count > 0) { var node = q.Dequeue(); await BuildDataIdList(map[node].Select(x => x.Id).ToArray(), Paths.GetCategoryRoot(RootPath, node.Category)).ConfigureAwait(false); foreach (var v in node.Children.Values) { q.Enqueue(v); } } await using var st = FSStaticBuilder.GetFileRewriteStream(Paths.GetCategoryMetadata(RootPath)); await JsonSerializer.SerializeAsync(st, tree).ConfigureAwait(false); }
public void RemoveProductFromCategory(Guid categoryId, IList <Guid> productIdsToRemove) { using (var context = new InstantStoreDataContext()) { if (productIdsToRemove != null && productIdsToRemove.Any()) { foreach (var productId in productIdsToRemove) { var productMappings = context.ProductToCategories.Where(x => x.CategoryId == categoryId && productId == x.ProductId && x.GroupId == null); context.ProductToCategories.DeleteAllOnSubmit(productMappings); } context.SubmitChanges(); CategoryTreeBuilder.RebuidCategoryTreeGroups(context, categoryId); } } }
public void AssignProductsToCategory(IList <Guid> products, Guid contentPageId) { using (var context = new InstantStoreDataContext()) { context.ProductToCategories.InsertAllOnSubmit(products.Select(x => new ProductToCategory { Id = Guid.NewGuid(), ProductId = x, CategoryId = contentPageId, UpdateTime = DateTime.Now })); // assign to all parents context.SubmitChanges(); CategoryTreeBuilder.RebuidCategoryTreeGroups(context, contentPageId); } }
public void DeletePage(Guid id) { using (var context = new InstantStoreDataContext()) { var page = context.ContentPages.FirstOrDefault(x => x.Id == id); if (page != null) { var attachmentLinks = context.ContentPageAttachments.Where(x => x.PageId == id); context.ContentPageAttachments.DeleteAllOnSubmit(attachmentLinks); context.Attachments.DeleteAllOnSubmit(attachmentLinks.Select(x => x.Attachment)); context.ContentPages.DeleteOnSubmit(page); context.SubmitChanges(); if (page.ParentId != null) { CategoryTreeBuilder.RebuidCategoryTreeGroups(context, page.ParentId.Value); } } } }
public void UpdateContentPage(ContentPage contentPage, IList <Guid> attachmentIds) { using (var context = new InstantStoreDataContext()) { var contentPageOriginal = context.ContentPages.FirstOrDefault(x => x.Id == contentPage.Id); if (contentPageOriginal == null) { throw new ModelValidationException("UpdateContentPage.OriginalPageDoesNotExists"); } Guid?oldParentId = contentPageOriginal.ParentId; contentPageOriginal.Name = contentPage.Name; contentPageOriginal.Text = contentPage.Text; contentPageOriginal.ParentId = contentPage.ParentId; contentPageOriginal.ShowInMenu = contentPage.ShowInMenu; UpdateAttachmentName(contentPageOriginal, attachmentIds, context); context.SubmitChanges(); if (contentPageOriginal.IsCategory()) { if (oldParentId != contentPageOriginal.ParentId && oldParentId != null) { // Update the old parent category CategoryTreeBuilder.UpdateCategoryGropus(oldParentId.Value, context); // Update both tree nodes & up for old and new parents. CategoryTreeBuilder.RebuidCategoryTreeGroups(context, oldParentId.Value); } if (contentPageOriginal.ParentId != null) { CategoryTreeBuilder.RebuidCategoryTreeGroups(context, contentPageOriginal.Id); } } } }
public async Task <CategoryTree> GetCategories(CancellationToken cancellationToken = default) { var cates = DbSet.AsQueryable().Select(x => x.Category).Distinct().AsAsyncEnumerable(); return(await CategoryTreeBuilder.Build(cates.Select(x => Category.Parse(x)), cancellationToken)); }
public Guid CloneProduct(Guid productId, Guid parentId) { if (productId == Guid.Empty) { return(Guid.Empty); } using (var context = new InstantStoreDataContext()) { var product = context.Products.FirstOrDefault(x => x.VersionId == productId); if (product == null) { throw new ModelValidationException("Model.Invalid:ProductDoesNotExists"); } var pageCategory = context.ContentPages.FirstOrDefault(x => x.Id == parentId); if (pageCategory == null) { throw new ModelValidationException("Model.Invalid:ContentPageDoesNotExists"); } if (!pageCategory.IsCategory()) { throw new ModelValidationException("Model.Invalid:PageIsNotCategory"); } // Build the clone var clone = new Product() { Id = Guid.NewGuid(), CashAccepted = product.CashAccepted, Currency = product.Currency, CustomAttributesTemplateId = product.CustomAttributesTemplateId, Description = product.Description, Image = product.Image, IsAvailable = product.IsAvailable, MainImageId = product.MainImageId, Name = product.Name, PriceCurrencyId = product.PriceCurrencyId, PriceValueCash = product.PriceValueCash, PriceValueCashless = product.PriceValueCashless, PropertyTemplate = product.PropertyTemplate, Version = 1, VersionId = Guid.NewGuid() }; const string endingStirng = " - Копия "; int cloneEndingIndex = clone.Name.IndexOf(endingStirng); if (cloneEndingIndex > -1) { int indexValue = 0; string indexString = clone.Name.Substring(cloneEndingIndex + endingStirng.Length); if (!string.IsNullOrEmpty(indexString) && int.TryParse(indexString, out indexValue)) { clone.Name = clone.Name.Substring(0, cloneEndingIndex) + endingStirng + indexValue.ToString(); } else { clone.Name = clone.Name + endingStirng + "1"; } } else { clone.Name = clone.Name + endingStirng + "1"; } // Updating the tables context.Products.InsertOnSubmit(clone); // Clone images var images = context.Images.Where(x => x.ProductId == product.Id); if (images.Any()) { foreach (var image in images) { var clonedImage = new Image { Id = Guid.NewGuid(), ProductId = clone.Id, ImageContentType = image.ImageContentType, Image1 = image.Image1 }; context.Images.InsertOnSubmit(clonedImage); var thumbnail = context.ImageThumbnails.FirstOrDefault(x => x.Id == image.Id); if (thumbnail != null) { var clonedThumbnail = new ImageThumbnail { Id = clonedImage.Id, Image = clonedImage, LargeThumbnail = thumbnail.LargeThumbnail, SmallThumbnail = thumbnail.SmallThumbnail }; context.ImageThumbnails.InsertOnSubmit(clonedThumbnail); } } } // Place product in to the same category as original. context.ProductToCategories.InsertOnSubmit(new ProductToCategory { Id = Guid.NewGuid(), CategoryId = parentId, ProductId = clone.VersionId, UpdateTime = DateTime.Now }); CategoryTreeBuilder.RebuidCategoryTreeGroups(context, parentId); context.SubmitChanges(); return(clone.VersionId); } }
public void UpdateOrCreateNewProduct(Product productToUpdate, Guid parentId, IList <Guid> images, Guid?prototypeTemplateId, IList <CustomProperty> attributes, int position) { using (var context = new InstantStoreDataContext()) { var product = productToUpdate.Id != Guid.Empty ? context.Products.FirstOrDefault(x => x.VersionId == productToUpdate.Id) : null; if (product == null) { productToUpdate.Id = Guid.NewGuid(); productToUpdate.VersionId = Guid.NewGuid(); productToUpdate.MainImageId = images != null && images.Any() ? images.First() : (Guid?)null; context.Products.InsertOnSubmit(productToUpdate); context.SubmitChanges(); product = productToUpdate; while (parentId != Guid.Empty) { var parent = context.ContentPages.First(x => x.Id == parentId); if (parent.CategoryId != null) { context.ProductToCategories.InsertOnSubmit(new ProductToCategory { Id = Guid.NewGuid(), CategoryId = parentId, ProductId = productToUpdate.VersionId, UpdateTime = DateTime.Now }); context.SubmitChanges(); CategoryTreeBuilder.RebuidCategoryTreeGroups(context, parentId); break; } parentId = parent.ParentId ?? Guid.Empty; } if (images != null) { foreach (var imageId in images) { var image = context.Images.FirstOrDefault(x => x.Id == imageId); if (image != null) { image.ProductId = productToUpdate.Id; } } } AddAttributes(productToUpdate, prototypeTemplateId, attributes, context); } else { product.Name = productToUpdate.Name; product.Description = productToUpdate.Description; product.IsAvailable = productToUpdate.IsAvailable; product.PriceCurrencyId = productToUpdate.PriceCurrencyId; product.PriceValueCash = productToUpdate.PriceValueCash; product.PriceValueCashless = productToUpdate.PriceValueCashless; var productImages = context.Images.Where(x => x.ProductId == product.Id).ToList(); var productImageIds = productImages.Select(x => x.Id); var productThumbnails = context.ImageThumbnails.Where(x => productImageIds.Contains(x.Id)).ToList(); if (images != null) { var imageIdsToDelete = productImageIds.Except(images); var imagesToDelete = productImages.Where(x => imageIdsToDelete.Contains(x.Id)); var thumbnailsToDelete = productThumbnails.Where(x => imageIdsToDelete.Contains(x.Id)); context.Images.DeleteAllOnSubmit(imagesToDelete); context.ImageThumbnails.DeleteAllOnSubmit(thumbnailsToDelete); var imageIdsToInsert = images.Except(productImageIds); var imagesToInsert = context.Images.Where(x => imageIdsToInsert.Contains(x.Id)); foreach (var imageToUpdate in imagesToInsert) { imageToUpdate.ProductId = product.Id; } if (product.MainImageId == null || product.MainImageId == Guid.Empty || imageIdsToDelete.Contains(product.MainImageId.Value)) { product.MainImageId = imageIdsToInsert.Any() ? imageIdsToInsert.First() : (Guid?)null; } } else { var imageIdsToDelete = productImageIds; var imagesToDelete = productImages.Where(x => imageIdsToDelete.Contains(x.Id)); var thumbnailsToDelete = productThumbnails.Where(x => imageIdsToDelete.Contains(x.Id)); context.Images.DeleteAllOnSubmit(imagesToDelete); context.ImageThumbnails.DeleteAllOnSubmit(thumbnailsToDelete); product.MainImageId = null; } if (product.CustomAttributesTemplateId != null && (prototypeTemplateId == null || prototypeTemplateId == Guid.Empty)) { product.CustomAttributesTemplateId = null; } AddAttributes(product, prototypeTemplateId, attributes, context); } var productPrimaryCategories = context.ProductToCategories.Where(x => x.ProductId == product.Id); foreach (var productPrimaryCategory in productPrimaryCategories) { productPrimaryCategory.Index = position; } context.SubmitChanges(); } }