Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,9 @@ public void EstateIndex_RendersCorrectly()
.ReturnsAsync(Result.Success(new List<RecentMerchantsModel>()));
_mockMediator.Setup(x => x.Send(It.IsAny<Queries.GetRecentContractsQuery>(), default))
.ReturnsAsync(Result.Success(new List<RecentContractModel>()));

_mockMediator.Setup(x => x.Send(It.IsAny<Queries.GetAssignedOperatorsQuery>(), default))
.ReturnsAsync(Result.Success(new List<OperatorModel>()));

// Act
var cut = RenderComponent<EstateIndex>();

Expand All @@ -59,6 +61,8 @@ public void EstateIndex_DisplaysEstateDetails()
.ReturnsAsync(Result.Success(new List<RecentMerchantsModel>()));
_mockMediator.Setup(x => x.Send(It.IsAny<Queries.GetRecentContractsQuery>(), default))
.ReturnsAsync(Result.Success(new List<RecentContractModel>()));
_mockMediator.Setup(x => x.Send(It.IsAny<Queries.GetAssignedOperatorsQuery>(), default))
.ReturnsAsync(Result.Success(new List<OperatorModel>()));

// Act
var cut = RenderComponent<EstateIndex>();
Expand All @@ -77,6 +81,8 @@ public void EstateIndex_HasCorrectPageTitle()
.ReturnsAsync(Result.Success(new List<RecentMerchantsModel>()));
_mockMediator.Setup(x => x.Send(It.IsAny<Queries.GetRecentContractsQuery>(), default))
.ReturnsAsync(Result.Success(new List<RecentContractModel>()));
_mockMediator.Setup(x => x.Send(It.IsAny<Queries.GetAssignedOperatorsQuery>(), default))
.ReturnsAsync(Result.Success(new List<OperatorModel>()));

// Act
var cut = RenderComponent<EstateIndex>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,19 +60,22 @@ private async Task<Result> LoadEstateData(CorrelationId correlationId, Guid esta
if (merchantResult.IsFailed)
return ResultHelpers.CreateFailure(merchantResult);

// Note: API returns merchants in creation order (newest first)
// If ordering is incorrect, would need CreatedDate field in the model
this.merchants = ModelFactory.ConvertFrom(merchantResult.Data);

Result<List<BusinessLogic.Models.RecentContractModel>> contractResult = await Mediator.Send(new Queries.GetRecentContractsQuery(correlationId, estateId));

if (contractResult.IsFailed)
return ResultHelpers.CreateFailure(contractResult);

// Note: API returns merchants in creation order (newest first)
// If ordering is incorrect, would need CreatedDate field in the model
this.contracts = ModelFactory.ConvertFrom(contractResult.Data);

Result<List<BusinessLogic.Models.OperatorModel>> assignedOperatorsResult = await Mediator.Send(new Queries.GetAssignedOperatorsQuery(correlationId, estateId));

if (assignedOperatorsResult.IsFailed)
return ResultHelpers.CreateFailure(assignedOperatorsResult);

this.assignedOperators = ModelFactory.ConvertFrom(assignedOperatorsResult.Data);

return Result.Success();
}

Expand Down
15 changes: 9 additions & 6 deletions EstateManagementUI.BlazorServer/Factories/ModelFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,13 @@ public static MerchantModel ConvertFrom(BusinessLogic.Models.MerchantModel model
};
}

public static List<OperatorModel> ConvertFrom(List<BusinessLogic.Models.OperatorModel> models)
{
List<OperatorModel> result = new List<OperatorModel>();
models.ForEach(m => result.Add(ConvertFrom(m)));
return result;
}

public static OperatorModel ConvertFrom(BusinessLogic.Models.OperatorModel model) {
return new OperatorModel() { OperatorId = model.OperatorId, Name = model.Name, RequireCustomMerchantNumber = model.RequireCustomMerchantNumber, RequireCustomTerminalNumber = model.RequireCustomTerminalNumber };
}
Expand Down Expand Up @@ -220,11 +227,7 @@ public static ProductPerformanceModel ConvertFrom(BusinessLogic.Models.ProductPe
return new ProductPerformanceModel() { PercentageContribution = model.PercentageContribution, ProductName = model.ProductName, TransactionCount = model.TransactionCount, TransactionValue = model.TransactionValue };
}

