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
1 change: 1 addition & 0 deletions AdminUI/LearningHub.Nhs.AdminUI/Services/UserService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -337,6 +337,7 @@ public async Task<LearningHubValidationResult> SendAdminPasswordResetEmail(int u
public async Task<LearningHubValidationResult> ClearUserCachedPermissions(int userId)
{
await this.cacheService.RemoveAsync($"{userId}:AllRolesWithPermissions");
await this.cacheService.RemoveAsync($"{userId}:UserHasPublishedResources");
return new LearningHubValidationResult(true);
}

Expand Down
58 changes: 39 additions & 19 deletions LearningHub.Nhs.WebUI/Services/ResourceService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,20 @@ namespace LearningHub.Nhs.WebUI.Services
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using LearningHub.Nhs.Caching;
using LearningHub.Nhs.Models.Common;
using LearningHub.Nhs.Models.Entities.Activity;
using LearningHub.Nhs.Models.Entities.Resource;
using LearningHub.Nhs.Models.Enums;
using LearningHub.Nhs.Models.Extensions;
using LearningHub.Nhs.Models.Hierarchy;
using LearningHub.Nhs.Models.Resource;
using LearningHub.Nhs.Models.Resource.Contribute;
using LearningHub.Nhs.Models.Resource.ResourceDisplay;
using LearningHub.Nhs.Models.Validation;
using LearningHub.Nhs.WebUI.Interfaces;
using LearningHub.Nhs.WebUI.Models;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using Newtonsoft.Json;
Expand All @@ -29,20 +32,26 @@ public class ResourceService : BaseService<ResourceService>, IResourceService
{
private readonly Settings settings;
private readonly IAzureMediaService azureMediaService;
private readonly IHttpContextAccessor contextAccessor;
private readonly ICacheService cacheService;

/// <summary>
/// Initializes a new instance of the <see cref="ResourceService"/> class.
/// </summary>
/// <param name="learningHubHttpClient">Learning hub http client.</param>
/// <param name="openApiHttpClient">The Open Api Http Client.</param>
/// <param name="azureMediaService">Azure media services.</param>
/// <param name="contextAccessor">The http context accessor.</param>
/// <param name="cacheService">The cacheService.</param>
/// <param name="logger">Logger.</param>
/// <param name="settings">Settings.</param>
public ResourceService(ILearningHubHttpClient learningHubHttpClient, IOpenApiHttpClient openApiHttpClient, IAzureMediaService azureMediaService, ILogger<ResourceService> logger, IOptions<Settings> settings)
public ResourceService(ILearningHubHttpClient learningHubHttpClient, IOpenApiHttpClient openApiHttpClient, IAzureMediaService azureMediaService, IHttpContextAccessor contextAccessor, ICacheService cacheService, ILogger<ResourceService> logger, IOptions<Settings> settings)
: base(learningHubHttpClient, openApiHttpClient, logger)
{
this.settings = settings.Value;
this.azureMediaService = azureMediaService;
this.contextAccessor = contextAccessor;
this.cacheService = cacheService;
}

/// <summary>
Expand Down Expand Up @@ -885,24 +894,8 @@ public async Task<LearningHubValidationResult> UnpublishResourceVersionAsync(int
/// <returns>The <see cref="bool"/>.</returns>
public async Task<bool> UserHasPublishedResourcesAsync()
{
var client = await this.OpenApiHttpClient.GetClientAsync();

var request = $"Resource/HasPublishedResources";
var response = await client.GetAsync(request).ConfigureAwait(false);
bool hasResources = false;
if (response.IsSuccessStatusCode)
{
var result = response.Content.ReadAsStringAsync().Result;
hasResources = bool.Parse(result);
}
else if (response.StatusCode == System.Net.HttpStatusCode.Unauthorized
||
response.StatusCode == System.Net.HttpStatusCode.Forbidden)
{
throw new Exception("AccessDenied");
}

return hasResources;
var cacheKey = $"{this.contextAccessor.HttpContext.User.Identity.GetCurrentUserId()}:UserHasPublishedResources";
return await this.cacheService.GetOrFetchAsync("UserHasPublishedResources", () => this.HasPublishedResources());
}

/// <summary>
Expand Down Expand Up @@ -1340,5 +1333,32 @@ public async Task<List<string>> GetObsoleteResourceFile(int resourceVersionId, b

return filePaths;
}

/// <summary>
/// Check if the user has published resources.
/// </summary>
/// <returns>The bool.</returns>
/// <exception cref="Exception"></exception>
private async Task<bool> HasPublishedResources()
{
var client = await this.OpenApiHttpClient.GetClientAsync();

var request = $"Resource/HasPublishedResources";
var response = await client.GetAsync(request).ConfigureAwait(false);
bool hasResources = false;
if (response.IsSuccessStatusCode)
{
var result = response.Content.ReadAsStringAsync().Result;
hasResources = bool.Parse(result);
}
else if (response.StatusCode == System.Net.HttpStatusCode.Unauthorized
||
response.StatusCode == System.Net.HttpStatusCode.Forbidden)
{
throw new Exception("AccessDenied");
}

return hasResources;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -57,10 +57,19 @@ public async Task<IViewComponentResult> InvokeAsync(string navView = "Default",
var userId = this.User.Identity.GetCurrentUserId();

var (cacheExists, _) = await this.cacheService.TryGetAsync<string>($"{userId}:LoginWizard");

model = await this.permissionService.GetNavigationModelAsync(this.User, !cacheExists, controllerName);

model.NotificationCount = await this.notificationService.GetUserUnreadNotificationCountAsync(userId);
// Check if NotificationCount is already stored for this request
if (this.HttpContext.Items.TryGetValue("NotificationCount", out var cachedCount))
{
model.NotificationCount = (int)cachedCount;
}
else
{
var count = await this.notificationService.GetUserUnreadNotificationCountAsync(userId);
this.HttpContext.Items["NotificationCount"] = count;
model.NotificationCount = count;
}
}

return await Task.FromResult<IViewComponentResult>(this.View(navView, model));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ namespace LearningHub.Nhs.OpenApi.Services.Services
using LearningHub.Nhs.Models.Resource.Contribute;
using LearningHub.Nhs.Models.Resource.Files;
using LearningHub.Nhs.Models.Resource.ResourceDisplay;
using LearningHub.Nhs.Models.User;
using LearningHub.Nhs.Models.Validation;
using LearningHub.Nhs.Models.ViewModels.Helpers;
using LearningHub.Nhs.OpenApi.Models.Configuration;
Expand Down Expand Up @@ -170,7 +171,7 @@ public class ResourceService : IResourceService
/// <param name="assessmentResourceActivityMatchQuestionRepository">The repository for assessment activity-question matches.</param>
/// <param name="resourceVersionKeywordRepository">The repository for resource version keywords.</param>
/// <param name="resourceVersionValidationResultRepository">The repository for validation results of resource versions.</param>


public ResourceService(ILearningHubService learningHubService, IFileTypeService fileTypeService, IBlockCollectionRepository blockCollectionRepository, IInternalSystemService internalSystemService, IResourceVersionAuthorRepository resourceVersionAuthorRepository, IFileChunkDetailRepository fileChunkDetailRepository, IQueueCommunicatorService queueCommunicatorService, IResourceRepository resourceRepository, IResourceVersionProviderRepository resourceVersionProviderRepository, IProviderService providerService, IArticleResourceVersionFileRepository articleResourceVersionFileRepository, IPublicationRepository publicationRepository, IMigrationSourceRepository migrationSourceRepository, IQuestionBlockRepository questionBlockRepository, IVideoRepository videoRepository, IWholeSlideImageRepository wholeSlideImageRepository, IEmbeddedResourceVersionRepository embeddedResourceVersionRepository, IEquipmentResourceVersionRepository equipmentResourceVersionRepository, IImageResourceVersionRepository imageResourceVersionRepository, IBookmarkRepository bookmarkRepository, IAssessmentResourceActivityMatchQuestionRepository assessmentResourceActivityMatchQuestionRepository, IResourceVersionKeywordRepository resourceVersionKeywordRepository, IResourceVersionValidationResultRepository resourceVersionValidationResultRepository, ILogger<ResourceService> logger, IWebLinkResourceVersionRepository webLinkResourceVersionRepository, ICaseResourceVersionRepository caseResourceVersionRepository, IScormResourceVersionRepository scormResourceVersionRepository, IGenericFileResourceVersionRepository genericFileResourceVersionRepository, IResourceVersionRepository resourceVersionRepository, IHtmlResourceVersionRepository htmlResourceVersionRepository, IMapper mapper, IFileRepository fileRepository, IOptions<AzureConfig> azureConfig, IOptions<LearningHubConfig> learningHubConfig, IUserProfileService userProfileService, IResourceVersionFlagRepository resourceVersionFlagRepository, IArticleResourceVersionRepository articleResourceVersionRepository, IAudioResourceVersionRepository audioResourceVersionRepository, IVideoResourceVersionRepository videoResourceVersionRepository, IAssessmentResourceVersionRepository assessmentResourceVersionRepository, IResourceLicenceRepository resourceLicenceRepository, IResourceReferenceRepository resourceReferenceRepository, IResourceVersionUserAcceptanceRepository resourceVersionUserAcceptanceRepository, ICatalogueNodeVersionRepository catalogueNodeVersionRepository, ICachingService cachingService, ISearchService searchService, ICatalogueService catalogueService, INodeResourceRepository nodeResourceRepository, INodePathRepository nodePathRepository, IUserService userService, INodeRepository nodeRepository, IResourceSyncService resourceSyncService, IResourceSyncRepository resourceSyncRepository, IResourceVersionEventRepository resourceVersionEventRepository, LearningHubDbContext dbContext)
{
Expand Down Expand Up @@ -206,8 +207,8 @@ public ResourceService(ILearningHubService learningHubService, IFileTypeService
this.resourceVersionFlagRepository = resourceVersionFlagRepository;
this.resourceVersionUserAcceptanceRepository = resourceVersionUserAcceptanceRepository;
this.resourceVersionValidationResultRepository = resourceVersionValidationResultRepository;
this.resourceVersionKeywordRepository= resourceVersionKeywordRepository;
this.resourceVersionProviderRepository= resourceVersionProviderRepository;
this.resourceVersionKeywordRepository = resourceVersionKeywordRepository;
this.resourceVersionProviderRepository = resourceVersionProviderRepository;
this.providerService = providerService;
this.nodePathRepository = nodePathRepository;
this.nodeResourceRepository = nodeResourceRepository;
Expand Down Expand Up @@ -323,7 +324,7 @@ public async Task<List<ResourceReferenceWithResourceDetailsViewModel>> GetResour
List<ResourceActivityDTO> resourceActivities = new List<ResourceActivityDTO>() { };
List<ResourceReferenceWithResourceDetailsViewModel> resourceReferenceWithResourceDetailsViewModelLS = new List<ResourceReferenceWithResourceDetailsViewModel>() { };

resourceActivities = (await this.resourceRepository.GetResourceActivityPerResourceMajorVersion(new List<int>(){ }, new List<int>(){ currentUserId }))?.ToList() ?? new List<ResourceActivityDTO>() { };
resourceActivities = (await this.resourceRepository.GetResourceActivityPerResourceMajorVersion(new List<int>() { }, new List<int>() { currentUserId }))?.ToList() ?? new List<ResourceActivityDTO>() { };

// Removing resources that have no major versions with the required activitystatus
List<int> resourceIds = resourceActivities
Expand Down Expand Up @@ -1332,7 +1333,21 @@ public MyContributionsTotalsViewModel GetMyContributionTotals(int catalogueId, i
/// <returns>If the user has published resources.</returns>
public async Task<bool> HasPublishedResourcesAsync(int userId)
{
return await this.resourceRepository.UserHasPublishedResourcesAsync(userId);
string cacheKey = $"{userId}:UserHasPublishedResources";
var userHasPublishedResourcesInCache = await this.cachingService.GetAsync<bool>(cacheKey);
var userHasPublishedResources = false;

if (userHasPublishedResourcesInCache.ResponseEnum == CacheReadResponseEnum.Found)
{
userHasPublishedResources = userHasPublishedResourcesInCache.Item;
}
else
{
userHasPublishedResources = await this.resourceRepository.UserHasPublishedResourcesAsync(userId);
await this.cachingService.SetAsync($"{userId}:UserHasPublishedResources", userHasPublishedResources);
}

return userHasPublishedResources;
}

/// <summary>
Expand Down
Loading