diff --git a/DamageAssesmentApi/DamageAssesment.Api.Attachments/Controllers/AttachmentsController.cs b/DamageAssesmentApi/DamageAssesment.Api.Attachments/Controllers/AttachmentsController.cs
index 16c223c..e2fbe25 100644
--- a/DamageAssesmentApi/DamageAssesment.Api.Attachments/Controllers/AttachmentsController.cs
+++ b/DamageAssesmentApi/DamageAssesment.Api.Attachments/Controllers/AttachmentsController.cs
@@ -136,6 +136,80 @@ namespace DamageAssesment.Api.Attachments.Controllers
}
}
///
+ /// download an existing attachment.
+ ///
+ [HttpGet("attachments/download/{id}")]
+ public async Task downloadfile(int id)
+ {
+ try
+ {
+ var result = await this.AttachmentProvider.GetDownloadAttachmentAsync(id);
+ if (!result.IsSuccess)
+ return NotFound();
+ string path = await UploadService.GetFile(result.Attachment.URI);
+ if (path == null)
+ return NotFound();
+ 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.
///
[HttpDelete("attachments/{id}")]
diff --git a/DamageAssesmentApi/DamageAssesment.Api.Attachments/Interfaces/IUploadService.cs b/DamageAssesmentApi/DamageAssesment.Api.Attachments/Interfaces/IUploadService.cs
index f645593..1d2d0e0 100644
--- a/DamageAssesmentApi/DamageAssesment.Api.Attachments/Interfaces/IUploadService.cs
+++ b/DamageAssesmentApi/DamageAssesment.Api.Attachments/Interfaces/IUploadService.cs
@@ -7,6 +7,8 @@ namespace DamageAssesment.Api.Attachments.Interfaces
List UploadAttachment(int responseId,int answerId, int counter, List postedFile);
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 8c9045c..c64b66a 100644
--- a/DamageAssesmentApi/DamageAssesment.Api.Attachments/Providers/UploadService.cs
+++ b/DamageAssesmentApi/DamageAssesment.Api.Attachments/Providers/UploadService.cs
@@ -24,6 +24,41 @@ 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
+ {
+ if (System.IO.File.Exists(path))
+ {
+ return await System.IO.File.ReadAllBytesAsync(path);
+ }
+
+ return null; // File not found
+ }
+ catch (Exception ex)
+ {
+ // Handle or log the exception as needed
+ throw;
+ }
+ }
public List UploadAttachment(int responseId,int answerId,int counter, List postedFile)
{
var pathToSave = Path.Combine(Directory.GetCurrentDirectory(), uploadpath);
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 99d00a8..4cee929 100644
--- a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Controllers/DoculinkController.cs
+++ b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Controllers/DoculinkController.cs
@@ -13,11 +13,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,7 +41,7 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
[HttpGet]
[Route("doculinks/types/{id}")]
[Route("doculinks/types/{id}/{language:alpha}")]
- 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)
@@ -55,11 +55,11 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
///
[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);
@@ -104,6 +104,80 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
return NotFound();
}
///
+ /// download an existing attachment.
+ ///
+ [HttpGet("doculinks/download/{id}")]
+ public async Task downloadfile(int id)
+ {
+ try
+ {
+ var result = await this.documentsProvider.GetDownloadAttachmentAsync(id);
+ if (!result.IsSuccess)
+ return NotFound();
+ string path = await uploadService.GetFile(result.DoculinkAttachments.Path);
+ if (path == null)
+ return NotFound();
+ 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.
///
///
@@ -111,7 +185,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)
@@ -129,7 +203,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);
@@ -158,7 +232,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)
@@ -172,7 +246,7 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
///
[HttpPut]
[Route("doculinks/{id}")]
- public async Task UpdateDocument(int id,ReqDoculink documentInfo)
+ public async Task UpdateDocument(int id, ReqDoculink documentInfo)
{
if (documentInfo != null)
{
@@ -180,7 +254,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)
{
@@ -193,6 +267,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.
///
[HttpPost]
@@ -204,7 +292,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)
{
@@ -239,6 +327,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 e9717ee..874cc7b 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, int counter, string message)> GetDocumentCounter();
diff --git a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Interfaces/IUploadService.cs b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Interfaces/IUploadService.cs
index 4219fd6..63c00aa 100644
--- a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Interfaces/IUploadService.cs
+++ b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Interfaces/IUploadService.cs
@@ -7,6 +7,8 @@ namespace DamageAssesment.Api.DocuLinks.Interfaces
Models.Doculink UploadDocument( int counter, ReqDoculink documentInfo);
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 01ec9cf..d0b487c 100644
--- a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Providers/DoculinkProvider.cs
+++ b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Providers/DoculinkProvider.cs
@@ -414,6 +414,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 e4900dc..333f4de 100644
--- a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Providers/UploadService.cs
+++ b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Providers/UploadService.cs
@@ -25,6 +25,32 @@ 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
+ {
+ if (System.IO.File.Exists(path))
+ {
+ return await System.IO.File.ReadAllBytesAsync(path);
+ }
public Models.Doculink UploadDocument(int counter, ReqDoculink documentInfo)
{