/*follow the logic in Java code from here...https://developer.walmart.com/#/apicenter/marketPlace/v2#getReport     */
        private async Task <string> parseResponse(Base.Http.IResponse response, string folderName)
        {
            System.Net.Http.Headers.HttpContentHeaders headers = response.RawResponse.Content.Headers;
            string fileDir = null;

            using (Stream inputStream = await response.RawResponse.Content.ReadAsStreamAsync())
            {
                if ((response.StatusCode == System.Net.HttpStatusCode.OK) && (headers.ContentLength > 0))
                {
                    try
                    {
                        var header = headers.GetValues("Content-Disposition").First();
                        if ((header != null) && (!header.Equals("")))
                        {
                            var length   = header.Length;
                            var start    = header.IndexOf("filename=");
                            var fileName = header.Substring(start, length - start);
                            var str      = fileName.Split('=');
                            var dir      = folderName + str[1];
                            using (Stream fileStream = new FileStream(dir, FileMode.Create, FileAccess.Write))
                            {
                                inputStream.CopyTo(fileStream);
                            }
                            fileDir = dir;
                        }
                    }
                    catch (System.Exception ex)
                    {
                        throw new Base.Exception.InvalidValueException("Error " + ex.Message);
                    }
                }
            }
            return(fileDir);
        }
        public async Task <PartnerFeedResponse> GetFeedStatus(string feedId, bool includeDetails = false, int offset = 0, int limit = 0)
        {
            // to avoid deadlock if this method is executed synchronously
            await new ContextRemover();

            Base.Http.Request request = CreateRequest();
            request.EndpointUri = string.Format("/v3/feeds/{0}", feedId);

            // by default it's false and we don't need to send it
            if (includeDetails)
            {
                request.QueryParams.Add("includeDetails", "true");
            }

            if (offset > 0)
            {
                request.QueryParams.Add("offset", offset.ToString());
            }

            if (limit > 0)
            {
                request.QueryParams.Add("limit", limit.ToString());
            }

            Base.Http.IResponse response = await client.GetAsync(request);

            PartnerFeedResponse result = await ProcessResponse <PartnerFeedResponse>(response);

            return(result);
        }
예제 #3
0
        public async Task <PartnerFeedResponse> GetFeedStatus(string feedId, bool includeDetails = false, int offset = 0, int limit = 0)
        {
            // to avoid deadlock if this method is executed synchronously
            await new ContextRemover();

            Base.Http.Request request = CreateRequest();
            request.EndpointUri = string.Format("/v2/feeds/{0}", feedId);

            request.QueryParams.Add("feedId", feedId);
            if (includeDetails)
            {
                request.QueryParams.Add("includeDetails", "true");
                if (offset > 0)
                {
                    request.QueryParams.Add("offset", offset.ToString());
                }

                if (limit > 0)
                {
                    if (limit > 1000)
                    {
                        throw new System.Exception("Parameter 'limit' can't be more than 1000!");
                    }

                    request.QueryParams.Add("limit", limit.ToString());
                }
            }

            Base.Http.IResponse response = await client.GetAsync(request);

            PartnerFeedResponse result = await ProcessResponse <PartnerFeedResponse>(response);

            return(result);
        }
        public async Task <string> GetCPAReport(string folderName)
        {
            Base.Http.Request request = CreateRequest();
            request.EndpointUri = "/v2/getReport?type=cpa";
            Base.Http.IResponse response = await client.GetAsync(request);

            return(await parseResponse(response, folderName));
        }
        public async Task <LagTime> GetLagTime(string merchantSku)
        {
            Base.Http.Request request = CreateRequest();
            request.EndpointUri = string.Format("/v2/lagtime?sku={0}", merchantSku);
            Base.Http.IResponse response = await client.GetAsync(request);

            LagTime result = await ProcessResponse <LagTime>(response);

            return(result);
        }
        public static ApiException Factory(IErrorsPayload errorDetails, Base.Http.IResponse errorResponse)
        {
            var httpResponse     = errorResponse.RawResponse;
            var exceptionMessage = string.Format("API Error Occured [{0} {1}]", ((int)httpResponse.StatusCode).ToString(), httpResponse.ReasonPhrase);

            exceptionMessage += errorDetails.RenderErrors();
            var exception = new ApiException(exceptionMessage);

            exception.Details  = errorDetails;
            exception.Response = errorResponse;
            return(exception);
        }
