Compare commits

..

7 Commits

Author SHA1 Message Date
513049287c changed download url format and added new endpoint for doculink isactive update 2023-12-04 14:32:32 -05:00
fcc0205175 added IsActive flag in doculinks request 2023-12-04 09:52:05 -05:00
281a789deb fixed question transation issue 2023-11-15 09:05:20 -05:00
fc154274a0 Added new endpoint for creating multiple questions 2023-11-14 15:16:15 -05:00
19fac4d810 completed heatmap api changes for location and response api 2023-11-07 17:04:19 -05:00
17cd993a56 Merged PR 56: fixed survey issue in response level, and added logic for start and end date...
fixed survey issue in response level, and added logic for start and end date as optional date.
2023-11-01 18:34:47 +00:00
6fbe21979f Merged PR 53: fixed survey put issue, and added export excel in responses
fixed survey put issue, amd added export excel in responses
2023-11-01 13:29:16 +00:00
120 changed files with 680 additions and 3126 deletions

View File

@ -1,6 +1,7 @@
using DamageAssesment.Api.Answers.Interfaces;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Microsoft.OpenApi.Any;
namespace DamageAssesment.Api.Answers.Controllers
{
@ -15,7 +16,7 @@ namespace DamageAssesment.Api.Answers.Controllers
/// <summary>
/// Get all answers
/// </summary>
[Authorize(Roles = "admin")]
[HttpGet("answers")]
public async Task<ActionResult> GetAnswersAsync() {
@ -31,7 +32,7 @@ namespace DamageAssesment.Api.Answers.Controllers
/// Get an answer based on answerId.
/// </summary>
[Authorize(Roles = "admin")]
[HttpGet("answers/{id}")]
public async Task<ActionResult> GetAnswerByIdAsync(int id)
{
@ -47,7 +48,6 @@ namespace DamageAssesment.Api.Answers.Controllers
/// <summary>
/// Get all answers based on responseId.
/// </summary>
[Authorize(Roles = "admin")]
[HttpGet("answers/byresponse/{responseid}")]
public async Task<IActionResult> GetAnswersByResponseId(int responseid)
{
@ -61,7 +61,7 @@ namespace DamageAssesment.Api.Answers.Controllers
/// <summary>
/// Get all answers based on questionId.
/// </summary>
[Authorize(Roles = "admin")]
[HttpGet("answers/byquestion/{questionid}")]
public async Task<IActionResult> AnswersByQuestionId(int questionid)
{
@ -75,7 +75,7 @@ namespace DamageAssesment.Api.Answers.Controllers
/// <summary>
/// Update an existing answer.
/// </summary>
[Authorize(Roles = "admin")]
[HttpPut("answers")]
public async Task<IActionResult> UpdateAnswer(Models.Answer answer)
{
@ -96,7 +96,7 @@ namespace DamageAssesment.Api.Answers.Controllers
/// <summary>
/// Save a new answer.
/// </summary>
[Authorize(Roles = "admin")]
[HttpPost("answers")]
public async Task<IActionResult> CreateAnswer(Models.Answer answer)
{
@ -114,7 +114,7 @@ namespace DamageAssesment.Api.Answers.Controllers
/// <summary>
/// Delete an existing answer.
/// </summary>
[Authorize(Roles = "admin")]
[HttpDelete("answers/{id}")]
public async Task<IActionResult> DeleteAnswer(int id)
{

View File

@ -1,77 +1,23 @@
using DamageAssesment.Api.Answers.Db;
using DamageAssesment.Api.Answers.Interfaces;
using DamageAssesment.Api.Answers.Providers;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.EntityFrameworkCore;
using Microsoft.IdentityModel.Tokens;
using Microsoft.OpenApi.Models;
using System.Reflection;
using System.Text;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddCors(p => p.AddPolicy("DamageAppCorsPolicy", build => {
build.WithOrigins("*").AllowAnyMethod().AllowAnyHeader().AllowAnyOrigin();
}));
var authkey = builder.Configuration.GetValue<string>("JwtSettings:securitykey");
builder.Services.AddAuthentication(item =>
{
item.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
item.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(item =>
{
item.RequireHttpsMetadata = true;
item.SaveToken = true;
item.TokenValidationParameters = new TokenValidationParameters()
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(authkey)),
ValidateIssuer = false,
ValidateAudience = false,
ClockSkew = TimeSpan.Zero
};
});
// Add services to the container.
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
//builder.Services.AddSwaggerGen();
builder.Services.AddSwaggerGen(options =>
builder.Services.AddSwaggerGen(c =>
{
// Include XML comments from your assembly
var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
options.IncludeXmlComments(xmlPath);
OpenApiSecurityScheme securityDefinition = new OpenApiSecurityScheme()
{
Name = "Bearer",
BearerFormat = "JWT",
Scheme = "bearer",
Description = "Specify the authorization token.",
In = ParameterLocation.Header,
Type = SecuritySchemeType.Http,
};
options.AddSecurityDefinition("jwt_auth", securityDefinition);
// Make sure swagger UI requires a Bearer token specified
OpenApiSecurityScheme securityScheme = new OpenApiSecurityScheme()
{
Reference = new OpenApiReference()
{
Id = "jwt_auth",
Type = ReferenceType.SecurityScheme
}
};
OpenApiSecurityRequirement securityRequirements = new OpenApiSecurityRequirement()
{
{securityScheme, new string[] { }},
};
options.AddSecurityRequirement(securityRequirements);
c.IncludeXmlComments(xmlPath);
});
builder.Services.AddScoped<IAnswersProvider, AnswersProvider>();
builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies()); //4/30
@ -89,8 +35,7 @@ if (app.Environment.IsDevelopment())
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseCors("DamageAppCorsPolicy");
app.UseAuthentication();
app.UseAuthorization();
app.MapControllers();

View File

@ -11,6 +11,7 @@
"AllowedHosts": "*",
"ConnectionStrings": {
//"AnswerConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;"
// "AnswerConnection": "Server=localhost,1433;Database=da_survey_dev;User Id=sa;Password=Password123;TrustServerCertificate=True;",
"AnswerConnection": "Server=207.180.248.35;Database=da_survey_dev;User Id=sa;Password=YourStrongPassw0rd;TrustServerCertificate=True;"
}

View File

@ -80,7 +80,7 @@ namespace DamageAssesment.Api.Attachments.Test
mockAttachmentService.Setup(service => service.PostAttachmentAsync(mockInputAttachment)).ReturnsAsync(mockResponse);
var AttachmentProvider = new AttachmentsController(mockAttachmentService.Object, mockUploadService.Object);
var result = (NoContentResult)await AttachmentProvider.UploadAttachmentAsync(AttachmentResponse);
var result = (NoContentResult) await AttachmentProvider.UploadAttachmentAsync(AttachmentResponse);
Assert.Equal(204, result.StatusCode);
}
@ -95,8 +95,8 @@ namespace DamageAssesment.Api.Attachments.Test
mockAttachmentService.Setup(service => service.PostAttachmentAsync(mockInputAttachment)).ReturnsAsync(mockResponse);
var AttachmentProvider = new AttachmentsController(mockAttachmentService.Object, mockUploadService.Object);
AttachmentInfo attachmentInfo = new AttachmentInfo();
var result = (BadRequestObjectResult)await AttachmentProvider.UploadAttachmentAsync(attachmentInfo);
AttachmentInfo attachmentInfo=new AttachmentInfo();
var result = (BadRequestObjectResult) await AttachmentProvider.UploadAttachmentAsync(attachmentInfo);
Assert.Equal(400, result.StatusCode);
}
@ -112,7 +112,7 @@ namespace DamageAssesment.Api.Attachments.Test
mockAttachmentService.Setup(service => service.PostAttachmentAsync(mockInputAttachment)).ReturnsAsync(mockResponse);
var AttachmentProvider = new AttachmentsController(mockAttachmentService.Object, mockUploadService.Object);
var result = (NoContentResult)await AttachmentProvider.UpdateAttachmentAsync(AttachmentResponse);
var result = (NoContentResult) await AttachmentProvider.UpdateAttachmentAsync(AttachmentResponse);
Assert.Equal(204, result.StatusCode);
}
@ -128,7 +128,7 @@ namespace DamageAssesment.Api.Attachments.Test
var AttachmentProvider = new AttachmentsController(mockAttachmentService.Object, mockUploadService.Object);
AttachmentInfo attachmentInfo = new AttachmentInfo();
var result = (BadRequestObjectResult)await AttachmentProvider.UpdateAttachmentAsync(attachmentInfo);
var result = (BadRequestObjectResult) await AttachmentProvider.UpdateAttachmentAsync(attachmentInfo);
Assert.Equal(400, result.StatusCode);
}

View File

@ -1,7 +1,6 @@
using Azure;
using DamageAssesment.Api.Attachments.Interfaces;
using DamageAssesment.Api.Attachments.Models;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System.Net.Http.Headers;
@ -13,17 +12,16 @@ namespace DamageAssesment.Api.Attachments.Controllers
{
private IAttachmentsProvider AttachmentProvider;
private IUploadService UploadService;
private IAzureBlobService azureBlobService;
public AttachmentsController(IAttachmentsProvider AttachmentsProvider, IUploadService UploadService)
public AttachmentsController(IAttachmentsProvider AttachmentsProvider, IUploadService uploadService)
{
this.AttachmentProvider = AttachmentsProvider;
this.UploadService = UploadService;
this.UploadService = uploadService;
}
/// <summary>
/// Get all attachments.
/// </summary>
[Authorize(Roles = "admin")]
[HttpGet("attachments")]
public async Task<ActionResult> GetAttachmentsAsync()
{
@ -39,7 +37,6 @@ namespace DamageAssesment.Api.Attachments.Controllers
/// <summary>
/// Get all attachments by attachmentId.
/// </summary>
[Authorize(Roles = "admin")]
[HttpGet("attachments/{id}")]
public async Task<ActionResult> GetAttachmentbyIdAsync(int id)
{
@ -83,7 +80,7 @@ namespace DamageAssesment.Api.Attachments.Controllers
/// <summary>
/// Save new Attachment(s)
/// </summary>
[Authorize(Roles = "admin")]
[HttpPost("attachments"), DisableRequestSizeLimit]
public async Task<IActionResult> UploadAttachmentAsync(AttachmentInfo attachmentInfo)
{
@ -92,7 +89,7 @@ namespace DamageAssesment.Api.Attachments.Controllers
if (attachmentInfo.Answers.Count > 0)
{
var Attachments = await this.AttachmentProvider.GetAttachmentCounter();
List<Models.Attachment> attachments = UploadService.UploadAttachment(attachmentInfo.ResponseId, Attachments.counter, attachmentInfo.Answers);
List<Models.Attachment> attachments = UploadService.UploadAttachment(attachmentInfo.ResponseId, Attachments.counter, attachmentInfo.Answers);
var result = await this.AttachmentProvider.PostAttachmentAsync(attachments);
if (result.IsSuccess)
{
@ -110,7 +107,7 @@ namespace DamageAssesment.Api.Attachments.Controllers
/// <summary>
/// Modify an new attachment.
/// </summary>
[Authorize(Roles = "admin")]
[HttpPut("attachments"), DisableRequestSizeLimit]
public async Task<IActionResult> UpdateAttachmentAsync(AttachmentInfo attachmentInfo)
{
@ -121,7 +118,7 @@ namespace DamageAssesment.Api.Attachments.Controllers
var res = await this.AttachmentProvider.GetAttachmentInfo(attachmentInfo.Answers);
if (res.IsSuccess)
{
List<Models.Attachment> attachments = UploadService.UpdateAttachments(attachmentInfo.ResponseId, attachmentInfo.Answers, res.Attachments);
List<Models.Attachment> attachments = UploadService.UpdateAttachments(attachmentInfo.ResponseId, attachmentInfo.Answers, res.Attachments);
var result = await this.AttachmentProvider.PutAttachmentAsync(attachments);
if (result.IsSuccess)
{
@ -141,7 +138,6 @@ namespace DamageAssesment.Api.Attachments.Controllers
/// <summary>
/// download an existing attachment.
/// </summary>
[Authorize(Roles = "admin")]
[HttpGet("attachments/download/{id}")]
public async Task<IActionResult> downloadfile(int id)
{
@ -216,7 +212,6 @@ namespace DamageAssesment.Api.Attachments.Controllers
/// <summary>
/// Delete an existing attachment.
/// </summary>
[Authorize(Roles = "admin")]
[HttpDelete("attachments/{id}")]
public async Task<IActionResult> DeleteAttachment(int id)
{

View File

@ -9,7 +9,6 @@ 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

@ -1,15 +1,10 @@
using Azure.Storage.Blobs.Models;
using DamageAssesment.Api.Attachments.Models;
namespace DamageAssesment.Api.Attachments.Interfaces
{
public interface IAzureBlobService
{
Task<List<Azure.Response<BlobContentInfo>>> UploadFiles(List<IFormFile> files);
Task<List<Attachment>> UploadAttachment(int responseId, int answerId, int counter, List<IFormFile> postedFile);
Task<List<Attachment>> UploadAttachment(int responseId, int counter, List<AnswerInfo> answers);
Task<List<Attachment>> UpdateAttachments(int responseId, List<AnswerInfo> answers, IEnumerable<Models.Attachment> attachments);
void Deletefile(string path);
void Movefile(string path);
void DeleteFile(string path);
}
}

View File

@ -1,81 +1,26 @@
using DamageAssesment.Api.Attachments.Db;
using DamageAssesment.Api.Attachments.Interfaces;
using DamageAssesment.Api.Attachments.Providers;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Http.Features;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.FileProviders;
using Microsoft.IdentityModel.Tokens;
using Microsoft.OpenApi.Models;
using System.Reflection;
using System.Text;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddCors(p => p.AddPolicy("DamageAppCorsPolicy", build => {
build.WithOrigins("*").AllowAnyMethod().AllowAnyHeader().AllowAnyOrigin();
}));
var authkey = builder.Configuration.GetValue<string>("JwtSettings:securitykey");
builder.Services.AddAuthentication(item =>
{
item.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
item.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(item =>
{
item.RequireHttpsMetadata = true;
item.SaveToken = true;
item.TokenValidationParameters = new TokenValidationParameters()
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(authkey)),
ValidateIssuer = false,
ValidateAudience = false,
ClockSkew = TimeSpan.Zero
};
});
// Add services to the container.
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
//builder.Services.AddSwaggerGen();
builder.Services.AddSwaggerGen(options =>
builder.Services.AddSwaggerGen(c =>
{
// Include XML comments from your assembly
var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
options.IncludeXmlComments(xmlPath);
OpenApiSecurityScheme securityDefinition = new OpenApiSecurityScheme()
{
Name = "Bearer",
BearerFormat = "JWT",
Scheme = "bearer",
Description = "Specify the authorization token.",
In = ParameterLocation.Header,
Type = SecuritySchemeType.Http,
};
options.AddSecurityDefinition("jwt_auth", securityDefinition);
// Make sure swagger UI requires a Bearer token specified
OpenApiSecurityScheme securityScheme = new OpenApiSecurityScheme()
{
Reference = new OpenApiReference()
{
Id = "jwt_auth",
Type = ReferenceType.SecurityScheme
}
};
OpenApiSecurityRequirement securityRequirements = new OpenApiSecurityRequirement()
{
{securityScheme, new string[] { }},
};
options.AddSecurityRequirement(securityRequirements);
c.IncludeXmlComments(xmlPath);
});
builder.Services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
builder.Services.AddScoped<IAttachmentsProvider, AttachmentsProvider>();
builder.Services.AddScoped<IUploadService, UploadService>();
builder.Services.AddScoped<IAzureBlobService,AzureBlobService>();
@ -99,8 +44,7 @@ if (app.Environment.IsDevelopment())
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseCors("DamageAppCorsPolicy");
app.UseAuthentication();
app.UseAuthorization();
app.UseHttpsRedirection();

View File

@ -14,18 +14,14 @@ namespace DamageAssesment.Api.Attachments.Providers
private ILogger<AttachmentsProvider> logger;
private IUploadService uploadservice;
private IMapper mapper;
private readonly IHttpContextAccessor httpContextAccessor;
private string baseUrl;
public AttachmentsProvider(AttachmentsDbContext AttachmentDbContext, ILogger<AttachmentsProvider> logger, IMapper mapper,IUploadService uploadservice, IHttpContextAccessor httpContextAccessor)
public AttachmentsProvider(AttachmentsDbContext AttachmentDbContext, ILogger<AttachmentsProvider> logger, IMapper mapper,IUploadService uploadservice)
{
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();
//SeedData();
}
public async Task<(bool IsSuccess, IEnumerable<Models.Attachment> Attachments, string ErrorMessage)> GetAttachmentsAsync()
{
@ -36,10 +32,6 @@ 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);
@ -62,7 +54,6 @@ 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);
}
@ -82,10 +73,6 @@ 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);
}
@ -104,10 +91,6 @@ 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);
}
@ -214,24 +197,6 @@ 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

@ -3,9 +3,6 @@ using Azure.Storage.Blobs;
using Azure.Storage.Blobs.Models;
using Azure.Storage.Blobs.Specialized;
using DamageAssesment.Api.Attachments.Interfaces;
using DamageAssesment.Api.Attachments.Models;
using System.Diagnostics.Metrics;
using System.Text;
namespace DamageAssesment.Api.Attachments.Providers
{
@ -13,95 +10,11 @@ namespace DamageAssesment.Api.Attachments.Providers
{
BlobServiceClient _blobClient;
BlobContainerClient _containerClient;
string azureConnectionString;
private string uploadpath = "";
private string Deletepath = "";
public AzureBlobService(IConfiguration configuration)
string azureConnectionString = "<Primary Connection String>";
public AzureBlobService()
{
uploadpath = configuration.GetValue<string>("Fileupload:folderpath");
Deletepath = configuration.GetValue<string>("Fileupload:Deletepath");
_blobClient = new BlobServiceClient(configuration.GetValue<string>("Fileupload:BlobConnectionString"));
_containerClient = _blobClient.GetBlobContainerClient(configuration.GetValue<string>("Fileupload:BlobContainerName"));
}
public async Task<List<Attachment>> UploadAttachment(int responseId, int answerId, int counter, List<IFormFile> postedFile)
{
var pathToSave = Path.Combine(uploadpath, "Response-" + responseId);
String fullDirectoryPath = Path.Combine(pathToSave, "Answer-" + answerId);
List<Models.Attachment> attachments = new List<Models.Attachment>();
foreach (IFormFile item in postedFile)
{
counter++;
var UserfileName = Path.GetFileName(item.FileName);
var extension = System.IO.Path.GetExtension(UserfileName);
var fileName = String.Format("Attachment_{0}{1}", counter, extension);
var stream = item.OpenReadStream();
BlobClient client = _containerClient.GetBlobClient(fullDirectoryPath + "/" + fileName);
string dbPath = fullDirectoryPath + "/" + fileName;
var result = await client.UploadAsync(stream, true);
attachments.Add(new Models.Attachment { AnswerId = answerId, ResponseId = responseId, IsDeleted = false, FileName = UserfileName, URI = dbPath });
}
return attachments;
}
public async Task<List<Attachment>> UploadAttachment(int responseId, int counter, List<AnswerInfo> answers)
{
List<Models.Attachment> attachments = new List<Models.Attachment>();
try
{
foreach (var item in answers)
{
int answerId = item.AnswerId;
var pathToSave = Path.Combine(uploadpath, "Response-" + responseId);
String fullDirectoryPath = Path.Combine(pathToSave, "Answer-" + answerId);
foreach (var file in item.postedFiles)
{
counter++;
var UserfileName = Path.GetFileName(file.FileName);
var fileName = String.Format("Attachment_{0}{1}", counter, file.FileExtension);
byte[] byteArray = Convert.FromBase64String(file.FileContent);
MemoryStream stream = new MemoryStream(byteArray);
BlobClient client = _containerClient.GetBlobClient(fullDirectoryPath + "/" + fileName);
string dbPath = fullDirectoryPath + "/" + fileName;
var result = await client.UploadAsync(stream, true);
attachments.Add(new Models.Attachment { AnswerId = answerId, ResponseId = responseId, IsDeleted = false, FileName = UserfileName, URI = dbPath });
}
}
return attachments;
}
catch (Exception ex)
{
return new List<Models.Attachment>();
}
}
public async Task<List<Attachment>> UpdateAttachments(int responseId, List<AnswerInfo> answers, IEnumerable<Models.Attachment> attachments)
{
List<Models.Attachment> Dbattachments = new List<Models.Attachment>();
foreach (Models.Attachment searchFile in attachments)
{
Movefile(searchFile.URI);
}
foreach (var item in answers)
{
int answerId = item.AnswerId;
var pathToSave = Path.Combine(uploadpath, "Response-" + responseId);
String fullDirectoryPath = Path.Combine(pathToSave, "Answer-" + answerId);
foreach (var file in item.postedFiles)
{
Models.Attachment attachment = attachments.Where(a => a.Id == file.AttachmentId).FirstOrDefault();
var UserfileName = Path.GetFileName(file.FileName);
var fileName = String.Format("Attachment_{0}{1}", attachment?.Id, file.FileExtension);
byte[] byteArray = Convert.FromBase64String(file.FileContent);
MemoryStream stream = new MemoryStream(byteArray);
BlobClient client = _containerClient.GetBlobClient(fullDirectoryPath + "/" + fileName);
string dbPath = fullDirectoryPath + "/" + fileName;
var result = await client.UploadAsync(stream, true);
Dbattachments.Add(new Models.Attachment { Id = attachment.Id, AnswerId = answerId, ResponseId = responseId, IsDeleted = false, FileName = UserfileName, URI = dbPath });
}
}
return Dbattachments;
_blobClient = new BlobServiceClient(azureConnectionString);
_containerClient = _blobClient.GetBlobContainerClient("apiimages");
}
public async Task<List<Azure.Response<BlobContentInfo>>> UploadFiles(List<IFormFile> files)
@ -122,52 +35,10 @@ namespace DamageAssesment.Api.Attachments.Providers
return azureResponse;
}
public string getMovefilename(string movefilename)
public void DeleteFile(string url)
{
var list = movefilename.Split('.');
if (list.Length > 0)
list[list.Length - 1] = DateTime.Now.ToShortDateString().Replace("/", "_") + "_" + DateTime.Now.ToShortTimeString().Replace("/", "_") + "." + list[list.Length - 1];
return string.Join("_", list);
}
public void Movefile(string path)
{
try
{
if (path != "")
{
string MovePath = getMovefilename(path.Replace(uploadpath, Deletepath));
// Get references to the source and destination blobs
BlobClient sourceBlobClient = _containerClient.GetBlobClient(path);
BlobClient destinationBlobClient = _containerClient.GetBlobClient(MovePath);
// Start the copy operation from the source to the destination
destinationBlobClient.StartCopyFromUri(sourceBlobClient.Uri);
// Check if the copy operation completed successfully
WaitForCopyToComplete(destinationBlobClient);
// Delete the source blob after a successful copy
sourceBlobClient.DeleteIfExists();
}
}
catch (Exception ex)
{
}
}
static void WaitForCopyToComplete(BlobClient blobClient)
{
BlobProperties properties = blobClient.GetProperties();
while (properties.CopyStatus == CopyStatus.Pending)
{
Task.Delay(TimeSpan.FromSeconds(1));
properties = blobClient.GetProperties();
}
}
public void Deletefile(string url)
{
BlobClient sourceBlobClient = _containerClient.GetBlobClient(url);
sourceBlobClient.DeleteIfExists();
var blob = _containerClient.GetBlockBlobClient(url);
blob.DeleteIfExists();
}
}
}

View File

@ -124,7 +124,7 @@ namespace DamageAssesment.Api.Attachments.Providers
{
counter++;
var UserfileName = Path.GetFileName(file.FileName+ file.FileExtension);
var UserfileName = Path.GetFileName(file.FileName);
var fileName = String.Format("Attachment_{0}{1}", counter, file.FileExtension);
var dbPath = Path.Combine(fullDirectoryPath, fileName);
File.WriteAllBytes(dbPath, Convert.FromBase64String(file.FileContent));
@ -161,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 + file.FileExtension);
var UserfileName = Path.GetFileName(file.FileName);
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

@ -11,14 +11,12 @@
"AllowedHosts": "*",
"Fileupload": {
"folderpath": "DMS_Attachments/Active",
"Deletepath": "DMS_Attachments/Deleted",
"BlobConnectionString": "DefaultEndpointsProtocol=https;AccountName=damagedoculink;AccountKey=blynpwrAQtthEneXC5f4vFewJ3tPV+QZUt1AX3nefZScPPjkr5hMoC18B9ni6/ZYdhRiERPQw+hB+AStonf+iw==;EndpointSuffix=core.windows.net",
"BlobContainerName": "doculinks"
"Deletepath": "DMS_Attachments/Deleted"
},
"ConnectionStrings": {
//"AttachmentConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;"
// "AttachmentConnection": "Server=localhost,1433;Database=da_survey_dev;User Id=sa;Password=Password123;TrustServerCertificate=True;"
"AttachmentConnection": "Server=207.180.248.35;Database=da_survey_dev;User Id=sa;Password=YourStrongPassw0rd;TrustServerCertificate=True;"
}
}

View File

@ -44,10 +44,10 @@ namespace DamageAssesment.Api.DocuLinks.Test
var mockDocumentService = new Mock<IDoculinkProvider>();
var mockUploadService = new Mock<IUploadService>();
var mockResponse = await MockData.getOkResponses();
mockDocumentService.Setup(service => service.GetdocumentsByLinkAsync("forms", "en", null)).ReturnsAsync(mockResponse);
mockDocumentService.Setup(service => service.GetdocumentsByLinkAsync("forms","en", null)).ReturnsAsync(mockResponse);
var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object);
var result = (OkObjectResult)await DocumentProvider.GetDocumentsAsync("forms", "en", null);
var result = (OkObjectResult)await DocumentProvider.GetDocumentsAsync("forms","en", null);
Assert.Equal(200, result.StatusCode);
}
@ -97,7 +97,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
var mockDocumentService = new Mock<IDoculinkProvider>();
var mockUploadService = new Mock<IUploadService>();
var mockResponse = await MockData.getOkResponse(1);
mockDocumentService.Setup(service => service.GetDocumentAsync(1, "forms", "en")).ReturnsAsync(mockResponse);
mockDocumentService.Setup(service => service.GetDocumentAsync(1,"forms","en")).ReturnsAsync(mockResponse);
var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object);
var result = (OkObjectResult)await DocumentProvider.GetDocumentAsync(1, "forms", "en");
@ -154,9 +154,9 @@ namespace DamageAssesment.Api.DocuLinks.Test
var mockResponse = await MockData.getOkResponse(1);
var mockInputDocument = await MockData.getInputDocumentData();
var DocumentResponse = await MockData.GetDocuLinksInfo(1);
mockDocumentService.Setup(service => service.UpdateDocumentAsync(1, mockInputDocument)).ReturnsAsync(mockResponse);
mockDocumentService.Setup(service => service.UpdateDocumentAsync(1,mockInputDocument)).ReturnsAsync(mockResponse);
var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object);
var result = (NotFoundResult)await DocumentProvider.UpdateDocument(1, DocumentResponse);
var result = (NotFoundResult)await DocumentProvider.UpdateDocument(1,DocumentResponse);
Assert.Equal(404, result.StatusCode);
}
@ -168,9 +168,9 @@ namespace DamageAssesment.Api.DocuLinks.Test
var mockUploadService = new Mock<IUploadService>();
var mockResponse = await MockData.getBadRequestResponse();
var mockInputDocument = await MockData.getInputDocumentData();
mockDocumentService.Setup(service => service.UpdateDocumentAsync(99, mockInputDocument)).ReturnsAsync(mockResponse);
mockDocumentService.Setup(service => service.UpdateDocumentAsync(99,mockInputDocument)).ReturnsAsync(mockResponse);
var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object);
var result = (BadRequestObjectResult)await DocumentProvider.UpdateDocument(99, null);
var result = (BadRequestObjectResult)await DocumentProvider.UpdateDocument(99,null);
Assert.Equal(400, result.StatusCode);
}
@ -257,7 +257,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
var mockDocumentService = new Mock<IDoculinkProvider>();
var mockUploadService = new Mock<IUploadService>();
var mockResponse = await LinkTypeMockData.getOkResponse(1);
mockDocumentService.Setup(service => service.GetLinkTypeAsync(1, "en")).ReturnsAsync(mockResponse);
mockDocumentService.Setup(service => service.GetLinkTypeAsync(1,"en")).ReturnsAsync(mockResponse);
var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object);
var result = (OkObjectResult)await DocumentProvider.GetLinkTypeAsync(1, "en");
@ -312,9 +312,9 @@ namespace DamageAssesment.Api.DocuLinks.Test
var mockUploadService = new Mock<IUploadService>();
var mockResponse = await LinkTypeMockData.getOkResponse(1);
var mockInputDocument = await LinkTypeMockData.getInputLinkData(1);
mockDocumentService.Setup(service => service.UpdateLinkTypeAsync(1, mockInputDocument)).ReturnsAsync(mockResponse);
mockDocumentService.Setup(service => service.UpdateLinkTypeAsync(1,mockInputDocument)).ReturnsAsync(mockResponse);
var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object);
var result = (OkObjectResult)await DocumentProvider.UpdateLinkType(1, mockInputDocument);
var result = (OkObjectResult)await DocumentProvider.UpdateLinkType(1,mockInputDocument);
Assert.Equal(200, result.StatusCode);
}
@ -326,9 +326,9 @@ namespace DamageAssesment.Api.DocuLinks.Test
var mockUploadService = new Mock<IUploadService>();
var mockResponse = await LinkTypeMockData.getNotFoundResponse();
var mockInputDocument = await LinkTypeMockData.getInputLinkData(99);
mockDocumentService.Setup(service => service.UpdateLinkTypeAsync(99, mockInputDocument)).ReturnsAsync(mockResponse);
mockDocumentService.Setup(service => service.UpdateLinkTypeAsync(99,mockInputDocument)).ReturnsAsync(mockResponse);
var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object);
var result = (NotFoundObjectResult)await DocumentProvider.UpdateLinkType(99, mockInputDocument);
var result = (NotFoundObjectResult)await DocumentProvider.UpdateLinkType(99,mockInputDocument);
Assert.Equal(404, result.StatusCode);
}
@ -340,7 +340,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
var mockUploadService = new Mock<IUploadService>();
var mockResponse = await LinkTypeMockData.getBadRequestResponse();
var mockInputDocument = await LinkTypeMockData.getInputLinkData(1);
mockDocumentService.Setup(service => service.UpdateLinkTypeAsync(1, mockInputDocument)).ReturnsAsync(mockResponse);
mockDocumentService.Setup(service => service.UpdateLinkTypeAsync(1,mockInputDocument)).ReturnsAsync(mockResponse);
var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object);
var result = (BadRequestObjectResult)await DocumentProvider.UpdateLinkType(1, mockInputDocument);

