Skip to content

Commit eb64dce

Browse files
authored
Merge pull request #356 from TechnologyEnhancedLearning/RC
Rc
2 parents 272c41b + e95ee3d commit eb64dce

File tree

4 files changed

+154
-64
lines changed

4 files changed

+154
-64
lines changed

LearningHub.Nhs.WebUI/Controllers/Api/ContributeController.cs

Lines changed: 31 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -493,12 +493,12 @@ public async Task<ActionResult> SaveWeblinkDetailAsync([FromBody] WebLinkViewMod
493493
public async Task<ActionResult> SaveCaseDetailAsync([FromBody] CaseViewModel request)
494494
{
495495
var existingResourceState = await this.resourceService.GetResourceVersionExtendedAsync(request.ResourceVersionId);
496-
int resourceVersionId = await this.contributeService.SaveCaseDetailAsync(request);
497-
if (existingResourceState.CaseDetails?.BlockCollection != null)
496+
if (existingResourceState?.CaseDetails?.BlockCollection != null)
498497
{
499-
this.RemoveBlockCollectionFiles(existingResourceState.CaseDetails.BlockCollection, request.BlockCollection);
498+
await this.RemoveBlockCollectionFiles(request.ResourceVersionId, existingResourceState.CaseDetails.BlockCollection, request.BlockCollection);
500499
}
501500

501+
int resourceVersionId = await this.contributeService.SaveCaseDetailAsync(request);
502502
return this.Ok(resourceVersionId);
503503
}
504504

@@ -512,12 +512,12 @@ public async Task<ActionResult> SaveCaseDetailAsync([FromBody] CaseViewModel req
512512
public async Task<ActionResult> SaveAssessmentDetailAsync([FromBody] AssessmentViewModel request)
513513
{
514514
var existingResourceState = await this.resourceService.GetResourceVersionExtendedAsync(request.ResourceVersionId);
515-
int resourceVersionId = await this.contributeService.SaveAssessmentDetailAsync(request);
516515
if (existingResourceState != null && existingResourceState.AssessmentDetails != null)
517516
{
518-
this.RemoveBlockCollectionFiles(existingResourceState.AssessmentDetails, request);
517+
await this.RemoveBlockCollectionFiles(request.ResourceVersionId, existingResourceState.AssessmentDetails, request);
519518
}
520519

520+
int resourceVersionId = await this.contributeService.SaveAssessmentDetailAsync(request);
521521
return this.Ok(resourceVersionId);
522522
}
523523

@@ -638,23 +638,24 @@ private async Task<bool> UserCanEditCatalogue(int catalogueId)
638638
return await this.catalogueService.CanCurrentUserEditCatalogue(catalogueId);
639639
}
640640

641-
private void RemoveBlockCollectionFiles(AssessmentViewModel existingModel, AssessmentViewModel newModel)
641+
private async Task RemoveBlockCollectionFiles(int resourceVersionId, AssessmentViewModel existingModel, AssessmentViewModel newModel)
642642
{
643643
if (existingModel is { EndGuidance: { } } && existingModel.EndGuidance.Blocks != null)
644644
{
645-
this.RemoveBlockCollectionFiles(existingModel.EndGuidance, newModel.EndGuidance);
645+
await this.RemoveBlockCollectionFiles(resourceVersionId, existingModel.EndGuidance, newModel.EndGuidance);
646646
}
647647

648648
if (existingModel is { AssessmentContent: { } } && existingModel.AssessmentContent.Blocks != null)
649649
{
650-
this.RemoveBlockCollectionFiles(existingModel.AssessmentContent, newModel.AssessmentContent);
650+
await this.RemoveBlockCollectionFiles(resourceVersionId, existingModel.AssessmentContent, newModel.AssessmentContent);
651651
}
652652
}
653653

654-
private void RemoveBlockCollectionFiles(BlockCollectionViewModel existingResource, BlockCollectionViewModel newResource)
654+
private async Task RemoveBlockCollectionFiles(int resourceVersionId, BlockCollectionViewModel existingResource, BlockCollectionViewModel newResource)
655655
{
656656
try
657657
{
658+
var obsoleteFiles = await this.resourceService.GetObsoleteResourceFile(resourceVersionId, true);
658659
var filePaths = new List<string>();
659660
if (existingResource != null)
660661
{
@@ -706,8 +707,8 @@ private void RemoveBlockCollectionFiles(BlockCollectionViewModel existingResourc
706707
{
707708
foreach (var oldblock in existingImages)
708709
{
709-
var entry = newBlocks.FirstOrDefault(x => x.BlockType == BlockType.Media && x.MediaBlock != null && x.MediaBlock.MediaType == MediaType.Image && x.MediaBlock.Image != null && x.MediaBlock?.Image?.File?.FileId == oldblock.MediaBlock?.Image?.File?.FileId);
710-
if (entry == null)
710+
var entry = newBlocks.FirstOrDefault(x => x.BlockType == BlockType.Media && x.MediaBlock != null && x.MediaBlock.MediaType == MediaType.Image && x.MediaBlock.Image != null && x.MediaBlock?.Image?.File?.FileId == oldblock.MediaBlock?.Image?.File?.FileId);
711+
if (entry == null)
711712
{
712713
filePaths.Add(oldblock?.MediaBlock?.Image?.File?.FilePath);
713714
}
@@ -771,7 +772,18 @@ private void RemoveBlockCollectionFiles(BlockCollectionViewModel existingResourc
771772

772773
if (filePaths != null && filePaths.Any())
773774
{
774-
_ = Task.Run(async () => { await this.fileService.PurgeResourceFile(null, filePaths); });
775+
var deleteList = new List<string>();
776+
foreach (var e in filePaths)
777+
{
778+
if (!obsoleteFiles.Contains(e))
779+
{
780+
continue;
781+
}
782+
783+
deleteList.Add(e);
784+
}
785+
786+
_ = Task.Run(async () => { await this.fileService.PurgeResourceFile(null, deleteList); });
775787
}
776788
}
777789
catch (Exception ex)
@@ -838,12 +850,15 @@ private List<string> CheckQuestionBlock(BlockCollectionViewModel model)
838850
}
839851
else if (questionBlock.BlockType == BlockType.WholeSlideImage && questionBlock.WholeSlideImageBlock != null)
840852
{
841-
var existingWholeSlideImages = questionBlock.WholeSlideImageBlock.WholeSlideImageBlockItems.ToList();
842-
if (existingWholeSlideImages.Any())
853+
var existingWholeSlideImages = questionBlock.WholeSlideImageBlock?.WholeSlideImageBlockItems;
854+
if (existingWholeSlideImages != null && existingWholeSlideImages.Any())
843855
{
844856
foreach (var wsi in existingWholeSlideImages)
845857
{
846-
filePath.Add(wsi.WholeSlideImage?.File?.FilePath);
858+
if (wsi.WholeSlideImage != null && wsi.WholeSlideImage.File != null)
859+
{
860+
filePath.Add(wsi.WholeSlideImage.File.FilePath);
861+
}
847862
}
848863
}
849864
}
@@ -888,7 +903,7 @@ private List<string> CheckQuestionBlock(BlockCollectionViewModel model)
888903
}
889904
}
890905

891-
return filePath;
906+
return filePath.Where(x => x != null).ToList();
892907
}
893908
}
894909
}

WebAPI/LearningHub.Nhs.Database/Stored Procedures/Resources/GetDashboardResources.sql

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
-- 17 Jan 2024 SA Changes to accomadate activity status changes
1919
-- 27 Feb 2024 SS Fixed missing In progress resources in the My Accessed Learning tray issue
2020
-- 2 May 2024 SA Fixed the issue on showing statuses on 'My accessed Learning' for resource type file
21+
-- 13 May 2024 SA TD-4115
2122
-------------------------------------------------------------------------------
2223

2324
CREATE PROCEDURE [resources].[GetDashboardResources]
@@ -226,7 +227,7 @@ BEGIN
226227
INSERT INTO @MyActivity
227228
SELECT TOP (@MaxRows) ra.ResourceId, MAX(ra.Id) ResourceActivityId
228229
FROM
229-
(SELECT a.* FROM activity.ResourceActivity a INNER JOIN (SELECT ResourceId, MAX(Id) as id FROM activity.ResourceActivity GROUP BY ResourceId,ActivityStatusId ) AS b ON a.ResourceId = b.ResourceId AND a.id = b.id order by a.Id desc OFFSET 0 ROWS) ra
230+
(SELECT a.* FROM activity.ResourceActivity a INNER JOIN (SELECT ResourceId, MAX(Id) as id FROM activity.ResourceActivity GROUP BY ResourceId) AS b ON a.ResourceId = b.ResourceId AND a.id = b.id order by a.Id desc OFFSET 0 ROWS) ra
230231
JOIN [resources].[Resource] r ON ra.ResourceId = r.Id
231232
JOIN [resources].[ResourceVersion] rv ON rv.Id = ra.ResourceVersionId
232233
LEFT JOIN [resources].[AssessmentResourceVersion] arv ON arv.ResourceVersionId = ra.ResourceVersionId
@@ -239,11 +240,12 @@ BEGIN
239240
OR (r.ResourceTypeId IN (2, 7) AND (mar.Id IS NULL OR (mar.Id IS NOT NULL AND mar.PercentComplete < 100) OR ra.ActivityStart < '2020-09-07 00:00:00 +00:00'))
240241
OR (r.ResourceTypeId = 6 AND (sa.CmiCoreLesson_status NOT IN (3, 5) AND (ra.ActivityStatusId NOT IN(3, 5))))
241242
OR (r.ResourceTypeId IN (9) AND ra.ActivityStatusId NOT IN (3))
242-
OR (r.ResourceTypeId = 11 AND ((ara.Id IS NOT NULL AND ara.score < arv.PassMark) OR ra.ActivityStatusId = 7))
243+
OR ((r.ResourceTypeId = 11 AND arv.AssessmentType = 2) AND ((ara.Id IS NOT NULL AND ara.score < arv.PassMark) OR ra.ActivityStatusId IN (7)))
244+
OR ((r.ResourceTypeId = 11 AND arv.AssessmentType = 1) AND ra.ActivityStatusId IN (7))
243245
)
244246
GROUP BY ra.ResourceId
245247
ORDER BY ResourceActivityId DESC
246-
248+
247249
SELECT ma.ResourceActivityId, r.Id AS ResourceId
248250
,( SELECT TOP 1 rr.OriginalResourceReferenceId
249251
FROM [resources].[ResourceReference] rr
@@ -385,7 +387,8 @@ BEGIN
385387
AND (
386388
(r.ResourceTypeId IN (2, 7) AND ra.ActivityStatusId IN (3) OR ra.ActivityStart < '2020-09-07 00:00:00 +00:00' OR mar.Id IS NOT NULL AND mar.PercentComplete = 100)
387389
OR (r.ResourceTypeId = 6 AND (sa.CmiCoreLesson_status IN(3,5) OR (ra.ActivityStatusId IN(3, 5))))
388-
OR (r.ResourceTypeId = 11 AND ara.Score >= arv.PassMark OR ra.ActivityStatusId IN(3, 5))
390+
OR ((r.ResourceTypeId = 11 AND arv.AssessmentType = 2) AND (ara.Score >= arv.PassMark OR ra.ActivityStatusId IN(3, 5)))
391+
OR ((r.ResourceTypeId = 11 AND arv.AssessmentType =1) AND (ara.Score >= arv.PassMark AND ra.ActivityStatusId IN(3, 5)))
389392
OR (r.ResourceTypeId IN (1, 5, 8, 9, 10, 12) AND ra.ActivityStatusId IN (3)))
390393
GROUP BY ra.ResourceId
391394
ORDER BY ResourceActivityId DESC

WebAPI/LearningHub.Nhs.Services/MyLearningService.cs

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -169,8 +169,13 @@ public async Task<Tuple<int, MyLearningDetailedItemViewModel>> GetResourceCertif
169169
activityEntities.RemoveAll(x => x.Resource.ResourceTypeEnum == ResourceTypeEnum.Scorm && (x.ActivityStatusId == (int)ActivityStatusEnum.Downloaded || x.ActivityStatusId == (int)ActivityStatusEnum.Incomplete || x.ActivityStatusId == (int)ActivityStatusEnum.InProgress));
170170
if (activityEntities.Any() && activityEntities.FirstOrDefault()?.Resource.ResourceTypeEnum == ResourceTypeEnum.Assessment)
171171
{
172+
totalNumberOfAccess = activityQuery.SelectMany(x => x.AssessmentResourceActivity).OrderByDescending(a => a.CreateDate).ToList().Count();
172173
activityEntities = activityEntities.Where(x => x.AssessmentResourceActivity.FirstOrDefault() != null && x.AssessmentResourceActivity.FirstOrDefault().Score.HasValue && ((int)Math.Round(x.AssessmentResourceActivity.FirstOrDefault().Score.Value, MidpointRounding.AwayFromZero) >= x.ResourceVersion.AssessmentResourceVersion.PassMark)).ToList();
173174
}
175+
else if (activityEntities.Any() && (activityEntities.FirstOrDefault()?.Resource.ResourceTypeEnum == ResourceTypeEnum.Video || activityEntities.FirstOrDefault()?.Resource.ResourceTypeEnum == ResourceTypeEnum.Audio))
176+
{
177+
totalNumberOfAccess = activityQuery.SelectMany(x => x.MediaResourceActivity).OrderByDescending(a => a.CreateDate).ToList().Count();
178+
}
174179

175180
if (activityEntities.Any())
176181
{
@@ -271,9 +276,19 @@ public async Task<List<MyLearningDetailedItemViewModel>> PopulateMyLearningDetai
271276
expectedActivity = latestActivityCheck.Where(x => x.Id == resourceActivity.Id && (x.ActivityStatusId == ((int)ActivityStatusEnum.Completed) || x.ActivityStatusId == ((int)ActivityStatusEnum.Incomplete) || x.ActivityStatusId == ((int)ActivityStatusEnum.Passed) || x.ActivityStatusId == ((int)ActivityStatusEnum.Downloaded))).OrderByDescending(x => x.ActivityStart).FirstOrDefault();
272277
}
273278

274-
if (latestActivityCheck.Any() && expectedActivity != null && resourceActivity.ResourceVersion.CertificateEnabled == true)
279+
if (latestActivityCheck.Any() && expectedActivity != null)
275280
{
276-
viewModel.CertificateEnabled = true;
281+
bool isExpectedActivityIdMatched = false;
282+
if (resourceActivity.Resource.ResourceTypeEnum == ResourceTypeEnum.Audio || resourceActivity.Resource.ResourceTypeEnum == ResourceTypeEnum.Video)
283+
{
284+
isExpectedActivityIdMatched = latestActivityCheck.OrderByDescending(x => x.ActivityStart).FirstOrDefault().Id == expectedActivity.LaunchResourceActivityId;
285+
}
286+
else
287+
{
288+
isExpectedActivityIdMatched = latestActivityCheck.OrderByDescending(x => x.ActivityStart).FirstOrDefault().Id == expectedActivity.Id;
289+
}
290+
291+
viewModel.CertificateEnabled = isExpectedActivityIdMatched && resourceActivity.ResourceVersion.CertificateEnabled.GetValueOrDefault(false);
277292
}
278293
else
279294
{
@@ -490,7 +505,7 @@ private IQueryable<ResourceActivity> ApplyFilters(IQueryable<ResourceActivity> q
490505

491506
if (requestModel.CertificateEnabled)
492507
{
493-
query = query.Where(x => x.ResourceVersion.CertificateEnabled.Equals(true));
508+
query = query.Where(x => x.ResourceVersion.CertificateEnabled.Equals(true));
494509
}
495510

496511
return query;

0 commit comments

Comments
 (0)