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
117 changed files with 579 additions and 3069 deletions

View File

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

View File

@ -1,73 +1,23 @@
using DamageAssesment.Api.Answers.Db; using DamageAssesment.Api.Answers.Db;
using DamageAssesment.Api.Answers.Interfaces; using DamageAssesment.Api.Answers.Interfaces;
using DamageAssesment.Api.Answers.Providers; using DamageAssesment.Api.Answers.Providers;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.IdentityModel.Tokens;
using Microsoft.OpenApi.Models;
using System.Reflection; using System.Reflection;
using System.Text;
var builder = WebApplication.CreateBuilder(args); var builder = WebApplication.CreateBuilder(args);
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. // Add services to the container.
builder.Services.AddControllers(); builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer(); builder.Services.AddEndpointsApiExplorer();
//builder.Services.AddSwaggerGen(); //builder.Services.AddSwaggerGen();
builder.Services.AddSwaggerGen(options => builder.Services.AddSwaggerGen(c =>
{ {
// Include XML comments from your assembly // Include XML comments from your assembly
var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"; var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile); var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
options.IncludeXmlComments(xmlPath); c.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);
}); });
builder.Services.AddScoped<IAnswersProvider, AnswersProvider>(); builder.Services.AddScoped<IAnswersProvider, AnswersProvider>();
builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies()); //4/30 builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies()); //4/30
@ -85,7 +35,7 @@ if (app.Environment.IsDevelopment())
app.UseSwagger(); app.UseSwagger();
app.UseSwaggerUI(); app.UseSwaggerUI();
} }
app.UseAuthentication();
app.UseAuthorization(); app.UseAuthorization();
app.MapControllers(); app.MapControllers();

View File

@ -11,6 +11,7 @@
"AllowedHosts": "*", "AllowedHosts": "*",
"ConnectionStrings": { "ConnectionStrings": {
//"AnswerConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;" //"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;" "AnswerConnection": "Server=207.180.248.35;Database=da_survey_dev;User Id=sa;Password=YourStrongPassw0rd;TrustServerCertificate=True;"
} }

View File

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

View File

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

View File

@ -1,15 +1,10 @@
using Azure.Storage.Blobs.Models; using Azure.Storage.Blobs.Models;
using DamageAssesment.Api.Attachments.Models;
namespace DamageAssesment.Api.Attachments.Interfaces namespace DamageAssesment.Api.Attachments.Interfaces
{ {
public interface IAzureBlobService public interface IAzureBlobService
{ {
Task<List<Azure.Response<BlobContentInfo>>> UploadFiles(List<IFormFile> files); Task<List<Azure.Response<BlobContentInfo>>> UploadFiles(List<IFormFile> files);
Task<List<Attachment>> UploadAttachment(int responseId, int answerId, int counter, List<IFormFile> postedFile); void DeleteFile(string path);
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);
} }
} }

View File

@ -1,77 +1,26 @@
using DamageAssesment.Api.Attachments.Db; using DamageAssesment.Api.Attachments.Db;
using DamageAssesment.Api.Attachments.Interfaces; using DamageAssesment.Api.Attachments.Interfaces;
using DamageAssesment.Api.Attachments.Providers; using DamageAssesment.Api.Attachments.Providers;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Http.Features; using Microsoft.AspNetCore.Http.Features;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.FileProviders; using Microsoft.Extensions.FileProviders;
using Microsoft.IdentityModel.Tokens;
using Microsoft.OpenApi.Models;
using System.Reflection; using System.Reflection;
using System.Text;
var builder = WebApplication.CreateBuilder(args); var builder = WebApplication.CreateBuilder(args);
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. // Add services to the container.
builder.Services.AddControllers(); builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer(); builder.Services.AddEndpointsApiExplorer();
//builder.Services.AddSwaggerGen(); //builder.Services.AddSwaggerGen();
builder.Services.AddSwaggerGen(options => builder.Services.AddSwaggerGen(c =>
{ {
// Include XML comments from your assembly // Include XML comments from your assembly
var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"; var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile); var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
options.IncludeXmlComments(xmlPath); c.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);
}); });
builder.Services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
builder.Services.AddScoped<IAttachmentsProvider, AttachmentsProvider>(); builder.Services.AddScoped<IAttachmentsProvider, AttachmentsProvider>();
builder.Services.AddScoped<IUploadService, UploadService>(); builder.Services.AddScoped<IUploadService, UploadService>();
builder.Services.AddScoped<IAzureBlobService,AzureBlobService>(); builder.Services.AddScoped<IAzureBlobService,AzureBlobService>();
@ -96,7 +45,6 @@ if (app.Environment.IsDevelopment())
app.UseSwaggerUI(); app.UseSwaggerUI();
} }
app.UseAuthentication();
app.UseAuthorization(); app.UseAuthorization();
app.UseHttpsRedirection(); app.UseHttpsRedirection();

View File

@ -13,33 +13,25 @@ namespace DamageAssesment.Api.Attachments.Providers
private AttachmentsDbContext AttachmentDbContext; private AttachmentsDbContext AttachmentDbContext;
private ILogger<AttachmentsProvider> logger; private ILogger<AttachmentsProvider> logger;
private IUploadService uploadservice; private IUploadService uploadservice;
private IMapper mapper; private IMapper mapper;
private readonly IHttpContextAccessor httpContextAccessor;
private string baseUrl; public AttachmentsProvider(AttachmentsDbContext AttachmentDbContext, ILogger<AttachmentsProvider> logger, IMapper mapper,IUploadService uploadservice)
public AttachmentsProvider(AttachmentsDbContext AttachmentDbContext, ILogger<AttachmentsProvider> logger, IMapper mapper,IUploadService uploadservice, IHttpContextAccessor httpContextAccessor)
{ {
this.AttachmentDbContext = AttachmentDbContext; this.AttachmentDbContext = AttachmentDbContext;
this.logger = logger; this.logger = logger;
this.mapper = mapper; this.mapper = mapper;
this.uploadservice = uploadservice; 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() public async Task<(bool IsSuccess, IEnumerable<Models.Attachment> Attachments, string ErrorMessage)> GetAttachmentsAsync()
{ {
try try
{ {
logger?.LogInformation("Query Question"); logger?.LogInformation("Query Question");
var Attachment = await AttachmentDbContext.Attachments.AsNoTracking().Where(a => !a.IsDeleted).ToListAsync(); var Attachment = await AttachmentDbContext.Attachments.AsNoTracking().Where(a => !a.IsDeleted).ToListAsync();
if (Attachment != null) if (Attachment != null)
{ {
foreach (var attachment in Attachment)
{
attachment.URI = $"{baseUrl}/{attachment.Id}";
}
logger?.LogInformation($"{Attachment.Count} Attachments(s) found"); logger?.LogInformation($"{Attachment.Count} Attachments(s) found");
var result = mapper.Map<IEnumerable<Db.Attachment>, IEnumerable<Models.Attachment>>(Attachment); var result = mapper.Map<IEnumerable<Db.Attachment>, IEnumerable<Models.Attachment>>(Attachment);
return (true, result, null); return (true, result, null);
@ -62,7 +54,6 @@ namespace DamageAssesment.Api.Attachments.Providers
if (Attachment != null) if (Attachment != null)
{ {
logger?.LogInformation($"{Attachment} customer(s) found"); logger?.LogInformation($"{Attachment} customer(s) found");
Attachment.URI = $"{baseUrl}/{Attachment.Id}";
var result = mapper.Map<Db.Attachment, Models.Attachment>(Attachment); var result = mapper.Map<Db.Attachment, Models.Attachment>(Attachment);
return (true, result, null); 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); List<Db.Attachment> attachments = mapper.Map<List<Models.Attachment>, List<Db.Attachment>>(Attachments);
AttachmentDbContext.Attachments.AddRange(attachments); AttachmentDbContext.Attachments.AddRange(attachments);
await AttachmentDbContext.SaveChangesAsync(); await AttachmentDbContext.SaveChangesAsync();
foreach (var attachment in attachments)
{
attachment.URI = $"{baseUrl}/{attachment.Id}";
}
var result = mapper.Map<IEnumerable<Db.Attachment>, IEnumerable<Models.Attachment>>(attachments); var result = mapper.Map<IEnumerable<Db.Attachment>, IEnumerable<Models.Attachment>>(attachments);
return (true, result, null); 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); List<Db.Attachment> attachments = mapper.Map<List<Models.Attachment>, List<Db.Attachment>>(Attachments);
AttachmentDbContext.Attachments.UpdateRange(attachments); AttachmentDbContext.Attachments.UpdateRange(attachments);
await AttachmentDbContext.SaveChangesAsync(); await AttachmentDbContext.SaveChangesAsync();
foreach (var attachment in attachments)
{
attachment.URI = $"{baseUrl}/{attachment.Id}";
}
var result = mapper.Map<IEnumerable<Db.Attachment>, IEnumerable<Models.Attachment>>(attachments); var result = mapper.Map<IEnumerable<Db.Attachment>, IEnumerable<Models.Attachment>>(attachments);
return (true, result, null); 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; 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() private void SeedData()
{ {

View File

@ -3,9 +3,6 @@ using Azure.Storage.Blobs;
using Azure.Storage.Blobs.Models; using Azure.Storage.Blobs.Models;
using Azure.Storage.Blobs.Specialized; using Azure.Storage.Blobs.Specialized;
using DamageAssesment.Api.Attachments.Interfaces; using DamageAssesment.Api.Attachments.Interfaces;
using DamageAssesment.Api.Attachments.Models;
using System.Diagnostics.Metrics;
using System.Text;
namespace DamageAssesment.Api.Attachments.Providers namespace DamageAssesment.Api.Attachments.Providers
{ {
@ -13,95 +10,11 @@ namespace DamageAssesment.Api.Attachments.Providers
{ {
BlobServiceClient _blobClient; BlobServiceClient _blobClient;
BlobContainerClient _containerClient; BlobContainerClient _containerClient;
string azureConnectionString; string azureConnectionString = "<Primary Connection String>";
private string uploadpath = ""; public AzureBlobService()
private string Deletepath = "";
public AzureBlobService(IConfiguration configuration)
{ {
uploadpath = configuration.GetValue<string>("Fileupload:folderpath"); _blobClient = new BlobServiceClient(azureConnectionString);
Deletepath = configuration.GetValue<string>("Fileupload:Deletepath"); _containerClient = _blobClient.GetBlobContainerClient("apiimages");
_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;
} }
public async Task<List<Azure.Response<BlobContentInfo>>> UploadFiles(List<IFormFile> files) public async Task<List<Azure.Response<BlobContentInfo>>> UploadFiles(List<IFormFile> files)
@ -122,52 +35,10 @@ namespace DamageAssesment.Api.Attachments.Providers
return azureResponse; return azureResponse;
} }
public string getMovefilename(string movefilename) public void DeleteFile(string url)
{ {
var list = movefilename.Split('.'); var blob = _containerClient.GetBlockBlobClient(url);
if (list.Length > 0) blob.DeleteIfExists();
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();
} }
} }
} }

View File

@ -124,7 +124,7 @@ namespace DamageAssesment.Api.Attachments.Providers
{ {
counter++; 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 fileName = String.Format("Attachment_{0}{1}", counter, file.FileExtension);
var dbPath = Path.Combine(fullDirectoryPath, fileName); var dbPath = Path.Combine(fullDirectoryPath, fileName);
File.WriteAllBytes(dbPath, Convert.FromBase64String(file.FileContent)); File.WriteAllBytes(dbPath, Convert.FromBase64String(file.FileContent));
@ -161,7 +161,7 @@ namespace DamageAssesment.Api.Attachments.Providers
foreach (var file in item.postedFiles) foreach (var file in item.postedFiles)
{ {
Models.Attachment attachment= attachments.Where(a=>a.Id == file.AttachmentId).FirstOrDefault(); 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 fileName = String.Format("Attachment_{0}{1}", attachment?.Id, file.FileExtension);
var dbPath = Path.Combine(fullDirectoryPath, fileName); var dbPath = Path.Combine(fullDirectoryPath, fileName);
File.WriteAllBytes(dbPath, Convert.FromBase64String(file.FileContent)); File.WriteAllBytes(dbPath, Convert.FromBase64String(file.FileContent));

View File

@ -11,14 +11,12 @@
"AllowedHosts": "*", "AllowedHosts": "*",
"Fileupload": { "Fileupload": {
"folderpath": "DMS_Attachments/Active", "folderpath": "DMS_Attachments/Active",
"Deletepath": "DMS_Attachments/Deleted", "Deletepath": "DMS_Attachments/Deleted"
"BlobConnectionString": "DefaultEndpointsProtocol=https;AccountName=damagedoculink;AccountKey=blynpwrAQtthEneXC5f4vFewJ3tPV+QZUt1AX3nefZScPPjkr5hMoC18B9ni6/ZYdhRiERPQw+hB+AStonf+iw==;EndpointSuffix=core.windows.net",
"BlobContainerName": "doculinks"
}, },
"ConnectionStrings": { "ConnectionStrings": {
//"AttachmentConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;" //"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;" "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 mockDocumentService = new Mock<IDoculinkProvider>();
var mockUploadService = new Mock<IUploadService>(); var mockUploadService = new Mock<IUploadService>();
var mockResponse = await MockData.getOkResponses(); 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 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); Assert.Equal(200, result.StatusCode);
} }
@ -97,7 +97,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
var mockDocumentService = new Mock<IDoculinkProvider>(); var mockDocumentService = new Mock<IDoculinkProvider>();
var mockUploadService = new Mock<IUploadService>(); var mockUploadService = new Mock<IUploadService>();
var mockResponse = await MockData.getOkResponse(1); 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 DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object);
var result = (OkObjectResult)await DocumentProvider.GetDocumentAsync(1, "forms", "en"); 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 mockResponse = await MockData.getOkResponse(1);
var mockInputDocument = await MockData.getInputDocumentData(); var mockInputDocument = await MockData.getInputDocumentData();
var DocumentResponse = await MockData.GetDocuLinksInfo(1); 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 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); Assert.Equal(404, result.StatusCode);
} }
@ -168,9 +168,9 @@ namespace DamageAssesment.Api.DocuLinks.Test
var mockUploadService = new Mock<IUploadService>(); var mockUploadService = new Mock<IUploadService>();
var mockResponse = await MockData.getBadRequestResponse(); var mockResponse = await MockData.getBadRequestResponse();
var mockInputDocument = await MockData.getInputDocumentData(); 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 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); Assert.Equal(400, result.StatusCode);
} }
@ -257,7 +257,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
var mockDocumentService = new Mock<IDoculinkProvider>(); var mockDocumentService = new Mock<IDoculinkProvider>();
var mockUploadService = new Mock<IUploadService>(); var mockUploadService = new Mock<IUploadService>();
var mockResponse = await LinkTypeMockData.getOkResponse(1); 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 DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object);
var result = (OkObjectResult)await DocumentProvider.GetLinkTypeAsync(1, "en"); var result = (OkObjectResult)await DocumentProvider.GetLinkTypeAsync(1, "en");
@ -312,9 +312,9 @@ namespace DamageAssesment.Api.DocuLinks.Test
var mockUploadService = new Mock<IUploadService>(); var mockUploadService = new Mock<IUploadService>();
var mockResponse = await LinkTypeMockData.getOkResponse(1); var mockResponse = await LinkTypeMockData.getOkResponse(1);
var mockInputDocument = await LinkTypeMockData.getInputLinkData(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 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); Assert.Equal(200, result.StatusCode);
} }
@ -326,9 +326,9 @@ namespace DamageAssesment.Api.DocuLinks.Test
var mockUploadService = new Mock<IUploadService>(); var mockUploadService = new Mock<IUploadService>();
var mockResponse = await LinkTypeMockData.getNotFoundResponse(); var mockResponse = await LinkTypeMockData.getNotFoundResponse();
var mockInputDocument = await LinkTypeMockData.getInputLinkData(99); 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 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); Assert.Equal(404, result.StatusCode);
} }
@ -340,7 +340,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
var mockUploadService = new Mock<IUploadService>(); var mockUploadService = new Mock<IUploadService>();
var mockResponse = await LinkTypeMockData.getBadRequestResponse(); var mockResponse = await LinkTypeMockData.getBadRequestResponse();
var mockInputDocument = await LinkTypeMockData.getInputLinkData(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 DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object);
var result = (BadRequestObjectResult)await DocumentProvider.UpdateLinkType(1, mockInputDocument); var result = (BadRequestObjectResult)await DocumentProvider.UpdateLinkType(1, mockInputDocument);

