Exemplo n.º 1
0
 public SearchOffersResponse Get(string phrase,
                                 string translatedPhrase,
                                 string categoryId,
                                 OfferStateEnum state,
                                 OfferSortingEnum sorting,
                                 int offset,
                                 int limit,
                                 int?processTopCnt,
                                 string searchToken)
 {
     _tokenSource = new CancellationTokenSource();
     try
     {
         if (searchToken != "sfdfjiojaa5345zfhsery7JHG")
         {
             throw new AuthenticationException("Invalid token");
         }
         var token = _tokenSource.Token;
         var res   = _client.SearchOffersAsync(phrase, translatedPhrase, categoryId, state, sorting, offset, limit, processTopCnt, token).Result;
         return(res);
     }
     catch (Exception er)
     {
         throw;
     }
     finally
     {
         _tokenSource.Dispose();
     }
 }
Exemplo n.º 2
0
        public async Task <KioskBrains.Clients.AllegroPl.Rest.Models.SearchOffersResponse> SearchOffersAsync(
            string phrase,
            string categoryId,
            OfferStateEnum state,
            OfferSortingEnum sorting,
            int offset,
            int limit,
            CancellationToken cancellationToken)
        {
            Assure.ArgumentNotNull(categoryId, nameof(categoryId));

            var parameters = new Dictionary <string, string>
            {
                ["searchMode"]         = "REGULAR", // by title only
                ["category.id"]        = categoryId,
                ["sellingMode.format"] = "BUY_NOW", // exclude auctions (sellingMode.format=AUCTION)
            };

            if (!string.IsNullOrEmpty(phrase))
            {
                parameters["phrase"] = phrase;
            }

            if (state != OfferStateEnum.All)
            {
                string stateFilterValue;
                switch (state)
                {
                case OfferStateEnum.New:
                    stateFilterValue = "11323_1";
                    break;

                case OfferStateEnum.Used:
                    stateFilterValue = "11323_2";
                    break;

                case OfferStateEnum.Recovered:
                    stateFilterValue = "11323_246462";
                    break;

                case OfferStateEnum.Broken:
                    stateFilterValue = "11323_238062";
                    break;

                default:
                    stateFilterValue = null;
                    break;
                }

                parameters[StateFilterId] = stateFilterValue;
            }

            string sortingValue;

            switch (sorting)
            {
            case OfferSortingEnum.Relevance:
                sortingValue = "-relevance";
                break;

            case OfferSortingEnum.PriceAsc:
                sortingValue = "price";
                break;

            case OfferSortingEnum.PriceDesc:
                sortingValue = "-price";
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(sorting), sorting, null);
            }

            parameters["sort"] = sortingValue;

            parameters["offset"] = offset.ToString();
            parameters["limit"]  = limit.ToString();

            var action   = "/offers/listing";
            var response = await GetAsync <KioskBrains.Clients.AllegroPl.Rest.Models.SearchOffersResponse>(action, parameters, cancellationToken);

            if (response.Items == null ||
                response.SearchMeta == null)
            {
                throw new AllegroPlRequestException($"Request to API failed, action {action}, {nameof(response.Items)} or {nameof(response.SearchMeta)} is null.");
            }

            return(response);
        }
Exemplo n.º 3
0
        internal async Task <Models.SearchOffersResponse> SearchOffersAsync(
            string phrase,
            string categoryId,
            OfferStateEnum state,
            OfferSortingEnum sorting,
            int offset,
            int limit,
            CancellationToken cancellationToken)
        {
            if (state == OfferStateEnum.All)
            {
                state = OfferStateEnum.Used;
            }
            Assure.ArgumentNotNull(categoryId, nameof(categoryId));

            Assure.ArgumentNotNull(categoryId, nameof(categoryId));
            var parameters = new Dictionary <string, string>
            {
                ["category"] = categoryId,
            };

            if (!string.IsNullOrEmpty(phrase))
            {
                parameters["query"] = phrase;
            }

            if (state != OfferStateEnum.All)
            {
                string stateFilterValue;
                switch (state)
                {
                case OfferStateEnum.New:
                    stateFilterValue = "nowe";
                    break;

                case OfferStateEnum.Used:
                    stateFilterValue = "używane";
                    break;

                case OfferStateEnum.Recovered:
                    stateFilterValue = "11323_246462";
                    break;

                case OfferStateEnum.Broken:
                    stateFilterValue = "11323_238062";
                    break;

                default:
                    stateFilterValue = null;
                    break;
                }

                parameters["status"] = stateFilterValue;
            }

            string sortingValue;

            switch (sorting)
            {
            case OfferSortingEnum.Relevance:
                sortingValue = "-relevance";
                break;

            case OfferSortingEnum.PriceAsc:
                sortingValue = "p";
                break;

            case OfferSortingEnum.PriceDesc:
                sortingValue = "pd";
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(sorting), sorting, null);
            }
            parameters["sort"]    = sortingValue;
            parameters["page"]    = (offset / 10).ToString();
            parameters["api_key"] = "Umthudpx8FCs9ks6rBpB";
            parameters["method"]  = "search";

            var action   = "/offers/listing";
            var response = await GetAsync <Models.SearchOffersResponse>(action, parameters, cancellationToken);

            if (response.Items == null)
            {
                throw new AllegroPlRequestException($"Request to API failed, action {action}, {nameof(response.Items)} or {nameof(response.SearchMeta)} is null.");
            }

            return(response);
        }