View File

@ -25,15 +25,14 @@ namespace DamageAssesment.Api.DocuLinks.Test
DocuLinksTranslations.Add(new DoculinkTranslation()
{
Language = "en",
title = "tel" + i,
description = "Sample" + i
title = "tel"+i,
description = "Sample"+i
});
List<DoculinkAttachments> doclinksAttachments = new List<DoculinkAttachments>();
doclinksAttachments.Add(new DoculinkAttachments()
{
docName = "",Path="www.google.com",
Language = "en",
IsAttachments =false,CustomOrder=1
IsAttachments=false,CustomOrder=1
});
list.Add(new DocuLinks.Models.ResDoculink()
{
@ -41,10 +40,10 @@ namespace DamageAssesment.Api.DocuLinks.Test
Id = i,
linkTypeId = i,
IsActive = true,
titles = dicttitle,
description = dictdesc,
CustomOrder = i,
doclinksAttachments = doclinksAttachments
titles= dicttitle,
description=dictdesc,
CustomOrder=i,
doclinksAttachments= doclinksAttachments
});
}
// List<ResDoculinks> doculinks = list.GroupBy(a => a.linkTypeId).Select(a => new ResDoculinks() { linkTypeId = a.Key, doculinks = a.ToList() }).ToList();
@ -75,7 +74,6 @@ namespace DamageAssesment.Api.DocuLinks.Test
docName = "",
Path = "www.google.com",
IsAttachments = false,
Language = "en",
CustomOrder = 1
});
list.Add(new DocuLinks.Models.ResDoculink()
@ -122,8 +120,8 @@ namespace DamageAssesment.Api.DocuLinks.Test
{
List<FileModel> fileModels = new List<FileModel>();
fileModels.Add(new FileModel() { FileName = "Sample", FileContent = "c2FtcGxl", FileExtension = ".txt", IsAttachments = true, CustomOrder = 1 });
return new ReqDoculink() { Id = id, linkTypeId = 1, CustomOrder = 1, Files = fileModels };
fileModels.Add( new FileModel() { FileName = "Sample", FileContent = "c2FtcGxl", FileExtension = ".txt",IsAttachments=true,CustomOrder=1 });
return new ReqDoculink() { Id=id, linkTypeId = 1, CustomOrder = 1, Files = fileModels };
}
public static async Task<DocuLinks.Models.Doculink> getInputDocumentData()
{
@ -140,7 +138,6 @@ namespace DamageAssesment.Api.DocuLinks.Test
docName = "",
Path = "www.google.com",
IsAttachments = false,
Language = "en",
CustomOrder = 1
});
return new Models.Doculink
@ -148,9 +145,9 @@ namespace DamageAssesment.Api.DocuLinks.Test
Id = 1,
linkTypeId = 1,
IsActive = true,
CustomOrder = 1,
CustomOrder=1,
documentsTranslations = DocuLinksTranslations,
doclinksAttachments = doclinksAttachments
doclinksAttachments= doclinksAttachments
};
}
public static async Task<List<DocuLinks.Models.Doculink>> getInputDocuLinksData()
@ -168,7 +165,6 @@ 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

