From 0f2fc132e8c89137f68859c858eb97cf7ddedca4 Mon Sep 17 00:00:00 2001 From: Stuart Ferguson Date: Mon, 6 Jan 2025 11:07:25 +0000 Subject: [PATCH 1/2] Add transaction recording functionality - Implemented `RecordTransactionCommand` in the mediator. - Updated tests to mock and verify transaction recording. - Enhanced `IFloatDomainService` and `FloatDomainService` for transaction handling. - Registered new command handler in the `MediatorRegistry`. --- .../Mediator/MediatorTests.cs | 1 + .../FloatRequestHandlerTests.cs | 3 +-- .../Services/FloatDomainServiceTests.cs | 3 +++ .../RequestHandlers/FloatRequestHandler.cs | 9 ++++++++- .../Services/IFloatDomainService.cs | 20 +++++++++++++++++++ .../FloatActivityAggregate.cs | 1 - TransactionProcessor.Testing/TestData.cs | 2 +- .../Bootstrapper/MediatorRegistry.cs | 3 ++- 8 files changed, 36 insertions(+), 6 deletions(-) diff --git a/TransactionProcessor.BusinessLogic.Tests/Mediator/MediatorTests.cs b/TransactionProcessor.BusinessLogic.Tests/Mediator/MediatorTests.cs index e9d60b6a..f958372c 100644 --- a/TransactionProcessor.BusinessLogic.Tests/Mediator/MediatorTests.cs +++ b/TransactionProcessor.BusinessLogic.Tests/Mediator/MediatorTests.cs @@ -40,6 +40,7 @@ public MediatorTests() this.Requests.Add(TestData.RecordCreditPurchaseCommand); this.Requests.Add(TestData.CalculateFeesForTransactionCommand); this.Requests.Add(TestData.AddSettledMerchantFeeCommand); + this.Requests.Add(TestData.RecordTransactionCommand); // TODO: this needs the query handling function refactoring to use a repository not the context direct //this.Requests.Add(TestData.GetVoucherByVoucherCodeQuery); //this.Requests.Add(TestData.GetVoucherByTransactionIdQuery); diff --git a/TransactionProcessor.BusinessLogic.Tests/RequestHandler/FloatRequestHandlerTests.cs b/TransactionProcessor.BusinessLogic.Tests/RequestHandler/FloatRequestHandlerTests.cs index 47e67c1a..44e824a9 100644 --- a/TransactionProcessor.BusinessLogic.Tests/RequestHandler/FloatRequestHandlerTests.cs +++ b/TransactionProcessor.BusinessLogic.Tests/RequestHandler/FloatRequestHandlerTests.cs @@ -31,8 +31,7 @@ public async Task FloatRequestHandler_RecordCreditPurchaseForFloatRequest_IsHand { Mock floatDomainService = new Mock(); FloatRequestHandler handler = new FloatRequestHandler(floatDomainService.Object); - - + floatDomainService.Setup(f => f.RecordCreditPurchase(It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success()); var command = TestData.RecordCreditPurchaseForFloatCommand; diff --git a/TransactionProcessor.BusinessLogic.Tests/Services/FloatDomainServiceTests.cs b/TransactionProcessor.BusinessLogic.Tests/Services/FloatDomainServiceTests.cs index 15cfa669..3b6cc5a9 100644 --- a/TransactionProcessor.BusinessLogic.Tests/Services/FloatDomainServiceTests.cs +++ b/TransactionProcessor.BusinessLogic.Tests/Services/FloatDomainServiceTests.cs @@ -32,6 +32,7 @@ public class FloatDomainServiceTests private readonly Mock SecurityServiceClient; private readonly Mock> FloatAggregateRepository; private readonly Mock> FloatActivityAggregateRepository; + private readonly Mock> TransactionAggregateRepository; private readonly FloatDomainService FloatDomainService; @@ -46,8 +47,10 @@ public FloatDomainServiceTests(){ this.SecurityServiceClient = new Mock(); this.FloatAggregateRepository = new Mock>(); this.FloatActivityAggregateRepository = new Mock>(); + this.TransactionAggregateRepository = new Mock>(); this.FloatDomainService = new FloatDomainService(this.FloatAggregateRepository.Object, this.FloatActivityAggregateRepository.Object, + this.TransactionAggregateRepository.Object, this.EstateClient.Object, this.SecurityServiceClient.Object); } diff --git a/TransactionProcessor.BusinessLogic/RequestHandlers/FloatRequestHandler.cs b/TransactionProcessor.BusinessLogic/RequestHandlers/FloatRequestHandler.cs index f221c853..34a2f4ab 100644 --- a/TransactionProcessor.BusinessLogic/RequestHandlers/FloatRequestHandler.cs +++ b/TransactionProcessor.BusinessLogic/RequestHandlers/FloatRequestHandler.cs @@ -16,7 +16,9 @@ namespace TransactionProcessor.BusinessLogic.RequestHandlers public class FloatRequestHandler :IRequestHandler, IRequestHandler, - IRequestHandler { + IRequestHandler, + IRequestHandler + { private readonly IFloatDomainService FloatDomainService; public FloatRequestHandler(IFloatDomainService floatDomainService){ @@ -37,5 +39,10 @@ public async Task Handle(FloatActivityCommands.RecordCreditPurchaseComma CancellationToken cancellationToken) { return await this.FloatDomainService.RecordCreditPurchase(command, cancellationToken); } + + public async Task Handle(FloatActivityCommands.RecordTransactionCommand request, + CancellationToken cancellationToken) { + return await this.FloatDomainService.RecordTransaction(request, cancellationToken); + } } } diff --git a/TransactionProcessor.BusinessLogic/Services/IFloatDomainService.cs b/TransactionProcessor.BusinessLogic/Services/IFloatDomainService.cs index 41b85de9..22b92e8b 100644 --- a/TransactionProcessor.BusinessLogic/Services/IFloatDomainService.cs +++ b/TransactionProcessor.BusinessLogic/Services/IFloatDomainService.cs @@ -39,22 +39,27 @@ Task RecordCreditPurchase(FloatCommands.RecordCreditPurchaseForFloatComm Task RecordCreditPurchase(FloatActivityCommands.RecordCreditPurchaseCommand command, CancellationToken cancellationToken); + Task RecordTransaction(FloatActivityCommands.RecordTransactionCommand command, + CancellationToken cancellationToken); } public class FloatDomainService : IFloatDomainService{ private readonly IAggregateRepository FloatAggregateRepository; private readonly IAggregateRepository FloatActivityAggregateRepository; + private readonly IAggregateRepository TransactionAggregateRepository; private readonly IEstateClient EstateClient; private readonly ISecurityServiceClient SecurityServiceClient; public FloatDomainService(IAggregateRepository floatAggregateRepository, IAggregateRepository floatActivityAggregateRepository, + IAggregateRepository transactionAggregateRepository, IEstateClient estateClient, ISecurityServiceClient securityServiceClient) { this.FloatAggregateRepository = floatAggregateRepository; this.FloatActivityAggregateRepository = floatActivityAggregateRepository; + this.TransactionAggregateRepository = transactionAggregateRepository; this.EstateClient = estateClient; this.SecurityServiceClient = securityServiceClient; } @@ -192,6 +197,21 @@ public async Task RecordCreditPurchase(FloatActivityCommands.RecordCredi }, command.FloatId, cancellationToken); return result; } + + public async Task RecordTransaction(FloatActivityCommands.RecordTransactionCommand command, + CancellationToken cancellationToken) { + Result getTransactionResult = await this.TransactionAggregateRepository.GetLatestVersion(command.TransactionId, cancellationToken); + if (getTransactionResult.IsFailed) + return ResultHelpers.CreateFailure(getTransactionResult); + + Guid floatId = IdGenerationService.GenerateFloatAggregateId(command.EstateId, getTransactionResult.Data.ContractId, getTransactionResult.Data.ProductId); + + Result result = await ApplyFloatActivityUpdates((floatAggregate) => { + floatAggregate.RecordTransactionAgainstFloat(command.EstateId, getTransactionResult.Data.TransactionDateTime, getTransactionResult.Data.TransactionAmount.GetValueOrDefault()); + return Result.Success(); + }, floatId, cancellationToken); + return result; + } } public static class DomainServiceHelper diff --git a/TransactionProcessor.FloatAggregate/FloatActivityAggregate.cs b/TransactionProcessor.FloatAggregate/FloatActivityAggregate.cs index 57921898..f6a36404 100644 --- a/TransactionProcessor.FloatAggregate/FloatActivityAggregate.cs +++ b/TransactionProcessor.FloatAggregate/FloatActivityAggregate.cs @@ -8,7 +8,6 @@ namespace TransactionProcessor.FloatAggregate; public static class FloatActivityAggregateExtensions { - public static void PlayEvent(this FloatActivityAggregate aggregate, FloatAggregateCreditedEvent domainEvent) { } diff --git a/TransactionProcessor.Testing/TestData.cs b/TransactionProcessor.Testing/TestData.cs index 9435b727..1bf14380 100644 --- a/TransactionProcessor.Testing/TestData.cs +++ b/TransactionProcessor.Testing/TestData.cs @@ -687,7 +687,7 @@ public static Dictionary AdditionalTransactionMetaDataForPataPaw public static SettlementCommands.AddSettledFeeToSettlementCommand AddSettledFeeToSettlementCommand => new(SettlementDate,MerchantId,EstateId,TransactionFeeId, TransactionId); public static FloatActivityCommands.RecordCreditPurchaseCommand RecordCreditPurchaseCommand => new(EstateId, FloatAggregateId, CreditPurchasedDateTime, FloatCreditAmount); - + public static FloatActivityCommands.RecordTransactionCommand RecordTransactionCommand => new(EstateId, TransactionId); public static TransactionCommands.CalculateFeesForTransactionCommand CalculateFeesForTransactionCommand => new(TransactionId, TransactionDateTime, EstateId, MerchantId); public static TransactionCommands.AddSettledMerchantFeeCommand AddSettledMerchantFeeCommand => new(TransactionId, CalculatedFeeValue, TransactionFeeCalculateDateTime, CalculationType.Percentage, TransactionFeeId, TransactionFeeValue, SettlementDate, SettlementAggregateId); diff --git a/TransactionProcessor/Bootstrapper/MediatorRegistry.cs b/TransactionProcessor/Bootstrapper/MediatorRegistry.cs index e7b27f78..00e6fa09 100644 --- a/TransactionProcessor/Bootstrapper/MediatorRegistry.cs +++ b/TransactionProcessor/Bootstrapper/MediatorRegistry.cs @@ -54,7 +54,8 @@ public MediatorRegistry() this.AddSingleton, FloatRequestHandler>(); this.AddSingleton, FloatRequestHandler>(); this.AddSingleton, FloatRequestHandler>(); - + this.AddSingleton, FloatRequestHandler>(); + this.AddSingleton>, MerchantRequestHandler>(); this.AddSingleton>, MerchantRequestHandler>(); this.AddSingleton>>, MerchantRequestHandler>(); From 45ae04aa326c3481bfb65ea4ab21b26714369eef Mon Sep 17 00:00:00 2001 From: Stuart Ferguson Date: Mon, 6 Jan 2025 11:14:30 +0000 Subject: [PATCH 2/2] Update package versions and target framework to net8.0 Updated `ClientProxyBase` and `SecurityService.Client` to version `2025.1.1` across multiple projects. Other related packages for `EstateManagement` and `Microsoft.EntityFrameworkCore` were also included or updated. The target framework has been set to `net8.0` to leverage the latest features and improvements. --- .../TransactionProcessor.BusinessLogic.csproj | 3 ++- .../TransactionProcessor.Client.csproj | 2 +- ...TransactionProcessor.IntegrationTesting.Helpers.csproj | 1 + .../TransactionProcessor.IntegrationTests.csproj | 8 ++++---- ...nsactionProcessor.ReconciliationAggregate.Tests.csproj | 2 ++ ...TransactionProcessor.SettlementAggregates.Tests.csproj | 2 ++ .../TransactionProcessor.Testing.csproj | 5 +++++ .../TransactionProcessor.Tests.csproj | 2 ++ ...TransactionProcessor.TransactionAggregate.Tests.csproj | 2 ++ .../TransactionProcessor.VoucherAggregate.Tests.csproj | 2 ++ TransactionProcessor/TransactionProcessor.csproj | 2 ++ 11 files changed, 25 insertions(+), 6 deletions(-) diff --git a/TransactionProcessor.BusinessLogic/TransactionProcessor.BusinessLogic.csproj b/TransactionProcessor.BusinessLogic/TransactionProcessor.BusinessLogic.csproj index 919c195d..bfdb2e6f 100644 --- a/TransactionProcessor.BusinessLogic/TransactionProcessor.BusinessLogic.csproj +++ b/TransactionProcessor.BusinessLogic/TransactionProcessor.BusinessLogic.csproj @@ -5,11 +5,12 @@ + - + diff --git a/TransactionProcessor.Client/TransactionProcessor.Client.csproj b/TransactionProcessor.Client/TransactionProcessor.Client.csproj index 0ff96536..8555980c 100644 --- a/TransactionProcessor.Client/TransactionProcessor.Client.csproj +++ b/TransactionProcessor.Client/TransactionProcessor.Client.csproj @@ -6,7 +6,7 @@ - + diff --git a/TransactionProcessor.IntegrationTesting.Helpers/TransactionProcessor.IntegrationTesting.Helpers.csproj b/TransactionProcessor.IntegrationTesting.Helpers/TransactionProcessor.IntegrationTesting.Helpers.csproj index 39547076..83eedfbf 100644 --- a/TransactionProcessor.IntegrationTesting.Helpers/TransactionProcessor.IntegrationTesting.Helpers.csproj +++ b/TransactionProcessor.IntegrationTesting.Helpers/TransactionProcessor.IntegrationTesting.Helpers.csproj @@ -7,6 +7,7 @@ + diff --git a/TransactionProcessor.IntegrationTests/TransactionProcessor.IntegrationTests.csproj b/TransactionProcessor.IntegrationTests/TransactionProcessor.IntegrationTests.csproj index 87ad7b6e..d63ef14f 100644 --- a/TransactionProcessor.IntegrationTests/TransactionProcessor.IntegrationTests.csproj +++ b/TransactionProcessor.IntegrationTests/TransactionProcessor.IntegrationTests.csproj @@ -7,7 +7,7 @@ - + @@ -15,9 +15,9 @@ - - - + + + diff --git a/TransactionProcessor.ReconciliationAggregate.Tests/TransactionProcessor.ReconciliationAggregate.Tests.csproj b/TransactionProcessor.ReconciliationAggregate.Tests/TransactionProcessor.ReconciliationAggregate.Tests.csproj index 47897cd2..c5db282d 100644 --- a/TransactionProcessor.ReconciliationAggregate.Tests/TransactionProcessor.ReconciliationAggregate.Tests.csproj +++ b/TransactionProcessor.ReconciliationAggregate.Tests/TransactionProcessor.ReconciliationAggregate.Tests.csproj @@ -7,8 +7,10 @@ + + diff --git a/TransactionProcessor.SettlementAggregates.Tests/TransactionProcessor.SettlementAggregates.Tests.csproj b/TransactionProcessor.SettlementAggregates.Tests/TransactionProcessor.SettlementAggregates.Tests.csproj index e24f762f..0ad5fe97 100644 --- a/TransactionProcessor.SettlementAggregates.Tests/TransactionProcessor.SettlementAggregates.Tests.csproj +++ b/TransactionProcessor.SettlementAggregates.Tests/TransactionProcessor.SettlementAggregates.Tests.csproj @@ -7,7 +7,9 @@ + + diff --git a/TransactionProcessor.Testing/TransactionProcessor.Testing.csproj b/TransactionProcessor.Testing/TransactionProcessor.Testing.csproj index 938be284..16020848 100644 --- a/TransactionProcessor.Testing/TransactionProcessor.Testing.csproj +++ b/TransactionProcessor.Testing/TransactionProcessor.Testing.csproj @@ -5,6 +5,11 @@ None + + + + + diff --git a/TransactionProcessor.Tests/TransactionProcessor.Tests.csproj b/TransactionProcessor.Tests/TransactionProcessor.Tests.csproj index 50e1b0e3..c5360f62 100644 --- a/TransactionProcessor.Tests/TransactionProcessor.Tests.csproj +++ b/TransactionProcessor.Tests/TransactionProcessor.Tests.csproj @@ -7,10 +7,12 @@ + + diff --git a/TransactionProcessor.TransactionAggregate.Tests/TransactionProcessor.TransactionAggregate.Tests.csproj b/TransactionProcessor.TransactionAggregate.Tests/TransactionProcessor.TransactionAggregate.Tests.csproj index 6f0654ac..b35818bf 100644 --- a/TransactionProcessor.TransactionAggregate.Tests/TransactionProcessor.TransactionAggregate.Tests.csproj +++ b/TransactionProcessor.TransactionAggregate.Tests/TransactionProcessor.TransactionAggregate.Tests.csproj @@ -7,8 +7,10 @@ + + diff --git a/TransactionProcessor.VoucherAggregate.Tests/TransactionProcessor.VoucherAggregate.Tests.csproj b/TransactionProcessor.VoucherAggregate.Tests/TransactionProcessor.VoucherAggregate.Tests.csproj index 1e80bb0a..e0bb4d7f 100644 --- a/TransactionProcessor.VoucherAggregate.Tests/TransactionProcessor.VoucherAggregate.Tests.csproj +++ b/TransactionProcessor.VoucherAggregate.Tests/TransactionProcessor.VoucherAggregate.Tests.csproj @@ -9,7 +9,9 @@ + + diff --git a/TransactionProcessor/TransactionProcessor.csproj b/TransactionProcessor/TransactionProcessor.csproj index 0f009f2a..398b389d 100644 --- a/TransactionProcessor/TransactionProcessor.csproj +++ b/TransactionProcessor/TransactionProcessor.csproj @@ -15,6 +15,7 @@ + @@ -35,6 +36,7 @@ +