Пример #1
0
        public async Task <Stream> GetResponseStreamAsync(WebRequest webRequest, string mark, CancellationToken cts)
        {
            try
            {
                if (cts.IsCancellationRequested)
                {
                    return(null);
                }

                EbayLogger.LogTraceInnerStarted(this.CreateMethodCallInfo(webRequest.RequestUri.ToString(), mark));

                using (cts.Register(() => webRequest.Abort()))
                    using (var response = ( HttpWebResponse )await webRequest.GetResponseAsync().ConfigureAwait(false))
                        using (var dataStream = response.GetResponseStream())
                        {
                            var memoryStream = new MemoryStream();
                            await dataStream.CopyToAsync(memoryStream, 0x100, cts).ConfigureAwait(false);

                            memoryStream.Position = 0;

                            EbayLogger.LogTraceInnerEnded(this.CreateMethodCallInfo(webRequest.RequestUri.ToString(), mark, memoryStream.ToStringSafe()));

                            return(memoryStream);
                        }
            }
            catch
            {
                EbayLogger.LogTraceInnerError(this.CreateMethodCallInfo(webRequest.RequestUri.ToString(), mark));
                throw;
            }
        }
Пример #2
0
        internal async Task <IEnumerable <InventoryStatusResponse> > ReviseInventoriesStatusAsync(IEnumerable <InventoryStatusRequest> products, string mark)
        {
            var methodParameters = products.ToJson();

            try
            {
                EbayLogger.LogTraceStarted(this.CreateMethodCallInfo(methodParameters, mark));

                var reviseInventoriesStatus = await this.EbayServiceLowLevel.ReviseInventoriesStatusAsync(products, mark).ConfigureAwait(false);

                var inventoryStatusResponses = reviseInventoriesStatus as IList <InventoryStatusResponse> ?? reviseInventoriesStatus.ToList();

                var errorsToSkip = new List <ResponseError> {
                    EbayErrors.EbayPixelSizeError, EbayErrors.LvisBlockedError, EbayErrors.UnsupportedListingType, EbayErrors.ReplaceableValue, EbayErrors.VariationLevelSKUAndItemIDShouldBeSupplied
                };
                var errorsThatMustBeSkipped = inventoryStatusResponses.CollectAllErros().Where(x => errorsToSkip.Any(y => y.ErrorCode == x.ErrorCode)).ToList();
                EbayLogger.LogTraceInnerError(this.CreateMethodCallInfo(methodParameters, mark, errorsThatMustBeSkipped.ToJson()));

                inventoryStatusResponses.SkipErrorsAndDo(null, errorsThatMustBeSkipped);
                inventoryStatusResponses.ThrowOnError(x => (x.Select(y => ( InventoryStatusResponse )y).ToList()).ToJson());

                var items     = inventoryStatusResponses.Where(y => y.Items != null).SelectMany(x => x.Items).ToList();
                var briefInfo = items.ToJson();
                EbayLogger.LogTraceEnded(this.CreateMethodCallInfo(methodParameters, mark, methodResult: briefInfo));

                return(reviseInventoriesStatus);
            }
            catch (Exception exception)
            {
                var ebayException = new EbayCommonException(string.Format("Error.{0})", this.CreateMethodCallInfo(methodParameters, mark)), exception);
                LogTraceException(ebayException.Message, ebayException);
                throw ebayException;
            }
        }
Пример #3
0
        public Stream GetResponseStream(WebRequest webRequest, string mark)
        {
            const string currentMenthodName = "GetResponseStream";

            try
            {
                EbayLogger.LogTraceInnerStarted(string.Format("MethodName:{0},From:{2},MethodParameters:{1}", currentMenthodName, webRequest.RequestUri, mark ?? PredefinedValues.NotAvailable));

                using (var response = ( HttpWebResponse )webRequest.GetResponse())
                    using (var dataStream = response.GetResponseStream())
                    {
                        var memoryStream = new MemoryStream();
                        if (dataStream != null)
                        {
                            dataStream.CopyTo(memoryStream, 0x100);
                        }
                        memoryStream.Position = 0;

                        EbayLogger.LogTraceInnerEnded(string.Format(
                                                          "MethodName:{0},From:{2},MethodParameters:{1},Result:{3}",
                                                          currentMenthodName,
                                                          webRequest.RequestUri,
                                                          mark ?? PredefinedValues.NotAvailable,
                                                          memoryStream.ToStringSafe()));

                        return(memoryStream);
                    }
            }
            catch
            {
                EbayLogger.LogTraceInnerError(string.Format("MethodName:{0},From:{2},MethodParameters:{1}", currentMenthodName, webRequest.RequestUri, mark ?? PredefinedValues.NotAvailable));
                throw;
            }
        }
