diff --git a/TransactionProcessor.Aggregates.Tests/MerchantDepositListAggregateTests.cs b/TransactionProcessor.Aggregates.Tests/MerchantDepositListAggregateTests.cs index 9d28b502..6eb487c0 100644 --- a/TransactionProcessor.Aggregates.Tests/MerchantDepositListAggregateTests.cs +++ b/TransactionProcessor.Aggregates.Tests/MerchantDepositListAggregateTests.cs @@ -1,6 +1,7 @@ using Shared.EventStore.Aggregate; using Shared.ValueObjects; using Shouldly; +using SimpleResults; using TransactionProcessor.Models.Merchant; using TransactionProcessor.Testing; @@ -17,7 +18,8 @@ public void MerchantDepositListAggregate_Create_IsCreated() { TestData.SettlementScheduleModel); MerchantDepositListAggregate merchantDepositListAggregate = MerchantDepositListAggregate.Create(TestData.MerchantId); - merchantDepositListAggregate.Create(merchantAggregate, TestData.DateMerchantCreated); + Result result = merchantDepositListAggregate.Create(merchantAggregate, TestData.DateMerchantCreated); + result.IsSuccess.ShouldBeTrue(); merchantDepositListAggregate.AggregateId.ShouldBe(TestData.MerchantId); merchantDepositListAggregate.EstateId.ShouldBe(TestData.EstateId); @@ -34,7 +36,8 @@ public void MerchantDepositListAggregate_Create_AlreadyCreated_IsCreated() MerchantDepositListAggregate merchantDepositListAggregate = MerchantDepositListAggregate.Create(TestData.MerchantId); merchantDepositListAggregate.Create(merchantAggregate, TestData.DateMerchantCreated); - merchantDepositListAggregate.Create(merchantAggregate, TestData.DateMerchantCreated); + Result result = merchantDepositListAggregate.Create(merchantAggregate, TestData.DateMerchantCreated); + result.IsSuccess.ShouldBeTrue(); merchantDepositListAggregate.AggregateId.ShouldBe(TestData.MerchantId); merchantDepositListAggregate.EstateId.ShouldBe(TestData.EstateId); @@ -46,7 +49,9 @@ public void MerchantDepositListAggregate_Create_MerchantNotCreated_ErrorThrown() MerchantAggregate merchantAggregate = MerchantAggregate.Create(TestData.MerchantId); MerchantDepositListAggregate merchantDepositListAggregate = MerchantDepositListAggregate.Create(TestData.MerchantId); - Should.Throw(() => { merchantDepositListAggregate.Create(merchantAggregate, TestData.DateMerchantCreated); }); + Result result = merchantDepositListAggregate.Create(merchantAggregate, TestData.DateMerchantCreated); + result.IsFailed.ShouldBeTrue(); + result.Status.ShouldBe(ResultStatus.Invalid); } [Fact] @@ -58,10 +63,11 @@ public void MerchantDepositListAggregate_MakeDeposit_AutomaticDepositSource_Depo MerchantDepositListAggregate merchantDepositListAggregate = MerchantDepositListAggregate.Create(TestData.MerchantId); merchantDepositListAggregate.Create(merchantAggregate, TestData.DateMerchantCreated); - merchantDepositListAggregate.MakeDeposit(TestData.MerchantDepositSourceAutomatic, + Result result = merchantDepositListAggregate.MakeDeposit(TestData.MerchantDepositSourceAutomatic, TestData.DepositReference, TestData.DepositDateTime, TestData.DepositAmount); + result.IsSuccess.ShouldBeTrue(); List depositListModel = merchantDepositListAggregate.GetDeposits(); depositListModel.ShouldHaveSingleItem(); @@ -80,7 +86,8 @@ public void MerchantDepositListAggregate_MakeDeposit_DepositMade() { MerchantDepositListAggregate merchantDepositListAggregate = MerchantDepositListAggregate.Create(TestData.MerchantId); merchantDepositListAggregate.Create(merchantAggregate, TestData.DateMerchantCreated); - merchantDepositListAggregate.MakeDeposit(TestData.MerchantDepositSourceManual, TestData.DepositReference, TestData.DepositDateTime, TestData.DepositAmount); + Result result = merchantDepositListAggregate.MakeDeposit(TestData.MerchantDepositSourceManual, TestData.DepositReference, TestData.DepositDateTime, TestData.DepositAmount); + result.IsSuccess.ShouldBeTrue(); List depositListModel = merchantDepositListAggregate.GetDeposits(); depositListModel.ShouldHaveSingleItem(); @@ -100,12 +107,30 @@ public void MerchantDepositListAggregate_MakeDeposit_DepositSourceNotSet_ErrorTh MerchantDepositListAggregate merchantDepositListAggregate = MerchantDepositListAggregate.Create(TestData.MerchantId); merchantDepositListAggregate.Create(merchantAggregate, TestData.DateMerchantCreated); - Should.Throw(() => { - merchantDepositListAggregate.MakeDeposit(MerchantDepositSource.NotSet, + Result result = merchantDepositListAggregate.MakeDeposit(MerchantDepositSource.NotSet, + TestData.DepositReference, + TestData.DepositDateTime, + TestData.DepositAmount); + result.IsFailed.ShouldBeTrue(); + result.Status.ShouldBe(ResultStatus.Invalid); + } + + [Fact] + public void MerchantDepositListAggregate_MakeDeposit_DepositSourceInvalid_ErrorThrown() + { + MerchantAggregate merchantAggregate = MerchantAggregate.Create(TestData.MerchantId); + merchantAggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated, TestData.AddressModel, TestData.ContactModel, + TestData.SettlementScheduleModel); + + MerchantDepositListAggregate merchantDepositListAggregate = MerchantDepositListAggregate.Create(TestData.MerchantId); + merchantDepositListAggregate.Create(merchantAggregate, TestData.DateMerchantCreated); + + Result result = merchantDepositListAggregate.MakeDeposit((MerchantDepositSource)99, TestData.DepositReference, TestData.DepositDateTime, TestData.DepositAmount); - }); + result.IsFailed.ShouldBeTrue(); + result.Status.ShouldBe(ResultStatus.Invalid); } [Fact] @@ -121,24 +146,24 @@ public void MerchantDepositListAggregate_MakeDeposit_DuplicateDeposit_ErrorThrow List depositListModel = merchantDepositListAggregate.GetDeposits(); depositListModel.ShouldHaveSingleItem(); - Should.Throw(() => { - merchantDepositListAggregate.MakeDeposit(TestData.MerchantDepositSourceManual, + Result result = merchantDepositListAggregate.MakeDeposit(TestData.MerchantDepositSourceManual, TestData.DepositReference, TestData.DepositDateTime, TestData.DepositAmount); - }); + result.IsFailed.ShouldBeTrue(); + result.Status.ShouldBe(ResultStatus.Invalid); } [Fact] public void MerchantDepositListAggregate_MakeDeposit_MerchantDepositListNotCreated_ErrorThrown() { MerchantDepositListAggregate merchantDepositListAggregate = MerchantDepositListAggregate.Create(TestData.MerchantId); - Should.Throw(() => { - merchantDepositListAggregate.MakeDeposit(TestData.MerchantDepositSourceManual, + Result result = merchantDepositListAggregate.MakeDeposit(TestData.MerchantDepositSourceManual, TestData.DepositReference, TestData.DepositDateTime, TestData.DepositAmount); - }); + result.IsFailed.ShouldBeTrue(); + result.Status.ShouldBe(ResultStatus.Invalid); } [Fact] @@ -150,11 +175,13 @@ public void MerchantDepositListAggregate_MakeDeposit_TwoDeposits_BothDepositsMad MerchantDepositListAggregate merchantDepositListAggregate = MerchantDepositListAggregate.Create(TestData.MerchantId); merchantDepositListAggregate.Create(merchantAggregate, TestData.DateMerchantCreated); - merchantDepositListAggregate.MakeDeposit(TestData.MerchantDepositSourceManual, TestData.DepositReference, TestData.DepositDateTime, TestData.DepositAmount); - merchantDepositListAggregate.MakeDeposit(TestData.MerchantDepositSourceManual, + Result result = merchantDepositListAggregate.MakeDeposit(TestData.MerchantDepositSourceManual, TestData.DepositReference, TestData.DepositDateTime, TestData.DepositAmount); + result.IsSuccess.ShouldBeTrue(); + result = merchantDepositListAggregate.MakeDeposit(TestData.MerchantDepositSourceManual, TestData.DepositReference2, TestData.DepositDateTime2, TestData.DepositAmount2); + result.IsSuccess.ShouldBeTrue(); List depositListModel = merchantDepositListAggregate.GetDeposits(); depositListModel.Count.ShouldBe(2); @@ -169,14 +196,16 @@ public void MerchantDepositListAggregate_MakeDeposit_TwoDepositsOneMonthApartSam MerchantDepositListAggregate merchantDepositListAggregate = MerchantDepositListAggregate.Create(TestData.MerchantId); merchantDepositListAggregate.Create(merchantAggregate, TestData.DateMerchantCreated); - merchantDepositListAggregate.MakeDeposit(TestData.MerchantDepositSourceManual, + Result result = merchantDepositListAggregate.MakeDeposit(TestData.MerchantDepositSourceManual, "Test Data Gen Deposit", new DateTime(2021, 1, 1, 0, 0, 0), PositiveMoney.Create(Money.Create(650.00m))); - merchantDepositListAggregate.MakeDeposit(TestData.MerchantDepositSourceManual, + result.IsSuccess.ShouldBeTrue(); + result = merchantDepositListAggregate.MakeDeposit(TestData.MerchantDepositSourceManual, "Test Data Gen Deposit", new DateTime(2021, 2, 1, 0, 0, 0), PositiveMoney.Create(Money.Create(650.00m))); + result.IsSuccess.ShouldBeTrue(); List depositListModel = merchantDepositListAggregate.GetDeposits(); depositListModel.Count.ShouldBe(2); @@ -191,14 +220,16 @@ public void MerchantDepositListAggregate_MakeDeposit_TwoDepositsSameDetailsApart MerchantDepositListAggregate merchantDepositListAggregate = MerchantDepositListAggregate.Create(TestData.MerchantId); merchantDepositListAggregate.Create(merchantAggregate, TestData.DateMerchantCreated); - merchantDepositListAggregate.MakeDeposit(TestData.MerchantDepositSourceManual, + Result result = merchantDepositListAggregate.MakeDeposit(TestData.MerchantDepositSourceManual, "Test Data Gen Deposit", new DateTime(2021, 1, 1, 0, 0, 0), PositiveMoney.Create(Money.Create(650.00m))); - merchantDepositListAggregate.MakeDeposit(TestData.MerchantDepositSourceManual, + result.IsSuccess.ShouldBeTrue(); + result = merchantDepositListAggregate.MakeDeposit(TestData.MerchantDepositSourceManual, "Test Data Gen Deposit", new DateTime(2021, 1, 1, 0, 0, 0), PositiveMoney.Create(Money.Create(934.00m))); + result.IsSuccess.ShouldBeTrue(); List depositListModel = merchantDepositListAggregate.GetDeposits(); depositListModel.Count.ShouldBe(2); @@ -214,17 +245,22 @@ public void MerchantDepositListAggregate_MakeWithdrawal_DuplicateWithdrawal_Erro merchantDepositListAggregate.Create(merchantAggregate, TestData.DateMerchantCreated); merchantDepositListAggregate.MakeWithdrawal(TestData.WithdrawalDateTime, TestData.WithdrawalAmount); + List withdrawalListModel = merchantDepositListAggregate.GetWithdrawals(); withdrawalListModel.ShouldHaveSingleItem(); - Should.Throw(() => { merchantDepositListAggregate.MakeWithdrawal(TestData.WithdrawalDateTime, TestData.WithdrawalAmount); }); + Result result = merchantDepositListAggregate.MakeWithdrawal(TestData.WithdrawalDateTime, TestData.WithdrawalAmount); + result.IsFailed.ShouldBeTrue(); + result.Status.ShouldBe(ResultStatus.Invalid); } [Fact] public void MerchantDepositListAggregate_MakeWithdrawal_MerchantDepositListNotCreated_ErrorThrown() { MerchantDepositListAggregate merchantDepositListAggregate = MerchantDepositListAggregate.Create(TestData.MerchantId); - Should.Throw(() => { merchantDepositListAggregate.MakeWithdrawal(TestData.WithdrawalDateTime, TestData.WithdrawalAmount); }); + Result result = merchantDepositListAggregate.MakeWithdrawal(TestData.WithdrawalDateTime, TestData.WithdrawalAmount); + result.IsFailed.ShouldBeTrue(); + result.Status.ShouldBe(ResultStatus.Invalid); } [Fact] @@ -236,8 +272,11 @@ public void MerchantDepositListAggregate_MakeWithdrawal_TwoWithdrawals_BothWithd MerchantDepositListAggregate merchantDepositListAggregate = MerchantDepositListAggregate.Create(TestData.MerchantId); merchantDepositListAggregate.Create(merchantAggregate, TestData.DateMerchantCreated); - merchantDepositListAggregate.MakeWithdrawal(TestData.WithdrawalDateTime, TestData.WithdrawalAmount); - merchantDepositListAggregate.MakeWithdrawal(TestData.WithdrawalDateTime2, TestData.WithdrawalAmount2); + Result result = merchantDepositListAggregate.MakeWithdrawal(TestData.WithdrawalDateTime, TestData.WithdrawalAmount); + result.IsSuccess.ShouldBeTrue(); + + result = merchantDepositListAggregate.MakeWithdrawal(TestData.WithdrawalDateTime2, TestData.WithdrawalAmount2); + result.IsSuccess.ShouldBeTrue(); List withdrawalListModel = merchantDepositListAggregate.GetWithdrawals(); withdrawalListModel.Count.ShouldBe(2); @@ -252,8 +291,10 @@ public void MerchantDepositListAggregate_MakeWithdrawal_TwoWithdrawalsOneMonthAp MerchantDepositListAggregate merchantDepositListAggregate = MerchantDepositListAggregate.Create(TestData.MerchantId); merchantDepositListAggregate.Create(merchantAggregate, TestData.DateMerchantCreated); - merchantDepositListAggregate.MakeWithdrawal(new DateTime(2021, 1, 1, 0, 0, 0), PositiveMoney.Create(Money.Create(650.00m))); - merchantDepositListAggregate.MakeWithdrawal(new DateTime(2021, 2, 1, 0, 0, 0), PositiveMoney.Create(Money.Create(650.00m))); + Result result = merchantDepositListAggregate.MakeWithdrawal(new DateTime(2021, 1, 1, 0, 0, 0), PositiveMoney.Create(Money.Create(650.00m))); + result.IsSuccess.ShouldBeTrue(); + result = merchantDepositListAggregate.MakeWithdrawal(new DateTime(2021, 2, 1, 0, 0, 0), PositiveMoney.Create(Money.Create(650.00m))); + result.IsSuccess.ShouldBeTrue(); List withdrawalListModel = merchantDepositListAggregate.GetWithdrawals(); withdrawalListModel.Count.ShouldBe(2); @@ -268,8 +309,10 @@ public void MerchantDepositListAggregate_MakeWithdrawal_TwoWithdrawalsSameDetail MerchantDepositListAggregate merchantDepositListAggregate = MerchantDepositListAggregate.Create(TestData.MerchantId); merchantDepositListAggregate.Create(merchantAggregate, TestData.DateMerchantCreated); - merchantDepositListAggregate.MakeWithdrawal(new DateTime(2021, 1, 1, 0, 0, 0), PositiveMoney.Create(Money.Create(650.00m))); - merchantDepositListAggregate.MakeWithdrawal(new DateTime(2021, 1, 1, 0, 0, 0), PositiveMoney.Create(Money.Create(934.00m))); + Result result = merchantDepositListAggregate.MakeWithdrawal(new DateTime(2021, 1, 1, 0, 0, 0), PositiveMoney.Create(Money.Create(650.00m))); + result.IsSuccess.ShouldBeTrue(); + result = merchantDepositListAggregate.MakeWithdrawal(new DateTime(2021, 1, 1, 0, 0, 0), PositiveMoney.Create(Money.Create(934.00m))); + result.IsSuccess.ShouldBeTrue(); List withdrawalListModel = merchantDepositListAggregate.GetWithdrawals(); withdrawalListModel.Count.ShouldBe(2); @@ -284,7 +327,8 @@ public void MerchantDepositListAggregate_MakeWithdrawal_WithdrawalMade() { MerchantDepositListAggregate merchantDepositListAggregate = MerchantDepositListAggregate.Create(TestData.MerchantId); merchantDepositListAggregate.Create(merchantAggregate, TestData.DateMerchantCreated); - merchantDepositListAggregate.MakeWithdrawal(TestData.WithdrawalDateTime, TestData.WithdrawalAmount); + Result result = merchantDepositListAggregate.MakeWithdrawal(TestData.WithdrawalDateTime, TestData.WithdrawalAmount); + result.IsSuccess.ShouldBeTrue(); List withdrawalListModel = merchantDepositListAggregate.GetWithdrawals(); withdrawalListModel.ShouldHaveSingleItem(); diff --git a/TransactionProcessor.Aggregates/MerchantDepositListAggregate.cs b/TransactionProcessor.Aggregates/MerchantDepositListAggregate.cs index 19b6b763..2cd69fd6 100644 --- a/TransactionProcessor.Aggregates/MerchantDepositListAggregate.cs +++ b/TransactionProcessor.Aggregates/MerchantDepositListAggregate.cs @@ -5,6 +5,7 @@ using Shared.EventStore.Aggregate; using Shared.General; using Shared.ValueObjects; +using SimpleResults; using TransactionProcessor.DomainEvents; using TransactionProcessor.Models.Merchant; @@ -12,24 +13,28 @@ namespace TransactionProcessor.Aggregates{ public static class MerchantDepositListAggregateExtensions{ #region Methods - public static void Create(this MerchantDepositListAggregate aggregate, + public static Result Create(this MerchantDepositListAggregate aggregate, MerchantAggregate merchantAggregate, DateTime dateCreated){ - aggregate.EnsureMerchantHasBeenCreated(merchantAggregate); + Result result = aggregate.EnsureMerchantHasBeenCreated(merchantAggregate); + if (result.IsFailed) + return result; + // Ensure this aggregate has not already been created if (aggregate.IsCreated) - return; + return Result.Success(); - MerchantDomainEvents.MerchantDepositListCreatedEvent merchantDepositListCreatedEvent = - new MerchantDomainEvents.MerchantDepositListCreatedEvent(aggregate.AggregateId, merchantAggregate.EstateId, dateCreated); + MerchantDomainEvents.MerchantDepositListCreatedEvent merchantDepositListCreatedEvent = new(aggregate.AggregateId, merchantAggregate.EstateId, dateCreated); aggregate.ApplyAndAppend(merchantDepositListCreatedEvent); + + return Result.Success(); } - public static List GetDeposits(this MerchantDepositListAggregate aggregate){ - List deposits = new (); + public static List GetDeposits(this MerchantDepositListAggregate aggregate){ + List deposits = new (); if (aggregate.Deposits.Any()){ - aggregate.Deposits.ForEach(d => deposits.Add(new TransactionProcessor.Models.Merchant.Deposit { + aggregate.Deposits.ForEach(d => deposits.Add(new Deposit { Amount = d.Amount, DepositDateTime = d.DepositDateTime, DepositId = d.DepositId, @@ -54,42 +59,58 @@ public static List GetWithdrawals(this MerchantDepositListAggregate return withdrawals; } - public static void MakeDeposit(this MerchantDepositListAggregate aggregate, + public static Result MakeDeposit(this MerchantDepositListAggregate aggregate, MerchantDepositSource source, String reference, DateTime depositDateTime, PositiveMoney amount){ - String depositData = $"{depositDateTime.ToString("yyyyMMdd hh:mm:ss.fff")}-{reference}-{amount:N2}-{source}"; + String depositData = $"{depositDateTime:yyyyMMdd hh:mm:ss.fff}-{reference}-{amount:N2}-{source}"; Guid depositId = aggregate.GenerateGuidFromString(depositData); - aggregate.EnsureMerchantDepositListHasBeenCreated(); - aggregate.EnsureNotDuplicateDeposit(depositId); + Result result = aggregate.EnsureMerchantDepositListHasBeenCreated(); + if (result.IsFailed) + return result; + + result = aggregate.EnsureNotDuplicateDeposit(depositId); + if (result.IsFailed) + return result; + // TODO: Change amount to a value object (PositiveAmount VO) - aggregate.EnsureDepositSourceHasBeenSet(source); + result = aggregate.EnsureDepositSourceHasBeenSet(source); + if (result.IsFailed) + return result; if (source == MerchantDepositSource.Manual){ - MerchantDomainEvents.ManualDepositMadeEvent manualDepositMadeEvent = - new MerchantDomainEvents.ManualDepositMadeEvent(aggregate.AggregateId, aggregate.EstateId, depositId, reference, depositDateTime, amount.Value); + MerchantDomainEvents.ManualDepositMadeEvent manualDepositMadeEvent = new(aggregate.AggregateId, aggregate.EstateId, depositId, reference, depositDateTime, amount.Value); aggregate.ApplyAndAppend(manualDepositMadeEvent); + return Result.Success(); } else if (source == MerchantDepositSource.Automatic){ - MerchantDomainEvents.AutomaticDepositMadeEvent automaticDepositMadeEvent = - new MerchantDomainEvents.AutomaticDepositMadeEvent(aggregate.AggregateId, aggregate.EstateId, depositId, reference, depositDateTime, amount.Value); + MerchantDomainEvents.AutomaticDepositMadeEvent automaticDepositMadeEvent = new(aggregate.AggregateId, aggregate.EstateId, depositId, reference, depositDateTime, amount.Value); aggregate.ApplyAndAppend(automaticDepositMadeEvent); + return Result.Success(); } + + return Result.Invalid("Invalid Deposit Source"); } - public static void MakeWithdrawal(this MerchantDepositListAggregate aggregate, + public static Result MakeWithdrawal(this MerchantDepositListAggregate aggregate, DateTime withdrawalDateTime, PositiveMoney amount){ String depositData = $"{withdrawalDateTime.ToString("yyyyMMdd hh:mm:ss.fff")}-{amount:N2}"; Guid withdrawalId = aggregate.GenerateGuidFromString(depositData); - aggregate.EnsureMerchantDepositListHasBeenCreated(); - aggregate.EnsureNotDuplicateWithdrawal(withdrawalId); + Result result = aggregate.EnsureMerchantDepositListHasBeenCreated(); + if (result.IsFailed) + return result; + result = aggregate.EnsureNotDuplicateWithdrawal(withdrawalId); + if (result.IsFailed) + return result; MerchantDomainEvents.WithdrawalMadeEvent withdrawalMadeEvent = new(aggregate.AggregateId, aggregate.EstateId, withdrawalId, withdrawalDateTime, amount.Value); aggregate.ApplyAndAppend(withdrawalMadeEvent); + + return Result.Success(); } public static void PlayEvent(this MerchantDepositListAggregate aggregate, MerchantDomainEvents.MerchantDepositListCreatedEvent merchantDepositListCreatedEvent){ @@ -122,34 +143,39 @@ public static void PlayEvent(this MerchantDepositListAggregate aggregate, Mercha aggregate.Withdrawals.Add(withdrawal); } - private static void EnsureDepositSourceHasBeenSet(this MerchantDepositListAggregate aggregate, MerchantDepositSource merchantDepositSource){ + private static Result EnsureDepositSourceHasBeenSet(this MerchantDepositListAggregate aggregate, MerchantDepositSource merchantDepositSource){ if (merchantDepositSource == MerchantDepositSource.NotSet){ - throw new InvalidOperationException("Merchant deposit source must be set"); + return Result.Invalid("Merchant deposit source must be set"); } + return Result.Success(); } - private static void EnsureMerchantDepositListHasBeenCreated(this MerchantDepositListAggregate aggregate){ + private static Result EnsureMerchantDepositListHasBeenCreated(this MerchantDepositListAggregate aggregate){ if (aggregate.IsCreated == false){ - throw new InvalidOperationException("Merchant Deposit List has not been created"); + return Result.Invalid("Merchant Deposit List has not been created"); } + return Result.Success(); } - private static void EnsureMerchantHasBeenCreated(this MerchantDepositListAggregate aggregate, MerchantAggregate merchantAggregate){ + private static Result EnsureMerchantHasBeenCreated(this MerchantDepositListAggregate aggregate, MerchantAggregate merchantAggregate){ if (merchantAggregate.IsCreated == false){ - throw new InvalidOperationException("Merchant has not been created"); + return Result.Invalid("Merchant has not been created"); } + return Result.Success(); } - private static void EnsureNotDuplicateDeposit(this MerchantDepositListAggregate aggregate, Guid depositId){ + private static Result EnsureNotDuplicateDeposit(this MerchantDepositListAggregate aggregate, Guid depositId){ if (aggregate.Deposits.Any(d => d.DepositId == depositId)){ - throw new InvalidOperationException($"Deposit Id [{depositId}] already made for merchant [{aggregate.AggregateId}]"); + return Result.Invalid($"Deposit Id [{depositId}] already made for merchant [{aggregate.AggregateId}]"); } + return Result.Success(); } - private static void EnsureNotDuplicateWithdrawal(this MerchantDepositListAggregate aggregate, Guid withdrawalId){ + private static Result EnsureNotDuplicateWithdrawal(this MerchantDepositListAggregate aggregate, Guid withdrawalId){ if (aggregate.Withdrawals.Any(d => d.WithdrawalId == withdrawalId)){ - throw new InvalidOperationException($"Withdrawal Id [{withdrawalId}] already made for merchant [{aggregate.AggregateId}]"); + return Result.Invalid($"Withdrawal Id [{withdrawalId}] already made for merchant [{aggregate.AggregateId}]"); } + return Result.Success(); } private static Guid GenerateGuidFromString(this MerchantDepositListAggregate aggregate, String input){ diff --git a/TransactionProcessor.BusinessLogic/Services/FloatDomainService.cs b/TransactionProcessor.BusinessLogic/Services/FloatDomainService.cs index cc560a0f..2bdcb175 100644 --- a/TransactionProcessor.BusinessLogic/Services/FloatDomainService.cs +++ b/TransactionProcessor.BusinessLogic/Services/FloatDomainService.cs @@ -163,8 +163,7 @@ public async Task RecordTransaction(FloatActivityCommands.RecordTransact Result getTransactionResult = await DomainServiceHelper.GetAggregateOrFailure(ct => this.AggregateService.GetLatest(command.TransactionId, ct), command.TransactionId, cancellationToken); if (getTransactionResult.IsFailed) return ResultHelpers.CreateFailure(getTransactionResult); - - + Guid floatId = IdGenerationService.GenerateFloatAggregateId(command.EstateId, getTransactionResult.Data.ContractId, getTransactionResult.Data.ProductId); // Generate the id for the activity aggregate diff --git a/TransactionProcessor.BusinessLogic/Services/MerchantDomainService.cs b/TransactionProcessor.BusinessLogic/Services/MerchantDomainService.cs index 07a76ffb..82240115 100644 --- a/TransactionProcessor.BusinessLogic/Services/MerchantDomainService.cs +++ b/TransactionProcessor.BusinessLogic/Services/MerchantDomainService.cs @@ -311,16 +311,20 @@ public async Task MakeMerchantDeposit(MerchantCommands.MakeMerchantDepos MerchantDepositListAggregate merchantDepositListAggregate = getDepositListResult.Data; if (merchantDepositListAggregate.IsCreated == false) { - merchantDepositListAggregate.Create(merchantAggregate, command.RequestDto.DepositDateTime); + Result createResult = merchantDepositListAggregate.Create(merchantAggregate, command.RequestDto.DepositDateTime); + if (createResult.IsFailed) + return ResultHelpers.CreateFailure(createResult); } PositiveMoney amount = PositiveMoney.Create(Money.Create(command.RequestDto.Amount)); MerchantDepositSource depositSource = command.DepositSource switch { - DataTransferObjects.Requests.Merchant.MerchantDepositSource.Manual => Models.Merchant.MerchantDepositSource.Manual, - _ => Models.Merchant.MerchantDepositSource.Automatic, + DataTransferObjects.Requests.Merchant.MerchantDepositSource.Manual => MerchantDepositSource.Manual, + _ => MerchantDepositSource.Automatic, }; - merchantDepositListAggregate.MakeDeposit(depositSource, command.RequestDto.Reference, command.RequestDto.DepositDateTime, amount); + Result stateResult = merchantDepositListAggregate.MakeDeposit(depositSource, command.RequestDto.Reference, command.RequestDto.DepositDateTime, amount); + if (stateResult.IsFailed) + return ResultHelpers.CreateFailure(stateResult); Result saveResult = await this.AggregateService.Save(merchantDepositListAggregate, cancellationToken); if (saveResult.IsFailed) @@ -380,11 +384,12 @@ public async Task MakeMerchantWithdrawal(MerchantCommands.MakeMerchantWi return Result.Invalid($"Not enough credit available for withdrawal of [{command.RequestDto.Amount}]. Balance is {projectionState.merchant.balance}"); } - // If we are here we have enough credit to withdraw PositiveMoney amount = PositiveMoney.Create(Money.Create(command.RequestDto.Amount)); - merchantDepositListAggregate.MakeWithdrawal(command.RequestDto.WithdrawalDateTime, amount); + Result stateResult = merchantDepositListAggregate.MakeWithdrawal(command.RequestDto.WithdrawalDateTime, amount); + if (stateResult.IsFailed) + return ResultHelpers.CreateFailure(stateResult); Result saveResult = await this.AggregateService.Save(merchantDepositListAggregate, cancellationToken); if (saveResult.IsFailed)