Skip to content
Open
Show file tree
Hide file tree
Changes from 11 commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
3343656
TD-5700-fix
AnjuJose011 Jul 3, 2025
20ca42e
TD-5727
AnjuJose011 Jul 10, 2025
19d6cfc
TD-5727
AnjuJose011 Jul 10, 2025
247ef8f
TD-5829: Introduced Shared Project refactored code shared with Blazor…
Phil-NHS Jul 18, 2025
2db7358
Merge pull request #1283 from TechnologyEnhancedLearning/TD-5727-Cont…
AnjuJose011 Jul 30, 2025
a8c26db
Merge pull request #1286 from TechnologyEnhancedLearning/TD-5700-Reso…
AnjuJose011 Jul 30, 2025
aa9a1a5
TD-5862 Squash following merging RC changes
Phil-NHS Jul 30, 2025
bcd5659
bit of moodle refactoring and reload the moodle user
Jul 30, 2025
60f1317
Rolling back Models to 48 to fix the build
Jul 30, 2025
230a260
TD-5862 restoring interface
Phil-NHS Jul 30, 2025
78709c7
TD-5862 reopen pull request
Phil-NHS Jul 30, 2025
dcca696
TD-5862 Merge in to new branch
Phil-NHS Jul 30, 2025
99fc2b6
TD-5829 was missing configuration of bff
Phil-NHS Jul 30, 2025
6242cfd
Merge pull request #1289 from TechnologyEnhancedLearning/Develop/Fixe…
binon Jul 31, 2025
c800d32
TD-5829 Ivory updated
Phil-NHS Jul 31, 2025
3279ef6
TD-5829 Updating to accomodate changes to Ivory
Phil-NHS Jul 31, 2025
bcdff4b
TD-5888 adding blazor serverside and TELBlazor package ref
Phil-NHS Aug 1, 2025
ce07ada
TD-5888 Builds, requires httpclient and comments tidying
Phil-NHS Aug 1, 2025
8167a97
TD-5888 Working when not using shared project
Phil-NHS Aug 6, 2025
edd96ee
TD-5888 tidy up client registration
Phil-NHS Aug 6, 2025
f06621f
TD-5888 NOT FOR PRODUCTION UNTIL SQUASHED AND REVISED PR FOR REVIEW D…
Phil-NHS Aug 8, 2025
e8943a6
TD-5888 Adding in WebUI Shared because its quick and its the one chan…
Phil-NHS Aug 11, 2025
5505e8d
TD-5888 Just adding middleware for completeness
Phil-NHS Aug 12, 2025
1217fba
TD-5888 implementing some PR renaming publicconfig
Phil-NHS Aug 13, 2025
15f02cf
Merge pull request #1314 from TechnologyEnhancedLearning/Develop/Feat…
Phil-NHS Aug 13, 2025
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
@@ -1,9 +1,15 @@
namespace LearningHub.Nhs.WebUI.Configuration
namespace LearningHub.Nhs.Shared.Configuration
{
using LearningHub.Nhs.Shared.Interfaces.Configuration;
/// <summary>
/// Defines the <see cref="FindwiseSettings" />.
/// Represents a public-facing set of configuration values for Findwise search,
/// intended to be safely exposed to client-side applications or public APIs.
///
/// <para>
/// Contains only non-sensitive data such as page sizes for various search types.
/// </para>
/// </summary>
public class FindwiseSettings
public class FindwiseSettingsPublic : IFindwiseSettingsPublic
{
/// <summary>
/// Gets or sets the ResourceSearchPageSize.
Expand Down
31 changes: 31 additions & 0 deletions LearningHub.Nhs.Shared/Configuration/PublicSettings.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
namespace LearningHub.Nhs.Shared.Configuration
{
using LearningHub.Nhs.Shared.Interfaces.Configuration;
/// <summary>
/// Represents configuration values that are safe to expose to clientside frontend applications
/// (such as Blazor WebAssembly) or public-facing APIs.
///
/// <para>
/// Implements <see cref="IPublicSettings"/> and contains only non-sensitive, non-secret
/// values such as public API endpoints and pagination settings. This separation ensures
/// that secure or private configuration data is not inadvertently exposed to clients.
/// </para>
/// </summary>
public class PublicSettings : IPublicSettings
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If Settings was broken up into more classes/objs in the appsettings we could inject just the bits we are using, -> least knowledge and interface segregation. But I expect there would be alot involved in doing this so I am expect appsetting will stay the same and we will inject PublicSettings and have PublicX per obj, (public may be the wrong word choice).

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@binon Do you agree with this approach?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Indeed, naming PublicSettings might be misleading if it implies exposure to external clients; it’s important to be very explicit about who “public” means in this context to avoid confusion among developers. Adapting more granular approach is better.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed, theyre not really public theyre just not secret because they get exposed so they need some naming to signify "Do not put Sensitive Information Here" or something. i couldnt think of anything better

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

agreeing with binon's opinion-it can create confusion. can we use some FrontendConfig or some other names ?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So I want a consistent word so that i can do Settings : ISettings, IPublicSettings
So that we know whenever we use settings it can provide the implementations to either. so repeating the original name of the interface with an additional word to signify a subset of it I think is frontend ... in the previous meeting it was suggested we can rely on the comments to enforce not putting sensative data where it shoudnt be. But a word that really communicates it i think would be ideal.

FrontendConfig i dont think is right because though the front end does prefer not to expose it actualy the service is being given far more scope that it wants. So frontend i dont think is right.

Config I like better if it was Settings: ISecretSettings, IConfigSettings
but i dont think we will split it like this i think we will be leaving ISettings the same and then interfacing to capture a subset of the same values, (for convenience no other reason).

Other options

Settings: ISettings, IExposableSettings <-- this is my favourate so far?
Settings : ISettings, INonSensitiveSettings
Settings : ISettings, IUnsecuredSettings

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Settings: ISettings, IExposableSettings <-- -I think we can go ahead with this naming convention

{
/// <inheritdoc/>
public string LearningHubApiUrl { get; set; }

/// <inheritdoc/>
public int ResourceSearchPageSize { get; set; }

/// <inheritdoc/>
public int CatalogueSearchPageSize { get; set; }

/// <inheritdoc/>
public int AllCatalogueSearchPageSize { get; set; }

/// <inheritdoc/>
public IFindwiseSettingsPublic FindwiseSettings { get; set; }
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
namespace LearningHub.Nhs.WebUI.Helpers
namespace LearningHub.Nhs.Shared.Helpers
{
using LearningHub.Nhs.Models.Enums;
using Microsoft.AspNetCore.Mvc.Rendering;
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If we are not using this, it is only for comments here, i think we shouldnt include it. Or use System.X libraries so we don't pull through unneeded dependencies which arn't support in blazor for example, but generally more generic, more framework-neutral options are better for compatibility.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@AnjuJose011 I would like a meeting about this i think there isnt enough seperation we have infastructure and presentation concerns in models etc the shared project i think needs to be agnostic, no aspnetcore.asp

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agree

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Phil-NHS this is what discussed in today's meeting and seems a real blocker .you can please create a subtask and add more details in that ticket


/// <summary>
/// Defines the <see cref="ResourceAccessLevelHelper" />.
Expand All @@ -11,7 +10,7 @@ public static class ResourceAccessLevelHelper
/// <summary>
/// Get resource access level text.
/// </summary>
/// <param name="resourceAccessibilityEnum">The htmlhelper<see cref="IHtmlHelper"/>.</param>
/// <param name="resourceAccessibilityEnum">The enum value to get display text for.</param>
/// <returns>The <see cref="string"/>.</returns>
public static string GetResourceAccessLevelText(this ResourceAccessibilityEnum resourceAccessibilityEnum)
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
namespace LearningHub.Nhs.WebUI.Helpers;
namespace LearningHub.Nhs.Shared.Helpers;

/// <summary>
/// Represents the types of resources available in Moodle.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
namespace LearningHub.Nhs.WebUI.Helpers
namespace LearningHub.Nhs.Shared.Helpers
{
using System.Collections.Generic;
using LearningHub.Nhs.Models.Enums;
Expand Down
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

please correct the name space

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do you mean because we wont be moving it in the scope of this release or that utility helper wouldnt be shared at the top level?

Copy link
Contributor

@AnjuJose011 AnjuJose011 Aug 12, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Apologies, in your local branch, the namespace for the utility helper class is currently: namespace LearningHub.Nhs.WebUI.Helpers However, it should be namespace LearningHub.Nhs.Shared.Helpers ?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah yes good catch! (didnt see it in chat part of pr but clear in the code bit :) )

Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
using HtmlAgilityPack;
using LearningHub.Nhs.Models.Enums;
using LearningHub.Nhs.Models.Hierarchy;
using LearningHub.Nhs.Shared.Helpers;
using Microsoft.AspNetCore.Mvc.Rendering;

/// <summary>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
namespace LearningHub.Nhs.Shared.Interfaces.Configuration
{
/// <summary>
/// Represents configuration values related to Findwise search that are safe to expose
/// to client-side applications or public-facing APIs.
///
/// <para>
/// This includes non-sensitive values such as page sizes for different types of search results.
/// It does not contain any secure credentials or internal service configuration.
/// </para>
/// </summary>
public interface IFindwiseSettingsPublic
{
/// <summary>
/// Gets or sets the page size for resource search results.
/// </summary>
public int ResourceSearchPageSize { get; set; }

/// <summary>
/// Gets or sets the CatalogueSearchPageSize.
/// </summary>
public int CatalogueSearchPageSize { get; set; }

/// <summary>
/// Gets or sets the AllCatalogueSearchPageSize.
/// </summary>
public int AllCatalogueSearchPageSize { get; set; }
}
}
28 changes: 28 additions & 0 deletions LearningHub.Nhs.Shared/Interfaces/Configuration/IPublicSettings.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
namespace LearningHub.Nhs.Shared.Interfaces.Configuration
{
/// <summary>
/// Defines a contract for configuration data that is non-sensitive and safe to expose publicly
///
/// <para>
/// This interface exposes only data that is safe to be publicly consumed or shared,
/// such as API endpoint URLs or non-sensitive configuration values.
/// It explicitly excludes any private or sensitive information (e.g., authentication tokens,
/// credentials, or secret keys), which should be handled via separate interfaces or services.
/// </para>
///
/// <para>
/// The data provided by this interface can be safely used in frontend technologies,
/// such as Blazor WebAssembly, JavaScript frameworks, or other client-side applications,
/// without risking exposure of sensitive information.
/// </para>
/// </summary>
public interface IPublicSettings
{
/// <summary>
/// Gets or sets the LearningHubApiUrl.
/// </summary>
public string LearningHubApiUrl { get; set; }

public IFindwiseSettingsPublic FindwiseSettings { get; set; }
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is so we map the reduced FindwiseSettings and get just what we have defined as safe. My preference would be not putting PublicSettings into SearchService but inject two separate interface with just the information it needs. this may not be correct.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@binon do you think this is okay, i would continue this naming with everything, do you think its okay?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Injecting two separate interfaces with only the needed information is more in line with the Interface Segregation Principle and results in better encapsulation. I am not sure how many more interfaces we need to add. So be mindful that injecting many small interfaces can also increase complexity in dependency management, so it’s important to find a balance.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

However, bundling multiple settings interfaces (like FindwiseSettings inside IPublicSettings) into a single larger interface can lead to unnecessary coupling — it forces consumers to depend on more than they actually need.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Everywhere we inject settings, i think we should inject just the setting group we need ... e.g. findwise, if that means injecting findwise and apiGroupEg then thats fine. So more grouping of appsettings would be great but i am not going to push for it because i know its disruptive. but what will need to happen is for every group there is then a public interface should be created (as needed) because why inject what we dont need, and the private stuff should only be needed in specific places anyway.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

looked at this again this is mirroring the existing settings class. which is why it has the nested interface. So this is to mirror current implementation. So agreed but this is the context behind why it is as it is.

However, bundling multiple settings interfaces (like FindwiseSettings inside IPublicSettings) into a single larger interface can lead to unnecessary coupling — it forces consumers to depend on more than they actually need.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we can rename the public setting class name to avoid confusion. agreeing here with binon- bundling multiple settings interfaces can lead to unnecessary coupling and also can increase the complexity .in the current implementation we are using a setting class(Setting.cs) that contains all related nested classes(findwisesetting.cs)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i didnt introduce the findwisesettings

Copy link
Contributor

@AnjuJose011 AnjuJose011 Aug 12, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

looked at this again this is mirroring the existing settings class. which is why it has the nested interface. So this is to mirror current implementation. So agreed but this is the context behind why it is as it is.

-answering to this comment from your end -findwisesettings is the current setting class file we are using in Leraning Hub .interfaces you have created looks good .but i have the same opinion here with binon regarding coupling .

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree i dont know what to do about things like this though in term of them being concidered for tasks. let me pm you coz there are few thing i think could be considered but they are not to do with the pr.

}
}
18 changes: 18 additions & 0 deletions LearningHub.Nhs.Shared/Interfaces/Http/IAPIHttpClient.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
namespace LearningHub.Nhs.Shared.Interfaces.Http
{
/// <summary>
/// Represents an HTTP client for a specific API.
/// </summary>
public interface IAPIHttpClient
{
/// <summary>
/// Gets the configured <see cref="HttpClient"/> for the API.
/// </summary>
Task<HttpClient> GetClientAsync();

/// <summary>
/// Gets the base URL of the API.
/// </summary>
string ApiUrl { get; }
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Other versions of this functionality in other project dont have APIUrl this comes from the baseHttpClient

}
}
22 changes: 22 additions & 0 deletions LearningHub.Nhs.Shared/Interfaces/Http/ILearningHubHttpClient.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
namespace LearningHub.Nhs.Shared.Interfaces.Http
{
/// <summary>
/// Marker interface for the LearningHub API HttpClient.
///
/// <para>
/// Inherits from <see cref="IAPIHttpClient"/> to enable
/// dependency injection of a specific implementation configured with
/// different API endpoints or settings specific to LH API.
/// </para>
///
/// <para>
/// Currently, this interface is empty and used solely to differentiate implementations
/// that connect to different endpoints via configuration, but it may be extended in the future
/// with LearningHub-specific functionality or properties.
/// </para>
/// </summary>
public interface ILearningHubHttpClient : IAPIHttpClient
{

}
}
28 changes: 28 additions & 0 deletions LearningHub.Nhs.Shared/Interfaces/Http/IOpenAPIHttpClient.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LearningHub.Nhs.Shared.Interfaces.Http
{
/// <summary>
/// Marker interface for the IOpenAPIHttpClient API HttpClient.
///
/// <para>
/// Inherits from <see cref="IAPIHttpClient"/> to enable
/// dependency injection of a specific implementation configured with
/// a openapi-related API endpoint or settings.
/// </para>
///
/// <para>
/// This interface is currently empty and used solely to differentiate
/// implementations that connect to different endpoints via configuration.
/// It may be extended in the future with user-specific functionality or properties.
/// </para>
/// </summary>
public interface IOpenApiHttpClient : IAPIHttpClient
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The introduction of marker interface is so we can standardised the apis. This allows the blazor client and other projects share them and implement them differently. However another facade has been introduced, for openapi, during these tasks being created. it is probably worth at this point whether we should (i think so) we standardised and define the apis, and interfaces and how they are hit. or if its all already thought through share the outcome.

{

}
}
22 changes: 22 additions & 0 deletions LearningHub.Nhs.Shared/Interfaces/Http/IUserAPIHttpClient.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
namespace LearningHub.Nhs.Shared.Interfaces.Http
{
/// <summary>
/// Marker interface for the User API HttpClient.
///
/// <para>
/// Inherits from <see cref="IAPIHttpClient"/> to enable
/// dependency injection of a specific implementation configured with
/// a user-related API endpoint or settings.
/// </para>
///
/// <para>
/// This interface is currently empty and used solely to differentiate
/// implementations that connect to different endpoints via configuration.
/// It may be extended in the future with user-specific functionality or properties.
/// </para>
/// </summary>
public interface IUserApiHttpClient : IAPIHttpClient
{

}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
namespace LearningHub.Nhs.WebUI.Interfaces
namespace LearningHub.Nhs.Shared.Interfaces.Services
{
using System.Collections.Generic;
using System.Threading.Tasks;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
namespace LearningHub.Nhs.WebUI.Interfaces
namespace LearningHub.Nhs.Shared.Interfaces.Services
{
using LearningHub.Nhs.Shared.Models.Search;
using LearningHub.Nhs.Models.Search.SearchClick;
using System.Security.Principal;
using System.Threading.Tasks;
using LearningHub.Nhs.Models.Search;
using LearningHub.Nhs.Models.Search.SearchClick;
using LearningHub.Nhs.WebUI.Models.Search;

/// <summary>
/// Defines the <see cref="ISearchService" />.
Expand Down
19 changes: 19 additions & 0 deletions LearningHub.Nhs.Shared/LearningHub.Nhs.Shared.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="LearningHub.Nhs.Caching" Version="2.0.0" />
<PackageReference Include="LearningHub.Nhs.Models" Version="3.0.48" />
</ItemGroup>

<ItemGroup>
<Folder Include="Models\Contribute\" />
<Folder Include="Models\Paging\" />
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
namespace LearningHub.Nhs.WebUI.Models
namespace LearningHub.Nhs.Shared.Models.Search
{
using LearningHub.Nhs.Models.Search;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
namespace LearningHub.Nhs.WebUI.Models.Search
namespace LearningHub.Nhs.Shared.Models.Search
{
/// <summary>
/// Defines the SearchFormActionTypeEnum.
Expand Down
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can we remove ////qqq comment from here or can you please add a meaningful message?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yep good catch its because its not going into production. but this is a mistake you may see again if i dont tidy up after myself its how i rememember to comeback to things. here is it is there to mark the breaking library.

Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
namespace LearningHub.Nhs.WebUI.Models.Search
namespace LearningHub.Nhs.Shared.Models.Search
{
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc;//qqqq

/// <summary>
/// Defines the <see cref="SearchRequestViewModel" />.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
namespace LearningHub.Nhs.WebUI.Models.Search
namespace LearningHub.Nhs.Shared.Models.Search
{
using LearningHub.Nhs.Models.Paging;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
namespace LearningHub.Nhs.WebUI.Models.Search
namespace LearningHub.Nhs.Shared.Models.Search
{
using System;
using LearningHub.Nhs.Models.Paging;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace LearningHub.Nhs.WebUI.Services
namespace LearningHub.Nhs.Shared.Services
{
using LearningHub.Nhs.WebUI.Interfaces;
using LearningHub.Nhs.Shared.Interfaces.Http;
using Microsoft.Extensions.Logging;

/// <summary>
Expand Down Expand Up @@ -37,6 +37,20 @@ protected BaseService(ILearningHubHttpClient learningHubHttpClient, IOpenApiHttp
this.logger = logger;
}



/// <summary>
/// Initializes a new instance of the <see cref="BaseService{T}"/> class.
/// </summary>
/// <param name="openApiHttpClient">The openApiHttpClient<see cref="IOpenApiHttpClient"/>.</param>
/// <param name="logger">The logger<see cref="ILogger{T}"/>.</param>
protected BaseService(IOpenApiHttpClient openApiHttpClient, ILogger<T> logger)
{
this.openApiHttpClient = openApiHttpClient;
this.logger = logger;
}


/// <summary>
/// Gets the LearningHubHttpClient.
/// </summary>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
namespace LearningHub.Nhs.WebUI.Services
namespace LearningHub.Nhs.Shared.Services
{
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using LearningHub.Nhs.Caching;
using LearningHub.Nhs.Models.Provider;
using LearningHub.Nhs.WebUI.Interfaces;
using LearningHub.Nhs.Shared.Interfaces.Http;
using LearningHub.Nhs.Shared.Interfaces.Services;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;

Expand Down
Loading
Loading