コード例 #1
0
        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);
                }
            }
        }
コード例 #2
0
        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);
                }
            }
        }
コード例 #3
0
        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);
                }
            }
        }