Пример #4
0
        public async Task <List <string> > GetSaleRecordsNumbersAsync(params string[] saleRecordsIDs)
        {
            var methodParameters = saleRecordsIDs.ToJson();
            var mark             = Guid.NewGuid().ToString();

            try
            {
                EbayLogger.LogTraceStarted(this.CreateMethodCallInfo(methodParameters, mark));

                var seleRecordsIdsFilteredOnlyExisting = new List <string>();

                if (saleRecordsIDs == null || !saleRecordsIDs.Any())
                {
                    return(seleRecordsIdsFilteredOnlyExisting);
                }

                var salerecordIds = saleRecordsIDs.ToList();

                var currentMethod     = GetCallerMethodName();
                var millisecondsDelay = DelayForMethod.ContainsKey(currentMethod) ? DelayForMethod[currentMethod] : DEFAULT_DELAY_MILLISECONDS;

                var cts = new CancellationTokenSource(millisecondsDelay);
                var getSellingManagerSoldListingsResponses = await salerecordIds.ProcessInBatchAsync(this.EbayServiceLowLevel.MaxThreadsCount, async x => await this.EbayServiceLowLevel.GetSellngManagerOrderByRecordNumberAsync( x, mark, cts.Token ).ConfigureAwait(false)).ConfigureAwait(false);

                var sellingManagerSoldListingsResponses = getSellingManagerSoldListingsResponses as IList <GetSellingManagerSoldListingsResponse> ?? getSellingManagerSoldListingsResponses.ToList();
                sellingManagerSoldListingsResponses.SkipErrorsAndDo(x => EbayLogger.LogTraceInnerError(this.CreateMethodCallInfo(methodParameters, mark, x.Errors.ToJson())), new List <ResponseError> {
                    EbayErrors.EbayPixelSizeError, EbayErrors.LvisBlockedError, EbayErrors.UnsupportedListingType, EbayErrors.RequestedUserIsSuspended
                });
                sellingManagerSoldListingsResponses.ThrowOnError();

                if (!sellingManagerSoldListingsResponses.Any())
                {
                    return(seleRecordsIdsFilteredOnlyExisting);
                }

                var allReceivedOrders = sellingManagerSoldListingsResponses.SelectMany(x => x.Orders).ToList();

                var alllReceivedOrdersDistinct = allReceivedOrders.Distinct(new OrderEqualityComparerByRecordId()).Select(x => x.SaleRecordID).ToList();

                seleRecordsIdsFilteredOnlyExisting = (from s in saleRecordsIDs join d in alllReceivedOrdersDistinct on s equals d select s).ToList();

                var resultSaleRecordNumbersBriefInfo = seleRecordsIdsFilteredOnlyExisting.ToJson();
                EbayLogger.LogTraceEnded(this.CreateMethodCallInfo(methodParameters, mark, methodResult: resultSaleRecordNumbersBriefInfo));

                return(seleRecordsIdsFilteredOnlyExisting);
            }
            catch (Exception exception)
            {
                var ebayException = new EbayCommonException(string.Format("Error. Was called:{0}", this.CreateMethodCallInfo(methodParameters, mark)), exception);
                LogTraceException(ebayException.Message, ebayException);
                throw ebayException;
            }
        }
