diff --git a/TransactionProcessor.Aggregates.Tests/FloatActivityAggregateTests.cs b/TransactionProcessor.Aggregates.Tests/FloatActivityAggregateTests.cs index e669b5e..5771d04 100644 --- a/TransactionProcessor.Aggregates.Tests/FloatActivityAggregateTests.cs +++ b/TransactionProcessor.Aggregates.Tests/FloatActivityAggregateTests.cs @@ -1,4 +1,5 @@ using Shouldly; +using SimpleResults; using TransactionProcessor.Testing; namespace TransactionProcessor.Aggregates.Tests; @@ -15,7 +16,8 @@ public void FloatActivityAggregate_CanBeCreated_IsCreated() [Fact] public void FloatActivityAggregate_RecordCreditPurchase_PurchaseRecorded() { FloatActivityAggregate aggregate = FloatActivityAggregate.Create(TestData.FloatAggregateId); - aggregate.RecordCreditPurchase(TestData.EstateId, TestData.CreditPurchasedDateTime, TestData.FloatCreditAmount, TestData.FloatCreditId); + Result result = aggregate.RecordCreditPurchase(TestData.EstateId, TestData.CreditPurchasedDateTime, TestData.FloatCreditAmount, TestData.FloatCreditId); + result.IsSuccess.ShouldBeTrue(); aggregate.CreditCount.ShouldBe(1); aggregate.Credits.Contains(TestData.FloatCreditId).ShouldBeTrue(); } @@ -26,7 +28,8 @@ public void FloatActivityAggregate_RecordCreditPurchase_DuplicateCredit_Purchase FloatActivityAggregate aggregate = FloatActivityAggregate.Create(TestData.FloatAggregateId); aggregate.RecordCreditPurchase(TestData.EstateId, TestData.CreditPurchasedDateTime, TestData.FloatCreditAmount, TestData.FloatCreditId); aggregate.CreditCount.ShouldBe(1); - aggregate.RecordCreditPurchase(TestData.EstateId, TestData.CreditPurchasedDateTime, TestData.FloatCreditAmount, TestData.FloatCreditId); + Result result = aggregate.RecordCreditPurchase(TestData.EstateId, TestData.CreditPurchasedDateTime, TestData.FloatCreditAmount, TestData.FloatCreditId); + result.IsSuccess.ShouldBeTrue(); aggregate.CreditCount.ShouldBe(1); } @@ -34,7 +37,8 @@ public void FloatActivityAggregate_RecordCreditPurchase_DuplicateCredit_Purchase public void FloatActivityAggregate_RecordTransactionAgainstFloat_TransactionRecorded() { FloatActivityAggregate aggregate = FloatActivityAggregate.Create(TestData.FloatAggregateId); - aggregate.RecordTransactionAgainstFloat(TestData.EstateId, TestData.TransactionDateTime, TestData.TransactionAmount, TestData.TransactionId); + Result result = aggregate.RecordTransactionAgainstFloat(TestData.EstateId, TestData.TransactionDateTime, TestData.TransactionAmount, TestData.TransactionId); + result.IsSuccess.ShouldBeTrue(); aggregate.DebitCount.ShouldBe(1); aggregate.Debits.Contains(TestData.TransactionId).ShouldBeTrue(); } @@ -45,7 +49,8 @@ public void FloatActivityAggregate_RecordTransactionAgainstFloat_DuplicateTransa FloatActivityAggregate aggregate = FloatActivityAggregate.Create(TestData.FloatAggregateId); aggregate.RecordTransactionAgainstFloat(TestData.EstateId, TestData.TransactionDateTime, TestData.TransactionAmount, TestData.TransactionId); aggregate.DebitCount.ShouldBe(1); - aggregate.RecordTransactionAgainstFloat(TestData.EstateId, TestData.TransactionDateTime, TestData.TransactionAmount, TestData.TransactionId); + Result result = aggregate.RecordTransactionAgainstFloat(TestData.EstateId, TestData.TransactionDateTime, TestData.TransactionAmount, TestData.TransactionId); + result.IsSuccess.ShouldBeTrue(); aggregate.DebitCount.ShouldBe(1); } } \ No newline at end of file diff --git a/TransactionProcessor.Aggregates/FloatActivityAggregate.cs b/TransactionProcessor.Aggregates/FloatActivityAggregate.cs index a93c87b..875b9f7 100644 --- a/TransactionProcessor.Aggregates/FloatActivityAggregate.cs +++ b/TransactionProcessor.Aggregates/FloatActivityAggregate.cs @@ -2,6 +2,7 @@ using Shared.DomainDrivenDesign.EventSourcing; using Shared.EventStore.Aggregate; using Shared.General; +using SimpleResults; using TransactionProcessor.DomainEvents; namespace TransactionProcessor.Aggregates @@ -22,7 +23,7 @@ public static void PlayEvent(this FloatActivityAggregate aggregate, aggregate.Debits.Add(domainEvent.DebitId); } - public static void RecordCreditPurchase(this FloatActivityAggregate aggregate, + public static Result RecordCreditPurchase(this FloatActivityAggregate aggregate, Guid estateId, DateTime activityDateTime, Decimal creditAmount, @@ -30,23 +31,27 @@ public static void RecordCreditPurchase(this FloatActivityAggregate aggregate, { if (aggregate.Credits.Any(c => c == creditId)) - return; + return Result.Success(); FloatActivityDomainEvents.FloatAggregateCreditedEvent floatAggregateCreditedEvent = new(aggregate.AggregateId, estateId, activityDateTime, creditAmount, creditId); aggregate.ApplyAndAppend(floatAggregateCreditedEvent); + + return Result.Success(); } - public static void RecordTransactionAgainstFloat(this FloatActivityAggregate aggregate, - Guid estateId, - DateTime activityDateTime, - Decimal transactionAmount, - Guid transactionId) + public static Result RecordTransactionAgainstFloat(this FloatActivityAggregate aggregate, + Guid estateId, + DateTime activityDateTime, + Decimal transactionAmount, + Guid transactionId) { if (aggregate.Debits.Any(c => c == transactionId)) - return; + return Result.Success(); FloatActivityDomainEvents.FloatAggregateDebitedEvent floatAggregateCreditedEvent = new(aggregate.AggregateId, estateId, activityDateTime, transactionAmount, transactionId); aggregate.ApplyAndAppend(floatAggregateCreditedEvent); + + return Result.Success(); } } diff --git a/TransactionProcessor.BusinessLogic/Services/FloatDomainService.cs b/TransactionProcessor.BusinessLogic/Services/FloatDomainService.cs index 1402b4e..cc560a0 100644 --- a/TransactionProcessor.BusinessLogic/Services/FloatDomainService.cs +++ b/TransactionProcessor.BusinessLogic/Services/FloatDomainService.cs @@ -142,8 +142,9 @@ public async Task RecordCreditPurchase(FloatActivityCommands.RecordCredi FloatActivityAggregate floatActivityAggregate = getFloatActivityResult.Data; - floatActivityAggregate.RecordCreditPurchase(command.EstateId, command.CreditPurchasedDateTime, command.Amount, command.CreditId); - + Result stateResult = floatActivityAggregate.RecordCreditPurchase(command.EstateId, command.CreditPurchasedDateTime, command.Amount, command.CreditId); + if (stateResult.IsFailed) + return ResultHelpers.CreateFailure(stateResult); Result saveResult = await this.AggregateService.Save(floatActivityAggregate, cancellationToken); if (saveResult.IsFailed) return ResultHelpers.CreateFailure(saveResult); @@ -175,7 +176,9 @@ public async Task RecordTransaction(FloatActivityCommands.RecordTransact FloatActivityAggregate floatActivityAggregate = getFloatActivityResult.Data; - floatActivityAggregate.RecordTransactionAgainstFloat(command.EstateId, getTransactionResult.Data.TransactionDateTime, getTransactionResult.Data.TransactionAmount.GetValueOrDefault(), command.TransactionId); + Result stateResult = floatActivityAggregate.RecordTransactionAgainstFloat(command.EstateId, getTransactionResult.Data.TransactionDateTime, getTransactionResult.Data.TransactionAmount.GetValueOrDefault(), command.TransactionId); + if (stateResult.IsFailed) + return ResultHelpers.CreateFailure(stateResult); Result saveResult = await this.AggregateService.Save(floatActivityAggregate, cancellationToken); if (saveResult.IsFailed)