View File

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

View File

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

View File

@ -11,8 +11,7 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="12.0.1" /> <PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="12.0.1" />
<PackageReference Include="Azure.Storage.Blobs" Version="12.18.0" /> <PackageReference Include="Azure.Storage.Blobs" Version="12.16.0" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.21" />
<PackageReference Include="Microsoft.AspNetCore.Hosting" Version="2.2.7" /> <PackageReference Include="Microsoft.AspNetCore.Hosting" Version="2.2.7" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.9" /> <PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.9" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" 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 string Path { get; set; }
public bool IsAttachments { get; set; } public bool IsAttachments { get; set; }
public int CustomOrder { 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) protected override void OnConfiguring(DbContextOptionsBuilder options)
{ {
// connect to sql server with connection string from app settings // 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.Doculink> Documents { get; set; }
public DbSet<Db.LinkType> LinkTypes { get; set; } public DbSet<Db.LinkType> LinkTypes { get; set; }

View File

@ -1,14 +1,10 @@
using Azure.Storage.Blobs.Models; using Azure.Storage.Blobs.Models;
using DamageAssesment.Api.DocuLinks.Models;
namespace DamageAssesment.Api.DocuLinks.Interfaces namespace DamageAssesment.Api.DocuLinks.Interfaces
{ {
public interface IAzureBlobService public interface IAzureBlobService
{ {
Task<List<Azure.Response<BlobContentInfo>>> UploadFiles(List<IFormFile> files); 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 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, Models.Doculink Document);
Task<(bool IsSuccess, Models.ResDoculink Document, string ErrorMessage)> UpdateDocumentAsync(int id, bool isactive); 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.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(); 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 docName { get; set; }
public string Path { get; set; } public string Path { get; set; }
public bool IsAttachments { get; set; } public bool IsAttachments { get; set; }
public string Language { get; set; }
public int CustomOrder { get; set; } public int CustomOrder { get; set; }
} }
} }

View File

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

View File

@ -2,81 +2,30 @@ using DamageAssesment.Api.DocuLinks.Db;
using DamageAssesment.Api.DocuLinks.Interfaces; using DamageAssesment.Api.DocuLinks.Interfaces;
using DamageAssesment.Api.DocuLinks.Providers; using DamageAssesment.Api.DocuLinks.Providers;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
using System.Reflection; using System.Reflection;
using System.Text;
using Microsoft.OpenApi.Models;
var builder = WebApplication.CreateBuilder(args); var builder = WebApplication.CreateBuilder(args);
// Add services to the container. // 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(); builder.Services.AddControllers();
builder.Services.AddSwaggerGen(options => builder.Services.AddSwaggerGen(c =>
{ {
// Include XML comments from your assembly // Include XML comments from your assembly
var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"; var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile); var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
options.IncludeXmlComments(xmlPath); c.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);
}); });
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer(); builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen(); builder.Services.AddSwaggerGen();
builder.Services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
builder.Services.AddScoped<IDoculinkProvider, DoculinkProvider>(); builder.Services.AddScoped<IDoculinkProvider, DoculinkProvider>();
builder.Services.AddScoped<IUploadService, UploadService>(); builder.Services.AddScoped<IUploadService, UploadService>();
builder.Services.AddScoped<IAzureBlobService, AzureBlobService>(); builder.Services.AddScoped<IAzureBlobService, AzureBlobService>();
builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies()); //4/30 builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies()); //4/30
builder.Services.AddDbContext<DoculinkDbContext>(option => builder.Services.AddDbContext<DoculinkDbContext>(option =>
{ {
option.UseSqlServer("DoculinkConnection"); option.UseSqlServer("DoculinConnection");
}); });
var app = builder.Build(); var app = builder.Build();
@ -87,7 +36,6 @@ if (app.Environment.IsDevelopment())
app.UseSwaggerUI(); app.UseSwaggerUI();
} }
app.UseAuthentication();
app.UseAuthorization(); app.UseAuthorization();
app.MapControllers(); app.MapControllers();

View File

@ -1,17 +1,8 @@
 
using Azure;
using Azure.Storage.Blobs; using Azure.Storage.Blobs;
using Azure.Storage.Blobs.Models; using Azure.Storage.Blobs.Models;
using Azure.Storage.Blobs.Specialized; using Azure.Storage.Blobs.Specialized;
using DamageAssesment.Api.DocuLinks.Interfaces; 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 namespace DamageAssesment.Api.DocuLinks.Providers
{ {
@ -19,111 +10,11 @@ namespace DamageAssesment.Api.DocuLinks.Providers
{ {
BlobServiceClient _blobClient; BlobServiceClient _blobClient;
BlobContainerClient _containerClient; BlobContainerClient _containerClient;
string azureConnectionString; string azureConnectionString = "<Primary Connection String>";
private string uploadpath = ""; public AzureBlobService()
private string Deletepath = "";
public AzureBlobService(IConfiguration configuration)
{ {
uploadpath = configuration.GetValue<string>("Fileupload:folderpath"); _blobClient = new BlobServiceClient(azureConnectionString);
Deletepath = configuration.GetValue<string>("Fileupload:Deletepath"); _containerClient = _blobClient.GetBlobContainerClient("apiimages");
_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();
}
} }
public async Task<List<Azure.Response<BlobContentInfo>>> UploadFiles(List<IFormFile> files) public async Task<List<Azure.Response<BlobContentInfo>>> UploadFiles(List<IFormFile> files)
@ -144,52 +35,10 @@ namespace DamageAssesment.Api.DocuLinks.Providers
return azureResponse; 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) public void DeleteFile(string url)
{ {
BlobClient sourceBlobClient = _containerClient.GetBlobClient(url); var blob = _containerClient.GetBlockBlobClient(url);
sourceBlobClient.DeleteIfExists(); blob.DeleteIfExists();
} }
} }
} }

