From 1bf92fe95d7baa2ec3e3760c7cf0bd0fdeccac12 Mon Sep 17 00:00:00 2001
From: Vijay Uppu <913468@dadeschools.net>
Date: Fri, 1 Dec 2023 18:01:54 -0500
Subject: [PATCH] attachment and doculinks url changes
---
.../Controllers/AttachmentsController.cs | 24 ++++++++++
.../Interfaces/IAttachmentsProvider.cs | 1 +
.../Interfaces/IUploadService.cs | 1 +
.../Program.cs | 1 +
.../Providers/AttachmentsProvider.cs | 43 +++++++++++++++--
.../Providers/UploadService.cs | 21 ++++++++-
.../Controllers/DoculinkController.cs | 26 +++++++++-
.../Interfaces/IDoculinkProvider.cs | 1 +
.../Interfaces/IUploadService.cs | 1 +
.../DamageAssesment.Api.DocuLinks/Program.cs | 1 +
.../Providers/DoculinkProvider.cs | 47 +++++++++++++++----
.../Providers/UploadService.cs | 21 ++++++++-
12 files changed, 171 insertions(+), 17 deletions(-)
diff --git a/DamageAssesmentApi/DamageAssesment.Api.Attachments/Controllers/AttachmentsController.cs b/DamageAssesmentApi/DamageAssesment.Api.Attachments/Controllers/AttachmentsController.cs
index 5e6a4eb..35c41d9 100644
--- a/DamageAssesmentApi/DamageAssesment.Api.Attachments/Controllers/AttachmentsController.cs
+++ b/DamageAssesmentApi/DamageAssesment.Api.Attachments/Controllers/AttachmentsController.cs
@@ -138,6 +138,30 @@ namespace DamageAssesment.Api.Attachments.Controllers
}
}
///
+ /// download an existing attachment.
+ ///
+ [Authorize(Roles = "admin")]
+ [HttpGet("attachments/download/{id}")]
+ public async Task downloadfile1(int id)
+ {
+ 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);
+ }
+ }
+ ///
/// Delete an existing attachment.
///
[Authorize(Roles = "admin")]
diff --git a/DamageAssesmentApi/DamageAssesment.Api.Attachments/Interfaces/IAttachmentsProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.Attachments/Interfaces/IAttachmentsProvider.cs
index 5e56dbb..06c4ead 100644
--- a/DamageAssesmentApi/DamageAssesment.Api.Attachments/Interfaces/IAttachmentsProvider.cs
+++ b/DamageAssesmentApi/DamageAssesment.Api.Attachments/Interfaces/IAttachmentsProvider.cs
@@ -9,6 +9,7 @@ namespace DamageAssesment.Api.Attachments.Interfaces
Task<(bool IsSuccess, IEnumerable Attachments, string ErrorMessage)> PostAttachmentAsync(List Attachments);
Task<(bool IsSuccess, IEnumerable Attachments, string ErrorMessage)> PutAttachmentAsync(List Attachments);
Task<(bool IsSuccess, Models.Attachment Attachment, string Path)> DeleteAttachmentAsync(int Id);
+ Task<(bool IsSuccess, Models.Attachment Attachment, string Path)> GetDownloadAttachmentAsync(int Id);
Task<(bool IsSuccess, int counter, string Path)> DeleteAttachmentsAsync(int responseId, int answerId);
Task<(bool IsSuccess, int counter, string Path)> DeleteBulkAttachmentsAsync(int responseId, List answerIds);
Task<(bool IsSuccess, int counter, string message)> GetAttachmentCounter();
diff --git a/DamageAssesmentApi/DamageAssesment.Api.Attachments/Interfaces/IUploadService.cs b/DamageAssesmentApi/DamageAssesment.Api.Attachments/Interfaces/IUploadService.cs
index f645593..f89653f 100644
--- a/DamageAssesmentApi/DamageAssesment.Api.Attachments/Interfaces/IUploadService.cs
+++ b/DamageAssesmentApi/DamageAssesment.Api.Attachments/Interfaces/IUploadService.cs
@@ -7,6 +7,7 @@ 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);
void Deletefile(string path);
void Movefile(string path);
}
diff --git a/DamageAssesmentApi/DamageAssesment.Api.Attachments/Program.cs b/DamageAssesmentApi/DamageAssesment.Api.Attachments/Program.cs
index 9368b21..39e8309 100644
--- a/DamageAssesmentApi/DamageAssesment.Api.Attachments/Program.cs
+++ b/DamageAssesmentApi/DamageAssesment.Api.Attachments/Program.cs
@@ -71,6 +71,7 @@ builder.Services.AddSwaggerGen(options =>
options.AddSecurityRequirement(securityRequirements);
});
+builder.Services.AddSingleton();
builder.Services.AddScoped();
builder.Services.AddScoped();
builder.Services.AddScoped();
diff --git a/DamageAssesmentApi/DamageAssesment.Api.Attachments/Providers/AttachmentsProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.Attachments/Providers/AttachmentsProvider.cs
index c18cd05..3489e28 100644
--- a/DamageAssesmentApi/DamageAssesment.Api.Attachments/Providers/AttachmentsProvider.cs
+++ b/DamageAssesmentApi/DamageAssesment.Api.Attachments/Providers/AttachmentsProvider.cs
@@ -13,25 +13,33 @@ namespace DamageAssesment.Api.Attachments.Providers
private AttachmentsDbContext AttachmentDbContext;
private ILogger logger;
private IUploadService uploadservice;
- private IMapper mapper;
-
- public AttachmentsProvider(AttachmentsDbContext AttachmentDbContext, ILogger logger, IMapper mapper,IUploadService uploadservice)
+ private IMapper mapper;
+ private readonly IHttpContextAccessor httpContextAccessor;
+ private string baseUrl;
+ public AttachmentsProvider(AttachmentsDbContext AttachmentDbContext, ILogger logger, IMapper mapper,IUploadService uploadservice, IHttpContextAccessor httpContextAccessor)
{
this.AttachmentDbContext = AttachmentDbContext;
this.logger = logger;
this.mapper = mapper;
this.uploadservice = uploadservice;
+ this.httpContextAccessor = httpContextAccessor;
+ baseUrl = $"{httpContextAccessor.HttpContext.Request.Scheme}://{httpContextAccessor.HttpContext.Request.Host}";
+ baseUrl = baseUrl + "/attachments/download";
SeedData();
}
public async Task<(bool IsSuccess, IEnumerable Attachments, string ErrorMessage)> GetAttachmentsAsync()
{
-
+
try
{
logger?.LogInformation("Query Question");
var Attachment = await AttachmentDbContext.Attachments.AsNoTracking().Where(a => !a.IsDeleted).ToListAsync();
if (Attachment != null)
{
+ foreach (var attachment in Attachment)
+ {
+ attachment.URI = $"{baseUrl}/{attachment.Id}";
+ }
logger?.LogInformation($"{Attachment.Count} Attachments(s) found");
var result = mapper.Map, IEnumerable>(Attachment);
return (true, result, null);
@@ -54,6 +62,7 @@ namespace DamageAssesment.Api.Attachments.Providers
if (Attachment != null)
{
logger?.LogInformation($"{Attachment} customer(s) found");
+ Attachment.URI = $"{baseUrl}/{Attachment.Id}";
var result = mapper.Map(Attachment);
return (true, result, null);
}
@@ -73,6 +82,10 @@ namespace DamageAssesment.Api.Attachments.Providers
List attachments = mapper.Map, List>(Attachments);
AttachmentDbContext.Attachments.AddRange(attachments);
await AttachmentDbContext.SaveChangesAsync();
+ foreach (var attachment in attachments)
+ {
+ attachment.URI = $"{baseUrl}/{attachment.Id}";
+ }
var result = mapper.Map, IEnumerable>(attachments);
return (true, result, null);
}
@@ -91,6 +104,10 @@ namespace DamageAssesment.Api.Attachments.Providers
List attachments = mapper.Map, List>(Attachments);
AttachmentDbContext.Attachments.UpdateRange(attachments);
await AttachmentDbContext.SaveChangesAsync();
+ foreach (var attachment in attachments)
+ {
+ attachment.URI = $"{baseUrl}/{attachment.Id}";
+ }
var result = mapper.Map, IEnumerable>(attachments);
return (true, result, null);
}
@@ -197,6 +214,24 @@ namespace DamageAssesment.Api.Attachments.Providers
{
return AttachmentDbContext.Attachments.AsNoTracking().Count(e => e.Id == id && !e.IsDeleted) > 0;
}
+ public async Task<(bool IsSuccess, Models.Attachment Attachment, string Path)> GetDownloadAttachmentAsync(int Id)
+ {
+ try
+ {
+ Db.Attachment Attachment = AttachmentDbContext.Attachments.Where(a => a.Id == Id).AsNoTracking().FirstOrDefault();
+ if (Attachment == null)
+ {
+ return (false, null, "Not Found");
+ }
+ return (true, mapper.Map(Attachment), $"Attachment {Id}");
+ }
+ catch (Exception ex)
+ {
+
+ logger?.LogError(ex.ToString());
+ return (false, null, ex.Message);
+ }
+ }
private void SeedData()
{
diff --git a/DamageAssesmentApi/DamageAssesment.Api.Attachments/Providers/UploadService.cs b/DamageAssesmentApi/DamageAssesment.Api.Attachments/Providers/UploadService.cs
index 8c9045c..6e03fd0 100644
--- a/DamageAssesmentApi/DamageAssesment.Api.Attachments/Providers/UploadService.cs
+++ b/DamageAssesmentApi/DamageAssesment.Api.Attachments/Providers/UploadService.cs
@@ -24,6 +24,23 @@ namespace DamageAssesment.Api.Attachments.Providers
uploadpath = configuration.GetValue("Fileupload:folderpath");
Deletepath = configuration.GetValue("Fileupload:Deletepath");
}
+ 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);
@@ -89,7 +106,7 @@ namespace DamageAssesment.Api.Attachments.Providers
{
counter++;
- var UserfileName = Path.GetFileName(file.FileName);
+ var UserfileName = Path.GetFileName(file.FileName+ file.FileExtension);
var fileName = String.Format("Attachment_{0}{1}", counter, file.FileExtension);
var dbPath = Path.Combine(fullDirectoryPath, fileName);
File.WriteAllBytes(dbPath, Convert.FromBase64String(file.FileContent));
@@ -126,7 +143,7 @@ namespace DamageAssesment.Api.Attachments.Providers
foreach (var file in item.postedFiles)
{
Models.Attachment attachment= attachments.Where(a=>a.Id == file.AttachmentId).FirstOrDefault();
- var UserfileName = Path.GetFileName(file.FileName);
+ var UserfileName = Path.GetFileName(file.FileName + file.FileExtension);
var fileName = String.Format("Attachment_{0}{1}", attachment?.Id, file.FileExtension);
var dbPath = Path.Combine(fullDirectoryPath, fileName);
File.WriteAllBytes(dbPath, Convert.FromBase64String(file.FileContent));
diff --git a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Controllers/DoculinkController.cs b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Controllers/DoculinkController.cs
index b6552c3..601134d 100644
--- a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Controllers/DoculinkController.cs
+++ b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Controllers/DoculinkController.cs
@@ -111,7 +111,31 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
return NotFound();
}
///
- /// Get all documents.
+ /// download an existing attachment.
+ ///
+ [Authorize(Roles = "admin")]
+ [HttpGet("doculinks/download/{id}")]
+ public async Task downloadfile1(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)
+ 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);
+ }
+ }
+ ///
+ /// Get all Doculink.
///
[Authorize(Roles = "admin")]
diff --git a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Interfaces/IDoculinkProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Interfaces/IDoculinkProvider.cs
index e9717ee..22f0fe6 100644
--- a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Interfaces/IDoculinkProvider.cs
+++ b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Interfaces/IDoculinkProvider.cs
@@ -12,6 +12,7 @@ namespace DamageAssesment.Api.DocuLinks.Interfaces
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)> 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 4219fd6..4fbc5ee 100644
--- a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Interfaces/IUploadService.cs
+++ b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Interfaces/IUploadService.cs
@@ -7,6 +7,7 @@ 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);
void Movefile(string path);
}
}
diff --git a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Program.cs b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Program.cs
index 9d480b2..d3de702 100644
--- a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Program.cs
+++ b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Program.cs
@@ -69,6 +69,7 @@ builder.Services.AddSwaggerGen(options =>
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
+builder.Services.AddSingleton();
builder.Services.AddScoped();
builder.Services.AddScoped();
builder.Services.AddScoped();
diff --git a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Providers/DoculinkProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Providers/DoculinkProvider.cs
index 749f200..30d3103 100644
--- a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Providers/DoculinkProvider.cs
+++ b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Providers/DoculinkProvider.cs
@@ -2,10 +2,12 @@
using DamageAssesment.Api.DocuLinks.Db;
using DamageAssesment.Api.DocuLinks.Interfaces;
using DamageAssesment.Api.DocuLinks.Models;
+using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Internal;
using System;
+using System.Collections.Generic;
using System.Collections.Immutable;
using System.Diagnostics.Eventing.Reader;
using System.Reflection.Metadata;
@@ -23,13 +25,18 @@ namespace DamageAssesment.Api.DocuLinks.Providers
private ILogger logger;
private IUploadService uploadservice;
private IMapper mapper;
+ private readonly IHttpContextAccessor httpContextAccessor;
+ private string baseUrl;
- public DoculinkProvider(DoculinkDbContext DocumentDbContext, ILogger logger, IMapper mapper, IUploadService uploadservice)
+ public DoculinkProvider(DoculinkDbContext DocumentDbContext, ILogger logger, IMapper mapper, IUploadService uploadservice, IHttpContextAccessor httpContextAccessor)
{
this.DocumentDbContext = DocumentDbContext;
this.logger = logger;
this.mapper = mapper;
this.uploadservice = uploadservice;
+ this.httpContextAccessor = httpContextAccessor;
+ baseUrl = $"{httpContextAccessor.HttpContext.Request.Scheme}://{httpContextAccessor.HttpContext.Request.Host}";
+ baseUrl = baseUrl + "/doculinks/download";
SeedData();
}
@@ -173,15 +180,38 @@ namespace DamageAssesment.Api.DocuLinks.Providers
}
private List GetDocumentAttachment(int id,string? language)
{
+ List doculinkAttachments = null;
if (string.IsNullOrEmpty(language))
{
- return mapper.Map, List>(
- DocumentDbContext.DoclinksAttachments.AsNoTracking().Where(a => a.DocumentId == id).ToList());
+ doculinkAttachments = DocumentDbContext.DoclinksAttachments.AsNoTracking().Where(a => a.DocumentId == id).ToList();
}
else
{
- return mapper.Map, List>(
- DocumentDbContext.DoclinksAttachments.AsNoTracking().Where(a => a.DocumentId == id && a.Language == language).ToList());
+ doculinkAttachments = DocumentDbContext.DoclinksAttachments.AsNoTracking().Where(a => a.DocumentId == id && a.Language == language).ToList();
+ }
+ foreach (var attachment in doculinkAttachments)
+ {
+ if (attachment.IsAttachments)
+ attachment.Path = $"{baseUrl}/{attachment.Id}";
+ }
+ return mapper.Map, List>(doculinkAttachments);
+ }
+ public async Task<(bool IsSuccess, Models.DoculinkAttachments DoculinkAttachments, string Path)> GetDownloadAttachmentAsync(int id)
+ {
+ try
+ {
+ Db.DoculinkAttachments Attachment = DocumentDbContext.DoclinksAttachments.AsNoTracking().Where(a => a.Id == id).AsNoTracking().FirstOrDefault();
+ if (Attachment == null)
+ {
+ return (false, null, "Not Found");
+ }
+ return (true, mapper.Map(Attachment), $"Attachment {id}");
+ }
+ catch (Exception ex)
+ {
+
+ logger?.LogError(ex.ToString());
+ return (false, null, ex.Message);
}
}
public async Task<(bool IsSuccess, IEnumerable documents, string ErrorMessage)> GetdocumentsByLinkTypeIdAsync(int? linkTypeId, string? language, bool? isactive)
@@ -358,7 +388,7 @@ namespace DamageAssesment.Api.DocuLinks.Providers
result.linktypes = CreateMultiLanguageLinkTypeObject(GetLinkTypeTranslations(Document.linkTypeId, ""));
result.titles = multilan.titles;
result.description = multilan.description;
- result.doclinksAttachments = Document.doclinksAttachments;
+ result.doclinksAttachments = GetDocumentAttachment(document.Id,"");
return (true, result, null);
}
catch (Exception ex)
@@ -400,7 +430,7 @@ namespace DamageAssesment.Api.DocuLinks.Providers
result.linktypes = CreateMultiLanguageLinkTypeObject(GetLinkTypeTranslations(document.linkTypeId, ""));
result.titles = multilan.titles;
result.description = multilan.description;
- result.doclinksAttachments = Document.doclinksAttachments;
+ result.doclinksAttachments = GetDocumentAttachment(document.Id, "");
return (true, result, "Successful");
}
else
@@ -438,7 +468,8 @@ namespace DamageAssesment.Api.DocuLinks.Providers
result.titles = multilan.titles;
result.description = multilan.description;
result.linktypes = CreateMultiLanguageLinkTypeObject(GetLinkTypeTranslations(result.linkTypeId, ""));
- result.doclinksAttachments = GetDocumentAttachment(id, "");
+ result.doclinksAttachments = mapper.Map, List>(
+ DocumentDbContext.DoclinksAttachments.AsNoTracking().Where(a => a.DocumentId == id).ToList());
Document.IsActive = false;
DocumentDbContext.Documents.Update(Document);
DocumentDbContext.SaveChanges();
diff --git a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Providers/UploadService.cs b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Providers/UploadService.cs
index b4c5b52..12e29c3 100644
--- a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Providers/UploadService.cs
+++ b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Providers/UploadService.cs
@@ -25,6 +25,23 @@ namespace DamageAssesment.Api.DocuLinks.Providers
uploadpath = configuration.GetValue("Fileupload:folderpath");
Deletepath = configuration.GetValue("Fileupload:Deletepath");
}
+ 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 Models.Doculink UploadDocument(int counter, ReqDoculink documentInfo)
{
@@ -44,7 +61,7 @@ namespace DamageAssesment.Api.DocuLinks.Providers
counter++;
if (item.IsAttachments)
{
- UserfileName = Path.GetFileName(item.FileName);
+ UserfileName = Path.GetFileName(item.FileName + item.FileExtension);
var fileName = String.Format("Document_{0}{1}", counter, item.FileExtension);
path = Path.Combine(fullDirectoryPath, fileName);
File.WriteAllBytes(path, Convert.FromBase64String(item.FileContent));
@@ -85,7 +102,7 @@ namespace DamageAssesment.Api.DocuLinks.Providers
counter++;
if (item.IsAttachments)
{
- UserfileName = Path.GetFileName(item.FileName);
+ UserfileName = Path.GetFileName(item.FileName+item.FileExtension);
var fileName = String.Format("Document_{0}{1}", counter, item.FileExtension);
path = Path.Combine(fullDirectoryPath, fileName);
File.WriteAllBytes(path, Convert.FromBase64String(item.FileContent));