public async Task <Product> Update(string slug, CreateOrEditProduct dto)
        {
            var product = await _context.Products.Include(a => a.ProductCategories)
                          .Include(a => a.ProductTags)
                          .Where(x => x.Slug == slug).FirstOrDefaultAsync();

            if (product == null)
            {
                throw new ResourceNotFoundException();
            }

            product.Name        = dto.Name.Trim();
            product.Slug        = dto.Name.Trim().Slugify();
            product.Description = dto.Description;


            if (dto.Categories != null && dto.Categories.Count() > 0)
            {
                foreach (var category in dto.Categories)
                {
                    Category cat = _context.Categories
                                   .SingleOrDefault(c => c.Name.Equals(category.Name));

                    if (cat == null)
                    {
                        cat = new Category
                        {
                            Name = category.Name,
                        };

                        _context.Categories.Add(cat);
                        await _context.SaveChangesAsync();
                    }

                    // If the product was not yet associated to the category then do it now
                    if (!product.ProductCategories.Any(ac => ac.Product == product && ac.Category == cat))
                    {
                        product.ProductCategories.Add(new ProductCategory
                        {
                            Product  = product,
                            Category = cat
                        });
                    }
                }
            }


            if (_context.ChangeTracker.Entries().First(x => x.Entity == product).State == EntityState.Modified)
            {
                product.UpdatedAt = DateTime.UtcNow;
            }

            await _context.SaveChangesAsync();

            return(product);
        }
Example #2
0
        public async Task <IActionResult> UpdateProduct(string slug, [FromBody] CreateOrEditProduct dto)
        {
            if (!ModelState.IsValid)
            {
                return(StatusCodeAndDtoWrapper.BuilBadRequest(ModelState));
            }


            Product product = await _productsService.Update(slug, dto);

            return(StatusCodeAndDtoWrapper.BuildSuccess(ProductDetailsDto.Build(product), "Updated successfully"));
        }