View File

@ -2,16 +2,13 @@
using DamageAssesment.Api.DocuLinks.Db; using DamageAssesment.Api.DocuLinks.Db;
using DamageAssesment.Api.DocuLinks.Interfaces; using DamageAssesment.Api.DocuLinks.Interfaces;
using DamageAssesment.Api.DocuLinks.Models; using DamageAssesment.Api.DocuLinks.Models;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Internal; using Microsoft.EntityFrameworkCore.Metadata.Internal;
using System; using System;
using System.Collections.Generic;
using System.Collections.Immutable; using System.Collections.Immutable;
using System.Diagnostics.Eventing.Reader; using System.Diagnostics.Eventing.Reader;
using System.Reflection.Metadata; using System.Reflection.Metadata;
using System.Runtime.CompilerServices;
using System.Xml; using System.Xml;
using System.Xml.Linq; using System.Xml.Linq;
@ -24,27 +21,20 @@ namespace DamageAssesment.Api.DocuLinks.Providers
private DoculinkDbContext DocumentDbContext; private DoculinkDbContext DocumentDbContext;
private ILogger<DoculinkProvider> logger; private ILogger<DoculinkProvider> logger;
private IUploadService uploadservice; private IUploadService uploadservice;
private IAzureBlobService azureBlobService;
private IMapper mapper; 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.DocumentDbContext = DocumentDbContext;
this.logger = logger; this.logger = logger;
this.mapper = mapper; this.mapper = mapper;
this.uploadservice = uploadservice; this.uploadservice = uploadservice;
this.httpContextAccessor = httpContextAccessor; SeedData();
baseUrl = $"{httpContextAccessor.HttpContext.Request.Scheme}://{httpContextAccessor.HttpContext.Request.Host}";
baseUrl = baseUrl + "/doculinks/download";
this.azureBlobService = azureBlobService;
//SeedData();
} }
private async Task SeedDataAsync() private void SeedData()
{ {
if (!DocumentDbContext.LinkTypes.Any()) if (!DocumentDbContext.LinkTypes.Any())
{ {
@ -81,10 +71,10 @@ namespace DamageAssesment.Api.DocuLinks.Providers
{ {
linkTypeId = 1; 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 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 } }; ReqDoculink documentInfo = new ReqDoculink() { linkTypeId = i, CustomOrder = i, Files = new List<FileModel>() { fileModel } };
Models.Doculink document = uploadservice.UploadDocument(counter, documentInfo); Models.Doculink document = uploadservice.UploadDocument(counter, documentInfo);
DocumentDbContext.Documents.Add(mapper.Map<Models.Doculink, Db.Doculink>(document)); DocumentDbContext.Documents.Add(mapper.Map<Models.Doculink, Db.Doculink>(document));
@ -180,42 +170,7 @@ namespace DamageAssesment.Api.DocuLinks.Providers
MultiLanguage = dicttitle; MultiLanguage = dicttitle;
return MultiLanguage; 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) 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.titles = multilan.titles;
item.description = multilan.description; item.description = multilan.description;
item.linktypes = CreateMultiLanguageLinkTypeObject(GetLinkTypeTranslations(item.linkTypeId, language)); 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(); // List<ResDoculinks> doculinks = result.GroupBy(a => a.linkTypeId).Select(a => new ResDoculinks() { linkTypeId = a.Key, doculinks = a.ToList() }).ToList();
return (true, result, null); return (true, result, null);
@ -272,7 +228,8 @@ namespace DamageAssesment.Api.DocuLinks.Providers
item.titles = multilan.titles; item.titles = multilan.titles;
item.description = multilan.description; item.description = multilan.description;
item.linktypes = CreateMultiLanguageLinkTypeObject(GetLinkTypeTranslations(item.linkTypeId, language)); 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(); //List<ResDoculinks> doculinks = result.GroupBy(a => a.linkTypeId).Select(a => new ResDoculinks() { linkTypeId = a.Key, doculinks = a.ToList() }).ToList();
return (true, result, null); return (true, result, null);
@ -327,7 +284,8 @@ namespace DamageAssesment.Api.DocuLinks.Providers
result.documentsTranslations = mapper.Map<List<Db.DoculinkTranslation>, List<Models.DoculinkTranslation>>( result.documentsTranslations = mapper.Map<List<Db.DoculinkTranslation>, List<Models.DoculinkTranslation>>(
DocumentDbContext.DocumentsTranslations.Where(a => a.DocumentId == result.Id).ToList()); 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 (true, result, null);
} }
return (false, null, "Not found"); return (false, null, "Not found");
@ -359,7 +317,8 @@ namespace DamageAssesment.Api.DocuLinks.Providers
result.linktypes = CreateMultiLanguageLinkTypeObject(GetLinkTypeTranslations(result.linkTypeId, language)); result.linktypes = CreateMultiLanguageLinkTypeObject(GetLinkTypeTranslations(result.linkTypeId, language));
result.titles = multilan.titles; result.titles = multilan.titles;
result.description = multilan.description; 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 (true, result, null);
} }
return (false, null, "Not found"); return (false, null, "Not found");
@ -390,7 +349,7 @@ namespace DamageAssesment.Api.DocuLinks.Providers
result.linktypes = CreateMultiLanguageLinkTypeObject(GetLinkTypeTranslations(Document.linkTypeId, "")); result.linktypes = CreateMultiLanguageLinkTypeObject(GetLinkTypeTranslations(Document.linkTypeId, ""));
result.titles = multilan.titles; result.titles = multilan.titles;
result.description = multilan.description; result.description = multilan.description;
result.doclinksAttachments = GetDocumentAttachment(document.Id,""); result.doclinksAttachments = Document.doclinksAttachments;
return (true, result, null); return (true, result, null);
} }
catch (Exception ex) catch (Exception ex)
@ -432,7 +391,7 @@ namespace DamageAssesment.Api.DocuLinks.Providers
result.linktypes = CreateMultiLanguageLinkTypeObject(GetLinkTypeTranslations(document.linkTypeId, "")); result.linktypes = CreateMultiLanguageLinkTypeObject(GetLinkTypeTranslations(document.linkTypeId, ""));
result.titles = multilan.titles; result.titles = multilan.titles;
result.description = multilan.description; result.description = multilan.description;
result.doclinksAttachments = GetDocumentAttachment(document.Id, ""); result.doclinksAttachments = Document.doclinksAttachments;
return (true, result, "Successful"); return (true, result, "Successful");
} }
else else

View File

@ -52,15 +52,6 @@ namespace DamageAssesment.Api.DocuLinks.Providers
return await System.IO.File.ReadAllBytesAsync(path); return await System.IO.File.ReadAllBytesAsync(path);
} }
return null; // File not found
}
catch (Exception ex)
{
// Handle or log the exception as needed
throw;
}
}
public Models.Doculink UploadDocument(int counter, ReqDoculink documentInfo) public Models.Doculink UploadDocument(int counter, ReqDoculink documentInfo)
{ {
Models.Doculink Documents = new Models.Doculink(); Models.Doculink Documents = new Models.Doculink();
@ -79,14 +70,14 @@ namespace DamageAssesment.Api.DocuLinks.Providers
counter++; counter++;
if (item.IsAttachments) 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); var fileName = String.Format("Document_{0}{1}", counter, item.FileExtension);
path = Path.Combine(fullDirectoryPath, fileName); path = Path.Combine(fullDirectoryPath, fileName);
File.WriteAllBytes(path, Convert.FromBase64String(item.FileContent)); File.WriteAllBytes(path, Convert.FromBase64String(item.FileContent));
} }
else else
path = item.url; 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, Documents=new Models.Doculink (){ linkTypeId = documentInfo.linkTypeId,
@ -116,20 +107,19 @@ namespace DamageAssesment.Api.DocuLinks.Providers
string path = "", UserfileName = ""; string path = "", UserfileName = "";
List<Models.DoculinkAttachments> attachments = new List<Models.DoculinkAttachments>(); List<Models.DoculinkAttachments> attachments = new List<Models.DoculinkAttachments>();
int counter1 = 1;
foreach (var item in documentInfo.Files) foreach (var item in documentInfo.Files)
{ {
counter++;
if (item.IsAttachments) if (item.IsAttachments)
{ {
UserfileName = Path.GetFileName(item.FileName+item.FileExtension); UserfileName = Path.GetFileName(item.FileName);
var fileName = String.Format("Document_{0}_{1}{2}", document.Id, counter1, item.FileExtension); var fileName = String.Format("Document_{0}{1}", counter, item.FileExtension);
path = Path.Combine(fullDirectoryPath, fileName); path = Path.Combine(fullDirectoryPath, fileName);
File.WriteAllBytes(path, Convert.FromBase64String(item.FileContent)); File.WriteAllBytes(path, Convert.FromBase64String(item.FileContent));
counter1++;
} }
else else
path = item.url; 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() Models.Doculink Documents = new Models.Doculink()
{ {

View File

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

View File

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

View File

@ -1,74 +1,23 @@
using DamageAssesment.Api.Employees.Db; using DamageAssesment.Api.Employees.Db;
using DamageAssesment.Api.Employees.Interfaces; using DamageAssesment.Api.Employees.Interfaces;
using DamageAssesment.Api.Employees.Providers; using DamageAssesment.Api.Employees.Providers;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.IdentityModel.Tokens;
using Microsoft.OpenApi.Models;
using System.Reflection; using System.Reflection;
using System.Text;
var builder = WebApplication.CreateBuilder(args); var builder = WebApplication.CreateBuilder(args);
// Add services to the container. // 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(); builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer(); builder.Services.AddEndpointsApiExplorer();
//builder.Services.AddSwaggerGen(); //builder.Services.AddSwaggerGen();
builder.Services.AddSwaggerGen(options => builder.Services.AddSwaggerGen(c =>
{ {
// Include XML comments from your assembly // Include XML comments from your assembly
var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"; var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile); var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
options.IncludeXmlComments(xmlPath); c.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);
}); });
builder.Services.AddScoped<IEmployeesProvider, EmployeesProvider>(); builder.Services.AddScoped<IEmployeesProvider, EmployeesProvider>();
@ -94,7 +43,6 @@ if (app.Environment.IsDevelopment())
} }
} }
app.UseAuthentication();
app.UseAuthorization(); app.UseAuthorization();
app.MapControllers(); app.MapControllers();

