Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 33 additions & 0 deletions LearningHub.Nhs.WebUI/Configuration/MoodleApiConfig.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
namespace LearningHub.Nhs.WebUI.Configuration
{
/// <summary>
/// The Moodle Settings.
/// </summary>
public class MoodleApiConfig
{
/// <summary>
/// Gets or sets the base url for the Moodle service.
/// </summary>
public string BaseUrl { get; set; } = null!;

/// <summary>
/// Gets or sets the Web service Rest Format.
/// </summary>
public string MoodleWSRestFormat { get; set; } = null!;

/// <summary>
/// Gets or sets the token.
/// </summary>
public string WSToken { get; set; } = null!;

/// <summary>
/// Gets or sets the token.
/// </summary>
public string ApiPath { get; set; } = "webservice/rest/server.php";

/// <summary>
/// Gets or sets the token.
/// </summary>
public string CoursePath { get; set; } = "course/view.php";
}
}
7 changes: 6 additions & 1 deletion LearningHub.Nhs.WebUI/Controllers/ContributeController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ public class ContributeController : BaseController
private readonly IFileService fileService;
private readonly IResourceService resourceService;
private readonly IUserService userService;
private readonly IUserGroupService userGroupService;

/// <summary>
/// Initializes a new instance of the <see cref="ContributeController"/> class.
Expand All @@ -37,6 +38,7 @@ public class ContributeController : BaseController
/// <param name="logger">Logger.</param>
/// <param name="settings">Settings.</param>
/// <param name="userService">User service.</param>
/// <param name="userGroupService"> userGroupService.</param>
/// <param name="fileService">File service.</param>
/// <param name="resourceService">Resource service.</param>
/// <param name="azureMediaService">Azure media service.</param>
Expand All @@ -48,6 +50,7 @@ public ContributeController(
ILogger<ContributeController> logger,
IOptions<Settings> settings,
IUserService userService,
IUserGroupService userGroupService,
IFileService fileService,
IResourceService resourceService,
IAzureMediaService azureMediaService,
Expand All @@ -58,6 +61,7 @@ public ContributeController(
this.authConfig = authConfig;

this.userService = userService;
this.userGroupService = userGroupService;
this.fileService = fileService;
this.resourceService = resourceService;
this.azureMediaService = azureMediaService;
Expand Down Expand Up @@ -167,7 +171,8 @@ public async Task<IActionResult> CreateVersion(int resourceId)
[Route("my-contributions/{selectedTab}/{catalogueId}/{nodeId}")]
public async Task<IActionResult> MyContributions()
{
if ((this.User.IsInRole("ReadOnly") || this.User.IsInRole("BasicUser")) && !await this.resourceService.UserHasPublishedResourcesAsync())
bool catalogueContributionPermission = await this.userGroupService.UserHasCatalogueContributionPermission();
if ((this.User.IsInRole("ReadOnly") || this.User.IsInRole("BasicUser")) || (!catalogueContributionPermission && (!await this.resourceService.UserHasPublishedResourcesAsync())))
{
return this.RedirectToAction("AccessDenied", "Home");
}
Expand Down
37 changes: 29 additions & 8 deletions LearningHub.Nhs.WebUI/Controllers/HomeController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ namespace LearningHub.Nhs.WebUI.Controllers
using LearningHub.Nhs.Models.Content;
using LearningHub.Nhs.Models.Enums.Content;
using LearningHub.Nhs.Models.Extensions;
using LearningHub.Nhs.Models.Moodle.API;
using LearningHub.Nhs.WebUI.Configuration;
using LearningHub.Nhs.WebUI.Filters;
using LearningHub.Nhs.WebUI.Helpers;
Expand Down Expand Up @@ -218,13 +219,12 @@ public async Task<IActionResult> Index(string myLearningDashboard = "my-in-progr
var cataloguesTask = this.dashboardService.GetCataloguesAsync(catalogueDashboard, 1);
var userGroupsTask = this.userGroupService.UserHasCatalogueContributionPermission();

var enrolledCoursesTask = Task.FromResult(new List<MoodleCourseResponseViewModel>());
var enableMoodle = Task.Run(() => this.featureManager.IsEnabledAsync(FeatureFlags.EnableMoodle)).Result;
this.ViewBag.EnableMoodle = enableMoodle;
this.ViewBag.ValidMoodleUser = this.CurrentMoodleUserId > 0;
var enrolledCoursesTask = Task.FromResult(new List<MoodleCourseResponseModel>());
(bool enableMoodle, int currentMoodleUserId) = await this.GetMoodleFeatureStateAsync();

if (enableMoodle && myLearningDashboard == "my-enrolled-courses")
{
enrolledCoursesTask = this.dashboardService.GetEnrolledCoursesFromMoodleAsync(this.CurrentMoodleUserId, 1);
enrolledCoursesTask = this.dashboardService.GetEnrolledCoursesFromMoodleAsync(currentMoodleUserId, 1);
}

await Task.WhenAll(learningTask, resourcesTask, cataloguesTask, userGroupsTask);
Expand Down Expand Up @@ -280,9 +280,7 @@ public async Task<IActionResult> 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 enableMoodle, int currentMoodleUserId) = await this.GetMoodleFeatureStateAsync();

bool isAjax = this.HttpContext.Request.Headers["X-Requested-With"] == "XMLHttpRequest";

Expand Down Expand Up @@ -449,5 +447,28 @@ private async Task<LandingPageViewModel> GetLandingPageContent(bool preview = fa
return new LandingPageViewModel { PageSectionDetailViewModels = new List<PageSectionDetailViewModel>(), PageViewModel = new PageViewModel { PageSections = new List<PageSectionViewModel> { } } };
}
}

/// <summary>
/// Asynchronously retrieves the state of the Moodle feature and the current Moodle user ID.
/// </summary>
/// <remarks>The method checks if the Moodle feature is enabled and retrieves the current Moodle
/// user ID. If the user ID is not already set, it attempts to obtain it asynchronously from the dashboard
/// service.</remarks>
/// <returns>A tuple containing a boolean indicating whether the Moodle feature is enabled and an integer representing
/// the current Moodle user ID.</returns>
private async Task<(bool enableMoodle, int currentMoodleUserId)> GetMoodleFeatureStateAsync()
{
var enableMoodle = Task.Run(() => this.featureManager.IsEnabledAsync(FeatureFlags.EnableMoodle)).Result;
this.ViewBag.EnableMoodle = enableMoodle;
int currentMoodleUserId = this.CurrentMoodleUserId;

if (currentMoodleUserId == 0)
{
currentMoodleUserId = await this.dashboardService.GetMoodleUserIdAsync(this.CurrentUserId);
}

this.ViewBag.ValidMoodleUser = currentMoodleUserId > 0;
return (enableMoodle, currentMoodleUserId);
}
}
}
82 changes: 0 additions & 82 deletions LearningHub.Nhs.WebUI/Helpers/ResourceTypeEnumMoodle.cs

