Esempio n. 1
0
        public ServiceResult UpdateProduct(ProductLocator locator, Product product, string data, string userName, int userId)
        {
            return(RunAction(new UserContext(), null, () =>
            {
                var p = _context.GetProduct(locator, product.Id);
                var isNew = p == null;
                var now = DateTime.Now;
                if (isNew)
                {
                    p = new DAL.Product
                    {
                        Created = now,
                        DpcId = product.Id
                    };
                    _context.FillProduct(locator, p);
                }

                if (product.MarketingProduct != null)
                {
                    p.Alias = product.MarketingProduct.Alias;
                    p.Title = product.MarketingProduct.Title;
                    p.MarketingProductId = product.MarketingProduct.Id;
                }

                if (string.IsNullOrEmpty(p.Title))
                {
                    p.Title = product.Title;
                }

                if (string.IsNullOrEmpty(p.Alias))
                {
                    p.Alias = product.Alias;
                }

                p.Updated = now;

                p.Data = data;

                p.Hash = GetHash(data);
                p.ProductType = product.ProductType;

                p.UserUpdated = userName;
                p.UserUpdatedId = userId;

                var regionIds = new List <int>();
                if (product.Regions != null)
                {
                    if (p.Id != 0)
                    {
                        foreach (var pr in p.ProductRegions)
                        {
                            if (!product.Regions.Select(x => x.Id).Contains(pr.RegionId))
                            {
                                regionIds.Add(pr.RegionId);
                                _context.ProductRegions.Remove(pr);
                            }
                        }

                        foreach (var r in product.Regions.Select(x => x.Id))
                        {
                            if (!p.ProductRegions.Select(x => x.RegionId).Contains(r))
                            {
                                var pr = new ProductRegion
                                {
                                    RegionId = r,
                                    Product = p
                                };

                                _context.ProductRegions.Add(pr);
                            }
                        }
                    }
                    else
                    {
                        foreach (var r in product.Regions.Select(x => x.Id))
                        {
                            var pr = new ProductRegion
                            {
                                RegionId = r,
                                Product = p
                            };

                            _context.ProductRegions.Add(pr);
                        }
                    }
                }

                p.DpcId = product.Id;

                if (isNew)
                {
                    _context.Products.Add(p);
                }

                if (locator.UseProductVersions)
                {
                    UpdateExistingProductVersion(p, product.Regions?.Select(r => r.Id), now);
                }

                _context.SaveChanges();
                regionIds.AddRange(p.ProductRegions.Select(x => x.RegionId));
                foreach (var rid in regionIds)
                {
                    var ru = _context.RegionUpdates.SingleOrDefault(n => n.RegionId == rid) ?? new RegionUpdate()
                    {
                        RegionId = rid
                    };
                    ru.Updated = DateTime.Now;
                    if (ru.Id <= 0)
                    {
                        _context.Add(ru);
                    }
                }
            }));
        }