@ -2,7 +2,6 @@
using DamageAssesment.Api.DocuLinks.Interfaces;
using DamageAssesment.Api.DocuLinks.Models;
using DamageAssesment.Api.DocuLinks.Providers;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
@ -13,7 +12,6 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
{
private readonly IDoculinkProvider documentsProvider;
private readonly IUploadService uploadService;
private readonly IAzureBlobService azureBlobService;
public DoculinkController(IDoculinkProvider documentsProvider, IUploadService uploadService)
{
@ -26,7 +24,6 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
/// Get all Doculink type.
/// </summary>
[HttpGet]
[Authorize(Roles = "admin")]
[Route("doculinks/types")]
[Route("doculinks/types/{language:alpha}")]
public async Task<IActionResult> GetLinkTypesAsync(string? language)
@ -41,7 +38,6 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
/// <summary>
/// Get a Doculink type by id.
/// </summary>
[Authorize(Roles = "admin")]
[HttpGet]
[Route("doculinks/types/{id}")]
[Route("doculinks/types/{id}/{language:alpha}")]
@ -57,7 +53,6 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
/// <summary>
/// Update a existing Doculink type.
/// </summary>
[Authorize(Roles = "admin")]
[HttpPut]
[Route("doculinks/types/{id}")]
public async Task<IActionResult> UpdateLinkType(int id, Models.LinkType linkType)
@ -79,7 +74,6 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
/// <summary>
/// Create a new Doculink type.
/// </summary>
[Authorize(Roles = "admin")]
[HttpPost]
[Route("doculinks/types")]
public async Task<IActionResult> CreateLinkType(Models.LinkType linkType)
@ -98,7 +92,6 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
/// <summary>
/// Delete a existing Doculink type by id.
/// </summary>
[Authorize(Roles = "admin")]
[HttpDelete]
[Route("doculinks/types/{id}")]
public async Task<IActionResult> DeleteLinkType(int id)
@ -113,7 +106,6 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
/// <summary>
/// download an existing attachment.
/// </summary>
[Authorize(Roles = "admin")]
[HttpGet("doculinks/download/{id}")]
public async Task<IActionResult> downloadfile(int id)
{
@ -188,8 +180,7 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
/// <summary>
/// Get all Doculink.
/// </summary>
[Authorize(Roles = "admin")]
///
[Route("doculinks")]
[Route("doculinks/{linktype:alpha}")]
[Route("doculinks/{linktype:alpha}/{language:alpha}")]
@ -237,7 +228,6 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
/// <summary>
/// Get a Doculink by id.
/// </summary>
[Authorize(Roles = "admin")]
[HttpGet]
[Route("doculinks/{id}")]
[Route("doculinks/{id}/{linktype:alpha}")]
@ -254,7 +244,6 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
/// <summary>
/// update existing doclink.
/// </summary>
[Authorize(Roles = "admin")]
[HttpPut]
[Route("doculinks/{id}")]
public async Task<IActionResult> UpdateDocument(int id, ReqDoculink documentInfo)
@ -294,7 +283,6 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
/// <summary>
/// Create new doclink.
/// </summary>
// [Authorize(Roles = "admin")]
[HttpPost]
[Route("doculinks")]
public async Task<IActionResult> CreateDocument(ReqDoculink documentInfo)
@ -322,7 +310,6 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
/// <summary>
/// Delete Doculink by id.
/// </summary>
[Authorize(Roles = "admin")]
[HttpDelete]
[Route("doculinks/{id}")]
public async Task<IActionResult> DeleteDocument(int id)

View File

@ -11,8 +11,7 @@
<ItemGroup>
<PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="12.0.1" />
<PackageReference Include="Azure.Storage.Blobs" Version="12.18.0" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.21" />
<PackageReference Include="Azure.Storage.Blobs" Version="12.16.0" />
<PackageReference Include="Microsoft.AspNetCore.Hosting" Version="2.2.7" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.9" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="7.0.9">

View File

@ -15,6 +15,5 @@ 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

@ -15,7 +15,7 @@ namespace DamageAssesment.Api.DocuLinks.Db
protected override void OnConfiguring(DbContextOptionsBuilder options)
{
// connect to sql server with connection string from app settings
options.UseSqlServer(_Configuration.GetConnectionString("DoculinkConnection"));
options.UseSqlServer(_Configuration.GetConnectionString("DoculinConnection"));
}
public DbSet<Db.Doculink> Documents { get; set; }
public DbSet<Db.LinkType> LinkTypes { get; set; }

View File

@ -1,14 +1,10 @@
using Azure.Storage.Blobs.Models;
using DamageAssesment.Api.DocuLinks.Models;
namespace DamageAssesment.Api.DocuLinks.Interfaces
{
public interface IAzureBlobService
{
Task<List<Azure.Response<BlobContentInfo>>> UploadFiles(List<IFormFile> files);
Task<Models.Doculink> UploadDocument(int counter, ReqDoculink documentInfo);
Task<Models.Doculink> UpdateDocuments(int counter, Models.Doculink document, ReqDoculink documentInfo);
void DeleteFile(string path);
void Movefile(string path);
}
}

View File

@ -13,7 +13,6 @@ namespace DamageAssesment.Api.DocuLinks.Interfaces
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

@ -8,7 +8,6 @@ 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

@ -19,6 +19,5 @@ 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

@ -2,84 +2,30 @@ using DamageAssesment.Api.DocuLinks.Db;
using DamageAssesment.Api.DocuLinks.Interfaces;
using DamageAssesment.Api.DocuLinks.Providers;
using Microsoft.EntityFrameworkCore;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
using System.Reflection;
using System.Text;
using Microsoft.OpenApi.Models;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddCors(p => p.AddPolicy("DamageAppCorsPolicy", build => {
build.WithOrigins("*").AllowAnyMethod().AllowAnyHeader().AllowAnyOrigin();
}));
// Add services to the container.
var authkey = builder.Configuration.GetValue<string>("JwtSettings:securitykey");
builder.Services.AddAuthentication(item =>
{
item.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
item.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(item =>
{
item.RequireHttpsMetadata = true;
item.SaveToken = true;
item.TokenValidationParameters = new TokenValidationParameters()
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(authkey)),
ValidateIssuer = false,
ValidateAudience = false,
ClockSkew = TimeSpan.Zero
};
});
// Add services to the container.
builder.Services.AddControllers();
builder.Services.AddSwaggerGen(options =>
builder.Services.AddSwaggerGen(c =>
{
// Include XML comments from your assembly
var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
options.IncludeXmlComments(xmlPath);
OpenApiSecurityScheme securityDefinition = new OpenApiSecurityScheme()
{
Name = "Bearer",
BearerFormat = "JWT",
Scheme = "bearer",
Description = "Specify the authorization token.",
In = ParameterLocation.Header,
Type = SecuritySchemeType.Http,
};
options.AddSecurityDefinition("jwt_auth", securityDefinition);
// Make sure swagger UI requires a Bearer token specified
OpenApiSecurityScheme securityScheme = new OpenApiSecurityScheme()
{
Reference = new OpenApiReference()
{
Id = "jwt_auth",
Type = ReferenceType.SecurityScheme
}
};
OpenApiSecurityRequirement securityRequirements = new OpenApiSecurityRequirement()
{
{securityScheme, new string[] { }},
};
options.AddSecurityRequirement(securityRequirements);
c.IncludeXmlComments(xmlPath);
});
// 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>();
builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies()); //4/30
builder.Services.AddDbContext<DoculinkDbContext>(option =>
{
option.UseSqlServer("DoculinkConnection");
option.UseSqlServer("DoculinConnection");
});
var app = builder.Build();
@ -89,8 +35,7 @@ if (app.Environment.IsDevelopment())
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseCors("DamageAppCorsPolicy");
app.UseAuthentication();
app.UseAuthorization();
app.MapControllers();

View File

@ -1,17 +1,8 @@

using Azure;
using Azure.Storage.Blobs;
using Azure.Storage.Blobs.Models;
using Azure.Storage.Blobs.Specialized;
using DamageAssesment.Api.DocuLinks.Interfaces;
using DamageAssesment.Api.DocuLinks.Models;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.Extensions.Configuration;
using Microsoft.VisualBasic;
using System.ComponentModel;
using System.IO;
using System.Text;
using System.Threading.Tasks;
namespace DamageAssesment.Api.DocuLinks.Providers
{
@ -19,111 +10,11 @@ namespace DamageAssesment.Api.DocuLinks.Providers
{
BlobServiceClient _blobClient;
BlobContainerClient _containerClient;
string azureConnectionString;
private string uploadpath = "";
private string Deletepath = "";
public AzureBlobService(IConfiguration configuration)
string azureConnectionString = "<Primary Connection String>";
public AzureBlobService()
{
uploadpath = configuration.GetValue<string>("Fileupload:folderpath");
Deletepath = configuration.GetValue<string>("Fileupload:Deletepath");
_blobClient = new BlobServiceClient(configuration.GetValue<string>("Fileupload:BlobConnectionString"));
_containerClient = _blobClient.GetBlobContainerClient(configuration.GetValue<string>("Fileupload:BlobContainerName"));
}
public async Task<Models.Doculink> UploadDocument(int counter, ReqDoculink documentInfo)
{
Models.Doculink Documents = new Models.Doculink();
List <Models.DoculinkAttachments> attachments = new List<Models.DoculinkAttachments>();
try
{
string path = "", UserfileName = "";
if (documentInfo.Files != null)
{
int counter1 = 1;
foreach (var item in documentInfo.Files)
{
if (item.IsAttachments)
{
UserfileName = Path.GetFileName(item.FileName);
var fileName = String.Format("Document_{0}_{1}{2}", counter, counter1, item.FileExtension);
byte[] byteArray = Convert.FromBase64String(item.FileContent);
MemoryStream stream = new MemoryStream(byteArray);
BlobClient client = _containerClient.GetBlobClient(uploadpath + "/" + fileName);
var result = await client.UploadAsync(stream, true);
path = uploadpath + "/" + fileName;
counter1++;
}
else
path = item.url;
attachments.Add(new Models.DoculinkAttachments { docName = UserfileName, Path = path, IsAttachments = item.IsAttachments, CustomOrder = item.CustomOrder });
}
}
Documents = new Models.Doculink()
{
linkTypeId = documentInfo.linkTypeId,
documentsTranslations = documentInfo.documentsTranslations,
doclinksAttachments = attachments,
IsDeleted = false,
CustomOrder = documentInfo.CustomOrder,
IsActive = true
};
return Documents;
}
catch (Exception ex)
{
return new Models.Doculink();
}
}
public async Task<Models.Doculink> UpdateDocuments(int counter, Models.Doculink document, ReqDoculink documentInfo)
{
try
{
foreach (var item in document.doclinksAttachments)
{
Movefile(item.Path);
}
string path = "", UserfileName = "";
List<Models.DoculinkAttachments> attachments = new List<Models.DoculinkAttachments>();
int counter1 = 1;
foreach (var item in documentInfo.Files)
{
if (item.IsAttachments)
{
UserfileName = Path.GetFileName(item.FileName);
var fileName = String.Format("Document_{0}_{1}{2)", document.Id, counter1, item.FileExtension);
byte[] byteArray = Encoding.UTF8.GetBytes(item.FileContent);
MemoryStream stream = new MemoryStream(byteArray);
BlobClient client = _containerClient.GetBlobClient(uploadpath + "/" + fileName);
path = uploadpath + "/" + fileName;
var result = await client.UploadAsync(stream, true);
counter1++;
}
else
path = item.url;
attachments.Add(new Models.DoculinkAttachments { docName = UserfileName, Path = path, IsAttachments = item.IsAttachments, CustomOrder = item.CustomOrder });
}
Models.Doculink Documents = new Models.Doculink()
{
Id = documentInfo.Id,
linkTypeId = documentInfo.linkTypeId,
documentsTranslations = documentInfo.documentsTranslations,
IsActive = true,
IsDeleted = false,
CustomOrder = documentInfo.CustomOrder,
doclinksAttachments = attachments
};
return Documents;
}
catch (Exception ex)
{
return new Models.Doculink();
}
_blobClient = new BlobServiceClient(azureConnectionString);
_containerClient = _blobClient.GetBlobContainerClient("apiimages");
}
public async Task<List<Azure.Response<BlobContentInfo>>> UploadFiles(List<IFormFile> files)
@ -144,52 +35,10 @@ namespace DamageAssesment.Api.DocuLinks.Providers
return azureResponse;
}
public string getMovefilename(string movefilename)
{
var list = movefilename.Split('.');
if (list.Length > 0)
list[list.Length - 1] = DateTime.Now.ToShortDateString().Replace("/", "_") +"_"+ DateTime.Now.ToShortTimeString().Replace("/", "_")+"." + list[list.Length - 1];
return string.Join("_", list);
}
public void Movefile(string path)
{
try
{
if (path != "")
{
string MovePath = getMovefilename(path.Replace(uploadpath, Deletepath));
// Get references to the source and destination blobs
BlobClient sourceBlobClient = _containerClient.GetBlobClient(path);
BlobClient destinationBlobClient = _containerClient.GetBlobClient(MovePath);
// Start the copy operation from the source to the destination
destinationBlobClient.StartCopyFromUri(sourceBlobClient.Uri);
// Check if the copy operation completed successfully
WaitForCopyToComplete(destinationBlobClient);
// Delete the source blob after a successful copy
sourceBlobClient.DeleteIfExists();
}
}
catch(Exception ex)
{
}
}
static void WaitForCopyToComplete(BlobClient blobClient)
{
BlobProperties properties = blobClient.GetProperties();
while (properties.CopyStatus == CopyStatus.Pending)
{
Task.Delay(TimeSpan.FromSeconds(1));
properties = blobClient.GetProperties();
}
}
public void DeleteFile(string url)
{
BlobClient sourceBlobClient = _containerClient.GetBlobClient(url);
sourceBlobClient.DeleteIfExists();
var blob = _containerClient.GetBlockBlobClient(url);
blob.DeleteIfExists();
}
}
}

View File

@ -2,16 +2,13 @@
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;
@ -24,27 +21,20 @@ namespace DamageAssesment.Api.DocuLinks.Providers
private DoculinkDbContext DocumentDbContext;
private ILogger<DoculinkProvider> logger;
private IUploadService uploadservice;
private IAzureBlobService azureBlobService;
private IMapper mapper;
private readonly IHttpContextAccessor httpContextAccessor;
private string baseUrl;
public DoculinkProvider(DoculinkDbContext DocumentDbContext, ILogger<DoculinkProvider> logger, IMapper mapper, IUploadService uploadservice, IAzureBlobService azureBlobService, IHttpContextAccessor httpContextAccessor)
public DoculinkProvider(DoculinkDbContext DocumentDbContext, ILogger<DoculinkProvider> logger, IMapper mapper, IUploadService uploadservice)
{
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";
this.azureBlobService = azureBlobService;
//SeedData();
SeedData();
}
private async Task SeedDataAsync()
private void SeedData()
{
if (!DocumentDbContext.LinkTypes.Any())
{
@ -81,10 +71,10 @@ namespace DamageAssesment.Api.DocuLinks.Providers
{
linkTypeId = 1;
fileModel = new FileModel() { FileName = "Sample" + i, FileExtension = ".txt", FileContent = "c2FtcGxl", IsAttachments = true, CustomOrder = 1, Language = "en" };
fileModel = new FileModel() { FileName = "Sample" + i, FileExtension = ".txt", FileContent = "c2FtcGxl", IsAttachments = true, CustomOrder = 1 };
}
else
fileModel = new FileModel() { url = "www.google" + i + ".com", IsAttachments = false, CustomOrder = 1,Language="en" };
fileModel = new FileModel() { url = "www.google" + i + ".com", IsAttachments = false, CustomOrder = 1 };
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));
@ -180,42 +170,7 @@ 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)
{
@ -237,7 +192,8 @@ namespace DamageAssesment.Api.DocuLinks.Providers
item.titles = multilan.titles;
item.description = multilan.description;
item.linktypes = CreateMultiLanguageLinkTypeObject(GetLinkTypeTranslations(item.linkTypeId, language));
item.doclinksAttachments = GetDocumentAttachment(item.Id,language);
item.doclinksAttachments = mapper.Map<List<Db.DoculinkAttachments>, List<Models.DoculinkAttachments>>(
DocumentDbContext.DoclinksAttachments.AsNoTracking().Where(a => a.DocumentId == item.Id).ToList());
}
// List<ResDoculinks> doculinks = result.GroupBy(a => a.linkTypeId).Select(a => new ResDoculinks() { linkTypeId = a.Key, doculinks = a.ToList() }).ToList();
return (true, result, null);
@ -272,7 +228,8 @@ namespace DamageAssesment.Api.DocuLinks.Providers
item.titles = multilan.titles;
item.description = multilan.description;
item.linktypes = CreateMultiLanguageLinkTypeObject(GetLinkTypeTranslations(item.linkTypeId, language));
item.doclinksAttachments = GetDocumentAttachment(item.Id, language);
item.doclinksAttachments = mapper.Map<List<Db.DoculinkAttachments>, List<Models.DoculinkAttachments>>(
DocumentDbContext.DoclinksAttachments.AsNoTracking().Where(a => a.DocumentId == item.Id).ToList());
}
//List<ResDoculinks> doculinks = result.GroupBy(a => a.linkTypeId).Select(a => new ResDoculinks() { linkTypeId = a.Key, doculinks = a.ToList() }).ToList();
return (true, result, null);
@ -327,7 +284,8 @@ 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 = GetDocumentAttachment(id, "");
result.doclinksAttachments = mapper.Map<List<Db.DoculinkAttachments>, List<Models.DoculinkAttachments>>(
DocumentDbContext.DoclinksAttachments.AsNoTracking().Where(a => a.DocumentId == id).ToList());
return (true, result, null);
}
return (false, null, "Not found");
@ -359,7 +317,8 @@ namespace DamageAssesment.Api.DocuLinks.Providers
result.linktypes = CreateMultiLanguageLinkTypeObject(GetLinkTypeTranslations(result.linkTypeId, language));
result.titles = multilan.titles;
result.description = multilan.description;
result.doclinksAttachments = GetDocumentAttachment(id, language);
result.doclinksAttachments = mapper.Map<List<Db.DoculinkAttachments>, List<Models.DoculinkAttachments>>(
DocumentDbContext.DoclinksAttachments.AsNoTracking().Where(a => a.DocumentId == id).ToList());
return (true, result, null);
}
return (false, null, "Not found");
@ -390,7 +349,7 @@ namespace DamageAssesment.Api.DocuLinks.Providers
result.linktypes = CreateMultiLanguageLinkTypeObject(GetLinkTypeTranslations(Document.linkTypeId, ""));
result.titles = multilan.titles;
result.description = multilan.description;
result.doclinksAttachments = GetDocumentAttachment(document.Id,"");
result.doclinksAttachments = Document.doclinksAttachments;
return (true, result, null);
}
catch (Exception ex)
@ -432,7 +391,7 @@ namespace DamageAssesment.Api.DocuLinks.Providers
result.linktypes = CreateMultiLanguageLinkTypeObject(GetLinkTypeTranslations(document.linkTypeId, ""));
result.titles = multilan.titles;
result.description = multilan.description;
result.doclinksAttachments = GetDocumentAttachment(document.Id, "");
result.doclinksAttachments = Document.doclinksAttachments;
return (true, result, "Successful");
}
else

View File

