private string CreateUnsignedRequest(RequestParametersModel requestParametersModel)
        {
            _logger.Info("Start creatting unsigned request.");

            _logger.Info("Getting AWSAccessKeyIdPublic and AssociateTag values from section: appSettings of web.config.");
            string awsAccessKeyIdPublic = Settings.Default.AWSAccessKeyIdPublic;
            string associateTag         = Settings.Default.AssociateTag;

            var timeStamp = DateTime.UtcNow.AddDays(1).ToString("yyyy-MM-ddT12:00:00.000Z");

            _logger.Info("Creatting collection of parameters using to compose request.");
            var parameters = new SortedDictionary <string, string>(new StringComparerByByte())
            {
                { "Service", "AWSECommerceService" },
                { "AWSAccessKeyId", $"{awsAccessKeyIdPublic}" },
                { "AssociateTag", $"{associateTag}" },
                { "Operation", "ItemSearch" },
                { "SearchIndex", "Electronics" },
                { "BrowseNode", "493964" }, // 172282 493964 2102313011
                { "ResponseGroup", "Images,ItemAttributes,OfferSummary,BrowseNodes" },
                { "Availability", "Available" },
                { "Condition", "New" },
                { "MinPercentageOff", "10" },
                { "MinimumPrice", $"{requestParametersModel.MinPrice}" },
                { "MaximumPrice", $"{requestParametersModel.MaxPrice}" },
                { "Sort", "price" },
                { "ItemPage", $"{requestParametersModel.Page}" },
                { "Timestamp", $"{timeStamp}" }
            };

            // Parameters with percent-encoding values. See RFC 3986 Section 2.1.
            var parametersEncoded = new Dictionary <string, string>();

            var regex = new Regex(@"%[a-f0-9]{2}");

            _logger.Info("Replacing specific signs to percent-encoding.");
            foreach (var p in parameters)
            {
                var key = p.Key;

                var valueLower = HttpUtility.UrlEncode(p.Value);
                var value      = regex.Replace(valueLower, n => n.Value.ToUpperInvariant());

                parametersEncoded.Add(key, value);
            }

            var unsignedRequest = new StringBuilder();

            _logger.Info($"Creatting {nameof(unsignedRequest)} that contains key=value pairs that have been divided via sign &.");
            foreach (var p in parametersEncoded)
            {
                unsignedRequest.Append($"{p.Key}={p.Value}&");
            }

            _logger.Info($"{nameof(unsignedRequest)} has been created successfully.");
            return(unsignedRequest.ToString().TrimEnd('&'));
        }
        /// <inheritdoc />
        public string CreateSignedRequest(RequestParametersModel requestParametersModel)
        {
            // Creating unsigned request string.
            var unsignedRequest = this.CreateUnsignedRequest(requestParametersModel);

            _logger.Info("Start creatting signed request.");

            // Endpoint for US server.
            const string endpoint = "http://webservices.amazon.com/onca/xml?";

            _logger.Info("Creatting request to sign.");
            var requestToSign = "GET\n" +
                                "webservices.amazon.com\n" +
                                "/onca/xml\n" +
                                unsignedRequest;

            _logger.Info("Getting AWSAccessKeyIdPrivate value from section: appSettings of web.config.");
            string awsAccessKeyIdPrivate = Settings.Default.AWSAccessKeyIdPrivate;

            _logger.Info($"Converting {nameof(awsAccessKeyIdPrivate)} and {nameof(requestToSign)} " +
                         $"to byte's array.");
            var secretKeyBytes       = new ASCIIEncoding().GetBytes(awsAccessKeyIdPrivate);
            var unsignedRequestBytes = new ASCIIEncoding().GetBytes(requestToSign);

            _logger.Info("Encrypting string with secret key.");
            var signatureBytes = new HMACSHA256(secretKeyBytes)
                                 .ComputeHash(unsignedRequestBytes);

            // Recommendation from Amazon's helper page.
            var signature = Convert.ToBase64String(signatureBytes);

            var signatureEncodedLower = HttpUtility.UrlEncode(signature);

            _logger.Info("Replacing specific signs to percent-encoding.");
            var regex            = new Regex(@"%[a-f0-9]{2}");
            var signatureEncoded = regex.Replace(signatureEncodedLower, n => n.Value.ToUpperInvariant());

            _logger.Info("Composing the signed request.");
            var signedRequest = endpoint +
                                unsignedRequest +
                                $"&Signature={signatureEncoded}";

            _logger.Info($"{nameof(signedRequest)} has been created successfully.");
            return(signedRequest);
        }
