Exemple #1
0
        public void GetNextFromQueueOfFeedsToSubmit_ReturnsFirstFeedSubmissionFromQueueForGivenRegionAndMerchantId()
        {
            var propertiesContainer           = new FeedSubmissionPropertiesContainer("testFeedContent", "testFeedType");
            var serializedPropertiesContainer = JsonConvert.SerializeObject(propertiesContainer);
            var merchantId1 = "test merchant id 1";
            var feedSubmissionWithDifferentRegion = new FeedSubmissionEntry(serializedPropertiesContainer)
            {
                AmazonRegion             = AmazonRegion.Europe,
                MerchantId               = merchantId1,
                Id                       = 2,
                FeedSubmissionId         = null,
                FeedSubmissionRetryCount = 0
            };
            var feedSubmissionWithSameRegionButDifferentMerchantId = new FeedSubmissionEntry(serializedPropertiesContainer)
            {
                AmazonRegion             = AmazonRegion.Australia,
                MerchantId               = merchantId1,
                Id                       = 2,
                FeedSubmissionId         = null,
                FeedSubmissionRetryCount = 0
            };
            var feedSubmissionWithSameRegionAndMerchantId1 = new FeedSubmissionEntry(serializedPropertiesContainer)
            {
                AmazonRegion             = AmazonRegion.Australia,
                MerchantId               = _merchantId,
                Id                       = 3,
                FeedSubmissionId         = null,
                FeedSubmissionRetryCount = 0
            };
            var feedSubmissionWithSameRegionAndMerchantId2 = new FeedSubmissionEntry(serializedPropertiesContainer)
            {
                AmazonRegion             = AmazonRegion.Australia,
                MerchantId               = _merchantId,
                Id                       = 4,
                FeedSubmissionId         = null,
                FeedSubmissionRetryCount = 0
            };


            _feedSubmissionEntries.Add(feedSubmissionWithDifferentRegion);
            _feedSubmissionEntries.Add(feedSubmissionWithSameRegionButDifferentMerchantId);
            _feedSubmissionEntries.Add(feedSubmissionWithSameRegionAndMerchantId1);
            _feedSubmissionEntries.Add(feedSubmissionWithSameRegionAndMerchantId2);

            var feedSubmissionCallback =
                _feedSubmissionEntryService.GetNextFromQueueOfFeedsToSubmit(_merchantId, AmazonRegion.Australia);

            Assert.IsNotNull(feedSubmissionCallback);
            Assert.AreEqual(feedSubmissionWithSameRegionAndMerchantId1.Id, feedSubmissionCallback.Id);
        }
Exemple #2
0
        public void QueueFeed(IFeedSubmissionEntryService feedSubmissionService, FeedSubmissionPropertiesContainer propertiesContainer, string targetEventId = null, Dictionary <string, object> targetEventArgs = null)
        {
            try
            {
                if (propertiesContainer == null)
                {
                    throw new ArgumentNullException();
                }

                var serializedPropertiesContainer = JsonConvert.SerializeObject(propertiesContainer);

                var feedSubmission = new FeedSubmissionEntry(serializedPropertiesContainer)
                {
                    AmazonRegion             = _region,
                    MerchantId               = _merchantId,
                    LastSubmitted            = DateTime.MinValue,
                    DateCreated              = DateTime.UtcNow,
                    IsProcessingComplete     = false,
                    HasErrors                = false,
                    SubmissionErrorData      = null,
                    FeedSubmissionRetryCount = 0,
                    FeedSubmissionId         = null,
                    FeedType          = propertiesContainer.FeedType,
                    TargetHandlerId   = targetEventId,
                    TargetHandlerArgs = targetEventArgs == null ? null : JsonConvert.SerializeObject(targetEventArgs),
                    InstanceId        = _options?.EventPublishingOptions?.RestrictInvocationToOriginatingInstance?.HashedInstanceId,
                    Details           = new FeedSubmissionDetails
                    {
                        FeedContent = ZipHelper.CreateArchiveFromContent(propertiesContainer.FeedContent)
                    }
                };

                feedSubmissionService.Unlock(feedSubmission, "Unlocking single feed submission entry - newly created, ready for processing.");
                feedSubmissionService.Create(feedSubmission);
                feedSubmissionService.SaveChanges();

                _logger.Debug($"The following feed was queued for submission to Amazon {feedSubmission.EntryIdentityDescription}.");
            }
            catch (Exception e)
            {
                _logger.Error(e.Message, e);
            }
        }