@ -52,15 +52,6 @@ namespace DamageAssesment.Api.DocuLinks.Providers
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)
{
Models.Doculink Documents = new Models.Doculink();
@ -79,14 +70,14 @@ namespace DamageAssesment.Api.DocuLinks.Providers
counter++;
if (item.IsAttachments)
{
UserfileName = Path.GetFileName(item.FileName + item.FileExtension);
UserfileName = Path.GetFileName(item.FileName);
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,Language=item.Language });
attachments.Add(new Models.DoculinkAttachments { docName=UserfileName,Path=path,IsAttachments=item.IsAttachments,CustomOrder=item.CustomOrder });
}
}
Documents=new Models.Doculink (){ linkTypeId = documentInfo.linkTypeId,
@ -116,20 +107,19 @@ namespace DamageAssesment.Api.DocuLinks.Providers
string path = "", UserfileName = "";
List<Models.DoculinkAttachments> attachments = new List<Models.DoculinkAttachments>();
int counter1 = 1;
foreach (var item in documentInfo.Files)
{
counter++;
if (item.IsAttachments)
{
UserfileName = Path.GetFileName(item.FileName+item.FileExtension);
var fileName = String.Format("Document_{0}{1}", counter1, item.FileExtension);
UserfileName = Path.GetFileName(item.FileName);
var fileName = String.Format("Document_{0}{1}", counter, item.FileExtension);
path = Path.Combine(fullDirectoryPath, fileName);
File.WriteAllBytes(path, Convert.FromBase64String(item.FileContent));
counter1++;
}
else
path = item.url;
attachments.Add(new Models.DoculinkAttachments { docName = UserfileName, Path = path,IsAttachments=item.IsAttachments,CustomOrder=item.CustomOrder,Language=item.Language });
attachments.Add(new Models.DoculinkAttachments { docName = UserfileName, Path = path,IsAttachments=item.IsAttachments,CustomOrder=item.CustomOrder });
}
Models.Doculink Documents = new Models.Doculink()
{

View File

@ -1,7 +1,4 @@
{
"JwtSettings": {
"securitykey": "bWlhbWkgZGFkZSBzY2hvb2xzIHNlY3JldCBrZXk="
},
"Logging": {
"LogLevel": {
"Default": "Information",
@ -10,14 +7,13 @@
},
"AllowedHosts": "*",
"ConnectionStrings": {
//"DoculinkConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;"
"DoculinkConnection": "Server=207.180.248.35;Database=da_survey_dev;User Id=sa;Password=YourStrongPassw0rd;TrustServerCertificate=True;"
//"DoculinConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;",
//"DoculinConnection": "Server=localhost,1433;Database=da_survey_dev;User Id=sa;Password=Password123;TrustServerCertificate=True;"
"DoculinConnection": "Server=207.180.248.35;Database=da_survey_dev;User Id=sa;Password=YourStrongPassw0rd;TrustServerCertificate=True;"
},
"Fileupload": {
"folderpath": "DASA_Documents/Active",
"Deletepath": "DASA_Documents/Deleted",
"BlobConnectionString": "DefaultEndpointsProtocol=https;AccountName=damagedoculink;AccountKey=blynpwrAQtthEneXC5f4vFewJ3tPV+QZUt1AX3nefZScPPjkr5hMoC18B9ni6/ZYdhRiERPQw+hB+AStonf+iw==;EndpointSuffix=core.windows.net",
"BlobContainerName": "doculinks"
"Deletepath": "DASA_Documents/Deleted"
}
}

View File

@ -1,5 +1,4 @@
using DamageAssesment.Api.Employees.Interfaces;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
@ -19,7 +18,7 @@ namespace DamageAssesment.Api.Employees.Controllers
/// <summary>
/// GET request for retrieving employees.
/// </summary>
[Authorize(Roles = "admin")]
[HttpGet("employees")]
public async Task<ActionResult> GetEmployeesAsync()
{
@ -36,7 +35,7 @@ namespace DamageAssesment.Api.Employees.Controllers
/// <summary>
/// GET request for retrieving an employee by ID.
/// </summary>
[Authorize(Roles = "admin")]
[HttpGet("employees/{id}")]
public async Task<ActionResult> GetEmployeeByIdAsync(int id)
{
@ -54,7 +53,6 @@ namespace DamageAssesment.Api.Employees.Controllers
/// PUT request for updating an existing employee.
/// </summary>
/// <param name="Employee">The updated employee object.</param>
[Authorize(Roles = "admin")]
[HttpPut("employees/{id}")]
public async Task<IActionResult> UpdateEmployee(int id, Models.Employee Employee)
{
@ -77,7 +75,6 @@ namespace DamageAssesment.Api.Employees.Controllers
/// POST request for creating a new employee.
/// </summary>
/// <param name="Employee">The employee information for creating a new employee.</param>
[Authorize(Roles = "admin")]
[HttpPost("employees")]
public async Task<IActionResult> CreateEmployee(Models.Employee Employee)
{
@ -96,7 +93,6 @@ namespace DamageAssesment.Api.Employees.Controllers
/// DELETE request for deleting an existing employee.
/// </summary>
/// <param name="id">The ID of the employee to be deleted.</param>
[Authorize(Roles = "admin")]
[HttpDelete("employees/{id}")]
public async Task<IActionResult> DeleteEmployee(int id)
{

View File

@ -1,77 +1,23 @@
using DamageAssesment.Api.Employees.Db;
using DamageAssesment.Api.Employees.Interfaces;
using DamageAssesment.Api.Employees.Providers;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.EntityFrameworkCore;
using Microsoft.IdentityModel.Tokens;
using Microsoft.OpenApi.Models;
using System.Reflection;
using System.Text;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddCors(p => p.AddPolicy("DamageAppCorsPolicy", build => {
build.WithOrigins("*").AllowAnyMethod().AllowAnyHeader().AllowAnyOrigin();
}));
// Add services to the container.
var authkey = builder.Configuration.GetValue<string>("JwtSettings:securitykey");
builder.Services.AddAuthentication(item =>
{
item.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
item.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(item =>
{
item.RequireHttpsMetadata = true;
item.SaveToken = true;
item.TokenValidationParameters = new TokenValidationParameters()
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(authkey)),
ValidateIssuer = false,
ValidateAudience = false,
ClockSkew = TimeSpan.Zero
};
});
// Add services to the container.
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
//builder.Services.AddSwaggerGen();
builder.Services.AddSwaggerGen(options =>
builder.Services.AddSwaggerGen(c =>
{
// Include XML comments from your assembly
var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
options.IncludeXmlComments(xmlPath);
OpenApiSecurityScheme securityDefinition = new OpenApiSecurityScheme()
{
Name = "Bearer",
BearerFormat = "JWT",
Scheme = "bearer",
Description = "Specify the authorization token.",
In = ParameterLocation.Header,
Type = SecuritySchemeType.Http,
};
options.AddSecurityDefinition("jwt_auth", securityDefinition);
// Make sure swagger UI requires a Bearer token specified
OpenApiSecurityScheme securityScheme = new OpenApiSecurityScheme()
{
Reference = new OpenApiReference()
{
Id = "jwt_auth",
Type = ReferenceType.SecurityScheme
}
};
OpenApiSecurityRequirement securityRequirements = new OpenApiSecurityRequirement()
{
{securityScheme, new string[] { }},
};
options.AddSecurityRequirement(securityRequirements);
c.IncludeXmlComments(xmlPath);
});
builder.Services.AddScoped<IEmployeesProvider, EmployeesProvider>();
@ -96,8 +42,7 @@ if (app.Environment.IsDevelopment())
employeesProvider.SeedData();
}
}
app.UseCors("DamageAppCorsPolicy");
app.UseAuthentication();
app.UseAuthorization();
app.MapControllers();

View File

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

View File

@ -9,8 +9,14 @@
}
},
"AllowedHosts": "*",
"settings": {
"endpoint1": "xxx",
"endpoint2": "xxx",
"endpoint3": "xxx"
},
"ConnectionStrings": {
//"EmployeeConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;"
//"EmployeeConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;",
//"EmployeeConnection": "Server=localhost,1433;Database=da_survey_dev;User Id=sa;Password=Password123;TrustServerCertificate=True;"
"EmployeeConnection": "Server=207.180.248.35;Database=da_survey_dev;User Id=sa;Password=YourStrongPassw0rd;TrustServerCertificate=True;"
}

View File

@ -1,5 +1,4 @@
using DamageAssesment.Api.Locations.Interfaces;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
@ -16,7 +15,7 @@ namespace DamageAssesment.Api.Locations.Controllers
/// <summary>
/// Get all locations.
/// </summary>
[Authorize(Roles = "admin")]
[HttpGet("locations")]
public async Task<ActionResult> GetLocationsAsync()
{
@ -32,7 +31,7 @@ namespace DamageAssesment.Api.Locations.Controllers
/// <summary>
/// Get all locations based on locationdId.
/// </summary>
[Authorize(Roles = "admin")]
[HttpGet("locations/{id}")]
public async Task<ActionResult> GetLocationByIdAsync(int id)
{
@ -48,7 +47,7 @@ namespace DamageAssesment.Api.Locations.Controllers
/// <summary>
/// Update a Location.
/// </summary>
[Authorize(Roles = "admin")]
[HttpPut("locations/{id}")]
public async Task<IActionResult> UpdateLocation(int id, Models.Location Location)
{
@ -66,7 +65,7 @@ namespace DamageAssesment.Api.Locations.Controllers
/// <summary>
/// Save a new location.
/// </summary>
[Authorize(Roles = "admin")]
[HttpPost("locations")]
public async Task<IActionResult> CreateLocation(Models.Location Location)
{
@ -84,7 +83,7 @@ namespace DamageAssesment.Api.Locations.Controllers
/// <summary>
/// Delete an existing location.
/// </summary>
[Authorize(Roles = "admin")]
[HttpDelete("locations/{id}")]
public async Task<IActionResult> DeleteLocation(int id)
{

View File

@ -1,5 +1,4 @@
using DamageAssesment.Api.Locations.Interfaces;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace DamageAssesment.Api.Locations.Controllers
@ -16,7 +15,7 @@ namespace DamageAssesment.Api.Locations.Controllers
/// <summary>
/// Get all regions.2
/// </summary>
[Authorize(Roles = "admin")]
[HttpGet("regions")]
public async Task<ActionResult> GetRegionsAsync()
{
@ -30,7 +29,7 @@ namespace DamageAssesment.Api.Locations.Controllers
/// <summary>
/// GET request for retrieving a region by its ID.
/// </summary>
[Authorize(Roles = "admin")]
[HttpGet("regions/{id}")]
public async Task<ActionResult> GetRegionAsync(int id)
{
@ -44,7 +43,7 @@ namespace DamageAssesment.Api.Locations.Controllers
/// <summary>
/// POST request for creating a new region.
/// </summary>
[Authorize(Roles = "admin")]
[HttpPost("regions")]
public async Task<ActionResult> PostRegionAsync(Models.Region region)
{
@ -58,7 +57,7 @@ namespace DamageAssesment.Api.Locations.Controllers
/// <summary>
/// PUT request for updating an existing region.
/// </summary>
[Authorize(Roles = "admin")]
[HttpPut("regions/{id}")]
public async Task<ActionResult> PutRegionAsync(int id, Models.Region region)
{
@ -76,7 +75,7 @@ namespace DamageAssesment.Api.Locations.Controllers
/// DELETE request for deleting a region based on ID.
/// </summary>
[Authorize(Roles = "admin")]
[HttpDelete("regions/{id}")]
public async Task<ActionResult> DeleteRegionAsync(int id)
{

View File

@ -21,6 +21,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

@ -1,76 +1,23 @@
using DamageAssesment.Api.Locations.Db;
using DamageAssesment.Api.Locations.Interfaces;
using DamageAssesment.Api.Locations.Providers;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.EntityFrameworkCore;
using Microsoft.IdentityModel.Tokens;
using Microsoft.OpenApi.Models;
using System.Reflection;
using System.Text;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddCors(p => p.AddPolicy("DamageAppCorsPolicy", build => {
build.WithOrigins("*").AllowAnyMethod().AllowAnyHeader().AllowAnyOrigin();
}));
// Add services to the container.
var authkey = builder.Configuration.GetValue<string>("JwtSettings:securitykey");
builder.Services.AddAuthentication(item =>
{
item.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
item.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(item =>
{
item.RequireHttpsMetadata = true;
item.SaveToken = true;
item.TokenValidationParameters = new TokenValidationParameters()
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(authkey)),
ValidateIssuer = false,
ValidateAudience = false,
ClockSkew = TimeSpan.Zero
};
});
// Add services to the container.
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
//builder.Services.AddSwaggerGen();
builder.Services.AddSwaggerGen(options =>
builder.Services.AddSwaggerGen(c =>
{
// Include XML comments from your assembly
var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
options.IncludeXmlComments(xmlPath);
OpenApiSecurityScheme securityDefinition = new OpenApiSecurityScheme()
{
Name = "Bearer",
BearerFormat = "JWT",
Scheme = "bearer",
Description = "Specify the authorization token.",
In = ParameterLocation.Header,
Type = SecuritySchemeType.Http,
};
options.AddSecurityDefinition("jwt_auth", securityDefinition);
// Make sure swagger UI requires a Bearer token specified
OpenApiSecurityScheme securityScheme = new OpenApiSecurityScheme()
{
Reference = new OpenApiReference()
{
Id = "jwt_auth",
Type = ReferenceType.SecurityScheme
}
};
OpenApiSecurityRequirement securityRequirements = new OpenApiSecurityRequirement()
{
{securityScheme, new string[] { }},
};
options.AddSecurityRequirement(securityRequirements);
c.IncludeXmlComments(xmlPath);
});
builder.Services.AddScoped<ILocationsProvider, LocationsProvider>();
builder.Services.AddScoped<IRegionsProvider, RegionsProvider>();
@ -79,10 +26,7 @@ builder.Services.AddDbContext<LocationDbContext>(option =>
{
option.UseSqlServer("LocationConnection");
});
var app = builder.Build();
// Add services to the container.
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
@ -99,8 +43,7 @@ if (app.Environment.IsDevelopment())
regionProvider.SeedData();
}
}
app.UseCors("DamageAppCorsPolicy");
app.UseAuthentication();
app.UseAuthorization();
app.MapControllers();

View File

@ -17,7 +17,7 @@ namespace DamageAssesment.Api.Locations.Providers
this.locationDbContext = locationDbContext;
this.logger = logger;
this.mapper = mapper;
// SeedData();
// SeedData();
}
public async Task<(bool IsSuccess, IEnumerable<Models.Location> Locations, string ErrorMessage)> GetLocationsAsync()
@ -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

@ -10,7 +10,8 @@
},
"AllowedHosts": "*",
"ConnectionStrings": {
//"LocationConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;"
//"LocationConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;",
// "LocationConnection": "Server=localhost,1433;Database=da_survey_dev;User Id=sa;Password=Password123;TrustServerCertificate=True;"
"LocationConnection": "Server=207.180.248.35;Database=da_survey_dev;User Id=sa;Password=YourStrongPassw0rd;TrustServerCertificate=True;"
}

View File

@ -1,6 +1,4 @@
using DamageAssesment.Api.Questions.Interfaces;
using DamageAssesment.Api.Questions.Models;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace DamageAssesment.Api.Questions.Controllers
@ -12,13 +10,16 @@ namespace DamageAssesment.Api.Questions.Controllers
public QuestionsController(IQuestionsProvider questionsProvider)
{
this.questionsProvider = questionsProvider;
}
/// <summary>
/// GET request for retrieving questions.
/// </summary>
//get all questions
[Authorize(Roles = "admin,survey,user,report")]
// get all questions
[Route("questions")]
[Route("questions/{language:alpha}")]
[HttpGet]
@ -36,7 +37,6 @@ namespace DamageAssesment.Api.Questions.Controllers
/// <summary>
/// GET request for retrieving a question by ID.
/// </summary>
[Authorize(Roles = "admin,survey,user,report")]
[Route("questions/{id}/{language:alpha}")]
[Route("questions/{id:int}")]
[HttpGet]
@ -55,7 +55,6 @@ namespace DamageAssesment.Api.Questions.Controllers
/// GET request for retrieving survey questions based on a survey ID.
/// Uri: {Optional language}/GetSurveyQuestions/{surveyId} :Default returns question in all languages
/// </summary>
[Authorize(Roles = "admin,survey,user,report")]
[Route("questions/bysurvey/{surveyId:int}")]
[Route("questions/bysurvey/{surveyId:int}/{language:alpha}")]
[HttpGet]
@ -72,7 +71,6 @@ namespace DamageAssesment.Api.Questions.Controllers
/// PUT request for updating a question (multilingual).
/// </summary>
[Authorize(Roles = "admin")]
[HttpPut("questions")]
public async Task<IActionResult> UpdateQuestion(Models.Question question)
{
@ -93,7 +91,6 @@ namespace DamageAssesment.Api.Questions.Controllers
/// <summary>
/// POST request for creating a multiple question (multilingual).
/// </summary>
[Authorize(Roles = "admin")]
[HttpPost("questions/multiple")]
public async Task<IActionResult> CreateQuestions(List<Models.Question> questions)
{
@ -109,33 +106,12 @@ namespace DamageAssesment.Api.Questions.Controllers
return BadRequest(result.ErrorMessage);
}
return CreatedAtRoute("DefaultApi", questions);
}
/// <summary>
/// PUT request for update a multiple question (multilingual) for survey.
/// </summary>
[HttpPut("questions/multiple/{surveyid}")]
public async Task<IActionResult> CreateQuestions(int surveyid, List<Models.Question> questions)
{
if (questions != null)
{
var result = await this.questionsProvider.PutQuestionsAsync(surveyid,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);
return CreatedAtRoute("DefaultApi",questions);
}
/// <summary>
/// POST request for creating a new question (multilingual).
/// </summary>
[Authorize(Roles = "admin")]
[HttpPost("questions")]
public async Task<IActionResult> CreateQuestion(Models.Question question)
{
@ -154,7 +130,6 @@ namespace DamageAssesment.Api.Questions.Controllers
/// DELETE request for deleting a question based on ID.
/// </summary>
[Authorize(Roles = "admin")]
[HttpDelete("questions/{id}")]
public async Task<IActionResult> DeleteQuestion(int id)
{
@ -170,7 +145,6 @@ namespace DamageAssesment.Api.Questions.Controllers
/// GET request for retrieving question categories.
/// </summary>
[Authorize(Roles = "admin,user,report")]
[HttpGet("questions/categories")]
[HttpGet("questions/categories/{language:alpha}")]
public async Task<IActionResult> GetQuestionCategoriesAsync(string? language)
@ -185,7 +159,7 @@ namespace DamageAssesment.Api.Questions.Controllers
/// <summary>
/// GET request for retrieving a question category by ID.
/// </summary>
[Authorize(Roles = "admin,report")]
[HttpGet("questions/categories/{id:int}")]
[HttpGet("questions/categories/{id:int}/{language:alpha}")]
public async Task<IActionResult> GetQuestionCategoryAsync(int id,string? language)
@ -202,7 +176,7 @@ namespace DamageAssesment.Api.Questions.Controllers
/// <summary>
/// PUT request for updating a question category.
/// </summary>
[Authorize(Roles = "admin,survey,report")]
[HttpPut("questions/categories")]
public async Task<IActionResult> UpdateQuestionCategory(Models.QuestionCategory questionCategory)
{
@ -224,7 +198,6 @@ namespace DamageAssesment.Api.Questions.Controllers
/// POST request for creating a new question category.
/// </summary>
[Authorize(Roles = "admin")]
[HttpPost("questions/categories")]
public async Task<IActionResult> CreateQuestionCategory(Models.QuestionCategory questionCategory)
{
@ -243,7 +216,6 @@ namespace DamageAssesment.Api.Questions.Controllers
/// DELETE request for deleting a question category based on ID.
/// </summary>
[Authorize(Roles = "admin")]
[HttpDelete("questions/categories/{id}")]
public async Task<IActionResult> DeleteQuestionCategory(int id)
{

View File

@ -9,7 +9,6 @@ namespace DamageAssesment.Api.Questions.Interfaces
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, IEnumerable<Models.MultiLanguage> Question, string ErrorMessage)> PutQuestionsAsync(int surveyId,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

@ -12,7 +12,7 @@
public bool IsRequired { get; set; }
public bool Comment { get; set; }
public bool Key { get; set; }
public int SurveyId { get; set; }
public int? SurveyId { get; set; }
public int CategoryId { get; set; }
}
}

View File

@ -1,36 +1,11 @@
using DamageAssesment.Api.Questions.Db;
using DamageAssesment.Api.Questions.Interfaces;
using DamageAssesment.Api.Questions.Providers;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.EntityFrameworkCore;
using Microsoft.IdentityModel.Tokens;
using Microsoft.OpenApi.Models;
using System.Reflection;
using System.Text;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddCors(p => p.AddPolicy("DamageAppCorsPolicy", build => {
build.WithOrigins("*").AllowAnyMethod().AllowAnyHeader().AllowAnyOrigin();
}));
// Add services to the container.
var authkey = builder.Configuration.GetValue<string>("JwtSettings:securitykey");
builder.Services.AddAuthentication(item =>
{
item.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
item.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(item =>
{
item.RequireHttpsMetadata = true;
item.SaveToken = true;
item.TokenValidationParameters = new TokenValidationParameters()
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(authkey)),
ValidateIssuer = false,
ValidateAudience = false,
ClockSkew = TimeSpan.Zero
};
});
// Add services to the container.
builder.Services.AddControllers();
@ -42,41 +17,13 @@ builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());
builder.Services.AddEndpointsApiExplorer();
//builder.Services.AddSwaggerGen();
builder.Services.AddSwaggerGen(options =>
builder.Services.AddSwaggerGen(c =>
{
// Include XML comments from your assembly
var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
options.IncludeXmlComments(xmlPath);
OpenApiSecurityScheme securityDefinition = new OpenApiSecurityScheme()
{
Name = "Bearer",
BearerFormat = "JWT",
Scheme = "bearer",
Description = "Specify the authorization token.",
In = ParameterLocation.Header,
Type = SecuritySchemeType.Http,
};
options.AddSecurityDefinition("jwt_auth", securityDefinition);
// Make sure swagger UI requires a Bearer token specified
OpenApiSecurityScheme securityScheme = new OpenApiSecurityScheme()
{
Reference = new OpenApiReference()
{
Id = "jwt_auth",
Type = ReferenceType.SecurityScheme
}
};
OpenApiSecurityRequirement securityRequirements = new OpenApiSecurityRequirement()
{
{securityScheme, new string[] { }},
};
options.AddSecurityRequirement(securityRequirements);
c.IncludeXmlComments(xmlPath);
});
builder.Services.AddDbContext<QuestionDbContext>(option =>
{
option.UseSqlServer("QuestionConnection");
@ -96,8 +43,7 @@ if (app.Environment.IsDevelopment())
questionProvider.SeedData();
}
}
app.UseCors("DamageAppCorsPolicy");
app.UseAuthentication();
app.UseAuthorization();
app.MapControllers();

View File

@ -363,7 +363,7 @@ namespace DamageAssesment.Api.Questions.Providers
try
{
List<Models.MultiLanguage> results = new List<MultiLanguage>();
logger?.LogInformation("Query Question");
logger?.LogInformation("Query Question");
foreach (Models.Question Question in Questions)
{
results.Add(InsertQuestion(Question));
@ -376,36 +376,6 @@ namespace DamageAssesment.Api.Questions.Providers
return (false, null, ex.Message);
}
}
public async Task<(bool IsSuccess, IEnumerable<Models.MultiLanguage> Question, string ErrorMessage)> PutQuestionsAsync(int surveyId, List<Models.Question> Questions)
{
try
{
var questions=await questionDbContext.Questions.AsNoTracking().Where(a=>a.SurveyId == surveyId).ToListAsync();
if (questions != null)
{
List<int> questionids=questions.Select(a=>a.Id).ToList();
var questiontrans = await questionDbContext.QuestionsTranslations.AsNoTracking().Where(x => questionids.Contains(x.QuestionId)).ToListAsync();
if (questiontrans != null)
questionDbContext.QuestionsTranslations.RemoveRange(questiontrans);
questionDbContext.Questions.RemoveRange(questions);
questionDbContext.SaveChanges();
}
List<Models.MultiLanguage> results = new List<MultiLanguage>();
logger?.LogInformation("Query Question");
foreach (Models.Question Question in Questions)
{
Question.SurveyId = surveyId;
results.Add(InsertQuestion(Question));
}
return (true, results, null);
}
catch (Exception ex)
{
logger?.LogError(ex.ToString());
return (false, null, ex.Message);
}
}
public async Task<(bool IsSuccess, Models.MultiLanguage Question, string ErrorMessage)> UpdateQuestionAsync(Models.Question Question)
{
try
@ -439,11 +409,8 @@ namespace DamageAssesment.Api.Questions.Providers
if (question != null)
{
var questiontrans=await questionDbContext.QuestionsTranslations.AsNoTracking().Where(x=>x.QuestionId== id).ToListAsync();
var result = mapper.Map<Db.Question, Models.MultiLanguage>(question);
result.Text = CreateMultiLanguageObject(GetQuestionsTranslations(result.Id, ""));
if(questiontrans!=null)
questionDbContext.QuestionsTranslations.RemoveRange(questiontrans);
questionDbContext.Questions.Remove(question);
questionDbContext.SaveChanges();
return (true, result, $"QuestionID {id} deleted Successfuly");

View File

@ -11,6 +11,7 @@
"AllowedHosts": "*",
"ConnectionStrings": {
//"QuestionConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;"
// "QuestionConnection": "Server=localhost,1433;Database=da_survey_dev;User Id=sa;Password=Password123;TrustServerCertificate=True;"
"QuestionConnection": "Server=207.180.248.35;Database=da_survey_dev;User Id=sa;Password=YourStrongPassw0rd;TrustServerCertificate=True;"
}

View File

@ -86,9 +86,8 @@ namespace DamageAssesment.Api.Questions.Test
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);
Questions.Add(question);
return Questions;
}
}
}

View File

@ -356,5 +356,6 @@ namespace DamageAssesment.Api.Questions.Test
Assert.Equal(404, result.StatusCode);
}
}
}

View File

@ -25,16 +25,17 @@ 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 ResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var result = (OkObjectResult)await surveyResponseProvider.GetSurveyResponsesAsync(1);
Assert.Equal(200, result.StatusCode);
}
[Fact(DisplayName = "Get Responses - BadRequest case")]
public async Task GetSurveyResponsesAsync_ShouldReturnStatusCode204()
{
var mockResponse = await MockData.getResponse();
mockSurveyResponseService.Setup(service => service.GetSurveyResponsesAsync(1)).ReturnsAsync(mockResponse);
var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var result = (BadRequestObjectResult)await surveyResponseProvider.GetSurveyResponsesAsync(1);
Assert.Equal(400, result.StatusCode);
}
@ -45,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 ResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var result = (OkObjectResult)await surveyResponseProvider.GetSurveyResponsesAsync(1, 1);
Assert.Equal(200, result.StatusCode);
}
@ -55,7 +56,7 @@ namespace DamageAssesment.SurveyResponses.Test
{
var mockResponse = await MockData.getResponse();
mockSurveyResponseService.Setup(service => service.GetSurveyResponsesBySurveyAsync(1, 1)).ReturnsAsync(mockResponse);
var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var result = (NoContentResult)await surveyResponseProvider.GetSurveyResponsesAsync(1, 1);
Assert.Equal(204, result.StatusCode);
}
@ -69,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 ResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var result = (OkObjectResult)await surveyResponseProvider.GetSurveyResponsesBySurveyAndLocationAsync(1, 1, 1);
Assert.Equal(200, result.StatusCode);
}
@ -79,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 ResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var result = (NoContentResult)await surveyResponseProvider.GetSurveyResponsesBySurveyAndLocationAsync(1, 1, 1);
Assert.Equal(204, result.StatusCode);
}
@ -90,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 ResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var result = (OkObjectResult)await surveyResponseProvider.GetSurveyResponsesByAnswerAsyncAsync(1, 1, "Yes", 1);
Assert.Equal(200, result.StatusCode);
}
@ -100,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 ResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var result = (NoContentResult)await surveyResponseProvider.GetSurveyResponsesByAnswerAsyncAsync(1, 1, "Yes", 1);
Assert.Equal(204, result.StatusCode);
}
@ -112,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 ResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var result = (OkObjectResult)await surveyResponseProvider.GetAnswersByRegionAsync(1, 1);
Assert.Equal(200, result.StatusCode);
}
@ -122,7 +123,7 @@ namespace DamageAssesment.SurveyResponses.Test
{
var mockResponse = await MockData.getResponse();
mockSurveyResponseService.Setup(service => service.GetAnswersByRegionAsync(1, 1)).ReturnsAsync(mockResponse);
var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var result = (NoContentResult)await surveyResponseProvider.GetAnswersByRegionAsync(1, 1);
Assert.Equal(204, result.StatusCode);
}
@ -133,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 ResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var result = (OkObjectResult)await surveyResponseProvider.GetAnswersByMaintenaceCentersync(1, 1);
Assert.Equal(200, result.StatusCode);
}
@ -143,7 +144,7 @@ namespace DamageAssesment.SurveyResponses.Test
{
var mockResponse = await MockData.getResponse();
mockSurveyResponseService.Setup(service => service.GetSurveyResponsesByMaintenanceCenterAsync(1, 1)).ReturnsAsync(mockResponse);
var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var result = (NoContentResult)await surveyResponseProvider.GetAnswersByMaintenaceCentersync(1, 1);
Assert.Equal(204, result.StatusCode);
}
@ -154,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 ResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var result = (OkObjectResult)await surveyResponseProvider.GetSurveyResponseByIdAsync(1);
Assert.Equal(200, result.StatusCode);
}
@ -164,7 +165,7 @@ namespace DamageAssesment.SurveyResponses.Test
{
var mockResponse = await MockData.getResponse();
mockSurveyResponseService.Setup(service => service.GetSurveyResponseByIdAsync(1)).ReturnsAsync(mockResponse);
var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var result = (NoContentResult)await surveyResponseProvider.GetSurveyResponseByIdAsync(1);
Assert.Equal(204, result.StatusCode);
}
@ -176,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 ResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var surveyResponseController = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var result = (OkObjectResult)await surveyResponseController.PostSurveysAsync(mockRequestObject);
Assert.Equal(200, result.StatusCode);
}
@ -187,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 ResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var surveyResponseController = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var result = (BadRequestObjectResult)await surveyResponseController.PostSurveysAsync(mockRequestObject);
Assert.Equal(400, result.StatusCode);
}
@ -198,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 ResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var surveyResponseController = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var result = (OkObjectResult)await surveyResponseController.PutSurveyResponseAsync(1, mockRequestObject);
Assert.Equal(200, result.StatusCode);
}
@ -209,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 ResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var surveyResponseController = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var result = (BadRequestObjectResult)await surveyResponseController.PutSurveyResponseAsync(1, mockRequestObject);
Assert.Equal(400, result.StatusCode);
}
@ -220,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 ResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var surveyResponseController = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var result = (OkObjectResult)await surveyResponseController.DeleteSurveyResponseAsync(1);
Assert.Equal(200, result.StatusCode);
}
@ -230,7 +231,7 @@ namespace DamageAssesment.SurveyResponses.Test
{
var mockResponse = await MockData.getResponse();
mockSurveyResponseService.Setup(service => service.DeleteSurveyResponseAsync(1)).ReturnsAsync(mockResponse); ;
var surveyResponseController = new ResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var surveyResponseController = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var result = (NotFoundResult)await surveyResponseController.DeleteSurveyResponseAsync(1);
Assert.Equal(404, result.StatusCode);
}

