@@ -193,12 +173,11 @@ else
@code {
private readonly New.CreateMerchantModel model = new();
private bool isSaving = false;
- private bool hasPermission = false;
private string? errorMessage;
protected override async Task OnInitializedAsync()
{
- hasPermission = await PermissionService.HasPermissionAsync(PermissionSection.Merchant, PermissionFunction.Create);
+ await RequirePermission(PermissionSection.Merchant, PermissionFunction.Create);
}
private async Task HandleSubmit()
@@ -326,4 +305,3 @@ else
public string? PhoneNumber { get; set; }
}
}
-}
diff --git a/EstateManagementUI.BlazorServer/Components/Pages/Merchants/View.razor b/EstateManagementUI.BlazorServer/Components/Pages/Merchants/View.razor
index 5aaa41d6..c4ca9e90 100644
--- a/EstateManagementUI.BlazorServer/Components/Pages/Merchants/View.razor
+++ b/EstateManagementUI.BlazorServer/Components/Pages/Merchants/View.razor
@@ -2,6 +2,7 @@
@using EstateManagementUI.BlazorServer.Factories
@rendermode InteractiveServer
@inject IMediator Mediator
+@inherits AuthorizedComponentBase
@inject NavigationManager NavigationManager
@using EstateManagementUI.BlazorServer.Models
@using EstateManagementUI.BusinessLogic.Requests
@@ -330,6 +331,7 @@
protected override async Task OnInitializedAsync()
{
+ await RequirePermission(PermissionSection.Merchant, PermissionFunction.View);
await LoadMerchant();
}
diff --git a/EstateManagementUI.BlazorServer/Components/Pages/Operators/Edit.razor b/EstateManagementUI.BlazorServer/Components/Pages/Operators/Edit.razor
index 2df5e7a2..ff50e915 100644
--- a/EstateManagementUI.BlazorServer/Components/Pages/Operators/Edit.razor
+++ b/EstateManagementUI.BlazorServer/Components/Pages/Operators/Edit.razor
@@ -5,6 +5,7 @@
@using EstateManagementUI.BlazorServer.Permissions
@using EstateManagementUI.BusinessLogic.Requests
@inject IMediator Mediator
+@inherits AuthorizedComponentBase
@inject NavigationManager NavigationManager
@inject IPermissionService PermissionService
@@ -146,11 +147,9 @@ else
protected override async Task OnInitializedAsync()
{
- hasPermission = await PermissionService.HasPermissionAsync(PermissionSection.Operator, PermissionFunction.Edit);
- if (hasPermission)
- {
- await LoadOperator();
- }
+ await RequirePermission(PermissionSection.Operator, PermissionFunction.Edit);
+ await LoadOperator();
+
}
private async Task LoadOperator()
diff --git a/EstateManagementUI.BlazorServer/Components/Pages/Operators/Index.razor b/EstateManagementUI.BlazorServer/Components/Pages/Operators/Index.razor
index 4a4495bb..7f7883ea 100644
--- a/EstateManagementUI.BlazorServer/Components/Pages/Operators/Index.razor
+++ b/EstateManagementUI.BlazorServer/Components/Pages/Operators/Index.razor
@@ -4,6 +4,7 @@
@using EstateManagementUI.BlazorServer.Permissions
@using EstateManagementUI.BusinessLogic.Requests
@inject IMediator Mediator
+@inherits AuthorizedComponentBase
@inject NavigationManager NavigationManager
@inject IPermissionKeyProvider PermissionKeyProvider
@@ -119,6 +120,8 @@
{
try
{
+ await RequirePermission(PermissionSection.Operator, PermissionFunction.List);
+
var correlationId = new CorrelationId(Guid.NewGuid());
var estateId = Guid.Parse("11111111-1111-1111-1111-111111111111");
var accessToken = "stubbed-token";
diff --git a/EstateManagementUI.BlazorServer/Components/Pages/Operators/New.razor b/EstateManagementUI.BlazorServer/Components/Pages/Operators/New.razor
index 259b3f32..71223bc5 100644
--- a/EstateManagementUI.BlazorServer/Components/Pages/Operators/New.razor
+++ b/EstateManagementUI.BlazorServer/Components/Pages/Operators/New.razor
@@ -4,32 +4,12 @@
@using EstateManagementUI.BlazorServer.Permissions
@using EstateManagementUI.BusinessLogic.Requests
@inject IMediator Mediator
+@inherits AuthorizedComponentBase
@inject NavigationManager NavigationManager
@inject IPermissionService PermissionService
Create New Operator
-@if (!hasPermission)
-{
-
-
-
-
-
-
Access Denied
-
You don't have permission to create operators.
-
-
-
-
-
-}
-else
-{
@@ -109,12 +89,11 @@ else
@code {
private CreateOperatorModel model = new();
private bool isSaving = false;
- private bool hasPermission = false;
private string? errorMessage;
protected override async Task OnInitializedAsync()
{
- hasPermission = await PermissionService.HasPermissionAsync(PermissionSection.Operator, PermissionFunction.Create);
+ await RequirePermission(PermissionSection.Operator, PermissionFunction.Create);
}
private async Task HandleSubmit()
@@ -174,4 +153,3 @@ else
public bool RequireCustomTerminalNumber { get; set; }
}
}
-}
diff --git a/EstateManagementUI.BlazorServer/Components/Pages/Operators/View.razor b/EstateManagementUI.BlazorServer/Components/Pages/Operators/View.razor
index 0bed1c2a..5df4e361 100644
--- a/EstateManagementUI.BlazorServer/Components/Pages/Operators/View.razor
+++ b/EstateManagementUI.BlazorServer/Components/Pages/Operators/View.razor
@@ -3,6 +3,7 @@
@using EstateManagementUI.BusinessLogic.Requests
@rendermode InteractiveServer
@inject IMediator Mediator
+@inherits AuthorizedComponentBase
@inject NavigationManager NavigationManager
View Operator
@@ -86,6 +87,8 @@
protected override async Task OnInitializedAsync()
{
+ await RequirePermission(PermissionSection.Operator, PermissionFunction.View);
+
await LoadOperator();
}
diff --git a/EstateManagementUI.BlazorServer/Components/Permissions/AuthorizedComponentBase.cs b/EstateManagementUI.BlazorServer/Components/Permissions/AuthorizedComponentBase.cs
new file mode 100644
index 00000000..dd90846b
--- /dev/null
+++ b/EstateManagementUI.BlazorServer/Components/Permissions/AuthorizedComponentBase.cs
@@ -0,0 +1,44 @@
+using EstateManagementUI.BlazorServer.Common;
+using EstateManagementUI.BlazorServer.Permissions;
+using Microsoft.AspNetCore.Components;
+using Microsoft.AspNetCore.Components.Authorization;
+using System.Security.Claims;
+using SimpleResults;
+
+public abstract class AuthorizedComponentBase : ComponentBase
+{
+ [CascadingParameter]
+ private Task
AuthenticationStateTask { get; set; } = default!;
+
+ protected ClaimsPrincipal User { get; private set; } = default!;
+ protected AuthenticationState AuthState { get; private set; } = default!;
+
+ protected override async Task OnInitializedAsync() {
+
+ this.AuthState = await AuthenticationStateTask;
+ User = this.AuthState.User;
+ }
+
+ [Inject] protected IPermissionService PermissionService { get; set; } = default!;
+ [Inject] protected NavigationManager NavigationManager { get; set; } = default!;
+
+ protected async Task RequirePermission(PermissionSection permissionSection, PermissionFunction permissionFunction)
+ {
+ // Do a permission check here
+ Boolean hasPermission = await this.PermissionService.HasPermissionAsync(permissionSection, permissionFunction);
+ if (hasPermission == false)
+ {
+ // TODO: Navigate to access denied page
+ this.NavigationManager.NavigateToErrorPage();
+ return;
+ }
+ }
+
+ protected async Task GetEstateId() {
+ Result estateIdResult = this.AuthState.GetEstateIdFromClaims();
+ if (estateIdResult.IsFailed) {
+ this.NavigationManager.NavigateToErrorPage();
+ }
+ return estateIdResult.Data;
+ }
+}
\ No newline at end of file
diff --git a/EstateManagementUI.BlazorServer/Permissions/PermissionFunction.cs b/EstateManagementUI.BlazorServer/Permissions/PermissionFunction.cs
index 18fbbd72..178d60a6 100644
--- a/EstateManagementUI.BlazorServer/Permissions/PermissionFunction.cs
+++ b/EstateManagementUI.BlazorServer/Permissions/PermissionFunction.cs
@@ -9,5 +9,6 @@ public enum PermissionFunction
Create,
Edit,
Delete,
- MakeDeposit
+ MakeDeposit,
+ List
}
diff --git a/EstateManagementUI.BlazorServer/Program.cs b/EstateManagementUI.BlazorServer/Program.cs
index 2a5ce307..27b5d09e 100644
--- a/EstateManagementUI.BlazorServer/Program.cs
+++ b/EstateManagementUI.BlazorServer/Program.cs
@@ -21,6 +21,7 @@
using ClientProxyBase;
using SecurityService.Client;
using Shared.General;
+using TransactionProcessor.Client;
var builder = WebApplication.CreateBuilder(args);
@@ -237,6 +238,7 @@
builder.Services.RegisterHttpClient();
builder.Services.RegisterHttpClient();
+ builder.Services.RegisterHttpClient();
}
WebApplication app = builder.Build();
diff --git a/EstateManagmentUI.BusinessLogic/Client/APIModelFactory.cs b/EstateManagmentUI.BusinessLogic/Client/APIModelFactory.cs
index 83df32fc..6f84cc3c 100644
--- a/EstateManagmentUI.BusinessLogic/Client/APIModelFactory.cs
+++ b/EstateManagmentUI.BusinessLogic/Client/APIModelFactory.cs
@@ -1,5 +1,6 @@
using EstateManagementUI.BusinessLogic.BackendAPI.DataTransferObjects;
using EstateManagementUI.BusinessLogic.Models;
+using TransactionProcessor.DataTransferObjects.Responses.Estate;
namespace EstateManagementUI.BusinessLogic.Client;
@@ -66,4 +67,24 @@ public static List ConvertFrom(List apiResultDat
return merchants;
}
+
+ public static EstateModel ConvertFrom(EstateResponse apiResultData) {
+ EstateModel model = new EstateModel {
+ Reference = apiResultData.EstateReference,
+ EstateId = apiResultData.EstateId,
+ EstateName = apiResultData.EstateName,
+ Operators = new List()
+ };
+
+ foreach (EstateOperatorResponse estateOperatorResponse in apiResultData.Operators) {
+ model.Operators.Add(new EstateOperatorModel {
+ Name = estateOperatorResponse.Name,
+ OperatorId = estateOperatorResponse.OperatorId,
+ RequireCustomMerchantNumber = estateOperatorResponse.RequireCustomMerchantNumber,
+ RequireCustomTerminalNumber = estateOperatorResponse.RequireCustomTerminalNumber,
+ });
+ }
+
+ return model;
+ }
}
\ No newline at end of file
diff --git a/EstateManagmentUI.BusinessLogic/Client/DateMethods.cs b/EstateManagmentUI.BusinessLogic/Client/DateMethods.cs
index 6837eaf1..eb79b5ad 100644
--- a/EstateManagmentUI.BusinessLogic/Client/DateMethods.cs
+++ b/EstateManagmentUI.BusinessLogic/Client/DateMethods.cs
@@ -10,6 +10,7 @@
using System.Collections.Generic;
using System.Text;
using System.Threading;
+using TransactionProcessor.Client;
namespace EstateManagementUI.BusinessLogic.Client
{
@@ -21,10 +22,13 @@ Task>> GetComparisonDates(Queries.GetComparison
public partial class ApiClient : IApiClient {
private readonly IEstateReportingApiClient EstateReportingApiClient;
private readonly ISecurityServiceClient SecurityServiceClient;
+ private readonly ITransactionProcessorClient TransactionProcessorClient;
- public ApiClient(IEstateReportingApiClient estateReportingApiClient, ISecurityServiceClient securityServiceClient) {
+ public ApiClient(IEstateReportingApiClient estateReportingApiClient, ISecurityServiceClient securityServiceClient,
+ ITransactionProcessorClient transactionProcessorClient) {
this.EstateReportingApiClient = estateReportingApiClient;
this.SecurityServiceClient = securityServiceClient;
+ this.TransactionProcessorClient = transactionProcessorClient;
}
public async Task>> GetComparisonDates(Queries.GetComparisonDatesQuery request,
CancellationToken cancellationToken) {
diff --git a/EstateManagmentUI.BusinessLogic/Client/EstateMethods.cs b/EstateManagmentUI.BusinessLogic/Client/EstateMethods.cs
new file mode 100644
index 00000000..03cb85cc
--- /dev/null
+++ b/EstateManagmentUI.BusinessLogic/Client/EstateMethods.cs
@@ -0,0 +1,35 @@
+using EstateManagementUI.BusinessLogic.Models;
+using EstateManagementUI.BusinessLogic.Requests;
+using SimpleResults;
+using System;
+using System.Collections.Generic;
+using System.Diagnostics.Tracing;
+using System.Text;
+using Shared.Results;
+using TransactionProcessor.DataTransferObjects.Responses.Estate;
+
+namespace EstateManagementUI.BusinessLogic.Client {
+ public partial interface IApiClient {
+ Task> GetEstate(Queries.GetEstateQuery request,
+ CancellationToken cancellationToken);
+ }
+
+ public partial class ApiClient : IApiClient {
+
+ public async Task> GetEstate(Queries.GetEstateQuery request,
+ CancellationToken cancellationToken) {
+ // Get a token here
+ Result token = await this.GetToken(cancellationToken);
+ if (token.IsFailed)
+ return ResultHelpers.CreateFailure(token);
+
+ Result? apiResult = await this.TransactionProcessorClient.GetEstate(token.Data, request.EstateId, cancellationToken);
+ if (apiResult.IsFailed)
+ return ResultHelpers.CreateFailure(apiResult);
+
+ EstateModel estate = APIModelFactory.ConvertFrom(apiResult.Data);
+
+ return Result.Success(estate);
+ }
+ }
+}
diff --git a/EstateManagmentUI.BusinessLogic/EstateManagementUI.BusinessLogic.csproj b/EstateManagmentUI.BusinessLogic/EstateManagementUI.BusinessLogic.csproj
index 754c26b4..317bd052 100644
--- a/EstateManagmentUI.BusinessLogic/EstateManagementUI.BusinessLogic.csproj
+++ b/EstateManagmentUI.BusinessLogic/EstateManagementUI.BusinessLogic.csproj
@@ -11,5 +11,6 @@
+
diff --git a/EstateManagmentUI.BusinessLogic/RequestHandlers/DateRequestHandler.cs b/EstateManagmentUI.BusinessLogic/RequestHandlers/DateRequestHandler.cs
index 783de7ed..bb400575 100644
--- a/EstateManagmentUI.BusinessLogic/RequestHandlers/DateRequestHandler.cs
+++ b/EstateManagmentUI.BusinessLogic/RequestHandlers/DateRequestHandler.cs
@@ -31,7 +31,7 @@ public EstateRequestHandler(IApiClient apiClient) {
public async Task> Handle(Queries.GetEstateQuery request,
CancellationToken cancellationToken) {
- return Result.Success(StubTestData.GetMockEstate());
+ return await this.ApiClient.GetEstate(request, cancellationToken);
}
public async Task Handle(Commands.AddOperatorToEstateCommand request,
diff --git a/EstateManagmentUI.BusinessLogic/Requests/Requests.cs b/EstateManagmentUI.BusinessLogic/Requests/Requests.cs
index bf931650..f17452a0 100644
--- a/EstateManagmentUI.BusinessLogic/Requests/Requests.cs
+++ b/EstateManagmentUI.BusinessLogic/Requests/Requests.cs
@@ -13,7 +13,7 @@ public static class CorrelationIdHelper
public static class Queries
{
- public record GetEstateQuery(CorrelationId CorrelationId, string AccessToken, Guid EstateId) : IRequest>;
+ public record GetEstateQuery(CorrelationId CorrelationId, Guid EstateId) : IRequest>;
public record GetMerchantsQuery(CorrelationId CorrelationId, Guid EstateId) : IRequest>>;
public record GetRecentMerchantsQuery(CorrelationId CorrelationId, Guid EstateId) : IRequest>>;
public record GetOperatorsQuery(CorrelationId CorrelationId, string AccessToken, Guid EstateId) : IRequest>>;