Exemple #3
0
        public void QueueFeed_WithNonEmptyArguments_CallsFeedSubmissionEntryServiceCreateOnceWithCorrectData()
        {
            var propertiesContainer = new FeedSubmissionPropertiesContainer("testFeedContent", "testFeedType");
            var callbackMethod      = new Action <Stream, object>((stream, o) => { _called = true; });
            FeedSubmissionEntry feedSubmissionEntry = null;

            _feedSubmissionServiceMock.Setup(rrcsm => rrcsm.Create(It.IsAny <FeedSubmissionEntry>()))
            .Callback <FeedSubmissionEntry>((p) => { feedSubmissionEntry = p; });

            _feedProcessor.QueueFeed(_feedSubmissionServiceMock.Object, propertiesContainer, "TargetHandlerId", new Dictionary <string, object> {
                { "k1", "v1" }, { "k2", "v2" }
            });

            _feedSubmissionServiceMock.Verify(rrcsm => rrcsm.Create(It.IsAny <FeedSubmissionEntry>()), Times.Once);
            Assert.AreEqual(JsonConvert.SerializeObject(propertiesContainer), feedSubmissionEntry.FeedSubmissionData);
            Assert.AreEqual(AmazonRegion.Europe, feedSubmissionEntry.AmazonRegion);
            Assert.AreEqual("TargetHandlerId", feedSubmissionEntry.TargetHandlerId);
            Assert.AreEqual("{\"k1\":\"v1\",\"k2\":\"v2\"}", feedSubmissionEntry.TargetHandlerArgs);
        }
