From 8e8cbcdea429537b8c7fa099d6f530546a47f830 Mon Sep 17 00:00:00 2001 From: Oluwatobi Awe Date: Sun, 16 Jun 2024 23:56:35 +0100 Subject: [PATCH] TD-4226 storage update --- .../Controllers/Api/ResourceController.cs | 28 ++++++++++++++++ .../Scripts/vuesrc/contribute/Content.vue | 32 +++++++++++++++++++ .../Scripts/vuesrc/data/resource.ts | 27 +++++++++++++++- .../ResourceService.cs | 6 ++-- 4 files changed, 89 insertions(+), 4 deletions(-) diff --git a/LearningHub.Nhs.WebUI/Controllers/Api/ResourceController.cs b/LearningHub.Nhs.WebUI/Controllers/Api/ResourceController.cs index 7f0c1feee..048f1a426 100644 --- a/LearningHub.Nhs.WebUI/Controllers/Api/ResourceController.cs +++ b/LearningHub.Nhs.WebUI/Controllers/Api/ResourceController.cs @@ -1,6 +1,7 @@ namespace LearningHub.Nhs.WebUI.Controllers.Api { using System; + using System.Collections.Generic; using System.Threading.Tasks; using LearningHub.Nhs.Models.Enums; using LearningHub.Nhs.Models.Resource; @@ -557,5 +558,32 @@ public async Task DeleteResourceProviderAsync(int resourceVersionI var validationResult = await this.resourceService.DeleteAllResourceVersionProviderAsync(resourceVersionId); return this.Ok(validationResult); } + + /// + /// The ArchiveResourceFile. + /// + /// filePaths. + /// A representing the asynchronous operation. + [HttpPost] + [Route("ArchiveResourceFile")] + public ActionResult ArchiveResourceFile(List filePaths) + { + _ = Task.Run(async () => { await this.fileService.PurgeResourceFile(null, filePaths); }); + return this.Ok(); + } + + /// + /// The GetObsoleteResourceFile. + /// + /// The resourceVersionId. + /// . + /// The . + [HttpGet] + [Route("GetObsoleteResourceFile/{resourceVersionId}/{deletedResource}")] + public async Task> GetObsoleteResourceFile(int resourceVersionId, bool deletedResource) + { + var result = await this.resourceService.GetObsoleteResourceFile(resourceVersionId, deletedResource); + return result; + } } } diff --git a/LearningHub.Nhs.WebUI/Scripts/vuesrc/contribute/Content.vue b/LearningHub.Nhs.WebUI/Scripts/vuesrc/contribute/Content.vue index a74f8443a..154d78e98 100644 --- a/LearningHub.Nhs.WebUI/Scripts/vuesrc/contribute/Content.vue +++ b/LearningHub.Nhs.WebUI/Scripts/vuesrc/contribute/Content.vue @@ -502,6 +502,8 @@ showError: false, errorMessage: '', contributeResourceAVFlag: true, + filePathBeforeFileChange: [] as string[], + filePathAfterFileChange: [] as string[] } }, computed: { @@ -837,6 +839,19 @@ if (uploadResult.resourceType === ResourceType.SCORM) { this.$store.commit('populateScormDetails', uploadResult.resourceVersionId); } + + if (this.filePathBeforeFileChange.length > 0) { + this.getResourceFilePath('completed'); + if (this.filePathBeforeFileChange.length > 0 && this.filePathAfterFileChange.length > 0) { + let filePaths = this.filePathBeforeFileChange.filter(item => !this.filePathAfterFileChange.includes(item)); + if (filePaths.length > 0) { + resourceData.archiveResourceFile(filePaths); + this.filePathBeforeFileChange.length = 0; + this.filePathAfterFileChange.length = 0; + } + } + } + } else { this.fileUploadServerError = 'There was a problem uploading this file to the Learning Hub. Please try again and if it still does not upload, contact the support team.'; this.$store.commit('setSaveStatus', ''); @@ -894,6 +909,7 @@ }, fileChangedScorm() { (this.$refs.fileUploadScorm as any).click(); + this.getResourceFilePath('initialised'); }, childResourceFileChanged(newFile: File) { this.uploadingFile = newFile; @@ -943,6 +959,7 @@ fileChanged() { this.fileUploadRef.value = null; this.fileUploadRef.click(); + this.getResourceFilePath('initialised'); }, childFileUploadError(errorType: FileErrorTypeEnum, customError: string) { this.fileErrorType = errorType; @@ -1015,6 +1032,21 @@ break; } return errorTitle; + }, + async getResourceFilePath(fileChangeStatus: string) { + let resource = this.$store.state.resourceDetail; + if (resource != null && resource.resourceVersionId > 0 &&(resource.resourceType != this.resourceType.CASE || resource.resourceType != this.resourceType.ASSESSMENT)) + { + await resourceData.getObsoleteResourceFile(resource.resourceVersionId).then(response => { + if (fileChangeStatus == 'initialised') { + this.filePathBeforeFileChange = response; + } + else if (fileChangeStatus == 'completed') { + this.filePathAfterFileChange = response; + } + }); + } + } }, validations: { diff --git a/LearningHub.Nhs.WebUI/Scripts/vuesrc/data/resource.ts b/LearningHub.Nhs.WebUI/Scripts/vuesrc/data/resource.ts index 738b53ca2..c29f48dd8 100644 --- a/LearningHub.Nhs.WebUI/Scripts/vuesrc/data/resource.ts +++ b/LearningHub.Nhs.WebUI/Scripts/vuesrc/data/resource.ts @@ -535,6 +535,29 @@ const getAVUnavailableView = async function (): Promise { }); }; +const getObsoleteResourceFile = async function (id: number): Promise { + return await AxiosWrapper.axios.get('/api/Resource/GetObsoleteResourceFile/' + id + '/' + true + `?timestamp=${new Date().getTime()}`) + .then(response => { + console.log(response.data); + return response.data; + }) + .catch(e => { + console.log('getObsoleteResourceFiles:' + e); + throw e; + }); +}; + +const archiveResourceFile = async function (filepaths: string[]): Promise { + const params = {filePaths:filepaths}; + return await AxiosWrapper.axios.post('/api/Resource/DuplicateBlocks', params).then(() => { + return true + }).catch(e => { + console.log('archiveResourceFile:' + e); + throw e; + }); +}; + + export const resourceData = { getContributeConfiguration, getContributeSettings, @@ -575,5 +598,7 @@ export const resourceData = { getMyContributions, getContributeAVResourceFlag, getDisplayAVResourceFlag, - getAVUnavailableView + getAVUnavailableView, + getObsoleteResourceFile, + archiveResourceFile }; \ No newline at end of file diff --git a/WebAPI/LearningHub.Nhs.Services/ResourceService.cs b/WebAPI/LearningHub.Nhs.Services/ResourceService.cs index 6d6220122..9335b5f42 100644 --- a/WebAPI/LearningHub.Nhs.Services/ResourceService.cs +++ b/WebAPI/LearningHub.Nhs.Services/ResourceService.cs @@ -1411,7 +1411,7 @@ where deletableCaseFiles.Contains(entry) var rvs = await this.resourceVersionRepository.GetResourceVersionsAsync(resourceVersion.ResourceId); rvs = rvs.Where(x => x.Id != resourceVersionId && x.PublicationId > 0).OrderByDescending(x => x.PublicationId).ToList(); var rv = rvs.FirstOrDefault(); - var extendedResourceVersion = await this.GetResourceVersionExtendedViewModelAsync(rv.Id); + var extendedResourceVersion = rv != null ? await this.GetResourceVersionExtendedViewModelAsync(rv.Id) : null; switch (resourceVersion.ResourceType) { case ResourceTypeEnum.Scorm: @@ -1432,7 +1432,7 @@ where deletableCaseFiles.Contains(entry) } else if (rv == null && deletedResource) { - retVal.Add(scormResource.ContentFilePath); + retVal.Add(scormResource?.File?.FilePath); } break; @@ -1454,7 +1454,7 @@ where deletableCaseFiles.Contains(entry) } else if (rv == null && deletedResource) { - retVal.Add(htmlResource.ContentFilePath); + retVal.Add(htmlResource?.File?.FilePath); } break;