Compare commits

...

9 Commits

45 changed files with 967 additions and 145 deletions

View File

@ -136,6 +136,80 @@ namespace DamageAssesment.Api.Attachments.Controllers
}
}
/// <summary>
/// download an existing attachment.
/// </summary>
[HttpGet("attachments/download/{id}")]
public async Task<IActionResult> 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";
}
}
/// <summary>
/// Delete an existing attachment.
/// </summary>
[HttpDelete("attachments/{id}")]

View File

@ -9,6 +9,7 @@ namespace DamageAssesment.Api.Attachments.Interfaces
Task<(bool IsSuccess, IEnumerable<Models.Attachment> Attachments, string ErrorMessage)> PostAttachmentAsync(List<Models.Attachment> Attachments);
Task<(bool IsSuccess, IEnumerable<Models.Attachment> Attachments, string ErrorMessage)> PutAttachmentAsync(List<Models.Attachment> 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<int> answerIds);
Task<(bool IsSuccess, int counter, string message)> GetAttachmentCounter();

View File

@ -7,6 +7,8 @@ namespace DamageAssesment.Api.Attachments.Interfaces
List<Models.Attachment> UploadAttachment(int responseId,int answerId, int counter, List<IFormFile> postedFile);
List<Models.Attachment> UploadAttachment(int responseId, int counter, List<AnswerInfo> answers);
public List<Models.Attachment> UpdateAttachments(int responseId, List<AnswerInfo> answers, IEnumerable<Models.Attachment> attachments);
Task<byte[]> DownloadFile(string path);
Task<string> GetFile(string path);
void Deletefile(string path);
void Movefile(string path);
}

View File

@ -21,6 +21,7 @@ builder.Services.AddSwaggerGen(c =>
var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
c.IncludeXmlComments(xmlPath);
});
builder.Services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
builder.Services.AddScoped<IAttachmentsProvider, AttachmentsProvider>();
builder.Services.AddScoped<IUploadService, UploadService>();
builder.Services.AddScoped<IAzureBlobService,AzureBlobService>();

View File

@ -14,13 +14,17 @@ namespace DamageAssesment.Api.Attachments.Providers
private ILogger<AttachmentsProvider> logger;
private IUploadService uploadservice;
private IMapper mapper;
public AttachmentsProvider(AttachmentsDbContext AttachmentDbContext, ILogger<AttachmentsProvider> logger, IMapper mapper,IUploadService uploadservice)
private readonly IHttpContextAccessor httpContextAccessor;
private string baseUrl;
public AttachmentsProvider(AttachmentsDbContext AttachmentDbContext, ILogger<AttachmentsProvider> 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<Models.Attachment> Attachments, string ErrorMessage)> GetAttachmentsAsync()
@ -32,6 +36,10 @@ namespace DamageAssesment.Api.Attachments.Providers
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<Db.Attachment>, IEnumerable<Models.Attachment>>(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<Db.Attachment, Models.Attachment>(Attachment);
return (true, result, null);
}
@ -73,6 +82,10 @@ namespace DamageAssesment.Api.Attachments.Providers
List<Db.Attachment> attachments = mapper.Map<List<Models.Attachment>, List<Db.Attachment>>(Attachments);
AttachmentDbContext.Attachments.AddRange(attachments);
await AttachmentDbContext.SaveChangesAsync();
foreach (var attachment in attachments)
{
attachment.URI = $"{baseUrl}/{attachment.Id}";
}
var result = mapper.Map<IEnumerable<Db.Attachment>, IEnumerable<Models.Attachment>>(attachments);
return (true, result, null);
}
@ -91,6 +104,10 @@ namespace DamageAssesment.Api.Attachments.Providers
List<Db.Attachment> attachments = mapper.Map<List<Models.Attachment>, List<Db.Attachment>>(Attachments);
AttachmentDbContext.Attachments.UpdateRange(attachments);
await AttachmentDbContext.SaveChangesAsync();
foreach (var attachment in attachments)
{
attachment.URI = $"{baseUrl}/{attachment.Id}";
}
var result = mapper.Map<IEnumerable<Db.Attachment>, IEnumerable<Models.Attachment>>(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<Db.Attachment, Models.Attachment>(Attachment), $"Attachment {Id}");
}
catch (Exception ex)
{
logger?.LogError(ex.ToString());
return (false, null, ex.Message);
}
}
private void SeedData()
{

View File

@ -24,6 +24,41 @@ namespace DamageAssesment.Api.Attachments.Providers
uploadpath = configuration.GetValue<string>("Fileupload:folderpath");
Deletepath = configuration.GetValue<string>("Fileupload:Deletepath");
}
public async Task<string> 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<byte[]> 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<Models.Attachment> UploadAttachment(int responseId,int answerId,int counter, List<IFormFile> postedFile)
{
var pathToSave = Path.Combine(Directory.GetCurrentDirectory(), uploadpath);
@ -89,7 +124,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 +161,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));

View File

@ -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<IDoculinkProvider>();
var mockUploadService = new Mock<IUploadService>();
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<IDoculinkProvider>();
var mockUploadService = new Mock<IUploadService>();
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

View File

@ -32,6 +32,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
doclinksAttachments.Add(new DoculinkAttachments()
{
docName = "",Path="www.google.com",
Language = "en",
IsAttachments =false,CustomOrder=1
});
list.Add(new DocuLinks.Models.ResDoculink()
@ -74,6 +75,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
docName = "",
Path = "www.google.com",
IsAttachments = false,
Language = "en",
CustomOrder = 1
});
list.Add(new DocuLinks.Models.ResDoculink()
@ -138,6 +140,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
docName = "",
Path = "www.google.com",
IsAttachments = false,
Language = "en",
CustomOrder = 1
});
return new Models.Doculink
@ -165,6 +168,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
docName = "",
Path = "www.google.com",
IsAttachments = false,
Language = "en",
CustomOrder = 1
});
List<DocuLinks.Models.Doculink> DocuLinks = new List<Models.Doculink>();

View File

@ -104,6 +104,80 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
return NotFound();
}
/// <summary>
/// download an existing attachment.
/// </summary>
[HttpGet("doculinks/download/{id}")]
public async Task<IActionResult> 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";
}
}
/// <summary>
/// Get all Doculink.
/// </summary>
///
@ -193,6 +267,20 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
return BadRequest(documentInfo);
}
/// <summary>
/// update existing doclink isactive field.
/// </summary>
[HttpPut]
[Route("doculinks/{id}/{isactive}")]
public async Task<IActionResult> UpdateIsActiveDocument(int id, bool isactive)
{
var result = await this.documentsProvider.UpdateDocumentAsync(id, isactive);
if (result.IsSuccess)
{
return Ok(result.Document);
}
return NotFound();
}
/// <summary>
/// Create new doclink.
/// </summary>
[HttpPost]

View File

@ -14,5 +14,6 @@ namespace DamageAssesment.Api.DocuLinks.Db
public string Path { get; set; }
public bool IsAttachments { get; set; }
public int CustomOrder { get; set; }
public string Language { get; set; }
}
}

View File

@ -11,7 +11,9 @@ namespace DamageAssesment.Api.DocuLinks.Interfaces
Task<(bool IsSuccess, IEnumerable<Models.ResDoculink> 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();

View File

@ -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<byte[]> DownloadFile(string path);
Task<string> GetFile(string path);
void Movefile(string path);
}
}

View File

@ -8,6 +8,7 @@ namespace DamageAssesment.Api.DocuLinks.Models
public string docName { get; set; }
public string Path { get; set; }
public bool IsAttachments { get; set; }
public string Language { get; set; }
public int CustomOrder { get; set; }
}
}

View File

@ -18,5 +18,6 @@ namespace DamageAssesment.Api.DocuLinks.Models
public int CustomOrder { get; set; }
public string url { get;set; }
public bool IsAttachments { get; set; }
public string Language { get; set; }
}
}

View File

