コード例 #1
0
        public GetProductAPIContract UpdateProductDetails(UpdateProductAPIArgs args, HttpRequestMessage request, string baseRequestUri)
        {
            DynamoDBTracer.Tracer.Write(string.Format("UpdateProductDetails called. Args: {0}", args), "Verbose");
            this.CheckAndUpdateDoSLimits(request, args.EmailId);
            ProductCatalogEntity catalogEntity = ValidateAndGetEntityFromArgs(args);
            var    offers        = AmazonProductHelper.GetOffers(args.ProductASIN, args.ProductRegion.ToString());
            var    offersSummary = offers.Items.FirstOrDefault().Item.FirstOrDefault().OfferSummary;
            string price         = offersSummary.LowestNewPrice.Amount;

            catalogEntity.InitialPrice = (double.Parse(price) / 100).ToString();
            catalogEntity.CurrencyCode = offersSummary.LowestNewPrice.CurrencyCode;

            var catalogProvider = PriceUpdateContext.Instance.CatalogFactory.GetProductCatalogProvider();

            catalogProvider.UpdateProduct(catalogEntity);

            DynamoDBTracer.Tracer.Write(string.Format("Catalog update succeeded. Args: {0}", args), "Verbose");

            GetProductAPIArgs getArgs = new GetProductAPIArgs
            {
                ProductASIN   = args.ProductASIN,
                ProductRegion = args.ProductRegion,
            };

            var productDetails = this.GetProductDetails(getArgs, request);

            productDetails.CurrentPrice = catalogEntity.InitialPrice;
            productDetails.CurrencyCode = catalogEntity.CurrencyCode;
            productDetails.AmazonUrl    = AmazonProductAPIWrapper.AmazonProductAPIConstants.RegionMapping[args.ProductRegion];
            productDetails.EmailId      = catalogEntity.EmailId;

            return(productDetails);
            //Start a background task to send confirmation email
            //Task.Factory.StartNew(() => SendConfirmationMail(args, baseRequestUri), TaskCreationOptions.None);
        }
コード例 #2
0
        private static void AddItemToEmail(Dictionary <string, List <ProductEmailDetails> > emailsToSend, ProductCatalogEntity product)
        {
            var                 itemDetail   = AmazonProductHelper.GetItemDetails(product.ASIN, product.Country);
            string              itemName     = itemDetail.Items.FirstOrDefault().Item.FirstOrDefault().ItemAttributes.Title;
            var                 cartDetail   = AmazonProductHelper.GetCartDetails(product.ASIN, product.Country);
            string              cartUrl      = cartDetail.Cart.FirstOrDefault().PurchaseURL;
            const string        htmlATag     = @"<a href={0}>Click here to buy!</a>";
            ProductEmailDetails emailDetails = new ProductEmailDetails
            {
                ProductName         = itemName,
                CurrentPrice        = product.CurrentPrice,
                InitialPrice        = product.InitialPrice,
                ProductPurchaseLink = string.Format(htmlATag, cartUrl)
            };

            if (!emailsToSend.ContainsKey(product.EmailId))
            {
                emailsToSend.Add(product.EmailId, new List <ProductEmailDetails> {
                    emailDetails
                });
            }
            else
            {
                emailsToSend[product.EmailId].Add(emailDetails);
            }
        }
コード例 #3
0
        public GetProductAPIContract GetProductDetails(GetProductAPIArgs args, HttpRequestMessage request)
        {
            DynamoDBTracer.Tracer.Write(string.Format("GetProductDetails called. Args: {0}", args), "Verbose");
            this.CheckAndUpdateDoSLimits(request, "GetProductCall");
            ItemLookupResponse itemResponse = AmazonProductHelper.GetItemDetails(args.ProductASIN, args.ProductRegion.ToString());

            var item = itemResponse.Items.FirstOrDefault().Item.FirstOrDefault();

            GetProductAPIContract apiContract = new GetProductAPIContract
            {
                ProductASIN   = item.ASIN,
                ProductName   = item.ItemAttributes.Title,
                ProductRegion = args.ProductRegion
            };

            DynamoDBTracer.Tracer.Write(string.Format("GetProductDetails succeeded. Args: {0}", args), "Verbose");
            return(apiContract);
        }
