From 3a5a814bec35687e208791171a548f44dff330d6 Mon Sep 17 00:00:00 2001 From: Timo Notheisen Date: Wed, 18 Sep 2024 07:52:54 +0200 Subject: [PATCH] feat: notify peers about identity deletion in case of pending and terminated relationships --- .../IdentityDeletedDomainEventHandler.cs | 4 ++- ...tityDeletionCancelledDomainEventHandler.cs | 4 ++- .../IdentityToBeDeletedDomainEventHandler.cs | 5 ++-- ...lationship.CountAsActiveExpressionTests.cs | 30 +++++++++++++++++++ .../Aggregates/Relationships/Relationship.cs | 7 +++++ 5 files changed, 46 insertions(+), 4 deletions(-) diff --git a/Modules/Relationships/src/Relationships.Application/DomainEvents/Incoming/IdentityDeleted/IdentityDeletedDomainEventHandler.cs b/Modules/Relationships/src/Relationships.Application/DomainEvents/Incoming/IdentityDeleted/IdentityDeletedDomainEventHandler.cs index 387bca4297..d3832adfe9 100644 --- a/Modules/Relationships/src/Relationships.Application/DomainEvents/Incoming/IdentityDeleted/IdentityDeletedDomainEventHandler.cs +++ b/Modules/Relationships/src/Relationships.Application/DomainEvents/Incoming/IdentityDeleted/IdentityDeletedDomainEventHandler.cs @@ -1,4 +1,5 @@ using Backbone.BuildingBlocks.Application.Abstractions.Infrastructure.EventBus; +using Backbone.BuildingBlocks.Application.Extensions; using Backbone.Modules.Relationships.Application.Infrastructure.Persistence.Repository; using Backbone.Modules.Relationships.Domain.Aggregates.Relationships; using Backbone.Modules.Relationships.Domain.DomainEvents.Incoming; @@ -26,7 +27,8 @@ public async Task Handle(IdentityDeletedDomainEvent @event) private async Task> GetRelationshipsOf(string identityAddress) { var relationships = (await _relationshipsRepository - .FindRelationships(r => (r.From == identityAddress || r.To == identityAddress) && r.Status == RelationshipStatus.Active, + .FindRelationships( + Relationship.HasParticipant(identityAddress).And(Relationship.HasStatusInWhichPeerShouldBeNotifiedAboutDeletion()), CancellationToken.None)).ToList(); return relationships; } diff --git a/Modules/Relationships/src/Relationships.Application/DomainEvents/Incoming/IdentityDeletionCancelled/IdentityDeletionCancelledDomainEventHandler.cs b/Modules/Relationships/src/Relationships.Application/DomainEvents/Incoming/IdentityDeletionCancelled/IdentityDeletionCancelledDomainEventHandler.cs index 475ba0c59e..fdd1639dd1 100644 --- a/Modules/Relationships/src/Relationships.Application/DomainEvents/Incoming/IdentityDeletionCancelled/IdentityDeletionCancelledDomainEventHandler.cs +++ b/Modules/Relationships/src/Relationships.Application/DomainEvents/Incoming/IdentityDeletionCancelled/IdentityDeletionCancelledDomainEventHandler.cs @@ -1,4 +1,5 @@ using Backbone.BuildingBlocks.Application.Abstractions.Infrastructure.EventBus; +using Backbone.BuildingBlocks.Application.Extensions; using Backbone.Modules.Relationships.Application.Infrastructure.Persistence.Repository; using Backbone.Modules.Relationships.Domain.Aggregates.Relationships; using Backbone.Modules.Relationships.Domain.DomainEvents.Incoming; @@ -26,7 +27,8 @@ public async Task Handle(IdentityDeletionCancelledDomainEvent @event) private async Task> GetRelationshipsOf(string identityAddress) { var relationships = (await _relationshipsRepository - .FindRelationships(r => (r.From == identityAddress || r.To == identityAddress) && r.Status == RelationshipStatus.Active, + .FindRelationships( + Relationship.HasParticipant(identityAddress).And(Relationship.HasStatusInWhichPeerShouldBeNotifiedAboutDeletion()), CancellationToken.None)).ToList(); return relationships; } diff --git a/Modules/Relationships/src/Relationships.Application/DomainEvents/Incoming/IdentityToBeDeleted/IdentityToBeDeletedDomainEventHandler.cs b/Modules/Relationships/src/Relationships.Application/DomainEvents/Incoming/IdentityToBeDeleted/IdentityToBeDeletedDomainEventHandler.cs index 4d9389ceab..afadfd0d1b 100644 --- a/Modules/Relationships/src/Relationships.Application/DomainEvents/Incoming/IdentityToBeDeleted/IdentityToBeDeletedDomainEventHandler.cs +++ b/Modules/Relationships/src/Relationships.Application/DomainEvents/Incoming/IdentityToBeDeleted/IdentityToBeDeletedDomainEventHandler.cs @@ -1,4 +1,5 @@ using Backbone.BuildingBlocks.Application.Abstractions.Infrastructure.EventBus; +using Backbone.BuildingBlocks.Application.Extensions; using Backbone.Modules.Relationships.Application.Infrastructure.Persistence.Repository; using Backbone.Modules.Relationships.Domain.Aggregates.Relationships; using Backbone.Modules.Relationships.Domain.DomainEvents.Incoming; @@ -26,9 +27,9 @@ public async Task Handle(IdentityToBeDeletedDomainEvent @event) private async Task> GetPendingAndActiveRelationshipsOf(string identityAddress) { var relationships = (await _relationshipsRepository - .FindRelationships(r => (r.From == identityAddress || r.To == identityAddress) && r.Status == RelationshipStatus.Active, + .FindRelationships( + Relationship.HasParticipant(identityAddress).And(Relationship.HasStatusInWhichPeerShouldBeNotifiedAboutDeletion()), CancellationToken.None)).ToList(); - return relationships; } diff --git a/Modules/Relationships/src/Relationships.Domain/Aggregates/Relationships/Relationship.CountAsActiveExpressionTests.cs b/Modules/Relationships/src/Relationships.Domain/Aggregates/Relationships/Relationship.CountAsActiveExpressionTests.cs index e3447b597a..c6f44e5e68 100644 --- a/Modules/Relationships/src/Relationships.Domain/Aggregates/Relationships/Relationship.CountAsActiveExpressionTests.cs +++ b/Modules/Relationships/src/Relationships.Domain/Aggregates/Relationships/Relationship.CountAsActiveExpressionTests.cs @@ -105,6 +105,30 @@ public void HasParticipant_recognizes_foreign_addresses() } #endregion + + #region HasStatusInWhichPeerShouldBeNotifiedAboutDeletion + + [Theory] + [InlineData(RelationshipStatus.Pending, true)] + [InlineData(RelationshipStatus.Rejected, false)] + [InlineData(RelationshipStatus.Revoked, false)] + [InlineData(RelationshipStatus.Active, true)] + [InlineData(RelationshipStatus.Terminated, true)] + [InlineData(RelationshipStatus.DeletionProposed, false)] + [InlineData(RelationshipStatus.ReadyForDeletion, false)] + public void HasStatusInWhichPeerShouldBeNotifiedAboutDeletion_with_status_Pending(RelationshipStatus status, bool expected) + { + // Arrange + var relationship = TestData.CreateRelationshipInStatus(status); + + // Act + var result = relationship.EvaluateHasStatusInWhichPeerShouldBeNotifiedAboutDeletion(); + + // Assert + result.Should().Be(expected); + } + + #endregion } file static class RelationshipExtensions @@ -120,4 +144,10 @@ public static bool EvaluateCountsAsActiveExpression(this Relationship relationsh var expression = Relationship.CountsAsActive(); return expression.Compile()(relationship); } + + public static bool EvaluateHasStatusInWhichPeerShouldBeNotifiedAboutDeletion(this Relationship relationship) + { + var expression = Relationship.HasStatusInWhichPeerShouldBeNotifiedAboutDeletion(); + return expression.Compile()(relationship); + } } diff --git a/Modules/Relationships/src/Relationships.Domain/Aggregates/Relationships/Relationship.cs b/Modules/Relationships/src/Relationships.Domain/Aggregates/Relationships/Relationship.cs index f7e6d1340c..d129c67266 100644 --- a/Modules/Relationships/src/Relationships.Domain/Aggregates/Relationships/Relationship.cs +++ b/Modules/Relationships/src/Relationships.Domain/Aggregates/Relationships/Relationship.cs @@ -372,5 +372,12 @@ public static Expression> CountsAsActive() r.Status != RelationshipStatus.ReadyForDeletion; } + public static Expression> HasStatusInWhichPeerShouldBeNotifiedAboutDeletion() + { + return r => r.Status == RelationshipStatus.Pending || + r.Status == RelationshipStatus.Active || + r.Status == RelationshipStatus.Terminated; + } + #endregion }