@ -19,6 +19,7 @@ builder.Services.AddSwaggerGen(c =>
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
builder.Services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
builder.Services.AddScoped<IDoculinkProvider, DoculinkProvider>();
builder.Services.AddScoped<IUploadService, UploadService>();
builder.Services.AddScoped<IAzureBlobService, AzureBlobService>();

View File

@ -2,13 +2,16 @@
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;
using System.Runtime.CompilerServices;
using System.Xml;
using System.Xml.Linq;
@ -22,13 +25,18 @@ namespace DamageAssesment.Api.DocuLinks.Providers
private ILogger<DoculinkProvider> logger;
private IUploadService uploadservice;
private IMapper mapper;
private readonly IHttpContextAccessor httpContextAccessor;
private string baseUrl;
public DoculinkProvider(DoculinkDbContext DocumentDbContext, ILogger<DoculinkProvider> logger, IMapper mapper, IUploadService uploadservice)
public DoculinkProvider(DoculinkDbContext DocumentDbContext, ILogger<DoculinkProvider> 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();
}
@ -71,11 +79,11 @@ namespace DamageAssesment.Api.DocuLinks.Providers
{
linkTypeId = 1;
fileModel = new FileModel() { FileName = "Sample" + i, FileExtension = ".txt", FileContent = "c2FtcGxl", IsAttachments = true, CustomOrder = 1 };
fileModel = new FileModel() { FileName = "Sample" + i, FileExtension = ".txt", FileContent = "c2FtcGxl", IsAttachments = true, CustomOrder = 1, Language = "en" };
}
else
fileModel = new FileModel() { url = "www.google" + i + ".com", IsAttachments = false, CustomOrder = 1 };
ReqDoculink documentInfo = new ReqDoculink() { linkTypeId = linkTypeId, CustomOrder = i, Files = new List<FileModel>() { fileModel } };
fileModel = new FileModel() { url = "www.google" + i + ".com", IsAttachments = false, CustomOrder = 1,Language="en" };
ReqDoculink documentInfo = new ReqDoculink() { linkTypeId = i, CustomOrder = i, Files = new List<FileModel>() { fileModel } };
Models.Doculink document = uploadservice.UploadDocument(counter, documentInfo);
DocumentDbContext.Documents.Add(mapper.Map<Models.Doculink, Db.Doculink>(document));
DocumentDbContext.SaveChanges();
@ -170,7 +178,42 @@ namespace DamageAssesment.Api.DocuLinks.Providers
MultiLanguage = dicttitle;
return MultiLanguage;
}
private List<Models.DoculinkAttachments> GetDocumentAttachment(int id,string? language)
{
List<Db.DoculinkAttachments> doculinkAttachments = null;
if (string.IsNullOrEmpty(language))
{
doculinkAttachments = DocumentDbContext.DoclinksAttachments.AsNoTracking().Where(a => a.DocumentId == id).ToList();
}
else
{
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<Db.DoculinkAttachments>, List<Models.DoculinkAttachments>>(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<Db.DoculinkAttachments, Models.DoculinkAttachments>(Attachment), $"Attachment {id}");
}
catch (Exception ex)
{
logger?.LogError(ex.ToString());
return (false, null, ex.Message);
}
}
public async Task<(bool IsSuccess, IEnumerable<Models.ResDoculink> documents, string ErrorMessage)> GetdocumentsByLinkTypeIdAsync(int? linkTypeId, string? language, bool? isactive)
{
@ -192,8 +235,7 @@ namespace DamageAssesment.Api.DocuLinks.Providers
item.titles = multilan.titles;
item.description = multilan.description;
item.linktypes = CreateMultiLanguageLinkTypeObject(GetLinkTypeTranslations(item.linkTypeId, language));
item.doclinksAttachments = mapper.Map<List<Db.DoculinkAttachments>, List<Models.DoculinkAttachments>>(
DocumentDbContext.DoclinksAttachments.AsNoTracking().Where(a => a.DocumentId == item.Id).ToList());
item.doclinksAttachments = GetDocumentAttachment(item.Id,language);
}
// List<ResDoculinks> doculinks = result.GroupBy(a => a.linkTypeId).Select(a => new ResDoculinks() { linkTypeId = a.Key, doculinks = a.ToList() }).ToList();
return (true, result, null);
@ -228,8 +270,7 @@ namespace DamageAssesment.Api.DocuLinks.Providers
item.titles = multilan.titles;
item.description = multilan.description;
item.linktypes = CreateMultiLanguageLinkTypeObject(GetLinkTypeTranslations(item.linkTypeId, language));
item.doclinksAttachments = mapper.Map<List<Db.DoculinkAttachments>, List<Models.DoculinkAttachments>>(
DocumentDbContext.DoclinksAttachments.AsNoTracking().Where(a => a.DocumentId == item.Id).ToList());
item.doclinksAttachments = GetDocumentAttachment(item.Id, language);
}
//List<ResDoculinks> doculinks = result.GroupBy(a => a.linkTypeId).Select(a => new ResDoculinks() { linkTypeId = a.Key, doculinks = a.ToList() }).ToList();
return (true, result, null);
@ -284,8 +325,7 @@ namespace DamageAssesment.Api.DocuLinks.Providers
result.documentsTranslations = mapper.Map<List<Db.DoculinkTranslation>, List<Models.DoculinkTranslation>>(
DocumentDbContext.DocumentsTranslations.Where(a => a.DocumentId == result.Id).ToList());
result.doclinksAttachments = mapper.Map<List<Db.DoculinkAttachments>, List<Models.DoculinkAttachments>>(
DocumentDbContext.DoclinksAttachments.AsNoTracking().Where(a => a.DocumentId == id).ToList());
result.doclinksAttachments = GetDocumentAttachment(id, "");
return (true, result, null);
}
return (false, null, "Not found");
@ -317,8 +357,7 @@ namespace DamageAssesment.Api.DocuLinks.Providers
result.linktypes = CreateMultiLanguageLinkTypeObject(GetLinkTypeTranslations(result.linkTypeId, language));
result.titles = multilan.titles;
result.description = multilan.description;
result.doclinksAttachments = mapper.Map<List<Db.DoculinkAttachments>, List<Models.DoculinkAttachments>>(
DocumentDbContext.DoclinksAttachments.AsNoTracking().Where(a => a.DocumentId == id).ToList());
result.doclinksAttachments = GetDocumentAttachment(id, language);
return (true, result, null);
}
return (false, null, "Not found");
@ -349,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)
@ -391,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
@ -414,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<Db.Doculink, Models.ResDoculink>(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<Db.DoculinkAttachments>, List<Models.DoculinkAttachments>>(
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)
{

View File

@ -25,6 +25,41 @@ namespace DamageAssesment.Api.DocuLinks.Providers
uploadpath = configuration.GetValue<string>("Fileupload:folderpath");
Deletepath = configuration.GetValue<string>("Fileupload:Deletepath");
}
public async Task<string> 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<byte[]> 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,14 +79,14 @@ 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));
}
else
path = item.url;
attachments.Add(new Models.DoculinkAttachments { docName=UserfileName,Path=path,IsAttachments=item.IsAttachments,CustomOrder=item.CustomOrder });
attachments.Add(new Models.DoculinkAttachments { docName=UserfileName,Path=path,IsAttachments=item.IsAttachments,CustomOrder=item.CustomOrder,Language=item.Language });
}
}
Documents=new Models.Doculink (){ linkTypeId = documentInfo.linkTypeId,
@ -85,14 +120,14 @@ 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));
}
else
path = item.url;
attachments.Add(new Models.DoculinkAttachments { docName = UserfileName, Path = path,IsAttachments=item.IsAttachments,CustomOrder=item.CustomOrder });
attachments.Add(new Models.DoculinkAttachments { docName = UserfileName, Path = path,IsAttachments=item.IsAttachments,CustomOrder=item.CustomOrder,Language=item.Language });
}
Models.Doculink Documents = new Models.Doculink()
{

View File

@ -77,7 +77,8 @@ namespace DamageAssesment.Api.Employees.Providers
EmployeeDbContext.Employees.Add(_employee);
Employee.Id = _employee.Id;
EmployeeDbContext.SaveChanges();
return (true, Employee, null);
//return (true, Employee, null);
return (true, mapper.Map<Db.Employee, Models.Employee>(_employee), null);
}
return (false, null, "Employee code is already exits");
}

View File

@ -20,6 +20,10 @@ namespace DamageAssesment.Api.Locations.Db
[StringLength(2)]
public string SchoolType { get; set; }
public int? DataValue { get; set; }
public int? Enrollment { get; set; }
public double? Longitute { get; set; }
public double? Latitude { get; set; }
}
}

View File

@ -11,5 +11,9 @@ namespace DamageAssesment.Api.Locations.Models
public string Name { get; set; }
public string MaintenanceCenter { get; set; }
public string SchoolType { get; set; }
public int? DataValue { get; set; }
public int? Enrollment { get; set; }
public double? Longitute { get; set; }
public double? Latitude { get; set; }
}
}

View File