Пример #5
0
        public async Task <WebRequest> CreateServicePostRequestAsync(string serviceUrl, string body, Dictionary <string, string> rawHeaders, CancellationToken cts, string mark = "")
        {
            try
            {
                if (cts.IsCancellationRequested)
                {
                    return(null);
                }

                EbayLogger.LogTraceInnerStarted(CreateMethodCallInfo((new { ServiceUrl = serviceUrl, Body = body, Headers = rawHeaders.ToJson() }).ToJson(), mark));

                var encoding    = new UTF8Encoding();
                var encodedBody = encoding.GetBytes(body);

                var serviceRequest = this._webRequestFactory(serviceUrl);
                serviceRequest.Method        = WebRequestMethods.Http.Post;
                serviceRequest.ContentType   = "text/xml";
                serviceRequest.ContentLength = encodedBody.Length;
                var httpWebRequest = serviceRequest as HttpWebRequest;
                if (httpWebRequest != null)
                {
                    httpWebRequest.KeepAlive = true;
                }

                if (rawHeaders != null)
                {
                    foreach (var rawHeadersKey in rawHeaders.Keys)
                    {
                        serviceRequest.Headers.Add(rawHeadersKey, rawHeaders[rawHeadersKey]);
                    }
                }

                using (cts.Register(() => serviceRequest.Abort()))
                {
                    var requestStreamAsync = serviceRequest.GetRequestStreamAsync();
                    using (var newStream = await requestStreamAsync.ConfigureAwait(false))
                        newStream.Write(encodedBody, 0, encodedBody.Length);
                }
                return(serviceRequest);
            }
            catch (Exception)
            {
                EbayLogger.LogTraceInnerError(CreateMethodCallInfo((new { ServiceUrl = serviceUrl, Body = body, Headers = rawHeaders.ToJson() }).ToJson(), mark));
                throw;
            }
        }
Пример #6
0
        public async Task <IEnumerable <Models.GetSellerListResponse.Item> > GetProductsDetailsAsync(DateTime createTimeFromStart, DateTime createTimeFromTo)
        {
            var mark             = new Guid().ToString();
            var methodParameters = string.Format("CreateTimeFrom:{0},CreateTimeTo:{1}", createTimeFromStart, createTimeFromTo);

            try
            {
                var products = new List <Models.GetSellerListResponse.Item>();

                var quartalsStartList = GetListOfTimeRanges(createTimeFromStart, createTimeFromTo).ToList();

                var getSellerListAsyncTasks = new List <Task <GetSellerListResponse> >();

                var sellerListAsync = await this.EbayServiceLowLevel.GetSellerListAsync(quartalsStartList[0], quartalsStartList[1].AddSeconds(-1), GetSellerListTimeRangeEnum.StartTime, mark).ConfigureAwait(false);

                sellerListAsync.SkipErrorsAndDo(c => EbayLogger.LogTraceInnerError(this.CreateMethodCallInfo(methodParameters, mark, sellerListAsync.Errors.ToJson())), new List <ResponseError> {
                    EbayErrors.RequestedUserIsSuspended
                });
                sellerListAsync.ThrowOnError();

                products.AddRange(sellerListAsync.Items);

                for (var i = 1; i < quartalsStartList.Count - 1; i++)
                {
                    getSellerListAsyncTasks.Add(this.EbayServiceLowLevel.GetSellerListAsync(quartalsStartList[i], quartalsStartList[i + 1].AddSeconds(-1), GetSellerListTimeRangeEnum.StartTime, mark));
                }

                await Task.WhenAll(getSellerListAsyncTasks).ConfigureAwait(false);

                products.AddRange(getSellerListAsyncTasks.SelectMany(task => task.Result.Items).ToList());

                var productsDetails = await this.GetItemsAsync(products, mark).ConfigureAwait(false);

                var productsDetailsDevidedByVariations = SplitByVariationsOrReturnEmpty(productsDetails);

                return(productsDetailsDevidedByVariations);
            }
            catch (Exception exception)
            {
                var ebayException = new EbayCommonException(string.Format("Error. Was called with({0},{1})", createTimeFromStart, createTimeFromTo), exception);
                LogTraceException(ebayException.Message, ebayException);
                throw ebayException;
            }
        }