View File

@ -1,17 +1,16 @@
using DamageAssesment.Api.Responses.Interfaces;
using DamageAssesment.Api.Responses.Models;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace DamageAssesment.Api.Responses.Controllers
{
[ApiController]
public class ResponsesController : ControllerBase
public class SurveyResponsesController : ControllerBase
{
private readonly ISurveysResponse surveyResponseProvider;
private readonly IExcelExportService excelExportService;
public ResponsesController(ISurveysResponse surveyResponseProvider, IExcelExportService excelExportService)
public SurveyResponsesController(ISurveysResponse surveyResponseProvider, IExcelExportService excelExportService)
{
this.surveyResponseProvider = surveyResponseProvider;
this.excelExportService = excelExportService;
@ -20,7 +19,6 @@ namespace DamageAssesment.Api.Responses.Controllers
/// GET request for retrieving survey responses.
/// </summary>
[Authorize(Roles = "admin,survey,user,report")]
[Route("responses/{employeeid:int}")]
[Route("responses")]
[HttpGet]
@ -40,7 +38,6 @@ namespace DamageAssesment.Api.Responses.Controllers
/// <summary>
/// GET request for retrieving survey responses by survey ID.
/// </summary>
[Authorize(Roles = "admin,survey,user,report")]
[Route("responses/bysurvey/{surveyid:int}/{employeeid:int}")]
[Route("responses/bysurvey/{surveyid:int}")]
[HttpGet]
@ -59,7 +56,6 @@ namespace DamageAssesment.Api.Responses.Controllers
/// <param name="surveyid">The ID of the survey for which responses are to be retrieved.</param>
/// <param name="locationid">The ID of the location for which responses are to be retrieved.</param>
[Authorize(Roles = "admin,survey,user,report")]
[Route("responses/{surveyid:int}/{locationid:int}/{employeeid:int}")]
[Route("responses/{surveyid:int}/{locationid:int}")]
[HttpGet]
@ -79,7 +75,6 @@ namespace DamageAssesment.Api.Responses.Controllers
/// <param name="questionId">The ID of the question for which responses are to be retrieved.</param>
/// <param name="answer">The answer for which responses are to be retrieved.</param>
[Authorize(Roles = "admin,survey,user,report")]
[Route("responses/byanswer/{surveyid:int}/{questionid:int}/{answer:alpha}/{employeeid:int}")]
[Route("responses/byanswer/{surveyid:int}/{questionid:int}/{answer:alpha}")]
[HttpGet]
@ -98,7 +93,6 @@ namespace DamageAssesment.Api.Responses.Controllers
/// </summary>
/// <param name="surveyId">The ID of the survey for which answers are to be retrieved.</param>
[Authorize(Roles = "admin,survey,user,report")]
[Route("responses/byregion/{surveyid:int}")]
[Route("responses/byregion/{surveyid:int}/{employeeid}")]
[HttpGet]
@ -115,7 +109,6 @@ namespace DamageAssesment.Api.Responses.Controllers
/// GET request for retrieving survey responses by survey ID and maintenance center.
/// </summary>
/// <param name="surveyId">The ID of the survey for which responses are to be retrieved.</param>
[Authorize(Roles = "admin,survey,user,report")]
[Route("responses/bymaintenancecenter/{surveyid:int}/{employeeid:int}")]
[Route("responses/bymaintenancecenter/{surveyid:int}")]
[HttpGet]
@ -133,7 +126,6 @@ namespace DamageAssesment.Api.Responses.Controllers
/// </summary>
/// <param name="responseId">The ID of the survey response to be retrieved.</param>
[Authorize(Roles = "admin,survey,user,report")]
[HttpGet("responses/{id}")]
public async Task<ActionResult> GetSurveyResponseByIdAsync(int id)
{
@ -150,7 +142,6 @@ namespace DamageAssesment.Api.Responses.Controllers
/// </summary>
/// <param name="surveyResponse">The survey response object to be created.</param>
[Authorize(Roles = "admin,survey,user,report")]
[HttpPost("responses")]
public async Task<ActionResult> PostSurveysAsync(Models.SurveyResponse surveyResponse)
{
@ -167,7 +158,6 @@ namespace DamageAssesment.Api.Responses.Controllers
/// <param name="Id">The ID of the survey response to be updated.</param>
/// <param name="surveyResponse">The updated survey response object.</param>
[Authorize(Roles = "admin,survey,user,report")]
[HttpPut("responses/{id}")]
public async Task<ActionResult> PutSurveyResponseAsync(int id, Models.SurveyResponse surveyResponse)
{
@ -185,7 +175,6 @@ namespace DamageAssesment.Api.Responses.Controllers
/// DELETE request for deleting an existing survey response.
/// </summary>
[Authorize(Roles = "admin,survey,user,report")]
[HttpDelete("responses/{id}")]
public async Task<ActionResult> DeleteSurveyResponseAsync(int id)
{
@ -201,7 +190,6 @@ namespace DamageAssesment.Api.Responses.Controllers
/// </summary>
/// <param name="request">The answers to be submitted for the survey.</param>
[Authorize(Roles = "admin,survey,user,report")]
[HttpPost("responses/answers")]
public async Task<ActionResult> PostSurveyAnswersAsync(Request request)
{
@ -215,8 +203,6 @@ namespace DamageAssesment.Api.Responses.Controllers
/// <summary>
/// Get All active surveys .
/// </summary>
[Authorize(Roles = "admin,survey,user,report")]
[Route("responses/surveys/active")]
[Route("responses/surveys/active/{language:alpha}")]
[Route("responses/surveys/active/{employeeid:int}")]
@ -234,7 +220,6 @@ namespace DamageAssesment.Api.Responses.Controllers
/// <summary>
/// Export all survey response data based on survey id.
/// </summary>
[Authorize(Roles = "admin,survey,user,report")]
[HttpGet]
[Route("responses/surveys/export/{surveyid}")]
public async Task<ActionResult> GetExcelSurveysAsync(int surveyid, string language, bool IsAdmin = false)
@ -265,7 +250,6 @@ namespace DamageAssesment.Api.Responses.Controllers
/// <summary>
/// Get all historical surveys .
/// </summary>
[Authorize(Roles = "admin,survey,user,report")]
[Route("responses/surveys/historic")]
[Route("responses/surveys/historic/{language:alpha}")]
[Route("responses/surveys/historic/{employeeid:int}")]

View File

@ -4,9 +4,9 @@ namespace DamageAssesment.Api.Responses.Interfaces
{
public interface IAnswerServiceProvider
{
Task<List<Answer>> getAnswersAsync(string token);
Task<List<Models.Answer>> GetAnswersByResponseIdAsync(int responseId, string token);
Task<List<Answer>> getAnswersAsync();
Task<List<Models.Answer>> GetAnswersByResponseIdAsync(int responseId);
Task<Models.Answer> PostAnswersAsync(Models.Answer answer, string token);
Task<Models.Answer> PostAnswersAsync(Models.Answer answer);
}
}

View File

@ -4,7 +4,7 @@ namespace DamageAssesment.Api.Responses.Interfaces
{
public interface IAttachmentServiceProvider
{
Task<List<Attachment>> getAttachmentsAsync(string token);
Task<IEnumerable<Attachment>> PostAttachmentsAsync(Models.AttachmentInfo attachmentInfo, string token);
Task<List<Attachment>> getAttachmentsAsync();
Task<IEnumerable<Attachment>> PostAttachmentsAsync(Models.AttachmentInfo attachmentInfo);
}
}

View File

@ -1,10 +1,10 @@
using DamageAssesment.Api.Responses.Models;
using DamageAssesment.Api.Responses.Models;
namespace DamageAssesment.Api.Responses.Interfaces
{
public interface IEmployeeServiceProvider
{
Task<List<Employee>> getEmployeesAsync(string token);
Task<Employee> getEmployeeAsync(int employeeId, string token);
Task<List<Employee>> getEmployeesAsync();
Task<Employee> getEmployeeAsync(int employeeId);
}
}

View File

@ -1,9 +1,9 @@
using DamageAssesment.Api.Responses.Models;
using DamageAssesment.Api.Responses.Models;
namespace DamageAssesment.Api.Responses.Interfaces
{
public interface IHttpUtil
{
Task<string> SendAsync(HttpMethod method, string url, string JsonInput, string token);
Task<string> SendAsync(HttpMethod method, string url, string JsonInput);
}
}

View File

@ -4,6 +4,6 @@ namespace DamageAssesment.Api.Responses.Interfaces
{
public interface ILocationServiceProvider
{
Task<List<Location>> getLocationsAsync(string token);
Task<List<Location>> getLocationsAsync();
}
}

View File

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

@ -4,6 +4,6 @@ namespace DamageAssesment.Api.Responses.Interfaces
{
public interface IRegionServiceProvider
{
Task<List<Region>> getRegionsAsync(string token);
Task<List<Region>> getRegionsAsync();
}
}

View File

@ -4,7 +4,7 @@ namespace DamageAssesment.Api.Responses.Interfaces
{
public interface ISurveyServiceProvider
{
Task<List<Survey>> getSurveysAsync(string language,string token);
Task<Survey> getSurveyAsync(int surveyId,string token);
Task<List<Survey>> getSurveysAsync(string language);
Task<Survey> getSurveyAsync(int surveyId);
}
}

View File

@ -11,6 +11,6 @@ namespace DamageAssesment.Api.Responses.Models
public string OfficePhoneNumber { get; set; }
public string Email { get; set; }
public bool IsActive { get; set; }
public string PreferredLanguage { get; set; }
public string? PreferredLanguage { get; set; }
}
}

View File

@ -8,5 +8,9 @@
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

@ -5,10 +5,6 @@ using DamageAssesment.Api.Responses.Providers;
using Microsoft.EntityFrameworkCore;
using Polly;
using System.Reflection;
using Microsoft.OpenApi.Models;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
using System.Text;
var builder = WebApplication.CreateBuilder(args);
const int maxApiCallRetries = 3;
@ -16,29 +12,8 @@ const int intervalToRetry = 2; //2 seconds
const int maxRetryForCircuitBraker = 5;
const int intervalForCircuitBraker = 5; //5 seconds
builder.Services.AddCors(p => p.AddPolicy("DamageAppCorsPolicy", build => {
build.WithOrigins("*").AllowAnyMethod().AllowAnyHeader().AllowAnyOrigin();
}));
// Add services to the container.
var authkey = builder.Configuration.GetValue<string>("JwtSettings:securitykey");
builder.Services.AddAuthentication(item =>
{
item.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
item.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(item =>
{
item.RequireHttpsMetadata = true;
item.SaveToken = true;
item.TokenValidationParameters = new TokenValidationParameters()
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(authkey)),
ValidateIssuer = false,
ValidateAudience = false,
ClockSkew = TimeSpan.Zero
};
});
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
@ -52,7 +27,6 @@ builder.Services.AddScoped<IEmployeeServiceProvider, EmployeeServiceProvider>();
builder.Services.AddScoped<IAttachmentServiceProvider, AttachmentServiceProvider>();
builder.Services.AddScoped<ISurveyServiceProvider, SurveyServiceProvider>();
builder.Services.AddScoped<IExcelExportService, ExcelExportService>();
builder.Services.AddHttpContextAccessor();
builder.Services.AddHttpClient<IHttpUtil, HttpUtil>().
AddTransientHttpErrorPolicy(policy => policy.WaitAndRetryAsync(maxApiCallRetries, _ => TimeSpan.FromSeconds(intervalToRetry))).
@ -62,40 +36,12 @@ builder.Services.AddHttpClient<IHttpUtil, HttpUtil>().
builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());
builder.Services.AddEndpointsApiExplorer();
//builder.Services.AddSwaggerGen();
builder.Services.AddSwaggerGen(options =>
builder.Services.AddSwaggerGen(c =>
{
// Include XML comments from your assembly
var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
options.IncludeXmlComments(xmlPath);
OpenApiSecurityScheme securityDefinition = new OpenApiSecurityScheme()
{
Name = "Bearer",
BearerFormat = "JWT",
Scheme = "bearer",
Description = "Specify the authorization token.",
In = ParameterLocation.Header,
Type = SecuritySchemeType.Http,
};
options.AddSecurityDefinition("jwt_auth", securityDefinition);
// Make sure swagger UI requires a Bearer token specified
OpenApiSecurityScheme securityScheme = new OpenApiSecurityScheme()
{
Reference = new OpenApiReference()
{
Id = "jwt_auth",
Type = ReferenceType.SecurityScheme
}
};
OpenApiSecurityRequirement securityRequirements = new OpenApiSecurityRequirement()
{
{securityScheme, new string[] { }},
};
options.AddSecurityRequirement(securityRequirements);
c.IncludeXmlComments(xmlPath);
});
builder.Services.AddDbContext<SurveyResponseDbContext>(option =>
{
@ -109,8 +55,7 @@ if (app.Environment.IsDevelopment())
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseCors("DamageAppCorsPolicy");
app.UseAuthentication();
app.UseAuthorization();
app.MapControllers();

View File

@ -1,6 +1,6 @@
{
"profiles": {
"DamageAssesment.Api.Responses": {
"DamageAssesment.Api.SurveyResponses": {
"commandName": "Project",
"launchBrowser": true,
"launchUrl": "swagger",

View File

@ -2,7 +2,6 @@
using DamageAssesment.Api.Responses.Db;
using DamageAssesment.Api.Responses.Interfaces;
using DamageAssesment.Api.Responses.Models;
using DamageAssesment.Api.Responses.Services;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Internal;
using System.Reflection;
@ -22,10 +21,8 @@ namespace DamageAssesment.Api.Responses.Providers
private readonly IQuestionServiceProvider questionServiceProvider;
private readonly ISurveyServiceProvider surveyServiceProvider;
private readonly IMapper mapper;
private readonly IHttpContextAccessor httpContextAccessor;
private string token;
public SurveyResponsesProvider(SurveyResponseDbContext surveyResponseDbContext, ILogger<SurveyResponsesProvider> logger, IAnswerServiceProvider answerServiceProvider, IRegionServiceProvider regionServiceProvider, ILocationServiceProvider locationServiceProvider, IEmployeeServiceProvider employeeServiceProvider, IAttachmentServiceProvider attachmentServiceProvider, IQuestionServiceProvider questionServiceProvider, ISurveyServiceProvider surveyServiceProvider, IMapper mapper, IHttpContextAccessor httpContextAccessor)
public SurveyResponsesProvider(SurveyResponseDbContext surveyResponseDbContext, ILogger<SurveyResponsesProvider> logger, IAnswerServiceProvider answerServiceProvider, IRegionServiceProvider regionServiceProvider, ILocationServiceProvider locationServiceProvider, IEmployeeServiceProvider employeeServiceProvider, IAttachmentServiceProvider attachmentServiceProvider, IQuestionServiceProvider questionServiceProvider, ISurveyServiceProvider surveyServiceProvider, IMapper mapper)
{
this.surveyResponseDbContext = surveyResponseDbContext;
this.logger = logger;
@ -36,20 +33,8 @@ namespace DamageAssesment.Api.Responses.Providers
this.attachmentServiceProvider = attachmentServiceProvider;
this.questionServiceProvider = questionServiceProvider;
this.surveyServiceProvider = surveyServiceProvider;
this.httpContextAccessor = httpContextAccessor;
this.mapper = mapper;
SeedData();
token = httpContextAccessor.HttpContext.Request.Headers.Authorization;
if (token != null)
{
token = token.Replace("Bearer ", string.Empty);
}
else
{
token = "";
}
// seedData();
}
public void SeedData()
@ -71,20 +56,16 @@ namespace DamageAssesment.Api.Responses.Providers
try
{
logger?.LogInformation("Querying to get SurveyResponse object from DB");
List<Db.SurveyResponse> listSurveyResponse = null;
IQueryable<Db.SurveyResponse> listSurveyResponse = null;
if (employeeid == 0)
{
listSurveyResponse = surveyResponseDbContext.SurveyResponses.Where(s => s.SurveyId == surveyId).ToList();
listSurveyResponse = surveyResponseDbContext.SurveyResponses.Where(s => s.SurveyId == surveyId);
}
else
{
listSurveyResponse = surveyResponseDbContext.SurveyResponses.Where(s => s.SurveyId == surveyId && s.EmployeeId == employeeid).ToList();
listSurveyResponse = surveyResponseDbContext.SurveyResponses.Where(s => s.SurveyId == surveyId && s.EmployeeId == employeeid);
}
listSurveyResponse = listSurveyResponse
.OrderByDescending(obj => obj.Id)
.GroupBy(obj => new { obj.SurveyId, obj.LocationId })//obj.EmployeeId,
.Select(group => group.FirstOrDefault()) // or .FirstOrDefault() if you want to handle empty groups
.ToList();
if (listSurveyResponse.Any())
{
var answers = await getAnswersByRegionAndSurveyIdAsync(listSurveyResponse);
@ -139,7 +120,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, token);
var surveys = await surveyServiceProvider.getSurveysAsync(language);
surveys = surveys.Where(s => s.IsEnabled == true && s.Status == SurveyStatus.ACTIVE.ToString()).ToList();
if (employeeid == null || employeeid == 0)
return (true, surveys, null);
@ -160,7 +141,7 @@ namespace DamageAssesment.Api.Responses.Providers
{
logger?.LogInformation("Querying to get SurveyResponse object from DB");
var surveys = await surveyServiceProvider.getSurveysAsync(language, token);
var surveys = await surveyServiceProvider.getSurveysAsync(language);
// returning only historic data: end date is less than current date.
surveys = surveys.Where(s => s.Status == SurveyStatus.INACTIVE.ToString()).ToList();
if (employeeid == null || employeeid == 0)
@ -185,7 +166,7 @@ namespace DamageAssesment.Api.Responses.Providers
try
{
logger?.LogInformation("Querying to get Survey object from microservice");
var survey = await surveyServiceProvider.getSurveyAsync(surveyId, token);
var survey = await surveyServiceProvider.getSurveyAsync(surveyId);
if (survey != null)
{
@ -216,7 +197,7 @@ namespace DamageAssesment.Api.Responses.Providers
try
{
logger?.LogInformation("Querying to get Survey object from microservice");
var survey = await surveyServiceProvider.getSurveyAsync(surveyId, token);
var survey = await surveyServiceProvider.getSurveyAsync(surveyId);
if (survey != null)
{
@ -247,7 +228,7 @@ namespace DamageAssesment.Api.Responses.Providers
try
{
logger?.LogInformation("Querying to get Survey object from microservice");
var survey = await surveyServiceProvider.getSurveyAsync(surveyId, token);
var survey = await surveyServiceProvider.getSurveyAsync(surveyId);
if (survey != null)
{
@ -278,8 +259,8 @@ namespace DamageAssesment.Api.Responses.Providers
try
{
logger?.LogInformation("Querying to get Survey object from microservice");
var survey = await surveyServiceProvider.getSurveyAsync(surveyId, token);
var question = await questionServiceProvider.getQuestionsAsync(questionId, token);
var survey = await surveyServiceProvider.getSurveyAsync(surveyId);
var question = await questionServiceProvider.getQuestionsAsync(questionId);
bool IsCorrectAnswer = answer.ToLower().Equals("yes") || answer.ToLower().Equals("no") ? true : false;
@ -436,13 +417,14 @@ namespace DamageAssesment.Api.Responses.Providers
}
//Method to get Answers by region with surveyId as input parameter
private async Task<dynamic> getAnswersByRegionAndSurveyIdAsync(List<Db.SurveyResponse> surveyResponses)
private async Task<dynamic> getAnswersByRegionAndSurveyIdAsync(IQueryable<Db.SurveyResponse> surveyResponses)
{
try
{
var answersList = await answerServiceProvider.getAnswersAsync(token);
var answersList = await answerServiceProvider.getAnswersAsync();
if (answersList == null || !answersList.Any())
return null;
//get all the answers for the particular survey
var surveyAnswers = answersList.Join(
surveyResponses,
@ -462,8 +444,8 @@ namespace DamageAssesment.Api.Responses.Providers
if (surveyAnswers == null || !surveyAnswers.Any())
return null;
var regions = await regionServiceProvider.getRegionsAsync(token);
var locations = await locationServiceProvider.getLocationsAsync(token);
var regions = await regionServiceProvider.getRegionsAsync();
var locations = await locationServiceProvider.getLocationsAsync();
if (regions == null || !regions.Any() || locations == null || !locations.Any())
return null;
@ -525,27 +507,29 @@ namespace DamageAssesment.Api.Responses.Providers
{
try
{
var employee = await employeeServiceProvider.getEmployeeAsync(surveyResponse.EmployeeId, token);
var answers = await answerServiceProvider.GetAnswersByResponseIdAsync(surveyResponse.Id, token);
var allQuestions = await questionServiceProvider.getQuestionsAsync(null, token);
var employee = await employeeServiceProvider.getEmployeeAsync(surveyResponse.EmployeeId);
var answers = await answerServiceProvider.GetAnswersByResponseIdAsync(surveyResponse.Id);
var allQuestions = await questionServiceProvider.getQuestionsAsync(null);
var questions = allQuestions.Where(s => s.SurveyId == surveyResponse.SurveyId);
var attachments = await attachmentServiceProvider.getAttachmentsAsync(token);
var result = new
{
var attachments = await attachmentServiceProvider.getAttachmentsAsync();
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,
surveyResponse.KeyAnswerResult,
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
{
// ans.QuestionId,
ans.QuestionId,
ans.Id,
ans.AnswerText,
ans.Comment,
@ -574,52 +558,92 @@ namespace DamageAssesment.Api.Responses.Providers
if (employeeid == 0)
{
surveyResonses = await surveyResponseDbContext.SurveyResponses.Where(x => x.SurveyId == surveyId).ToListAsync();
employees = await employeeServiceProvider.getEmployeesAsync(token);
employees = await employeeServiceProvider.getEmployeesAsync();
}
else
{
surveyResonses = await surveyResponseDbContext.SurveyResponses.Where(x => x.SurveyId == surveyId && x.EmployeeId == employeeid).ToListAsync();
employee = await employeeServiceProvider.getEmployeeAsync(employeeid, token);
employee = await employeeServiceProvider.getEmployeeAsync(employeeid);
}
surveyResonses = surveyResonses
.OrderByDescending(obj => obj.Id)
.GroupBy(obj => new { obj.SurveyId, obj.LocationId })//obj.EmployeeId,
.Select(group => group.FirstOrDefault()) // or .FirstOrDefault() if you want to handle empty groups
.ToList();
var answers = await answerServiceProvider.getAnswersAsync(token);
var questions = await questionServiceProvider.getQuestionsAsync(null, token);
var answers = await answerServiceProvider.getAnswersAsync();
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);
var attachments = await attachmentServiceProvider.getAttachmentsAsync(token);
var result = from r in surveyResonses
select new
{
r.Id,
r.SurveyId,
r.LocationId,
r.EmployeeId,
r.ClientDevice,
// r.KeyAnswerResult,
r.Longitute,
r.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
select new
{
ans.Id,
// ans.QuestionId,
ans.AnswerText,
ans.Comment,
Questions = (from q in surveyQuestions where q.Id == ans.QuestionId select new { q.Id, q.QuestionNumber, q.CategoryId, q.Text }).SingleOrDefault(),
Attachments = from att in attachments where att.AnswerId == ans.Id select new { att.Id, att.URI }
var attachments = await attachmentServiceProvider.getAttachmentsAsync();
}
};
return result;
if (employeeid == 0)
{
var result = from r in surveyResonses
join loc in Locations on r.LocationId equals loc.Id
select new
{
r.Id,
r.SurveyId,
r.LocationId,
r.EmployeeId,
r.ClientDevice,
r.KeyAnswerResult,
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
select new
{
ans.Id,
ans.QuestionId,
ans.AnswerText,
ans.Comment,
Questions = (from q in surveyQuestions where q.Id == ans.QuestionId select new { q.Id, q.QuestionNumber, q.CategoryId, q.Text }).SingleOrDefault(),
Attachments = from att in attachments where att.AnswerId == ans.Id select new { att.Id, att.URI }
}
};
return result;
}
else
{
object _employee = new { };
if (employee != null)
{
_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,
r.SurveyId,
r.LocationId,
r.EmployeeId,
r.ClientDevice,
r.KeyAnswerResult,
loc.DataValue,
loc.Enrollment,
loc.Longitute,
loc.Latitude,
Employee = _employee,
answers = from ans in answers
where ans.SurveyResponseId == r.Id
select new
{
ans.Id,
ans.QuestionId,
ans.AnswerText,
ans.Comment,
Questions = (from q in questions where q.Id == ans.QuestionId select new { q.Id, q.QuestionNumber, q.CategoryId, q.Text }).SingleOrDefault(),
Attachments = from att in attachments where att.AnswerId == ans.Id select new { att.Id, att.URI }
}
};
return result;
}
}
catch (Exception ex)
{
@ -641,12 +665,12 @@ namespace DamageAssesment.Api.Responses.Providers
if (employeeid == 0)
{
surveyResonses = await surveyResponseDbContext.SurveyResponses.ToListAsync();
employees = await employeeServiceProvider.getEmployeesAsync(token);
employees = await employeeServiceProvider.getEmployeesAsync();
}
else
{
surveyResonses = await surveyResponseDbContext.SurveyResponses.Where(x => x.EmployeeId == employeeid).ToListAsync();
employee = await employeeServiceProvider.getEmployeeAsync(employeeid, token);
employee = await employeeServiceProvider.getEmployeeAsync(employeeid);
if (employee != null)
{
@ -654,16 +678,14 @@ namespace DamageAssesment.Api.Responses.Providers
}
}
surveyResonses = surveyResonses
.OrderByDescending(obj => obj.Id)
.GroupBy(obj => new { obj.SurveyId, obj.EmployeeId, obj.LocationId })
.Select(group => group.FirstOrDefault()) // or .FirstOrDefault() if you want to handle empty groups
.ToList();
var answers = await answerServiceProvider.getAnswersAsync(token);
var questions = await questionServiceProvider.getQuestionsAsync(null, token);
var attachments = await attachmentServiceProvider.getAttachmentsAsync(token);
var answers = await answerServiceProvider.getAnswersAsync();
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,
@ -671,16 +693,18 @@ namespace DamageAssesment.Api.Responses.Providers
r.LocationId,
r.EmployeeId,
r.ClientDevice,
// r.KeyAnswerResult,
r.Longitute,
r.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(),
r.KeyAnswerResult,
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
select new
{
ans.Id,
// ans.QuestionId,
ans.QuestionId,
ans.AnswerText,
ans.Comment,
Questions = (from q in questions where q.Id == ans.QuestionId select new { q.Id, q.QuestionNumber, q.CategoryId, q.Text }).SingleOrDefault(),
@ -688,6 +712,8 @@ namespace DamageAssesment.Api.Responses.Providers
}
};
return result;
}
catch (Exception ex)
{
@ -703,12 +729,12 @@ namespace DamageAssesment.Api.Responses.Providers
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(token);
var Locations = await locationServiceProvider.getLocationsAsync(token);
var regions = await regionServiceProvider.getRegionsAsync(token);
var questions = await questionServiceProvider.getQuestionsAsync(language, token);
var categories = await questionServiceProvider.GetQuestionCategoriesAsync(language, token);
var attachments = await attachmentServiceProvider.getAttachmentsAsync(token);
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
@ -840,8 +866,8 @@ namespace DamageAssesment.Api.Responses.Providers
{
surveyResponses = await surveyResponseDbContext.SurveyResponses.Where(x => x.SurveyId == surveyId && x.EmployeeId == employeeid).ToListAsync();
}
var answers = await answerServiceProvider.getAnswersAsync(token);
var locations = await locationServiceProvider.getLocationsAsync(token);
var answers = await answerServiceProvider.getAnswersAsync();
var locations = await locationServiceProvider.getLocationsAsync();
var maintenanceCenters = locations.DistinctBy(m => m.MaintenanceCenter);
//get all the answers for the particular survey
@ -907,29 +933,27 @@ namespace DamageAssesment.Api.Responses.Providers
if (employeeid == 0)
{
surveyResonses = await surveyResponseDbContext.SurveyResponses.Where(x => x.SurveyId == surveyId && x.LocationId == locationId).ToListAsync();
employees = await employeeServiceProvider.getEmployeesAsync(token);
employees = await employeeServiceProvider.getEmployeesAsync();
}
else
{
surveyResonses = await surveyResponseDbContext.SurveyResponses.Where(x => x.SurveyId == surveyId && x.EmployeeId == employeeid && x.LocationId == locationId).ToListAsync();
employee = await employeeServiceProvider.getEmployeeAsync(employeeid, token);
employee = await employeeServiceProvider.getEmployeeAsync(employeeid);
if (employee != null)
{
_employee = new { employee.Id, employee.Name, employee.BirthDate, employee.Email, employee.OfficePhoneNumber };
}
}
surveyResonses = surveyResonses
.OrderByDescending(obj => obj.Id)
.GroupBy(obj => new { obj.SurveyId, obj.LocationId }) //obj.EmployeeId,
.Select(group => group.FirstOrDefault()) // or .FirstOrDefault() if you want to handle empty groups
.ToList();
var answers = await answerServiceProvider.getAnswersAsync(token);
var questions = await questionServiceProvider.getQuestionsAsync(null, token);
var surveyQuestions = from q in questions where q.SurveyId == surveyId select q;
var attachments = await attachmentServiceProvider.getAttachmentsAsync(token);
var answers = await answerServiceProvider.getAnswersAsync();
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,
@ -937,16 +961,18 @@ namespace DamageAssesment.Api.Responses.Providers
r.LocationId,
r.EmployeeId,
r.ClientDevice,
// r.KeyAnswerResult,
r.Longitute,
r.Latitude,
// Employee = (from e in employees where r.EmployeeId == e.Id select new { e.Id, e.Name, e.BirthDate, e.Email, e.OfficePhoneNumber }).SingleOrDefault(),
r.KeyAnswerResult,
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
select new
{
// ans.QuestionId,
ans.QuestionId,
ans.Id,
ans.AnswerText,
ans.Comment,
@ -955,6 +981,7 @@ namespace DamageAssesment.Api.Responses.Providers
}
};
return result;
}
catch (Exception ex)
{
@ -977,29 +1004,26 @@ namespace DamageAssesment.Api.Responses.Providers
if (employeeid == 0)
{
surveyResponses = await surveyResponseDbContext.SurveyResponses.Where(x => x.SurveyId == survey.Id).ToListAsync();
employees = await employeeServiceProvider.getEmployeesAsync(token);
employees = await employeeServiceProvider.getEmployeesAsync();
}
else
{
surveyResponses = await surveyResponseDbContext.SurveyResponses.Where(x => x.SurveyId == survey.Id && x.EmployeeId == employeeid).ToListAsync();
employee = await employeeServiceProvider.getEmployeeAsync(employeeid, token);
employee = await employeeServiceProvider.getEmployeeAsync(employeeid);
if (employee != null)
{
_employee = new { employee.Id, employee.Name, employee.BirthDate, employee.Email, employee.OfficePhoneNumber };
}
}
surveyResponses = surveyResponses
.OrderByDescending(obj => obj.Id)
.GroupBy(obj => new { obj.SurveyId, obj.LocationId })//, obj.EmployeeId
.Select(group => group.FirstOrDefault()) // or .FirstOrDefault() if you want to handle empty groups
.ToList();
//var surveyResponses = await surveyResponseDbContext.Responses.Where(x => x.SurveyId == survey.Id).ToListAsync();
// var employees = await employeeServiceProvider.getEmployeesAsync();
var answers = await answerServiceProvider.getAnswersAsync(token);
var attachments = await attachmentServiceProvider.getAttachmentsAsync(token);
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,
@ -1007,10 +1031,12 @@ namespace DamageAssesment.Api.Responses.Providers
r.LocationId,
r.EmployeeId,
r.ClientDevice,
// r.KeyAnswerResult,
r.Longitute,
r.Latitude,
// Employee = (from e in employees where r.EmployeeId == e.Id select new { e.Id, e.Name, e.BirthDate, e.Email, e.OfficePhoneNumber }).SingleOrDefault(),
r.KeyAnswerResult,
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
&& ans.QuestionId == question.Id
@ -1018,7 +1044,7 @@ namespace DamageAssesment.Api.Responses.Providers
select new
{
// ans.QuestionId,
ans.QuestionId,
AnswerId = ans.Id,
ans.AnswerText,
ans.Comment,
@ -1040,12 +1066,12 @@ namespace DamageAssesment.Api.Responses.Providers
{
if (answerRequest != null)
{
var answer = await answerServiceProvider.PostAnswersAsync(new Models.Answer { QuestionId = answerRequest.QuestionId, AnswerText = answerRequest.AnswerText, Comment = answerRequest.Comment, SurveyResponseId = surveyResponseId }, token);
var answer = await answerServiceProvider.PostAnswersAsync(new Models.Answer { QuestionId = answerRequest.QuestionId, AnswerText = answerRequest.AnswerText, Comment = answerRequest.Comment, SurveyResponseId = surveyResponseId });
if (answer != null)
{
List<AnswerInfo> listAnswerInfo = new List<AnswerInfo>();
listAnswerInfo.Add(new AnswerInfo { AnswerId = answer.Id, postedFiles = answerRequest.PostedFiles });
var attachments = attachmentServiceProvider.PostAttachmentsAsync(new AttachmentInfo { ResponseId = surveyResponseId, Answers = listAnswerInfo }, token);
var attachments = attachmentServiceProvider.PostAttachmentsAsync(new AttachmentInfo { ResponseId = surveyResponseId, Answers = listAnswerInfo });
string message = $"Answer for question {answerRequest.QuestionId} saved to the database";
logger?.LogInformation(message);
@ -1066,6 +1092,7 @@ namespace DamageAssesment.Api.Responses.Providers
}
}
public async Task<(bool IsSuccess, Models.SurveyResponse SurveyResponse, string ErrorMessage)> PostSurveyAnswersAsync(Models.Request request)
{
try

View File

@ -1,6 +1,5 @@
using DamageAssesment.Api.Responses.Interfaces;
using DamageAssesment.Api.Responses.Models;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;
@ -11,11 +10,11 @@ namespace DamageAssesment.Api.Responses.Services
public AnswerServiceProvider(IConfiguration configuration, IHttpUtil httpUtil, ILogger<AnswerServiceProvider> logger) : base(configuration, httpUtil, logger, configuration.GetValue<string>("RessourceSettings:Answer"), configuration.GetValue<string>("EndPointSettings:AnswerUrlBase"))
{
}
public async Task<List<Answer>> getAnswersAsync(string token)
public async Task<List<Answer>> getAnswersAsync()
{
try
{
var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null, token);
var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null);
var answers = JsonConvert.DeserializeObject<List<Answer>>(responseJsonString);
if (answers == null || !answers.Any())
@ -29,12 +28,12 @@ namespace DamageAssesment.Api.Responses.Services
}
}
public async Task<List<Answer>> GetAnswersByResponseIdAsync(int responseId, string token)
public async Task<List<Answer>> GetAnswersByResponseIdAsync(int responseId)
{
try
{
url = urlBase + string.Format(configuration.GetValue<string>("RessourceSettings:AnswerByResponse"), responseId);
var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null,token);
var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null);
var answers = JsonConvert.DeserializeObject<List<Answer>>(responseJsonString);
if (answers == null || !answers.Any())
@ -48,12 +47,12 @@ namespace DamageAssesment.Api.Responses.Services
}
}
public async Task<Answer> PostAnswersAsync(Answer answer, string token )
public async Task<Answer> PostAnswersAsync(Answer answer)
{
try
{
var requestJsonString = JsonConvert.SerializeObject(answer);
var responseJsonString = await httpUtil.SendAsync(HttpMethod.Post, url, requestJsonString, token);
var responseJsonString = await httpUtil.SendAsync(HttpMethod.Post, url, requestJsonString);
var answers = JsonConvert.DeserializeObject<Answer>(responseJsonString);
if (answers == null)

View File

@ -10,11 +10,11 @@ namespace DamageAssesment.Api.Responses.Services
{
}
public async Task<List<Attachment>> getAttachmentsAsync(string token)
public async Task<List<Attachment>> getAttachmentsAsync()
{
try
{
var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null,token);
var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null);
var attachments = JsonConvert.DeserializeObject<List<Attachment>>(responseJsonString);
if (attachments == null || !attachments.Any())
@ -28,12 +28,12 @@ namespace DamageAssesment.Api.Responses.Services
}
}
public async Task<IEnumerable<Attachment>> PostAttachmentsAsync(AttachmentInfo attachmentInfo, string token)
public async Task<IEnumerable<Attachment>> PostAttachmentsAsync(AttachmentInfo attachmentInfo)
{
try
{
var requestJsonString = JsonConvert.SerializeObject(attachmentInfo);
var responseJsonString = await httpUtil.SendAsync(HttpMethod.Post, url, requestJsonString, token);
var responseJsonString = await httpUtil.SendAsync(HttpMethod.Post, url, requestJsonString);
var attachments = JsonConvert.DeserializeObject<IEnumerable<Attachment>>(responseJsonString);
if (attachments == null)

View File

@ -1,4 +1,4 @@
using DamageAssesment.Api.Responses.Interfaces;
using DamageAssesment.Api.Responses.Interfaces;
using DamageAssesment.Api.Responses.Models;
using Microsoft.AspNetCore.Mvc.Routing;
using Newtonsoft.Json;
@ -11,11 +11,11 @@ namespace DamageAssesment.Api.Responses.Services
{
}
public async Task<List<Employee>> getEmployeesAsync(string token)
public async Task<List<Employee>> getEmployeesAsync()
{
try
{
var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null,token);
var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null);
var employees = JsonConvert.DeserializeObject<List<Employee>>(responseJsonString);
if (employees == null || !employees.Any())
@ -29,12 +29,12 @@ namespace DamageAssesment.Api.Responses.Services
}
}
public async Task<Employee> getEmployeeAsync(int employeeId, string token)
public async Task<Employee> getEmployeeAsync(int employeeId)
{
try
{
url = urlBase + string.Format(configuration.GetValue<string>("RessourceSettings:EmployeeById"), employeeId);
var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null, token);
var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null);
var employee = JsonConvert.DeserializeObject<Employee>(responseJsonString);
if (employee == null)

View File

@ -1,5 +1,4 @@
using DamageAssesment.Api.Responses.Interfaces;
using DamageAssesment.Api.Responses.Models;
using DamageAssesment.Api.Responses.Interfaces;
using System.Net.Http.Headers;
using System.Text;
@ -15,18 +14,20 @@ namespace DamageAssesment.Api.Responses.Services
this.httpClient = httpClient;
this.logger = logger;
}
public async Task<string> SendAsync(HttpMethod method, string url, string JsonInput, string token)
public async Task<string> SendAsync(HttpMethod method, string url, string JsonInput)
{
try
{
var request = new HttpRequestMessage(method, url);
request.Headers.Accept.Clear();
request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
//request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
if (method == HttpMethod.Post)
{
request.Content = new StringContent(JsonInput, Encoding.UTF8, "application/json");
}
var response = await httpClient.SendAsync(request, CancellationToken.None);
response.EnsureSuccessStatusCode();
var responseString = await response.Content.ReadAsStringAsync();

View File

@ -10,11 +10,11 @@ namespace DamageAssesment.Api.Responses.Services
{
}
public async Task<List<Location>> getLocationsAsync(string token)
public async Task<List<Location>> getLocationsAsync()
{
try
{
var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null, token);
var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null);
var locations = JsonConvert.DeserializeObject<List<Location>>(responseJsonString);
if (locations == null || !locations.Any())

View File

@ -10,13 +10,13 @@ namespace DamageAssesment.Api.Responses.Services
{
}
public async Task<List<Question>> getQuestionsAsync(string language, string token)
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, token);
var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null);
var questions = JsonConvert.DeserializeObject<List<Question>>(responseJsonString);
if (questions == null || !questions.Any())
@ -29,7 +29,7 @@ namespace DamageAssesment.Api.Responses.Services
return new List<Question>();
}
}
public async Task<List<QuestionCategory>> GetQuestionCategoriesAsync(string? language, string token)
public async Task<List<QuestionCategory>> GetQuestionCategoriesAsync(string? language)
{
try
{
@ -37,7 +37,7 @@ namespace DamageAssesment.Api.Responses.Services
if (!string.IsNullOrEmpty(language))
url = url + "/" + language;
var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null, token);
var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null);
var questions = JsonConvert.DeserializeObject<List<QuestionCategory>>(responseJsonString);
if (questions == null || !questions.Any())
@ -50,12 +50,13 @@ namespace DamageAssesment.Api.Responses.Services
return new List<QuestionCategory>();
}
}
public async Task<List<SurveyQuestions>> getSurveyQuestionsAsync(int surveyId, string token)
public async Task<List<SurveyQuestions>> getSurveyQuestionsAsync(int surveyId)
{
try
{
url = urlBase + string.Format(configuration.GetValue<string>("RessourceSettings:SurveyQuestion"), surveyId);
var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null, token);
var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null);
var questions = JsonConvert.DeserializeObject<List<SurveyQuestions>>(responseJsonString);
if (questions == null || !questions.Any())
@ -70,12 +71,12 @@ namespace DamageAssesment.Api.Responses.Services
}
public async Task<Question> getQuestionsAsync(int questionId, string token)
public async Task<Question> getQuestionsAsync(int questionId)
{
try
{
url = urlBase + string.Format(configuration.GetValue<string>("RessourceSettings:QuestionById"), questionId);
var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null, token);
var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null);
var question = JsonConvert.DeserializeObject<Question>(responseJsonString);
if (question == null)

View File

@ -9,11 +9,11 @@ namespace DamageAssesment.Api.Responses.Services
public RegionServiceProvider(IConfiguration configuration, IHttpUtil httpUtil, ILogger<RegionServiceProvider> logger) : base(configuration, httpUtil, logger, configuration.GetValue<string>("RessourceSettings:Region"), configuration.GetValue<string>("EndPointSettings:LocationUrlBase"))
{
}
public async Task<List<Region>> getRegionsAsync(string token)
public async Task<List<Region>> getRegionsAsync()
{
try
{
var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null, token);
var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null);
var regions = JsonConvert.DeserializeObject<List<Region>>(responseJsonString);
if (regions == null || !regions.Any())

View File

@ -4,19 +4,19 @@ using Newtonsoft.Json;
namespace DamageAssesment.Api.Responses.Services
{
public class SurveyServiceProvider :ServiceProviderBase, ISurveyServiceProvider
public class SurveyServiceProvider : ServiceProviderBase, ISurveyServiceProvider
{
public SurveyServiceProvider(IConfiguration configuration, IHttpUtil httpUtil, ILogger<EmployeeServiceProvider> logger) : base(configuration, httpUtil, logger, configuration.GetValue<string>("RessourceSettings:Survey"), configuration.GetValue<string>("EndPointSettings:SurveyUrlBase"))
{
}
public async Task<List<Survey>> getSurveysAsync(string language, string token)
public async Task<List<Survey>> getSurveysAsync(string language)
{
try
{
if (!string.IsNullOrEmpty(language))
url = url + "/" + language;
var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null, token);
var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null);
var surveys = JsonConvert.DeserializeObject<List<Survey>>(responseJsonString);
if (surveys == null || !surveys.Any())
@ -30,15 +30,15 @@ namespace DamageAssesment.Api.Responses.Services
}
}
public async Task<Survey> getSurveyAsync(int surveyId, string token)
public async Task<Survey> getSurveyAsync(int surveyId)
{
try
{
url = urlBase + string.Format(configuration.GetValue<string>("RessourceSettings:SurveyById"), surveyId);
var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null, token);
var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null);
var survey = JsonConvert.DeserializeObject<Survey>(responseJsonString);
if (survey == null )
if (survey == null)
return null;
else return survey;
}

View File

@ -6,13 +6,7 @@
}
},
"AllowedHosts": "*",
"JwtSettings": {
"securitykey": "bWlhbWkgZGFkZSBzY2hvb2xzIHNlY3JldCBrZXk="
},
"ConnectionStrings": {
//"ResponsesConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;"
"ResponsesConnection": "Server=207.180.248.35;Database=da_survey_dev;User Id=sa;Password=YourStrongPassw0rd;TrustServerCertificate=True;"
},
//"EndPointSettings": {
// "AnswerUrlBase": "http://localhost:5200",
// "LocationUrlBase": "http://localhost:5213",
@ -22,6 +16,7 @@
// "AttachmentUrlBase": "http://localhost:5243",
// "SurveyUrlBase": "http://localhost:5009"
//},
//Endpoints for docker-container
"EndPointSettings": {
"AnswerUrlBase": "http://damageassesment.api.answers:80",
"LocationUrlBase": "http://damageassesment.api.locations:80",
@ -45,5 +40,10 @@
"AnswerByResponse": "/answers/byresponse/{0}",
"Location": "/locations",
"Region": "/regions"
},
"ConnectionStrings": {
//"SurveyResponseConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;"
//"ResponsesConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;"
"ResponsesConnection": "Server=207.180.248.35;Database=da_survey_dev;User Id=sa;Password=YourStrongPassw0rd;TrustServerCertificate=True;"
}
}

View File

@ -0,0 +1,55 @@
// <auto-generated />
using DamageAssesment.Api.SurveyResponses.Db;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
#nullable disable
namespace DamageAssesment.Api.SurveyResponses.Migrations
{
[DbContext(typeof(SurveyResponseDbContext))]
[Migration("20230817221348_InitialSurveyResponse")]
partial class InitialSurveyResponse
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "7.0.9")
.HasAnnotation("Relational:MaxIdentifierLength", 128);
SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
modelBuilder.Entity("DamageAssesment.Api.SurveyResponses.Db.SurveyResponse", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<string>("EmployeeId")
.IsRequired()
.HasMaxLength(6)
.HasColumnType("nvarchar(6)");
b.Property<string>("LocationId")
.IsRequired()
.HasMaxLength(4)
.HasColumnType("nvarchar(4)");
b.Property<int>("SurveyId")
.HasColumnType("int");
b.HasKey("Id");
b.ToTable("SurveyResponses");
});
#pragma warning restore 612, 618
}
}
}

View File

@ -0,0 +1,36 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace DamageAssesment.Api.SurveyResponses.Migrations
{
/// <inheritdoc />
public partial class InitialSurveyResponse : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "SurveyResponses",
columns: table => new
{
Id = table.Column<int>(type: "int", nullable: false)
.Annotation("SqlServer:Identity", "1, 1"),
SurveyId = table.Column<int>(type: "int", nullable: false),
LocationId = table.Column<string>(type: "nvarchar(4)", maxLength: 4, nullable: false),
EmployeeId = table.Column<string>(type: "nvarchar(6)", maxLength: 6, nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_SurveyResponses", x => x.Id);
});
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "SurveyResponses");
}
}
}

View File

@ -0,0 +1,52 @@
// <auto-generated />
using DamageAssesment.Api.SurveyResponses.Db;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
#nullable disable
namespace DamageAssesment.Api.SurveyResponses.Migrations
{
[DbContext(typeof(SurveyResponseDbContext))]
partial class SurveyResponseDbContextModelSnapshot : ModelSnapshot
{
protected override void BuildModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "7.0.9")
.HasAnnotation("Relational:MaxIdentifierLength", 128);
SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
modelBuilder.Entity("DamageAssesment.Api.SurveyResponses.Db.SurveyResponse", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<string>("EmployeeId")
.IsRequired()
.HasMaxLength(6)
.HasColumnType("nvarchar(6)");
b.Property<string>("LocationId")
.IsRequired()
.HasMaxLength(4)
.HasColumnType("nvarchar(4)");
b.Property<int>("SurveyId")
.HasColumnType("int");
b.HasKey("Id");
b.ToTable("SurveyResponses");
});
#pragma warning restore 612, 618
}
}
}

View File

@ -34,55 +34,7 @@ namespace DamageAssesment.Api.Surveys.Test
Assert.Equal(204, result.StatusCode);
}
[Fact(DisplayName = "Get active Surveys - Ok case")]
public async Task GetActiveSurveysAsync_ShouldReturnStatusCode200()
{
var mockSurveyService = new Mock<ISurveyProvider>();
var mockResponse = await MockData.getOkResponse();
mockSurveyService.Setup(service => service.GetActiveSurveysAsync(true,null)).ReturnsAsync(mockResponse);
var surveyProvider = new SurveysController(mockSurveyService.Object);
var result = (OkObjectResult)await surveyProvider.GetActiveSurveysAsync(null);
Assert.Equal(200, result.StatusCode);
}
[Fact(DisplayName = "Get active Surveys - NoContent Case")]
public async Task GetActiveSurveysAsync_ShouldReturnStatusCode204()
{
var mockSurveyService = new Mock<ISurveyProvider>();
var mockResponse = await MockData.getNoContentResponse();
mockSurveyService.Setup(service => service.GetActiveSurveysAsync(true,null)).ReturnsAsync(mockResponse);
var surveyProvider = new SurveysController(mockSurveyService.Object);
var result = (NoContentResult)await surveyProvider.GetActiveSurveysAsync(null);
Assert.Equal(204, result.StatusCode);
}
[Fact(DisplayName = "Get inactive Surveys - Ok case")]
public async Task GetInActiveSurveysAsync_ShouldReturnStatusCode200()
{
var mockSurveyService = new Mock<ISurveyProvider>();
var mockResponse = await MockData.getOkResponse();
mockSurveyService.Setup(service => service.GetActiveSurveysAsync(false, null)).ReturnsAsync(mockResponse);
var surveyProvider = new SurveysController(mockSurveyService.Object);
var result = (OkObjectResult)await surveyProvider.GetInActiveSurveysAsync(null);
Assert.Equal(200, result.StatusCode);
}
[Fact(DisplayName = "Get in active Surveys - NoContent Case")]
public async Task GetInActiveSurveysAsync_ShouldReturnStatusCode204()
{
var mockSurveyService = new Mock<ISurveyProvider>();
var mockResponse = await MockData.getNoContentResponse();
mockSurveyService.Setup(service => service.GetActiveSurveysAsync(false, null)).ReturnsAsync(mockResponse);
var surveyProvider = new SurveysController(mockSurveyService.Object);
var result = (NoContentResult)await surveyProvider.GetInActiveSurveysAsync(null);
Assert.Equal(204, result.StatusCode);
}
[Fact(DisplayName = "Get Survey by Id - Ok case")]
public async Task GetSurveyAsync_ShouldReturnStatusCode200()
{

View File

@ -1,5 +1,4 @@
using DamageAssesment.Api.Surveys.Interfaces;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace DamageAssesment.Api.Surveys.Controllers
@ -16,7 +15,6 @@ namespace DamageAssesment.Api.Surveys.Controllers
/// <summary>
/// GET request for retrieving surveys.
/// </summary>
[Authorize(Roles ="admin,survey,user,report")]
[Route("surveys")]
[Route("surveys/{language:alpha}")]
[HttpGet]
@ -29,42 +27,10 @@ namespace DamageAssesment.Api.Surveys.Controllers
}
return NoContent();
}
/// <summary>
/// GET request for retrieving all active surveys.
/// </summary>
[Authorize(Roles = "admin,survey,user,report")]
[Route("surveys/active")]
[Route("surveys/active/{language:alpha}")]
[HttpGet]
public async Task<ActionResult> GetActiveSurveysAsync(string? language)
{
var result = await this.surveyProvider.GetActiveSurveysAsync(true,language);
if (result.IsSuccess)
{
return Ok(result.Surveys);
}
return NoContent();
}
/// <summary>
/// GET request for retrieving all inactive surveys.
/// </summary>
[Authorize(Roles = "admin,survey,user,report")]
[Route("surveys/inactive")]
[Route("surveys/inactive/{language:alpha}")]
[HttpGet]
public async Task<ActionResult> GetInActiveSurveysAsync(string? language)
{
var result = await this.surveyProvider.GetActiveSurveysAsync(false, language);
if (result.IsSuccess)
{
return Ok(result.Surveys);
}
return NoContent();
}
/// <summary>
/// GET request for retrieving surveys by ID.
/// </summary>
[Authorize(Roles = "admin,survey,user,report")]
[Route("surveys/{id:int}")]
[Route("surveys/{id:int}/{language:alpha}")]
[HttpGet]
@ -80,7 +46,6 @@ namespace DamageAssesment.Api.Surveys.Controllers
/// <summary>
/// POST request for creating a new survey.
/// </summary>
[Authorize(Roles = "admin,survey,user,report")]
[HttpPost("surveys")]
public async Task<ActionResult> PostSurveysAsync(Models.Survey survey)
{
@ -94,8 +59,6 @@ namespace DamageAssesment.Api.Surveys.Controllers
/// <summary>
/// PUT request for updating an existing survey (surveyId,Updated Survey data).
/// </summary>
[Authorize(Roles = "admin,survey")]
[HttpPut("surveys/{id}")]
public async Task<ActionResult> PutSurveysAsync(int id, Models.Survey survey)
{
@ -113,7 +76,6 @@ namespace DamageAssesment.Api.Surveys.Controllers
/// <summary>
/// DELETE request for deleting a survey by ID.
/// </summary>
[Authorize(Roles = "admin,survey")]
[HttpDelete("surveys/{id}")]
public async Task<ActionResult> DeleteSurveysAsync(int id)
{

View File

@ -3,7 +3,6 @@
public interface ISurveyProvider
{
Task<(bool IsSuccess, IEnumerable< Models.MultiLanSurvey> Surveys, string ErrorMessage)> GetSurveysAsync(string language);
Task<(bool IsSuccess, IEnumerable<Models.MultiLanSurvey> Surveys, string ErrorMessage)> GetActiveSurveysAsync(bool IsActive,string language);
Task<(bool IsSuccess, Models.MultiLanSurvey Surveys, string ErrorMessage)> GetSurveysAsync(int id, string language);
Task<(bool IsSuccess, Models.MultiLanSurvey Survey, string ErrorMessage)> PostSurveyAsync(Models.Survey Survey);
Task<(bool IsSuccess, Models.MultiLanSurvey Survey, string ErrorMessage)> PutSurveyAsync(int id, Models.Survey Survey);

View File

@ -6,12 +6,9 @@ using Microsoft.EntityFrameworkCore;
using Microsoft.IdentityModel.Tokens;
using System.Text;
using System.Reflection;
using Microsoft.OpenApi.Models;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddCors(p => p.AddPolicy("DamageAppCorsPolicy", build => {
build.WithOrigins("*").AllowAnyMethod().AllowAnyHeader().AllowAnyOrigin();
}));
// Add services to the container.
var authkey = builder.Configuration.GetValue<string>("JwtSettings:securitykey");
builder.Services.AddAuthentication(item =>
@ -37,44 +34,14 @@ builder.Services.AddControllers();
builder.Services.AddScoped<ISurveyProvider, SurveysProvider>();
builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen(options =>
//builder.Services.AddSwaggerGen();
builder.Services.AddSwaggerGen(c =>
{
// Include XML comments from your assembly
var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
options.IncludeXmlComments(xmlPath);
OpenApiSecurityScheme securityDefinition = new OpenApiSecurityScheme()
{
Name = "Bearer",
BearerFormat = "JWT",
Scheme = "bearer",
Description = "Specify the authorization token.",
In = ParameterLocation.Header,
Type = SecuritySchemeType.Http,
};
options.AddSecurityDefinition("jwt_auth", securityDefinition);
// Make sure swagger UI requires a Bearer token specified
OpenApiSecurityScheme securityScheme = new OpenApiSecurityScheme()
{
Reference = new OpenApiReference()
{
Id = "jwt_auth",
Type = ReferenceType.SecurityScheme
}
};
OpenApiSecurityRequirement securityRequirements = new OpenApiSecurityRequirement()
{
{securityScheme, new string[] { }},
};
options.AddSecurityRequirement(securityRequirements);
c.IncludeXmlComments(xmlPath);
});
builder.Services.AddDbContext<SurveysDbContext>(option =>
{
option.UseSqlServer("SurveyConnection");
@ -95,7 +62,6 @@ if (app.Environment.IsDevelopment())
}
}
app.UseCors("DamageAppCorsPolicy");
app.UseAuthentication();
app.UseAuthorization();

View File

@ -101,43 +101,6 @@ namespace DamageAssesment.Api.Surveys.Providers
return SurveyStatus.INACTIVE.ToString();
}
}
// Method to get surveys asynchronously with multi-language support
public async Task<(bool IsSuccess, IEnumerable<Models.MultiLanSurvey> Surveys, string ErrorMessage)> GetActiveSurveysAsync(bool IsActive,string language)
{
IEnumerable<Models.MultiLanSurvey> surveysList = null;
try
{
string status = SurveyStatus.ACTIVE.ToString();
if(!IsActive) status = SurveyStatus.INACTIVE.ToString();
logger?.LogInformation("Get all Surveys from DB");
//checking is enabled in survey response
var surveys = await surveyDbContext.Surveys.ToListAsync();//Where(s => s.IsEnabled == true)
if (surveys != null)
{
surveysList = from s in surveys
select new Models.MultiLanSurvey
{
Id = s.Id,
StartDate = s.StartDate,
EndDate = s.EndDate,
IsEnabled = s.IsEnabled,
CreatedDate = s.CreatedDate,
Status = GetStatus(s.StartDate, s.EndDate),
Titles = CreateMultiLanguageObject(GetSurveyTranslations(s.Id, null, language))
};
logger?.LogInformation($"{surveys.Count} Items(s) found");
return (true, surveysList.Where(a=>a.Status==status).OrderByDescending(a=>a.Id), null);
}
return (false, null, "Not found");
}
catch (Exception ex)
{
logger?.LogError(ex.ToString());
return (false, null, ex.Message);
}
}
// Method to get surveys asynchronously with multi-language support
public async Task<(bool IsSuccess, IEnumerable<Models.MultiLanSurvey> Surveys, string ErrorMessage)> GetSurveysAsync(string language)
{
@ -147,6 +110,7 @@ namespace DamageAssesment.Api.Surveys.Providers
logger?.LogInformation("Get all Surveys from DB");
//checking is enabled in survey response
var surveys = await surveyDbContext.Surveys.ToListAsync();//Where(s => s.IsEnabled == true)
if (surveys != null)
{
surveysList = from s in surveys
@ -215,11 +179,6 @@ namespace DamageAssesment.Api.Surveys.Providers
{
if (survey != null)
{
if (survey.StartDate != null && survey.EndDate != null)
{
if(survey.StartDate.Value>survey.EndDate.Value)
return (false, null, $"Survey start date should be less than enddate");
}
survey.CreatedDate = DateTime.Now;
Db.Survey _survey = mapper.Map<Models.Survey, Db.Survey>(survey);
@ -256,11 +215,6 @@ namespace DamageAssesment.Api.Surveys.Providers
{
if (survey != null)
{
if (survey.StartDate != null && survey.EndDate != null)
{
if (survey.StartDate.Value > survey.EndDate.Value)
return (false, null, $"Survey start date should be less than enddate");
}
var _survey = await surveyDbContext.Surveys.AsNoTracking().Where(s => s.Id == Id).SingleOrDefaultAsync();
if (_survey != null)

View File

@ -11,7 +11,7 @@
"AllowedHosts": "*",
"ConnectionStrings": {
//"SurveyConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;"
//"SurveyConnection": "Server=localhost,1433;Database=da_survey_dev;User Id=sa;Password=Password123;TrustServerCertificate=True;",
"SurveyConnection": "Server=207.180.248.35;Database=da_survey_dev;User Id=sa;Password=YourStrongPassw0rd;TrustServerCertificate=True;"
}
}

View File

@ -1,30 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<IsPackable>false</IsPackable>
<IsTestProject>true</IsTestProject>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.3.2" />
<PackageReference Include="Moq" Version="4.18.4" />
<PackageReference Include="xunit" Version="2.4.2" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.5">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="coverlet.collector" Version="3.1.2">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\DamageAssesment.Api.UsersAccess\DamageAssesment.Api.UsersAccess.csproj" />
</ItemGroup>
</Project>

View File

@ -1,44 +0,0 @@
using DamageAssesment.Api.UsersAccess.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xunit.Sdk;
namespace DamageAssesment.Api.UsersAccess.Test
{
public class MockData
{
public static async Task<(bool, Models.TokenResponse, string)> getTokenResponse(bool status, string message)
{
return (status, new Models.TokenResponse { jwttoken = "1234", refreshtoken = "12345" }, message);
}
public static async Task<(bool, List<User>, string)> getUsers(bool status, string message)
{
List<User> users = new List<User>();
users.Add(new User { Id = 1, EmployeeCode = "Emp1", EmployeeId = 1, RoleId = 1, IsActive = true, CreateDate = DateTime.Now });
users.Add(new User { Id = 2, EmployeeCode = "Emp2", EmployeeId = 2, RoleId = 1, IsActive = true, CreateDate = DateTime.Now });
users.Add(new User { Id = 3, EmployeeCode = "Emp3", EmployeeId = 3, RoleId = 1, IsActive = true, CreateDate = DateTime.Now });
return (status, users, message);
}
public static async Task<(bool, User, string)> getUser(bool status, string message)
{
User user = getUsers(status, message).Result.Item2.FirstOrDefault();
return (status, user, message);
}
public static async Task<(bool, List<Role>, string)> getRoles(bool status, string message)
{
List<Role> roles = new List<Role>();
roles.Add(new Role { Id = 1, Name = "Role 1" });
roles.Add(new Role { Id = 2, Name = "Role 2" });
roles.Add(new Role { Id = 3, Name = "Role 3" });
return (status, roles, message);
}
}
}

View File

@ -1,194 +0,0 @@
using DamageAssesment.Api.UsersAccess.Controllers;
using DamageAssesment.Api.UsersAccess.Interfaces;
using Microsoft.AspNetCore.Mvc;
using Moq;
using Xunit;
namespace DamageAssesment.Api.UsersAccess.Test
{
public class UsersAccessTest
{
private Mock<IUsersAccessProvider> mockService;
public UsersAccessTest()
{
mockService = new Mock<IUsersAccessProvider>();
}
[Fact(DisplayName = "Get Token - Ok case")]
public async Task GetTokenAsync_ShouldReturnStatusCode200()
{
var response = await MockData.getTokenResponse(true,null);
mockService.Setup(service => service.AuthenticateAsync()).ReturnsAsync(response);
var controller = new UsersAccessController(mockService.Object);
var result = (OkObjectResult)await controller.AuthenticateAsync();
Assert.Equal(200, result.StatusCode);
}
[Fact(DisplayName = "Get Token - Unauthorized case")]
public async Task GetTokenAsync_ShouldReturnStatusCode401()
{
var response = await MockData.getTokenResponse(false, null);
mockService.Setup(service => service.AuthenticateAsync()).ReturnsAsync(response);
var controller = new UsersAccessController(mockService.Object);
var result = (UnauthorizedObjectResult)await controller.AuthenticateAsync();
Assert.Equal(401, result.StatusCode);
}
[Fact(DisplayName = "RefreshToken - Ok case")]
public async Task RefreshTokenAsync_ShouldReturnStatusCode200()
{
var response = await MockData.getTokenResponse(true, null);
mockService.Setup(service => service.RefreshTokenAsync(null)).ReturnsAsync(response);
var controller = new UsersAccessController(mockService.Object);
var result = (OkObjectResult)await controller.RefreshTokenAsync(null);
Assert.Equal(200, result.StatusCode);
}
[Fact(DisplayName = "RefreshToken - Unauthorized case")]
public async Task RefreshTokenAsync_ShouldReturnStatusCode401()
{
var response = await MockData.getTokenResponse(false, null);
mockService.Setup(service => service.RefreshTokenAsync(null)).ReturnsAsync(response);
var controller = new UsersAccessController(mockService.Object);
var result = (UnauthorizedObjectResult)await controller.RefreshTokenAsync(null);
Assert.Equal(401, result.StatusCode);
}
[Fact(DisplayName = "GetUsers - Ok case")]
public async Task GetUsersAsync_ShouldReturnStatusCode200()
{
var response = await MockData.getUsers(true, null);
mockService.Setup(service => service.GetUsersAsync()).ReturnsAsync(response);
var controller = new UsersAccessController(mockService.Object);
var result = (OkObjectResult)await controller.GetUsersAsync();
Assert.Equal(200, result.StatusCode);
}
[Fact(DisplayName = "GetUsers - NoContent case")]
public async Task GetUsersAsync_ShouldReturnStatusCode204()
{
var response = await MockData.getUsers(false, null);
mockService.Setup(service => service.GetUsersAsync()).ReturnsAsync(response);
var controller = new UsersAccessController(mockService.Object);
var result = (NoContentResult)await controller.GetUsersAsync();
Assert.Equal(204, result.StatusCode);
}
[Fact(DisplayName = "GetUser - Ok case")]
public async Task GetUserAsync_ShouldReturnStatusCode200()
{
var response = await MockData.getUser(true, null);
mockService.Setup(service => service.GetUsersAsync(1)).ReturnsAsync(response);
var controller = new UsersAccessController(mockService.Object);
var result = (OkObjectResult)await controller.GetUsersAsync(1);
Assert.Equal(200, result.StatusCode);
}
[Fact(DisplayName = "GetUser - NotFound case")]
public async Task GetUserAsync_ShouldReturnStatusCode204()
{
var response = await MockData.getUser(false, null);
mockService.Setup(service => service.GetUsersAsync(1)).ReturnsAsync(response);
var controller = new UsersAccessController(mockService.Object);
var result = (NotFoundResult)await controller.GetUsersAsync(1);
Assert.Equal(404, result.StatusCode);
}
[Fact(DisplayName = "GetRoles - Ok case")]
public async Task GetRolesAsync_ShouldReturnStatusCode200()
{
var response = await MockData.getRoles(true, null);
mockService.Setup(service => service.GetRolesAsync()).ReturnsAsync(response);
var controller = new UsersAccessController(mockService.Object);
var result = (OkObjectResult)await controller.GetRolesAsync();
Assert.Equal(200, result.StatusCode);
}
[Fact(DisplayName = "GetRoles - NoContent case")]
public async Task GetRolesAsync_ShouldReturnStatusCode204()
{
var response = await MockData.getRoles(false, null);
mockService.Setup(service => service.GetRolesAsync()).ReturnsAsync(response);
var controller = new UsersAccessController(mockService.Object);
var result = (NoContentResult)await controller.GetRolesAsync();
Assert.Equal(204, result.StatusCode);
}
[Fact(DisplayName = "PostUser - Ok case")]
public async Task PostUserAsync_ShouldReturnStatusCode200()
{
var response = await MockData.getUser(true, null);
var user = new Models.User { Id = 1, EmployeeCode = "Emp1", EmployeeId = 1, RoleId = 1, IsActive = true, CreateDate = DateTime.Now };
mockService.Setup(service => service.PostUserAsync(user)).ReturnsAsync(response);
var controller = new UsersAccessController(mockService.Object);
var result = (OkObjectResult)await controller.PostUserAsync(user);
Assert.Equal(200, result.StatusCode);
}
[Fact(DisplayName = "PostUser - Bad Request case")]
public async Task PostUserAsync_ShouldReturnStatusCode400()
{
var response = await MockData.getUser(false, null);
var user = new Models.User { Id = 1, EmployeeCode = "Emp1", EmployeeId = 1, RoleId = 1, IsActive = true, CreateDate = DateTime.Now };
mockService.Setup(service => service.PostUserAsync(user)).ReturnsAsync(response);
var controller = new UsersAccessController(mockService.Object);
var result = (BadRequestObjectResult)await controller.PostUserAsync(user);
Assert.Equal(400, result.StatusCode);
}
[Fact(DisplayName = "PutUser - Ok case")]
public async Task PutUserAsync_ShouldReturnStatusCode200()
{
var response = await MockData.getUser(true, null);
var user = new Models.User { Id = 1, EmployeeCode = "Emp1", EmployeeId = 1, RoleId = 1, IsActive = true, CreateDate = DateTime.Now };
mockService.Setup(service => service.PutUserAsync(1,user)).ReturnsAsync(response);
var controller = new UsersAccessController(mockService.Object);
var result = (OkObjectResult)await controller.PutUserAsync(1,user);
Assert.Equal(200, result.StatusCode);
}
[Fact(DisplayName = "PutUser - BadRequest case")]
public async Task PutUserAsync_ShouldReturnStatusCode400()
{
var response = await MockData.getUser(false, null);
var user = new Models.User { Id = 1, EmployeeCode = "Emp1", EmployeeId = 1, RoleId = 1, IsActive = true, CreateDate = DateTime.Now };
mockService.Setup(service => service.PutUserAsync(1,user)).ReturnsAsync(response);
var controller = new UsersAccessController(mockService.Object);
var result = (BadRequestObjectResult)await controller.PutUserAsync(1,user);
Assert.Equal(400, result.StatusCode);
}
[Fact(DisplayName = "PutUser - Not Found case")]
public async Task PutUserAsync_ShouldReturnStatusCode404()
{
var response = await MockData.getUser(false, "Not Found");
var user = new Models.User { Id = 1, EmployeeCode = "Emp1", EmployeeId = 1, RoleId = 1, IsActive = true, CreateDate = DateTime.Now };
mockService.Setup(service => service.PutUserAsync(1, user)).ReturnsAsync(response);
var controller = new UsersAccessController(mockService.Object);
var result = (NotFoundObjectResult)await controller.PutUserAsync(1,user);
Assert.Equal(404, result.StatusCode);
}
[Fact(DisplayName = "DeleteUser - Ok case")]
public async Task DeleteUserAsync_ShouldReturnStatusCode200()
{
var response = await MockData.getUser(true, null);
mockService.Setup(service => service.DeleteUserAsync(1)).ReturnsAsync(response);
var controller = new UsersAccessController(mockService.Object);
var result = (OkObjectResult)await controller.DeleteUserAsync(1);
Assert.Equal(200, result.StatusCode);
}
[Fact(DisplayName = "DeleteUser - Not Found case")]
public async Task DeleteUserAsync_ShouldReturnStatusCode404()
{
var response = await MockData.getUser(false, "Not Found");
mockService.Setup(service => service.DeleteUserAsync(1)).ReturnsAsync(response);
var controller = new UsersAccessController(mockService.Object);
var result = (NotFoundResult)await controller.DeleteUserAsync(1);
Assert.Equal(404, result.StatusCode);
}
}
}

View File

@ -1,129 +0,0 @@
using DamageAssesment.Api.UsersAccess.Interfaces;
using DamageAssesment.Api.UsersAccess.Models;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace DamageAssesment.Api.UsersAccess.Controllers
{
[ApiController]
public class UsersAccessController : ControllerBase
{
private readonly IUsersAccessProvider userAccessProvider;
public UsersAccessController(IUsersAccessProvider userAccessProvider)
{
this.userAccessProvider = userAccessProvider;
}
[HttpPost("dadeschools/token")]
public async Task<ActionResult> DadeSchoolAuthenticateAsync(UserCredentials userCredentials)
{
var result = await userAccessProvider.AuthenticateAsync(userCredentials.username, userCredentials.password);
if (result.IsSuccess)
{
return Ok(result.TokenResponse);
}
return Unauthorized(result.ErrorMessage);
}
[Authorize(Policy = "Dadeschools")]
[HttpGet("damageapp/token")]
public async Task<ActionResult> AuthenticateAsync()
{
var result = await userAccessProvider.AuthenticateAsync();
if (result.IsSuccess)
{
return Ok(result.TokenResponse);
}
return Unauthorized(result.ErrorMessage);
}
[Authorize(Policy = "Dadeschools")]
[HttpPost("damageapp/refreshtoken")]
public async Task<ActionResult> RefreshTokenAsync(TokenResponse tokenResponse)
{
var result = await userAccessProvider.RefreshTokenAsync(tokenResponse);
if (result.IsSuccess)
{
return Ok(result.TokenResponse);
}
return Unauthorized(result.ErrorMessage);
}
[Authorize(Policy = "DamageApp", Roles = "admin")]
[HttpGet("users")]
public async Task<ActionResult> GetUsersAsync()
{
var result = await userAccessProvider.GetUsersAsync();
if (result.IsSuccess)
{
return Ok(result.Users);
}
return NoContent();
}
// [Authorize(Policy = "DamageApp", Roles = "admin")]
[HttpGet("users/{Id}")]
public async Task<ActionResult> GetUsersAsync(int Id)
{
var result = await userAccessProvider.GetUsersAsync(Id);
if (result.IsSuccess)
{
return Ok(result.User);
}
return NotFound();
}
//[Authorize(Policy = "DamageApp", Roles = "admin")]
[HttpGet("roles")]
public async Task<ActionResult> GetRolesAsync()
{
var result = await userAccessProvider.GetRolesAsync();
if (result.IsSuccess)
{
return Ok(result.Roles);
}
return NoContent();
}
//[Authorize(Policy = "DamageApp", Roles = "admin")]
[HttpPost("users")]
public async Task<ActionResult> PostUserAsync(User user)
{
var result = await userAccessProvider.PostUserAsync(user);
if (result.IsSuccess)
{
return Ok(result.User);
}
return BadRequest(result.ErrorMessage);
}
//[Authorize(Policy = "DamageApp", Roles = "admin")]
[HttpPut("users/{Id}")]
public async Task<ActionResult> PutUserAsync(int Id, User user)
{
var result = await userAccessProvider.PutUserAsync(Id, user);
if (result.IsSuccess)
{
return Ok(result.User);
}
if (result.ErrorMessage == "Not Found")
return NotFound(result.ErrorMessage);
return BadRequest(result.ErrorMessage);
}
[Authorize(Policy = "DamageApp", Roles = "admin")]
[HttpDelete("users/{Id}")]
public async Task<ActionResult> DeleteUserAsync(int Id)
{
var result = await userAccessProvider.DeleteUserAsync(Id);
if (result.IsSuccess)
{
return Ok(result.User);
}
return NotFound();
}
}
}

View File

@ -1,33 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
<DockerComposeProjectPath>..\docker-compose.dcproj</DockerComposeProjectPath>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="12.0.1" />
<PackageReference Include="IdentityServer4.AccessTokenValidation" Version="3.0.1" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.21" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.9" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="7.0.9">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="7.0.9" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="7.0.9" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="7.0.9">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.Extensions.Http.Polly" Version="7.0.10" />
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.18.1" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" />
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="6.21.0" />
</ItemGroup>
</Project>

View File

@ -1,21 +0,0 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Text.Json.Serialization;
namespace DamageAssesment.Api.UsersAccess.Db
{
public class Role
{
[Key]
public int Id { get; set; }
[StringLength(100)]
[Required]
public string Name { get; set; }
// add a status field
[StringLength(100)]
public string? Description { get; set; }
}
}

View File

@ -1,17 +0,0 @@
using Microsoft.EntityFrameworkCore.Metadata.Internal;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace DamageAssesment.Api.UsersAccess.Db
{
public class Token
{
[Key]
public int Id { get; set; }
[Required]
[ForeignKey("User")]
public int UserId { get; set; }
public string? RefreshToken { get; set; }
public bool? IsActive { get; set; }
}
}

View File

@ -1,31 +0,0 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Text.Json.Serialization;
namespace DamageAssesment.Api.UsersAccess.Db
{
public class User
{
[Key]
public int Id { get; set; }
[ForeignKey("Employee")]
public int EmployeeId { get; set; }
[Required]
[StringLength(50)]
public string EmployeeCode { get; set; }
[ForeignKey("Role")]
[Required]
public int RoleId { get; set; }
[Required]
public bool IsActive { get; set; } = true;
[Required]
public DateTime CreateDate { get; set; } = DateTime.Now;
public DateTime? UpdateDate { get; set; }
}
}

View File

@ -1,39 +0,0 @@
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
namespace DamageAssesment.Api.UsersAccess.Db
{
public class UsersAccessDbContext : DbContext
{
public DbSet<Db.User> Users { get; set; }
public DbSet<Db.Role> Roles { get; set; }
public DbSet<Db.Token> Tokens { get; set; }
private IConfiguration _Configuration { get; set; }
public UsersAccessDbContext(DbContextOptions options, IConfiguration configuration) : base(options)
{
_Configuration = configuration;
}
protected override void OnConfiguring(DbContextOptionsBuilder options)
{
// connect to sql server with connection string from app settings
options.UseSqlServer(_Configuration.GetConnectionString("UsersAccessConnection"));
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<User>()
.Property(item => item.Id)
.ValueGeneratedOnAdd();
modelBuilder.Entity<Role>()
.Property(item => item.Id)
.ValueGeneratedOnAdd();
modelBuilder.Entity<Token>()
.Property(item => item.Id)
.ValueGeneratedOnAdd();
}
}
}

View File

@ -1,21 +0,0 @@
#See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging.
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["DamageAssesment.Api.UsersAccess/DamageAssesment.Api.UsersAccess.csproj", "DamageAssesment.Api.UsersAccess/"]
RUN dotnet restore "DamageAssesment.Api.UsersAccess/DamageAssesment.Api.UsersAccess.csproj"
COPY . .
WORKDIR "/src/DamageAssesment.Api.UsersAccess"
RUN dotnet build "DamageAssesment.Api.UsersAccess.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "DamageAssesment.Api.UsersAccess.csproj" -c Release -o /app/publish /p:UseAppHost=false
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "DamageAssesment.Api.UsersAccess.dll"]

View File

@ -1,10 +0,0 @@
using DamageAssesment.Api.UsersAccess.Models;
namespace DamageAssesment.Api.UsersAccess.Interfaces
{
public interface IEmployeeServiceProvider
{
Task<List<Employee>> getEmployeesAsync(string token);
Task<Employee> getEmployeeAsync(int employeeId, string token);
}
}

View File

@ -1,12 +0,0 @@
namespace DamageAssesment.Api.UsersAccess.Interfaces
{
public interface IRoleProvider
{
Task<(bool IsSuccess, IEnumerable< Models.Role> Roles, string ErrorMessage)> GetRolesAsync();
Task<(bool IsSuccess, Models.Role Roles, string ErrorMessage)> GetRolesAsync(int Id);
Task<(bool IsSuccess, Models.Role Role, string ErrorMessage)> PostRoleAsync(Models.Role Role);
Task<(bool IsSuccess, Models.Role Role, string ErrorMessage)> PutRoleAsync(int Id,Models.Role Role);
Task<(bool IsSuccess, Models.Role Role, string ErrorMessage)> DeleteRoleAsync(int Id);
}
}

View File

@ -1,13 +0,0 @@
using DamageAssesment.Api.UsersAccess.Models;
using System.Security.Claims;
namespace DamageAssesment.Api.UsersAccess.Interfaces
{
public interface ITokenServiceProvider
{
Task<string> GenerateToken(Models.User user);
Task<TokenResponse> TokenAuthenticate(Models.User user, Claim[] claims);
Task<string> ConvertJsonToDadeSchoolsJwt(string json);
}
}

View File

@ -1,19 +0,0 @@
using DamageAssesment.Api.UsersAccess.Models;
namespace DamageAssesment.Api.UsersAccess.Interfaces
{
public interface IUsersAccessProvider
{
public Task<(bool IsSuccess, IEnumerable<object> Users, string ErrorMessage)> GetUsersAsync();
public Task<(bool IsSuccess, object User, string ErrorMessage)> GetUsersAsync(int Id);
public Task<(bool IsSuccess, Models.User User, string ErrorMessage)> PostUserAsync(Models.User User);
public Task<(bool IsSuccess, Models.User User, string ErrorMessage)> PutUserAsync(int Id,Models.User User);
public Task<(bool IsSuccess, Models.User User, string ErrorMessage)> DeleteUserAsync(int Id);
public Task<(bool IsSuccess, IEnumerable<Models.Role> Roles, string ErrorMessage)> GetRolesAsync();
public Task<(bool IsSuccess, Models.TokenResponse TokenResponse, string ErrorMessage)> AuthenticateAsync();
public Task<(bool IsSuccess, DadeSchoolToken TokenResponse, string ErrorMessage)> AuthenticateAsync(string username, string password);
public Task<(bool IsSuccess, Models.TokenResponse TokenResponse, string ErrorMessage)>RefreshTokenAsync(TokenResponse tokenResponse);
public void seedData();
}
}

View File

@ -1,7 +0,0 @@
namespace DamageAssesment.Api.UsersAccess.Interfaces
{
public interface IHttpUtil
{
Task<string> SendAsync(HttpMethod method, string url, string JsonInput, string token);
}
}

View File

@ -1,10 +0,0 @@
namespace DamageAssesment.Api.UsersAccess.Models
{
public class DadeSchoolToken
{
public string access_token { get; set; }
public int expires_in { get; set; }
public string token_type { get; set; }
public string scope { get; set; }
}
}

View File

@ -1,14 +0,0 @@
namespace DamageAssesment.Api.UsersAccess.Models
{
public class Employee
{
public int Id { get; set; }
public string EmployeeCode { get; set; }
public string Name { get; set; }
public DateTime BirthDate { get; set; }
public string OfficePhoneNumber { get; set; }
public string Email { get; set; }
public bool IsActive { get; set; }
public string PreferredLanguage { get; set; }
}
}

View File

@ -1,19 +0,0 @@
namespace DamageAssesment.Api.UsersAccess.Models
{
public class FakeToken
{
public long nbf { get; set; }
public long exp { get; set; }
public string iss { get; set; } = "https://dev-graph.dadeschools.net";
public string aud { get; set; } = "damage_assessment";
public long iat { get; set; }
public string at_hash { get; set; } = "Mw4sAsR_U3MfpqsffDhAqg";
public string s_hash { get; set; } = "xADDtg6lVxAXUIFK8hm0Iw";
public string sid { get; set; } = "A5EE26B57C27F28ADFEA8C021BB7C4F1";
public string sub { get; set; }
public long auth_time { get; set; }
public string idp { get; set; } = "Dadeschools";
public string[] amr { get; set; } = {"external"};
}
}

View File

@ -1,9 +0,0 @@
using System.ComponentModel.DataAnnotations;
namespace DamageAssesment.Api.UsersAccess.Models
{
public class JwtSettings
{
public string securitykey { get; set; }
}
}

View File

@ -1,8 +0,0 @@
namespace DamageAssesment.Api.UsersAccess.Models
{
public class Role {
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
}
}

View File

@ -1,10 +0,0 @@
namespace DamageAssesment.Api.UsersAccess.Models
{
public class Token
{
public string Id { get; set; }
public int UserId { get; set; }
public string RefreshToken { get; set; }
public bool IsActive { get; set; }
}
}

Some files were not shown because too many files have changed in this diff Show More