예제 #7
0
        public async Task <Inventory> UpdateInventory(string merchantSku, string bodyContent)
        {
            // avoiding deadlock if client execute this method synchronously
            await new ContextRemover();

            Base.Http.Request request = PrepareUpdateInventoryRequest(merchantSku, bodyContent);

            Base.Http.IResponse response = await client.PutAsync(request);

            Inventory result = await ProcessResponse <Inventory>(response);

            return(result);
        }
예제 #8
0
        public async Task <ServiceResponse> GetPromotionPrice(string merchantSku)
        {
            // to avoid deadlock if this method is executed synchronously
            await new ContextRemover();

            Base.Http.Request request = CreateRequest();
            request.EndpointUri = string.Format("/v3/promo/sku/{0}", merchantSku);
            Base.Http.IResponse response = await client.GetAsync(request);

            ServiceResponse result = await ProcessResponse <ServiceResponse>(response);

            return(result);
        }
        public async Task <ItemRetireResponse> RetireItem(string merchantSku)
        {
            await new ContextRemover();

            Base.Http.Request request = CreateRequest();
            request.EndpointUri = string.Format("/v3/items/{0}", merchantSku);

            Base.Http.IResponse response = await client.DeleteAsync(request);

            ItemRetireResponse result = await ProcessResponse <ItemRetireResponse>(response);

            return(result);
        }
        public async Task <ItemResponse> GetItem(string merchantSku)
        {
            // to avoid deadlock if this method is executed synchronously
            await new ContextRemover();

            Base.Http.Request request = CreateRequest();
            request.EndpointUri = string.Format("/v3/items/{0}", merchantSku);

            Base.Http.IResponse response = await client.GetAsync(request);

            ItemResponses result = await ProcessResponse <ItemResponses>(response);

            return(result.ItemResponse[0]);
        }
예제 #11
0
        public async Task FixedCountReturnResultForSuccessWithoutRetries()
        {
            var fetcher  = new Mock <Base.Http.Fetcher.IFetcher>();
            var request  = new Mock <Base.Http.IRequest>();
            var response = new Mock <Base.Http.IResponse>();

            fetcher.Setup(t => t.ExecuteAsync(It.IsAny <Base.Http.IRequest>())).ReturnsAsync(response.Object);

            var policy = new Base.Http.Retry.FixedCountPolicy(1);

            Base.Http.IResponse result = await policy.GetResponse(fetcher.Object, request.Object);

            Assert.Equal(result, response.Object);
        }
예제 #12
0
        public async Task <ItemRetireResponse> RetireItem(string merchantSku)
        {
            // avoiding deadlock if client execute this method synchronously
            await new ContextRemover();

            Base.Http.Request request = CreateRequest();
            request.EndpointUri = string.Format("/v2/items/{0}", merchantSku);

            Base.Http.IResponse response = await client.DeleteAsync(request);

            ItemRetireResponse result = await ProcessResponse <ItemRetireResponse>(response);

            return(result);
        }
예제 #13
0
        public async Task LuckyMeFetchResult()
        {
            var fetcher  = new Mock <Base.Http.Fetcher.IFetcher>();
            var request  = new Mock <Base.Http.IRequest>();
            var response = new Mock <Base.Http.IResponse>();

            fetcher.Setup(t => t.ExecuteAsync(It.IsAny <Base.Http.IRequest>()))
            .Returns(Task.FromResult(response.Object));

            var policy = new Base.Http.Retry.LuckyMePolicy();

            Base.Http.IResponse result = await policy.GetResponse(fetcher.Object, request.Object);

            Assert.Equal(result, response.Object);
        }