Пример #7
0
        public async Task <IEnumerable <Order> > GetOrdersAsync(DateTime dateFrom, DateTime dateTo)
        {
            var methodParameters = string.Format("{{dateFrom:{0},dateTo:{1}}}", dateFrom, dateTo);
            var mark             = Guid.NewGuid().ToString();

            try
            {
                EbayLogger.LogTraceStarted(this.CreateMethodCallInfo(methodParameters, mark));

                var daysBeforeNow = (DateTime.UtcNow - dateFrom).Days;
                if (daysBeforeNow > MaximumTimeWindowAllowed)
                {
                    var daysExcess = daysBeforeNow - MaximumTimeWindowAllowed;
                    var amendement = -1 * daysExcess;
                    dateFrom.AddDays(amendement);
                }

                List <Order> result;
                if (dateFrom > dateTo)
                {
                    result = new List <Order>();
                }
                else
                {
                    var getOrdersResponse = await this.EbayServiceLowLevel.GetOrdersAsync(dateFrom, dateTo, GetOrdersTimeRangeEnum.ModTime, mark).ConfigureAwait(false);

                    getOrdersResponse.SkipErrorsAndDo(c => EbayLogger.LogTraceInnerError(this.CreateMethodCallInfo(methodParameters, mark, getOrdersResponse.Errors.ToJson())), new List <ResponseError> {
                        EbayErrors.RequestedUserIsSuspended
                    });
                    getOrdersResponse.ThrowOnError();
                    result = getOrdersResponse.Orders;
                }

                EbayLogger.LogTraceEnded(this.CreateMethodCallInfo(methodParameters, mark, methodResult: result.ToJson()));
                return(result);
            }
            catch (Exception exception)
            {
                var ebayException = new EbayCommonException(string.Format("Error. Was called:{0}", this.CreateMethodCallInfo(methodParameters, mark)), exception);
                LogTraceException(ebayException.Message, ebayException);
                throw ebayException;
            }
        }
Пример #8
0
        public async Task <IEnumerable <Item> > GetActiveProductsAsync(CancellationToken ct, bool getOnlyGtcDuration = false)
        {
            var methodParameters = new Func <string>(() => string.Format("{{getOnlyGtcDuration: {0}, cancellationTokenIsCancelled:{1}}}", getOnlyGtcDuration, ct.IsCancellationRequested));
            var mark             = Guid.NewGuid().ToString();

            try
            {
                if (ct.IsCancellationRequested)
                {
                    return(null);
                }

                EbayLogger.LogTraceStarted(this.CreateMethodCallInfo(methodParameters(), mark));

                var sellerListsAsync = await this.EbayServiceLowLevel.GetSellerListCustomResponsesWithMaxThreadsRestrictionAsync(ct, DateTime.UtcNow, DateTime.UtcNow.AddDays(Maxtimerange), GetSellerListTimeRangeEnum.EndTime, mark).ConfigureAwait(false)
                                       ?? new List <GetSellerListCustomResponse>();

                var getSellerListCustomResponses = sellerListsAsync as IList <GetSellerListCustomResponse> ?? sellerListsAsync.ToList();
                getSellerListCustomResponses.SkipErrorsAndDo(c => EbayLogger.LogTraceInnerError(this.CreateMethodCallInfo(methodParameters(), mark, c.Errors.ToJson())), new List <ResponseError> {
                    EbayErrors.RequestedUserIsSuspended
                });
                getSellerListCustomResponses.ThrowOnError();

                if (getOnlyGtcDuration)
                {
                    getSellerListCustomResponses.ForEach(x => x.Items = x.Items.Where(y => y.Duration.ToUpper().Equals(DurationGTC)).ToList());
                }

                var items = getSellerListCustomResponses.SelectMany(x => x.ItemsSplitedByVariations);

                var resultSellerListBriefInfo = items.ToJson();
                EbayLogger.LogTraceEnded(this.CreateMethodCallInfo(methodParameters(), mark, methodResult: resultSellerListBriefInfo));

                return(items);
            }
            catch (Exception exception)
            {
                var ebayException = new EbayCommonException(string.Format("Error. Was called:{0}", this.CreateMethodCallInfo(methodParameters(), mark)), exception);
                LogTraceException(ebayException.Message, ebayException);
                throw ebayException;
            }
        }