@ -28,6 +28,8 @@ namespace DamageAssesment.Api.Locations.Providers
var locations = await locationDbContext.Locations.AsNoTracking().ToListAsync();
if (locations != null)
{
int maxenrollment = (int)locations.Max(a => a.Enrollment);
foreach (Db.Location item in locations) { item.DataValue = GetHeatmapdata(item.Enrollment, maxenrollment); }
logger?.LogInformation($"{locations.Count} Locations(s) found");
var result = mapper.Map<IEnumerable<Db.Location>, IEnumerable<Models.Location>>(locations);
return (true, result, null);
@ -46,9 +48,12 @@ namespace DamageAssesment.Api.Locations.Providers
try
{
logger?.LogInformation("Query Location");
int maxenrollment = (int)await locationDbContext.Locations.AsNoTracking().MaxAsync(a => a.Enrollment);
var location = await locationDbContext.Locations.AsNoTracking().FirstOrDefaultAsync(q => q.Id == Id);
if (location != null)
{
{if(maxenrollment>0)
location.DataValue = GetHeatmapdata(location.Enrollment, maxenrollment);
logger?.LogInformation($"{location} found");
var result = mapper.Map<Db.Location, Models.Location>(location);
return (true, result, null);
@ -61,6 +66,10 @@ namespace DamageAssesment.Api.Locations.Providers
return (false, null, ex.Message);
}
}
private int GetHeatmapdata(int? enrollment,int maxenrollment)
{
return (enrollment != null ? enrollment.Value : 0) * 100 / maxenrollment;
}
public async Task<(bool IsSuccess, Models.Location Location, string ErrorMessage)> PostLocationAsync(Models.Location location)
{
try
@ -139,9 +148,9 @@ namespace DamageAssesment.Api.Locations.Providers
{
if (!locationDbContext.Locations.Any())
{
locationDbContext.Locations.Add(new Db.Location() { LocationCode = "0091", RegionId = 5, Name = "BOB GRAHAM EDUCATION CENTER", MaintenanceCenter = "1", SchoolType = "K8" });
locationDbContext.Locations.Add(new Db.Location() { LocationCode = "0092", RegionId = 1, Name = "NORMAN S. EDELCUP/SUNNY ISLES BEACH K-8", MaintenanceCenter = "1", SchoolType = "K8" });
locationDbContext.Locations.Add(new Db.Location() { LocationCode = "7511", RegionId = 4, Name = "MIAMI SPRINGS SHS", MaintenanceCenter = "2", SchoolType = "S" });
locationDbContext.Locations.Add(new Db.Location() { LocationCode = "0091", RegionId = 5, Name = "BOB GRAHAM EDUCATION CENTER", MaintenanceCenter = "1", SchoolType = "K8", DataValue = 25,Enrollment=780,Latitude= 25.83604,Longitute= -80.21618 });
locationDbContext.Locations.Add(new Db.Location() { LocationCode = "0092", RegionId = 1, Name = "NORMAN S. EDELCUP/SUNNY ISLES BEACH K-8", MaintenanceCenter = "1", SchoolType = "K8", DataValue = 46, Enrollment = 650, Latitude = 20.83604, Longitute = -40.21618 });
locationDbContext.Locations.Add(new Db.Location() { LocationCode = "7511", RegionId = 4, Name = "MIAMI SPRINGS SHS", MaintenanceCenter = "2", SchoolType = "S", DataValue = 12, Enrollment = 500, Latitude = 53.83604, Longitute = -60.21618 });
//locationDbContext.Locations.Add(new Db.Location() { Id = 3, LocationCode = "Loc3", RegionId = 3, Name = "BOB GRAHAM EDUCATION CENTER 3", MaintenanceCenter = "1", SchoolType = "US" });
//locationDbContext.Locations.Add(new Db.Location() { Id = 4, LocationCode = "Loc4", RegionId = 1, Name = "BOB GRAHAM EDUCATION CENTER 4", MaintenanceCenter = "1", SchoolType = "US" });
//locationDbContext.Locations.Add(new Db.Location() { Id = 5, LocationCode = "Loc5", RegionId = 2, Name = "BOB GRAHAM EDUCATION CENTER 5", MaintenanceCenter = "1", SchoolType = "US" });

View File

@ -89,6 +89,26 @@ namespace DamageAssesment.Api.Questions.Controllers
return CreatedAtRoute("DefaultApi", new { id = question.Id }, question);
}
/// <summary>
/// POST request for creating a multiple question (multilingual).
/// </summary>
[HttpPost("questions/multiple")]
public async Task<IActionResult> CreateQuestions(List<Models.Question> questions)
{
if (questions != null)
{
var result = await this.questionsProvider.PostQuestionsAsync(questions);
if (result.IsSuccess)
{
return Ok(result.Question);
}
if (result.ErrorMessage == "Not Found")
return NotFound(result.ErrorMessage);
return BadRequest(result.ErrorMessage);
}
return CreatedAtRoute("DefaultApi",questions);
}
/// <summary>
/// POST request for creating a new question (multilingual).
/// </summary>

View File

@ -8,6 +8,7 @@ namespace DamageAssesment.Api.Questions.Interfaces
Task<(bool IsSuccess, IEnumerable<Models.MultiLanguage> Questions, string ErrorMessage)> GetQuestionsAsync(string language);
Task<(bool IsSuccess, List<SurveyQuestions> SurveyQuestions, string ErrorMessage)> GetSurveyQuestionAsync(int surveyId,string language);
Task<(bool IsSuccess, Models.MultiLanguage Question, string ErrorMessage)> PostQuestionAsync(Models.Question Question);
Task<(bool IsSuccess, IEnumerable<Models.MultiLanguage> Question, string ErrorMessage)> PostQuestionsAsync(List<Models.Question> Questions);
Task<(bool IsSuccess, Models.MultiLanguage Question, string ErrorMessage)> UpdateQuestionAsync(Models.Question Question);
Task<(bool IsSuccess, Models.MultiLanguage Question, string ErrorMessage)> DeleteQuestionAsync(int id);

View File

@ -239,17 +239,41 @@ namespace DamageAssesment.Api.Questions.Providers
try
{
logger?.LogInformation("Query Question");
var result = InsertQuestion(Question);
return (true, result, null);
}
catch (Exception ex)
{
logger?.LogError(ex.ToString());
return (false, null, ex.Message);
}
}
private Models.MultiLanguage InsertQuestion(Models.Question Question)
{
var dbquestion = mapper.Map<Models.Question, Db.Question>(Question);
var dbquestiontranslation = mapper.Map<List<Models.QuestionsTranslation>, List<Db.QuestionsTranslation>>(Question.Questions);
dbquestion.QuestionTypeId = questionDbContext.QuestionTypes.Where(a => a.TypeText == Question.TypeText).Select(a => a.Id).FirstOrDefault();
questionDbContext.Questions.Add(dbquestion);
questionDbContext.SaveChanges();
dbquestiontranslation.ForEach(i => i.QuestionId = dbquestion.Id);
questionDbContext.QuestionsTranslations.AddRange(dbquestiontranslation);
questionDbContext.SaveChanges();
Question.Id = dbquestion.Id;
var result = mapper.Map<Db.Question, Models.MultiLanguage>(dbquestion);
result.Text = CreateMultiLanguageObject(GetQuestionsTranslations(result.Id, ""));
return (true, result, null);
return result;
}
public async Task<(bool IsSuccess, IEnumerable<Models.MultiLanguage> Question, string ErrorMessage)> PostQuestionsAsync(List<Models.Question> Questions)
{
try
{
List<Models.MultiLanguage> results = new List<MultiLanguage>();
logger?.LogInformation("Query Question");
foreach (Models.Question Question in Questions)
{
results.Add(InsertQuestion(Question));
}
return (true, results, null);
}
catch (Exception ex)
{

View File

@ -75,8 +75,19 @@ namespace DamageAssesment.Api.Questions.Test
return new Questions.Models.Question { Id = 1, Questions=QuestionsTranslations, TypeText = "Text 1", SurveyId = 1, QuestionNumber = 1, IsRequired = true, Comment = false, Key = true, CategoryId=1};
}
public static async Task<List<Questions.Models.Question>> getInputQuestionsData()
{
Models.QuestionsTranslation QuestionsTranslation = new Models.QuestionsTranslation()
{
Language = "en",
QuestionText = "Sample question"
};
List<Models.QuestionsTranslation> QuestionsTranslations = new List<Models.QuestionsTranslation>();
List<Models.Question> Questions = new List<Models.Question>();
QuestionsTranslations.Add(QuestionsTranslation);
Questions.Models.Question question = new Questions.Models.Question() { Id = 1, Questions = QuestionsTranslations, TypeText = "Text 1", SurveyId = 1, QuestionNumber = 1, IsRequired = true, Comment = false, Key = true, CategoryId = 1 };
Questions.Add(question);
return Questions;
}
}
}

View File

@ -110,6 +110,33 @@ namespace DamageAssesment.Api.Questions.Test
Assert.Equal(400, result.StatusCode);
}
[Fact(DisplayName = "Post Questions - Ok case")]
public async Task PostQuestionsAsync_ShouldReturnStatusCode200()
{
var mockQuestionService = new Mock<IQuestionsProvider>();
var mockResponse = await MockData.getOkResponse();
var mockInputQuestion = await MockData.getInputQuestionsData();
mockQuestionService.Setup(service => service.PostQuestionsAsync(mockInputQuestion)).ReturnsAsync(mockResponse);
var QuestionProvider = new QuestionsController(mockQuestionService.Object);
var result = (OkObjectResult)await QuestionProvider.CreateQuestions(mockInputQuestion);
Assert.Equal(200, result.StatusCode);
}
[Fact(DisplayName = "Post Questions - BadRequest case")]
public async Task PostQuestionsAsync_ShouldReturnStatusCode400()
{
var mockQuestionService = new Mock<IQuestionsProvider>();
var mockInputQuestion = await MockData.getInputQuestionData();
var mockResponse = await MockData.getBadRequestResponse();
mockQuestionService.Setup(service => service.UpdateQuestionAsync(mockInputQuestion)).ReturnsAsync(mockResponse);
var QuestionProvider = new QuestionsController(mockQuestionService.Object);
var result = (BadRequestObjectResult)await QuestionProvider.UpdateQuestion(mockInputQuestion);
Assert.Equal(400, result.StatusCode);
}
[Fact(DisplayName = "Put Question - Ok case")]
public async Task PutQuestionAsync_ShouldReturnStatusCode200()

View File

@ -12,9 +12,11 @@ namespace DamageAssesment.SurveyResponses.Test
public class SurveyResponsesServiceTest
{
Mock<ISurveysResponse> mockSurveyResponseService;
Mock<IExcelExportService> mockExcelExportService;
public SurveyResponsesServiceTest()
{
mockSurveyResponseService = new Mock<ISurveysResponse>();
mockExcelExportService = new Mock<IExcelExportService>();
}
[Fact(DisplayName = "Get Responses - Ok case")]
@ -23,7 +25,7 @@ namespace DamageAssesment.SurveyResponses.Test
SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject();
var mockResponse = await MockData.getOkResponse(mockRequestObject);
mockSurveyResponseService.Setup(service => service.GetSurveyResponsesAsync(1)).ReturnsAsync(mockResponse);
var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object);
var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var result = (OkObjectResult)await surveyResponseProvider.GetSurveyResponsesAsync(1);
Assert.Equal(200, result.StatusCode);
}
@ -33,7 +35,7 @@ namespace DamageAssesment.SurveyResponses.Test
{
var mockResponse = await MockData.getResponse();
mockSurveyResponseService.Setup(service => service.GetSurveyResponsesAsync(1)).ReturnsAsync(mockResponse);
var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object);
var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var result = (BadRequestObjectResult)await surveyResponseProvider.GetSurveyResponsesAsync(1);
Assert.Equal(400, result.StatusCode);
}
@ -44,7 +46,7 @@ namespace DamageAssesment.SurveyResponses.Test
SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject();
var mockResponse = await MockData.getOkResponse();
mockSurveyResponseService.Setup(service => service.GetSurveyResponsesBySurveyAsync(1, 1)).ReturnsAsync(mockResponse);
var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object);
var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var result = (OkObjectResult)await surveyResponseProvider.GetSurveyResponsesAsync(1, 1);
Assert.Equal(200, result.StatusCode);
}
@ -54,7 +56,7 @@ namespace DamageAssesment.SurveyResponses.Test
{
var mockResponse = await MockData.getResponse();
mockSurveyResponseService.Setup(service => service.GetSurveyResponsesBySurveyAsync(1, 1)).ReturnsAsync(mockResponse);
var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object);
var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var result = (NoContentResult)await surveyResponseProvider.GetSurveyResponsesAsync(1, 1);
Assert.Equal(204, result.StatusCode);
}
@ -68,7 +70,7 @@ namespace DamageAssesment.SurveyResponses.Test
SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject();
var mockResponse = await MockData.getOkResponse();
mockSurveyResponseService.Setup(service => service.GetSurveyResponsesBySurveyAndLocationAsync(1, 1, 1)).ReturnsAsync(mockResponse);
var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object);
var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var result = (OkObjectResult)await surveyResponseProvider.GetSurveyResponsesBySurveyAndLocationAsync(1, 1, 1);
Assert.Equal(200, result.StatusCode);
}
@ -78,7 +80,7 @@ namespace DamageAssesment.SurveyResponses.Test
{
var mockResponse = await MockData.getResponse();
mockSurveyResponseService.Setup(service => service.GetSurveyResponsesBySurveyAndLocationAsync(1, 1, 1)).ReturnsAsync(mockResponse);
var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object);
var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var result = (NoContentResult)await surveyResponseProvider.GetSurveyResponsesBySurveyAndLocationAsync(1, 1, 1);
Assert.Equal(204, result.StatusCode);
}
@ -89,7 +91,7 @@ namespace DamageAssesment.SurveyResponses.Test
SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject();
var mockResponse = await MockData.getOkResponse();
mockSurveyResponseService.Setup(service => service.GetResponsesByAnswerAsync(1, 1, "Yes", 1)).ReturnsAsync(mockResponse);
var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object);
var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var result = (OkObjectResult)await surveyResponseProvider.GetSurveyResponsesByAnswerAsyncAsync(1, 1, "Yes", 1);
Assert.Equal(200, result.StatusCode);
}
@ -99,7 +101,7 @@ namespace DamageAssesment.SurveyResponses.Test
{
var mockResponse = await MockData.getResponse();
mockSurveyResponseService.Setup(service => service.GetResponsesByAnswerAsync(1, 1, "Yes", 1)).ReturnsAsync(mockResponse);
var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object);
var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var result = (NoContentResult)await surveyResponseProvider.GetSurveyResponsesByAnswerAsyncAsync(1, 1, "Yes", 1);
Assert.Equal(204, result.StatusCode);
}
@ -111,7 +113,7 @@ namespace DamageAssesment.SurveyResponses.Test
SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject();
var mockResponse = await MockData.getOkResponse();
mockSurveyResponseService.Setup(service => service.GetAnswersByRegionAsync(1, 1)).ReturnsAsync(mockResponse);
var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object);
var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var result = (OkObjectResult)await surveyResponseProvider.GetAnswersByRegionAsync(1, 1);
Assert.Equal(200, result.StatusCode);
}
@ -121,7 +123,7 @@ namespace DamageAssesment.SurveyResponses.Test
{
var mockResponse = await MockData.getResponse();
mockSurveyResponseService.Setup(service => service.GetAnswersByRegionAsync(1, 1)).ReturnsAsync(mockResponse);
var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object);
var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var result = (NoContentResult)await surveyResponseProvider.GetAnswersByRegionAsync(1, 1);
Assert.Equal(204, result.StatusCode);
}
@ -132,7 +134,7 @@ namespace DamageAssesment.SurveyResponses.Test
SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject();
var mockResponse = await MockData.getOkResponse();
mockSurveyResponseService.Setup(service => service.GetSurveyResponsesByMaintenanceCenterAsync(1, 1)).ReturnsAsync(mockResponse);
var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object);
var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var result = (OkObjectResult)await surveyResponseProvider.GetAnswersByMaintenaceCentersync(1, 1);
Assert.Equal(200, result.StatusCode);
}
@ -142,7 +144,7 @@ namespace DamageAssesment.SurveyResponses.Test
{
var mockResponse = await MockData.getResponse();
mockSurveyResponseService.Setup(service => service.GetSurveyResponsesByMaintenanceCenterAsync(1, 1)).ReturnsAsync(mockResponse);
var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object);
var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var result = (NoContentResult)await surveyResponseProvider.GetAnswersByMaintenaceCentersync(1, 1);
Assert.Equal(204, result.StatusCode);
}
@ -153,7 +155,7 @@ namespace DamageAssesment.SurveyResponses.Test
SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject();
var mockResponse = await MockData.getOkResponse();
mockSurveyResponseService.Setup(service => service.GetSurveyResponseByIdAsync(1)).ReturnsAsync(mockResponse);
var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object);
var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var result = (OkObjectResult)await surveyResponseProvider.GetSurveyResponseByIdAsync(1);
Assert.Equal(200, result.StatusCode);
}
@ -163,7 +165,7 @@ namespace DamageAssesment.SurveyResponses.Test
{
var mockResponse = await MockData.getResponse();
mockSurveyResponseService.Setup(service => service.GetSurveyResponseByIdAsync(1)).ReturnsAsync(mockResponse);
var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object);
var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var result = (NoContentResult)await surveyResponseProvider.GetSurveyResponseByIdAsync(1);
Assert.Equal(204, result.StatusCode);
}
@ -175,7 +177,7 @@ namespace DamageAssesment.SurveyResponses.Test
SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject();
var mockResponse = await MockData.getOkResponse(mockRequestObject);
mockSurveyResponseService.Setup(service => service.PostSurveyResponseAsync(mockRequestObject)).ReturnsAsync(mockResponse);
var surveyResponseController = new SurveyResponsesController(mockSurveyResponseService.Object);
var surveyResponseController = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var result = (OkObjectResult)await surveyResponseController.PostSurveysAsync(mockRequestObject);
Assert.Equal(200, result.StatusCode);
}
@ -186,7 +188,7 @@ namespace DamageAssesment.SurveyResponses.Test
SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject();
var mockResponse = await MockData.getResponse();
mockSurveyResponseService.Setup(service => service.PostSurveyResponseAsync(mockRequestObject)).ReturnsAsync(mockResponse);
var surveyResponseController = new SurveyResponsesController(mockSurveyResponseService.Object);
var surveyResponseController = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var result = (BadRequestObjectResult)await surveyResponseController.PostSurveysAsync(mockRequestObject);
Assert.Equal(400, result.StatusCode);
}
@ -197,7 +199,7 @@ namespace DamageAssesment.SurveyResponses.Test
SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject();
var mockResponse = await MockData.getOkResponse(mockRequestObject);
mockSurveyResponseService.Setup(service => service.PutSurveyResponseAsync(1, mockRequestObject)).ReturnsAsync(mockResponse);
var surveyResponseController = new SurveyResponsesController(mockSurveyResponseService.Object);
var surveyResponseController = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var result = (OkObjectResult)await surveyResponseController.PutSurveyResponseAsync(1, mockRequestObject);
Assert.Equal(200, result.StatusCode);
}
@ -208,7 +210,7 @@ namespace DamageAssesment.SurveyResponses.Test
SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject();
var mockResponse = await MockData.getResponse();
mockSurveyResponseService.Setup(service => service.PutSurveyResponseAsync(1, mockRequestObject)).ReturnsAsync(mockResponse); ;
var surveyResponseController = new SurveyResponsesController(mockSurveyResponseService.Object);
var surveyResponseController = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var result = (BadRequestObjectResult)await surveyResponseController.PutSurveyResponseAsync(1, mockRequestObject);
Assert.Equal(400, result.StatusCode);
}
@ -219,7 +221,7 @@ namespace DamageAssesment.SurveyResponses.Test
SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject();
var mockResponse = await MockData.getOkResponse(mockRequestObject);
mockSurveyResponseService.Setup(service => service.DeleteSurveyResponseAsync(1)).ReturnsAsync(mockResponse);
var surveyResponseController = new SurveyResponsesController(mockSurveyResponseService.Object);
var surveyResponseController = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var result = (OkObjectResult)await surveyResponseController.DeleteSurveyResponseAsync(1);
Assert.Equal(200, result.StatusCode);
}
@ -229,7 +231,7 @@ namespace DamageAssesment.SurveyResponses.Test
{
var mockResponse = await MockData.getResponse();
mockSurveyResponseService.Setup(service => service.DeleteSurveyResponseAsync(1)).ReturnsAsync(mockResponse); ;
var surveyResponseController = new SurveyResponsesController(mockSurveyResponseService.Object);
var surveyResponseController = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var result = (NotFoundResult)await surveyResponseController.DeleteSurveyResponseAsync(1);
Assert.Equal(404, result.StatusCode);
}