예제 #14
0
        public async Task <Inventory> UpdateInventory(string merchantSku, System.IO.Stream stream)
        {
            // avoiding deadlock if client execute this method synchronously
            await new ContextRemover();

            var content = new StreamReader(stream).ReadToEnd();

            Base.Http.Request request = PrepareUpdateInventoryRequest(merchantSku, content);

            Base.Http.IResponse response = await client.PutAsync(request);

            Inventory result = await ProcessResponse <Inventory>(response);

            return(result);
        }
예제 #15
0
        public async Task <Inventory> GetInventory(string merchantSku)
        {
            // to avoid deadlock if this method is executed synchronously
            await new ContextRemover();

            Base.Http.Request request = CreateRequest();
            request.EndpointUri = "/v2/inventory";
            request.QueryParams.Add("sku", merchantSku);

            Base.Http.IResponse response = await client.GetAsync(request);

            Inventory result = await ProcessResponse <Inventory>(response);

            return(result);
        }
예제 #16
0
        public async Task <Inventory> UpdateInventory(Inventory inventory)
        {
            // to avoid deadlock if this method is executed synchronously
            await new ContextRemover();

            // enforce XML serializer here, API doesn't support JSON in requests
            var content = payloadFactory.GetSerializer(ApiFormat.XML).Serialize <Inventory>(inventory);

            Base.Http.Request request = PrepareUpdateInventoryRequest(inventory.Sku, content);

            Base.Http.IResponse response = await client.PutAsync(request);

            Inventory result = await ProcessResponse <Inventory>(response);

            return(result);
        }
        public async Task <FeedAcknowledgement> UploadFeed(System.IO.Stream file, V3.Payload.FeedType feedType)
        {
            // to avoid deadlock if this method is executed synchronously
            await new ContextRemover();

            Base.Http.Request request = CreateRequest();
            request.EndpointUri = "/v3/feeds";

            request.QueryParams.Add("feedType", feedType.ToString());
            request.AddMultipartContent(file);

            Base.Http.IResponse response = await client.PostAsync(request);

            FeedAcknowledgement result = await ProcessResponse <FeedAcknowledgement>(response);

            return(result);
        }
예제 #18
0
        public async Task FixedCountMultipleAttemptsGiveResult()
        {
            var fetcher  = new Mock <Base.Http.Fetcher.IFetcher>();
            var request  = new Mock <Base.Http.IRequest>();
            var response = new Mock <Base.Http.IResponse>();

            fetcher.SetupSequence(t => t.ExecuteAsync(It.IsAny <Base.Http.IRequest>()))
            .ThrowsAsync(new Base.Http.Exception.HttpException("test"))
            .ThrowsAsync(new Base.Http.Exception.HttpException("test"))
            .Returns(Task.FromResult(response.Object));

            var policy = new Base.Http.Retry.FixedCountPolicy(3);

            Base.Http.IResponse result = await policy.GetResponse(fetcher.Object, request.Object);

            Assert.Equal(result, response.Object);
        }
        public async Task <TokenFeedResponse> GetToken()
        {
            // to avoid deadlock if this method is executed synchronously
            await new ContextRemover();

            Base.Http.Request request = CreateRequest();

            request.EndpointUri = "/v3/token";

            request.HttpRequest.Content = new StringContent("grant_type=client_credentials");
            request.HttpRequest.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/x-www-form-urlencoded");
            Base.Http.IResponse response = await client.PostAsync(request);

            TokenFeedResponse result = await ProcessResponse <TokenFeedResponse>(response);

            return(result);
        }