Пример #9
0
        public async Task <List <string> > GetOrdersIdsAsync(params string[] sourceOrdersIds)
        {
            var methodParameters = sourceOrdersIds.ToJson();
            var mark             = Guid.NewGuid().ToString();

            try
            {
                EbayLogger.LogTraceStarted(this.CreateMethodCallInfo(methodParameters, mark));

                if (sourceOrdersIds == null || !sourceOrdersIds.Any())
                {
                    return(new List <string>());
                }

                var getOrdersResponse = await this.EbayServiceLowLevel.GetOrdersAsync(mark, sourceOrdersIds).ConfigureAwait(false);

                getOrdersResponse.SkipErrorsAndDo(c => EbayLogger.LogTraceInnerError(this.CreateMethodCallInfo(methodParameters, mark, getOrdersResponse.Errors.ToJson())), new List <ResponseError> {
                    EbayErrors.EbayPixelSizeError, EbayErrors.LvisBlockedError, EbayErrors.UnsupportedListingType, EbayErrors.RequestedUserIsSuspended
                });
                getOrdersResponse.ThrowOnError();

                if (getOrdersResponse.Orders == null)
                {
                    return(new List <string>());
                }

                var distinctOrdersIds = getOrdersResponse.Orders.Distinct(new OrderEqualityComparerById()).Select(x => x.GetOrderId(false)).ToList();

                var existsOrders = (from s in sourceOrdersIds join d in distinctOrdersIds on s equals d select s).ToList();

                EbayLogger.LogTraceEnded(this.CreateMethodCallInfo(methodParameters, mark, methodResult: existsOrders.ToJson()));

                return(existsOrders);
            }
            catch (Exception exception)
            {
                var ebayException = new EbayCommonException(string.Format("Error. Was called:{0}", this.CreateMethodCallInfo(methodParameters, mark)), exception);
                LogTraceException(ebayException.Message, ebayException);
                throw ebayException;
            }
        }
Пример #10
0
 private static void LogTraceException(string message, EbayException ebayException)
 {
     EbayLogger.Log().Trace(ebayException, message);
 }
