public async Task <IActionResult> CreateProduct([FromBody] CreateProductFromAsinRequest request) { if (!ModelState.IsValid) { return(HttpResult.BadRequest(ModelState)); } // see if the product already exists var foundProduct = await _bagsContext.Products .WithUnsafeIncludes() .Where(product => product.AmazonProduct.Asin == request.Asin) .FirstOrDefaultAsync(); if (foundProduct != null) { return(HttpResult.Ok(foundProduct.ToUnsafeExpandedWireFormat(_amazon))); } var result = await _amazon.GetProductDetailsXml(request.Asin); var xElement = XElement.Parse(result); XNamespace ns = "http://webservices.amazon.com/AWSECommerceService/2011-08-01"; var item = xElement .Elements(ns + "Items") .Single() .Elements(ns + "Item") .Single(); var images = item .Elements(ns + "ImageSets") .Single() .Elements(ns + "ImageSet") .DistinctBy(imageSet => imageSet.Elements(ns + "LargeImage").Single().Elements(ns + "URL").Single().Value) .Select(imageSet => new Product.Image { Priority = (imageSet.Attribute("Category")?.Value == "primary") ? 10U : 100U, Small = _amazon.ConvertImageLinkToHttps(imageSet.Elements(ns + "SmallImage").Single().Elements(ns + "URL").Single().Value), Medium = _amazon.ConvertImageLinkToHttps(imageSet.Elements(ns + "MediumImage").Single().Elements(ns + "URL").Single().Value), Large = _amazon.ConvertImageLinkToHttps(imageSet.Elements(ns + "LargeImage").Single().Elements(ns + "URL").Single().Value) }) .OrderBy(image => image.Priority); var lowestNewPrice = Double.Parse(item .Elements(ns + "OfferSummary") .Single() .Elements(ns + "LowestNewPrice") .Single() .Elements(ns + "Amount") .Single() .Value) / 100; var title = item .Elements(ns + "ItemAttributes") .Single() .Elements(ns + "Title") .Single() .Value; // create product var newProduct = new Models.Product { Name = title, Price = Convert.ToInt64(lowestNewPrice), Asin = request.Asin, AmazonProduct = new AmazonProduct { Asin = request.Asin, Available = true, LastChecked = DateTimeOffset.UtcNow, Price = Convert.ToInt32(lowestNewPrice) }, ImagesJson = JsonConvert.SerializeObject(images) }; _bagsContext.Products.Add(newProduct); await _bagsContext.SaveChangesAsync(); return(HttpResult.Ok(newProduct.ToUnsafeExpandedWireFormat(_amazon))); }