View File

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

View File

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

View File

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

View File

@ -21,6 +21,10 @@ namespace DamageAssesment.Api.Locations.Db
[StringLength(2)] [StringLength(2)]
public string SchoolType { 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

@ -11,5 +11,9 @@ namespace DamageAssesment.Api.Locations.Models
public string Name { get; set; } public string Name { get; set; }
public string MaintenanceCenter { get; set; } public string MaintenanceCenter { get; set; }
public string SchoolType { 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,73 +1,23 @@
using DamageAssesment.Api.Locations.Db; using DamageAssesment.Api.Locations.Db;
using DamageAssesment.Api.Locations.Interfaces; using DamageAssesment.Api.Locations.Interfaces;
using DamageAssesment.Api.Locations.Providers; using DamageAssesment.Api.Locations.Providers;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.IdentityModel.Tokens;
using Microsoft.OpenApi.Models;
using System.Reflection; using System.Reflection;
using System.Text;
var builder = WebApplication.CreateBuilder(args); var builder = WebApplication.CreateBuilder(args);
// Add services to the container. // 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(); builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer(); builder.Services.AddEndpointsApiExplorer();
//builder.Services.AddSwaggerGen(); //builder.Services.AddSwaggerGen();
builder.Services.AddSwaggerGen(options => builder.Services.AddSwaggerGen(c =>
{ {
// Include XML comments from your assembly // Include XML comments from your assembly
var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"; var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile); var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
options.IncludeXmlComments(xmlPath); c.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);
}); });
builder.Services.AddScoped<ILocationsProvider, LocationsProvider>(); builder.Services.AddScoped<ILocationsProvider, LocationsProvider>();
builder.Services.AddScoped<IRegionsProvider, RegionsProvider>(); builder.Services.AddScoped<IRegionsProvider, RegionsProvider>();
@ -76,10 +26,7 @@ builder.Services.AddDbContext<LocationDbContext>(option =>
{ {
option.UseSqlServer("LocationConnection"); option.UseSqlServer("LocationConnection");
}); });
var app = builder.Build(); var app = builder.Build();
// Add services to the container.
// Configure the HTTP request pipeline. // Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment()) if (app.Environment.IsDevelopment())
@ -97,7 +44,6 @@ if (app.Environment.IsDevelopment())
} }
} }
app.UseAuthentication();
app.UseAuthorization(); app.UseAuthorization();
app.MapControllers(); app.MapControllers();

View File

@ -17,7 +17,7 @@ namespace DamageAssesment.Api.Locations.Providers
this.locationDbContext = locationDbContext; this.locationDbContext = locationDbContext;
this.logger = logger; this.logger = logger;
this.mapper = mapper; this.mapper = mapper;
// SeedData(); // SeedData();
} }
public async Task<(bool IsSuccess, IEnumerable<Models.Location> Locations, string ErrorMessage)> GetLocationsAsync() 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(); var locations = await locationDbContext.Locations.AsNoTracking().ToListAsync();
if (locations != null) 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"); logger?.LogInformation($"{locations.Count} Locations(s) found");
var result = mapper.Map<IEnumerable<Db.Location>, IEnumerable<Models.Location>>(locations); var result = mapper.Map<IEnumerable<Db.Location>, IEnumerable<Models.Location>>(locations);
return (true, result, null); return (true, result, null);
@ -46,9 +48,12 @@ namespace DamageAssesment.Api.Locations.Providers
try try
{ {
logger?.LogInformation("Query Location"); 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); var location = await locationDbContext.Locations.AsNoTracking().FirstOrDefaultAsync(q => q.Id == Id);
if (location != null) if (location != null)
{ {if(maxenrollment>0)
location.DataValue = GetHeatmapdata(location.Enrollment, maxenrollment);
logger?.LogInformation($"{location} found"); logger?.LogInformation($"{location} found");
var result = mapper.Map<Db.Location, Models.Location>(location); var result = mapper.Map<Db.Location, Models.Location>(location);
return (true, result, null); return (true, result, null);
@ -61,6 +66,10 @@ namespace DamageAssesment.Api.Locations.Providers
return (false, null, ex.Message); 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) public async Task<(bool IsSuccess, Models.Location Location, string ErrorMessage)> PostLocationAsync(Models.Location location)
{ {
try try
@ -139,9 +148,9 @@ namespace DamageAssesment.Api.Locations.Providers
{ {
if (!locationDbContext.Locations.Any()) 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 = "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" }); 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" }); 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 = 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 = 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" }); //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": "*", "AllowedHosts": "*",
"ConnectionStrings": { "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;" "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.Interfaces;
using DamageAssesment.Api.Questions.Models;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
namespace DamageAssesment.Api.Questions.Controllers namespace DamageAssesment.Api.Questions.Controllers
@ -12,13 +10,16 @@ namespace DamageAssesment.Api.Questions.Controllers
public QuestionsController(IQuestionsProvider questionsProvider) public QuestionsController(IQuestionsProvider questionsProvider)
{ {
this.questionsProvider = questionsProvider; this.questionsProvider = questionsProvider;
} }
/// <summary> /// <summary>
/// GET request for retrieving questions. /// GET request for retrieving questions.
/// </summary> /// </summary>
//get all questions
[Authorize(Roles = "admin,survey,user,report")] // get all questions
[Route("questions")] [Route("questions")]
[Route("questions/{language:alpha}")] [Route("questions/{language:alpha}")]
[HttpGet] [HttpGet]
@ -36,7 +37,6 @@ namespace DamageAssesment.Api.Questions.Controllers
/// <summary> /// <summary>
/// GET request for retrieving a question by ID. /// GET request for retrieving a question by ID.
/// </summary> /// </summary>
[Authorize(Roles = "admin,survey,user,report")]
[Route("questions/{id}/{language:alpha}")] [Route("questions/{id}/{language:alpha}")]
[Route("questions/{id:int}")] [Route("questions/{id:int}")]
[HttpGet] [HttpGet]
@ -55,7 +55,6 @@ namespace DamageAssesment.Api.Questions.Controllers
/// GET request for retrieving survey questions based on a survey ID. /// GET request for retrieving survey questions based on a survey ID.
/// Uri: {Optional language}/GetSurveyQuestions/{surveyId} :Default returns question in all languages /// Uri: {Optional language}/GetSurveyQuestions/{surveyId} :Default returns question in all languages
/// </summary> /// </summary>
[Authorize(Roles = "admin,survey,user,report")]
[Route("questions/bysurvey/{surveyId:int}")] [Route("questions/bysurvey/{surveyId:int}")]
[Route("questions/bysurvey/{surveyId:int}/{language:alpha}")] [Route("questions/bysurvey/{surveyId:int}/{language:alpha}")]
[HttpGet] [HttpGet]
@ -72,7 +71,6 @@ namespace DamageAssesment.Api.Questions.Controllers
/// PUT request for updating a question (multilingual). /// PUT request for updating a question (multilingual).
/// </summary> /// </summary>
[Authorize(Roles = "admin")]
[HttpPut("questions")] [HttpPut("questions")]
public async Task<IActionResult> UpdateQuestion(Models.Question question) public async Task<IActionResult> UpdateQuestion(Models.Question question)
{ {
@ -93,7 +91,6 @@ namespace DamageAssesment.Api.Questions.Controllers
/// <summary> /// <summary>
/// POST request for creating a multiple question (multilingual). /// POST request for creating a multiple question (multilingual).
/// </summary> /// </summary>
[Authorize(Roles = "admin")]
[HttpPost("questions/multiple")] [HttpPost("questions/multiple")]
public async Task<IActionResult> CreateQuestions(List<Models.Question> questions) public async Task<IActionResult> CreateQuestions(List<Models.Question> questions)
{ {
@ -109,33 +106,12 @@ namespace DamageAssesment.Api.Questions.Controllers
return BadRequest(result.ErrorMessage); return BadRequest(result.ErrorMessage);
} }
return CreatedAtRoute("DefaultApi", questions); 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);
} }
/// <summary> /// <summary>
/// POST request for creating a new question (multilingual). /// POST request for creating a new question (multilingual).
/// </summary> /// </summary>
[Authorize(Roles = "admin")]
[HttpPost("questions")] [HttpPost("questions")]
public async Task<IActionResult> CreateQuestion(Models.Question question) 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. /// DELETE request for deleting a question based on ID.
/// </summary> /// </summary>
[Authorize(Roles = "admin")]
[HttpDelete("questions/{id}")] [HttpDelete("questions/{id}")]
public async Task<IActionResult> DeleteQuestion(int id) public async Task<IActionResult> DeleteQuestion(int id)
{ {
@ -170,7 +145,6 @@ namespace DamageAssesment.Api.Questions.Controllers
/// GET request for retrieving question categories. /// GET request for retrieving question categories.
/// </summary> /// </summary>
[Authorize(Roles = "admin,user,report")]
[HttpGet("questions/categories")] [HttpGet("questions/categories")]
[HttpGet("questions/categories/{language:alpha}")] [HttpGet("questions/categories/{language:alpha}")]
public async Task<IActionResult> GetQuestionCategoriesAsync(string? language) public async Task<IActionResult> GetQuestionCategoriesAsync(string? language)
@ -185,7 +159,7 @@ namespace DamageAssesment.Api.Questions.Controllers
/// <summary> /// <summary>
/// GET request for retrieving a question category by ID. /// GET request for retrieving a question category by ID.
/// </summary> /// </summary>
[Authorize(Roles = "admin,report")]
[HttpGet("questions/categories/{id:int}")] [HttpGet("questions/categories/{id:int}")]
[HttpGet("questions/categories/{id:int}/{language:alpha}")] [HttpGet("questions/categories/{id:int}/{language:alpha}")]
public async Task<IActionResult> GetQuestionCategoryAsync(int id,string? language) public async Task<IActionResult> GetQuestionCategoryAsync(int id,string? language)
@ -202,7 +176,7 @@ namespace DamageAssesment.Api.Questions.Controllers
/// <summary> /// <summary>
/// PUT request for updating a question category. /// PUT request for updating a question category.
/// </summary> /// </summary>
[Authorize(Roles = "admin,survey,report")]
[HttpPut("questions/categories")] [HttpPut("questions/categories")]
public async Task<IActionResult> UpdateQuestionCategory(Models.QuestionCategory questionCategory) 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. /// POST request for creating a new question category.
/// </summary> /// </summary>
[Authorize(Roles = "admin")]
[HttpPost("questions/categories")] [HttpPost("questions/categories")]
public async Task<IActionResult> CreateQuestionCategory(Models.QuestionCategory questionCategory) 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. /// DELETE request for deleting a question category based on ID.
/// </summary> /// </summary>
[Authorize(Roles = "admin")]
[HttpDelete("questions/categories/{id}")] [HttpDelete("questions/categories/{id}")]
public async Task<IActionResult> DeleteQuestionCategory(int 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, 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, 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)> 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)> UpdateQuestionAsync(Models.Question Question);
Task<(bool IsSuccess, Models.MultiLanguage Question, string ErrorMessage)> DeleteQuestionAsync(int id); Task<(bool IsSuccess, Models.MultiLanguage Question, string ErrorMessage)> DeleteQuestionAsync(int id);

View File

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

View File

@ -1,33 +1,11 @@
using DamageAssesment.Api.Questions.Db; using DamageAssesment.Api.Questions.Db;
using DamageAssesment.Api.Questions.Interfaces; using DamageAssesment.Api.Questions.Interfaces;
using DamageAssesment.Api.Questions.Providers; using DamageAssesment.Api.Questions.Providers;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.IdentityModel.Tokens;
using Microsoft.OpenApi.Models;
using System.Reflection; using System.Reflection;
using System.Text;
var builder = WebApplication.CreateBuilder(args); var builder = WebApplication.CreateBuilder(args);
// 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. // Add services to the container.
builder.Services.AddControllers(); builder.Services.AddControllers();
@ -39,41 +17,13 @@ builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());
builder.Services.AddEndpointsApiExplorer(); builder.Services.AddEndpointsApiExplorer();
//builder.Services.AddSwaggerGen(); //builder.Services.AddSwaggerGen();
builder.Services.AddSwaggerGen(options => builder.Services.AddSwaggerGen(c =>
{ {
// Include XML comments from your assembly // Include XML comments from your assembly
var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"; var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile); var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
options.IncludeXmlComments(xmlPath); c.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);
}); });
builder.Services.AddDbContext<QuestionDbContext>(option => builder.Services.AddDbContext<QuestionDbContext>(option =>
{ {
option.UseSqlServer("QuestionConnection"); option.UseSqlServer("QuestionConnection");
@ -93,7 +43,7 @@ if (app.Environment.IsDevelopment())
questionProvider.SeedData(); questionProvider.SeedData();
} }
} }
app.UseAuthentication();
app.UseAuthorization(); app.UseAuthorization();
app.MapControllers(); app.MapControllers();

View File

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

View File

@ -11,6 +11,7 @@
"AllowedHosts": "*", "AllowedHosts": "*",
"ConnectionStrings": { "ConnectionStrings": {
//"QuestionConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;" //"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;" "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>(); List<Models.Question> Questions = new List<Models.Question>();
QuestionsTranslations.Add(QuestionsTranslation); 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.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; return Questions;
} }
} }
} }