예제 #20
0
        public async Task <ItemPriceResponse> UpdatePromotionPrice(Stream stream)
        {
            // to avoid deadlock if this method is executed synchronously
            await new ContextRemover();

            Base.Http.Request request = CreateRequest();
            request.EndpointUri = "/v3/price?promo=true";
            var payload = new StreamReader(stream).ReadToEnd();

            request.HttpRequest.Content = new StringContent(payload);
            //set the headers to avoid broken responses because of encodding=utf-8
            request.HttpRequest.Content.Headers.ContentType = MediaTypeHeaderValue.Parse(request.GetContentType());

            Base.Http.IResponse response = await client.PutAsync(request);

            ItemPriceResponse result = await ProcessResponse <ItemPriceResponse>(response);

            return(result);
        }
        public async Task <ItemPriceResponse> UpdatePrice(string sku, string currency, double price)
        {
            // to avoid deadlock if this method is executed synchronously
            await new ContextRemover();

            Base.Http.Request request = CreateRequest();
            request.EndpointUri = "/v2/prices";
            request.QueryParams.Add("sku", sku);
            request.QueryParams.Add("currency", currency);
            request.QueryParams.Add("price", price.ToString());
            request.HttpRequest.Content = new StringContent("");
            request.HttpRequest.Content.Headers.ContentType = MediaTypeHeaderValue.Parse(request.GetContentType());

            Base.Http.IResponse response = await client.PutAsync(request);

            ItemPriceResponse result = await ProcessResponse <ItemPriceResponse>(response);

            return(result);
        }
        public async Task <ItemPriceResponse> UpdatePrice(Stream stream)
        {
            // to avoid deadlock if this method is executed synchronously
            await new ContextRemover();

            Base.Http.Request request = CreateRequest();
            request.EndpointUri = "/v3/price";
            var payload = new StreamReader(stream).ReadToEnd();

            request.HttpRequest.Content = new StringContent(payload);
            // have to explicitly set this header for content, otherwise it also has encodding=utf-8
            // and it breaks response from API
            request.HttpRequest.Content.Headers.ContentType = MediaTypeHeaderValue.Parse(request.GetContentType());

            Base.Http.IResponse response = await client.PutAsync(request);

            ItemPriceResponse result = await ProcessResponse <ItemPriceResponse>(response);

            return(result);
        }
        public async Task PutRequestGoThroughRetryPolicy()
        {
            var response = new Mock <Base.Http.IResponse>();
            var request  = new Mock <Base.Http.IRequest>();
            var policy   = new Mock <Base.Http.Retry.IRetryPolicy>();

            policy.Setup(t => t.GetResponse(It.IsAny <IFetcher>(), It.IsAny <Base.Http.IRequest>()))
            .ReturnsAsync(response.Object);
            var config = new Mock <Base.Primitive.Config.IHttpConfig>();

            config.Setup(t => t.RequestTimeoutMs).Returns(1000);
            config.Setup(t => t.BaseUrl).Returns("http://www.test.com");

            var handler = new Base.Http.Handler(config.Object)
            {
                RetryPolicy = policy.Object
            };

            Base.Http.IResponse result = await handler.PutAsync(request.Object);

            Assert.Equal(response.Object, result);
        }
        public async Task <EnrollmentResponse> SetupAllCpaSku(bool enroll)
        {
            // to avoid deadlock if this method is executed synchronously
            await new ContextRemover();

            Base.Http.Request request = CreateRequest();
            request.EndpointUri = "/v3/cppreference";
            var content = JsonConvert.SerializeObject(new Payload.Cpa.Enrollment()
            {
                Enroll = enroll
            });

            request.HttpRequest.Content = new StringContent(content, Encoding.UTF8, "application/json");
            request.HttpRequest.Headers.Add("Accept", "application/json");

            Base.Http.IResponse response = await client.PostAsync(request);

            var responseContent = await response.GetPayloadAsString();

            EnrollmentResponse result = JsonConvert.DeserializeObject <EnrollmentResponse>(responseContent);

            return(result);
        }
        public async Task <ItemResponses> GetAllItems(int limit = 10, int offset = 0)
        {
            // to avoid deadlock if this method is executed synchronously
            await new ContextRemover();

            Base.Http.Request request = CreateRequest();
            request.EndpointUri = "/v3/items";

            if (limit > 0)
            {
                request.QueryParams.Add("limit", limit.ToString());
            }

            if (offset > 0)
            {
                request.QueryParams.Add("offset", offset.ToString());
            }

            Base.Http.IResponse response = await client.GetAsync(request);

            ItemResponses result = await ProcessResponse <ItemResponses>(response);

            return(result);
        }
예제 #26
0
 public abstract System.Exception CreateApiException(ApiFormat format, string content,
                                                     Base.Http.IResponse response);