This file was deleted.

70 changes: 3 additions & 67 deletions LearningHub.Nhs.WebUI/Helpers/UtilityHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -30,25 +30,7 @@ public static class UtilityHelper
{ "genericfile", ResourceTypeEnum.GenericFile },
{ "image", ResourceTypeEnum.Image },
{ "html", ResourceTypeEnum.Html },
};

/// TODO: Remove this method after adding to Moodle resource types to models project.
/// <summary>
/// Findwise Moodle resource type dictionary.
/// </summary>
public static readonly Dictionary<string, ResourceTypeEnumMoodle> FindwiseResourceMoodleTypeDict = new Dictionary<string, ResourceTypeEnumMoodle>()
{
{ "video", ResourceTypeEnumMoodle.Video },
{ "article", ResourceTypeEnumMoodle.Article },
{ "case", ResourceTypeEnumMoodle.Case },
{ "weblink", ResourceTypeEnumMoodle.WebLink },
{ "audio", ResourceTypeEnumMoodle.Audio },
{ "scorm", ResourceTypeEnumMoodle.Scorm },
{ "assessment", ResourceTypeEnumMoodle.Assessment },
{ "genericfile", ResourceTypeEnumMoodle.GenericFile },
{ "image", ResourceTypeEnumMoodle.Image },
{ "html", ResourceTypeEnumMoodle.Html },
{ "moodle", ResourceTypeEnumMoodle.Course },
{ "moodle", ResourceTypeEnum.Moodle },
};

/// <summary>
Expand Down Expand Up @@ -166,54 +148,6 @@ public static string GetPrettifiedResourceTypeName(ResourceTypeEnum resourceType
}
}

/// TODO: Remove this method after adding to Moodle resource types to models project.
/// <summary>
/// Returns a prettified resource type name, suitable for display in the UI. Includes video/audio duration string.
/// </summary>
/// <param name="resourceType">The resource type.</param>
/// <param name="durationInMilliseconds">The media duration in milliseconds.</param>
/// <returns>The resource type name, and duration if applicable.</returns>
public static string GetPrettifiedResourceTypeNameMoodle(ResourceTypeEnumMoodle resourceType, int? durationInMilliseconds = 0)
{
switch (resourceType)
{
case ResourceTypeEnumMoodle.Assessment:
return "Assessment";
case ResourceTypeEnumMoodle.Article:
return "Article";
case ResourceTypeEnumMoodle.Audio:
string durationText = GetDurationText(durationInMilliseconds ?? 0);
durationText = string.IsNullOrEmpty(durationText) ? string.Empty : " - " + durationText;
return "Audio" + durationText;
case ResourceTypeEnumMoodle.Equipment:
return "Equipment";
case ResourceTypeEnumMoodle.Image:
return "Image";
case ResourceTypeEnumMoodle.Scorm:
return "elearning";
case ResourceTypeEnumMoodle.Video:
durationText = GetDurationText(durationInMilliseconds ?? 0);
durationText = string.IsNullOrEmpty(durationText) ? string.Empty : " - " + durationText;
return "Video" + durationText;
case ResourceTypeEnumMoodle.WebLink:
return "Web link";
case ResourceTypeEnumMoodle.GenericFile:
return "File";
case ResourceTypeEnumMoodle.Embedded:
return "Embedded";
case ResourceTypeEnumMoodle.Case:
return "Case";
case ResourceTypeEnumMoodle.Html:
return "HTML";
case ResourceTypeEnumMoodle.Moodle:
return "Course";
case ResourceTypeEnumMoodle.Course:
return "Course";
default:
return "File";
}
}

