diff --git a/TransactionMobile.Maui.BusinessLogic.Tests/RequestHandlerTests/LoginRequestHandlerTests.cs b/TransactionMobile.Maui.BusinessLogic.Tests/RequestHandlerTests/LoginRequestHandlerTests.cs index 7f57c0f4..34e11936 100644 --- a/TransactionMobile.Maui.BusinessLogic.Tests/RequestHandlerTests/LoginRequestHandlerTests.cs +++ b/TransactionMobile.Maui.BusinessLogic.Tests/RequestHandlerTests/LoginRequestHandlerTests.cs @@ -3,6 +3,7 @@ using System; using System.Threading; using System.Threading.Tasks; +using Models; using Moq; using RequestHandlers; using Requests; @@ -17,7 +18,9 @@ public async Task LoginRequestHandler_Handle_LoginRequest_IsHandled() { Mock authenticationService = new Mock(); authenticationService.Setup(a => a.GetToken(It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync(TestData.AccessToken); - LoginRequestHandler handler = new LoginRequestHandler(authenticationService.Object); + Mock configurationService = new Mock(); + configurationService.Setup(c => c.GetConfiguration(It.IsAny(), It.IsAny())).ReturnsAsync(new Configuration()); + LoginRequestHandler handler = new LoginRequestHandler(authenticationService.Object,configurationService.Object); LoginRequest request = LoginRequest.Create(TestData.UserName,TestData.Password); @@ -25,4 +28,20 @@ public async Task LoginRequestHandler_Handle_LoginRequest_IsHandled() accessToken.ShouldBe(TestData.AccessToken); } + + [Fact] + public async Task LoginRequestHandler_Handle_GetConfigurationRequest_IsHandled() + { + Mock authenticationService = new Mock(); + authenticationService.Setup(a => a.GetToken(It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync(TestData.AccessToken); + Mock configurationService = new Mock(); + configurationService.Setup(c => c.GetConfiguration(It.IsAny(), It.IsAny())).ReturnsAsync(new Configuration()); + LoginRequestHandler handler = new LoginRequestHandler(authenticationService.Object, configurationService.Object); + + GetConfigurationRequest request = GetConfigurationRequest.Create(TestData.DeviceIdentifier); + + Configuration configuration = await handler.Handle(request, CancellationToken.None); + + configuration.ShouldNotBeNull(); + } } \ No newline at end of file diff --git a/TransactionMobile.Maui.BusinessLogic/Models/Configuration.cs b/TransactionMobile.Maui.BusinessLogic/Models/Configuration.cs new file mode 100644 index 00000000..d80dede3 --- /dev/null +++ b/TransactionMobile.Maui.BusinessLogic/Models/Configuration.cs @@ -0,0 +1,20 @@ +namespace TransactionMobile.Maui.BusinessLogic.Models; + +public class Configuration +{ + public String ClientId { get; set; } + + public String ClientSecret { get; set; } + + public String SecurityServiceUrl { get; set; } + + public String TransactionProcessorAclUrl { get; set; } + + public String EstateManagementUrl { get; set; } + + public String EstateReportingUrl { get; set; } + + public LogLevel LogLevel { get; set; } + + public Boolean EnableAutoUpdates { get; set; } +} \ No newline at end of file diff --git a/TransactionMobile.Maui.BusinessLogic/Models/LogLevel.cs b/TransactionMobile.Maui.BusinessLogic/Models/LogLevel.cs new file mode 100644 index 00000000..d7711c0e --- /dev/null +++ b/TransactionMobile.Maui.BusinessLogic/Models/LogLevel.cs @@ -0,0 +1,16 @@ +namespace TransactionMobile.Maui.BusinessLogic.Models; + +public enum LogLevel +{ + Fatal, + + Error, + + Warn, + + Info, + + Debug, + + Trace +} \ No newline at end of file diff --git a/TransactionMobile.Maui.BusinessLogic/Models/LogMessage.cs b/TransactionMobile.Maui.BusinessLogic/Models/LogMessage.cs new file mode 100644 index 00000000..a737a3c2 --- /dev/null +++ b/TransactionMobile.Maui.BusinessLogic/Models/LogMessage.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace TransactionMobile.Maui.BusinessLogic.Models +{ + public class LogMessage + { + #region Properties + + public DateTime EntryDateTime { get; set; } + + public Int32 Id { get; set; } + + public String LogLevel { get; set; } + + public String Message { get; set; } + + #endregion + } +} diff --git a/TransactionMobile.Maui.BusinessLogic/RequestHandlers/LoginRequestHandler.cs b/TransactionMobile.Maui.BusinessLogic/RequestHandlers/LoginRequestHandler.cs index 6cf8f59c..0867fe45 100644 --- a/TransactionMobile.Maui.BusinessLogic/RequestHandlers/LoginRequestHandler.cs +++ b/TransactionMobile.Maui.BusinessLogic/RequestHandlers/LoginRequestHandler.cs @@ -1,15 +1,21 @@ namespace TransactionMobile.Maui.BusinessLogic.RequestHandlers { using MediatR; + using Models; using Requests; using Services; - public class LoginRequestHandler : IRequestHandler + public class LoginRequestHandler : IRequestHandler, + IRequestHandler { + private readonly IConfigurationService ConfigurationService; + #region Constructors - public LoginRequestHandler(IAuthenticationService authenticationService) + public LoginRequestHandler(IAuthenticationService authenticationService, + IConfigurationService configurationService) { - + this.ConfigurationService = configurationService; + this.AuthenticationService = authenticationService; } @@ -30,9 +36,13 @@ public async Task Handle(LoginRequest request, return token; } + + public async Task Handle(GetConfigurationRequest request, + CancellationToken cancellationToken) + { + return await this.ConfigurationService.GetConfiguration(request.DeviceIdentifier, cancellationToken); + } #endregion - - } } \ No newline at end of file diff --git a/TransactionMobile.Maui.BusinessLogic/Requests/GetConfigurationRequest.cs b/TransactionMobile.Maui.BusinessLogic/Requests/GetConfigurationRequest.cs new file mode 100644 index 00000000..8792d262 --- /dev/null +++ b/TransactionMobile.Maui.BusinessLogic/Requests/GetConfigurationRequest.cs @@ -0,0 +1,19 @@ +namespace TransactionMobile.Maui.BusinessLogic.Requests; + +using MediatR; +using Models; + +public class GetConfigurationRequest : IRequest +{ + public String DeviceIdentifier { get; private set; } + + private GetConfigurationRequest(String deviceIdentifier) + { + this.DeviceIdentifier = deviceIdentifier; + } + + public static GetConfigurationRequest Create(String deviceIdentifier) + { + return new GetConfigurationRequest(deviceIdentifier); + } +} \ No newline at end of file diff --git a/TransactionMobile.Maui.BusinessLogic/Services/DummyAuthenticationService.cs b/TransactionMobile.Maui.BusinessLogic/Services/DummyServices/DummyAuthenticationService.cs similarity index 81% rename from TransactionMobile.Maui.BusinessLogic/Services/DummyAuthenticationService.cs rename to TransactionMobile.Maui.BusinessLogic/Services/DummyServices/DummyAuthenticationService.cs index 48ef82e2..b362642b 100644 --- a/TransactionMobile.Maui.BusinessLogic/Services/DummyAuthenticationService.cs +++ b/TransactionMobile.Maui.BusinessLogic/Services/DummyServices/DummyAuthenticationService.cs @@ -1,4 +1,4 @@ -namespace TransactionMobile.Maui.BusinessLogic.Services; +namespace TransactionMobile.Maui.BusinessLogic.Services.DummyServices; public class DummyAuthenticationService : IAuthenticationService { diff --git a/TransactionMobile.Maui.BusinessLogic/Services/DummyServices/DummyConfigurationService.cs b/TransactionMobile.Maui.BusinessLogic/Services/DummyServices/DummyConfigurationService.cs new file mode 100644 index 00000000..ba36e808 --- /dev/null +++ b/TransactionMobile.Maui.BusinessLogic/Services/DummyServices/DummyConfigurationService.cs @@ -0,0 +1,33 @@ +namespace TransactionMobile.Maui.BusinessLogic.Services.DummyServices +{ + using Models; + + public class DummyConfigurationService : IConfigurationService + { + #region Methods + + public async Task GetConfiguration(String deviceIdentifier, + CancellationToken cancellationToken) + { + return new Configuration + { + ClientId = "dummyClientId", + ClientSecret = "dummyClientSecret", + EnableAutoUpdates = false, + EstateManagementUrl = "http://localhost:5000", + EstateReportingUrl = "http://localhost:5006", + LogLevel = LogLevel.Debug, + SecurityServiceUrl = "http://localhost:5001", + TransactionProcessorAclUrl = "http://localhost:5003" + }; + } + + public async Task PostDiagnosticLogs(String deviceIdentifier, + List logMessages, + CancellationToken cancellationToken) + { + } + + #endregion + } +} \ No newline at end of file diff --git a/TransactionMobile.Maui.BusinessLogic/Services/DummyMerchantService.cs b/TransactionMobile.Maui.BusinessLogic/Services/DummyServices/DummyMerchantService.cs similarity index 98% rename from TransactionMobile.Maui.BusinessLogic/Services/DummyMerchantService.cs rename to TransactionMobile.Maui.BusinessLogic/Services/DummyServices/DummyMerchantService.cs index 0cd5f471..f9a59c91 100644 --- a/TransactionMobile.Maui.BusinessLogic/Services/DummyMerchantService.cs +++ b/TransactionMobile.Maui.BusinessLogic/Services/DummyServices/DummyMerchantService.cs @@ -1,4 +1,4 @@ -namespace TransactionMobile.Maui.BusinessLogic.Services; +namespace TransactionMobile.Maui.BusinessLogic.Services.DummyServices; using Models; diff --git a/TransactionMobile.Maui.BusinessLogic/Services/DummyServices/DummyTransactionService.cs b/TransactionMobile.Maui.BusinessLogic/Services/DummyServices/DummyTransactionService.cs new file mode 100644 index 00000000..aa7865a5 --- /dev/null +++ b/TransactionMobile.Maui.BusinessLogic/Services/DummyServices/DummyTransactionService.cs @@ -0,0 +1,43 @@ +namespace TransactionMobile.Maui.BusinessLogic.Services.DummyServices; + +using Models; + +public class DummyTransactionService : ITransactionService +{ + #region Methods + + public async Task PerformLogon(PerformLogonRequestModel model, + CancellationToken cancellationToken) + { + return true; + } + + public async Task PerformMobileTopup(PerformMobileTopupRequestModel model, + CancellationToken cancellationToken) + { + if (model.TopupAmount == 100) + { + return false; + } + + return true; + } + + public async Task PerformReconciliation(CancellationToken cancellationToken) + { + return true; + } + + public async Task PerformVoucherIssue(PerformVoucherIssueRequestModel model, + CancellationToken cancellationToken) + { + if (model.VoucherAmount == 100) + { + return false; + } + + return true; + } + + #endregion +} \ No newline at end of file diff --git a/TransactionMobile.Maui.BusinessLogic/Services/IConfigurationService.cs b/TransactionMobile.Maui.BusinessLogic/Services/IConfigurationService.cs new file mode 100644 index 00000000..0d109fd9 --- /dev/null +++ b/TransactionMobile.Maui.BusinessLogic/Services/IConfigurationService.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace TransactionMobile.Maui.BusinessLogic.Services; + +using Models; + +public interface IConfigurationService +{ + /// + /// Gets the configuration. + /// + /// The device identifier. + /// The cancellation token. + /// + Task GetConfiguration(String deviceIdentifier, + CancellationToken cancellationToken); + + /// + /// Posts the diagnostic logs. + /// + /// The device identifier. + /// The log messages. + /// The cancellation token. + /// + Task PostDiagnosticLogs(String deviceIdentifier, + List logMessages, + CancellationToken cancellationToken); +} \ No newline at end of file diff --git a/TransactionMobile.Maui.BusinessLogic/Services/ITransactionService.cs b/TransactionMobile.Maui.BusinessLogic/Services/ITransactionService.cs index 4ff5fa38..163c80a1 100644 --- a/TransactionMobile.Maui.BusinessLogic/Services/ITransactionService.cs +++ b/TransactionMobile.Maui.BusinessLogic/Services/ITransactionService.cs @@ -16,37 +16,4 @@ public interface ITransactionService #endregion } - - public class DummyTransactionService : ITransactionService - { - public async Task PerformLogon(PerformLogonRequestModel model, CancellationToken cancellationToken) - { - return true; - } - - public async Task PerformMobileTopup(PerformMobileTopupRequestModel model, CancellationToken cancellationToken) - { - if (model.TopupAmount == 100) - { - return false; - } - - return true; - } - - public async Task PerformReconciliation(CancellationToken cancellationToken) - { - return true; - } - - public async Task PerformVoucherIssue(PerformVoucherIssueRequestModel model, CancellationToken cancellationToken) - { - if (model.VoucherAmount == 100) - { - return false; - } - - return true; - } - } } \ No newline at end of file diff --git a/TransactionMobile.Maui.BusinessLogic/ViewModels/LoginPageViewModel.cs b/TransactionMobile.Maui.BusinessLogic/ViewModels/LoginPageViewModel.cs index 0f75b0de..5e2c32a4 100644 --- a/TransactionMobile.Maui.BusinessLogic/ViewModels/LoginPageViewModel.cs +++ b/TransactionMobile.Maui.BusinessLogic/ViewModels/LoginPageViewModel.cs @@ -37,9 +37,11 @@ public LoginPageViewModel(IMediator mediator, INavigationService navigationServi private async Task LoginCommandExecute() { // TODO: this method needs refactored + GetConfigurationRequest getConfigurationRequest = GetConfigurationRequest.Create(""); + Configuration configuration = await this.Mediator.Send(getConfigurationRequest); + // TODO: Cache the config object somewhere LoginRequest loginRequest = LoginRequest.Create("", ""); - String token = await this.Mediator.Send(loginRequest); //if (token == null) diff --git a/TransactionMobile.Maui/Extensions/MauiAppBuilderExtensions.cs b/TransactionMobile.Maui/Extensions/MauiAppBuilderExtensions.cs index 6a5a390a..d1c1de39 100644 --- a/TransactionMobile.Maui/Extensions/MauiAppBuilderExtensions.cs +++ b/TransactionMobile.Maui/Extensions/MauiAppBuilderExtensions.cs @@ -4,6 +4,7 @@ using BusinessLogic.RequestHandlers; using BusinessLogic.Requests; using BusinessLogic.Services; + using BusinessLogic.Services.DummyServices; using BusinessLogic.ViewModels; using BusinessLogic.ViewModels.Support; using BusinessLogic.ViewModels.Transactions; @@ -19,6 +20,7 @@ public static MauiAppBuilder ConfigureAppServices(this MauiAppBuilder builder) builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); + builder.Services.AddSingleton(); return builder; } @@ -33,12 +35,16 @@ public static MauiAppBuilder ConfigureUIServices(this MauiAppBuilder builder) public static MauiAppBuilder ConfigureRequestHandlers(this MauiAppBuilder builder) { builder.Services.AddSingleton(); + builder.Services.AddSingleton, LoginRequestHandler>(); builder.Services.AddSingleton, LoginRequestHandler>(); + builder.Services.AddSingleton>, MerchantRequestHandler>(); builder.Services.AddSingleton, MerchantRequestHandler>(); + builder.Services.AddSingleton, TransactionRequestHandler>(); builder.Services.AddSingleton, TransactionRequestHandler>(); builder.Services.AddSingleton, TransactionRequestHandler>(); + builder.Services.AddSingleton(ctx => { return t => ctx.GetService(t); }); return builder;