Exemplo n.º 4
0
        public async Task <SearchOffersResponse> SearchOffersAsync(
            string phrase,
            string translatedPhrase,
            string categoryId,
            OfferStateEnum state,
            OfferSortingEnum sorting,
            int offset,
            int limit,
            CancellationToken cancellationToken)
        {
            if (limit > MaxPageSize)
            {
                throw new NotSupportedException($"Max '{MaxPageSize}' page size is supported.");
            }


            var arPhrase = new[] { phrase };

            if (string.IsNullOrEmpty(translatedPhrase) &&
                !string.IsNullOrEmpty(phrase))
            {
                if (_settings.IsTranslationEnabled)
                {
                    var translatedPhrases = await _yandexTranslateClient.TranslateAsync(
                        new[] { phrase },
                        Languages.RussianCode,
                        Languages.PolishCode,
                        cancellationToken);

                    translatedPhrase = translatedPhrases[0];
                }
                else
                {
                    translatedPhrase = phrase;
                }
            }

            // search for offers
            var apiResponse = await _restClient.SearchOffersAsync(translatedPhrase, categoryId, state, sorting, offset, limit, cancellationToken);

            var apiOffers = new List <KioskBrains.Clients.AllegroPl.Rest.Models.Offer>();

            if (apiResponse.Items.Promoted?.Length > 0)
            {
                apiOffers.AddRange(apiResponse.Items.Promoted);
            }

            if (apiResponse.Items.Regular?.Length > 0)
            {
                apiOffers.AddRange(apiResponse.Items.Regular);
            }

            if (apiOffers.Count > MaxPageSize)
            {
                apiOffers = apiOffers
                            .Take(MaxPageSize)
                            .ToList();
            }

            var offers = apiOffers
                         .Select(x => new Offer()
            {
                Id         = x.Id,
                CategoryId = x.Category?.Id,
                Name       = new MultiLanguageString()
                {
                    [Languages.PolishCode] = x.Name ?? "",
                },
                Price             = x.SellingMode?.GetMaxPrice()?.Amount ?? 0,
                PriceCurrencyCode = x.SellingMode?.GetMaxPrice()?.Currency ?? "PLN",
                Images            = x.Images,
                // WORKAROUND! since WebAPI with attributes was disabled:
                // - state should be non-All here
                // - delivery options are set by REST API delivery/lowestPrice
                State           = state,
                DeliveryOptions = new[]
                {
                    new DeliveryOption()
                    {
                        Price = x.Delivery?.LowestPrice?.Amount ?? 0,
                    },
                }
            })
                         .ToArray();



            List <Task> taskList = new List <Task>();

            /*foreach (var o in offers)
             * {
             *  //Thread.Sleep(10);
             *  taskList.Add(Task.Run(() =>
             *       SetOfferExtraData(o, cancellationToken)
             *  ));
             * }*/

            /*var stateAndDeliveryOptionsTask = Task.Run(
             *  () => RequestOfferStatesAndDeliveryOptionsAsync(offers, state, cancellationToken),
             *  cancellationToken);*/


            //taskList.Add(stateAndDeliveryOptionsTask);

            await Task.WhenAll(taskList);

            if (_settings.IsTranslationEnabled)
            {
                AddNamesToTranslate(offers);
                await ApplyTranslations(offers, phrase, translatedPhrase, cancellationToken);
            }

            return(new SearchOffersResponse()
            {
                Offers = offers,
                TranslatedPhrase = translatedPhrase,
                Total = apiResponse.SearchMeta?.TotalCount ?? 0,
            });
        }