/// <summary>
/// Returns a prettified resource type name, suitable for display in the UI. Excludes video/audio duration string.
/// </summary>
Expand Down Expand Up @@ -247,6 +181,8 @@ public static string GetPrettifiedResourceTypeName(ResourceTypeEnum resourceType
return "Case";
case ResourceTypeEnum.Html:
return "HTML";
case ResourceTypeEnum.Moodle:
return "Course";
default:
return "File";
}
Expand Down
10 changes: 9 additions & 1 deletion LearningHub.Nhs.WebUI/Interfaces/IDashboardService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
using System.Collections.Generic;
using System.Threading.Tasks;
using LearningHub.Nhs.Models.Dashboard;
using LearningHub.Nhs.Models.Moodle.API;
using LearningHub.Nhs.WebUI.Models;

/// <summary>
Expand Down Expand Up @@ -47,6 +48,13 @@ public interface IDashboardService
/// <param name="currentUserId">The current User Id type.</param>
/// <param name="pageNumber">The page Number.</param>
/// <returns>A <see cref="Task{TResult}"/> representing the result of the asynchronous operation.</returns>
Task<List<MoodleCourseResponseViewModel>> GetEnrolledCoursesFromMoodleAsync(int currentUserId, int pageNumber);
Task<List<MoodleCourseResponseModel>> GetEnrolledCoursesFromMoodleAsync(int currentUserId, int pageNumber);

/// <summary>
/// GetEnrolledCoursesFromMoodleAsync.
/// </summary>
/// <param name="currentUserId">The current User Id type.</param>
/// <returns>A <see cref="Task{TResult}"/> representing the result of the asynchronous operation.</returns>
Task<int> GetMoodleUserIdAsync(int currentUserId);
}
}
25 changes: 15 additions & 10 deletions LearningHub.Nhs.WebUI/Interfaces/IMoodleApiService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,29 +2,34 @@
{
using System.Collections.Generic;
using System.Threading.Tasks;
using LearningHub.Nhs.Models.Dashboard;
using LearningHub.Nhs.WebUI.Models;
using LearningHub.Nhs.Models.Moodle.API;
using MoodleCourseCompletionModel = LearningHub.Nhs.Models.Moodle.API.MoodleCourseCompletionModel;

/// <summary>
/// IMoodleApiService.
/// </summary>
public interface IMoodleApiService
{
/// <summary>
/// GetMoodleUserIdByUsernameAsync.
/// </summary>
/// <param name="currentUserId">The current LH User Id.</param>
/// <returns>A <see cref="Task{TResult}"/> representing the result of the asynchronous operation.</returns>
Task<int> GetMoodleUserIdByUsernameAsync(int currentUserId);

/// <summary>
/// GetEnrolledCoursesAsync.
/// </summary>
/// <param name="currentUserId">Moodle user id.</param>
/// <param name="pageNumber">pageNumber.</param>
/// <returns> List of MoodleCourseResponseViewModel.</returns>
Task<List<MoodleCourseResponseViewModel>> GetEnrolledCoursesAsync(int currentUserId, int pageNumber);
/// <returns> List of MoodleCourseResponseModel.</returns>
Task<List<MoodleCourseResponseModel>> GetEnrolledCoursesAsync(int currentUserId, int pageNumber);

/// <summary>
/// GetEnrolledCoursesAsync.
/// GetCourseUrl.
/// </summary>
/// <param name="userId">Moodle user id.</param>
/// <param name="courseId">Moodle course id.</param>
/// <param name="pageNumber">pageNumber.</param>
/// <returns> List of MoodleCourseResponseViewModel.</returns>
Task<MoodleCourseCompletionViewModel> GetCourseCompletionAsync(int userId, int courseId, int pageNumber);
/// <param name="courseId">course Id. </param>
/// <returns>return course URL.</returns>
string GetCourseUrl(int courseId);
}
}
2 changes: 1 addition & 1 deletion LearningHub.Nhs.WebUI/LearningHub.Nhs.WebUI.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@
<PackageReference Include="HtmlAgilityPack" Version="1.11.72" />
<PackageReference Include="IdentityModel" Version="4.6.0" />
<PackageReference Include="LearningHub.Nhs.Caching" Version="2.0.0" />
<PackageReference Include="LearningHub.Nhs.Models" Version="3.0.48" />
<PackageReference Include="LearningHub.Nhs.Models" Version="3.0.50" />
<PackageReference Include="linqtotwitter" Version="6.9.0" />
<PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.19.0" />
<PackageReference Include="Microsoft.ApplicationInsights.EventCounterCollector" Version="2.21.0" />
Expand Down
Loading
Loading