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(); } }
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); }
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); }
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, }); }
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, }); }