Пример #11
0
        protected async Task <IEnumerable <UpdateInventoryResponse> > UpdateInventoryCallEconomAlgorithmAsync(IEnumerable <UpdateInventoryRequest> products)
        {
            var updateInventoryRequests = products as IList <UpdateInventoryRequest> ?? products.ToList();
            var methodParameters        = updateInventoryRequests.ToJson();
            var mark = Guid.NewGuid().ToString();

            try
            {
                EbayLogger.LogTraceStarted(this.CreateMethodCallInfo(methodParameters, mark));
                updateInventoryRequests.ForEach(x => x.Quantity = x.Quantity < 0 ? 0 : x.Quantity);
                var exceptions = new List <Exception>();

                #region revise inventory status
                var reviseInventoryStatusResponses           = new List <InventoryStatusResponse>();
                var reviseInventoryStatusResponsesWithErrors = new List <InventoryStatusResponse>();
                try
                {
                    var reviseInventoryStatusRequests = updateInventoryRequests.Select(x => new InventoryStatusRequest {
                        ItemId = x.ItemId, Sku = x.Sku, Quantity = x.Quantity
                    }).ToList();
                    var temp = await this.EbayServiceLowLevel.ReviseInventoriesStatusAsync(reviseInventoryStatusRequests, mark).ConfigureAwait(false);

                    reviseInventoryStatusResponses = temp.ToList();
                    var reviseInventoryStatusResponsesList = temp.ToList();
                    EbayLogger.LogTrace(this.CreateMethodCallInfo(methodParameters, mark, methodResult: reviseInventoryStatusResponsesList.ToJson(), additionalInfo: "ReviseInventoryStatus responses."));

                    var errorsToSkip = new List <ResponseError> {
                        EbayErrors.EbayPixelSizeError, EbayErrors.LvisBlockedError, EbayErrors.UnsupportedListingType, EbayErrors.ReplaceableValue, EbayErrors.VariationLevelSKUAndItemIDShouldBeSupplied
                    };
                    var errorsFromResponsesThatMustBeSkipped = reviseInventoryStatusResponsesList.CollectAllErros().Where(x => errorsToSkip.Any(y => y.ErrorCode == x.ErrorCode)).ToList();
                    EbayLogger.LogTraceInnerErrorSkipped(this.CreateMethodCallInfo(methodParameters, mark, errorsFromResponsesThatMustBeSkipped.ToJson()));

                    reviseInventoryStatusResponsesList.SkipErrorsAndDo(null, errorsFromResponsesThatMustBeSkipped);

                    reviseInventoryStatusResponsesWithErrors = reviseInventoryStatusResponsesList.GetOnlyResponsesWithErrors(null).ToList();
                    var reviseInventoryStatusResponsesWithoutErrors = reviseInventoryStatusResponsesList.GetOnlyResponsesWithoutErrors(null);

                    var items = reviseInventoryStatusResponsesWithoutErrors.Where(y => y.Items != null).SelectMany(x => x.Items).ToList();
                    EbayLogger.LogTrace(this.CreateMethodCallInfo(methodParameters, mark, methodResult: items.ToJson(), additionalInfo: "Products updated without errors with helpof ReviseInventoryStatus."));
                    EbayLogger.LogTrace(this.CreateMethodCallInfo(methodParameters, mark, methodResult: reviseInventoryStatusResponsesWithErrors.ToJson(), additionalInfo: "Products updated with errors with helpof ReviseInventoryStatus. Will be retryed with ReviseFixedPriseItem."));
                }
                catch (Exception exception)
                {
                    var ebayException = new EbayCommonException(string.Format("Error:{0})", this.CreateMethodCallInfo(methodParameters, mark)), exception);
                    LogTraceException(ebayException.Message, ebayException);
                    exceptions.Add(exception);
                }
                #endregion

                #region revise fixed price item
                var reviseFixedPriceItemResponses = new List <ReviseFixedPriceItemResponse>();
                if (reviseInventoryStatusResponsesWithErrors.Any())
                {
                    try
                    {
                        var reviseInventoryStatusResponsesWithErrorsItems = reviseInventoryStatusResponsesWithErrors.Where(y => y.RequestedItems != null).SelectMany(y => y.RequestedItems).ToList();
                        var productsToReviseFixedPriceItem = updateInventoryRequests.Where(x => x != null).Where(x => reviseInventoryStatusResponsesWithErrorsItems.Any(z => z.ItemId == x.ItemId && z.Sku == x.Sku)).ToList();
                        var reviseFixedPriceItemRequests   = productsToReviseFixedPriceItem.Select(x => new ReviseFixedPriceItemRequest()
                        {
                            ConditionID = x.ConditionID, IsVariation = x.IsVariation, ItemId = x.ItemId, Quantity = x.Quantity, Sku = x.Sku
                        });
                        EbayLogger.LogTrace(this.CreateMethodCallInfo(reviseFixedPriceItemRequests.ToJson(), mark, additionalInfo: "Trying to update products with helpof ReviseFixedPriseItem."));

                        var reviseFixedPriceItemResponsesEnumerable = await reviseFixedPriceItemRequests.ProcessInBatchAsync(this.EbayServiceLowLevel.MaxThreadsCount, async x =>
                        {
                            ReviseFixedPriceItemResponse res = null;
                            var IsItVariationItem            = false;
                            var repeatCount = 0;
                            await ActionPolicies.GetAsyncShort.Do(async() =>
                            {
                                if (repeatCount == 0)
                                {
                                    IsItVariationItem = x.IsVariation;
                                }

                                res = await this.EbayServiceLowLevel.ReviseFixedPriceItemAsync(x, mark, IsItVariationItem).ConfigureAwait(false);

                                if (res.Item == null)
                                {
                                    res.Item = new Models.ReviseFixedPriceItemResponse.Item();
                                }

                                res.Item.Sku    = x.Sku;
                                res.Item.ItemId = x.ItemId;

                                res.SkipErrorsAndDo(c => EbayLogger.LogTraceInnerError(this.CreateMethodCallInfo(methodParameters, mark, res.Errors.ToJson())), new List <ResponseError> {
                                    EbayErrors.EbayPixelSizeError, EbayErrors.LvisBlockedError, EbayErrors.UnsupportedListingType, EbayErrors.ReplaceableValue
                                });

                                if (res.Errors == null || !res.Errors.Any())
                                {
                                    return;
                                }

                                if (res.Errors != null && res.Errors.Exists(y => y.ErrorCode == "21916585"))
                                {
                                    IsItVariationItem = !IsItVariationItem;
                                }

                                if (repeatCount++ < 3)
                                {
                                    throw new EbayCommonException(string.Format("Error.{0}", this.CreateMethodCallInfo(x.ToJson(), mark, res.Errors.ToJson())));
                                }
                            }).ConfigureAwait(false);

                            return(res);
                        }).ConfigureAwait(false);

                        reviseFixedPriceItemResponses = reviseFixedPriceItemResponsesEnumerable.ToList();
                        reviseFixedPriceItemResponses.ThrowOnError(x => (x.Select(y => ( ReviseFixedPriceItemResponse )y).ToList()).ToJson());

                        var items = reviseFixedPriceItemResponses.Where(y => y.Item != null).Select(x => x.Item).ToList();
                        EbayLogger.LogTrace(this.CreateMethodCallInfo(methodParameters, mark, methodResult: items.ToJson()));
                    }
                    catch (Exception exc)
                    {
                        exceptions.Add(exc);
                    }
                }
                #endregion

                if (exceptions.Count > 0)
                {
                    throw new AggregateException(exceptions);
                }

                var updateInventoryResponses = new List <UpdateInventoryResponse>();
                updateInventoryResponses.AddRange(reviseInventoryStatusResponses.ToUpdateInventoryResponses().ToList());
                updateInventoryResponses.AddRange(reviseFixedPriceItemResponses.ToUpdateInventoryResponses().ToList());

                EbayLogger.LogTraceEnded(this.CreateMethodCallInfo(methodParameters, mark, methodResult: updateInventoryResponses.ToJson()));

                return(updateInventoryResponses);
            }
            catch (Exception exception)
            {
                var ebayException = new EbayCommonException(string.Format("Error:{0})", this.CreateMethodCallInfo(methodParameters, mark)), exception);
                LogTraceException(ebayException.Message, ebayException);
                throw ebayException;
            }
        }
