diff --git a/DamageAssesmentApi/DamageAssesment.Api.Attachments/Controllers/AttachmentsController.cs b/DamageAssesmentApi/DamageAssesment.Api.Attachments/Controllers/AttachmentsController.cs index 35c41d9..db6a0b0 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Attachments/Controllers/AttachmentsController.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.Attachments/Controllers/AttachmentsController.cs @@ -142,24 +142,75 @@ namespace DamageAssesment.Api.Attachments.Controllers /// [Authorize(Roles = "admin")] [HttpGet("attachments/download/{id}")] - public async Task downloadfile1(int id) + public async Task downloadfile(int id) { try { var result = await this.AttachmentProvider.GetDownloadAttachmentAsync(id); - if(!result.IsSuccess) + if (!result.IsSuccess) return NotFound(); - byte[] fileContent = await UploadService.DownloadFile(result.Attachment.URI); - if (fileContent == null || fileContent.Length == 0) + string path = await UploadService.GetFile(result.Attachment.URI); + if (path == null) return NotFound(); - var contentType = "application/octet-stream"; - return File(fileContent, contentType, result.Attachment.FileName); + var contentType = GetContentType(result.Attachment.FileName); + if (contentType == "application/octet-stream") + return PhysicalFile(path, contentType, result.Attachment.FileName); + return PhysicalFile(path, contentType, enableRangeProcessing: true);// result.Attachment.FileName); } catch (Exception ex) { // Handle the exception here or log it return StatusCode(500, "An error occurred: " + ex.Message); } + //try + //{ + // var result = await this.AttachmentProvider.GetDownloadAttachmentAsync(id); + // if(!result.IsSuccess) + // return NotFound(); + // byte[] fileContent = await UploadService.DownloadFile(result.Attachment.URI); + // if (fileContent == null || fileContent.Length == 0) + // return NotFound(); + // var contentType = "application/octet-stream"; + // return File(fileContent, contentType, result.Attachment.FileName); + //} + //catch (Exception ex) + //{ + // // Handle the exception here or log it + // return StatusCode(500, "An error occurred: " + ex.Message); + //} + } + private string GetContentType(string fileName) + { + // You can add more content types based on the file extensions + switch (Path.GetExtension(fileName).ToLower()) + { + //case ".txt": + // return "text/plain"; + case ".jpg": + case ".jpeg": + return "image/jpeg"; + case ".png": + return "image/png"; + case ".gif": + return "image/gif"; + case ".bmp": + return "image/bmp"; + case ".webp": + return "image/webp"; + case ".csv": + return "text/csv"; + case ".pdf": + return "application/pdf"; + case ".docx": + case ".doc": + return "application/vnd.openxmlformats-officedocument.wordprocessingml.document"; + case ".xlsx": + case ".xls": + return "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; + // Add more cases as needed + default: + return "application/octet-stream"; + } } /// /// Delete an existing attachment. diff --git a/DamageAssesmentApi/DamageAssesment.Api.Attachments/Interfaces/IUploadService.cs b/DamageAssesmentApi/DamageAssesment.Api.Attachments/Interfaces/IUploadService.cs index f89653f..1d2d0e0 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Attachments/Interfaces/IUploadService.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.Attachments/Interfaces/IUploadService.cs @@ -8,6 +8,7 @@ namespace DamageAssesment.Api.Attachments.Interfaces List UploadAttachment(int responseId, int counter, List answers); public List UpdateAttachments(int responseId, List answers, IEnumerable attachments); Task DownloadFile(string path); + Task GetFile(string path); void Deletefile(string path); void Movefile(string path); } diff --git a/DamageAssesmentApi/DamageAssesment.Api.Attachments/Providers/UploadService.cs b/DamageAssesmentApi/DamageAssesment.Api.Attachments/Providers/UploadService.cs index 6e03fd0..09711b5 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Attachments/Providers/UploadService.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.Attachments/Providers/UploadService.cs @@ -24,6 +24,24 @@ namespace DamageAssesment.Api.Attachments.Providers uploadpath = configuration.GetValue("Fileupload:folderpath"); Deletepath = configuration.GetValue("Fileupload:Deletepath"); } + public async Task GetFile(string path) + { + try + { + if (System.IO.File.Exists(path)) + { + return path; + } + + return null; // File not found + } + catch (Exception ex) + { + // Handle or log the exception as needed + throw; + } + + } public async Task DownloadFile(string path) { try diff --git a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks.Test/DoculinkServiceTest.cs b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks.Test/DoculinkServiceTest.cs index a8f45d1..e30925f 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks.Test/DoculinkServiceTest.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks.Test/DoculinkServiceTest.cs @@ -197,7 +197,29 @@ namespace DamageAssesment.Api.DocuLinks.Test var result = (NotFoundResult)await DocumentProvider.DeleteDocument(1); Assert.Equal(404, result.StatusCode); } + [Fact(DisplayName = "Update Document IsActive- Ok case")] + public async Task UpdateDocumentAsync_ShouldReturnStatusCode200() + { + var mockDocumentService = new Mock(); + var mockUploadService = new Mock(); + var mockResponse = await MockData.getOkResponse(1); + mockDocumentService.Setup(service => service.UpdateDocumentAsync(1,true)).ReturnsAsync(mockResponse); + var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object); + var result = (OkObjectResult)await DocumentProvider.UpdateIsActiveDocument(1,true); + Assert.Equal(200, result.StatusCode); + } + [Fact(DisplayName = "Update Document IsActive - NotFound case")] + public async Task UpdateDocumentAsync_ShouldReturnStatusCode404() + { + var mockDocumentService = new Mock(); + var mockUploadService = new Mock(); + var mockResponse = await MockData.getNotFoundResponse(); + mockDocumentService.Setup(service => service.UpdateDocumentAsync(1,true)).ReturnsAsync(mockResponse); + var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object); + var result = (NotFoundResult)await DocumentProvider.UpdateIsActiveDocument(1,true); + Assert.Equal(404, result.StatusCode); + } // Link Type Test cases diff --git a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Controllers/DoculinkController.cs b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Controllers/DoculinkController.cs index 601134d..656c85a 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Controllers/DoculinkController.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Controllers/DoculinkController.cs @@ -15,11 +15,11 @@ namespace DamageAssesment.Api.DocuLinks.Controllers private readonly IDoculinkProvider documentsProvider; private readonly IUploadService uploadService; - public DoculinkController(IDoculinkProvider documentsProvider,IUploadService uploadService) + public DoculinkController(IDoculinkProvider documentsProvider, IUploadService uploadService) { this.documentsProvider = documentsProvider; - this.uploadService = uploadService; + this.uploadService = uploadService; } /// @@ -41,11 +41,11 @@ namespace DamageAssesment.Api.DocuLinks.Controllers /// /// Get a Doculink type by id. /// + [HttpGet] [Authorize(Roles = "admin")] [Route("doculinks/types/{id}")] [Route("doculinks/types/{id}/{language:alpha}")] - [HttpGet] - public async Task GetLinkTypeAsync(int id,string? language) + public async Task GetLinkTypeAsync(int id, string? language) { var result = await this.documentsProvider.GetLinkTypeAsync(id, language); if (result.IsSuccess) @@ -60,11 +60,11 @@ namespace DamageAssesment.Api.DocuLinks.Controllers [Authorize(Roles = "admin")] [HttpPut] [Route("doculinks/types/{id}")] - public async Task UpdateLinkType(int id,Models.LinkType linkType) + public async Task UpdateLinkType(int id, Models.LinkType linkType) { if (linkType != null) { - var result = await this.documentsProvider.UpdateLinkTypeAsync(id,linkType); + var result = await this.documentsProvider.UpdateLinkTypeAsync(id, linkType); if (result.IsSuccess) { return Ok(result.LinkType); @@ -115,24 +115,75 @@ namespace DamageAssesment.Api.DocuLinks.Controllers /// [Authorize(Roles = "admin")] [HttpGet("doculinks/download/{id}")] - public async Task downloadfile1(int id) + public async Task downloadfile(int id) { try { var result = await this.documentsProvider.GetDownloadAttachmentAsync(id); if (!result.IsSuccess) return NotFound(); - byte[] fileContent = await uploadService.DownloadFile(result.DoculinkAttachments.Path); - if (fileContent == null || fileContent.Length == 0) + string path = await uploadService.GetFile(result.DoculinkAttachments.Path); + if (path == null) return NotFound(); - var contentType = "application/octet-stream"; - return File(fileContent, contentType, result.DoculinkAttachments.docName); + var contentType = GetContentType(result.DoculinkAttachments.docName); + if (contentType == "application/octet-stream") + return PhysicalFile(path, contentType, result.DoculinkAttachments.docName); + return PhysicalFile(path, contentType, enableRangeProcessing: true); } catch (Exception ex) { // Handle the exception here or log it return StatusCode(500, "An error occurred: " + ex.Message); } + //try + //{ + // var result = await this.documentsProvider.GetDownloadAttachmentAsync(id); + // if (!result.IsSuccess) + // return NotFound(); + // byte[] fileContent = await uploadService.DownloadFile(result.DoculinkAttachments.Path); + // if (fileContent == null || fileContent.Length == 0) + // return NotFound(); + // var contentType = "application/octet-stream"; + // return File(fileContent, contentType, result.DoculinkAttachments.docName); + //} + //catch (Exception ex) + //{ + // // Handle the exception here or log it + // return StatusCode(500, "An error occurred: " + ex.Message); + //} + } + private string GetContentType(string fileName) + { + // You can add more content types based on the file extensions + switch (Path.GetExtension(fileName).ToLower()) + { + //case ".txt": + // return "text/plain"; + case ".jpg": + case ".jpeg": + return "image/jpeg"; + case ".png": + return "image/png"; + case ".gif": + return "image/gif"; + case ".bmp": + return "image/bmp"; + case ".webp": + return "image/webp"; + case ".csv": + return "text/csv"; + case ".pdf": + return "application/pdf"; + case ".docx": + case ".doc": + return "application/vnd.openxmlformats-officedocument.wordprocessingml.document"; + case ".xlsx": + case ".xls": + return "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; + // Add more cases as needed + default: + return "application/octet-stream"; + } } /// /// Get all Doculink. @@ -143,7 +194,7 @@ namespace DamageAssesment.Api.DocuLinks.Controllers [Route("doculinks/{linktype:alpha}")] [Route("doculinks/{linktype:alpha}/{language:alpha}")] [HttpGet] - public async Task GetDocumentsAsync(string? linktype, string? language,bool? isactive) + public async Task GetDocumentsAsync(string? linktype, string? language, bool? isactive) { var result = await this.documentsProvider.GetdocumentsByLinkAsync(linktype, language, isactive); if (result.IsSuccess) @@ -162,7 +213,7 @@ namespace DamageAssesment.Api.DocuLinks.Controllers [HttpGet] public async Task GetDocumentsByActiveAsync(string? linktype, string? language) { - var result = await this.documentsProvider.GetdocumentsByLinkAsync(linktype, language,true); + var result = await this.documentsProvider.GetdocumentsByLinkAsync(linktype, language, true); if (result.IsSuccess) { return Ok(result.documents); @@ -193,7 +244,7 @@ namespace DamageAssesment.Api.DocuLinks.Controllers [Route("doculinks/{id}")] [Route("doculinks/{id}/{linktype:alpha}")] [Route("doculinks/{id}/{linktype:alpha}/{language:alpha}")] - public async Task GetDocumentAsync(int id,string? linktype, string? language) + public async Task GetDocumentAsync(int id, string? linktype, string? language) { var result = await this.documentsProvider.GetDocumentAsync(id, linktype, language); if (result.IsSuccess) @@ -208,7 +259,7 @@ namespace DamageAssesment.Api.DocuLinks.Controllers [Authorize(Roles = "admin")] [HttpPut] [Route("doculinks/{id}")] - public async Task UpdateDocument(int id,ReqDoculink documentInfo) + public async Task UpdateDocument(int id, ReqDoculink documentInfo) { if (documentInfo != null) { @@ -216,7 +267,7 @@ namespace DamageAssesment.Api.DocuLinks.Controllers if (dbdoc.IsSuccess) { var documents = await this.documentsProvider.GetDocumentCounter(); - Models.Doculink DocuLink= uploadService.UpdateDocuments(documents.counter,dbdoc.Document, documentInfo); + Models.Doculink DocuLink = uploadService.UpdateDocuments(documents.counter, dbdoc.Document, documentInfo); var result = await this.documentsProvider.UpdateDocumentAsync(id, DocuLink); if (result.IsSuccess) { @@ -229,6 +280,20 @@ namespace DamageAssesment.Api.DocuLinks.Controllers return BadRequest(documentInfo); } /// + /// update existing doclink isactive field. + /// + [HttpPut] + [Route("doculinks/{id}/{isactive}")] + public async Task UpdateIsActiveDocument(int id, bool isactive) + { + var result = await this.documentsProvider.UpdateDocumentAsync(id, isactive); + if (result.IsSuccess) + { + return Ok(result.Document); + } + return NotFound(); + } + /// /// Create new doclink. /// [Authorize(Roles = "admin")] @@ -241,7 +306,7 @@ namespace DamageAssesment.Api.DocuLinks.Controllers if (documentInfo != null) { var documents = await this.documentsProvider.GetDocumentCounter(); - Models.Doculink DocuLink= uploadService.UploadDocument(documents.counter, documentInfo); + Models.Doculink DocuLink = uploadService.UploadDocument(documents.counter, documentInfo); var result = await this.documentsProvider.PostDocumentAsync(DocuLink); if (result.IsSuccess) { @@ -277,6 +342,6 @@ namespace DamageAssesment.Api.DocuLinks.Controllers } return NotFound(); } - + } } diff --git a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Interfaces/IDoculinkProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Interfaces/IDoculinkProvider.cs index 22f0fe6..d873bbe 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Interfaces/IDoculinkProvider.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Interfaces/IDoculinkProvider.cs @@ -11,6 +11,7 @@ namespace DamageAssesment.Api.DocuLinks.Interfaces Task<(bool IsSuccess, IEnumerable documents, string ErrorMessage)> GetdocumentsByLinkTypeIdAsync(int? linkTypeId, string? language, bool? isactive); Task<(bool IsSuccess, Models.ResDoculink Document, string ErrorMessage)> PostDocumentAsync(Models.Doculink Document); Task<(bool IsSuccess, Models.ResDoculink Document, string ErrorMessage)> UpdateDocumentAsync(int id, Models.Doculink Document); + Task<(bool IsSuccess, Models.ResDoculink Document, string ErrorMessage)> UpdateDocumentAsync(int id, bool isactive); Task<(bool IsSuccess, Models.ResDoculink Document, string ErrorMessage)> DeleteDocumentAsync(int id); Task<(bool IsSuccess, Models.DoculinkAttachments DoculinkAttachments, string Path)> GetDownloadAttachmentAsync(int id); Task<(bool IsSuccess, int counter, string message)> GetDocumentCounter(); diff --git a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Interfaces/IUploadService.cs b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Interfaces/IUploadService.cs index 4fbc5ee..63c00aa 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Interfaces/IUploadService.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Interfaces/IUploadService.cs @@ -8,6 +8,7 @@ namespace DamageAssesment.Api.DocuLinks.Interfaces public Models.Doculink UpdateDocuments(int counter, Models.Doculink document, ReqDoculink documentInfo); void Deletefile(string path); Task DownloadFile(string path); + Task GetFile(string path); void Movefile(string path); } } diff --git a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Providers/DoculinkProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Providers/DoculinkProvider.cs index 30d3103..b7c119d 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Providers/DoculinkProvider.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Providers/DoculinkProvider.cs @@ -453,6 +453,35 @@ namespace DamageAssesment.Api.DocuLinks.Providers return (false, null, ex.Message); } } + public async Task<(bool IsSuccess, Models.ResDoculink Document, string ErrorMessage)> UpdateDocumentAsync(int id,bool isactive) + { + + try + { + Db.Doculink Document = DocumentDbContext.Documents.AsNoTracking().Where(a => a.Id == id).FirstOrDefault(); + if (Document == null) + { + return (false, null, "Not Found"); + } + Document.IsActive = isactive; + DocumentDbContext.Documents.Update(Document); + DocumentDbContext.SaveChanges(); + var result = mapper.Map(Document); + var multilan = CreateMultiLanguageObject(GetDocumentTranslations(Document.Id, "")); + result.titles = multilan.titles; + result.description = multilan.description; + result.linktypes = CreateMultiLanguageLinkTypeObject(GetLinkTypeTranslations(result.linkTypeId, "")); + result.doclinksAttachments = mapper.Map, List>( + DocumentDbContext.DoclinksAttachments.AsNoTracking().Where(a => a.DocumentId == id).ToList()); + return (true, result, $"DocumentId {id} deleted Successfuly"); + } + catch (Exception ex) + { + + logger?.LogError(ex.ToString()); + return (false, null, ex.Message); + } + } public async Task<(bool IsSuccess, Models.ResDoculink Document, string ErrorMessage)> DeleteDocumentAsync(int id) { diff --git a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Providers/UploadService.cs b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Providers/UploadService.cs index 47c1e24..a916a1b 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Providers/UploadService.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Providers/UploadService.cs @@ -25,6 +25,24 @@ namespace DamageAssesment.Api.DocuLinks.Providers uploadpath = configuration.GetValue("Fileupload:folderpath"); Deletepath = configuration.GetValue("Fileupload:Deletepath"); } + public async Task GetFile(string path) + { + try + { + if (System.IO.File.Exists(path)) + { + return path; + } + + return null; // File not found + } + catch (Exception ex) + { + // Handle or log the exception as needed + throw; + } + + } public async Task DownloadFile(string path) { try