View File

@ -8,10 +8,12 @@ namespace DamageAssesment.Api.Responses.Controllers
public class SurveyResponsesController : ControllerBase
{
private readonly ISurveysResponse surveyResponseProvider;
private readonly IExcelExportService excelExportService;
public SurveyResponsesController(ISurveysResponse surveyResponseProvider)
public SurveyResponsesController(ISurveysResponse surveyResponseProvider, IExcelExportService excelExportService)
{
this.surveyResponseProvider = surveyResponseProvider;
this.excelExportService = excelExportService;
}
/// <summary>
/// GET request for retrieving survey responses.
@ -198,6 +200,9 @@ namespace DamageAssesment.Api.Responses.Controllers
else
return BadRequest(result.ErrorMessage);
}
/// <summary>
/// Get All active surveys .
/// </summary>
[Route("responses/surveys/active")]
[Route("responses/surveys/active/{language:alpha}")]
[Route("responses/surveys/active/{employeeid:int}")]
@ -212,6 +217,23 @@ namespace DamageAssesment.Api.Responses.Controllers
}
return NoContent();
}
/// <summary>
/// Export all survey response data based on survey id.
/// </summary>
[HttpGet]
[Route("responses/surveys/export/{surveyid}")]
public async Task<ActionResult> GetExcelSurveysAsync(int surveyid, string language, bool IsAdmin = false)
{
var result = await this.surveyResponseProvider.ExportSurveyResponsesAsync(surveyid, language, IsAdmin);
if (result.IsSuccess && result.surveyResponses.Count > 0)
{
byte[] fileContents = excelExportService.ExportToExcel<object>(result.surveyResponses);
return File(fileContents, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "data.xlsx");
//return Ok(result.Surveys);
}
return NoContent();
}
//[Route("responses/surveys/active")]
//[Route("responses/surveys/active/{language:alpha}")]
//[HttpGet]
@ -224,6 +246,10 @@ namespace DamageAssesment.Api.Responses.Controllers
// }
// return NoContent();
//}
/// <summary>
/// Get all historical surveys .
/// </summary>
[Route("responses/surveys/historic")]
[Route("responses/surveys/historic/{language:alpha}")]
[Route("responses/surveys/historic/{employeeid:int}")]