View File

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

View File

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

View File

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

View File

@ -4,9 +4,9 @@ namespace DamageAssesment.Api.Responses.Interfaces
{ {
public interface IAnswerServiceProvider public interface IAnswerServiceProvider
{ {
Task<List<Answer>> getAnswersAsync(string token); Task<List<Answer>> getAnswersAsync();
Task<List<Models.Answer>> GetAnswersByResponseIdAsync(int responseId, string token); 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 public interface IAttachmentServiceProvider
{ {
Task<List<Attachment>> getAttachmentsAsync(string token); Task<List<Attachment>> getAttachmentsAsync();
Task<IEnumerable<Attachment>> PostAttachmentsAsync(Models.AttachmentInfo attachmentInfo, string token); 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 namespace DamageAssesment.Api.Responses.Interfaces
{ {
public interface IEmployeeServiceProvider public interface IEmployeeServiceProvider
{ {
Task<List<Employee>> getEmployeesAsync(string token); Task<List<Employee>> getEmployeesAsync();
Task<Employee> getEmployeeAsync(int employeeId, string token); 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 namespace DamageAssesment.Api.Responses.Interfaces
{ {
public interface IHttpUtil 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 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 public interface IQuestionServiceProvider
{ {
Task<List<Question>> getQuestionsAsync(string language, string token); Task<List<Question>> getQuestionsAsync(string language);
Task<List<SurveyQuestions>> getSurveyQuestionsAsync(int surveyId, string token); Task<List<SurveyQuestions>> getSurveyQuestionsAsync(int surveyId);
Task<Question> getQuestionsAsync(int questionId, string token); Task<Question> getQuestionsAsync(int questionId);
Task<List<QuestionCategory>> GetQuestionCategoriesAsync(string? language, string token); Task<List<QuestionCategory>> GetQuestionCategoriesAsync(string? language);
} }
} }

View File

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

View File

@ -11,6 +11,6 @@ namespace DamageAssesment.Api.Responses.Models
public string OfficePhoneNumber { get; set; } public string OfficePhoneNumber { get; set; }
public string Email { get; set; } public string Email { get; set; }
public bool IsActive { 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 Name { get; set; }
public string MaintenanceCenter { get; set; } public string MaintenanceCenter { get; set; }
public string SchoolType { 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 Microsoft.EntityFrameworkCore;
using Polly; using Polly;
using System.Reflection; using System.Reflection;
using Microsoft.OpenApi.Models;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
using System.Text;
var builder = WebApplication.CreateBuilder(args); var builder = WebApplication.CreateBuilder(args);
const int maxApiCallRetries = 3; const int maxApiCallRetries = 3;
@ -18,24 +14,6 @@ const int intervalForCircuitBraker = 5; //5 seconds
// Add services to the container. // 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(); builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
@ -49,7 +27,6 @@ builder.Services.AddScoped<IEmployeeServiceProvider, EmployeeServiceProvider>();
builder.Services.AddScoped<IAttachmentServiceProvider, AttachmentServiceProvider>(); builder.Services.AddScoped<IAttachmentServiceProvider, AttachmentServiceProvider>();
builder.Services.AddScoped<ISurveyServiceProvider, SurveyServiceProvider>(); builder.Services.AddScoped<ISurveyServiceProvider, SurveyServiceProvider>();
builder.Services.AddScoped<IExcelExportService, ExcelExportService>(); builder.Services.AddScoped<IExcelExportService, ExcelExportService>();
builder.Services.AddHttpContextAccessor();
builder.Services.AddHttpClient<IHttpUtil, HttpUtil>(). builder.Services.AddHttpClient<IHttpUtil, HttpUtil>().
AddTransientHttpErrorPolicy(policy => policy.WaitAndRetryAsync(maxApiCallRetries, _ => TimeSpan.FromSeconds(intervalToRetry))). AddTransientHttpErrorPolicy(policy => policy.WaitAndRetryAsync(maxApiCallRetries, _ => TimeSpan.FromSeconds(intervalToRetry))).
@ -59,40 +36,12 @@ builder.Services.AddHttpClient<IHttpUtil, HttpUtil>().
builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies()); builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());
builder.Services.AddEndpointsApiExplorer(); builder.Services.AddEndpointsApiExplorer();
//builder.Services.AddSwaggerGen(); //builder.Services.AddSwaggerGen();
builder.Services.AddSwaggerGen(c =>
builder.Services.AddSwaggerGen(options =>
{ {
// Include XML comments from your assembly // Include XML comments from your assembly
var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"; var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile); var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
options.IncludeXmlComments(xmlPath); c.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);
}); });
builder.Services.AddDbContext<SurveyResponseDbContext>(option => builder.Services.AddDbContext<SurveyResponseDbContext>(option =>
{ {
@ -107,7 +56,6 @@ if (app.Environment.IsDevelopment())
app.UseSwaggerUI(); app.UseSwaggerUI();
} }
app.UseAuthentication();
app.UseAuthorization(); app.UseAuthorization();
app.MapControllers(); app.MapControllers();

View File

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

View File

@ -2,7 +2,6 @@
using DamageAssesment.Api.Responses.Db; using DamageAssesment.Api.Responses.Db;
using DamageAssesment.Api.Responses.Interfaces; using DamageAssesment.Api.Responses.Interfaces;
using DamageAssesment.Api.Responses.Models; using DamageAssesment.Api.Responses.Models;
using DamageAssesment.Api.Responses.Services;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Internal; using Microsoft.EntityFrameworkCore.Metadata.Internal;
using System.Reflection; using System.Reflection;
@ -22,10 +21,8 @@ namespace DamageAssesment.Api.Responses.Providers
private readonly IQuestionServiceProvider questionServiceProvider; private readonly IQuestionServiceProvider questionServiceProvider;
private readonly ISurveyServiceProvider surveyServiceProvider; private readonly ISurveyServiceProvider surveyServiceProvider;
private readonly IMapper mapper; 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.surveyResponseDbContext = surveyResponseDbContext;
this.logger = logger; this.logger = logger;
@ -36,20 +33,8 @@ namespace DamageAssesment.Api.Responses.Providers
this.attachmentServiceProvider = attachmentServiceProvider; this.attachmentServiceProvider = attachmentServiceProvider;
this.questionServiceProvider = questionServiceProvider; this.questionServiceProvider = questionServiceProvider;
this.surveyServiceProvider = surveyServiceProvider; this.surveyServiceProvider = surveyServiceProvider;
this.httpContextAccessor = httpContextAccessor;
this.mapper = mapper; this.mapper = mapper;
SeedData(); SeedData();
token = httpContextAccessor.HttpContext.Request.Headers.Authorization;
if (token != null)
{
token = token.Replace("Bearer ", string.Empty);
}
else
{
token = "";
}
// seedData();
} }
public void SeedData() public void SeedData()
@ -71,20 +56,16 @@ namespace DamageAssesment.Api.Responses.Providers
try try
{ {
logger?.LogInformation("Querying to get SurveyResponse object from DB"); logger?.LogInformation("Querying to get SurveyResponse object from DB");
List<Db.SurveyResponse> listSurveyResponse = null; IQueryable<Db.SurveyResponse> listSurveyResponse = null;
if (employeeid == 0) if (employeeid == 0)
{ {
listSurveyResponse = surveyResponseDbContext.SurveyResponses.Where(s => s.SurveyId == surveyId).ToList(); listSurveyResponse = surveyResponseDbContext.SurveyResponses.Where(s => s.SurveyId == surveyId);
} }
else 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()) if (listSurveyResponse.Any())
{ {
var answers = await getAnswersByRegionAndSurveyIdAsync(listSurveyResponse); var answers = await getAnswersByRegionAndSurveyIdAsync(listSurveyResponse);
@ -139,7 +120,7 @@ namespace DamageAssesment.Api.Responses.Providers
{ {
logger?.LogInformation("Querying to get SurveyResponse object from DB"); logger?.LogInformation("Querying to get SurveyResponse object from DB");
//get all the survey that already taken by the employee //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(); surveys = surveys.Where(s => s.IsEnabled == true && s.Status == SurveyStatus.ACTIVE.ToString()).ToList();
if (employeeid == null || employeeid == 0) if (employeeid == null || employeeid == 0)
return (true, surveys, null); return (true, surveys, null);
@ -160,7 +141,7 @@ namespace DamageAssesment.Api.Responses.Providers
{ {
logger?.LogInformation("Querying to get SurveyResponse object from DB"); 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. // returning only historic data: end date is less than current date.
surveys = surveys.Where(s => s.Status == SurveyStatus.INACTIVE.ToString()).ToList(); surveys = surveys.Where(s => s.Status == SurveyStatus.INACTIVE.ToString()).ToList();
if (employeeid == null || employeeid == 0) if (employeeid == null || employeeid == 0)
@ -185,7 +166,7 @@ namespace DamageAssesment.Api.Responses.Providers
try try
{ {
logger?.LogInformation("Querying to get Survey object from microservice"); 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) if (survey != null)
{ {
@ -216,7 +197,7 @@ namespace DamageAssesment.Api.Responses.Providers
try try
{ {
logger?.LogInformation("Querying to get Survey object from microservice"); 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) if (survey != null)
{ {
@ -247,7 +228,7 @@ namespace DamageAssesment.Api.Responses.Providers
try try
{ {
logger?.LogInformation("Querying to get Survey object from microservice"); 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) if (survey != null)
{ {
@ -278,8 +259,8 @@ namespace DamageAssesment.Api.Responses.Providers
try try
{ {
logger?.LogInformation("Querying to get Survey object from microservice"); logger?.LogInformation("Querying to get Survey object from microservice");
var survey = await surveyServiceProvider.getSurveyAsync(surveyId, token); var survey = await surveyServiceProvider.getSurveyAsync(surveyId);
var question = await questionServiceProvider.getQuestionsAsync(questionId, token); var question = await questionServiceProvider.getQuestionsAsync(questionId);
bool IsCorrectAnswer = answer.ToLower().Equals("yes") || answer.ToLower().Equals("no") ? true : false; bool IsCorrectAnswer = answer.ToLower().Equals("yes") || answer.ToLower().Equals("no") ? true : false;
@ -436,11 +417,11 @@ namespace DamageAssesment.Api.Responses.Providers
} }
//Method to get Answers by region with surveyId as input parameter //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 try
{ {
var answersList = await answerServiceProvider.getAnswersAsync(token); var answersList = await answerServiceProvider.getAnswersAsync();
if (answersList == null || !answersList.Any()) if (answersList == null || !answersList.Any())
return null; return null;
@ -463,8 +444,8 @@ namespace DamageAssesment.Api.Responses.Providers
if (surveyAnswers == null || !surveyAnswers.Any()) if (surveyAnswers == null || !surveyAnswers.Any())
return null; return null;
var regions = await regionServiceProvider.getRegionsAsync(token); var regions = await regionServiceProvider.getRegionsAsync();
var locations = await locationServiceProvider.getLocationsAsync(token); var locations = await locationServiceProvider.getLocationsAsync();
if (regions == null || !regions.Any() || locations == null || !locations.Any()) if (regions == null || !regions.Any() || locations == null || !locations.Any())
return null; return null;
@ -526,22 +507,24 @@ namespace DamageAssesment.Api.Responses.Providers
{ {
try try
{ {
var employee = await employeeServiceProvider.getEmployeeAsync(surveyResponse.EmployeeId, token); var employee = await employeeServiceProvider.getEmployeeAsync(surveyResponse.EmployeeId);
var answers = await answerServiceProvider.GetAnswersByResponseIdAsync(surveyResponse.Id, token); var answers = await answerServiceProvider.GetAnswersByResponseIdAsync(surveyResponse.Id);
var allQuestions = await questionServiceProvider.getQuestionsAsync(null, token); var allQuestions = await questionServiceProvider.getQuestionsAsync(null);
var questions = allQuestions.Where(s => s.SurveyId == surveyResponse.SurveyId); var questions = allQuestions.Where(s => s.SurveyId == surveyResponse.SurveyId);
var attachments = await attachmentServiceProvider.getAttachmentsAsync(token); var attachments = await attachmentServiceProvider.getAttachmentsAsync();
var Locations = await locationServiceProvider.getLocationsAsync();
var result = new var location = Locations.Where(a => a.Id == surveyResponse.LocationId).FirstOrDefault();
{ var result = new{
surveyResponse.Id, surveyResponse.Id,
surveyResponse.SurveyId, surveyResponse.SurveyId,
surveyResponse.LocationId, surveyResponse.LocationId,
surveyResponse.EmployeeId, surveyResponse.EmployeeId,
surveyResponse.ClientDevice, surveyResponse.ClientDevice,
surveyResponse.KeyAnswerResult, surveyResponse.KeyAnswerResult,
surveyResponse.Longitute, DataValue=(location!=null?location.DataValue:0),
surveyResponse.Latitude, Enrollment= (location != null ? location.Enrollment : 0),
Longitute = (location != null ? location.Longitute : surveyResponse.Longitute),
Latitude=(location != null ? location.Latitude : surveyResponse.Latitude),
Employee = employee, Employee = employee,
answers = from ans in answers answers = from ans in answers
select new select new
@ -575,52 +558,92 @@ namespace DamageAssesment.Api.Responses.Providers
if (employeeid == 0) if (employeeid == 0)
{ {
surveyResonses = await surveyResponseDbContext.SurveyResponses.Where(x => x.SurveyId == surveyId).ToListAsync(); surveyResonses = await surveyResponseDbContext.SurveyResponses.Where(x => x.SurveyId == surveyId).ToListAsync();
employees = await employeeServiceProvider.getEmployeesAsync(token); employees = await employeeServiceProvider.getEmployeesAsync();
} }
else else
{ {
surveyResonses = await surveyResponseDbContext.SurveyResponses.Where(x => x.SurveyId == surveyId && x.EmployeeId == employeeid).ToListAsync(); 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) var answers = await answerServiceProvider.getAnswersAsync();
.GroupBy(obj => new { obj.SurveyId, obj.LocationId })//obj.EmployeeId, var questions = await questionServiceProvider.getQuestionsAsync(null);
.Select(group => group.FirstOrDefault()) // or .FirstOrDefault() if you want to handle empty groups var Locations = await locationServiceProvider.getLocationsAsync();
.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 surveyQuestions = from q in questions where q.SurveyId == surveyId select q;
//var surveyQuestions = await questionServiceProvider.getSurveyQuestionsAsync(surveyId); //var surveyQuestions = await questionServiceProvider.getSurveyQuestionsAsync(surveyId);
var attachments = await attachmentServiceProvider.getAttachmentsAsync(token); var attachments = await attachmentServiceProvider.getAttachmentsAsync();
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 }
} if (employeeid == 0)
}; {
return result; 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) catch (Exception ex)
{ {
@ -642,12 +665,12 @@ namespace DamageAssesment.Api.Responses.Providers
if (employeeid == 0) if (employeeid == 0)
{ {
surveyResonses = await surveyResponseDbContext.SurveyResponses.ToListAsync(); surveyResonses = await surveyResponseDbContext.SurveyResponses.ToListAsync();
employees = await employeeServiceProvider.getEmployeesAsync(token); employees = await employeeServiceProvider.getEmployeesAsync();
} }
else else
{ {
surveyResonses = await surveyResponseDbContext.SurveyResponses.Where(x => x.EmployeeId == employeeid).ToListAsync(); surveyResonses = await surveyResponseDbContext.SurveyResponses.Where(x => x.EmployeeId == employeeid).ToListAsync();
employee = await employeeServiceProvider.getEmployeeAsync(employeeid, token); employee = await employeeServiceProvider.getEmployeeAsync(employeeid);
if (employee != null) if (employee != null)
{ {
@ -656,11 +679,13 @@ namespace DamageAssesment.Api.Responses.Providers
} }
var answers = await answerServiceProvider.getAnswersAsync(token); var answers = await answerServiceProvider.getAnswersAsync();
var questions = await questionServiceProvider.getQuestionsAsync(null, token); var questions = await questionServiceProvider.getQuestionsAsync(null);
var attachments = await attachmentServiceProvider.getAttachmentsAsync(token); var attachments = await attachmentServiceProvider.getAttachmentsAsync();
var Locations = await locationServiceProvider.getLocationsAsync();
var result = from r in surveyResonses var result = from r in surveyResonses
join loc in Locations on r.LocationId equals loc.Id
select new select new
{ {
r.Id, r.Id,
@ -669,8 +694,10 @@ namespace DamageAssesment.Api.Responses.Providers
r.EmployeeId, r.EmployeeId,
r.ClientDevice, r.ClientDevice,
r.KeyAnswerResult, r.KeyAnswerResult,
r.Longitute, loc.DataValue,
r.Latitude, 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(), 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 answers = from ans in answers
where ans.SurveyResponseId == r.Id where ans.SurveyResponseId == r.Id
@ -685,6 +712,8 @@ namespace DamageAssesment.Api.Responses.Providers
} }
}; };
return result; return result;
} }
catch (Exception ex) catch (Exception ex)
{ {
@ -700,12 +729,12 @@ namespace DamageAssesment.Api.Responses.Providers
if (string.IsNullOrEmpty(language)) language = "en"; if (string.IsNullOrEmpty(language)) language = "en";
List<Db.SurveyResponse> surveyResonses; List<Db.SurveyResponse> surveyResonses;
surveyResonses = await surveyResponseDbContext.SurveyResponses.Where(a => a.SurveyId == surveyId).ToListAsync(); surveyResonses = await surveyResponseDbContext.SurveyResponses.Where(a => a.SurveyId == surveyId).ToListAsync();
var answers = await answerServiceProvider.getAnswersAsync(token); var answers = await answerServiceProvider.getAnswersAsync();
var Locations = await locationServiceProvider.getLocationsAsync(token); var Locations = await locationServiceProvider.getLocationsAsync();
var regions = await regionServiceProvider.getRegionsAsync(token); var regions = await regionServiceProvider.getRegionsAsync();
var questions = await questionServiceProvider.getQuestionsAsync(language, token); var questions = await questionServiceProvider.getQuestionsAsync(language);
var categories = await questionServiceProvider.GetQuestionCategoriesAsync(language, token); var categories = await questionServiceProvider.GetQuestionCategoriesAsync(language);
var attachments = await attachmentServiceProvider.getAttachmentsAsync(token); var attachments = await attachmentServiceProvider.getAttachmentsAsync();
List<object> questionLists = new List<object>(); List<object> questionLists = new List<object>();
var allques = from res in surveyResonses var allques = from res in surveyResonses
join loc in Locations on res.LocationId equals loc.Id join loc in Locations on res.LocationId equals loc.Id
@ -837,8 +866,8 @@ namespace DamageAssesment.Api.Responses.Providers
{ {
surveyResponses = await surveyResponseDbContext.SurveyResponses.Where(x => x.SurveyId == surveyId && x.EmployeeId == employeeid).ToListAsync(); surveyResponses = await surveyResponseDbContext.SurveyResponses.Where(x => x.SurveyId == surveyId && x.EmployeeId == employeeid).ToListAsync();
} }
var answers = await answerServiceProvider.getAnswersAsync(token); var answers = await answerServiceProvider.getAnswersAsync();
var locations = await locationServiceProvider.getLocationsAsync(token); var locations = await locationServiceProvider.getLocationsAsync();
var maintenanceCenters = locations.DistinctBy(m => m.MaintenanceCenter); var maintenanceCenters = locations.DistinctBy(m => m.MaintenanceCenter);
//get all the answers for the particular survey //get all the answers for the particular survey
@ -904,29 +933,27 @@ namespace DamageAssesment.Api.Responses.Providers
if (employeeid == 0) if (employeeid == 0)
{ {
surveyResonses = await surveyResponseDbContext.SurveyResponses.Where(x => x.SurveyId == surveyId && x.LocationId == locationId).ToListAsync(); surveyResonses = await surveyResponseDbContext.SurveyResponses.Where(x => x.SurveyId == surveyId && x.LocationId == locationId).ToListAsync();
employees = await employeeServiceProvider.getEmployeesAsync(token); employees = await employeeServiceProvider.getEmployeesAsync();
} }
else else
{ {
surveyResonses = await surveyResponseDbContext.SurveyResponses.Where(x => x.SurveyId == surveyId && x.EmployeeId == employeeid && x.LocationId == locationId).ToListAsync(); 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) if (employee != null)
{ {
_employee = new { employee.Id, employee.Name, employee.BirthDate, employee.Email, employee.OfficePhoneNumber }; _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 var result = from r in surveyResonses
join loc in Locations on r.LocationId equals loc.Id
select new select new
{ {
r.Id, r.Id,
@ -935,9 +962,11 @@ namespace DamageAssesment.Api.Responses.Providers
r.EmployeeId, r.EmployeeId,
r.ClientDevice, r.ClientDevice,
r.KeyAnswerResult, r.KeyAnswerResult,
r.Longitute, loc.DataValue,
r.Latitude, loc.Enrollment,
Employee = (from e in employees where r.EmployeeId == e.Id select new { e.Id, e.Name, e.BirthDate, e.Email, e.OfficePhoneNumber }).SingleOrDefault(), 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 answers = from ans in answers
where ans.SurveyResponseId == r.Id where ans.SurveyResponseId == r.Id
@ -952,6 +981,7 @@ namespace DamageAssesment.Api.Responses.Providers
} }
}; };
return result; return result;
} }
catch (Exception ex) catch (Exception ex)
{ {
@ -974,29 +1004,26 @@ namespace DamageAssesment.Api.Responses.Providers
if (employeeid == 0) if (employeeid == 0)
{ {
surveyResponses = await surveyResponseDbContext.SurveyResponses.Where(x => x.SurveyId == survey.Id).ToListAsync(); surveyResponses = await surveyResponseDbContext.SurveyResponses.Where(x => x.SurveyId == survey.Id).ToListAsync();
employees = await employeeServiceProvider.getEmployeesAsync(token); employees = await employeeServiceProvider.getEmployeesAsync();
} }
else else
{ {
surveyResponses = await surveyResponseDbContext.SurveyResponses.Where(x => x.SurveyId == survey.Id && x.EmployeeId == employeeid).ToListAsync(); 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) if (employee != null)
{ {
_employee = new { employee.Id, employee.Name, employee.BirthDate, employee.Email, employee.OfficePhoneNumber }; _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 surveyResponses = await surveyResponseDbContext.Responses.Where(x => x.SurveyId == survey.Id).ToListAsync();
// var employees = await employeeServiceProvider.getEmployeesAsync(); // var employees = await employeeServiceProvider.getEmployeesAsync();
var answers = await answerServiceProvider.getAnswersAsync(token); var answers = await answerServiceProvider.getAnswersAsync();
var attachments = await attachmentServiceProvider.getAttachmentsAsync(token); var attachments = await attachmentServiceProvider.getAttachmentsAsync();
var Locations = await locationServiceProvider.getLocationsAsync();
var result = from r in surveyResponses var result = from r in surveyResponses
join loc in Locations on r.LocationId equals loc.Id
select new select new
{ {
r.Id, r.Id,
@ -1005,9 +1032,11 @@ namespace DamageAssesment.Api.Responses.Providers
r.EmployeeId, r.EmployeeId,
r.ClientDevice, r.ClientDevice,
r.KeyAnswerResult, r.KeyAnswerResult,
r.Longitute, loc.DataValue,
r.Latitude, loc.Enrollment,
Employee = (from e in employees where r.EmployeeId == e.Id select new { e.Id, e.Name, e.BirthDate, e.Email, e.OfficePhoneNumber }).SingleOrDefault(), 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 answers = from ans in answers
where ans.SurveyResponseId == r.Id where ans.SurveyResponseId == r.Id
&& ans.QuestionId == question.Id && ans.QuestionId == question.Id
@ -1037,12 +1066,12 @@ namespace DamageAssesment.Api.Responses.Providers
{ {
if (answerRequest != null) 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) if (answer != null)
{ {
List<AnswerInfo> listAnswerInfo = new List<AnswerInfo>(); List<AnswerInfo> listAnswerInfo = new List<AnswerInfo>();
listAnswerInfo.Add(new AnswerInfo { AnswerId = answer.Id, postedFiles = answerRequest.PostedFiles }); 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"; string message = $"Answer for question {answerRequest.QuestionId} saved to the database";
logger?.LogInformation(message); logger?.LogInformation(message);
@ -1063,6 +1092,7 @@ namespace DamageAssesment.Api.Responses.Providers
} }
} }
public async Task<(bool IsSuccess, Models.SurveyResponse SurveyResponse, string ErrorMessage)> PostSurveyAnswersAsync(Models.Request request) public async Task<(bool IsSuccess, Models.SurveyResponse SurveyResponse, string ErrorMessage)> PostSurveyAnswersAsync(Models.Request request)
{ {
try try

View File

@ -1,6 +1,5 @@
using DamageAssesment.Api.Responses.Interfaces; using DamageAssesment.Api.Responses.Interfaces;
using DamageAssesment.Api.Responses.Models; using DamageAssesment.Api.Responses.Models;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json; 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 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 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); var answers = JsonConvert.DeserializeObject<List<Answer>>(responseJsonString);
if (answers == null || !answers.Any()) 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 try
{ {
url = urlBase + string.Format(configuration.GetValue<string>("RessourceSettings:AnswerByResponse"), responseId); 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); var answers = JsonConvert.DeserializeObject<List<Answer>>(responseJsonString);
if (answers == null || !answers.Any()) 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 try
{ {
var requestJsonString = JsonConvert.SerializeObject(answer); 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); var answers = JsonConvert.DeserializeObject<Answer>(responseJsonString);
if (answers == null) 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 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); var attachments = JsonConvert.DeserializeObject<List<Attachment>>(responseJsonString);
if (attachments == null || !attachments.Any()) 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 try
{ {
var requestJsonString = JsonConvert.SerializeObject(attachmentInfo); 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); var attachments = JsonConvert.DeserializeObject<IEnumerable<Attachment>>(responseJsonString);
if (attachments == null) 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 DamageAssesment.Api.Responses.Models;
using Microsoft.AspNetCore.Mvc.Routing; using Microsoft.AspNetCore.Mvc.Routing;
using Newtonsoft.Json; 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 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); var employees = JsonConvert.DeserializeObject<List<Employee>>(responseJsonString);
if (employees == null || !employees.Any()) 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 try
{ {
url = urlBase + string.Format(configuration.GetValue<string>("RessourceSettings:EmployeeById"), employeeId); 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); var employee = JsonConvert.DeserializeObject<Employee>(responseJsonString);
if (employee == null) if (employee == null)

View File

@ -1,5 +1,4 @@
using DamageAssesment.Api.Responses.Interfaces; using DamageAssesment.Api.Responses.Interfaces;
using DamageAssesment.Api.Responses.Models;
using System.Net.Http.Headers; using System.Net.Http.Headers;
using System.Text; using System.Text;
@ -15,18 +14,20 @@ namespace DamageAssesment.Api.Responses.Services
this.httpClient = httpClient; this.httpClient = httpClient;
this.logger = logger; 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 try
{ {
var request = new HttpRequestMessage(method, url); var request = new HttpRequestMessage(method, url);
request.Headers.Accept.Clear(); request.Headers.Accept.Clear();
request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 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) if (method == HttpMethod.Post)
{ {
request.Content = new StringContent(JsonInput, Encoding.UTF8, "application/json"); request.Content = new StringContent(JsonInput, Encoding.UTF8, "application/json");
} }
var response = await httpClient.SendAsync(request, CancellationToken.None); var response = await httpClient.SendAsync(request, CancellationToken.None);
response.EnsureSuccessStatusCode(); response.EnsureSuccessStatusCode();
var responseString = await response.Content.ReadAsStringAsync(); 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 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); var locations = JsonConvert.DeserializeObject<List<Location>>(responseJsonString);
if (locations == null || !locations.Any()) 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 try
{ {
if (!string.IsNullOrEmpty(language)) if (!string.IsNullOrEmpty(language))
url = url + "/" + 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); var questions = JsonConvert.DeserializeObject<List<Question>>(responseJsonString);
if (questions == null || !questions.Any()) if (questions == null || !questions.Any())
@ -29,15 +29,15 @@ namespace DamageAssesment.Api.Responses.Services
return new List<Question>(); return new List<Question>();
} }
} }
public async Task<List<QuestionCategory>> GetQuestionCategoriesAsync(string? language, string token) public async Task<List<QuestionCategory>> GetQuestionCategoriesAsync(string? language)
{ {
try try
{ {
url = urlBase + configuration.GetValue<string>("RessourceSettings:QuestionCategory"); url = urlBase + configuration.GetValue<string>("RessourceSettings:QuestionCategory");
if (!string.IsNullOrEmpty(language)) if (!string.IsNullOrEmpty(language))
url = url + "/" + 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); var questions = JsonConvert.DeserializeObject<List<QuestionCategory>>(responseJsonString);
if (questions == null || !questions.Any()) if (questions == null || !questions.Any())
@ -50,12 +50,13 @@ namespace DamageAssesment.Api.Responses.Services
return new List<QuestionCategory>(); return new List<QuestionCategory>();
} }
} }
public async Task<List<SurveyQuestions>> getSurveyQuestionsAsync(int surveyId, string token)
public async Task<List<SurveyQuestions>> getSurveyQuestionsAsync(int surveyId)
{ {
try try
{ {
url = urlBase + string.Format(configuration.GetValue<string>("RessourceSettings:SurveyQuestion"), surveyId); 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); var questions = JsonConvert.DeserializeObject<List<SurveyQuestions>>(responseJsonString);
if (questions == null || !questions.Any()) 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 try
{ {
url = urlBase + string.Format(configuration.GetValue<string>("RessourceSettings:QuestionById"), questionId); 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); var question = JsonConvert.DeserializeObject<Question>(responseJsonString);
if (question == null) 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 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 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); var regions = JsonConvert.DeserializeObject<List<Region>>(responseJsonString);
if (regions == null || !regions.Any()) if (regions == null || !regions.Any())

View File

@ -4,19 +4,19 @@ using Newtonsoft.Json;
namespace DamageAssesment.Api.Responses.Services 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 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 try
{ {
if (!string.IsNullOrEmpty(language)) if (!string.IsNullOrEmpty(language))
url = url + "/" + 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); var surveys = JsonConvert.DeserializeObject<List<Survey>>(responseJsonString);
if (surveys == null || !surveys.Any()) 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 try
{ {
url = urlBase + string.Format(configuration.GetValue<string>("RessourceSettings:SurveyById"), surveyId); 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); var survey = JsonConvert.DeserializeObject<Survey>(responseJsonString);
if (survey == null ) if (survey == null)
return null; return null;
else return survey; else return survey;
} }

View File

@ -6,13 +6,7 @@
} }
}, },
"AllowedHosts": "*", "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": { //"EndPointSettings": {
// "AnswerUrlBase": "http://localhost:5200", // "AnswerUrlBase": "http://localhost:5200",
// "LocationUrlBase": "http://localhost:5213", // "LocationUrlBase": "http://localhost:5213",
@ -22,6 +16,7 @@
// "AttachmentUrlBase": "http://localhost:5243", // "AttachmentUrlBase": "http://localhost:5243",
// "SurveyUrlBase": "http://localhost:5009" // "SurveyUrlBase": "http://localhost:5009"
//}, //},
//Endpoints for docker-container
"EndPointSettings": { "EndPointSettings": {
"AnswerUrlBase": "http://damageassesment.api.answers:80", "AnswerUrlBase": "http://damageassesment.api.answers:80",
"LocationUrlBase": "http://damageassesment.api.locations:80", "LocationUrlBase": "http://damageassesment.api.locations:80",
@ -45,5 +40,10 @@
"AnswerByResponse": "/answers/byresponse/{0}", "AnswerByResponse": "/answers/byresponse/{0}",
"Location": "/locations", "Location": "/locations",
"Region": "/regions" "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

@ -1,5 +1,4 @@
using DamageAssesment.Api.Surveys.Interfaces; using DamageAssesment.Api.Surveys.Interfaces;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
namespace DamageAssesment.Api.Surveys.Controllers namespace DamageAssesment.Api.Surveys.Controllers
@ -16,7 +15,6 @@ namespace DamageAssesment.Api.Surveys.Controllers
/// <summary> /// <summary>
/// GET request for retrieving surveys. /// GET request for retrieving surveys.
/// </summary> /// </summary>
[Authorize(Roles ="admin,survey,user,report")]
[Route("surveys")] [Route("surveys")]
[Route("surveys/{language:alpha}")] [Route("surveys/{language:alpha}")]
[HttpGet] [HttpGet]
@ -33,7 +31,6 @@ namespace DamageAssesment.Api.Surveys.Controllers
/// <summary> /// <summary>
/// GET request for retrieving surveys by ID. /// GET request for retrieving surveys by ID.
/// </summary> /// </summary>
[Authorize(Roles = "admin,survey,user,report")]
[Route("surveys/{id:int}")] [Route("surveys/{id:int}")]
[Route("surveys/{id:int}/{language:alpha}")] [Route("surveys/{id:int}/{language:alpha}")]
[HttpGet] [HttpGet]
@ -49,7 +46,6 @@ namespace DamageAssesment.Api.Surveys.Controllers
/// <summary> /// <summary>
/// POST request for creating a new survey. /// POST request for creating a new survey.
/// </summary> /// </summary>
[Authorize(Roles = "admin,survey,user,report")]
[HttpPost("surveys")] [HttpPost("surveys")]
public async Task<ActionResult> PostSurveysAsync(Models.Survey survey) public async Task<ActionResult> PostSurveysAsync(Models.Survey survey)
{ {
@ -63,8 +59,6 @@ namespace DamageAssesment.Api.Surveys.Controllers
/// <summary> /// <summary>
/// PUT request for updating an existing survey (surveyId,Updated Survey data). /// PUT request for updating an existing survey (surveyId,Updated Survey data).
/// </summary> /// </summary>
[Authorize(Roles = "admin,survey")]
[HttpPut("surveys/{id}")] [HttpPut("surveys/{id}")]
public async Task<ActionResult> PutSurveysAsync(int id, Models.Survey survey) public async Task<ActionResult> PutSurveysAsync(int id, Models.Survey survey)
{ {
@ -82,7 +76,6 @@ namespace DamageAssesment.Api.Surveys.Controllers
/// <summary> /// <summary>
/// DELETE request for deleting a survey by ID. /// DELETE request for deleting a survey by ID.
/// </summary> /// </summary>
[Authorize(Roles = "admin,survey")]
[HttpDelete("surveys/{id}")] [HttpDelete("surveys/{id}")]
public async Task<ActionResult> DeleteSurveysAsync(int id) public async Task<ActionResult> DeleteSurveysAsync(int id)
{ {

View File

@ -6,7 +6,6 @@ using Microsoft.EntityFrameworkCore;
using Microsoft.IdentityModel.Tokens; using Microsoft.IdentityModel.Tokens;
using System.Text; using System.Text;
using System.Reflection; using System.Reflection;
using Microsoft.OpenApi.Models;
var builder = WebApplication.CreateBuilder(args); var builder = WebApplication.CreateBuilder(args);
@ -35,44 +34,14 @@ builder.Services.AddControllers();
builder.Services.AddScoped<ISurveyProvider, SurveysProvider>(); builder.Services.AddScoped<ISurveyProvider, SurveysProvider>();
builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies()); builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());
builder.Services.AddEndpointsApiExplorer(); builder.Services.AddEndpointsApiExplorer();
//builder.Services.AddSwaggerGen();
builder.Services.AddSwaggerGen(options => builder.Services.AddSwaggerGen(c =>
{ {
// Include XML comments from your assembly // Include XML comments from your assembly
var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"; var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile); var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
options.IncludeXmlComments(xmlPath); c.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);
}); });
builder.Services.AddDbContext<SurveysDbContext>(option => builder.Services.AddDbContext<SurveysDbContext>(option =>
{ {
option.UseSqlServer("SurveyConnection"); option.UseSqlServer("SurveyConnection");

View File

@ -110,6 +110,7 @@ namespace DamageAssesment.Api.Surveys.Providers
logger?.LogInformation("Get all Surveys from DB"); logger?.LogInformation("Get all Surveys from DB");
//checking is enabled in survey response //checking is enabled in survey response
var surveys = await surveyDbContext.Surveys.ToListAsync();//Where(s => s.IsEnabled == true) var surveys = await surveyDbContext.Surveys.ToListAsync();//Where(s => s.IsEnabled == true)
if (surveys != null) if (surveys != null)
{ {
surveysList = from s in surveys surveysList = from s in surveys
@ -178,11 +179,6 @@ namespace DamageAssesment.Api.Surveys.Providers
{ {
if (survey != null) 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; survey.CreatedDate = DateTime.Now;
Db.Survey _survey = mapper.Map<Models.Survey, Db.Survey>(survey); Db.Survey _survey = mapper.Map<Models.Survey, Db.Survey>(survey);
@ -219,11 +215,6 @@ namespace DamageAssesment.Api.Surveys.Providers
{ {
if (survey != null) 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(); var _survey = await surveyDbContext.Surveys.AsNoTracking().Where(s => s.Id == Id).SingleOrDefaultAsync();
if (_survey != null) if (_survey != null)

View File

@ -11,7 +11,7 @@
"AllowedHosts": "*", "AllowedHosts": "*",
"ConnectionStrings": { "ConnectionStrings": {
//"SurveyConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;" //"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;" "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("Emp1")).ReturnsAsync(response);
var controller = new UsersAccessController(mockService.Object);
var result = (OkObjectResult)await controller.AuthenticateAsync("Emp1");
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("Emp1")).ReturnsAsync(response);
var controller = new UsersAccessController(mockService.Object);
var result = (UnauthorizedObjectResult)await controller.AuthenticateAsync("Emp1");
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,127 +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 IUsersAccessProvider userAccessProvider;
public UsersAccessController(IUsersAccessProvider userAccessProvider)
{
this.userAccessProvider = userAccessProvider;
}
[HttpPost("dadeschooltoken")]
public async Task<ActionResult> DadeSchoolAuthenticateAsync(string username, string password)
{
var result = await userAccessProvider.DadeSchoolAuthenticateAsync(username, password);
if (result.IsSuccess)
{
return Ok(result.TokenResponse);
}
return Unauthorized(result.ErrorMessage);
}
[Authorize(Policy = "Dadeschools")]
[HttpPost("token/{employecode}")]
public async Task<ActionResult> AuthenticateAsync(string employecode)
{
var result = await userAccessProvider.AuthenticateAsync(employecode);
if (result.IsSuccess)
{
return Ok(result.TokenResponse);
}
return Unauthorized(result.ErrorMessage);
}
[Authorize(Policy = "Dadeschools")]
[HttpPost("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,32 +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" />
</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();
Task<Employee> getEmployeeAsync(int employeeId);
}
}

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,11 +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);
}
}

View File

@ -1,18 +0,0 @@
using DamageAssesment.Api.UsersAccess.Models;
namespace DamageAssesment.Api.UsersAccess.Interfaces
{
public interface IUsersAccessProvider
{
public Task<(bool IsSuccess, IEnumerable< Models.User> Users, string ErrorMessage)> GetUsersAsync();
public Task<(bool IsSuccess, Models.User 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(string employeCode);
public Task<(bool IsSuccess, Models.DadeSchoolToken TokenResponse, string ErrorMessage)> DadeSchoolAuthenticateAsync(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);
}
}

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,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; }
}
}

View File

@ -1,8 +0,0 @@
namespace DamageAssesment.Api.UsersAccess.Models
{
public class TokenResponse
{
public string? jwttoken { get; set; }
public string? refreshtoken { get; set; }
}
}

View File

@ -1,13 +0,0 @@
namespace DamageAssesment.Api.UsersAccess.Models
{
public class User
{
public int Id { get; set; }
public int EmployeeId { get; set; }
public string EmployeeCode { get; set; }
public int RoleId { get; set; }
public bool IsActive { get; set; }
public DateTime CreateDate { get; set; }
public DateTime UpdateDate { get; set; }
}
}

View File

@ -1,5 +0,0 @@
public class UserCredentials
{
public string username { get; set; }
// public string? password { get; set; }
}

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