Пример #12
0
        protected async Task <IEnumerable <UpdateInventoryResponse> > UpdateInventoryCallExpensiveAlgorithmAsync(IEnumerable <UpdateInventoryRequest> products)
        {
            var updateInventoryRequests = products as IList <UpdateInventoryRequest> ?? products.ToList();
            var methodParameters        = updateInventoryRequests.ToJson();
            var mark = Guid.NewGuid().ToString();

            try
            {
                EbayLogger.LogTraceStarted(this.CreateMethodCallInfo(methodParameters, mark));

                updateInventoryRequests.ForEach(x => x.Quantity = x.Quantity < 0 ? 0 : x.Quantity);

                var inventoryStatusRequests = updateInventoryRequests.Where(x => x.Quantity > 0).Select(x => new InventoryStatusRequest {
                    ItemId = x.ItemId, Sku = x.Sku, Quantity = x.Quantity
                }).ToList();
                var reviseFixedPriceItemRequests = updateInventoryRequests.Where(x => x.Quantity == 0).Select(x => new ReviseFixedPriceItemRequest {
                    ItemId = x.ItemId, Sku = x.Sku, Quantity = x.Quantity, ConditionID = x.ConditionID, IsVariation = x.IsVariation
                }).ToList();

                var exceptions = new List <Exception>();

                var updateProductsResponses = Enumerable.Empty <InventoryStatusResponse>();
                try
                {
                    updateProductsResponses = await this.ReviseInventoriesStatusAsync(inventoryStatusRequests, mark).ConfigureAwait(false);
                }
                catch (Exception exc)
                {
                    exceptions.Add(exc);
                }

                var updateFixedPriceItemResponses = Enumerable.Empty <ReviseFixedPriceItemResponse>();
                try
                {
                    updateFixedPriceItemResponses = await this.ReviseFixePriceItemsAsync(reviseFixedPriceItemRequests, mark).ConfigureAwait(false);
                }
                catch (Exception exc)
                {
                    exceptions.Add(exc);
                }

                if (exceptions.Count > 0)
                {
                    throw new AggregateException(exceptions);
                }

                var updateInventoryResponses = new List <UpdateInventoryResponse>();
                updateInventoryResponses.AddRange(updateProductsResponses.ToUpdateInventoryResponses().ToList());
                updateInventoryResponses.AddRange(updateFixedPriceItemResponses.ToUpdateInventoryResponses().ToList());

                EbayLogger.LogTraceEnded(this.CreateMethodCallInfo(methodParameters, mark, methodResult: updateInventoryResponses.ToJson()));

                return(updateInventoryResponses);
            }
            catch (Exception exception)
            {
                var ebayException = new EbayCommonException(string.Format("Error:{0})", this.CreateMethodCallInfo(methodParameters, mark)), exception);
                LogTraceException(ebayException.Message, ebayException);
                throw ebayException;
            }
        }
