/// <summary>
        /// Messages the send to recipient failure.
        /// </summary>
        /// <param name="providerRequestReference">The provider request reference.</param>
        /// <param name="providerEmailReference">The provider email reference.</param>
        public void ReceiveResponseFromProvider(String providerRequestReference,
                                                String providerEmailReference)
        {
            ResponseReceivedFromEmailProviderEvent responseReceivedFromProviderEvent =
                new ResponseReceivedFromEmailProviderEvent(this.AggregateId, providerRequestReference, providerEmailReference);

            this.ApplyAndAppend(responseReceivedFromProviderEvent);
        }
        public void ResponseReceivedFromEmailProviderEvent_CanBeCreated_IsCreated()
        {
            ResponseReceivedFromEmailProviderEvent requestSentToProviderEvent = new ResponseReceivedFromEmailProviderEvent(TestData.MessageId, TestData.ProviderRequestReference, TestData.ProviderEmailReference);

            requestSentToProviderEvent.ShouldNotBeNull();
            requestSentToProviderEvent.AggregateId.ShouldBe(TestData.MessageId);
            requestSentToProviderEvent.EventId.ShouldNotBe(Guid.Empty);
            requestSentToProviderEvent.MessageId.ShouldBe(TestData.MessageId);
            requestSentToProviderEvent.ProviderRequestReference.ShouldBe(TestData.ProviderRequestReference);
            requestSentToProviderEvent.ProviderEmailReference.ShouldBe(TestData.ProviderEmailReference);
        }
예제 #3
0
        public void DomainEventHandlerResolver_GetDomainEventHandlers_ResponseReceivedFromProviderEvent_NoHandlersConfigured_EventHandlersReturned()
        {
            Dictionary <String, String[]> eventHandlerConfiguration = new Dictionary <String, String[]>();

            ResponseReceivedFromEmailProviderEvent responseReceivedFromProviderEvent = TestData.ResponseReceivedFromEmailProviderEvent;
            Mock <IDomainEventHandler>             domainEventHandler = new Mock <IDomainEventHandler>();

            Func <Type, IDomainEventHandler> createDomainEventHandlerFunc = (type) => { return(domainEventHandler.Object); };

            DomainEventHandlerResolver resolver = new DomainEventHandlerResolver(eventHandlerConfiguration, createDomainEventHandlerFunc);

            List <IDomainEventHandler> handlers = resolver.GetDomainEventHandlers(responseReceivedFromProviderEvent);

            handlers.ShouldBeNull();
        }
예제 #4
0
        public void DomainEventHandlerResolver_GetDomainEventHandlers_ResponseReceivedFromProviderEvent_EventNotConfigured_EventHandlersReturned()
        {
            String handlerTypeName = "MessagingService.BusinessLogic.EventHandling.EmailDomainEventHandler, MessagingService.BusinessLogic";
            Dictionary <String, String[]> eventHandlerConfiguration = new Dictionary <String, String[]>();

            ResponseReceivedFromEmailProviderEvent responseReceivedFromProviderEvent = TestData.ResponseReceivedFromEmailProviderEvent;

            eventHandlerConfiguration.Add("RandomEvent", new String[] { handlerTypeName });
            Mock <IDomainEventHandler>       domainEventHandler           = new Mock <IDomainEventHandler>();
            Func <Type, IDomainEventHandler> createDomainEventHandlerFunc = (type) => { return(domainEventHandler.Object); };

            DomainEventHandlerResolver resolver = new DomainEventHandlerResolver(eventHandlerConfiguration, createDomainEventHandlerFunc);

            List <IDomainEventHandler> handlers = resolver.GetDomainEventHandlers(responseReceivedFromProviderEvent);

            handlers.ShouldBeNull();
        }
예제 #5
0
        /// <summary>
        /// Handles the specific domain event.
        /// </summary>
        /// <param name="domainEvent">The domain event.</param>
        /// <param name="cancellationToken">The cancellation token.</param>
        private async Task HandleSpecificDomainEvent(ResponseReceivedFromEmailProviderEvent domainEvent,
                                                     CancellationToken cancellationToken)
        {
            EmailAggregate emailAggregate = await this.AggregateRepository.GetLatestVersion(domainEvent.MessageId, cancellationToken);

            // Update the aggregate with the status request information

            // Get the message status from the provider
            MessageStatusResponse messageStatus = await this.EmailServiceProxy.GetMessageStatus(domainEvent.ProviderEmailReference,
                                                                                                domainEvent.EventTimestamp.DateTime,
                                                                                                domainEvent.EventTimestamp.DateTime,
                                                                                                cancellationToken);

            // Update the aggregate with the response
            switch (messageStatus.MessageStatus)
            {
            case MessageStatus.Failed:
                emailAggregate.MarkMessageAsFailed(messageStatus.ProviderStatusDescription, messageStatus.Timestamp);
                break;

            case MessageStatus.Rejected:
                emailAggregate.MarkMessageAsRejected(messageStatus.ProviderStatusDescription, messageStatus.Timestamp);
                break;

            case MessageStatus.Bounced:
                emailAggregate.MarkMessageAsBounced(messageStatus.ProviderStatusDescription, messageStatus.Timestamp);
                break;

            case MessageStatus.Spam:
                emailAggregate.MarkMessageAsSpam(messageStatus.ProviderStatusDescription, messageStatus.Timestamp);
                break;

            case MessageStatus.Delivered:
                emailAggregate.MarkMessageAsDelivered(messageStatus.ProviderStatusDescription, messageStatus.Timestamp);
                break;

            case MessageStatus.Unknown:
                break;
            }

            // Save the changes
            await this.AggregateRepository.SaveChanges(emailAggregate, cancellationToken);
        }
 /// <summary>
 /// Plays the event.
 /// </summary>
 /// <param name="domainEvent">The domain event.</param>
 private void PlayEvent(ResponseReceivedFromEmailProviderEvent domainEvent)
 {
     this.ProviderEmailReference   = domainEvent.ProviderEmailReference;
     this.ProviderRequestReference = domainEvent.ProviderRequestReference;
     this.MessageStatus            = MessageStatus.Sent;
 }