From e58c2fb5404b202c68cbb30e2b58b31223368fd2 Mon Sep 17 00:00:00 2001 From: Stuart Ferguson Date: Wed, 15 Apr 2026 13:14:55 +0100 Subject: [PATCH 1/3] Make log upload batch size configurable via settings Added optional LogMessageBatchSize property to configuration models and API responses. Updated log upload logic to use this configurable batch size instead of a hardcoded value, defaulting to 10 if not set. Refactored log message model list creation for clarity. This enhances flexibility and maintainability of log uploads. --- .../Models/TokenResponseModel.cs | 1 + .../RequestHandlers/SupportRequestHandler.cs | 23 ++++++++++--------- .../Services/ConfigurationService.cs | 1 + .../ConfigurationResponse.cs | 2 ++ 4 files changed, 16 insertions(+), 11 deletions(-) diff --git a/TransactionProcessor.Mobile.BusinessLogic/Models/TokenResponseModel.cs b/TransactionProcessor.Mobile.BusinessLogic/Models/TokenResponseModel.cs index c34632e22..0f1b54f5f 100644 --- a/TransactionProcessor.Mobile.BusinessLogic/Models/TokenResponseModel.cs +++ b/TransactionProcessor.Mobile.BusinessLogic/Models/TokenResponseModel.cs @@ -38,5 +38,6 @@ public class Configuration public Boolean EnableAutoUpdates { get; set; } public Boolean ShowDebugMessages { get; set; } + public Int32? LogMessageBatchSize { get; set; } } } diff --git a/TransactionProcessor.Mobile.BusinessLogic/RequestHandlers/SupportRequestHandler.cs b/TransactionProcessor.Mobile.BusinessLogic/RequestHandlers/SupportRequestHandler.cs index d53a510bf..cb9d116f5 100644 --- a/TransactionProcessor.Mobile.BusinessLogic/RequestHandlers/SupportRequestHandler.cs +++ b/TransactionProcessor.Mobile.BusinessLogic/RequestHandlers/SupportRequestHandler.cs @@ -1,7 +1,9 @@ using MediatR; using TransactionProcessor.Mobile.BusinessLogic.Database; +using TransactionProcessor.Mobile.BusinessLogic.Models; using TransactionProcessor.Mobile.BusinessLogic.Requests; using TransactionProcessor.Mobile.BusinessLogic.Services; +using LogMessage = TransactionProcessor.Mobile.BusinessLogic.Database.LogMessage; namespace TransactionProcessor.Mobile.BusinessLogic.RequestHandlers { @@ -25,20 +27,19 @@ public SupportRequestHandler(Func configurationS public async Task Handle(UploadLogsRequest request, CancellationToken cancellationToken) { Boolean useTrainingMode = this.ApplicationCache.GetUseTrainingMode(); + Configuration configuration = this.ApplicationCache.GetConfiguration(); + while (true) { + IConfigurationService configurationService = this.ConfigurationServiceResolver(useTrainingMode); - while (true) - { - List logEntries = await this.DatabaseContext.GetLogMessages(10, useTrainingMode); // TODO: Configurable batch size + List logEntries = await this.DatabaseContext.GetLogMessages(configuration.LogMessageBatchSize.GetValueOrDefault(10), useTrainingMode); // TODO: Configurable batch size - if (logEntries.Any() == false) - { + if (logEntries.Any() == false) { break; } - List logMessageModels = new List(); + List logMessageModels = new(); - logEntries.ForEach(l => logMessageModels.Add(new Models.LogMessage - { + logEntries.ForEach(l => logMessageModels.Add(new Models.LogMessage { LogLevel = Enum.Parse(l.LogLevel), LogLevelString = l.LogLevel, Message = l.Message, @@ -46,7 +47,7 @@ public async Task Handle(UploadLogsRequest request, CancellationToken c Id = l.Id })); - IConfigurationService configurationService = this.ConfigurationServiceResolver(useTrainingMode); + await configurationService.PostDiagnosticLogs(request.DeviceIdentifier, logMessageModels, CancellationToken.None); // Clear the logs that have been uploaded @@ -60,9 +61,9 @@ public async Task Handle(UploadLogsRequest request, CancellationToken c CancellationToken cancellationToken) { Boolean useTrainingMode = this.ApplicationCache.GetUseTrainingMode(); - List logEntries = await this.DatabaseContext.GetLogMessages(50, useTrainingMode); // TODO: Configurable batch size + List logEntries = await this.DatabaseContext.GetLogMessages(50, useTrainingMode); - List logMessageModels = new List(); + List logMessageModels = new(); logEntries.ForEach(l => logMessageModels.Add(new Models.LogMessage { LogLevel = Enum.Parse(l.LogLevel), diff --git a/TransactionProcessor.Mobile.BusinessLogic/Services/ConfigurationService.cs b/TransactionProcessor.Mobile.BusinessLogic/Services/ConfigurationService.cs index 0402ea426..d5acccfb2 100644 --- a/TransactionProcessor.Mobile.BusinessLogic/Services/ConfigurationService.cs +++ b/TransactionProcessor.Mobile.BusinessLogic/Services/ConfigurationService.cs @@ -81,6 +81,7 @@ public async Task> GetConfiguration(String deviceIdentifie SecurityServiceUri = apiResponse.HostAddresses.Single(h => h.ServiceType == ServiceType.Security).Uri, TransactionProcessorAclUri = apiResponse.HostAddresses.Single(h => h.ServiceType == ServiceType.TransactionProcessorAcl).Uri, + LogMessageBatchSize = apiResponse.LogMessageBatchSize.GetValueOrDefault(), }; Logger.LogDebug($"About to xlate log level"); diff --git a/TransactionProcessor.Mobile.BusinessLogic/Services/DataTransferObjects/ConfigurationResponse.cs b/TransactionProcessor.Mobile.BusinessLogic/Services/DataTransferObjects/ConfigurationResponse.cs index 2b3f1740a..c71412e92 100644 --- a/TransactionProcessor.Mobile.BusinessLogic/Services/DataTransferObjects/ConfigurationResponse.cs +++ b/TransactionProcessor.Mobile.BusinessLogic/Services/DataTransferObjects/ConfigurationResponse.cs @@ -19,4 +19,6 @@ public class ConfigurationResponse public string Id { get; set; } public LoggingLevel LogLevel { get; set; } + + public Int32? LogMessageBatchSize { get; set; } } From 4e835f06ec2f8e15beb2fbe08734801aba7a0930 Mon Sep 17 00:00:00 2001 From: Stuart Ferguson Date: Wed, 15 Apr 2026 14:00:18 +0100 Subject: [PATCH 2/3] fix failed unit tests --- .../RequestHandlerTests/SupportRequestHandlerTests.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/TransactionProcessor.Mobile.BusinessLogic.Tests/RequestHandlerTests/SupportRequestHandlerTests.cs b/TransactionProcessor.Mobile.BusinessLogic.Tests/RequestHandlerTests/SupportRequestHandlerTests.cs index 92f33c9b7..f15469f32 100644 --- a/TransactionProcessor.Mobile.BusinessLogic.Tests/RequestHandlerTests/SupportRequestHandlerTests.cs +++ b/TransactionProcessor.Mobile.BusinessLogic.Tests/RequestHandlerTests/SupportRequestHandlerTests.cs @@ -1,9 +1,12 @@ using Moq; using Shouldly; using TransactionProcessor.Mobile.BusinessLogic.Database; +using TransactionProcessor.Mobile.BusinessLogic.Models; using TransactionProcessor.Mobile.BusinessLogic.RequestHandlers; using TransactionProcessor.Mobile.BusinessLogic.Requests; using TransactionProcessor.Mobile.BusinessLogic.Services; +using LogLevel = TransactionProcessor.Mobile.BusinessLogic.Database.LogLevel; +using LogMessage = TransactionProcessor.Mobile.BusinessLogic.Database.LogMessage; namespace TransactionProcessor.Mobile.BusinessLogic.Tests.RequestHandlerTests; @@ -22,7 +25,7 @@ public async Task SupportRequestHandlerTests_UploadLogsRequest_NoLogs_Handle_IsH Mock databaseContext = new Mock(); databaseContext.Setup(d => d.GetLogMessages(It.IsAny(), It.IsAny())).ReturnsAsync(new List()); Mock applicationCache = new Mock(); - + applicationCache.Setup(s => s.GetConfiguration()).Returns(new Configuration()); SupportRequestHandler handler = new SupportRequestHandler(configurationServiceResolver, databaseContext.Object, applicationCache.Object); UploadLogsRequest request = UploadLogsRequest.Create(TestData.DeviceIdentifier); @@ -56,6 +59,7 @@ public async Task SupportRequestHandlerTests_UploadLogsRequest_LogsToUpload_Only }).ReturnsAsync(new List()); Mock applicationCache = new Mock(); + applicationCache.Setup(s => s.GetConfiguration()).Returns(new Configuration()); SupportRequestHandler handler = new SupportRequestHandler(configurationServiceResolver, databaseContext.Object, applicationCache.Object); @@ -98,6 +102,7 @@ public async Task SupportRequestHandlerTests_UploadLogsRequest_LogsToUpload_15Me }).ReturnsAsync(new List()); Mock applicationCache = new Mock(); + applicationCache.Setup(s => s.GetConfiguration()).Returns(new Configuration()); SupportRequestHandler handler = new SupportRequestHandler(configurationServiceResolver, databaseContext.Object, applicationCache.Object); From 868dc6b3d2689feda68d9402640a85a0271cf513 Mon Sep 17 00:00:00 2001 From: Stuart Ferguson Date: Wed, 15 Apr 2026 14:03:59 +0100 Subject: [PATCH 3/3] :| --- .../RequestHandlers/SupportRequestHandler.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TransactionProcessor.Mobile.BusinessLogic/RequestHandlers/SupportRequestHandler.cs b/TransactionProcessor.Mobile.BusinessLogic/RequestHandlers/SupportRequestHandler.cs index cb9d116f5..767236fbf 100644 --- a/TransactionProcessor.Mobile.BusinessLogic/RequestHandlers/SupportRequestHandler.cs +++ b/TransactionProcessor.Mobile.BusinessLogic/RequestHandlers/SupportRequestHandler.cs @@ -31,7 +31,7 @@ public async Task Handle(UploadLogsRequest request, CancellationToken c while (true) { IConfigurationService configurationService = this.ConfigurationServiceResolver(useTrainingMode); - List logEntries = await this.DatabaseContext.GetLogMessages(configuration.LogMessageBatchSize.GetValueOrDefault(10), useTrainingMode); // TODO: Configurable batch size + List logEntries = await this.DatabaseContext.GetLogMessages(configuration.LogMessageBatchSize.GetValueOrDefault(10), useTrainingMode); if (logEntries.Any() == false) { break;