View File

@ -11,6 +11,7 @@
<ItemGroup>
<PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="12.0.1" />
<PackageReference Include="EPPlus" Version="7.0.0" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.21" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.5" />
<PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="7.0.5" />

View File

@ -0,0 +1,7 @@
namespace DamageAssesment.Api.Responses.Interfaces
{
public interface IExcelExportService
{
public byte[] ExportToExcel<T1>(List<object> responses);
}
}

View File

@ -4,8 +4,9 @@ namespace DamageAssesment.Api.Responses.Interfaces
{
public interface IQuestionServiceProvider
{
Task<List<Question>> getQuestionsAsync();
Task<List<Question>> getQuestionsAsync(string language);
Task<List<SurveyQuestions>> getSurveyQuestionsAsync(int surveyId);
Task<Question> getQuestionsAsync(int questionId);
Task<List<QuestionCategory>> GetQuestionCategoriesAsync(string? language);
}
}

View File

@ -9,6 +9,7 @@ namespace DamageAssesment.Api.Responses.Interfaces
Task<(bool IsSuccess, Models.SurveyResponse SurveyResponse, string ErrorMessage)> PostSurveyResponseAsync(Models.SurveyResponse surveyResponse);
// Task<(bool IsSuccess,dynamic surveyResponses, string ErrorMessage)> GetSurveyResponseAsync(int responseId);
Task<(bool IsSuccess, dynamic surveyResponses, string ErrorMessage)> GetSurveyResponsesAsync(int employeeid);
Task<(bool IsSuccess, List<object> surveyResponses, string ErrorMessage)> ExportSurveyResponsesAsync(int surveyId, string language, bool IsAdmin);
Task<(bool IsSuccess, dynamic Surveys, string ErrorMessage)> GetActiveSurveysAsync(int? employeeid, string language);
Task<(bool IsSuccess, dynamic Surveys, string ErrorMessage)> GetHistoricSurveysAsync(int? employeeid, string language);
Task<(bool IsSuccess, Models.SurveyResponse SurveyResponse, string ErrorMessage)> PutSurveyResponseAsync(int Id, Models.SurveyResponse surveyResponse);

View File

@ -11,6 +11,7 @@ namespace DamageAssesment.Api.Responses.Models
public int? AnswerId { get; set; }
public bool IsDeleted { get; set; }
public string FileName { get; set; }
public Attachment(int answerId, string uri)
{

View File

@ -4,8 +4,13 @@
{
public int Id { get; set; }
public int RegionId { get; set; }
public string LocationCode { get; set; }
public string Name { get; set; }
public string MaintenanceCenter { get; set; }
public string SchoolType { get; set; }
public int? DataValue { get; set; }
public int? Enrollment { get; set; }
public double? Longitute { get; set; }
public double? Latitude { get; set; }
}
}

