Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
4f1b667
Update README.md
binon Jan 10, 2024
f1eb41f
Update README.md
binon Jan 10, 2024
1f9521c
Addding key
binon Jan 10, 2024
3e0cfaf
Set up CI with Azure Pipelines for WebUI
binon Jan 16, 2024
aed3dec
Triggering CI in Azure Pipeline
binon Jan 16, 2024
df3f683
Test whether master branch update triggers
binon Jan 16, 2024
b846af6
Update azure-pipelines-webui-ci.yml
binon Jan 16, 2024
9851951
Test trigger 2 CI
binon Jan 16, 2024
f8118fa
Test trigger 2 master
binon Jan 16, 2024
3699ef3
Create azure-pipelines-webui-ci.yml
binon Jan 16, 2024
692df2b
Update azure-pipelines-webui-ci.yml for Azure Pipelines
binon Jan 16, 2024
07ec9af
Update master to test trigger
binon Jan 16, 2024
ae4a205
Update CI to test trigger
binon Jan 16, 2024
81c2533
Update azure-pipelines-webui-ci.yml for Azure Pipelines
binon Jan 16, 2024
bbd15a6
trigger commit ci
binon Jan 16, 2024
eb26de6
Update azure-pipelines-webui-ci.yml
binon Jan 16, 2024
ec171d2
Commit to master any effect
binon Jan 16, 2024
279b7ca
Create LearningHub OpenAPI-ReportAPI-CI.yml
binon Jan 16, 2024
26e0199
Delete .github/workflows/LearningHub OpenAPI-ReportAPI-CI.yml
binon Jan 16, 2024
ad9beb9
Create LearningHub OpenAPI-ReportAPI-CI.yml
binon Jan 16, 2024
b0f95ee
Update master README
binon Jan 16, 2024
2f656ef
Update CI README
binon Jan 16, 2024
4a4d65d
Create LearningHub Database-CI.yml
binon Jan 17, 2024
21db00d
Delete azure-pipelines-webui-ci.yml
binon Jan 17, 2024
914ed15
Create azure-pipeline-webui-ci.yml
binon Jan 17, 2024
07081ce
Rename LearningHub OpenAPI-ReportAPI-CI.yml to azure-pipeline-openApi…
binon Jan 17, 2024
6a55091
Rename LearningHub Database-CI.yml to azure-pipeline-database-ci.yml
binon Jan 17, 2024
c4bb351
Rename azure-pipeline-openApi-reportApi-CI.yml to azure-pipeline-open…
binon Jan 17, 2024
59d465e
Delete azure-pipelines-webui-ci.yml
binon Jan 17, 2024
53753aa
Merge pull request #2 from TechnologyEnhancedLearning/CI
binon Jan 17, 2024
f62a59f
Update master check trigger
binon Jan 17, 2024
289e7aa
Update CI check trigger
binon Jan 17, 2024
fdd4c61
Merge pull request #3 from TechnologyEnhancedLearning/CI
binon Jan 17, 2024
f57488a
Merge pull request #5 from TechnologyEnhancedLearning/master
binon Jan 18, 2024
1904f6f
Merge pull request #6 from TechnologyEnhancedLearning/RC
binon Jan 18, 2024
12fde49
WebAPI - hot fix changes
binon Jan 18, 2024
abddd2c
RC hot fixes WebUI
binon Jan 18, 2024
78e77d6
Merge pull request #7 from TechnologyEnhancedLearning/rc-hot-fix
binon Jan 18, 2024
1c3606d
Fixed the vue build error in windows-latest in github
binon Jan 18, 2024
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
5 changes: 5 additions & 0 deletions .gitguardian.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
secret:
ignored-matches:
- match: 26841b2b92a38ec6d2dd87ccc2d4f6d3613486c21f4cf5cb4d98b4527dfc0061
name: Generic High Entropy Secret - LearningHub.Nhs.WebUI/Program.cs
version: 2
30 changes: 30 additions & 0 deletions .github/azure-pipeline-database-ci.yml
Original file line number Diff line number Diff line change
@@ -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'
...
85 changes: 85 additions & 0 deletions .github/azure-pipeline-openapi-reportapi-ci.yml
Original file line number Diff line number Diff line change
@@ -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)'
...
112 changes: 112 additions & 0 deletions .github/azure-pipeline-webui-ci.yml
Original file line number Diff line number Diff line change
@@ -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)'
...
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -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
12 changes: 12 additions & 0 deletions LearningHub.Nhs.WebUI/Controllers/Api/UserController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,18 @@ public async Task<ActionResult> GetUserAccessType()
return this.Ok(isGeneralUser);
}

