public async Task HandleAsync(AccountDeletedIntegrationEvent integrationEvent, CancellationToken cancellationToken = default) { try { var user = await _userRepository.GetByIdAsync(integrationEvent.AccountId); user.AddDeletedEvent(integrationEvent.CorrelationId); await _communicationBus.DispatchDomainEventsAsync(user, cancellationToken); await _userRepository.DeleteAsync(user); var userDeletedIntegrationEvent = new UserDeletedIntegrationEvent(integrationEvent.CorrelationId, user.Id); await _integrationEventBus.PublishIntegrationEventAsync(userDeletedIntegrationEvent); } catch (Exception e) { _logger.LogIntegrationEventError(ServiceComponentEnumeration.RivaUsers, integrationEvent, "userId={userId}, message={message}, stackTrace={stackTrace}", integrationEvent.AccountId, e.Message, e.StackTrace); var userDeletionCompletedIntegrationEventFailure = new UserDeletionCompletedIntegrationEventFailure( integrationEvent.CorrelationId, IntegrationEventErrorCodeEnumeration.UnexpectedError.DisplayName, IntegrationEventErrorMessage.UnexpectedError, integrationEvent.AccountId); await _integrationEventBus.PublishIntegrationEventAsync(userDeletionCompletedIntegrationEventFailure); } }
public async Task HandleAsync_Should_Complete_Account_Deletion_With_Failure_When_UserDeletionCompletedIntegrationEventFailure_Is_Received() { var userDeletionCompletedIntegrationEventFailure = new UserDeletionCompletedIntegrationEventFailure(Guid.NewGuid(), DateTimeOffset.UtcNow, "AnyCode", "AnyReason", Guid.NewGuid()); var message = $"Could not finish {nameof(Account)} deletion process."; const string logMessage = "accountId={accountId}, message={message}, reason={reason}, code={code}"; var logParams = new object[] { userDeletionCompletedIntegrationEventFailure.UserId, message, userDeletionCompletedIntegrationEventFailure.Reason, userDeletionCompletedIntegrationEventFailure.Code }; var accountCreatedDomainEvent = new AccountCreatedDomainEvent( userDeletionCompletedIntegrationEventFailure.UserId, userDeletionCompletedIntegrationEventFailure.UserId, "*****@*****.**", true, "PasswordHash", Guid.NewGuid(), DateTimeOffset.UtcNow, null); var domainEvents = new List <IDomainEvent> { accountCreatedDomainEvent }; _loggerMock.Setup(x => x.LogIntegrationEventError(It.IsAny <ServiceComponentEnumeration>(), It.IsAny <IIntegrationEvent>(), It.IsAny <string>(), It.IsAny <object[]>())) .Verifiable(); _integrationEventBusMock.Setup(x => x.PublishIntegrationEventAsync(It.IsAny <IIntegrationEvent>())) .Returns(Task.CompletedTask) .Verifiable(); _domainEventStoreMock.Setup(x => x.FindAllAsync(It.IsAny <Guid>())).ReturnsAsync(domainEvents); _accountRepositoryMock.Setup(x => x.AddAsync(It.IsAny <Account>())).Returns(Task.CompletedTask); _accountRepositoryMock.Setup(x => x.UpdateAsync(It.IsAny <Account>())).Returns(Task.CompletedTask); Func <Task> result = async() => await _userDeletionCompletedIntegrationEventFailure.HandleAsync(userDeletionCompletedIntegrationEventFailure); await result.Should().NotThrowAsync <Exception>(); _loggerMock.Verify(x => x.LogIntegrationEventError( It.Is <ServiceComponentEnumeration>(s => Equals(s, ServiceComponentEnumeration.RivaIdentity)), It.Is <IIntegrationEvent>(ie => ie == userDeletionCompletedIntegrationEventFailure), It.Is <string>(m => m.Equals(logMessage)), It.Is <object[]>(p => !p.Except(logParams).Any()))); _integrationEventBusMock.Verify(x => x.PublishIntegrationEventAsync(It.Is <IIntegrationEvent>(ie => IsPublishedIntegrationEventCorrect((AccountDeletionCompletedIntegrationEventFailure)ie, userDeletionCompletedIntegrationEventFailure.CorrelationId, userDeletionCompletedIntegrationEventFailure.UserId, userDeletionCompletedIntegrationEventFailure.Code, userDeletionCompletedIntegrationEventFailure.Reason)))); }
public async Task HandleAsync_Should_Complete_Account_Deletion_With_Failure_When_UserDeletionCompletedIntegrationEventFailure_Is_Received_And_Any_Exception_Is_Thrown() { var userDeletionCompletedIntegrationEventFailure = new UserDeletionCompletedIntegrationEventFailure(Guid.NewGuid(), DateTimeOffset.UtcNow, "AnyCode", "AnyReason", Guid.NewGuid()); var message = $"Could not finish {nameof(Account)} deletion process."; const string logMessage = "accountId={accountId}, message={message}, reason={reason}, code={code}"; var logParams = new object[] { userDeletionCompletedIntegrationEventFailure.UserId, message, userDeletionCompletedIntegrationEventFailure.Reason, userDeletionCompletedIntegrationEventFailure.Code }; var exception = new Exception("Exception occured."); const string exceptionLogMessage = "userId={userId}, message={message}, stackTrace={stackTrace}"; _loggerMock.Setup(x => x.LogIntegrationEventError(It.IsAny <ServiceComponentEnumeration>(), It.IsAny <IIntegrationEvent>(), It.IsAny <string>(), It.IsAny <object[]>())) .Verifiable(); _integrationEventBusMock.Setup(x => x.PublishIntegrationEventAsync(It.IsAny <IIntegrationEvent>())) .Returns(Task.CompletedTask) .Verifiable(); _domainEventStoreMock.Setup(x => x.FindAllAsync(It.IsAny <Guid>())).ThrowsAsync(exception); Func <Task> result = async() => await _userDeletionCompletedIntegrationEventFailure.HandleAsync(userDeletionCompletedIntegrationEventFailure); await result.Should().NotThrowAsync <Exception>(); _loggerMock.Verify(x => x.LogIntegrationEventError( It.Is <ServiceComponentEnumeration>(s => Equals(s, ServiceComponentEnumeration.RivaIdentity)), It.Is <IIntegrationEvent>(ie => ie == userDeletionCompletedIntegrationEventFailure), It.Is <string>(m => m.Equals(logMessage)), It.Is <object[]>(p => !p.Except(logParams).Any()))); _integrationEventBusMock.Verify(x => x.PublishIntegrationEventAsync(It.Is <IIntegrationEvent>(ie => IsPublishedIntegrationEventCorrect((AccountDeletionCompletedIntegrationEventFailure)ie, userDeletionCompletedIntegrationEventFailure.CorrelationId, userDeletionCompletedIntegrationEventFailure.UserId, userDeletionCompletedIntegrationEventFailure.Code, userDeletionCompletedIntegrationEventFailure.Reason)))); _loggerMock.Verify( x => x.LogIntegrationEventError( It.Is <ServiceComponentEnumeration>(s => Equals(s, ServiceComponentEnumeration.RivaIdentity)), It.Is <IIntegrationEvent>(ie => ie == userDeletionCompletedIntegrationEventFailure), It.Is <string>(m => m.Equals(exceptionLogMessage)), It.IsAny <object[]>())); }
public async Task HandleAsync(AnnouncementPreferencesDeletionCompletedIntegrationEventFailure integrationEvent, CancellationToken cancellationToken = default) { var message = $"Could not finish {nameof(User)} deletion process."; _logger.LogIntegrationEventError(ServiceComponentEnumeration.RivaUsers, integrationEvent, "userId={userId}, message={message}, reason={reason}, code={code}", integrationEvent.UserId, message, integrationEvent.Reason, integrationEvent.Code); var userDeletionCompletedIntegrationEventFailure = new UserDeletionCompletedIntegrationEventFailure( integrationEvent.CorrelationId, integrationEvent.Code, integrationEvent.Reason, integrationEvent.UserId); var userDeletionCompletedIntegrationEventFailureTask = _integrationEventBus.PublishIntegrationEventAsync(userDeletionCompletedIntegrationEventFailure); try { var domainEvents = await _domainEventStore.FindAllAsync(integrationEvent.UserId); var userCreatedDomainEvent = (UserCreatedDomainEvent)domainEvents.First(x => x is UserCreatedDomainEvent); var user = User.Builder() .SetId(integrationEvent.UserId) .SetEmail(userCreatedDomainEvent.Email) .SetServiceActive(userCreatedDomainEvent.ServiceActive) .SetAnnouncementPreferenceLimit(userCreatedDomainEvent.AnnouncementPreferenceLimit) .SetAnnouncementSendingFrequency(userCreatedDomainEvent.AnnouncementSendingFrequency) .Build(); await _userRepository.AddAsync(user); user.AddEvents(domainEvents); user.ApplyEvents(); await _userRepository.UpdateAsync(user); } catch (Exception e) { _logger.LogIntegrationEventError(ServiceComponentEnumeration.RivaUsers, integrationEvent, "userId={userId}, message={message}, stackTrace={stackTrace}", integrationEvent.UserId, e.Message, e.StackTrace); } await userDeletionCompletedIntegrationEventFailureTask; }