Exemplo n.º 5
0
        public async Task <SearchOffersResponse> SearchOffersAsync(
            string phrase,
            string translatedPhrase,
            string categoryId,
            OfferStateEnum state,
            OfferSortingEnum sorting,
            int offset,
            int limit,
            int?processTopCnt,
            CancellationToken cancellationToken)
        {
            if (limit > MaxPageSize)
            {
                throw new NotSupportedException($"Max '{MaxPageSize}' page size is supported.");
            }


            var arPhrase = new[] { phrase };

            if (string.IsNullOrEmpty(translatedPhrase) &&
                !string.IsNullOrEmpty(phrase))
            {
                if (_settings.IsTranslationEnabled)
                {
                    var translatedPhrases = await _yandexTranslateClient.TranslateAsync(
                        new[] { phrase },
                        Languages.RussianCode,
                        Languages.PolishCode,
                        cancellationToken);

                    translatedPhrase = translatedPhrases[0];
                }
                else
                {
                    translatedPhrase = phrase;
                }
            }

            // search for offers
            var apiResponse = await _restClient.SearchOffersAsync(translatedPhrase, categoryId, state, sorting, offset, limit, cancellationToken);

            var apiOffers = new List <Rest.Models.Offer>();

            if (apiResponse.Items.Promoted?.Length > 0)
            {
                apiOffers.AddRange(apiResponse.Items.Promoted);
            }

            if (apiResponse.Items.Regular?.Length > 0)
            {
                apiOffers.AddRange(apiResponse.Items.Regular);
            }

            if (apiOffers.Count > MaxPageSize)
            {
                apiOffers = apiOffers
                            .Take(MaxPageSize)
                            .ToList();
            }

            var offers = apiOffers
                         .Select(x => new Offer()
            {
                Id         = x.Id,
                CategoryId = x.Category?.Id,
                Name       = new MultiLanguageString()
                {
                    [Languages.PolishCode]  = x.Name ?? "",
                    [Languages.RussianCode] = x.Name ?? "",
                },
                Description = new MultiLanguageString()
                {
                    [Languages.PolishCode]  = "",
                    [Languages.RussianCode] = "",
                },
                Price             = x.SellingMode?.GetMaxPrice()?.Amount ?? 0,
                PriceCurrencyCode = x.SellingMode?.GetMaxPrice()?.Currency ?? "PLN",
                Images            = x.Images,
                Parameters        = new List <OfferParameter>(),
                // WORKAROUND! since WebAPI with attributes was disabled:
                // - state should be non-All here
                // - delivery options are set by REST API delivery/lowestPrice
                State           = state,
                DeliveryOptions = new[]
                {
                    new DeliveryOption()
                    {
                        Price = x.Delivery?.LowestPrice?.Amount ?? 0,
                    },
                }
            })
                         .ToArray();



            List <Task> taskList = new List <Task>();


            var take = !processTopCnt.HasValue ? limit : limit > processTopCnt.Value ? processTopCnt.Value : limit;

            foreach (var o in offers.Take(take))
            {
                //Thread.Sleep(10);
                taskList.Add(Task.Run(() =>
                                      SetOfferExtraData(o, cancellationToken)
                                      ));
            }

            await Task.WhenAll(taskList);

            if (_settings.IsTranslationEnabled)
            {
                AddNamesToTranslate(offers);
                await ApplyTranslations(offers, phrase, translatedPhrase, cancellationToken);
            }


            foreach (var offer in offers)
            {
                var paramsStrPl = String.Join("; ", offer.Parameters.Select(x => $"{x.Name[Languages.PolishCode]}: {x.Value[Languages.PolishCode]}"));
                var paramsStrRu = String.Join("; ", offer.Parameters.Select(x => $"{x.Name[Languages.RussianCode]}: {x.Value[Languages.RussianCode]}"));
                offer.Description[Languages.PolishCode]  = paramsStrPl + (paramsStrPl.Any() ?  ". " : "") + offer.Description[Languages.PolishCode];
                offer.Description[Languages.RussianCode] = paramsStrRu + (paramsStrRu.Any() ? ". " : "") + offer.Description[Languages.RussianCode];
                offer.Parameters = null;
            }

            return(new SearchOffersResponse()
            {
                Offers = offers,
                TranslatedPhrase = translatedPhrase,
                Total = apiResponse.SearchMeta?.TotalCount ?? 0,
            });
        }