public static List<OperatorModel> ConvertFrom(List<BusinessLogic.Models.OperatorModel> models) {
List<OperatorModel> result = new List<OperatorModel>();
models.ForEach(m => result.Add(ConvertFrom(m)));
return result;
}


public static List<MerchantModel> ConvertFrom(List<BusinessLogic.Models.MerchantModel> models) {
List<MerchantModel> result = new List<MerchantModel>();
Expand Down Expand Up @@ -355,7 +358,7 @@ public static List<RecentContractModel> ConvertFrom(List<BusinessLogic.Models.Re
models.ForEach(m => result.Add(ConvertFrom(m)));
return result;
}

private static RecentContractModel ConvertFrom(BusinessLogic.Models.RecentContractModel model) {
return new RecentContractModel { OperatorName = model.OperatorName, Description = model.Description, ContractId = model.ContractId };
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@
{
Task<Result<Estate>> GetEstate(String accessToken, Guid estateId, CancellationToken cancellationToken);

Task<Result<List<EstateOperator>>> GetEstateAssignedOperators(String accessToken,
Guid estateId,
CancellationToken cancellationToken);
Task<Result<List<ComparisonDate>>> GetComparisonDates(String accessToken, Guid estateId, CancellationToken cancellationToken);
Task<Result<MerchantKpi>> GetMerchantKpi(String accessToken, Guid estateId, CancellationToken cancellationToken);

Expand Down Expand Up @@ -66,6 +69,34 @@
}
}

public async Task<Result<List<EstateOperator>>> GetEstateAssignedOperators(String accessToken,
Guid estateId,
CancellationToken cancellationToken)
{
String requestUri = this.BuildRequestUrl("/api/estates/operators");

try
{
List<(String headerName, String headerValue)> additionalHeaders = [
(EstateIdHeaderName, estateId.ToString())
];

Result<List<EstateOperator>> result = await this.SendHttpGetRequest<List<EstateOperator>>(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 estate assigned operators {estateId}.", ex);

return Result.Failure(exception.Message);
}
}

public async Task<Result<List<ComparisonDate>>> GetComparisonDates(String accessToken,
Guid estateId,
CancellationToken cancellationToken) {
Expand Down Expand Up @@ -272,24 +303,24 @@
if (alwaysInclude)
return false;

Object? defaultValue = GetDefault(value.GetType());

Check warning on line 306 in EstateManagmentUI.BusinessLogic/BackendAPI/IEstateReportingApiClient.cs

View workflow job for this annotation

GitHub Actions / Build and Unit Test

Dereference of a possibly null reference.

if (defaultValue == null && value.GetType() == typeof(String))
{
defaultValue = String.Empty;
}
return defaultValue.Equals(value);

Check warning on line 312 in EstateManagmentUI.BusinessLogic/BackendAPI/IEstateReportingApiClient.cs

View workflow job for this annotation

GitHub Actions / Build and Unit Test

Dereference of a possibly null reference.
}

public static object GetDefault(Type t)
{
Func<object> f = GetDefault<object>;
return f.Method.GetGenericMethodDefinition().MakeGenericMethod(t).Invoke(null, null);

Check warning on line 318 in EstateManagmentUI.BusinessLogic/BackendAPI/IEstateReportingApiClient.cs

View workflow job for this annotation

GitHub Actions / Build and Unit Test

Possible null reference return.
}

private static T GetDefault<T>()
{
return default(T);

Check warning on line 323 in EstateManagmentUI.BusinessLogic/BackendAPI/IEstateReportingApiClient.cs

View workflow job for this annotation

GitHub Actions / Build and Unit Test

Possible null reference return.
}

public string BuildQueryString()
Expand All @@ -310,7 +341,7 @@
queryString.Append("&");
}

queryString.Append($"{Uri.EscapeDataString(kvp.Key)}={Uri.EscapeDataString(kvp.Value.ToString())}");

Check warning on line 344 in EstateManagmentUI.BusinessLogic/BackendAPI/IEstateReportingApiClient.cs

View workflow job for this annotation

GitHub Actions / Build and Unit Test

Possible null reference argument for parameter 'stringToEscape' in 'string Uri.EscapeDataString(string stringToEscape)'.
}