Пример #13
0
        internal async Task <IEnumerable <ReviseFixedPriceItemResponse> > ReviseFixePriceItemsAsync(IEnumerable <ReviseFixedPriceItemRequest> products, string mark)
        {
            var methodParameters = products.ToJson();

            EbayLogger.LogTraceInnerStarted(this.CreateMethodCallInfo(methodParameters, mark));

            var fixedPriceItemResponses = await products.ProcessInBatchAsync(this.EbayServiceLowLevel.MaxThreadsCount, async x =>
            {
                ReviseFixedPriceItemResponse res = null;
                var IsItVariationItem            = false;
                var repeatCount = 0;
                await ActionPolicies.GetAsyncShort.Do(async() =>
                {
                    if (repeatCount == 0)
                    {
                        IsItVariationItem = x.IsVariation;
                    }

                    res = await this.EbayServiceLowLevel.ReviseFixedPriceItemAsync(x, mark, IsItVariationItem).ConfigureAwait(false);

                    if (res.Item == null)
                    {
                        res.Item = new Models.ReviseFixedPriceItemResponse.Item();
                    }

                    res.Item.Sku    = x.Sku;
                    res.Item.ItemId = x.ItemId;

                    var unimportantErrors = new List <ResponseError> {
                        EbayErrors.EbayPixelSizeError, EbayErrors.LvisBlockedError, EbayErrors.UnsupportedListingType, EbayErrors.ReplaceableValue
                    };
                    res.SkipErrorsAndDo(c => EbayLogger.LogTraceInnerError(this.CreateMethodCallInfo(methodParameters, mark, res.Errors.ToJson())), unimportantErrors);

                    if (res.Errors == null || !res.Errors.Any())
                    {
                        return;
                    }

                    res.SkipErrorsAndDo(c => x.ConditionID = 1000, new List <ResponseError>()
                    {
                        EbayErrors.ItemConditionRequired
                    });
                    res.SkipErrorsAndDo(c => IsItVariationItem = !IsItVariationItem, new List <ResponseError>()
                    {
                        EbayErrors.DuplicateCustomVariationLabel
                    });

                    //if( res.Errors != null && res.Errors.Exists( y => y.ErrorCode == "21916585" ) )
                    //	IsItVariationItem = !IsItVariationItem;

                    if (repeatCount++ < 3)
                    {
                        throw new EbayCommonException(string.Format("Error.{0}", this.CreateMethodCallInfo(x.ToJson(), mark, res.Errors.ToJson())));
                    }
                }).ConfigureAwait(false);

                return(res);
            }).ConfigureAwait(false);

            var reviseFixedPriceItemResponses = fixedPriceItemResponses as IList <ReviseFixedPriceItemResponse> ?? fixedPriceItemResponses.ToList();

            reviseFixedPriceItemResponses.ThrowOnError(x => (x.Select(y => ( ReviseFixedPriceItemResponse )y).ToList()).ToJson());

            var items = reviseFixedPriceItemResponses.Where(y => y.Item != null).Select(x => x.Item).ToList();

            var briefInfo = items.ToJson();

            EbayLogger.LogTraceInnerEnded(this.CreateMethodCallInfo(methodParameters, mark, methodResult: briefInfo));

            return(fixedPriceItemResponses);
        }