From 6cf161ef3cd4e37bd81cf4a5688fba403c37f285 Mon Sep 17 00:00:00 2001 From: StuartFerguson Date: Tue, 23 Dec 2025 20:33:10 +0000 Subject: [PATCH] use a manager in Pending Settlement query handler --- .../Mediator/DummyEstateManagementManager.cs | 7 ++++ .../SettlementRequestHandlerTests.cs | 3 +- .../Manager/ITransactionProcessorManager.cs | 5 +++ .../Manager/TransactionProcessorManager.cs | 37 ++++++++++++++++--- .../SettlementRequestHandler.cs | 21 ++--------- .../Requests/SettlementQueries.cs | 2 +- .../Settlement/SettlementModel.cs | 11 ++++++ .../Bootstrapper/MediatorRegistry.cs | 2 +- .../Handlers/SettlementHandlers.cs | 8 ++-- 9 files changed, 66 insertions(+), 30 deletions(-) diff --git a/TransactionProcessor.BusinessLogic.Tests/Mediator/DummyEstateManagementManager.cs b/TransactionProcessor.BusinessLogic.Tests/Mediator/DummyEstateManagementManager.cs index 1a8eb60f..291281ab 100644 --- a/TransactionProcessor.BusinessLogic.Tests/Mediator/DummyEstateManagementManager.cs +++ b/TransactionProcessor.BusinessLogic.Tests/Mediator/DummyEstateManagementManager.cs @@ -83,4 +83,11 @@ public async Task>> GetSettlements(Guid estateId, CancellationToken cancellationToken) { return Result.Success(new List()); } + + public async Task> GetPendingSettlement(Guid estateId, + Guid merchantId, + DateTime settlementDate, + CancellationToken cancellationToken) { + return Result.Success(new PendingSettlementModel()); + } } \ No newline at end of file diff --git a/TransactionProcessor.BusinessLogic.Tests/RequestHandler/SettlementRequestHandlerTests.cs b/TransactionProcessor.BusinessLogic.Tests/RequestHandler/SettlementRequestHandlerTests.cs index debd4ea4..38271acf 100644 --- a/TransactionProcessor.BusinessLogic.Tests/RequestHandler/SettlementRequestHandlerTests.cs +++ b/TransactionProcessor.BusinessLogic.Tests/RequestHandler/SettlementRequestHandlerTests.cs @@ -21,9 +21,8 @@ public class SettlementRequestHandlerTests public async Task SettlementRequestHandler_ProcessSettlementRequest_IsHandled() { Mock settlementDomainService = new Mock(); - Mock aggregateService = new(); Mock manager = new Mock(); - SettlementRequestHandler handler = new SettlementRequestHandler(settlementDomainService.Object, aggregateService.Object, manager.Object); + SettlementRequestHandler handler = new SettlementRequestHandler(settlementDomainService.Object, manager.Object); settlementDomainService .Setup(s => s.ProcessSettlement(It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success()); var command = TestData.Commands.ProcessSettlementCommand; diff --git a/TransactionProcessor.BusinessLogic/Manager/ITransactionProcessorManager.cs b/TransactionProcessor.BusinessLogic/Manager/ITransactionProcessorManager.cs index 8943f816..a9048660 100644 --- a/TransactionProcessor.BusinessLogic/Manager/ITransactionProcessorManager.cs +++ b/TransactionProcessor.BusinessLogic/Manager/ITransactionProcessorManager.cs @@ -57,6 +57,11 @@ Task>> GetSettlements(Guid estateId, String endDate, CancellationToken cancellationToken); + Task> GetPendingSettlement(Guid estateId, + Guid merchantId, + DateTime settlementDate, + CancellationToken cancellationToken); + #endregion } } \ No newline at end of file diff --git a/TransactionProcessor.BusinessLogic/Manager/TransactionProcessorManager.cs b/TransactionProcessor.BusinessLogic/Manager/TransactionProcessorManager.cs index c210280e..eff9aeda 100644 --- a/TransactionProcessor.BusinessLogic/Manager/TransactionProcessorManager.cs +++ b/TransactionProcessor.BusinessLogic/Manager/TransactionProcessorManager.cs @@ -1,18 +1,20 @@ -using System; +using Shared.DomainDrivenDesign.EventSourcing; +using Shared.EventStore.Aggregate; +using Shared.Results; +using SimpleResults; +using System; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; -using Shared.DomainDrivenDesign.EventSourcing; -using Shared.EventStore.Aggregate; -using Shared.Results; -using SimpleResults; using TransactionProcessor.Aggregates; +using TransactionProcessor.BusinessLogic.Common; using TransactionProcessor.BusinessLogic.Services; using TransactionProcessor.Models.Contract; using TransactionProcessor.Models.Merchant; using TransactionProcessor.Models.Settlement; using TransactionProcessor.Repository; +using static TransactionProcessor.BusinessLogic.Requests.SettlementQueries; using Contract = TransactionProcessor.Models.Contract.Contract; using Operator = TransactionProcessor.Models.Estate.Operator; @@ -246,6 +248,31 @@ public async Task>> GetSettlements(Guid estateId, return await this.TransactionProcessorReadModelRepository.GetSettlements(estateId, merchantId, startDate, endDate, cancellationToken); } + public async Task> GetPendingSettlement(Guid estateId, + Guid merchantId, + DateTime settlementDate, + CancellationToken cancellationToken) { + + Guid aggregateId = Helpers.CalculateSettlementAggregateId(settlementDate, merchantId, estateId); + + Result getSettlementResult = await this.AggregateService.GetLatest(aggregateId, cancellationToken); + if (getSettlementResult.IsFailed) + return ResultHelpers.CreateFailure(getSettlementResult); + + SettlementAggregate settlementAggregate = getSettlementResult.Data; + + PendingSettlementModel model = new PendingSettlementModel { + EstateId = settlementAggregate.EstateId, + MerchantId = settlementAggregate.MerchantId, + NumberOfFeesPendingSettlement = settlementAggregate.GetNumberOfFeesPendingSettlement(), + NumberOfFeesSettled = settlementAggregate.GetNumberOfFeesSettled(), + SettlementDate = settlementAggregate.SettlementDate, + SettlementCompleted = settlementAggregate.SettlementComplete, + }; + + return Result.Success(model); + } + #endregion } } \ No newline at end of file diff --git a/TransactionProcessor.BusinessLogic/RequestHandlers/SettlementRequestHandler.cs b/TransactionProcessor.BusinessLogic/RequestHandlers/SettlementRequestHandler.cs index 3a7d3d56..b774177d 100644 --- a/TransactionProcessor.BusinessLogic/RequestHandlers/SettlementRequestHandler.cs +++ b/TransactionProcessor.BusinessLogic/RequestHandlers/SettlementRequestHandler.cs @@ -19,19 +19,16 @@ namespace TransactionProcessor.BusinessLogic.RequestHandlers public class SettlementRequestHandler : IRequestHandler>, IRequestHandler, IRequestHandler, - IRequestHandler>, + IRequestHandler>, IRequestHandler>, IRequestHandler>> { private readonly ISettlementDomainService SettlementDomainService; - private readonly IAggregateService AggregateService; private readonly ITransactionProcessorManager TransactionProcessorManager; public SettlementRequestHandler(ISettlementDomainService settlementDomainService, - IAggregateService aggregateService, ITransactionProcessorManager transactionProcessorManager) { this.SettlementDomainService = settlementDomainService; - this.AggregateService = aggregateService; this.TransactionProcessorManager = transactionProcessorManager; } @@ -51,19 +48,9 @@ public async Task Handle(SettlementCommands.AddSettledFeeToSettlementCom return await this.SettlementDomainService.AddSettledFeeToSettlement(command, cancellationToken); } - public async Task> Handle(SettlementQueries.GetPendingSettlementQuery query, - CancellationToken cancellationToken) { - // TODO: Convert to using a manager/model/factory - // Convert the date passed in to a guid - Guid aggregateId = Helpers.CalculateSettlementAggregateId(query.SettlementDate, query.MerchantId, query.EstateId); - - Result getSettlementResult = await this.AggregateService.GetLatest(aggregateId, cancellationToken); - if (getSettlementResult.IsFailed) - return getSettlementResult; - - SettlementAggregate settlementAggregate = getSettlementResult.Data; - - return Result.Success(settlementAggregate); + public async Task> Handle(SettlementQueries.GetPendingSettlementQuery query, + CancellationToken cancellationToken) { + return await this.TransactionProcessorManager.GetPendingSettlement(query.EstateId, query.MerchantId, query.SettlementDate, cancellationToken); } public async Task> Handle(SettlementQueries.GetSettlementQuery request, diff --git a/TransactionProcessor.BusinessLogic/Requests/SettlementQueries.cs b/TransactionProcessor.BusinessLogic/Requests/SettlementQueries.cs index 32722562..8ac52dce 100644 --- a/TransactionProcessor.BusinessLogic/Requests/SettlementQueries.cs +++ b/TransactionProcessor.BusinessLogic/Requests/SettlementQueries.cs @@ -10,7 +10,7 @@ namespace TransactionProcessor.BusinessLogic.Requests; [ExcludeFromCodeCoverage] public record SettlementQueries { public record GetPendingSettlementQuery(DateTime SettlementDate, Guid MerchantId, Guid EstateId) - : IRequest>; + : IRequest>; public record GetSettlementQuery(Guid EstateId, Guid MerchantId, Guid SettlementId) : IRequest>; diff --git a/TransactionProcessor.Models/Settlement/SettlementModel.cs b/TransactionProcessor.Models/Settlement/SettlementModel.cs index cb3bcaf6..158fcb79 100644 --- a/TransactionProcessor.Models/Settlement/SettlementModel.cs +++ b/TransactionProcessor.Models/Settlement/SettlementModel.cs @@ -31,4 +31,15 @@ public SettlementModel() public Decimal ValueOfFeesSettled { get; set; } #endregion +} + +public class PendingSettlementModel +{ + public Guid EstateId { get; set; } + public Guid MerchantId { get; set; } + public DateTime SettlementDate { get; set; } + public Int32 NumberOfFeesPendingSettlement { get; set; } + + public Int32 NumberOfFeesSettled { get; set; } + public Boolean SettlementCompleted { get; set; } } \ No newline at end of file diff --git a/TransactionProcessor/Bootstrapper/MediatorRegistry.cs b/TransactionProcessor/Bootstrapper/MediatorRegistry.cs index e907048b..3a4d3a55 100644 --- a/TransactionProcessor/Bootstrapper/MediatorRegistry.cs +++ b/TransactionProcessor/Bootstrapper/MediatorRegistry.cs @@ -103,7 +103,7 @@ private void RegisterSettlementRequestHandler() { this.AddSingleton>, SettlementRequestHandler>(); this.AddSingleton, SettlementRequestHandler>(); this.AddSingleton, SettlementRequestHandler>(); - this.AddSingleton>, SettlementRequestHandler>(); + this.AddSingleton>, SettlementRequestHandler>(); this.AddSingleton>, SettlementRequestHandler>(); this.AddSingleton>>, SettlementRequestHandler>(); } diff --git a/TransactionProcessor/Handlers/SettlementHandlers.cs b/TransactionProcessor/Handlers/SettlementHandlers.cs index b8572ae1..2ee92148 100644 --- a/TransactionProcessor/Handlers/SettlementHandlers.cs +++ b/TransactionProcessor/Handlers/SettlementHandlers.cs @@ -19,16 +19,16 @@ public static class SettlementHandlers public static async Task GetPendingSettlement(IMediator mediator, HttpContext ctx, DateTime settlementDate, [FromRoute] Guid estateId, Guid merchantId, CancellationToken cancellationToken) { SettlementQueries.GetPendingSettlementQuery query = new(settlementDate, merchantId, estateId); - Result getPendingSettlementResult = await mediator.Send(query, cancellationToken); + Result getPendingSettlementResult = await mediator.Send(query, cancellationToken); return ResponseFactory.FromResult(getPendingSettlementResult, r => new TransactionProcessor.DataTransferObjects.SettlementResponse { EstateId = r.EstateId, MerchantId = r.MerchantId, - NumberOfFeesPendingSettlement = r.GetNumberOfFeesPendingSettlement(), - NumberOfFeesSettled = r.GetNumberOfFeesSettled(), + NumberOfFeesPendingSettlement = r.NumberOfFeesPendingSettlement, + NumberOfFeesSettled = r.NumberOfFeesSettled, SettlementDate = r.SettlementDate, - SettlementCompleted = r.SettlementComplete + SettlementCompleted = r.SettlementCompleted }); }