Exemple #4
0
        GetNextFromQueueOfFeedsToSubmit_ReturnsFirstFeedSubmissionFromQueueWithNullFeedSubmissionId_AndSkipsEntriesWithNonNullFeedSubmissionId()
        {
            var propertiesContainer           = new FeedSubmissionPropertiesContainer("testFeedContent", "testFeedType");
            var serializedPropertiesContainer = JsonConvert.SerializeObject(propertiesContainer);

            var feedSubmissionWithNonNullFeedSubmissionId1 = new FeedSubmissionEntry(serializedPropertiesContainer)
            {
                AmazonRegion             = AmazonRegion.Europe,
                MerchantId               = _merchantId,
                Id                       = 2,
                FeedSubmissionId         = "testSubmissionId2",
                FeedSubmissionRetryCount = 0
            };
            var feedSubmissionWithNullFeedSubmissionId1 = new FeedSubmissionEntry(serializedPropertiesContainer)
            {
                AmazonRegion             = AmazonRegion.Europe,
                MerchantId               = _merchantId,
                Id                       = 3,
                FeedSubmissionId         = null,
                FeedSubmissionRetryCount = 0
            };
            var feedSubmissionWithNullFeedSubmissionId2 = new FeedSubmissionEntry(serializedPropertiesContainer)
            {
                AmazonRegion             = AmazonRegion.Europe,
                MerchantId               = _merchantId,
                Id                       = 4,
                FeedSubmissionId         = null,
                FeedSubmissionRetryCount = 0
            };


            _feedSubmissionEntries.Add(feedSubmissionWithNonNullFeedSubmissionId1);
            _feedSubmissionEntries.Add(feedSubmissionWithNullFeedSubmissionId1);
            _feedSubmissionEntries.Add(feedSubmissionWithNullFeedSubmissionId2);

            var feedSubmissionCallback =
                _feedSubmissionEntryService.GetNextFromQueueOfFeedsToSubmit(_merchantId, _region);

            Assert.IsNotNull(feedSubmissionCallback);
            Assert.AreEqual(feedSubmissionWithNullFeedSubmissionId1.Id, feedSubmissionCallback.Id);
        }
        public void SubmitFeedToAmazon(IFeedSubmissionEntryService feedSubmissionService, FeedSubmissionEntry feedSubmission)
        {
            void HandleSubmitFeedSuccess(SubmitFeedResponse response)
            {
                var requestId = response?.ResponseHeaderMetadata?.RequestId ?? "unknown";
                var timestamp = response?.ResponseHeaderMetadata?.Timestamp ?? "unknown";

                feedSubmission.FeedSubmissionId         = response?.SubmitFeedResult?.FeedSubmissionInfo?.FeedSubmissionId;
                feedSubmission.FeedSubmissionRetryCount = 0;
                _logger.Info($"AmazonMWS feed submission has succeeded for {feedSubmission.EntryIdentityDescription}. FeedSubmissionId:'{feedSubmission.FeedSubmissionId}'.",
                             new RequestInfo(timestamp, requestId));
            }

            void HandleMissingFeedSubmissionId()
            {
                feedSubmission.FeedSubmissionRetryCount++;
                _logger.Warn($"SubmitFeed did not generate a FeedSubmissionId for {feedSubmission.EntryIdentityDescription}. Feed submission will be retried. FeedSubmissionRetryCount is now : {feedSubmission.FeedSubmissionRetryCount}.");
            }

            void HandleNonFatalOrGenericException(Exception e)
            {
                feedSubmission.FeedSubmissionRetryCount++;
                feedSubmission.LastSubmitted = DateTime.UtcNow;

                _logger.Warn($"AmazonMWS SubmitFeed failed for {feedSubmission.EntryIdentityDescription}. Feed submission will be retried. FeedSubmissionRetryCount is now : {feedSubmission.FeedSubmissionRetryCount}.", e);
            }

            void HandleFatalException(Exception e)
            {
                feedSubmissionService.Delete(feedSubmission);
                _logger.Error($"AmazonMWS SubmitFeed failed for {feedSubmission.EntryIdentityDescription}. The entry will now be removed from queue", e);
            }

            var missingInformationExceptionMessage = "Cannot submit queued feed to amazon due to missing feed submission information";

            if (feedSubmission == null)
            {
                throw new ArgumentNullException($"{missingInformationExceptionMessage}: Feed submission entry is null");
            }
            if (feedSubmission.FeedSubmissionData == null)
            {
                throw new ArgumentNullException($"{missingInformationExceptionMessage}: Feed submission data is null");
            }

            var feedContentZip = feedSubmission.Details?.FeedContent;

            if (feedContentZip == null)
            {
                throw new ArgumentNullException($"{missingInformationExceptionMessage}: Feed content is missing");
            }

            if (string.IsNullOrEmpty(feedSubmission?.FeedType))
            {
                throw new ArgumentException($"{missingInformationExceptionMessage}: Feed type is missing");
            }

            _logger.Debug($"Attempting to submit the next feed in queue to Amazon: {feedSubmission.EntryIdentityDescription}.");

            var feedSubmissionData = feedSubmission.GetPropertiesContainer();

            using (var stream = ZipHelper.ExtractArchivedSingleFileToStream(feedContentZip))
            {
                var submitFeedRequest = new SubmitFeedRequest
                {
                    Merchant          = feedSubmission.MerchantId,
                    FeedType          = feedSubmission.FeedType,
                    FeedContent       = stream,
                    MarketplaceIdList = feedSubmissionData.MarketplaceIdList == null ? null : new IdList {
                        Id = feedSubmissionData.MarketplaceIdList
                    },
                    PurgeAndReplace = feedSubmissionData.PurgeAndReplace ?? false,
                    ContentMD5      = MD5ChecksumHelper.ComputeHashForAmazon(stream),
                };

                if (!string.IsNullOrEmpty(_mWSAuthToken))
                {
                    submitFeedRequest.MWSAuthToken = _mWSAuthToken;
                }

                try
                {
                    feedSubmissionService.Unlock(feedSubmission, "Unlocking single feed submission entry - finished attempt to submit feed to amazon.");
                    feedSubmissionService.Update(feedSubmission);

                    var response = _marketplaceWebServiceClient.SubmitFeed(submitFeedRequest);
                    feedSubmission.LastSubmitted = DateTime.UtcNow;

                    if (string.IsNullOrEmpty(response?.SubmitFeedResult?.FeedSubmissionInfo?.FeedSubmissionId))
                    {
                        HandleMissingFeedSubmissionId();
                    }
                    else
                    {
                        HandleSubmitFeedSuccess(response);
                    }
                }
                catch (MarketplaceWebServiceException e) when(e.StatusCode == HttpStatusCode.BadRequest && IsAmazonErrorCodeFatal(e.ErrorCode))
                {
                    HandleFatalException(e);
                }
                catch (MarketplaceWebServiceException e) when(IsAmazonErrorCodeNonFatal(e.ErrorCode))
                {
                    HandleNonFatalOrGenericException(e);
                }
                catch (Exception e)
                {
                    HandleNonFatalOrGenericException(e);
                }
                finally
                {
                    stream.Dispose();
                    feedSubmissionService.SaveChanges();
                }
            }
        }