/// <summary>
        /// Messages the send to recipient failure.
        /// </summary>
        /// <param name="providerSMSReference">The provider SMS reference.</param>
        public void ReceiveResponseFromProvider(String providerSMSReference)
        {
            ResponseReceivedFromSMSProviderEvent responseReceivedFromProviderEvent =
                new ResponseReceivedFromSMSProviderEvent(this.AggregateId, providerSMSReference);

            this.ApplyAndAppend(responseReceivedFromProviderEvent);
        }
        /// <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(ResponseReceivedFromSMSProviderEvent domainEvent,
                                                     CancellationToken cancellationToken)
        {
            SMSAggregate smsAggregate = 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.SMSServiceProxy.GetMessageStatus(domainEvent.ProviderSMSReference,
                                                                                              cancellationToken);

            // Update the aggregate with the response
            switch (messageStatus.MessageStatus)
            {
            case MessageStatus.Expired:
                smsAggregate.MarkMessageAsExpired(messageStatus.ProviderStatusDescription, messageStatus.Timestamp);
                break;

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

            case MessageStatus.Undeliverable:
                smsAggregate.MarkMessageAsUndeliverable(messageStatus.ProviderStatusDescription, messageStatus.Timestamp);
                break;

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

            // Save the changes
            await this.AggregateRepository.SaveChanges(smsAggregate, cancellationToken);
        }
        public void ResponseReceivedFromSMSProviderEvent_CanBeCreated_IsCreated()
        {
            ResponseReceivedFromSMSProviderEvent requestSentToProviderEvent = new ResponseReceivedFromSMSProviderEvent(TestData.MessageId, TestData.ProviderSMSReference);

            requestSentToProviderEvent.ShouldNotBeNull();
            requestSentToProviderEvent.AggregateId.ShouldBe(TestData.MessageId);
            requestSentToProviderEvent.EventId.ShouldNotBe(Guid.Empty);
            requestSentToProviderEvent.MessageId.ShouldBe(TestData.MessageId);
            requestSentToProviderEvent.ProviderSMSReference.ShouldBe(TestData.ProviderSMSReference);
        }
 /// <summary>
 /// Plays the event.
 /// </summary>
 /// <param name="domainEvent">The domain event.</param>
 private void PlayEvent(ResponseReceivedFromSMSProviderEvent domainEvent)
 {
     this.ProviderReference = domainEvent.ProviderSMSReference;
     this.MessageStatus     = MessageStatus.Sent;
 }