コード例 #4
0
        public void CheckPriceAndSendMail(string admindEmailId)
        {
            try
            {
                //EmailManagerContext.Instance.SendHtmlEmail(admindEmailId, "Periodic task started successfully", "Start time " + DateTime.UtcNow);
                this.SendPeriodicStatusMail("Periodic Task Started", "Start time " + DateTime.UtcNow, admindEmailId);
                var catalogProvider = PriceUpdateContext.Instance.CatalogFactory.GetProductCatalogProvider();

                var allProducts = catalogProvider.GetProducts();
                Dictionary <string, List <ProductEmailDetails> > emailsToSend = new Dictionary <string, List <ProductEmailDetails> >();
                DateTime  todayDate = DateTime.UtcNow.Date;
                DayOfWeek day       = todayDate.DayOfWeek;
                List <ProductCatalogEntity> entitiesToUpdate = new List <ProductCatalogEntity>();
                foreach (ProductCatalogEntity product in allProducts)
                {
                    try
                    {
                        if (product.IsConfirmed == false)
                        {
                            continue;
                        }
                        if (product.ToEmailOnPrice && todayDate <= product.EmailOnPriceDuration)
                        {
                            //Check if last emailed on is not null
                            //GetPrice
                            //If price is lower than specifie add to email. Mark Email sent on
                            //Check if duration is passed and delete

                            var    offers    = AmazonProductHelper.GetOffers(product.ASIN, product.Country);
                            double itemPrice = double.Parse(offers.Items.FirstOrDefault().Item.FirstOrDefault().OfferSummary.LowestNewPrice.Amount);
                            itemPrice = itemPrice / 100;
                            double priceToEmail = double.Parse(product.PriceToEmail);

                            if (itemPrice <= priceToEmail)
                            {
                                product.CurrentPrice = Convert.ToString(itemPrice);
                                AddItemToEmail(emailsToSend, product);
                                product.EmailSentOn    = todayDate;
                                product.ToEmailOnPrice = false;
                                entitiesToUpdate.Add(product);
                            }
                        }

                        if (product.ToEmailEveryWeek && todayDate <= product.EmailEveryWeekDuration)
                        {
                            DayOfWeek dayToEmail = (DayOfWeek)Enum.Parse(typeof(DayOfWeek), product.DayToEmail);
                            if (dayToEmail == day)
                            {
                                AddItemToEmail(emailsToSend, product);
                            }
                        }

                        if (product.ToEmailOnDate && todayDate == product.DateToEmail)
                        {
                            AddItemToEmail(emailsToSend, product);
                        }

                        //If the duration has passed, delete it
                        if (todayDate > product.EmailEveryWeekDuration && product.EmailEveryWeekDuration != DateTime.MinValue)
                        {
                            product.ToEmailEveryWeek = false;
                            entitiesToUpdate.Add(product);
                        }
                        if (todayDate > product.EmailOnPriceDuration && product.EmailOnPriceDuration != DateTime.MinValue)
                        {
                            product.ToEmailOnPrice = false;
                            entitiesToUpdate.Add(product);
                        }
                    }
                    catch (Exception ex)
                    {
                        this.SendPeriodicStatusMail("Failed processing product object " + product.ASIN, ex.Message, admindEmailId);
                        continue;
                    }
                }

                //Send all emails
                foreach (var emailId in emailsToSend.Keys)
                {
                    //Figure out a way to fix this
                    MailMessage mailToSend = ProductEmailHelper.ProductHtmlMailContent(emailsToSend[emailId], AmazonProductAPIContext.Regions.IN);
                    string      subject    = "Price updates for your products!";
                    mailToSend.To.Add(emailId);
                    mailToSend.Subject         = subject;
                    mailToSend.SubjectEncoding = Encoding.UTF8;
                    EmailManagerContext.Instance.SendHtmlEmail(mailToSend);
                }

                //After all mails are sent
                entitiesToUpdate.ForEach(entity => catalogProvider.UpdateProduct(entity));
            }
            catch (Exception ex)
            {
                this.SendPeriodicStatusMail("Periodic Task Failed", ex.Message, admindEmailId);
            }

            this.SendPeriodicStatusMail("Periodic Task Finished", "Finish time " + DateTime.UtcNow, admindEmailId);
        }