diff --git a/TransactionProcessor.Aggregates.Tests/EstateAggregateTests.cs b/TransactionProcessor.Aggregates.Tests/EstateAggregateTests.cs index 3f813615..d46b7dd3 100644 --- a/TransactionProcessor.Aggregates.Tests/EstateAggregateTests.cs +++ b/TransactionProcessor.Aggregates.Tests/EstateAggregateTests.cs @@ -219,5 +219,27 @@ public void EstateAggregate_RemoveOperatorFromEstate_OperatorWithIdNotAlreadyAdd result.Message.ShouldContain($"Operator not added to this Estate with Id [{TestData.OperatorId}]"); } + + [Fact] + public void EstateAggregate_RemoveOperatorFromEstate_ThenReAdd_OperatorAdded() + { + EstateAggregate aggregate = EstateAggregate.Create(TestData.EstateId); + aggregate.Create(TestData.EstateName); + aggregate.AddOperator(TestData.OperatorId); + + Estate estate = aggregate.GetEstate(); + estate.Operators.ShouldHaveSingleItem(); + estate.Operators.Single().IsDeleted.ShouldBeFalse(); + aggregate.RemoveOperator(TestData.OperatorId); + + estate = aggregate.GetEstate(); + estate.Operators.ShouldHaveSingleItem(); + estate.Operators.Single().IsDeleted.ShouldBeTrue(); + aggregate.AddOperator(TestData.OperatorId); + + estate = aggregate.GetEstate(); + estate.Operators.ShouldHaveSingleItem(); + estate.Operators.Single().IsDeleted.ShouldBeFalse(); + } } } diff --git a/TransactionProcessor.Aggregates/EstateAggregate.cs b/TransactionProcessor.Aggregates/EstateAggregate.cs index 436e1d67..4b095bdb 100644 --- a/TransactionProcessor.Aggregates/EstateAggregate.cs +++ b/TransactionProcessor.Aggregates/EstateAggregate.cs @@ -21,8 +21,7 @@ public static Result AddOperator(this EstateAggregate aggregate, if (result.IsFailed) return result; - EstateDomainEvents.OperatorAddedToEstateEvent operatorAddedToEstateEvent = - new EstateDomainEvents.OperatorAddedToEstateEvent(aggregate.AggregateId, operatorId); + EstateDomainEvents.OperatorAddedToEstateEvent operatorAddedToEstateEvent = new(aggregate.AggregateId, operatorId); aggregate.ApplyAndAppend(operatorAddedToEstateEvent); @@ -118,13 +117,18 @@ public static void PlayEvent(this EstateAggregate aggregate, EstateDomainEvents. aggregate.EstateReference = domainEvent.EstateReference; } - public static void PlayEvent(this EstateAggregate aggregate, EstateDomainEvents.OperatorAddedToEstateEvent domainEvent){ - TransactionProcessor.Models.Estate.Operator @operator = new() { - IsDeleted = false, - OperatorId = domainEvent.OperatorId - }; + public static void PlayEvent(this EstateAggregate aggregate, EstateDomainEvents.OperatorAddedToEstateEvent domainEvent) { + var @operator = aggregate.Operators.SingleOrDefault(o => o.Key == domainEvent.OperatorId); - aggregate.Operators.Add(domainEvent.OperatorId, @operator); + if (@operator.Value != null){ + @operator.Value.IsDeleted = false; + return; + } + + aggregate.Operators.Add(domainEvent.OperatorId, new Operator { + IsDeleted = false, + OperatorId = domainEvent.OperatorId + }); } public static void PlayEvent(this EstateAggregate aggregate, EstateDomainEvents.OperatorRemovedFromEstateEvent domainEvent){ @@ -140,8 +144,8 @@ private static Result CheckEstateHasBeenCreated(this EstateAggregate aggregate){ private static Result CheckOperatorHasNotAlreadyBeenCreated(this EstateAggregate aggregate, Guid operatorId) { - Boolean operatorRecordExists = aggregate.Operators.ContainsKey(operatorId); - if (operatorRecordExists == true) { + Boolean operatorRecordExists = aggregate.Operators.Any(o => o.Key == operatorId && o.Value.IsDeleted == false); + if (operatorRecordExists) { return Result.Invalid($"Duplicate operator details are not allowed, an operator already exists on this estate with Id [{operatorId}]"); } return Result.Success();