View File

@ -0,0 +1,10 @@
namespace DamageAssesment.Api.Responses.Models
{
public class QuestionCategory
{
public int Id { get; set; }
public string IconName { get; set; }
public string IconLibrary { get; set; }
public object Titles { get; set; }
}
}

View File

@ -2,13 +2,20 @@
namespace DamageAssesment.Api.Responses.Models
{
public enum SurveyStatus
{
PENDING,
ACTIVE,
INACTIVE
}
public class Survey
{
public int Id { get; set; }
public bool IsEnabled { get; set; }
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
public DateTime? StartDate { get; set; }
public DateTime? EndDate { get; set; }
public DateTime CreatedDate { get; set; }
public string Status { get; set; }
public Dictionary<string, string> Titles { get; set; }
}
}

View File

@ -0,0 +1,24 @@
namespace DamageAssesment.Api.Responses.Models
{
public class SurveyExport
{
public int Id { get; set; }
public string SurveyQuestion { get; set; }
public string Answer { get; set; }
public string Category { get; set; }
public string School { get; set; }
public string Location { get; set; }
public string Region { get; set; }
public string MC { get; set; }
public string ResponseDate { get; set; }
public string Notes { get; set; }
public string Attachment1 { get; set; }
public string Attachment2 { get; set; }
public string Attachment3 { get; set; }
public string Attachment4 { get; set; }
public string Attachment5 { get; set; }
}
}

View File

@ -26,6 +26,7 @@ builder.Services.AddScoped<IQuestionServiceProvider, QuestionServiceProvider>();
builder.Services.AddScoped<IEmployeeServiceProvider, EmployeeServiceProvider>();
builder.Services.AddScoped<IAttachmentServiceProvider, AttachmentServiceProvider>();
builder.Services.AddScoped<ISurveyServiceProvider, SurveyServiceProvider>();
builder.Services.AddScoped<IExcelExportService, ExcelExportService>();
builder.Services.AddHttpClient<IHttpUtil, HttpUtil>().
AddTransientHttpErrorPolicy(policy => policy.WaitAndRetryAsync(maxApiCallRetries, _ => TimeSpan.FromSeconds(intervalToRetry))).

View File

@ -0,0 +1,62 @@
using DamageAssesment.Api.Responses.Interfaces;
using DamageAssesment.Api.Responses.Models;
using OfficeOpenXml;
using System.Collections.Generic;
using System.ComponentModel;
namespace DamageAssesment.Api.Responses.Providers
{
public class ExcelExportService : IExcelExportService
{
public byte[] ExportToExcel<T1>(List<object> responses)
{
ExcelPackage.LicenseContext = OfficeOpenXml.LicenseContext.NonCommercial;
using (var package = new ExcelPackage())
{
// Create the first worksheet and populate it with responses
var workSheet1 = package.Workbook.Worksheets.Add("responses");
PopulateWorksheet(workSheet1, responses);
return package.GetAsByteArray();
}
}
private void PopulateWorksheet(ExcelWorksheet worksheet, List<object> data)
{
if (data.Count > 0)
{
var properties = data[0].GetType().GetProperties();
List<int> IsAttchments = new List<int>();
// Add column headers
for (int col = 1; col <= properties.Length; col++)
{
worksheet.Cells[1, col].Value = properties[col - 1].Name;
if (properties[col - 1].Name.ToLower().Contains("attachment"))
IsAttchments.Add(col);
}
// Add data
for (int row = 2; row <= data.Count + 1; row++)
{
for (int col = 1; col <= properties.Length; col++)
{
string value = Convert.ToString(properties[col - 1].GetValue(data[row - 2]));
if (IsAttchments.Where(a => a == col).Count() > 0 && !string.IsNullOrEmpty(value))
{
List<string> attachments = value.Split("##").ToList();
try
{
Uri linkUri = new Uri(attachments[1]);
worksheet.Cells[row, col].Value = attachments[0];
worksheet.Cells[row, col].Style.Font.UnderLine = true;
}
catch { worksheet.Cells[row, col].Value = attachments[1]; }
}
else
worksheet.Cells[row, col].Value = value;
}
}
}
}
}
}

View File

