public async Task <bool> Update(ServiceAggregate serviceAggregate) { if (serviceAggregate == null) { throw new ArgumentNullException(nameof(serviceAggregate)); } using (var transaction = await _context.Database.BeginTransactionAsync().ConfigureAwait(false)) { try { var record = await _context.Services.Include(s => s.Comments).FirstOrDefaultAsync(s => s.Id == serviceAggregate.Id).ConfigureAwait(false); if (record == null) { transaction.Rollback(); return(false); } record.AverageScore = serviceAggregate.AverageScore; record.Description = serviceAggregate.Description; record.Name = serviceAggregate.Name; record.Price = serviceAggregate.Price; record.ShopId = serviceAggregate.ShopId; record.TotalScore = serviceAggregate.TotalScore; record.UpdateDateTime = serviceAggregate.UpdateDateTime; var comments = serviceAggregate.Comments == null ? new List <ServiceComment>() : serviceAggregate.Comments; var commentIds = comments.Select(c => c.Id); if (record.Comments != null) // Update the comments. { var commentsToUpdate = record.Comments.Where(c => commentIds.Contains(c.Id)); var commentsToRemove = record.Comments.Where(c => !commentIds.Contains(c.Id)); var existingCommentIds = record.Comments.Select(c => c.Id); var commentsToAdd = comments.Where(c => !existingCommentIds.Contains(c.Id)); foreach (var commentToUpdate in commentsToUpdate) { var comment = comments.First(c => c.Id == commentToUpdate.Id); commentToUpdate.Score = comment.Score; commentToUpdate.Subject = comment.Subject; commentToUpdate.UpdateDateTime = comment.UpdateDateTime; commentToUpdate.Content = comment.Content; } foreach (var commentToRemove in commentsToRemove) { _context.Comments.Remove(commentToRemove); } foreach (var commentToAdd in commentsToAdd) { var rec = new Models.Comment { Id = commentToAdd.Id, Content = commentToAdd.Content, Score = commentToAdd.Score, CreateDateTime = commentToAdd.CreateDateTime, ServiceId = serviceAggregate.Id, UpdateDateTime = commentToAdd.UpdateDateTime, Subject = commentToAdd.Subject }; _context.Comments.Add(rec); } } var tags = new List <Models.ServiceTag>(); if (serviceAggregate.Tags != null && serviceAggregate.Tags.Any()) // Update the tags. { var tagNames = serviceAggregate.Tags; var connectedTags = _context.Tags.Where(t => tagNames.Any(tn => t.Name == tn)); foreach (var connectedTag in connectedTags) { tags.Add(new Models.ServiceTag { Id = Guid.NewGuid().ToString(), TagName = connectedTag.Name, ServiceId = serviceAggregate.Id }); } var connectedTagNames = (await connectedTags.Select(t => t.Name).ToListAsync().ConfigureAwait(false)); foreach (var notExistingTagName in tagNames.Where(tn => !connectedTagNames.Contains(tn))) { var newTag = new Models.Tag { Name = notExistingTagName, Description = notExistingTagName }; _context.Tags.Add(newTag); tags.Add(new Models.ServiceTag { Id = Guid.NewGuid().ToString(), TagName = notExistingTagName, ServiceId = serviceAggregate.Id, Tag = newTag }); } } if (serviceAggregate.PartialImagesUrl != null && serviceAggregate.PartialImagesUrl.Any()) // Update the images. { record.Images = serviceAggregate.PartialImagesUrl.Select(i => new Models.ServiceImage { Id = Guid.NewGuid().ToString(), PartialPath = i } ).ToList(); } if (serviceAggregate.Occurrence != null) // Update the occurrence. { var days = new List <Models.ServiceOccurrenceDay>(); if (serviceAggregate.Occurrence.Days != null) { days = serviceAggregate.Occurrence.Days.Select(d => new Models.ServiceOccurrenceDay { Id = Guid.NewGuid().ToString(), DayId = ((int)d).ToString() }).ToList(); } record.Occurrence = new Models.ServiceOccurrence { Id = serviceAggregate.Occurrence.Id, StartDate = serviceAggregate.Occurrence.StartDate, EndDate = serviceAggregate.Occurrence.EndDate, StartTime = serviceAggregate.Occurrence.StartTime, EndTime = serviceAggregate.Occurrence.EndTime, Days = days }; } record.Tags = tags; await _context.SaveChangesAsync().ConfigureAwait(false); transaction.Commit(); return(true); } catch { transaction.Rollback(); return(false); } } }
public async Task <bool> Add(ShopAggregate shop) { using (var transaction = await _context.Database.BeginTransactionAsync().ConfigureAwait(false)) { try { var record = shop.ToModel(); var tags = new List <Models.ShopTag>(); var filters = new List <Models.Filter>(); var productCategories = new List <Models.ProductCategory>(); if (shop.TagNames != null && shop.TagNames.Any()) // Add tags { var tagNames = shop.TagNames; var connectedTags = _context.Tags.Where(t => tagNames.Any(tn => t.Name == tn)); foreach (var connectedTag in connectedTags) { tags.Add(new Models.ShopTag { Id = Guid.NewGuid().ToString(), TagName = connectedTag.Name, ShopId = shop.Id }); } var connectedTagNames = (await connectedTags.Select(t => t.Name).ToListAsync().ConfigureAwait(false)); foreach (var notExistingTagName in tagNames.Where(tn => !connectedTagNames.Contains(tn))) { var newTag = new Models.Tag { Name = notExistingTagName, Description = notExistingTagName }; _context.Tags.Add(newTag); tags.Add(new Models.ShopTag { Id = Guid.NewGuid().ToString(), TagName = notExistingTagName, ShopId = shop.Id, Tag = newTag }); } } if (shop.ShopFilters != null) { foreach (var shopFilter in shop.ShopFilters) { filters.Add(new Models.Filter { Id = shopFilter.Id, Name = shopFilter.Name, ShopId = shop.Id, Values = shopFilter.Values == null ? new List <Models.FilterValue>() : shopFilter.Values.Select(v => new Models.FilterValue { Id = v.Id, Content = v.Content, CreateDateTime = v.CreateDateTime, UpdateDateTime = v.UpdateDateTime, FilterId = shopFilter.Id }).ToList() }); } } if (shop.ProductCategories != null) { foreach (var productCategory in shop.ProductCategories) { productCategories.Add(new Models.ProductCategory { Id = productCategory.Id, Description = productCategory.Description, Name = productCategory.Name, ShopId = shop.Id, CreateDateTime = productCategory.CreateDateTime, UpdateDateTime = productCategory.UpdateDateTime }); } } record.ProductCategories = productCategories; record.Filters = filters; record.ShopTags = tags; _context.Shops.Add(record); await _context.SaveChangesAsync().ConfigureAwait(false); transaction.Commit(); return(true); } catch { transaction.Rollback(); return(false); } } }
public async Task <bool> Update(ProductAggregate productAggregate) { if (productAggregate == null) { throw new ArgumentNullException(nameof(productAggregate)); } using (var transaction = await _context.Database.BeginTransactionAsync().ConfigureAwait(false)) { try { var record = await _context.Products.Include(s => s.Comments).FirstOrDefaultAsync(s => s.Id == productAggregate.Id).ConfigureAwait(false); if (record == null) { transaction.Rollback(); transaction.Dispose(); return(false); } record.AverageScore = productAggregate.AverageScore; record.CategoryId = productAggregate.CategoryId; record.Description = productAggregate.Description; record.Name = productAggregate.Name; record.Price = productAggregate.Price; record.Quantity = productAggregate.Quantity; record.ShopId = productAggregate.ShopId; record.TotalScore = productAggregate.TotalScore; record.UnitOfMeasure = productAggregate.UnitOfMeasure; record.UpdateDateTime = productAggregate.UpdateDateTime; record.AvailableInStock = productAggregate.AvailableInStock; var comments = productAggregate.Comments == null ? new List <ProductComment>() : productAggregate.Comments; var commentIds = comments.Select(c => c.Id); var tags = new List <ProductTag>(); var filters = new List <ProductFilter>(); var images = new List <ProductImage>(); if (productAggregate.Tags != null && productAggregate.Tags.Any()) // Update the tags. { var tagNames = productAggregate.Tags; var connectedTags = _context.Tags.Where(t => tagNames.Any(tn => t.Name == tn)); foreach (var connectedTag in connectedTags) { tags.Add(new ProductTag { Id = Guid.NewGuid().ToString(), TagName = connectedTag.Name, ProductId = productAggregate.Id }); } var connectedTagNames = (await connectedTags.Select(t => t.Name).ToListAsync().ConfigureAwait(false)); foreach (var notExistingTagName in tagNames.Where(tn => !connectedTagNames.Contains(tn))) { var newTag = new Tag { Name = notExistingTagName, Description = notExistingTagName }; _context.Tags.Add(newTag); tags.Add(new ProductTag { Id = Guid.NewGuid().ToString(), TagName = notExistingTagName, ProductId = productAggregate.Id, Tag = newTag }); } } if (productAggregate.PartialImagesUrl != null && productAggregate.PartialImagesUrl.Any()) // Update the immages. { images = productAggregate.PartialImagesUrl.Select(i => new ProductImage { Id = Guid.NewGuid().ToString(), PartialPath = i } ).ToList(); } if (productAggregate.Filters != null) // Update the filters. { var ids = productAggregate.Filters.Select(f => f.FilterValueId); filters = await _context.FilterValues.Where(f => ids.Contains(f.Id)).Select(f => new ProductFilter { Id = Guid.NewGuid().ToString(), FilterValueId = f.Id, ProductId = productAggregate.Id }).ToListAsync().ConfigureAwait(false); record.Filters = filters; } if (record.Comments != null) // Update the comments. { var commentsToUpdate = record.Comments.Where(c => commentIds.Contains(c.Id)); var commentsToRemove = record.Comments.Where(c => !commentIds.Contains(c.Id)); var existingCommentIds = record.Comments.Select(c => c.Id); var commentsToAdd = comments.Where(c => !existingCommentIds.Contains(c.Id)); foreach (var commentToUpdate in commentsToUpdate) { var comment = comments.First(c => c.Id == commentToUpdate.Id); commentToUpdate.Score = comment.Score; commentToUpdate.Subject = comment.Subject; commentToUpdate.UpdateDateTime = comment.UpdateDateTime; commentToUpdate.Content = comment.Content; } foreach (var commentToRemove in commentsToRemove) { _context.Comments.Remove(commentToRemove); } foreach (var commentToAdd in commentsToAdd) { var rec = new Models.Comment { Id = commentToAdd.Id, Content = commentToAdd.Content, Score = commentToAdd.Score, CreateDateTime = commentToAdd.CreateDateTime, ProductId = productAggregate.Id, UpdateDateTime = commentToAdd.UpdateDateTime, Subject = commentToAdd.Subject }; _context.Comments.Add(rec); } } record.Filters = filters; record.Tags = tags; record.Images = images; await _context.SaveChangesAsync().ConfigureAwait(false); transaction.Commit(); return(true); } catch { transaction.Rollback(); return(false); } } }