return queryString.ToString();
Expand Down
13 changes: 13 additions & 0 deletions EstateManagmentUI.BusinessLogic/Client/APIModelFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -133,4 +133,17 @@ public static List<RecentContractModel> ConvertFrom(List<Contract> apiResultData

return contracts;
}

public static List<OperatorModel> ConvertFrom(List<EstateOperator> apiResultData) {
List<OperatorModel> operators = new();
foreach (EstateOperator estateOperator in apiResultData) {
operators.Add(new OperatorModel() {
Name = estateOperator.Name,
OperatorId = estateOperator.OperatorId,
RequireCustomMerchantNumber = estateOperator.RequireCustomMerchantNumber,
RequireCustomTerminalNumber = estateOperator.RequireCustomTerminalNumber
});
}
return operators;
}
}
19 changes: 19 additions & 0 deletions EstateManagmentUI.BusinessLogic/Client/EstateMethods.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@ namespace EstateManagementUI.BusinessLogic.Client {
public partial interface IApiClient {
Task<Result<EstateModel>> GetEstate(Queries.GetEstateQuery request,
CancellationToken cancellationToken);

Task<Result<List<OperatorModel>>> GetEstateAssignedOperators(Queries.GetAssignedOperatorsQuery request,
CancellationToken cancellationToken);
}

public partial class ApiClient : IApiClient {
Expand All @@ -32,5 +35,21 @@ public async Task<Result<EstateModel>> GetEstate(Queries.GetEstateQuery request,

return Result.Success(estate);
}

public async Task<Result<List<OperatorModel>>> GetEstateAssignedOperators(Queries.GetAssignedOperatorsQuery request,
CancellationToken cancellationToken) {
// Get a token here
Result<String> token = await this.GetToken(cancellationToken);
if (token.IsFailed)
return ResultHelpers.CreateFailure(token);

Result<List<EstateOperator>>? apiResult = await this.EstateReportingApiClient.GetEstateAssignedOperators(token.Data, request.EstateId, cancellationToken);
if (apiResult.IsFailed)
return ResultHelpers.CreateFailure(apiResult);

List<OperatorModel> estateOperators = APIModelFactory.ConvertFrom(apiResult.Data);

return Result.Success(estateOperators);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@ public async Task<Result<List<ComparisonDateModel>>> Handle(Queries.GetCompariso

public class EstateRequestHandler : IRequestHandler<Queries.GetEstateQuery, Result<EstateModel>>,
IRequestHandler<Commands.AddOperatorToEstateCommand, Result>,
IRequestHandler<Commands.RemoveOperatorFromEstateCommand, Result>
{
IRequestHandler<Commands.RemoveOperatorFromEstateCommand, Result>,
IRequestHandler<Queries.GetAssignedOperatorsQuery, Result<List<OperatorModel>>> {
private readonly IApiClient ApiClient;

public EstateRequestHandler(IApiClient apiClient) {
Expand All @@ -43,6 +43,11 @@ public async Task<Result> Handle(Commands.RemoveOperatorFromEstateCommand reques
CancellationToken cancellationToken) {
return Result.Success();
}

public async Task<Result<List<OperatorModel>>> Handle(Queries.GetAssignedOperatorsQuery request,
CancellationToken cancellationToken) {
return await this.ApiClient.GetEstateAssignedOperators(request, cancellationToken);
}
}

public class MerchantRequestHandler : IRequestHandler<Queries.GetMerchantsQuery, Result<List<MerchantModel>>>,
Expand Down
1 change: 1 addition & 0 deletions EstateManagmentUI.BusinessLogic/Requests/Requests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ public static class CorrelationIdHelper
public static class Queries
{
public record GetEstateQuery(CorrelationId CorrelationId, Guid EstateId) : IRequest<Result<EstateModel>>;
public record GetAssignedOperatorsQuery(CorrelationId CorrelationId, Guid EstateId) : IRequest<Result<List<OperatorModel>>>;
public record GetMerchantsQuery(CorrelationId CorrelationId, Guid EstateId) : IRequest<Result<List<MerchantModel>>>;
public record GetRecentMerchantsQuery(CorrelationId CorrelationId, Guid EstateId) : IRequest<Result<List<RecentMerchantsModel>>>;
public record GetRecentContractsQuery(CorrelationId CorrelationId, Guid EstateId) : IRequest<Result<List<RecentContractModel>>>;
Expand Down
Loading