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
107 changes: 107 additions & 0 deletions DigitalLearningSolutions.Data/ApiClients/LearningHubApiClient.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
namespace DigitalLearningSolutions.Data.ApiClients
{
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Threading.Tasks;
using DigitalLearningSolutions.Data.Helpers;
using DigitalLearningSolutions.Data.Models.LearningHubApiClient;
using Microsoft.Extensions.Configuration;
using Newtonsoft.Json;

public interface ILearningHubApiClient
{
Task<ResourceSearchResult> SearchResource(
string text,
int? offset = null,
int? limit = null,
IEnumerable<string>? resourceTypes = null
);

Task<ResourceReferenceWithResourceDetails> GetResourceByReferenceId(int resourceReferenceId);

Task<BulkResourceReferences> GetBulkResourcesByReferenceIds(
IEnumerable<int> resourceReferenceIds
);
}

public class LearningHubApiClient : ILearningHubApiClient
{
private readonly HttpClient client;

public LearningHubApiClient(HttpClient httpClient, IConfiguration config)
{
string learningHubOpenApiKey = config.GetLearningHubOpenApiKey();
string learningHubOpenApiBaseUrl = config.GetLearningHubOpenApiBaseUrl();

client = httpClient;
client.BaseAddress = new Uri(learningHubOpenApiBaseUrl);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Add("X-API-KEY", learningHubOpenApiKey);
}

public async Task<ResourceSearchResult> SearchResource(
string text,
int? offset = null,
int? limit = null,
IEnumerable<string>? resourceTypes = null
)
{
var queryString = GetSearchQueryString(text, offset, limit, resourceTypes);

var response = await client.GetStringAsync($"/Resource/Search?{queryString}");
var result = JsonConvert.DeserializeObject<ResourceSearchResult>(response);
return result;
}

public async Task<ResourceReferenceWithResourceDetails> GetResourceByReferenceId(int resourceReferenceId)
{
var response = await client.GetStringAsync($"/Resource/{resourceReferenceId}");
var result = JsonConvert.DeserializeObject<ResourceReferenceWithResourceDetails>(response);
return result;
}

public async Task<BulkResourceReferences> GetBulkResourcesByReferenceIds(
IEnumerable<int> resourceReferenceIds
)
{
var referenceIdQueryStrings =
resourceReferenceIds.Select(id => GetQueryString("resourceReferenceIds", id.ToString()));
var queryString = string.Join("&", referenceIdQueryStrings);

var response = await client.GetStringAsync($"/Resource/Bulk?{queryString}");
var result = JsonConvert.DeserializeObject<BulkResourceReferences>(response);
return result;
}

private static string GetSearchQueryString(
string text,
int? offset = null,
int? limit = null,
IEnumerable<string>? resourceTypes = null
)
{
var textQueryString = GetQueryString("text", text);
var offSetQueryString = GetQueryString("offset", offset.ToString());
var limitQueryString = GetQueryString("limit", limit.ToString());

var queryStrings = new List<string> { textQueryString, offSetQueryString, limitQueryString };

if (resourceTypes != null)
{
var resourceTypesQueryStrings = resourceTypes.Where(x => !string.IsNullOrEmpty(x))
.Select(r => GetQueryString("resourceTypes", r.ToString()));
queryStrings.AddRange(resourceTypesQueryStrings);
}

var validQueryStrings = queryStrings.Where(x => !string.IsNullOrEmpty(x)).ToArray();
return string.Join("&", validQueryStrings);
}

private static string GetQueryString(string key, string? value)
{
return string.IsNullOrEmpty(value) ? "" : $"{key}={value}";
}
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
Expand Down
12 changes: 12 additions & 0 deletions DigitalLearningSolutions.Data/Helpers/ConfigHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ public static class ConfigHelper
{
public const string AppRootPathName = "AppRootPath";
public const string CurrentSystemBaseUrlName = "CurrentSystemBaseUrl";
private const string LearningHubOpenApiKey = "LearningHubOpenAPIKey";
private const string LearningHubOpenApiBaseUrl = "LearningHubOpenAPIBaseUrl";

public static string GetAppRootPath(this IConfiguration config)
{
Expand All @@ -16,5 +18,15 @@ public static string GetCurrentSystemBaseUrl(this IConfiguration config)
{
return config[CurrentSystemBaseUrlName];
}

public static string GetLearningHubOpenApiKey(this IConfiguration config)
{
return config[LearningHubOpenApiKey];
}

public static string GetLearningHubOpenApiBaseUrl(this IConfiguration config)
{
return config[LearningHubOpenApiBaseUrl];
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
namespace DigitalLearningSolutions.Data.Models.LearningHubApiClient
{
using System.Collections.Generic;

public class BulkResourceReferences
{
public List<ResourceReferenceWithResourceDetails> ResourceReferences { get; set; }

public List<int> UnmatchedResourceReferenceIds { get; set; }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
namespace DigitalLearningSolutions.Data.Models.LearningHubApiClient
{
public class Catalogue
{
public int Id { get; set; }

public string Name { get; set; }

public bool IsRestricted { get; set; }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
namespace DigitalLearningSolutions.Data.Models.LearningHubApiClient
{
using System.Collections.Generic;

public class ResourceMetadata
{
public int ResourceId { get; set; }

public string Title { get; set; }

public string Description { get; set; }

public List<ResourceReference> References { get; set; }

public string ResourceType { get; set; }

public decimal Rating { get; set; }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
namespace DigitalLearningSolutions.Data.Models.LearningHubApiClient
{
public class ResourceReference
{
public int RefId { get; set; }

public Catalogue? Catalogue { get; set; }

public string Link { get; set; }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
namespace DigitalLearningSolutions.Data.Models.LearningHubApiClient
{
public class ResourceReferenceWithResourceDetails
{
public int ResourceId { get; set; }

public int RefId { get; set; }

public string Title { get; set; }

public string Description { get; set; }

public Catalogue Catalogue { get; set; }

public string ResourceType { get; set; }

public decimal Rating { get; set; }

public string Link { get; set; }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
namespace DigitalLearningSolutions.Data.Models.LearningHubApiClient
{
using System.Collections.Generic;

public class ResourceSearchResult
{
public List<ResourceMetadata> Results { get; set; }

public int Offset { get; set; }

public int TotalNumResources { get; set; }
}
}
11 changes: 9 additions & 2 deletions DigitalLearningSolutions.Web/Startup.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ namespace DigitalLearningSolutions.Web
using System.IO;
using System.Threading.Tasks;
using System.Web;
using DigitalLearningSolutions.Data.ApiClients;
using DigitalLearningSolutions.Data.DataServices;
using DigitalLearningSolutions.Data.DataServices.UserDataService;
using DigitalLearningSolutions.Data.Factories;
Expand Down Expand Up @@ -151,6 +152,7 @@ public void ConfigureServices(IServiceCollection services)
RegisterServices(services);
RegisterDataServices(services);
RegisterHelpers(services);
RegisterHttpClients(services);
RegisterWebServiceFilters(services);
}

Expand Down Expand Up @@ -242,12 +244,17 @@ private static void RegisterDataServices(IServiceCollection services)

private static void RegisterHelpers(IServiceCollection services)
{
services.AddHttpClient<IMapsApiHelper, MapsApiHelper>();
services.AddScoped<CentreCustomPromptHelper>();
services.AddScoped<IFilteredApiHelperService, FilteredApiHelper>();
services.AddScoped<ISmtpClientFactory, SmtpClientFactory>();
}

private static void RegisterHttpClients(IServiceCollection services)
{
services.AddHttpClient<IMapsApiHelper, MapsApiHelper>();
services.AddHttpClient<ILearningHubApiClient, LearningHubApiClient>();
services.AddScoped<IFilteredApiHelperService, FilteredApiHelper>();
}

private static void RegisterWebServiceFilters(IServiceCollection services)
{
services.AddScoped<RedirectEmptySessionData<RegistrationData>>();
Expand Down
3 changes: 2 additions & 1 deletion DigitalLearningSolutions.Web/appSettings.UAT.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,6 @@
"SupervisorProfileAssessmentInterface": false,
"WorkforceManagerInterface": false,
"RefactoredSuperAdminInterface": true
}
},
"LearningHubOpenAPIBaseUrl": "https://uks-learninghubnhsuk-openapi-dev.azurewebsites.net"
}
3 changes: 2 additions & 1 deletion DigitalLearningSolutions.Web/appsettings.Development.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,6 @@
"SupervisorProfileAssessmentInterface": true,
"WorkforceManagerInterface": true,
"RefactoredSuperAdminInterface": true
}
},
"LearningHubOpenAPIBaseUrl": "https://uks-learninghubnhsuk-openapi-dev.azurewebsites.net"
}
3 changes: 2 additions & 1 deletion DigitalLearningSolutions.Web/appsettings.Production.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,6 @@
"SupervisorProfileAssessmentInterface": false,
"WorkforceManagerInterface": false,
"RefactoredSuperAdminInterface": false
}
},
"LearningHubOpenAPIBaseUrl": "https://uks-learninghubnhsuk-openapi-dev.azurewebsites.net"
}
31 changes: 16 additions & 15 deletions DigitalLearningSolutions.Web/appsettings.SIT.json
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
{
"AllowedHosts": "*",
"ConnectionStrings": {
"DefaultConnection": "Data Source=localhost;Initial Catalog=mbdbx101_test;Integrated Security=True;"
},
"CurrentSystemBaseUrl": "https://localhost:44367",
"AppRootPath": "https://localhost:44363",
"LegacyLearningMenu": false,
"FeatureManagement": {
"RefactoredTrackingSystem": true,
"SupervisorProfileAssessmentInterface": true,
"WorkforceManagerInterface": true,
"RefactoredSuperAdminInterface": true
}
}
{
"AllowedHosts": "*",
"ConnectionStrings": {
"DefaultConnection": "Data Source=localhost;Initial Catalog=mbdbx101_test;Integrated Security=True;"
},
"CurrentSystemBaseUrl": "https://localhost:44367",
"AppRootPath": "https://localhost:44363",
"LegacyLearningMenu": false,
"FeatureManagement": {
"RefactoredTrackingSystem": true,
"SupervisorProfileAssessmentInterface": true,
"WorkforceManagerInterface": true,
"RefactoredSuperAdminInterface": true
},
"LearningHubOpenAPIBaseUrl": "https://uks-learninghubnhsuk-openapi-dev.azurewebsites.net"
}
3 changes: 2 additions & 1 deletion DigitalLearningSolutions.Web/appsettings.Test.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,6 @@
"SupervisorProfileAssessmentInterface": true,
"WorkforceManagerInterface": true,
"RefactoredSuperAdminInterface": true
}
},
"LearningHubOpenAPIBaseUrl": "https://uks-learninghubnhsuk-openapi-dev.azurewebsites.net"
}
3 changes: 2 additions & 1 deletion DigitalLearningSolutions.Web/appsettings.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,6 @@
"FeatureManagement": {
"RefactoredTrackingSystem": false,
"RefactoredSuperAdminInterface": false
}
},
"LearningHubOpenAPIBaseUrl": "https://uks-learninghubnhsuk-openapi-dev.azurewebsites.net"
}