@ -3,6 +3,9 @@ using DamageAssesment.Api.Responses.Db;
using DamageAssesment.Api.Responses.Interfaces;
using DamageAssesment.Api.Responses.Models;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Internal;
using System.Reflection;
using System.Text.Json;
namespace DamageAssesment.Api.Responses.Providers
{
@ -43,7 +46,6 @@ namespace DamageAssesment.Api.Responses.Providers
// Create and save SurveyResponse records with references to existing Employee and Location records
surveyResponseDbContext.SurveyResponses.Add(new Db.SurveyResponse { SurveyId = 1, EmployeeId = 1, LocationId = 1, ClientDevice = "Mobile", Latitude = 98.8767, Longitute = -129.9897, KeyAnswerResult = "true", CreatedDate = DateTime.Now });
surveyResponseDbContext.SurveyResponses.Add(new Db.SurveyResponse { SurveyId = 1, EmployeeId = 2, LocationId = 2, ClientDevice = "Mobile", Latitude = 98.8767, Longitute = -129.9897, KeyAnswerResult = "true", CreatedDate = DateTime.Now });
surveyResponseDbContext.SaveChanges();
}
}
@ -119,7 +121,7 @@ namespace DamageAssesment.Api.Responses.Providers
logger?.LogInformation("Querying to get SurveyResponse object from DB");
//get all the survey that already taken by the employee
var surveys = await surveyServiceProvider.getSurveysAsync(language);
surveys = surveys.Where(s => s.IsEnabled == true && s.StartDate <= DateTime.Now && s.EndDate >= DateTime.Now).ToList();
surveys = surveys.Where(s => s.IsEnabled == true && s.Status == SurveyStatus.ACTIVE.ToString()).ToList();
if (employeeid == null || employeeid == 0)
return (true, surveys, null);
List<int> listOfsurveysId = await surveyResponseDbContext.SurveyResponses.Where(x => x.EmployeeId == employeeid.Value).Select(y => y.SurveyId).ToListAsync();
@ -141,11 +143,10 @@ namespace DamageAssesment.Api.Responses.Providers
var surveys = await surveyServiceProvider.getSurveysAsync(language);
// returning only historic data: end date is less than current date.
surveys = surveys.Where(s => s.EndDate < DateTime.Now).ToList();
surveys = surveys.Where(s => s.Status == SurveyStatus.INACTIVE.ToString()).ToList();
if (employeeid == null || employeeid == 0)
return (true, surveys, null);
var surveyResponses = await surveyResponseDbContext.SurveyResponses.Where(x => x.EmployeeId == employeeid).ToListAsync();
var historicSurveys = from s in surveys
from r in surveyResponses
where s.Id == r.SurveyId
@ -308,6 +309,26 @@ namespace DamageAssesment.Api.Responses.Providers
return (false, null, ex.Message);
}
}
public async Task<(bool IsSuccess, List<object> surveyResponses, string ErrorMessage)> ExportSurveyResponsesAsync(int surveyId, string language, bool isadmin)
{
try
{
var responses = await getAllSurveyResponsesExcelAsync(surveyId, language, isadmin);
if (responses != null)
return (true, responses, "Request Successful.");
else
{
responses = null;
return (true, responses, "Empty object returned");
}
}
catch (Exception ex)
{
logger?.LogError(ex.ToString());
return (false, null, ex.Message);
}
}
public async Task<(bool IsSuccess, Models.SurveyResponse SurveyResponse, string ErrorMessage)> PostSurveyResponseAsync(Models.SurveyResponse surveyResponse)
{
@ -488,20 +509,22 @@ namespace DamageAssesment.Api.Responses.Providers
{
var employee = await employeeServiceProvider.getEmployeeAsync(surveyResponse.EmployeeId);
var answers = await answerServiceProvider.GetAnswersByResponseIdAsync(surveyResponse.Id);
var allQuestions = await questionServiceProvider.getQuestionsAsync();
var allQuestions = await questionServiceProvider.getQuestionsAsync(null);
var questions = allQuestions.Where(s => s.SurveyId == surveyResponse.SurveyId);
var attachments = await attachmentServiceProvider.getAttachmentsAsync();
var result = new
{
var Locations = await locationServiceProvider.getLocationsAsync();
var location = Locations.Where(a => a.Id == surveyResponse.LocationId).FirstOrDefault();
var result = new{
surveyResponse.Id,
surveyResponse.SurveyId,
surveyResponse.LocationId,
surveyResponse.EmployeeId,
surveyResponse.ClientDevice,
surveyResponse.KeyAnswerResult,
surveyResponse.Longitute,
surveyResponse.Latitude,
DataValue=(location!=null?location.DataValue:0),
Enrollment= (location != null ? location.Enrollment : 0),
Longitute = (location != null ? location.Longitute : surveyResponse.Longitute),
Latitude=(location != null ? location.Latitude : surveyResponse.Latitude),
Employee = employee,
answers = from ans in answers
select new
@ -544,7 +567,8 @@ namespace DamageAssesment.Api.Responses.Providers
}
var answers = await answerServiceProvider.getAnswersAsync();
var questions = await questionServiceProvider.getQuestionsAsync();
var questions = await questionServiceProvider.getQuestionsAsync(null);
var Locations = await locationServiceProvider.getLocationsAsync();
var surveyQuestions = from q in questions where q.SurveyId == surveyId select q;
//var surveyQuestions = await questionServiceProvider.getSurveyQuestionsAsync(surveyId);
@ -554,6 +578,7 @@ namespace DamageAssesment.Api.Responses.Providers
if (employeeid == 0)
{
var result = from r in surveyResonses
join loc in Locations on r.LocationId equals loc.Id
select new
{
r.Id,
@ -562,8 +587,10 @@ namespace DamageAssesment.Api.Responses.Providers
r.EmployeeId,
r.ClientDevice,
r.KeyAnswerResult,
r.Longitute,
r.Latitude,
loc.DataValue,
loc.Enrollment,
loc.Longitute,
loc.Latitude,
Employee = (from e in employees where e.Id == r.EmployeeId select new { e.Id, e.Name, e.BirthDate, e.Email, e.OfficePhoneNumber }).SingleOrDefault(),
answers = from ans in answers
where ans.SurveyResponseId == r.Id
@ -588,6 +615,7 @@ namespace DamageAssesment.Api.Responses.Providers
_employee = new { employee.Id, employee.Name, employee.BirthDate, employee.Email, employee.OfficePhoneNumber };
}
var result = from r in surveyResonses
join loc in Locations on r.LocationId equals loc.Id
select new
{
r.Id,
@ -596,8 +624,10 @@ namespace DamageAssesment.Api.Responses.Providers
r.EmployeeId,
r.ClientDevice,
r.KeyAnswerResult,
r.Longitute,
r.Latitude,
loc.DataValue,
loc.Enrollment,
loc.Longitute,
loc.Latitude,
Employee = _employee,
answers = from ans in answers
where ans.SurveyResponseId == r.Id
@ -650,10 +680,12 @@ namespace DamageAssesment.Api.Responses.Providers
var answers = await answerServiceProvider.getAnswersAsync();
var questions = await questionServiceProvider.getQuestionsAsync();
var questions = await questionServiceProvider.getQuestionsAsync(null);
var attachments = await attachmentServiceProvider.getAttachmentsAsync();
var Locations = await locationServiceProvider.getLocationsAsync();
var result = from r in surveyResonses
join loc in Locations on r.LocationId equals loc.Id
select new
{
r.Id,
@ -662,8 +694,10 @@ namespace DamageAssesment.Api.Responses.Providers
r.EmployeeId,
r.ClientDevice,
r.KeyAnswerResult,
r.Longitute,
r.Latitude,
loc.DataValue,
loc.Enrollment,
loc.Longitute,
loc.Latitude,
Employee = employeeid != 0 ? _employee : (from e in employees where r.EmployeeId == e.Id select new { e.Id, e.Name, e.BirthDate, e.Email, e.OfficePhoneNumber }).SingleOrDefault(),
answers = from ans in answers
where ans.SurveyResponseId == r.Id
@ -687,7 +721,136 @@ namespace DamageAssesment.Api.Responses.Providers
return null;
}
}
//Method to get All Survey Responses for excel export
private async Task<List<object>> getAllSurveyResponsesExcelAsync(int surveyId, string language, bool isadmin)
{
try
{
if (string.IsNullOrEmpty(language)) language = "en";
List<Db.SurveyResponse> surveyResonses;
surveyResonses = await surveyResponseDbContext.SurveyResponses.Where(a => a.SurveyId == surveyId).ToListAsync();
var answers = await answerServiceProvider.getAnswersAsync();
var Locations = await locationServiceProvider.getLocationsAsync();
var regions = await regionServiceProvider.getRegionsAsync();
var questions = await questionServiceProvider.getQuestionsAsync(language);
var categories = await questionServiceProvider.GetQuestionCategoriesAsync(language);
var attachments = await attachmentServiceProvider.getAttachmentsAsync();
List<object> questionLists = new List<object>();
var allques = from res in surveyResonses
join loc in Locations on res.LocationId equals loc.Id
join reg in regions on loc.RegionId equals reg.Id
join ans in answers on res.Id equals ans.SurveyResponseId
join q in questions on ans.QuestionId equals q.Id
join qc in categories on q.CategoryId equals qc.Id
select new
{
responseId = res.Id,
questionId = q.Id,
QuestionNumber = q.QuestionNumber,
Category = JsonSerializer.Deserialize<Dictionary<string, string>>(qc.Titles.ToString())[language],
question = q.Text[language],
answerId = ans.Id,
AnswerText = ans.AnswerText,
Comment = ans.Comment,
Location = loc.LocationCode,
school = loc.Name,
Region = reg.Name,
MC = loc.MaintenanceCenter,
ResponseDate = res.CreatedDate,
EmployeeId = res.EmployeeId,
ClientDevice = res.ClientDevice,
Attachments = attachments.Where(a => a.AnswerId == ans.Id).Select(a => a.FileName + "##" + a.URI).ToList()
};
List<object> allresoponses = new List<object>();
foreach (var item in allques)
{
List<string> ansattachments = item.Attachments.ToList();
//// Initialize the attachment dictionary
//var attachmentsobject = new Dictionary<string, string>();
//for (int i = 0; i < ansattachments.Count; i++)
//{
// attachmentsobject["Attachment"+(i+1).ToString()] = ansattachments[i];
//}
string[] variables = new string[5];
for (int i = 0; i < 5; i++) // Assuming you want to assign 5 values
{
if (i < ansattachments.Count())
{
variables[i] = ansattachments[i];
}
else
{
variables[i] = string.Empty; // or null, or any other default value
}
}
// Now, you can access the values using the variables
string att1 = variables[0], att2 = variables[1], att3 = variables[2], att4 = variables[3], att5 = variables[4];
object response;
if (isadmin)
{
response = new
{
SurveyQuestion = item.question,
Answer = item.AnswerText,
Category = item.Category,
School = item.school,
Location = item.Location,
Region = item.Region,
MC = item.MC,
ResponseDate = item.ResponseDate.ToString(),
Notes = item.Comment,
Attachment1 = att1,
Attachment2 = att2,
Attachment3 = att3,
Attachment4 = att4,
Attachment5 = att5,
User = item.EmployeeId,
DeviceType = item.ClientDevice,
Reference = item.responseId
};
// Add the attachment dictionary to the response object
// response = new { response, Attachments = attachments };
}
else
{
response = new
{
SurveyQuestion = item.question,
Answer = item.AnswerText,
Category = item.Category,
School = item.school,
Location = item.Location,
Region = item.Region,
MC = item.MC,
ResponseDate = item.ResponseDate.ToString(),
Notes = item.Comment,
Attachment1 = att1,
Attachment2 = att2,
Attachment3 = att3,
Attachment4 = att4,
Attachment5 = att5
};
// Add the attachment dictionary to the response object
// response = new { response, Attachments = attachments };
}
allresoponses.Add(response);
}
return allresoponses;
}
catch (Exception ex)
{
logger?.LogError($"Exception Found : {ex.Message} - Ref: SurveyResponsesProvider.getSurveyResponseBySurveyIdAsync()");
return null;
}
}
//Method to get Answers By Maintenance Center by surveyId
private async Task<dynamic> getResultsByMaintenanceCenterAsync(int surveyId, int employeeid)
@ -784,11 +947,13 @@ namespace DamageAssesment.Api.Responses.Providers
}
var answers = await answerServiceProvider.getAnswersAsync();
var questions = await questionServiceProvider.getQuestionsAsync();
var questions = await questionServiceProvider.getQuestionsAsync(null);
var surveyQuestions = from q in questions where q.SurveyId == surveyId select q;
var attachments = await attachmentServiceProvider.getAttachmentsAsync();
var Locations = await locationServiceProvider.getLocationsAsync();
var result = from r in surveyResonses
join loc in Locations on r.LocationId equals loc.Id
select new
{
r.Id,
@ -797,8 +962,10 @@ namespace DamageAssesment.Api.Responses.Providers
r.EmployeeId,
r.ClientDevice,
r.KeyAnswerResult,
r.Longitute,
r.Latitude,
loc.DataValue,
loc.Enrollment,
loc.Longitute,
loc.Latitude,
Employee = employeeid != 0 ? _employee : (from e in employees where r.EmployeeId == e.Id select new { e.Id, e.Name, e.BirthDate, e.Email, e.OfficePhoneNumber }).SingleOrDefault(),
answers = from ans in answers
where ans.SurveyResponseId == r.Id
@ -854,8 +1021,9 @@ namespace DamageAssesment.Api.Responses.Providers
// var employees = await employeeServiceProvider.getEmployeesAsync();
var answers = await answerServiceProvider.getAnswersAsync();
var attachments = await attachmentServiceProvider.getAttachmentsAsync();
var Locations = await locationServiceProvider.getLocationsAsync();
var result = from r in surveyResponses
join loc in Locations on r.LocationId equals loc.Id
select new
{
r.Id,
@ -864,8 +1032,10 @@ namespace DamageAssesment.Api.Responses.Providers
r.EmployeeId,
r.ClientDevice,
r.KeyAnswerResult,
r.Longitute,
r.Latitude,
loc.DataValue,
loc.Enrollment,
loc.Longitute,
loc.Latitude,
Employee = employeeid != 0 ? _employee : (from e in employees where r.EmployeeId == e.Id select new { e.Id, e.Name, e.BirthDate, e.Email, e.OfficePhoneNumber }).SingleOrDefault(),
answers = from ans in answers
where ans.SurveyResponseId == r.Id

View File

@ -10,10 +10,12 @@ namespace DamageAssesment.Api.Responses.Services
{
}
public async Task<List<Question>> getQuestionsAsync()
public async Task<List<Question>> getQuestionsAsync(string language)
{
try
{
if (!string.IsNullOrEmpty(language))
url = url + "/" + language;
var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null);
var questions = JsonConvert.DeserializeObject<List<Question>>(responseJsonString);
@ -27,6 +29,27 @@ namespace DamageAssesment.Api.Responses.Services
return new List<Question>();
}
}
public async Task<List<QuestionCategory>> GetQuestionCategoriesAsync(string? language)
{
try
{
url = urlBase + configuration.GetValue<string>("RessourceSettings:QuestionCategory");
if (!string.IsNullOrEmpty(language))
url = url + "/" + language;
var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null);
var questions = JsonConvert.DeserializeObject<List<QuestionCategory>>(responseJsonString);
if (questions == null || !questions.Any())
return new List<QuestionCategory>();
else return questions;
}
catch (Exception ex)
{
logger?.LogError($"Exception Found : {ex.Message} - Ref: QuestionServiceProvider.GetQuestionCategoriesAsync()");
return new List<QuestionCategory>();
}
}
public async Task<List<SurveyQuestions>> getSurveyQuestionsAsync(int surveyId)
{

View File

@ -25,12 +25,12 @@
"AttachmentUrlBase": "http://damageassesment.api.attachments:80",
"SurveyUrlBase": "http://damageassesment.api.surveys:80"
},
"RessourceSettings": {
"Employee": "/employees",
"EmployeeById": "/employees/{0}",
"Question": "/questions",
"QuestionById": "/questions/{0}",
"QuestionCategory": "/questions/categories",
"SurveyQuestion": "/questions/bysurvey/{0}",
"Survey": "/surveys",
"SurveyById": "/surveys/{0}",

View File

@ -3,6 +3,7 @@ using System.ComponentModel.DataAnnotations.Schema;
namespace DamageAssesment.Api.Surveys.Db
{
[Table("Surveys")]
public class Survey
{
[Key]
@ -12,9 +13,9 @@ namespace DamageAssesment.Api.Surveys.Db
public bool IsEnabled { get; set; }
public DateTime StartDate { get; set; }
public DateTime? StartDate { get; set; }
public DateTime EndDate { get; set; }
public DateTime? EndDate { get; set; }
public DateTime CreatedDate { get; set; } = DateTime.Now;
/*

View File

@ -21,8 +21,8 @@ namespace DamageAssesment.Api.Surveys.Models
{
public int Id { get; set; }
public bool IsEnabled { get; set; }
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
public DateTime CreatedDate { get; set; }
public DateTime? StartDate { get; set; }
public DateTime? EndDate { get; set; }
public DateTime? CreatedDate { get; set; }
}
}

View File

@ -45,9 +45,9 @@ namespace DamageAssesment.Api.Surveys.Providers
surveyDbContext.SurveysTranslation.Add(new Db.SurveyTranslation { SurveyId = survey2.Id, Language = "es", Title = "Encuesta sobre las secuelas del huracán Andrew" });
surveyDbContext.SurveysTranslation.Add(new Db.SurveyTranslation { SurveyId = survey2.Id, Language = "fr", Title = "Enquête sur les conséquences de l'ouragan Andrew" });
surveyDbContext.SurveysTranslation.Add(new Db.SurveyTranslation { SurveyId = survey3.Id, Language = "en", Title = "Hurricane Idalia Aftermath Survey" });
surveyDbContext.SurveysTranslation.Add(new Db.SurveyTranslation { SurveyId = survey3.Id, Language = "es", Title = "Encuesta sobre las secuelas del huracán Idalia" });
surveyDbContext.SurveysTranslation.Add(new Db.SurveyTranslation { SurveyId = survey3.Id, Language = "fr", Title = "Enquête sur les conséquences de l'ouragan Idalia" });
surveyDbContext.SurveysTranslation.Add(new Db.SurveyTranslation { SurveyId = survey3.Id, Language = "en", Title = "Hurricane Irma" });
surveyDbContext.SurveysTranslation.Add(new Db.SurveyTranslation { SurveyId = survey3.Id, Language = "es", Title = "Huracán Irma" });
surveyDbContext.SurveysTranslation.Add(new Db.SurveyTranslation { SurveyId = survey3.Id, Language = "fr", Title = "Ouragan Irma" });
surveyDbContext.SaveChanges();
}
@ -85,7 +85,9 @@ namespace DamageAssesment.Api.Surveys.Providers
MultiLanguage = dict;
return MultiLanguage;
}
public string GetStatus(DateTime StartDate,DateTime EndDate)
public string GetStatus(DateTime? StartDate, DateTime? EndDate)
{
try
{
if (StartDate > DateTime.Now)
return SurveyStatus.PENDING.ToString();
@ -94,6 +96,11 @@ namespace DamageAssesment.Api.Surveys.Providers
else
return SurveyStatus.INACTIVE.ToString();
}
catch
{
return SurveyStatus.INACTIVE.ToString();
}
}
// Method to get surveys asynchronously with multi-language support
public async Task<(bool IsSuccess, IEnumerable<Models.MultiLanSurvey> Surveys, string ErrorMessage)> GetSurveysAsync(string language)
{
@ -136,7 +143,8 @@ namespace DamageAssesment.Api.Surveys.Providers
try
{
logger?.LogInformation("Query Survey");
var survey = await surveyDbContext.Surveys.SingleOrDefaultAsync(s => s.Id == id && s.IsEnabled == true);
// removed is enabled becuase we are using it in responses to get response
var survey = await surveyDbContext.Surveys.SingleOrDefaultAsync(s => s.Id == id);
if (survey != null)
{
@ -217,12 +225,10 @@ namespace DamageAssesment.Api.Surveys.Providers
_survey = mapper.Map<Models.Survey, Db.Survey>(survey);
surveyDbContext.Surveys.Update(_survey);
await surveyDbContext.SaveChangesAsync();
List<Db.SurveyTranslation> listSurveyTranslation = new List<Db.SurveyTranslation>();
Random random = new Random();
foreach (var title in survey.Titles)
{
listSurveyTranslation.Add(new Db.SurveyTranslation { Id = random.Next(), SurveyId = _survey.Id, Language = title.Language, Title = title.Title });
listSurveyTranslation.Add(new Db.SurveyTranslation { SurveyId = _survey.Id, Language = title.Language, Title = title.Title });
}
surveyDbContext.SurveysTranslation.AddRange(listSurveyTranslation);
await surveyDbContext.SaveChangesAsync();