Esempio n. 3
0
        /// <inheritdoc />
        public async Task <IReadOnlyCollection <GoodDomainModel> > GetItemInfoByUrlAsync(RequestParametersModel requestParametersModel)
        {
            var signedRequest = this._signedRequestCreatorService.CreateSignedRequest(requestParametersModel);

            //await Task.Delay(1000);

            string responseMessage;

            using (var client = new HttpClient())
            {
                responseMessage = await client.GetStringAsync(signedRequest);
            }

            return(this.Parse(responseMessage));
        }
Esempio n. 4
0
        /// <inheritdoc />
        public async Task AddGoodsAsync(int minPrice)
        {
            // Looping with step that equals to 500 (5.00 dollar).
            for (; minPrice <= 50_000; minPrice += 500)
            {
                // Dividing price range into five equal ranges (step 50 or 0.5 dollar).
                for (int page = 1, minPriceDivide = minPrice, maxPrice = minPrice + 50;
                     page <= 10;
                     page++, minPriceDivide += 50, maxPrice += 50)
                {
                    var requestParametersModel = new RequestParametersModel
                    {
                        Page     = page,
                        MinPrice = minPriceDivide,
                        MaxPrice = maxPrice
                    };
                    try
                    {
                        // Validating instance of type RequestParametersModel.
                        this._requestParametersModelValidator.ValidateAndThrow(requestParametersModel);
                    }
                    catch (ValidationException ex)
                    {
                        throw new ArgumentException($"Error when validating {requestParametersModel}.", ex);
                    }

                    // Getting good's info from server and adding to collection.
                    IReadOnlyCollection <GoodDomainModel> goodDomainModels;
                    try
                    {
                        goodDomainModels = await this._amazonAdapter.GetItemInfoByUrlAsync(requestParametersModel);
                    }
                    catch (HttpRequestException ex)
                    {
                        throw new ArgumentException("Error when getting data from api server.", ex);
                    }

                    if (!goodDomainModels.Any())
                    {
                        continue;
                    }

                    // Checking if good already exist into database.
                    // Creating new collection without duplicates.
                    var goodDomainModelsDeletedDuplicates = await this.CheckExistenceGoodInDb(goodDomainModels);

                    // Checking if category already exist into database.
                    // Creating new collection without duplicates.
                    IReadOnlyCollection <CategoryDomainModel> categoryDomainModelsDeletedDuplicates =
                        await this.CheckExistenceCategoryInDb(goodDomainModels.SelectMany(g => g.CategoryIdsOnShop));

                    // Adding collection of goods to database.
                    if (goodDomainModelsDeletedDuplicates.Any())
                    {
                        // Adding collection of categories to database.
                        if (categoryDomainModelsDeletedDuplicates.Any())
                        {
                            await this._categoryService.CreateCategoriesAsync(
                                categoryDomainModelsDeletedDuplicates,
                                goodDomainModelsDeletedDuplicates.First().ShopName);
                        }

                        await this._goodService.CreateAsync(goodDomainModelsDeletedDuplicates);
                    }
                }
            }
        }
Esempio n. 5
0
 public IActionResult QuarterlyReport(RequestParametersModel parameters)
 {
     return(new ObjectResult(_getQuarterlyReport.GetDataSet(parameters)));
 }
Esempio n. 6
0
        public IActionResult UpdateChart(RequestParametersModel parameters)
        {
            var dateSummaryModels = _getTimeSeries.GetDataSet(parameters);

            return(new ObjectResult(dateSummaryModels));
        }