diff --git a/.gitguardian.yaml b/.gitguardian.yaml new file mode 100644 index 000000000..0685713d8 --- /dev/null +++ b/.gitguardian.yaml @@ -0,0 +1,5 @@ +secret: + ignored-matches: + - match: 26841b2b92a38ec6d2dd87ccc2d4f6d3613486c21f4cf5cb4d98b4527dfc0061 + name: Generic High Entropy Secret - LearningHub.Nhs.WebUI/Program.cs +version: 2 diff --git a/.github/azure-pipeline-database-ci.yml b/.github/azure-pipeline-database-ci.yml new file mode 100644 index 000000000..8415569c7 --- /dev/null +++ b/.github/azure-pipeline-database-ci.yml @@ -0,0 +1,30 @@ +trigger: + - CI +resources: + repositories: + - repository: self + type: git + ref: refs/heads/CI +jobs: +- job: Job_1 + displayName: Agent job + pool: + vmImage: windows-2019 + steps: + - checkout: self + clean: true + fetchTags: false + - task: MSBuild@1 + displayName: Build solution **/LearningHub.Nhs.Database.sqlproj + inputs: + solution: '**/LearningHub.Nhs.Database.sqlproj' + msbuildArchitecture: x64 + - task: CopyFiles@2 + displayName: Copy SQL Dacpac File + inputs: + SourceFolder: $(agent.builddirectory)\s + Contents: '**\LearningHub.Nhs.Database.dacpac' + TargetFolder: $(build.artifactstagingdirectory) + - task: PublishBuildArtifacts@1 + displayName: 'Publish Artifact: drop' +... diff --git a/.github/azure-pipeline-openapi-reportapi-ci.yml b/.github/azure-pipeline-openapi-reportapi-ci.yml new file mode 100644 index 000000000..0446b79c2 --- /dev/null +++ b/.github/azure-pipeline-openapi-reportapi-ci.yml @@ -0,0 +1,85 @@ +# Agent Queue 'Azure Pipelines' was used with unrecognized Agent Specification, vmImage property must be specified to determine image - https://docs.microsoft.com/en-us/azure/devops/pipelines/agents/hosted?view=azure-devops&tabs=yaml#software +variables: +- name: BuildParameters.RestoreBuildProjects + value: '**/*.csproj' +- name: BuildParameters.projects + value: '**/*.csproj' +trigger: + - CI +name: $(date:yyyyMMdd)$(rev:.r) +resources: + repositories: + - repository: self + type: git + ref: refs/heads/RC +jobs: +- job: Job_1 + displayName: Agent job + pool: + vmImage: windows-latest + steps: + - checkout: self + clean: true + fetchTags: false + - task: NuGetToolInstaller@1 + displayName: Use NuGet 5.8 + inputs: + versionSpec: 5.8 + - task: NuGetCommand@2 + displayName: NuGet restore + inputs: + feedRestore: d99eaf2c-ad74-4a35-876e-f7dc1e45a604 + - task: DotNetCoreCLI@2 + displayName: Restore + inputs: + command: restore + projects: $(BuildParameters.RestoreBuildProjects) + feedRestore: d99eaf2c-ad74-4a35-876e-f7dc1e45a604 + - task: DotNetCoreCLI@2 + displayName: Build + inputs: + projects: $(BuildParameters.projects) + arguments: --configuration $(BuildConfiguration) /p:Platform=x64 + - task: DotNetCoreCLI@2 + displayName: Test OpenAPI + inputs: + command: test + projects: '**/*LearningHub.Nhs.OpenApi.Tests.csproj' + arguments: --configuration Debug + - task: DotNetCoreCLI@2 + displayName: Test ReportAPI + inputs: + command: test + projects: '**/*LearningHub.Nhs.ReportApi.Services.UnitTests.csproj' + arguments: --configuration Debug + - task: DotNetCoreCLI@2 + displayName: Publish OpenAPI + inputs: + command: publish + publishWebProjects: false + projects: '**/*LearningHub.NHS.OpenAPI.csproj' + arguments: --configuration $(BuildConfiguration) --output $(build.artifactstagingdirectory)/OpenAPI + zipAfterPublish: True + - task: PublishBuildArtifacts@1 + displayName: Publish Artifact OpenAPI + condition: succeededOrFailed() + inputs: + PathtoPublish: $(build.artifactstagingdirectory)/OpenAPI + ArtifactName: OpenAPI + TargetPath: '\\my\share\$(Build.DefinitionName)\$(Build.BuildNumber)' + - task: DotNetCoreCLI@2 + displayName: Publish ReportAPI + inputs: + command: publish + publishWebProjects: false + projects: '**/*LearningHub.Nhs.ReportApi.csproj' + arguments: --configuration $(BuildConfiguration) --output $(build.artifactstagingdirectory)/ReportAPI + zipAfterPublish: True + - task: PublishBuildArtifacts@1 + displayName: Publish Artifact ReportAPI + condition: succeededOrFailed() + inputs: + PathtoPublish: $(build.artifactstagingdirectory)/ReportAPI + ArtifactName: ReportAPI + TargetPath: '\\my\share\$(Build.DefinitionName)\$(Build.BuildNumber)' +... diff --git a/.github/azure-pipeline-webui-ci.yml b/.github/azure-pipeline-webui-ci.yml new file mode 100644 index 000000000..509faf6a5 --- /dev/null +++ b/.github/azure-pipeline-webui-ci.yml @@ -0,0 +1,112 @@ +# Variable Group 'UAT - Variable Group' was defined in the Variables tab +variables: +- name: BuildParameters.RestoreBuildProjects + value: '**/*.csproj' +- name: BuildParameters.TestProjects + value: '**/*[Tt]ests/*.csproj' +trigger: + - CI +name: $(date:yyyyMMdd)$(rev:.r) +resources: + repositories: + - repository: self + type: git + ref: refs/heads/CI +jobs: +- job: Job_1 + displayName: Agent job + pool: + vmImage: windows-latest + steps: + - checkout: self + clean: true + fetchTags: true + - task: NodeTool@0 + displayName: Use Node 12.19 (otherwise node-sass 4.13 will error - Azure build agent defaults to v14.15 which is incompatible) + inputs: + versionSpec: 12.19 + - task: Npm@1 + displayName: npm custom + inputs: + command: custom + workingDir: LearningHub.Nhs.WebUI + verbose: false + customCommand: install -f + - task: Npm@1 + displayName: run webpack build + inputs: + command: custom + workingDir: LearningHub.Nhs.WebUI + verbose: false + customCommand: run build + - task: NuGetToolInstaller@1 + displayName: Use NuGet 5.8 + inputs: + versionSpec: 5.8 + - task: NuGetCommand@2 + displayName: NuGet restore + inputs: + feedRestore: d99eaf2c-ad74-4a35-876e-f7dc1e45a604 + - task: DotNetCoreCLI@2 + displayName: Restore + inputs: + command: restore + projects: $(BuildParameters.RestoreBuildProjects) + - task: DotNetCoreCLI@2 + displayName: Build + inputs: + projects: $(BuildParameters.RestoreBuildProjects) + arguments: --configuration $(BuildConfiguration) + - task: DotNetCoreCLI@2 + displayName: Test + enabled: False + inputs: + command: test + projects: $(BuildParameters.TestProjects) + arguments: --configuration $(BuildConfiguration) + - task: DotNetCoreCLI@2 + displayName: Publish WebUI + inputs: + command: publish + publishWebProjects: false + projects: '**/*LearningHub.Nhs.WebUI.csproj' + arguments: --configuration $(BuildConfiguration) --output $(build.artifactstagingdirectory)/WebUI + zipAfterPublish: True + - task: PublishBuildArtifacts@1 + displayName: Publish Artifact WebUI + condition: succeededOrFailed() + inputs: + PathtoPublish: $(Build.ArtifactStagingDirectory)/WebUI + ArtifactName: WebUI + TargetPath: '\\my\share\$(Build.DefinitionName)\$(Build.BuildNumber)' + - task: DotNetCoreCLI@2 + displayName: Publish AdminUI + inputs: + command: publish + publishWebProjects: false + projects: '**/*LearningHub.Nhs.AdminUI.csproj' + arguments: --configuration $(BuildConfiguration) --output $(build.artifactstagingdirectory)/AdminUI + zipAfterPublish: True + - task: PublishBuildArtifacts@1 + displayName: Publish Artifact AdminUI + condition: succeededOrFailed() + inputs: + PathtoPublish: $(Build.ArtifactStagingDirectory)/AdminUI + ArtifactName: AdminUI + TargetPath: '\\my\share\$(Build.DefinitionName)\$(Build.BuildNumber)' + - task: DotNetCoreCLI@2 + displayName: Publish WebAPI + inputs: + command: publish + publishWebProjects: false + projects: '**/*LearningHub.Nhs.Api.csproj' + arguments: --configuration $(BuildConfiguration) --output $(build.artifactstagingdirectory)/WebAPI + zipAfterPublish: True + - task: PublishBuildArtifacts@1 + displayName: 'Publish Artifact WebAPI ' + condition: succeededOrFailed() + inputs: + PathtoPublish: $(Build.ArtifactStagingDirectory)/WebAPI + ArtifactName: WebAPI + TargetPath: '\\my\share\$(Build.DefinitionName)\$(Build.BuildNumber)' +... diff --git a/.gitignore b/.gitignore index e0af672bf..0afa44753 100644 --- a/.gitignore +++ b/.gitignore @@ -43,3 +43,7 @@ obj /AdminUI/LearningHub.Nhs.AdminUI/Properties/launchSettings.json /WebAPI/LearningHub.Nhs.API/Properties/launchSettings.json /WebAPI/LearningHub.Nhs.API/appsettings.Development.json +/WebAPI/LearningHub.Nhs.Database/LearningHub.Nhs.Database.dbmdl +/WebAPI/LearningHub.Nhs.Database/LearningHub.Nhs.Database.jfm +/WebAPI/MigrationTool/LearningHub.Nhs.Migration.Staging.Database/LearningHub.Nhs.Migration.Staging.Database.dbmdl +/WebAPI/MigrationTool/LearningHub.Nhs.Migration.Staging.Database/LearningHub.Nhs.Migration.Staging.Database.jfm diff --git a/LearningHub.Nhs.WebUI/Controllers/Api/UserController.cs b/LearningHub.Nhs.WebUI/Controllers/Api/UserController.cs index e2b9c09b5..7e5d42864 100644 --- a/LearningHub.Nhs.WebUI/Controllers/Api/UserController.cs +++ b/LearningHub.Nhs.WebUI/Controllers/Api/UserController.cs @@ -90,6 +90,18 @@ public async Task GetUserAccessType() return this.Ok(isGeneralUser); } + /// + /// to get user role. + /// + /// The . + [HttpGet] + [Route("CheckUserRole")] + public async Task CheckUserRole() + { + var isSystemAdmin = this.User.IsInRole("Administrator"); + return this.Ok(isSystemAdmin); + } + /// /// The GetCurrentUserPersonalDetails. /// diff --git a/LearningHub.Nhs.WebUI/Controllers/ResourceController.cs b/LearningHub.Nhs.WebUI/Controllers/ResourceController.cs index 97df3861f..b040c2cf8 100644 --- a/LearningHub.Nhs.WebUI/Controllers/ResourceController.cs +++ b/LearningHub.Nhs.WebUI/Controllers/ResourceController.cs @@ -136,7 +136,7 @@ public async Task Index(int resourceReferenceId, bool? acceptSens var userGroups = await this.userGroupService.GetRoleUserGroupDetailForUserAsync(this.CurrentUserId); hasCatalogueAccess = userGroups.Any(x => x.CatalogueNodeId == resource.Catalogue.NodeId && - (x.RoleEnum == RoleEnum.LocalAdmin || x.RoleEnum == RoleEnum.Editor || x.RoleEnum == RoleEnum.Reader)); + (x.RoleEnum == RoleEnum.LocalAdmin || x.RoleEnum == RoleEnum.Editor || x.RoleEnum == RoleEnum.Reader)) || this.User.IsInRole("Administrator"); } else if (!resource.Catalogue.RestrictedAccess) { diff --git a/LearningHub.Nhs.WebUI/Program.cs b/LearningHub.Nhs.WebUI/Program.cs index 2352d0bc3..ec9685f50 100644 --- a/LearningHub.Nhs.WebUI/Program.cs +++ b/LearningHub.Nhs.WebUI/Program.cs @@ -33,7 +33,7 @@ var builder = WebApplication.CreateBuilder(args); - builder.Configuration.AddUserSecrets(string.Empty); + builder.Configuration.AddUserSecrets("a2ecb5d2-cf13-4551-9cb6-3d86dfbcf8ef"); builder.Logging.ClearProviders(); builder.Logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace); diff --git a/LearningHub.Nhs.WebUI/Scripts/vuesrc/data/user.ts b/LearningHub.Nhs.WebUI/Scripts/vuesrc/data/user.ts index 757b948ba..472ca9bac 100644 --- a/LearningHub.Nhs.WebUI/Scripts/vuesrc/data/user.ts +++ b/LearningHub.Nhs.WebUI/Scripts/vuesrc/data/user.ts @@ -54,6 +54,18 @@ const isGeneralUser = async function (): Promise { }); }; +const IsSystemAdmin = async function (): Promise { + var IsSystemAdmin = `/api/User/CheckUserRole`; + return await AxiosWrapper.axios.get(IsSystemAdmin) + .then(response => { + return response.data; + }) + .catch(e => { + console.log('IsSystemAdmin:' + e); + throw e; + }); +}; + const getCurrentUserBasicDetails = async function (): Promise { return await AxiosWrapper.axios.get('/api/User/GetCurrentUserBasicDetails') .then(response => { @@ -160,5 +172,6 @@ export const userData = { updateSecurityQuestionAnswers, keepUserSessionAlive, getkeepUserSessionAliveInterval, - isGeneralUser + isGeneralUser, + IsSystemAdmin } diff --git a/LearningHub.Nhs.WebUI/Scripts/vuesrc/resource/ResourceContent.vue b/LearningHub.Nhs.WebUI/Scripts/vuesrc/resource/ResourceContent.vue index efc9dad7c..94fce049e 100644 --- a/LearningHub.Nhs.WebUI/Scripts/vuesrc/resource/ResourceContent.vue +++ b/LearningHub.Nhs.WebUI/Scripts/vuesrc/resource/ResourceContent.vue @@ -8,7 +8,7 @@
- +