diff --git a/.github/workflows/continuous-integration-workflow.yml b/.github/workflows/continuous-integration-workflow.yml
index f1609bb44..94fca85b0 100644
--- a/.github/workflows/continuous-integration-workflow.yml
+++ b/.github/workflows/continuous-integration-workflow.yml
@@ -9,99 +9,38 @@ jobs:
runs-on: windows-latest
steps:
- uses: actions/checkout@v3
-
- - name: Modify web.config files in all apps
- shell: pwsh
- run: |
- $webConfigPaths = @(
- "${{ github.workspace }}\AdminUI\LearningHub.Nhs.AdminUI\web.config",
- "${{ github.workspace }}\WebAPI\LearningHub.Nhs.Api\web.config",
- "${{ github.workspace }}\LearningHub.Nhs.WebUI\web.config"
- )
-
- foreach ($path in $webConfigPaths) {
- if (Test-Path $path) {
- Write-Host "Modifying $path"
- [xml]$config = Get-Content $path
-
- if (-not $config.configuration.'system.webServer') {
- $systemWebServer = $config.CreateElement("system.webServer")
- $config.configuration.AppendChild($systemWebServer) | Out-Null
- } else {
- $systemWebServer = $config.configuration.'system.webServer'
- }
-
- if (-not $systemWebServer.httpProtocol) {
- $httpProtocol = $config.CreateElement("httpProtocol")
- $systemWebServer.AppendChild($httpProtocol) | Out-Null
- } else {
- $httpProtocol = $systemWebServer.httpProtocol
- }
-
- if (-not $httpProtocol.customHeaders) {
- $customHeaders = $config.CreateElement("customHeaders")
- $httpProtocol.AppendChild($customHeaders) | Out-Null
- } else {
- $customHeaders = $httpProtocol.customHeaders
- }
-
- foreach ($name in @("X-Powered-By", "Server")) {
- $removeNode = $config.CreateElement("remove")
- $removeNode.SetAttribute("name", $name)
- $customHeaders.AppendChild($removeNode) | Out-Null
- }
-
- if (-not $systemWebServer.security) {
- $security = $config.CreateElement("security")
- $systemWebServer.AppendChild($security) | Out-Null
- } else {
- $security = $systemWebServer.security
- }
-
- if (-not $security.requestFiltering) {
- $requestFiltering = $config.CreateElement("requestFiltering")
- $requestFiltering.SetAttribute("removeServerHeader", "true")
- $security.AppendChild($requestFiltering) | Out-Null
- }
-
- $config.Save($path)
- } else {
- Write-Host "File not found: $path"
- }
- }
-
+
- name: Setup .NET Core SDK 8.0
uses: actions/setup-dotnet@v3
with:
dotnet-version: 8.0.x
- name: Add Azure artifact
- run: dotnet nuget add source 'https://pkgs.dev.azure.com/e-LfH/_packaging/LearningHubFeed/nuget/v3/index.json' --name 'LearningHubFeed' --username 'kevin.whittaker' --password ${{ secrets.AZURE_DEVOPS_PAT }} --store-password-in-clear-text
+ run: |
+ dotnet nuget remove source LearningHubFeed || true
+ dotnet nuget add source 'https://pkgs.dev.azure.com/e-LfH/_packaging/LearningHubFeed/nuget/v3/index.json' --name 'LearningHubFeed' --username 'kevin.whittaker' --password ${{ secrets.AZURE_DEVOPS_PAT }} --store-password-in-clear-text
- - name: Use Node 20 with Yarn
+ - name: Use Node 14
uses: actions/setup-node@v4
with:
- node-version: '20'
- cache: 'npm'
-
- - name: Upgrade npm to the latest version
- run: npm install -g npm@6.14.8
+ node-version: '14'
+ cache: 'npm'
- - name: Typescript install WebUI
- run: yarn install --network-timeout 600000 --frozen-lockfile
+ - name: npm install WebUI
+ run: npm install
working-directory: ./LearningHub.Nhs.WebUI
-
- - name: Typescript build WebUI
- run: yarn build:webpack
+
+ - name: npm build WebUI
+ run: npm run build:webpack
working-directory: ./LearningHub.Nhs.WebUI
- - name: Typescript install AdminUI
- run: yarn install
+ - name: npm install AdminUI
+ run: npm install
working-directory: ./AdminUI/LearningHub.Nhs.AdminUI
-
- - name: Typescript build AdminUI
- run: yarn build:webpack
- working-directory: ./AdminUI/LearningHub.Nhs.AdminUI
+
+ - name: npm build AdminUI
+ run: npm run build:webpack
+ working-directory: ./AdminUI/LearningHub.Nhs.AdminUI
- name: Setup MSBuild
uses: microsoft/setup-msbuild@v1.0.3
@@ -181,5 +120,4 @@ jobs:
}
# - name: Test
- # run: dotnet test ${{ env.BuildParameters.TestProjects }}
-
+ # run: dotnet test ${{ env.BuildParameters.TestProjects }}
diff --git a/.gitignore b/.gitignore
index fcd06e014..8cc7d8bbe 100644
--- a/.gitignore
+++ b/.gitignore
@@ -53,3 +53,6 @@ obj
/AdminUI/LearningHub.Nhs.AdminUI/LearningHub.Nhs.AdminUI.csproj.user
/WebAPI/LearningHub.Nhs.API/LearningHub.Nhs.Api.csproj.user
/ReportAPI/LearningHub.Nhs.ReportApi/web.config
+/AdminUI/LearningHub.Nhs.AdminUI/web.config
+/LearningHub.Nhs.WebUI/web.config
+/WebAPI/LearningHub.Nhs.API/web.config
diff --git a/AdminUI/LearningHub.Nhs.AdminUI/LearningHub.Nhs.AdminUI.csproj b/AdminUI/LearningHub.Nhs.AdminUI/LearningHub.Nhs.AdminUI.csproj
index eba6b6ffa..a0de54f8f 100644
--- a/AdminUI/LearningHub.Nhs.AdminUI/LearningHub.Nhs.AdminUI.csproj
+++ b/AdminUI/LearningHub.Nhs.AdminUI/LearningHub.Nhs.AdminUI.csproj
@@ -1,16 +1,16 @@
-
+
-
- net8.0
- 1.0.0.0
- 1.0.0.0
- 1.0.0
- 31abd8b9-4223-4ff3-896b-a46530c9e15c
- /subscriptions/57c55d5f-78c1-4373-a021-ff8357548f51/resourceGroups/LearningHubNhsUk-AdminUI-Prod-RG/providers/microsoft.insights/components/LearningHubNhsUk-AdminUI-Prod
- true
- true
- x64
-
+
+ net8.0
+ 1.0.0.0
+ 1.0.0.0
+ 1.0.0
+ 31abd8b9-4223-4ff3-896b-a46530c9e15c
+ /subscriptions/57c55d5f-78c1-4373-a021-ff8357548f51/resourceGroups/LearningHubNhsUk-AdminUI-Prod-RG/providers/microsoft.insights/components/LearningHubNhsUk-AdminUI-Prod
+ true
+ true
+ x64
+
diff --git a/AdminUI/LearningHub.Nhs.AdminUI/web.config b/AdminUI/LearningHub.Nhs.AdminUI/web.config
deleted file mode 100644
index 6bcb74972..000000000
--- a/AdminUI/LearningHub.Nhs.AdminUI/web.config
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/Directory.Build.props b/Directory.Build.props
index 709a8ce13..c3a7f4e28 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -4,7 +4,7 @@
$(SolutionDir)StyleCop.ruleset
-
+
\ No newline at end of file
diff --git a/Directory.Packages.props b/Directory.Packages.props
new file mode 100644
index 000000000..59413f8ea
--- /dev/null
+++ b/Directory.Packages.props
@@ -0,0 +1,93 @@
+
+
+
+
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/LearningHub.Nhs.WebUI.AutomatedUiTests/LearningHub.Nhs.WebUI.AutomatedUiTests.csproj b/LearningHub.Nhs.WebUI.AutomatedUiTests/LearningHub.Nhs.WebUI.AutomatedUiTests.csproj
index d6bf3cd0d..1569f9734 100644
--- a/LearningHub.Nhs.WebUI.AutomatedUiTests/LearningHub.Nhs.WebUI.AutomatedUiTests.csproj
+++ b/LearningHub.Nhs.WebUI.AutomatedUiTests/LearningHub.Nhs.WebUI.AutomatedUiTests.csproj
@@ -1,37 +1,37 @@
-
+
-
- net8.0
- enable
- enable
+
+ net8.0
+ enable
+ enable
- false
+ false
- True
-
+ True
+
-
-
-
-
-
-
-
-
-
-
-
- runtime; build; native; contentfiles; analyzers; buildtransitive
- all
-
-
- runtime; build; native; contentfiles; analyzers; buildtransitive
- all
-
-
+
+
+
+
+
+
+
+
+
+
+
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+ all
+
+
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+ all
+
+
-
-
-
+
+
+
diff --git a/LearningHub.Nhs.WebUI.sln b/LearningHub.Nhs.WebUI.sln
index 5aea6885f..55cce01f0 100644
--- a/LearningHub.Nhs.WebUI.sln
+++ b/LearningHub.Nhs.WebUI.sln
@@ -8,6 +8,7 @@ EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{B5D48B6A-D4A7-494E-89C0-64428232D242}"
ProjectSection(SolutionItems) = preProject
Directory.Build.props = Directory.Build.props
+ Directory.Packages.props = Directory.Packages.props
StyleCop.ruleset = StyleCop.ruleset
EndProjectSection
EndProject
diff --git a/LearningHub.Nhs.WebUI/Controllers/Api/UserController.cs b/LearningHub.Nhs.WebUI/Controllers/Api/UserController.cs
index 35294cc11..1f5330bbe 100644
--- a/LearningHub.Nhs.WebUI/Controllers/Api/UserController.cs
+++ b/LearningHub.Nhs.WebUI/Controllers/Api/UserController.cs
@@ -102,13 +102,13 @@ public async Task CheckUserRole()
///
/// to check user password is correct.
///
- /// The currentPassword.
+ /// The currentPassword.
/// The .
- [HttpGet]
- [Route("ConfirmPassword/{currentPassword}")]
- public async Task ConfirmPassword(string currentPassword)
+ [HttpPost]
+ [Route("ConfirmPassword")]
+ public async Task ConfirmPassword([FromBody] PasswordUpdateModel password)
{
- string passwordHash = this.userService.Base64MD5HashDigest(currentPassword);
+ string passwordHash = this.userService.Base64MD5HashDigest(password.PasswordHash);
var userPersonalDetails = await this.userService.GetCurrentUserPersonalDetailsAsync();
if (userPersonalDetails != null && userPersonalDetails.PasswordHash == passwordHash)
{
diff --git a/LearningHub.Nhs.WebUI/Controllers/HomeController.cs b/LearningHub.Nhs.WebUI/Controllers/HomeController.cs
index 7f40afe15..6d578a339 100644
--- a/LearningHub.Nhs.WebUI/Controllers/HomeController.cs
+++ b/LearningHub.Nhs.WebUI/Controllers/HomeController.cs
@@ -40,6 +40,7 @@ public class HomeController : BaseController
private readonly IDashboardService dashboardService;
private readonly IContentService contentService;
private readonly IFeatureManager featureManager;
+ private readonly IUserGroupService userGroupService;
private readonly Microsoft.Extensions.Configuration.IConfiguration configuration;
///
@@ -55,6 +56,7 @@ public class HomeController : BaseController
/// Dashboard service.
/// Content service.
/// featureManager.
+ /// userGroupService.
/// config.
public HomeController(
IHttpClientFactory httpClientFactory,
@@ -67,6 +69,7 @@ public HomeController(
IDashboardService dashboardService,
IContentService contentService,
IFeatureManager featureManager,
+ IUserGroupService userGroupService,
Microsoft.Extensions.Configuration.IConfiguration configuration)
: base(hostingEnvironment, httpClientFactory, logger, settings.Value)
{
@@ -76,6 +79,7 @@ public HomeController(
this.dashboardService = dashboardService;
this.contentService = contentService;
this.featureManager = featureManager;
+ this.userGroupService = userGroupService;
this.configuration = configuration;
}
@@ -212,6 +216,7 @@ public async Task Index(string myLearningDashboard = "my-in-progr
var learningTask = this.dashboardService.GetMyAccessLearningsAsync(myLearningDashboard, 1);
var resourcesTask = this.dashboardService.GetResourcesAsync(resourceDashboard, 1);
var cataloguesTask = this.dashboardService.GetCataloguesAsync(catalogueDashboard, 1);
+ var userGroupsTask = this.userGroupService.UserHasCatalogueContributionPermission();
var enrolledCoursesTask = Task.FromResult(new List());
var enableMoodle = Task.Run(() => this.featureManager.IsEnabledAsync(FeatureFlags.EnableMoodle)).Result;
@@ -222,7 +227,7 @@ public async Task Index(string myLearningDashboard = "my-in-progr
enrolledCoursesTask = this.dashboardService.GetEnrolledCoursesFromMoodleAsync(this.CurrentMoodleUserId, 1);
}
- await Task.WhenAll(learningTask, resourcesTask, cataloguesTask);
+ await Task.WhenAll(learningTask, resourcesTask, cataloguesTask, userGroupsTask);
var model = new DashboardViewModel()
{
@@ -231,7 +236,8 @@ public async Task Index(string myLearningDashboard = "my-in-progr
Catalogues = await cataloguesTask,
EnrolledCourses = await enrolledCoursesTask,
};
-
+ var userHasContributePermission = await userGroupsTask;
+ this.ViewBag.userHasContributePermission = userHasContributePermission;
if (!string.IsNullOrEmpty(this.Request.Query["preview"]) && Convert.ToBoolean(this.Request.Query["preview"]))
{
return this.View("LandingPage", await this.GetLandingPageContent(Convert.ToBoolean(this.Request.Query["preview"])));
@@ -274,6 +280,10 @@ public async Task LoadPage(string dashBoardTray = "my-learning",
Catalogues = new Nhs.Models.Dashboard.DashboardCatalogueResponseViewModel { Type = catalogueDashBoard },
};
+ var enableMoodle = Task.Run(() => this.featureManager.IsEnabledAsync(FeatureFlags.EnableMoodle)).Result;
+ this.ViewBag.EnableMoodle = enableMoodle;
+ this.ViewBag.ValidMoodleUser = this.CurrentMoodleUserId > 0;
+
bool isAjax = this.HttpContext.Request.Headers["X-Requested-With"] == "XMLHttpRequest";
if (isAjax)
diff --git a/LearningHub.Nhs.WebUI/Interfaces/IUserGroupService.cs b/LearningHub.Nhs.WebUI/Interfaces/IUserGroupService.cs
index a333e0c89..eadae3363 100644
--- a/LearningHub.Nhs.WebUI/Interfaces/IUserGroupService.cs
+++ b/LearningHub.Nhs.WebUI/Interfaces/IUserGroupService.cs
@@ -22,6 +22,12 @@ public interface IUserGroupService
/// The .
Task> GetRoleUserGroupDetailForUserAsync(int userId);
+ ///
+ /// The UserHasCatalogueContributionPermission.
+ ///
+ /// The .
+ Task UserHasCatalogueContributionPermission();
+
///
/// Check if user has given permission.
///
diff --git a/LearningHub.Nhs.WebUI/Scripts/vuesrc/contribute-resource/components/CatalogueSelectorAccordion.vue b/LearningHub.Nhs.WebUI/Scripts/vuesrc/contribute-resource/components/CatalogueSelectorAccordion.vue
index fcd1e60a3..e1ba6eeae 100644
--- a/LearningHub.Nhs.WebUI/Scripts/vuesrc/contribute-resource/components/CatalogueSelectorAccordion.vue
+++ b/LearningHub.Nhs.WebUI/Scripts/vuesrc/contribute-resource/components/CatalogueSelectorAccordion.vue
@@ -19,8 +19,7 @@
A catalogue is a curated set of resources that has its own web page.
- You can contribute a resource as an editor of a catalogue or in your own name.
- To contribute a resource in your own name, select Community contributions from the drop down menu.
+ You can contribute a resource as an editor of a catalogue.
You can manage all resources that you have contributed in the My contributions area.
diff --git a/LearningHub.Nhs.WebUI/Scripts/vuesrc/contribute/CatalogueSelect.vue b/LearningHub.Nhs.WebUI/Scripts/vuesrc/contribute/CatalogueSelect.vue
index 379e9572a..6d942b072 100644
--- a/LearningHub.Nhs.WebUI/Scripts/vuesrc/contribute/CatalogueSelect.vue
+++ b/LearningHub.Nhs.WebUI/Scripts/vuesrc/contribute/CatalogueSelect.vue
@@ -26,8 +26,7 @@
A catalogue is a curated set of resources that has its own web page.
- You can contribute a resource as an editor of a catalogue or in your own name.
- To contribute a resource in your own name, select Community contributions from the drop down menu.
+ You can contribute a resource as an editor of a catalogue.
You can manage all resources that you have contributed in the My contributions area.
diff --git a/LearningHub.Nhs.WebUI/Scripts/vuesrc/data/user.ts b/LearningHub.Nhs.WebUI/Scripts/vuesrc/data/user.ts
index 9f50357fc..e38fd4a08 100644
--- a/LearningHub.Nhs.WebUI/Scripts/vuesrc/data/user.ts
+++ b/LearningHub.Nhs.WebUI/Scripts/vuesrc/data/user.ts
@@ -67,15 +67,15 @@ const IsSystemAdmin = async function (): Promise {
};
const IsValidUser = async function (currentPassword: string): Promise {
- var IsValidUser = `/api/User/ConfirmPassword/${currentPassword}`;
- return await AxiosWrapper.axios.get(IsValidUser)
- .then(response => {
- return response.data;
- })
- .catch(e => {
- console.log('IsValidUser:' + e);
- throw e;
+ try {
+ const response = await AxiosWrapper.axios.post('/api/User/ConfirmPassword', {
+ PasswordHash: currentPassword
});
+ return response.data;
+ } catch (e) {
+ console.error('IsValidUser:', e);
+ throw e;
+ }
};
const getCurrentUserBasicDetails = async function (): Promise {
diff --git a/LearningHub.Nhs.WebUI/Services/AzureMediaService.cs b/LearningHub.Nhs.WebUI/Services/AzureMediaService.cs
index 6068bc067..f2877b9eb 100644
--- a/LearningHub.Nhs.WebUI/Services/AzureMediaService.cs
+++ b/LearningHub.Nhs.WebUI/Services/AzureMediaService.cs
@@ -71,7 +71,7 @@ public async Task CreateMediaInputAsset(IFormFile file)
string filename = Regex.Replace(file.FileName, "[^a-zA-Z0-9.]", string.Empty);
var destContainer = new BlobContainerClient(new Uri(uploadSasUrl));
- var destBlob = destContainer.GetBlockBlobClient(filename.IsNullOrEmpty() ? "file.txt" : filename);
+ var destBlob = destContainer.GetBlockBlobClient(string.IsNullOrEmpty(filename) ? "file.txt" : filename);
await destBlob.UploadAsync(file.OpenReadStream());
return asset.Name;
diff --git a/LearningHub.Nhs.WebUI/Services/NavigationPermissionService.cs b/LearningHub.Nhs.WebUI/Services/NavigationPermissionService.cs
index 95e74022e..e381b0403 100644
--- a/LearningHub.Nhs.WebUI/Services/NavigationPermissionService.cs
+++ b/LearningHub.Nhs.WebUI/Services/NavigationPermissionService.cs
@@ -11,14 +11,19 @@
public class NavigationPermissionService : INavigationPermissionService
{
private readonly IResourceService resourceService;
+ private readonly IUserGroupService userGroupService;
///
/// Initializes a new instance of the class.
///
/// Resource service.
- public NavigationPermissionService(IResourceService resourceService)
+ /// UserGroup service.
+ public NavigationPermissionService(
+ IResourceService resourceService,
+ IUserGroupService userGroupService)
{
this.resourceService = resourceService;
+ this.userGroupService = userGroupService;
}
///
@@ -52,7 +57,7 @@ public async Task GetNavigationModelAsync(IPrincipal user, bool
}
else if (user.IsInRole("BlueUser"))
{
- return this.AuthenticatedBlueUser(controllerName);
+ return await this.AuthenticatedBlueUser(controllerName);
}
else
{
@@ -114,11 +119,11 @@ private NavigationModel AuthenticatedAdministrator(string controllerName)
///
/// The controller name.
/// The .
- private NavigationModel AuthenticatedBlueUser(string controllerName)
+ private async Task AuthenticatedBlueUser(string controllerName)
{
return new NavigationModel()
{
- ShowMyContributions = true,
+ ShowMyContributions = await this.userGroupService.UserHasCatalogueContributionPermission(),
ShowMyLearning = true,
ShowMyBookmarks = true,
ShowSearch = controllerName != "search" && controllerName != string.Empty,
diff --git a/LearningHub.Nhs.WebUI/Services/UserGroupService.cs b/LearningHub.Nhs.WebUI/Services/UserGroupService.cs
index 6790a3143..c9b196bfc 100644
--- a/LearningHub.Nhs.WebUI/Services/UserGroupService.cs
+++ b/LearningHub.Nhs.WebUI/Services/UserGroupService.cs
@@ -5,6 +5,7 @@
using System.Linq;
using System.Threading.Tasks;
using LearningHub.Nhs.Caching;
+ using LearningHub.Nhs.Models.Enums;
using LearningHub.Nhs.Models.Extensions;
using LearningHub.Nhs.Models.User;
using LearningHub.Nhs.WebUI.Interfaces;
@@ -56,6 +57,18 @@ public async Task> GetRoleUserGroupDetailForUserAsy
return await this.cacheService.GetOrFetchAsync(cacheKey, () => this.FetchRoleUserGroupDetailForUserAsync(userId));
}
+ ///
+ public async Task UserHasCatalogueContributionPermission()
+ {
+ var userRoleGroups = await this.GetRoleUserGroupDetailAsync();
+ if (userRoleGroups != null && userRoleGroups.Any(r => r.RoleEnum == RoleEnum.Editor))
+ {
+ return true;
+ }
+
+ return false;
+ }
+
///
public async Task UserHasPermissionAsync(string permissionCode)
{
diff --git a/LearningHub.Nhs.WebUI/Views/Home/Dashboard.cshtml b/LearningHub.Nhs.WebUI/Views/Home/Dashboard.cshtml
index 4a7b55c08..e8481a4c7 100644
--- a/LearningHub.Nhs.WebUI/Views/Home/Dashboard.cshtml
+++ b/LearningHub.Nhs.WebUI/Views/Home/Dashboard.cshtml
@@ -5,7 +5,15 @@
@{
ViewData["Title"] = "Learning Hub - Home";
- var isReadOnly = User.IsInRole("ReadOnly") || User.IsInRole("BasicUser");
+ var isReadOnly = false;
+ if (User.IsInRole("ReadOnly") || User.IsInRole("BasicUser"))
+ {
+ isReadOnly = true;
+ }
+ else if (User.IsInRole("BlueUser") && !this.ViewBag.userHasContributePermission)
+ {
+ isReadOnly = true;
+ }
}
@section styles {
diff --git a/LearningHub.Nhs.WebUI/web.config b/LearningHub.Nhs.WebUI/web.config
deleted file mode 100644
index 837247997..000000000
--- a/LearningHub.Nhs.WebUI/web.config
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/OpenAPI/LearningHub.Nhs.OpenApi.Models/LearningHub.Nhs.OpenApi.Models.csproj b/OpenAPI/LearningHub.Nhs.OpenApi.Models/LearningHub.Nhs.OpenApi.Models.csproj
index f34790d51..727560e3f 100644
--- a/OpenAPI/LearningHub.Nhs.OpenApi.Models/LearningHub.Nhs.OpenApi.Models.csproj
+++ b/OpenAPI/LearningHub.Nhs.OpenApi.Models/LearningHub.Nhs.OpenApi.Models.csproj
@@ -1,23 +1,23 @@
-
- net8.0
- true
- enable
+
+ net8.0
+ true
+ enable
x64
-
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
-
+
+
+
+
diff --git a/OpenAPI/LearningHub.Nhs.OpenApi.Repositories.Interface/LearningHub.Nhs.OpenApi.Repositories.Interface.csproj b/OpenAPI/LearningHub.Nhs.OpenApi.Repositories.Interface/LearningHub.Nhs.OpenApi.Repositories.Interface.csproj
index 3444f18a2..cbab74f45 100644
--- a/OpenAPI/LearningHub.Nhs.OpenApi.Repositories.Interface/LearningHub.Nhs.OpenApi.Repositories.Interface.csproj
+++ b/OpenAPI/LearningHub.Nhs.OpenApi.Repositories.Interface/LearningHub.Nhs.OpenApi.Repositories.Interface.csproj
@@ -1,27 +1,27 @@
-
- net8.0
- LearningHub.Nhs.OpenApi.Repositories.Interface
- enable
- true
+
+ net8.0
+ LearningHub.Nhs.OpenApi.Repositories.Interface
+ enable
+ true
x64
-
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
diff --git a/OpenAPI/LearningHub.Nhs.OpenApi.Repositories/LearningHub.Nhs.OpenApi.Repositories.csproj b/OpenAPI/LearningHub.Nhs.OpenApi.Repositories/LearningHub.Nhs.OpenApi.Repositories.csproj
index b26c815cd..009e83ef8 100644
--- a/OpenAPI/LearningHub.Nhs.OpenApi.Repositories/LearningHub.Nhs.OpenApi.Repositories.csproj
+++ b/OpenAPI/LearningHub.Nhs.OpenApi.Repositories/LearningHub.Nhs.OpenApi.Repositories.csproj
@@ -1,33 +1,33 @@
-
+
-
- net8.0
- LearningHub.Nhs.OpenApi.Repositories
- enable
- true
+
+ net8.0
+ LearningHub.Nhs.OpenApi.Repositories
+ enable
+ true
x64
-
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
diff --git a/OpenAPI/LearningHub.Nhs.OpenApi.Services.Interface/LearningHub.Nhs.OpenApi.Services.Interface.csproj b/OpenAPI/LearningHub.Nhs.OpenApi.Services.Interface/LearningHub.Nhs.OpenApi.Services.Interface.csproj
index 20b3a1c06..aa019e18c 100644
--- a/OpenAPI/LearningHub.Nhs.OpenApi.Services.Interface/LearningHub.Nhs.OpenApi.Services.Interface.csproj
+++ b/OpenAPI/LearningHub.Nhs.OpenApi.Services.Interface/LearningHub.Nhs.OpenApi.Services.Interface.csproj
@@ -1,27 +1,27 @@
-
- net8.0
- enable
- true
+
+ net8.0
+ enable
+ true
x64
-
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
-
+
+
+
+
-
-
-
+
+
+
diff --git a/OpenAPI/LearningHub.Nhs.OpenApi.Services.Interface/Services/IUserGroupService.cs b/OpenAPI/LearningHub.Nhs.OpenApi.Services.Interface/Services/IUserGroupService.cs
new file mode 100644
index 000000000..bd2f4e920
--- /dev/null
+++ b/OpenAPI/LearningHub.Nhs.OpenApi.Services.Interface/Services/IUserGroupService.cs
@@ -0,0 +1,16 @@
+namespace LearningHub.Nhs.OpenApi.Services.Interface.Services
+{
+ using System.Threading.Tasks;
+
+ ///
+ /// The UserGroupService interface.
+ ///
+ public interface IUserGroupService
+ {
+ ///
+ /// The GetRoleUserGroupDetailAsync.
+ ///
+ /// The .
+ Task UserHasCatalogueContributionPermission(int userId);
+ }
+}
diff --git a/OpenAPI/LearningHub.Nhs.OpenApi.Services/LearningHub.Nhs.OpenApi.Services.csproj b/OpenAPI/LearningHub.Nhs.OpenApi.Services/LearningHub.Nhs.OpenApi.Services.csproj
index f84d5121c..9002a0237 100644
--- a/OpenAPI/LearningHub.Nhs.OpenApi.Services/LearningHub.Nhs.OpenApi.Services.csproj
+++ b/OpenAPI/LearningHub.Nhs.OpenApi.Services/LearningHub.Nhs.OpenApi.Services.csproj
@@ -1,41 +1,41 @@
-
+
-
- net8.0
- LearningHub.Nhs.OpenApi.Services
- enable
- true
+
+ net8.0
+ LearningHub.Nhs.OpenApi.Services
+ enable
+ true
x64
-
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
-
-
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenAPI/LearningHub.Nhs.OpenApi.Services/Services/NavigationPermissionService.cs b/OpenAPI/LearningHub.Nhs.OpenApi.Services/Services/NavigationPermissionService.cs
index 76e66812f..e0bef0a1d 100644
--- a/OpenAPI/LearningHub.Nhs.OpenApi.Services/Services/NavigationPermissionService.cs
+++ b/OpenAPI/LearningHub.Nhs.OpenApi.Services/Services/NavigationPermissionService.cs
@@ -12,14 +12,17 @@
public class NavigationPermissionService : INavigationPermissionService
{
private readonly IResourceService resourceService;
+ private readonly IUserGroupService userGroupService;
///
/// Initializes a new instance of the class.
///
/// Resource service.
- public NavigationPermissionService(IResourceService resourceService)
+ /// userGroup service.
+ public NavigationPermissionService(IResourceService resourceService, IUserGroupService userGroupService)
{
this.resourceService = resourceService;
+ this.userGroupService = userGroupService;
}
///
@@ -53,7 +56,7 @@ public async Task GetNavigationModelAsync(IPrincipal user, bool
}
else if (user.IsInRole("BlueUser"))
{
- return AuthenticatedBlueUser(controllerName);
+ return await AuthenticatedBlueUser(controllerName, user.Identity.GetCurrentUserId());
}
else
{
@@ -114,12 +117,13 @@ private NavigationModel AuthenticatedAdministrator(string controllerName)
/// The AuthenticatedBlueUser.
///
/// The controller name.
+ /// The userId.
/// The .
- private NavigationModel AuthenticatedBlueUser(string controllerName)
+ private async Task AuthenticatedBlueUser(string controllerName, int userId)
{
return new NavigationModel()
{
- ShowMyContributions = true,
+ ShowMyContributions = await this.userGroupService.UserHasCatalogueContributionPermission(userId),
ShowMyLearning = true,
ShowMyBookmarks = true,
ShowSearch = controllerName != "search" && controllerName != string.Empty,
diff --git a/OpenAPI/LearningHub.Nhs.OpenApi.Services/Services/UserGroupService.cs b/OpenAPI/LearningHub.Nhs.OpenApi.Services/Services/UserGroupService.cs
new file mode 100644
index 000000000..205494eca
--- /dev/null
+++ b/OpenAPI/LearningHub.Nhs.OpenApi.Services/Services/UserGroupService.cs
@@ -0,0 +1,45 @@
+namespace LearningHub.Nhs.OpenApi.Services.Services
+{
+ using System.Collections.Generic;
+ using System.Linq;
+ using System.Threading.Tasks;
+ using LearningHub.Nhs.Caching;
+ using LearningHub.Nhs.Models.Enums;
+ using LearningHub.Nhs.Models.Extensions;
+ using LearningHub.Nhs.Models.User;
+ using LearningHub.Nhs.OpenApi.Repositories.Interface.Repositories;
+ using LearningHub.Nhs.OpenApi.Services.Interface.Services;
+ using Microsoft.AspNetCore.Http;
+
+ ///
+ /// The user group service.
+ ///
+ public class UserGroupService : IUserGroupService
+ {
+
+ private readonly IRoleUserGroupRepository roleUserGroupRepository;
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// roleUserGroupRepository.
+ public UserGroupService(IRoleUserGroupRepository roleUserGroupRepository)
+ {
+ this.roleUserGroupRepository = roleUserGroupRepository;
+ }
+
+
+ ///
+ public async Task UserHasCatalogueContributionPermission(int userId)
+ {
+ var userRoleGroups = await this.roleUserGroupRepository.GetRoleUserGroupViewModelsByUserId(userId);
+ if (userRoleGroups != null && userRoleGroups.Any(r => r.RoleEnum == RoleEnum.LocalAdmin || r.RoleEnum == RoleEnum.Editor))
+ {
+ return true;
+ }
+
+ return false;
+ }
+
+ }
+}
diff --git a/OpenAPI/LearningHub.Nhs.OpenApi.Services/Startup.cs b/OpenAPI/LearningHub.Nhs.OpenApi.Services/Startup.cs
index f620c101b..b92103a2f 100644
--- a/OpenAPI/LearningHub.Nhs.OpenApi.Services/Startup.cs
+++ b/OpenAPI/LearningHub.Nhs.OpenApi.Services/Startup.cs
@@ -31,6 +31,7 @@ public static void AddServices(this IServiceCollection services)
services.AddScoped();
services.AddScoped();
services.AddScoped();
+ services.AddScoped();
services.AddScoped();
services.AddScoped();
diff --git a/OpenAPI/LearningHub.Nhs.OpenApi.Tests/LearningHub.Nhs.OpenApi.Tests.csproj b/OpenAPI/LearningHub.Nhs.OpenApi.Tests/LearningHub.Nhs.OpenApi.Tests.csproj
index 87712e074..3efc63b33 100644
--- a/OpenAPI/LearningHub.Nhs.OpenApi.Tests/LearningHub.Nhs.OpenApi.Tests.csproj
+++ b/OpenAPI/LearningHub.Nhs.OpenApi.Tests/LearningHub.Nhs.OpenApi.Tests.csproj
@@ -1,31 +1,31 @@
-
+
-
- net8.0
- false
- enable
+
+ net8.0
+ false
+ enable
x64
-
-
-
-
-
-
-
- runtime; build; native; contentfiles; analyzers; buildtransitive
- all
-
-
- runtime; build; native; contentfiles; analyzers; buildtransitive
- all
-
-
+
+
+
+
+
+
+
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+ all
+
+
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+ all
+
+
-
-
-
+
+
+
diff --git a/OpenAPI/LearningHub.Nhs.OpenApi/Controllers/UserController.cs b/OpenAPI/LearningHub.Nhs.OpenApi/Controllers/UserController.cs
index 1fb149c79..6e5fe2591 100644
--- a/OpenAPI/LearningHub.Nhs.OpenApi/Controllers/UserController.cs
+++ b/OpenAPI/LearningHub.Nhs.OpenApi/Controllers/UserController.cs
@@ -299,7 +299,13 @@ private List> MenuItems(NavigationModel model)
},
new Dictionary
{
- { "title", "My Contributions" },
+ { "title", "My learning" },
+ { "url", this.learningHubConfig.MyLearningUrl },
+ { "visible", model.ShowMyLearning },
+ },
+ new Dictionary
+ {
+ { "title", "My contributions" },
{ "url", this.learningHubConfig.MyContributionsUrl },
{ "visible", model.ShowMyContributions },
},
diff --git a/OpenAPI/LearningHub.Nhs.OpenApi/LearningHub.NHS.OpenAPI.csproj b/OpenAPI/LearningHub.Nhs.OpenApi/LearningHub.NHS.OpenAPI.csproj
index 83639e186..dfa347ffe 100644
--- a/OpenAPI/LearningHub.Nhs.OpenApi/LearningHub.NHS.OpenAPI.csproj
+++ b/OpenAPI/LearningHub.Nhs.OpenApi/LearningHub.NHS.OpenAPI.csproj
@@ -1,44 +1,44 @@
-
- enable
- net8.0
- true
+
+ enable
+ net8.0
+ true
x64
-
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
-
-
-
-
-
- all
- runtime; build; native; contentfiles; analyzers; buildtransitive
-
-
-
-
+
+
+
+
+
+
+
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
+
+
-
-
-
-
-
-
+
+
+
+
+
+
-
-
-
+
+
+
diff --git a/OpenAPI/LearningHub.Nhs.OpenApi/appsettings.json b/OpenAPI/LearningHub.Nhs.OpenApi/appsettings.json
index 804dc13f5..6ac065c23 100644
--- a/OpenAPI/LearningHub.Nhs.OpenApi/appsettings.json
+++ b/OpenAPI/LearningHub.Nhs.OpenApi/appsettings.json
@@ -98,7 +98,7 @@
"MyRecordsUrl": "",
"NotificationsUrl": "/notification",
"RegisterUrl": "/register",
- "SignOutUrl": "",
+ "SignOutUrl": "/home/logout",
"MyAccountUrl": "/myaccount",
"BrowseCataloguesUrl": "/allcatalogue"
},
diff --git a/ReportAPI/LearningHub.Nhs.ReportApi.Services.Interface/LearningHub.Nhs.ReportApi.Services.Interface.csproj b/ReportAPI/LearningHub.Nhs.ReportApi.Services.Interface/LearningHub.Nhs.ReportApi.Services.Interface.csproj
index 0a697a51f..227e30bf8 100644
--- a/ReportAPI/LearningHub.Nhs.ReportApi.Services.Interface/LearningHub.Nhs.ReportApi.Services.Interface.csproj
+++ b/ReportAPI/LearningHub.Nhs.ReportApi.Services.Interface/LearningHub.Nhs.ReportApi.Services.Interface.csproj
@@ -1,30 +1,30 @@
-
+
-
- net8.0
- enable
- enable
-
+
+ net8.0
+ enable
+ enable
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
-
+
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
diff --git a/ReportAPI/LearningHub.Nhs.ReportApi.Services.UnitTests/LearningHub.Nhs.ReportApi.Services.UnitTests.csproj b/ReportAPI/LearningHub.Nhs.ReportApi.Services.UnitTests/LearningHub.Nhs.ReportApi.Services.UnitTests.csproj
index 50e3d7536..3af90e39a 100644
--- a/ReportAPI/LearningHub.Nhs.ReportApi.Services.UnitTests/LearningHub.Nhs.ReportApi.Services.UnitTests.csproj
+++ b/ReportAPI/LearningHub.Nhs.ReportApi.Services.UnitTests/LearningHub.Nhs.ReportApi.Services.UnitTests.csproj
@@ -1,46 +1,46 @@
-
- net8.0
- enable
- enable
-
- false
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- runtime; build; native; contentfiles; analyzers; buildtransitive
- all
-
-
- runtime; build; native; contentfiles; analyzers; buildtransitive
- all
-
-
-
-
-
-
-
-
-
-
-
-
+
+ net8.0
+ enable
+ enable
+
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+ all
+
+
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+ all
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ReportAPI/LearningHub.Nhs.ReportApi.Services/LearningHub.Nhs.ReportApi.Services.csproj b/ReportAPI/LearningHub.Nhs.ReportApi.Services/LearningHub.Nhs.ReportApi.Services.csproj
index 55c8a1be4..c6d03d856 100644
--- a/ReportAPI/LearningHub.Nhs.ReportApi.Services/LearningHub.Nhs.ReportApi.Services.csproj
+++ b/ReportAPI/LearningHub.Nhs.ReportApi.Services/LearningHub.Nhs.ReportApi.Services.csproj
@@ -1,37 +1,37 @@
-
-
-
- net8.0
- enable
- enable
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+ net8.0
+ enable
+ enable
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ReportAPI/LearningHub.Nhs.ReportApi.Shared/LearningHub.Nhs.ReportApi.Shared.csproj b/ReportAPI/LearningHub.Nhs.ReportApi.Shared/LearningHub.Nhs.ReportApi.Shared.csproj
index 2f5518784..78f41769e 100644
--- a/ReportAPI/LearningHub.Nhs.ReportApi.Shared/LearningHub.Nhs.ReportApi.Shared.csproj
+++ b/ReportAPI/LearningHub.Nhs.ReportApi.Shared/LearningHub.Nhs.ReportApi.Shared.csproj
@@ -1,27 +1,27 @@
-
+
-
- net8.0
- enable
- enable
- $(NoWarn),1573,1591,1712
- True
-
+
+ net8.0
+ enable
+ enable
+ $(NoWarn),1573,1591,1712
+ True
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
diff --git a/ReportAPI/LearningHub.Nhs.ReportApi/LearningHub.Nhs.ReportApi.csproj b/ReportAPI/LearningHub.Nhs.ReportApi/LearningHub.Nhs.ReportApi.csproj
index 583caa9f2..f87bb47d5 100644
--- a/ReportAPI/LearningHub.Nhs.ReportApi/LearningHub.Nhs.ReportApi.csproj
+++ b/ReportAPI/LearningHub.Nhs.ReportApi/LearningHub.Nhs.ReportApi.csproj
@@ -1,4 +1,4 @@
-
+
net8.0
diff --git a/WebAPI/LearningHub.Nhs.API/LearningHub.Nhs.Api.csproj b/WebAPI/LearningHub.Nhs.API/LearningHub.Nhs.Api.csproj
index 4f9bb1aa6..3b09a079f 100644
--- a/WebAPI/LearningHub.Nhs.API/LearningHub.Nhs.Api.csproj
+++ b/WebAPI/LearningHub.Nhs.API/LearningHub.Nhs.Api.csproj
@@ -1,28 +1,28 @@
-
- net8.0
- 1.0.0.0
- 1.0.0.0
- 1.0.0
- InProcess
- 234b55ad-984b-47ae-9d7a-71e372e6ded7
- true
- x64
-
+
+ net8.0
+ 1.0.0.0
+ 1.0.0.0
+ 1.0.0
+ InProcess
+ 234b55ad-984b-47ae-9d7a-71e372e6ded7
+ true
+ x64
+
-
- LearningHub.Nhs.Api.xml
-
+
+ LearningHub.Nhs.Api.xml
+
-
-
-
+
+
+
-
-
- Always
-
-
+
+
+ Always
+
+
@@ -46,19 +46,23 @@
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
-
-
-
+
+
+
-
+
+
+
+
+
diff --git a/WebAPI/LearningHub.Nhs.API/web.config b/WebAPI/LearningHub.Nhs.API/web.config
index 62efcf17d..798b63b5d 100644
--- a/WebAPI/LearningHub.Nhs.API/web.config
+++ b/WebAPI/LearningHub.Nhs.API/web.config
@@ -11,10 +11,15 @@
-
-
-
-
+
+
+
+
+
+
+
+
+
diff --git a/WebAPI/LearningHub.Nhs.Api.Shared/LearningHub.Nhs.Api.Shared.csproj b/WebAPI/LearningHub.Nhs.Api.Shared/LearningHub.Nhs.Api.Shared.csproj
index 74d2ccc77..1963fd724 100644
--- a/WebAPI/LearningHub.Nhs.Api.Shared/LearningHub.Nhs.Api.Shared.csproj
+++ b/WebAPI/LearningHub.Nhs.Api.Shared/LearningHub.Nhs.Api.Shared.csproj
@@ -1,19 +1,19 @@
-
+
-
- net8.0
- true
- x64
-
+
+ net8.0
+ true
+ x64
+
-
-
-
-
-
- all
- runtime; build; native; contentfiles; analyzers; buildtransitive
-
-
+
+
+
+
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
diff --git a/WebAPI/LearningHub.Nhs.Api.UnitTests/LearningHub.Nhs.Api.UnitTests.csproj b/WebAPI/LearningHub.Nhs.Api.UnitTests/LearningHub.Nhs.Api.UnitTests.csproj
index 9663e4ee7..e7a054e23 100644
--- a/WebAPI/LearningHub.Nhs.Api.UnitTests/LearningHub.Nhs.Api.UnitTests.csproj
+++ b/WebAPI/LearningHub.Nhs.Api.UnitTests/LearningHub.Nhs.Api.UnitTests.csproj
@@ -1,34 +1,34 @@
-
+
-
- net8.0
- true
- false
- x64
-
+
+ net8.0
+ true
+ false
+ x64
+
-
-
-
-
-
-
-
-
-
- all
- runtime; build; native; contentfiles; analyzers; buildtransitive
-
-
-
- all
- runtime; build; native; contentfiles; analyzers; buildtransitive
-
-
+
+
+
+
+
+
+
+
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
-
-
-
-
+
+
+
+
diff --git a/WebAPI/LearningHub.Nhs.Repository.Interface/LearningHub.Nhs.Repository.Interface.csproj b/WebAPI/LearningHub.Nhs.Repository.Interface/LearningHub.Nhs.Repository.Interface.csproj
index d41ba9e68..7e09ec673 100644
--- a/WebAPI/LearningHub.Nhs.Repository.Interface/LearningHub.Nhs.Repository.Interface.csproj
+++ b/WebAPI/LearningHub.Nhs.Repository.Interface/LearningHub.Nhs.Repository.Interface.csproj
@@ -1,4 +1,4 @@
-
+
net8.0
diff --git a/WebAPI/LearningHub.Nhs.Repository/Hierarchy/CatalogueNodeVersionRepository.cs b/WebAPI/LearningHub.Nhs.Repository/Hierarchy/CatalogueNodeVersionRepository.cs
index 38f77a37f..5ae373e42 100644
--- a/WebAPI/LearningHub.Nhs.Repository/Hierarchy/CatalogueNodeVersionRepository.cs
+++ b/WebAPI/LearningHub.Nhs.Repository/Hierarchy/CatalogueNodeVersionRepository.cs
@@ -81,11 +81,6 @@ public async Task> GetPublishedCatalogues()
/// The .
public IQueryable GetPublishedCataloguesForUserAsync(int userId)
{
- var communityCatalogue = this.DbContext.CatalogueNodeVersion.AsNoTracking()
- .Include(cnv => cnv.NodeVersion.Node)
- .Where(cnv => cnv.NodeVersion.VersionStatusEnum == VersionStatusEnum.Published
- && cnv.NodeVersion.NodeId == 1 /* Community Catalogue */);
-
var cataloguesForUser = from cnv in this.DbContext.CatalogueNodeVersion.Include(cnv => cnv.NodeVersion.Node).AsNoTracking()
join nv in this.DbContext.NodeVersion.Where(cnv => cnv.VersionStatusEnum == VersionStatusEnum.Published && !cnv.Deleted) // .Include(nv => nv.Node)
on cnv.NodeVersionId equals nv.Id
@@ -99,7 +94,7 @@ join n in this.DbContext.Node.Where(x => !x.Deleted)
on nv.Id equals n.CurrentNodeVersionId
select cnv;
- var returnedCatalogues = communityCatalogue.Union(cataloguesForUser).Distinct()
+ var returnedCatalogues = cataloguesForUser.Distinct()
.OrderBy(cnv => cnv.NodeVersion.NodeId != 1)
.ThenBy(cnv => cnv.Name);
diff --git a/WebAPI/LearningHub.Nhs.Repository/LearningHub.Nhs.Repository.csproj b/WebAPI/LearningHub.Nhs.Repository/LearningHub.Nhs.Repository.csproj
index 904bda4c8..6da0f9200 100644
--- a/WebAPI/LearningHub.Nhs.Repository/LearningHub.Nhs.Repository.csproj
+++ b/WebAPI/LearningHub.Nhs.Repository/LearningHub.Nhs.Repository.csproj
@@ -1,25 +1,25 @@
-
+
-
- net8.0
- true
- x64
-
+
+ net8.0
+ true
+ x64
+
-
-
-
-
-
-
-
- all
- runtime; build; native; contentfiles; analyzers; buildtransitive
-
-
+
+
+
+
+
+
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
-
-
-
+
+
+
diff --git a/WebAPI/LearningHub.Nhs.Services.Interface/LearningHub.Nhs.Services.Interface.csproj b/WebAPI/LearningHub.Nhs.Services.Interface/LearningHub.Nhs.Services.Interface.csproj
index b259b3a7e..024756991 100644
--- a/WebAPI/LearningHub.Nhs.Services.Interface/LearningHub.Nhs.Services.Interface.csproj
+++ b/WebAPI/LearningHub.Nhs.Services.Interface/LearningHub.Nhs.Services.Interface.csproj
@@ -1,31 +1,31 @@
-
+
-
- net8.0
- true
- x64
-
+
+ net8.0
+ true
+ x64
+
-
-
-
-
-
+
+
+
+
+
-
-
-
-
-
-
-
- all
- runtime; build; native; contentfiles; analyzers; buildtransitive
-
-
+
+
+
+
+
+
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
-
-
-
+
+
+
diff --git a/WebAPI/LearningHub.Nhs.Services.UnitTests/LearningHub.Nhs.Services.UnitTests.csproj b/WebAPI/LearningHub.Nhs.Services.UnitTests/LearningHub.Nhs.Services.UnitTests.csproj
index f78df0084..6b6743743 100644
--- a/WebAPI/LearningHub.Nhs.Services.UnitTests/LearningHub.Nhs.Services.UnitTests.csproj
+++ b/WebAPI/LearningHub.Nhs.Services.UnitTests/LearningHub.Nhs.Services.UnitTests.csproj
@@ -1,47 +1,47 @@
-
+
-
- net8.0
- true
- false
- x64
-
+
+ net8.0
+ true
+ false
+ x64
+
-
-
-
-
-
-
-
-
-
-
-
-
-
- all
- runtime; build; native; contentfiles; analyzers; buildtransitive
-
-
-
- all
- runtime; build; native; contentfiles; analyzers
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
+
+ all
+ runtime; build; native; contentfiles; analyzers
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
- PreserveNewest
-
-
+
+
+ PreserveNewest
+
+
diff --git a/WebAPI/LearningHub.Nhs.Services/LearningHub.Nhs.Services.csproj b/WebAPI/LearningHub.Nhs.Services/LearningHub.Nhs.Services.csproj
index e99e5300a..44f8119cb 100644
--- a/WebAPI/LearningHub.Nhs.Services/LearningHub.Nhs.Services.csproj
+++ b/WebAPI/LearningHub.Nhs.Services/LearningHub.Nhs.Services.csproj
@@ -1,38 +1,38 @@
-
+
-
- net8.0
- true
- x64
-
+
+ net8.0
+ true
+ x64
+
-
-
-
-
-
-
-
-
-
-
-
-
-
- all
- runtime; build; native; contentfiles; analyzers; buildtransitive
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
+
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
diff --git a/WebAPI/MigrationTool/LearningHub.Nhs.Migration.ConsoleApp/LearningHub.Nhs.Migration.ConsoleApp.csproj b/WebAPI/MigrationTool/LearningHub.Nhs.Migration.ConsoleApp/LearningHub.Nhs.Migration.ConsoleApp.csproj
index 697d1db2f..73e18184e 100644
--- a/WebAPI/MigrationTool/LearningHub.Nhs.Migration.ConsoleApp/LearningHub.Nhs.Migration.ConsoleApp.csproj
+++ b/WebAPI/MigrationTool/LearningHub.Nhs.Migration.ConsoleApp/LearningHub.Nhs.Migration.ConsoleApp.csproj
@@ -1,67 +1,67 @@
-
+
-
- Exe
- net8.0
- 7.3
- true
- x64
-
+
+ Exe
+ net8.0
+ 7.3
+ true
+ x64
+
-
-
-
+
+
+
-
-
- PreserveNewest
- true
- PreserveNewest
-
-
+
+
+ PreserveNewest
+ true
+ PreserveNewest
+
+
-
-
-
-
-
-
-
-
- all
- runtime; build; native; contentfiles; analyzers; buildtransitive
-
-
+
+
+
+
+
+
+
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
-
-
-
+
+
+
-
-
- Always
-
-
- PreserveNewest
-
-
- Always
-
-
- Always
-
-
- Always
-
-
- Always
-
-
- Always
-
-
- Always
-
-
+
+
+ Always
+
+
+ PreserveNewest
+
+
+ Always
+
+
+ Always
+
+
+ Always
+
+
+ Always
+
+
+ Always
+
+
+ Always
+
+
diff --git a/WebAPI/MigrationTool/LearningHub.Nhs.Migration.Interface/LearningHub.Nhs.Migration.Interface.csproj b/WebAPI/MigrationTool/LearningHub.Nhs.Migration.Interface/LearningHub.Nhs.Migration.Interface.csproj
index 89ca1344e..7b945c483 100644
--- a/WebAPI/MigrationTool/LearningHub.Nhs.Migration.Interface/LearningHub.Nhs.Migration.Interface.csproj
+++ b/WebAPI/MigrationTool/LearningHub.Nhs.Migration.Interface/LearningHub.Nhs.Migration.Interface.csproj
@@ -1,23 +1,23 @@
-
+
-
- net8.0
- true
- x64
-
+
+ net8.0
+ true
+ x64
+
-
-
-
-
-
- all
- runtime; build; native; contentfiles; analyzers; buildtransitive
-
-
+
+
+
+
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
-
-
-
+
+
+
diff --git a/WebAPI/MigrationTool/LearningHub.Nhs.Migration.Models/LearningHub.Nhs.Migration.Models.csproj b/WebAPI/MigrationTool/LearningHub.Nhs.Migration.Models/LearningHub.Nhs.Migration.Models.csproj
index 4ab608bac..189b0348e 100644
--- a/WebAPI/MigrationTool/LearningHub.Nhs.Migration.Models/LearningHub.Nhs.Migration.Models.csproj
+++ b/WebAPI/MigrationTool/LearningHub.Nhs.Migration.Models/LearningHub.Nhs.Migration.Models.csproj
@@ -1,21 +1,21 @@
-
+
-
- net8.0
- true
- x64
-
+
+ net8.0
+ true
+ x64
+
-
-
-
-
-
-
-
- all
- runtime; build; native; contentfiles; analyzers; buildtransitive
-
-
+
+
+
+
+
+
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
diff --git a/WebAPI/MigrationTool/LearningHub.Nhs.Migration.Staging.Repository/LearningHub.Nhs.Migration.Staging.Repository.csproj b/WebAPI/MigrationTool/LearningHub.Nhs.Migration.Staging.Repository/LearningHub.Nhs.Migration.Staging.Repository.csproj
index 7dd7febb7..090dce6fc 100644
--- a/WebAPI/MigrationTool/LearningHub.Nhs.Migration.Staging.Repository/LearningHub.Nhs.Migration.Staging.Repository.csproj
+++ b/WebAPI/MigrationTool/LearningHub.Nhs.Migration.Staging.Repository/LearningHub.Nhs.Migration.Staging.Repository.csproj
@@ -1,28 +1,28 @@
-
+
-
- net8.0
- true
- x64
-
+
+ net8.0
+ true
+ x64
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
+
+
+
-
-
- all
- runtime; build; native; contentfiles; analyzers; buildtransitive
-
-
+
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
diff --git a/WebAPI/MigrationTool/LearningHub.Nhs.Migration.UnitTests/LearningHub.Nhs.Migration.UnitTests.csproj b/WebAPI/MigrationTool/LearningHub.Nhs.Migration.UnitTests/LearningHub.Nhs.Migration.UnitTests.csproj
index 5b83ec893..a9b7683f7 100644
--- a/WebAPI/MigrationTool/LearningHub.Nhs.Migration.UnitTests/LearningHub.Nhs.Migration.UnitTests.csproj
+++ b/WebAPI/MigrationTool/LearningHub.Nhs.Migration.UnitTests/LearningHub.Nhs.Migration.UnitTests.csproj
@@ -1,35 +1,35 @@
-
+
-
- net8.0
- true
- false
- x64
-
+
+ net8.0
+ true
+ false
+ x64
+
-
-
-
-
-
-
-
- all
- runtime; build; native; contentfiles; analyzers; buildtransitive
-
-
-
- all
- runtime; build; native; contentfiles; analyzers; buildtransitive
-
-
+
+
+
+
+
+
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
diff --git a/WebAPI/MigrationTool/LearningHub.Nhs.Migration/LearningHub.Nhs.Migration.csproj b/WebAPI/MigrationTool/LearningHub.Nhs.Migration/LearningHub.Nhs.Migration.csproj
index bf0235325..71195c130 100644
--- a/WebAPI/MigrationTool/LearningHub.Nhs.Migration/LearningHub.Nhs.Migration.csproj
+++ b/WebAPI/MigrationTool/LearningHub.Nhs.Migration/LearningHub.Nhs.Migration.csproj
@@ -1,4 +1,4 @@
-
+
net8.0
@@ -6,18 +6,18 @@
x64
-
-
-
-
-
-
-
-
- all
- runtime; build; native; contentfiles; analyzers; buildtransitive
-
-
+
+
+
+
+
+
+
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+