diff --git a/EstateManagementUI.BlazorServer.Tests/Pages/Estate/EstateIndexPageTests.cs b/EstateManagementUI.BlazorServer.Tests/Pages/Estate/EstateIndexPageTests.cs index 44f25ed0..f5d14185 100644 --- a/EstateManagementUI.BlazorServer.Tests/Pages/Estate/EstateIndexPageTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/Pages/Estate/EstateIndexPageTests.cs @@ -35,6 +35,8 @@ public void EstateIndex_RendersCorrectly() .ReturnsAsync(Result.Success(new List())); _mockMediator.Setup(x => x.Send(It.IsAny(), default)) .ReturnsAsync(Result.Success(new List())); + _mockMediator.Setup(x => x.Send(It.IsAny(), default)) + .ReturnsAsync(Result.Success(new List())); // Act var cut = RenderComponent(); @@ -63,6 +65,8 @@ public void EstateIndex_DisplaysEstateDetails() .ReturnsAsync(Result.Success(new List())); _mockMediator.Setup(x => x.Send(It.IsAny(), default)) .ReturnsAsync(Result.Success(new List())); + _mockMediator.Setup(x => x.Send(It.IsAny(), default)) + .ReturnsAsync(Result.Success(new List())); // Act var cut = RenderComponent(); @@ -83,6 +87,8 @@ public void EstateIndex_HasCorrectPageTitle() .ReturnsAsync(Result.Success(new List())); _mockMediator.Setup(x => x.Send(It.IsAny(), default)) .ReturnsAsync(Result.Success(new List())); + _mockMediator.Setup(x => x.Send(It.IsAny(), default)) + .ReturnsAsync(Result.Success(new List())); // Act var cut = RenderComponent(); diff --git a/EstateManagementUI.BlazorServer/Components/Pages/Contracts/New.razor b/EstateManagementUI.BlazorServer/Components/Pages/Contracts/New.razor index 7ffd28e6..5c9d18b5 100644 --- a/EstateManagementUI.BlazorServer/Components/Pages/Contracts/New.razor +++ b/EstateManagementUI.BlazorServer/Components/Pages/Contracts/New.razor @@ -136,7 +136,7 @@ else try { isLoadingOperators = true; - var result = await Mediator.Send(new Queries.GetOperatorsQuery(CorrelationIdHelper.New(), "stubbed-token", Guid.Parse("11111111-1111-1111-1111-111111111111"))); + var result = await Mediator.Send(new Queries.GetOperatorsQuery(CorrelationIdHelper.New(), Guid.Parse("11111111-1111-1111-1111-111111111111"))); if (result.IsSuccess) { operators = ModelFactory.ConvertFrom(result.Data); diff --git a/EstateManagementUI.BlazorServer/Components/Pages/Estate/Index.razor.cs b/EstateManagementUI.BlazorServer/Components/Pages/Estate/Index.razor.cs index 1441e33d..ae9f97e3 100644 --- a/EstateManagementUI.BlazorServer/Components/Pages/Estate/Index.razor.cs +++ b/EstateManagementUI.BlazorServer/Components/Pages/Estate/Index.razor.cs @@ -50,32 +50,36 @@ protected override async Task OnAfterRenderAsync(bool firstRender) private async Task LoadEstateData(CorrelationId correlationId, Guid estateId) { - Result estateResult = await Mediator.Send(new Queries.GetEstateQuery(correlationId, estateId)); - if (estateResult.IsFailed) - return ResultHelpers.CreateFailure(estateResult); - estate = ModelFactory.ConvertFrom(estateResult.Data); - - Result> merchantResult = await Mediator.Send(new Queries.GetRecentMerchantsQuery(correlationId, estateId)); - - if (merchantResult.IsFailed) - return ResultHelpers.CreateFailure(merchantResult); - - this.merchants = ModelFactory.ConvertFrom(merchantResult.Data); + Task> estateTask = Mediator.Send(new Queries.GetEstateQuery(correlationId, estateId)); + Task>> merchantTask = Mediator.Send(new Queries.GetRecentMerchantsQuery(correlationId, estateId)); + Task>> contractsTask = Mediator.Send(new Queries.GetRecentContractsQuery(correlationId, estateId)); + Task>> assignedOperatorsTask = Mediator.Send(new Queries.GetAssignedOperatorsQuery(correlationId, estateId)); + Task>> allOperatorsTask= Mediator.Send(new Queries.GetOperatorsQuery(correlationId, estateId)); - Result> contractResult = await Mediator.Send(new Queries.GetRecentContractsQuery(correlationId, estateId)); - - if (contractResult.IsFailed) - return ResultHelpers.CreateFailure(contractResult); + await Task.WhenAll(estateTask, merchantTask, contractsTask, assignedOperatorsTask, allOperatorsTask); + + if (estateTask.Result.IsFailed) + return ResultHelpers.CreateFailure(estateTask.Result); + estate = ModelFactory.ConvertFrom(estateTask.Result.Data); - this.contracts = ModelFactory.ConvertFrom(contractResult.Data); + if (merchantTask.Result.IsFailed) + return ResultHelpers.CreateFailure(merchantTask.Result); + this.merchants = ModelFactory.ConvertFrom(merchantTask.Result.Data); - Result> assignedOperatorsResult = await Mediator.Send(new Queries.GetAssignedOperatorsQuery(correlationId, estateId)); + if (contractsTask.Result.IsFailed) + return ResultHelpers.CreateFailure(contractsTask.Result); + this.contracts = ModelFactory.ConvertFrom(contractsTask.Result.Data); - if (assignedOperatorsResult.IsFailed) - return ResultHelpers.CreateFailure(assignedOperatorsResult); + if (assignedOperatorsTask.Result.IsFailed) + return ResultHelpers.CreateFailure(assignedOperatorsTask.Result); + this.assignedOperators = ModelFactory.ConvertFrom(assignedOperatorsTask.Result.Data); - this.assignedOperators = ModelFactory.ConvertFrom(assignedOperatorsResult.Data); + if (allOperatorsTask.Result.IsFailed) + return ResultHelpers.CreateFailure(allOperatorsTask.Result); + List unfiltered = ModelFactory.ConvertFrom(allOperatorsTask.Result.Data); + this.availableOperators = unfiltered.Where(u => this.assignedOperators.Select(a => a.OperatorId).Contains(u.OperatorId) == false).ToList(); + return Result.Success(); } diff --git a/EstateManagementUI.BlazorServer/Components/Pages/Merchants/Edit.razor b/EstateManagementUI.BlazorServer/Components/Pages/Merchants/Edit.razor index 80606710..41efc608 100644 --- a/EstateManagementUI.BlazorServer/Components/Pages/Merchants/Edit.razor +++ b/EstateManagementUI.BlazorServer/Components/Pages/Merchants/Edit.razor @@ -535,7 +535,7 @@ else var estateId = Guid.Parse("11111111-1111-1111-1111-111111111111"); var accessToken = "stubbed-token"; - var result = await Mediator.Send(new Queries.GetOperatorsQuery(correlationId, accessToken, estateId)); + var result = await Mediator.Send(new Queries.GetOperatorsQuery(correlationId, estateId)); if (result.IsSuccess) { diff --git a/EstateManagementUI.BlazorServer/Components/Pages/Operators/Index.razor b/EstateManagementUI.BlazorServer/Components/Pages/Operators/Index.razor index 7f7883ea..911a045c 100644 --- a/EstateManagementUI.BlazorServer/Components/Pages/Operators/Index.razor +++ b/EstateManagementUI.BlazorServer/Components/Pages/Operators/Index.razor @@ -126,7 +126,7 @@ var estateId = Guid.Parse("11111111-1111-1111-1111-111111111111"); var accessToken = "stubbed-token"; - var result = await Mediator.Send(new Queries.GetOperatorsQuery(correlationId, accessToken, estateId)); + var result = await Mediator.Send(new Queries.GetOperatorsQuery(correlationId, estateId)); if (result.IsSuccess) { operators = ModelFactory.ConvertFrom(result.Data); diff --git a/EstateManagementUI.BlazorServer/Components/Pages/Reporting/TransactionDetail.razor b/EstateManagementUI.BlazorServer/Components/Pages/Reporting/TransactionDetail.razor index 5552362f..c3a92bff 100644 --- a/EstateManagementUI.BlazorServer/Components/Pages/Reporting/TransactionDetail.razor +++ b/EstateManagementUI.BlazorServer/Components/Pages/Reporting/TransactionDetail.razor @@ -427,7 +427,7 @@ // Load filter options var merchantsTask = Mediator.Send(new Queries.GetMerchantsQuery(correlationId, estateId)); - var operatorsTask = Mediator.Send(new Queries.GetOperatorsQuery(correlationId, accessToken, estateId)); + var operatorsTask = Mediator.Send(new Queries.GetOperatorsQuery(correlationId, estateId)); var contractsTask = Mediator.Send(new Queries.GetContractsQuery(correlationId, accessToken, estateId)); await Task.WhenAll(merchantsTask, operatorsTask, contractsTask); diff --git a/EstateManagementUI.BlazorServer/Components/Pages/Reporting/TransactionSummaryMerchant.razor b/EstateManagementUI.BlazorServer/Components/Pages/Reporting/TransactionSummaryMerchant.razor index fa5e3d60..6dc73dad 100644 --- a/EstateManagementUI.BlazorServer/Components/Pages/Reporting/TransactionSummaryMerchant.razor +++ b/EstateManagementUI.BlazorServer/Components/Pages/Reporting/TransactionSummaryMerchant.razor @@ -273,7 +273,7 @@ // Load filter options var merchantsTask = Mediator.Send(new Queries.GetMerchantsQuery(correlationId, estateId)); - var operatorsTask = Mediator.Send(new Queries.GetOperatorsQuery(correlationId, accessToken, estateId)); + var operatorsTask = Mediator.Send(new Queries.GetOperatorsQuery(correlationId, estateId)); await Task.WhenAll(merchantsTask, operatorsTask); diff --git a/EstateManagementUI.BlazorServer/Components/Pages/Reporting/TransactionSummaryOperator.razor b/EstateManagementUI.BlazorServer/Components/Pages/Reporting/TransactionSummaryOperator.razor index e1c6d268..651744d4 100644 --- a/EstateManagementUI.BlazorServer/Components/Pages/Reporting/TransactionSummaryOperator.razor +++ b/EstateManagementUI.BlazorServer/Components/Pages/Reporting/TransactionSummaryOperator.razor @@ -281,7 +281,7 @@ // Load filter options var merchantsTask = Mediator.Send(new Queries.GetMerchantsQuery(correlationId, estateId)); - var operatorsTask = Mediator.Send(new Queries.GetOperatorsQuery(correlationId, accessToken, estateId)); + var operatorsTask = Mediator.Send(new Queries.GetOperatorsQuery(correlationId, estateId)); await Task.WhenAll(merchantsTask, operatorsTask); diff --git a/EstateManagmentUI.BusinessLogic/BackendAPI/DataTransferObjects/DataTransferObjects.cs b/EstateManagmentUI.BusinessLogic/BackendAPI/DataTransferObjects/DataTransferObjects.cs index 22c77f68..75847e55 100644 --- a/EstateManagmentUI.BusinessLogic/BackendAPI/DataTransferObjects/DataTransferObjects.cs +++ b/EstateManagmentUI.BusinessLogic/BackendAPI/DataTransferObjects/DataTransferObjects.cs @@ -157,4 +157,16 @@ public class EstateMerchant [JsonProperty("reference")] public string? Reference { get; set; } } + + public class Operator + { + [JsonProperty("estate_reporting_id")] + public Int32 EstateReportingId { get; set; } + [JsonProperty("operator_id")] + public Guid OperatorId { get; set; } + [JsonProperty("name")] + public String Name { get; set; } + [JsonProperty("operator_reporting_id")] + public Int32 OperatorReportingId { get; set; } + } } diff --git a/EstateManagmentUI.BusinessLogic/BackendAPI/IEstateReportingApiClient.cs b/EstateManagmentUI.BusinessLogic/BackendAPI/IEstateReportingApiClient.cs index 862aa26f..67caab39 100644 --- a/EstateManagmentUI.BusinessLogic/BackendAPI/IEstateReportingApiClient.cs +++ b/EstateManagmentUI.BusinessLogic/BackendAPI/IEstateReportingApiClient.cs @@ -14,6 +14,11 @@ public interface IEstateReportingApiClient Task>> GetEstateAssignedOperators(String accessToken, Guid estateId, CancellationToken cancellationToken); + + Task>> GetOperators(String accessToken, + Guid estateId, + CancellationToken cancellationToken); + Task>> GetComparisonDates(String accessToken, Guid estateId, CancellationToken cancellationToken); Task> GetMerchantKpi(String accessToken, Guid estateId, CancellationToken cancellationToken); @@ -97,6 +102,33 @@ public async Task>> GetEstateAssignedOperators(Strin } } + public async Task>> GetOperators(String accessToken, + Guid estateId, + CancellationToken cancellationToken) { + String requestUri = this.BuildRequestUrl("/api/operators"); + + try + { + List<(String headerName, String headerValue)> additionalHeaders = [ + (EstateIdHeaderName, estateId.ToString()) + ]; + + Result> result = await this.SendHttpGetRequest>(requestUri, accessToken, additionalHeaders, cancellationToken); + + if (result.IsFailed) + return ResultHelpers.CreateFailure(result); + + return result; + } + catch (Exception ex) + { + // An exception has occurred, add some additional information to the message + Exception exception = new Exception($"Error getting operators {estateId}.", ex); + + return Result.Failure(exception.Message); + } + } + public async Task>> GetComparisonDates(String accessToken, Guid estateId, CancellationToken cancellationToken) { diff --git a/EstateManagmentUI.BusinessLogic/Client/APIModelFactory.cs b/EstateManagmentUI.BusinessLogic/Client/APIModelFactory.cs index b5de4c11..a08619ab 100644 --- a/EstateManagmentUI.BusinessLogic/Client/APIModelFactory.cs +++ b/EstateManagmentUI.BusinessLogic/Client/APIModelFactory.cs @@ -146,4 +146,17 @@ public static List ConvertFrom(List apiResultData } return operators; } + + public static List ConvertFrom(List apiResultData) { + List operators = new(); + foreach (Operator op in apiResultData) + { + operators.Add(new OperatorModel() + { + Name = op.Name, + OperatorId = op.OperatorId + }); + } + return operators; + } } \ No newline at end of file diff --git a/EstateManagmentUI.BusinessLogic/Client/OperatorMethods.cs b/EstateManagmentUI.BusinessLogic/Client/OperatorMethods.cs new file mode 100644 index 00000000..15e5df94 --- /dev/null +++ b/EstateManagmentUI.BusinessLogic/Client/OperatorMethods.cs @@ -0,0 +1,35 @@ +using EstateManagementUI.BusinessLogic.Models; +using EstateManagementUI.BusinessLogic.Requests; +using Shared.Results; +using SimpleResults; +using System; +using System.Collections.Generic; +using System.Text; + +namespace EstateManagementUI.BusinessLogic.Client +{ + public partial interface IApiClient + { + Task>> GetOperators(Queries.GetOperatorsQuery request, + CancellationToken cancellationToken); + } + + public partial class ApiClient : IApiClient { + public async Task>> GetOperators(Queries.GetOperatorsQuery request, + CancellationToken cancellationToken) { + // Get a token here + var token = await this.GetToken(cancellationToken); + if (token.IsFailed) + return ResultHelpers.CreateFailure(token); + + var apiResult = await this.EstateReportingApiClient.GetOperators(token.Data, request.EstateId, cancellationToken); + + if (apiResult.IsFailed) + return ResultHelpers.CreateFailure(apiResult); + + List operatorModels = APIModelFactory.ConvertFrom(apiResult.Data); + + return Result.Success(operatorModels); + } + } +} diff --git a/EstateManagmentUI.BusinessLogic/RequestHandlers/DateRequestHandler.cs b/EstateManagmentUI.BusinessLogic/RequestHandlers/DateRequestHandler.cs index 80c44cfe..86d794ad 100644 --- a/EstateManagmentUI.BusinessLogic/RequestHandlers/DateRequestHandler.cs +++ b/EstateManagmentUI.BusinessLogic/RequestHandlers/DateRequestHandler.cs @@ -208,7 +208,7 @@ public OperatorRequestHandler(IApiClient apiClient) public async Task>> Handle(Queries.GetOperatorsQuery request, CancellationToken cancellationToken) { - return Result.Success(StubTestData.GetMockOperators()); + return await this.ApiClient.GetOperators(request, cancellationToken); } public async Task> Handle(Queries.GetOperatorQuery request, CancellationToken cancellationToken) { diff --git a/EstateManagmentUI.BusinessLogic/Requests/Requests.cs b/EstateManagmentUI.BusinessLogic/Requests/Requests.cs index cc2a0aad..5d4cd6be 100644 --- a/EstateManagmentUI.BusinessLogic/Requests/Requests.cs +++ b/EstateManagmentUI.BusinessLogic/Requests/Requests.cs @@ -18,7 +18,7 @@ public record GetAssignedOperatorsQuery(CorrelationId CorrelationId, Guid Estate public record GetMerchantsQuery(CorrelationId CorrelationId, Guid EstateId) : IRequest>>; public record GetRecentMerchantsQuery(CorrelationId CorrelationId, Guid EstateId) : IRequest>>; public record GetRecentContractsQuery(CorrelationId CorrelationId, Guid EstateId) : IRequest>>; - public record GetOperatorsQuery(CorrelationId CorrelationId, string AccessToken, Guid EstateId) : IRequest>>; + public record GetOperatorsQuery(CorrelationId CorrelationId, Guid EstateId) : IRequest>>; public record GetContractsQuery(CorrelationId CorrelationId, string AccessToken, Guid EstateId) : IRequest>>; public record GetOperatorQuery(CorrelationId CorrelationId, string AccessToken, Guid EstateId, Guid OperatorId) : IRequest>; public record GetContractQuery(CorrelationId CorrelationId, string AccessToken, Guid EstateId, Guid ContractId) : IRequest>;