Ejemplo n.º 1
0
        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)));
        }