/// <summary>
/// to get user role.
/// </summary>
/// <returns>The <see cref="Task{ActionResult}"/>.</returns>
[HttpGet]
[Route("CheckUserRole")]
public async Task<ActionResult> CheckUserRole()
{
var isSystemAdmin = this.User.IsInRole("Administrator");
return this.Ok(isSystemAdmin);
}

/// <summary>
/// The GetCurrentUserPersonalDetails.
/// </summary>
Expand Down
2 changes: 1 addition & 1 deletion LearningHub.Nhs.WebUI/Controllers/ResourceController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ public async Task<IActionResult> 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)
{
Expand Down
2 changes: 1 addition & 1 deletion LearningHub.Nhs.WebUI/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
15 changes: 14 additions & 1 deletion LearningHub.Nhs.WebUI/Scripts/vuesrc/data/user.ts
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,18 @@ const isGeneralUser = async function (): Promise<boolean[]> {
});
};

const IsSystemAdmin = async function (): Promise<boolean[]> {
var IsSystemAdmin = `/api/User/CheckUserRole`;
return await AxiosWrapper.axios.get<boolean[]>(IsSystemAdmin)
.then(response => {
return response.data;
})
.catch(e => {
console.log('IsSystemAdmin:' + e);
throw e;
});
};

const getCurrentUserBasicDetails = async function (): Promise<UserBasicModel> {
return await AxiosWrapper.axios.get<UserBasicModel>('/api/User/GetCurrentUserBasicDetails')
.then(response => {
Expand Down Expand Up @@ -160,5 +172,6 @@ export const userData = {
updateSecurityQuestionAnswers,
keepUserSessionAlive,
getkeepUserSessionAliveInterval,
isGeneralUser
isGeneralUser,
IsSystemAdmin
}
20 changes: 12 additions & 8 deletions LearningHub.Nhs.WebUI/Scripts/vuesrc/resource/ResourceContent.vue
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

<!--Video-->
<div id="mediacontainer" class="resource-item nhsuk-u-margin-bottom-7" v-if="hasMediaAccess && (resourceItem.resourceTypeEnum === ResourceType.VIDEO)">

<video id="resourceAzureMediaPlayer" data-setup='{"logo": { "enabled": false }, "techOrder": ["azureHtml5JS", "flashSS", "silverlightSS", "html5"], "nativeControlsForTouch": false}' controls class="azuremediaplayer amp-default-skin amp-big-play-centered resource-video nhsuk-u-margin-bottom-4">
<source :src="resourceItem.videoDetails.resourceAzureMediaAsset.locatorUri" type="application/vnd.ms-sstr+xml" :data-setup='getAESProtection(resourceItem.videoDetails.resourceAzureMediaAsset.authenticationToken)' />
<source :src="getMediaAssetProxyUrl(resourceItem.videoDetails.resourceAzureMediaAsset)" type="application/vnd.apple.mpegurl" disableUrlRewriter="true" />
Expand Down Expand Up @@ -73,7 +73,7 @@
import '../filters';
import { resourceData } from '../data/resource';
import { userData } from '../data/user';
import { VersionStatus, ResourceType, ResourceAccessibility,ActivityStatus, MediaResourceActivityType, AzureMediaPlayerOptions, RoleEnum } from '../constants';
import { VersionStatus, ResourceType, ResourceAccessibility, ActivityStatus, MediaResourceActivityType, AzureMediaPlayerOptions, RoleEnum } from '../constants';
import { ResourceItemModel } from '../models/resourceItemModel';
import { ScormContentDetailsModel } from '../models/scormModel';
import { RoleUserGroupModel } from '../models/roleUserGroupModel';
Expand Down Expand Up @@ -119,19 +119,20 @@
interactionQueue: new Array<InteractionQueueModel>(),
scormContentDetailsModel: new ScormContentDetailsModel(),
assessmentProgress: null as AssessmentProgressModel,
isGeneralUser: false
isGeneralUser: false,
isSystemAdmin: false
}
},
computed: {
hasCatalogueAccess(): boolean {
return (!this.resourceItem.catalogue.restrictedAccess
return (!this.resourceItem.catalogue.restrictedAccess || this.IsSystemAdmin
||
(this.roleUserGroups.filter((rug: any) => rug.catalogueNodeId == this.resourceItem.catalogue.nodeId
&& (rug.roleEnum == RoleEnum.LocalAdmin || rug.roleEnum == RoleEnum.Editor || rug.roleEnum == RoleEnum.Reader)).length > 0)
);
},
hasMediaAccess(): boolean {
return this.userAuthenticated && (this.resourceItem.resourceTypeEnum == this.ResourceType.AUDIO || this.resourceItem.resourceTypeEnum == this.ResourceType.VIDEO ) && (!(this.isGeneralUser && this.resourceItem.resourceAccessibilityEnum == this.ResourceAccessibility.FullAccess))
return this.userAuthenticated && (this.resourceItem.resourceTypeEnum == this.ResourceType.AUDIO || this.resourceItem.resourceTypeEnum == this.ResourceType.VIDEO) && (!(this.isGeneralUser && this.resourceItem.resourceAccessibilityEnum == this.ResourceAccessibility.FullAccess))
},
hasScormAccess(): boolean {
return this.userAuthenticated && this.resourceItem.resourceTypeEnum == this.ResourceType.SCORM && (!(this.isGeneralUser && this.resourceItem.resourceAccessibilityEnum == this.ResourceAccessibility.FullAccess))
Expand All @@ -146,12 +147,13 @@
this.mediaStartTime = parseInt(this.$route.query.mediaStartTime as string);
}
await this.getGeneralUser();
await this.getUserRole();
await this.loadResourceItem(Number(this.$route.params.resId));

if (this.userAuthenticated && this.resourceItem.catalogue.restrictedAccess) {
await this.loadRoleUserGroups();
}


if (this.userAuthenticated && (this.resourceItem.resourceTypeEnum == ResourceType.VIDEO || this.resourceItem.resourceTypeEnum == ResourceType.AUDIO) && this.hasResourceAccess()) {
this.addMediaEventListeners();
Expand Down Expand Up @@ -236,6 +238,9 @@
async getGeneralUser(): Promise<void> {
this.isGeneralUser = await userData.isGeneralUser();
},
async getUserRole(): Promise<void> {
this.IsSystemAdmin = await userData.IsSystemAdmin();
},

hasResourceAccess(): boolean {
return this.userAuthenticated && (!(this.isGeneralUser && this.resourceItem.resourceAccessibilityEnum == this.ResourceAccessibility.FullAccess))
Expand Down Expand Up @@ -550,7 +555,7 @@
.resource-item-row {
margin-top: 32px;
}

.border-bottom {
border-bottom: 1px solid $nhsuk-grey-lighter;
padding-bottom: 20px;
Expand Down Expand Up @@ -628,7 +633,6 @@
color: #ffffff;
background-color: transparent;
}

</style>

<style lang="scss">
Expand Down
Loading