implementation of Authentication using JWT. Security applied on all microservices endpoints.

This commit is contained in:
Reginald Cherenfant Jasmin
2023-09-20 00:32:30 -04:00
parent 8d386af40a
commit 77816605d1
75 changed files with 1744 additions and 219 deletions

View File

@ -3,6 +3,7 @@ using DamageAssesment.Api.SurveyResponses.Models;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using System.IdentityModel.Tokens.Jwt;
namespace DamageAssesment.Api.SurveyResponses.Controllers
{
@ -10,10 +11,20 @@ namespace DamageAssesment.Api.SurveyResponses.Controllers
public class SurveyResponsesController : ControllerBase
{
private readonly ISurveysResponse surveyResponseProvider;
public SurveyResponsesController(ISurveysResponse surveyResponseProvider)
private string token;
private readonly IHttpContextAccessor httpContextAccessor;
public SurveyResponsesController(ISurveysResponse surveyResponseProvider, IHttpContextAccessor httpContextAccessor)
{
this.surveyResponseProvider = surveyResponseProvider;
this.httpContextAccessor = httpContextAccessor;
token = httpContextAccessor.HttpContext.Request.Headers.Authorization;
if (token != null)
{
token = token.Replace("Bearer ", string.Empty);
} else
{
token = "";
}
}
/// <summary>
/// GET request for retrieving survey responses.
@ -22,7 +33,7 @@ namespace DamageAssesment.Api.SurveyResponses.Controllers
[HttpGet("Responses")]
public async Task<ActionResult> GetSurveyResponsesAsync()
{
var result = await this.surveyResponseProvider.GetSurveyResponsesAsync();
var result = await this.surveyResponseProvider.GetSurveyResponsesAsync(token);
if (result.IsSuccess)
{
return Ok(result.surveyResponses);
@ -36,11 +47,11 @@ namespace DamageAssesment.Api.SurveyResponses.Controllers
/// <summary>
/// GET request for retrieving survey responses by survey ID.
/// </summary>
[HttpGet("Responses/BySurvey/{surveyid}")]
public async Task<ActionResult> GetSurveyResponsesAsync(int surveyid)
{
var result = await this.surveyResponseProvider.GetSurveyResponsesBySurveyAsync(surveyid);
var result = await this.surveyResponseProvider.GetSurveyResponsesBySurveyAsync(surveyid, token);
if (result.IsSuccess)
{
return Ok(result.SurveyResponses);
@ -56,7 +67,7 @@ namespace DamageAssesment.Api.SurveyResponses.Controllers
[HttpGet("Responses/{surveyid}/{locationid}")]
public async Task<ActionResult> GetSurveyResponsesBySurveyAndLocationAsync(int surveyid, int locationid)
{
var result = await this.surveyResponseProvider.GetSurveyResponsesBySurveyAndLocationAsync(surveyid, locationid);
var result = await this.surveyResponseProvider.GetSurveyResponsesBySurveyAndLocationAsync(surveyid, locationid, token);
if (result.IsSuccess)
{
return Ok(result.SurveyResponses);
@ -73,8 +84,8 @@ namespace DamageAssesment.Api.SurveyResponses.Controllers
[HttpGet("Responses/ByAnswer/{surveyid}/{questionid}/{answer}")]
public async Task<ActionResult> GetSurveyResponsesByAnswerAsyncAsync(int surveyid, int questionid, string answer)
{
var result = await surveyResponseProvider.GetResponsesByAnswerAsync(surveyid, questionid, answer);
{
var result = await surveyResponseProvider.GetResponsesByAnswerAsync(surveyid, questionid, answer, token);
if (result.IsSuccess)
{
return Ok(result.SurveyResponses);
@ -90,7 +101,7 @@ namespace DamageAssesment.Api.SurveyResponses.Controllers
[HttpGet("Responses/ByRegion/{surveyid}")]
public async Task<ActionResult> GetAnswersByRegionAsync(int surveyid)
{
var result = await this.surveyResponseProvider.GetAnswersByRegionAsync(surveyid);
var result = await this.surveyResponseProvider.GetAnswersByRegionAsync(surveyid, token);
if (result.IsSuccess)
{
return Ok(result.Answers);
@ -105,7 +116,7 @@ namespace DamageAssesment.Api.SurveyResponses.Controllers
[HttpGet("Responses/ByMaintenanceCenter/{surveyid}")]
public async Task<ActionResult> GetAnswersByMaintenaceCentersync(int surveyid)
{
var result = await this.surveyResponseProvider.GetSurveyResponsesByMaintenanceCenterAsync(surveyid);
var result = await this.surveyResponseProvider.GetSurveyResponsesByMaintenanceCenterAsync(surveyid, token);
if (result.IsSuccess)
{
return Ok(result.SurveyResponses);
@ -120,7 +131,7 @@ namespace DamageAssesment.Api.SurveyResponses.Controllers
[HttpGet("Responses/{id}")]
public async Task<ActionResult> GetSurveyResponseByIdAsync(int id)
{
var result = await this.surveyResponseProvider.GetSurveyResponseByIdAsync(id);
var result = await this.surveyResponseProvider.GetSurveyResponseByIdAsync(id, token);
if (result.IsSuccess)
{
return Ok(result.SurveyResponse);
@ -165,7 +176,7 @@ namespace DamageAssesment.Api.SurveyResponses.Controllers
/// <summary>
/// DELETE request for deleting an existing survey response.
/// </summary>
[HttpDelete("Responses/{id}")]
public async Task<ActionResult> DeleteSurveyResponseAsync(int id)
{
@ -184,7 +195,7 @@ namespace DamageAssesment.Api.SurveyResponses.Controllers
[HttpPost("Responses/Answers")]
public async Task<ActionResult> PostSurveyAnswersAsync(Request request)
{
var result = await this.surveyResponseProvider.PostSurveyAnswersAsync(request);
var result = await this.surveyResponseProvider.PostSurveyAnswersAsync(request, token);
if (result.IsSuccess)
return Ok(result.SurveyResponse);

View File

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

View File

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

View File

@ -4,7 +4,7 @@ namespace DamageAssesment.Api.SurveyResponses.Interfaces
{
public interface IEmployeeServiceProvider
{
Task<List<Employee>> getEmployeesAsync();
Task<Employee> getEmployeeAsync(int employeeId);
Task<List<Employee>> getEmployeesAsync(string token);
Task<Employee> getEmployeeAsync(int employeeId, string token);
}
}

View File

@ -4,6 +4,6 @@ namespace DamageAssesment.Api.SurveyResponses.Interfaces
{
public interface IHttpUtil
{
Task<string> SendAsync(HttpMethod method, string url, string JsonInput);
Task<string> SendAsync(HttpMethod method, string url, string JsonInput, string token);
}
}

View File

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

View File

@ -4,8 +4,8 @@ namespace DamageAssesment.Api.SurveyResponses.Interfaces
{
public interface IQuestionServiceProvider
{
Task<List<Question>> getQuestionsAsync();
Task<List<SurveyQuestions>> getSurveyQuestionsAsync(int surveyId);
Task<Question> getQuestionsAsync(int questionId);
Task<List<Question>> getQuestionsAsync(string token);
Task<List<SurveyQuestions>> getSurveyQuestionsAsync(int surveyId, string token);
Task<Question> getQuestionsAsync(int questionId, string token);
}
}

View File

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

View File

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

View File

@ -5,19 +5,19 @@ namespace DamageAssesment.Api.SurveyResponses.Interfaces
{
public interface ISurveysResponse
{
Task<(bool IsSuccess, dynamic Answers, string ErrorMessage)> GetAnswersByRegionAsync(int surveyId);
Task<(bool IsSuccess, dynamic Answers, string ErrorMessage)> GetAnswersByRegionAsync(int surveyId, string token);
Task<(bool IsSuccess, Models.SurveyResponse SurveyResponse, string ErrorMessage)> PostSurveyResponseAsync(Models.SurveyResponse surveyResponse);
// Task<(bool IsSuccess,dynamic surveyResponses, string ErrorMessage)> GetSurveyResponseAsync(int responseId);
Task<(bool IsSuccess, dynamic surveyResponses, string ErrorMessage)> GetSurveyResponsesAsync();
Task<(bool IsSuccess, dynamic surveyResponses, string ErrorMessage)> GetSurveyResponsesAsync(string token);
Task<(bool IsSuccess, Models.SurveyResponse SurveyResponse, string ErrorMessage)> PutSurveyResponseAsync(int Id, Models.SurveyResponse surveyResponse);
Task<(bool IsSuccess, Models.SurveyResponse SurveyResponse, string ErrorMessage)> DeleteSurveyResponseAsync(int Id);
Task<(bool IsSuccess, dynamic SurveyResponse, string ErrorMessage)> GetSurveyResponseByIdAsync(int responseId);
Task<(bool IsSuccess, dynamic SurveyResponses, string ErrorMessage)> GetSurveyResponsesBySurveyAsync(int surveyId);
Task<(bool IsSuccess, dynamic SurveyResponses, string ErrorMessage)> GetSurveyResponsesBySurveyAndLocationAsync(int surveyId, int locationId);
Task<(bool IsSuccess, dynamic SurveyResponses, string ErrorMessage)> GetSurveyResponsesByMaintenanceCenterAsync(int surveyId);
Task<(bool IsSuccess, dynamic SurveyResponses, string ErrorMessage)> GetResponsesByAnswerAsync(int surveyId, int questionId, string answer);
Task<(bool IsSuccess, dynamic SurveyResponse, string ErrorMessage)> GetSurveyResponseByIdAsync(int responseId, string token);
Task<(bool IsSuccess, dynamic SurveyResponses, string ErrorMessage)> GetSurveyResponsesBySurveyAsync(int surveyId, string token);
Task<(bool IsSuccess, dynamic SurveyResponses, string ErrorMessage)> GetSurveyResponsesBySurveyAndLocationAsync(int surveyId, int locationId, string token);
Task<(bool IsSuccess, dynamic SurveyResponses, string ErrorMessage)> GetSurveyResponsesByMaintenanceCenterAsync(int surveyId, string token);
Task<(bool IsSuccess, dynamic SurveyResponses, string ErrorMessage)> GetResponsesByAnswerAsync(int surveyId, int questionId, string answer, string token);
Task<(bool IsSuccess, Models.SurveyResponse SurveyResponse, string ErrorMessage)> PostSurveyAnswersAsync(Request request);
Task<(bool IsSuccess, Models.SurveyResponse SurveyResponse, string ErrorMessage)> PostSurveyAnswersAsync(Request request, string token);
}
}

View File

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

View File

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

View File

@ -48,7 +48,7 @@ namespace DamageAssesment.Api.SurveyResponses.Providers
}
}
public async Task<(bool IsSuccess, dynamic Answers, string ErrorMessage)> GetAnswersByRegionAsync(int surveyId)
public async Task<(bool IsSuccess, dynamic Answers, string ErrorMessage)> GetAnswersByRegionAsync(int surveyId,string token)
{
try
{
@ -57,7 +57,7 @@ namespace DamageAssesment.Api.SurveyResponses.Providers
if (listSurveyResponse.Any())
{
var answers = await getAnswersByRegionAndSurveyIdAsync(listSurveyResponse);
var answers = await getAnswersByRegionAndSurveyIdAsync(listSurveyResponse,token);
return (true, answers, "Request Successful.");
}
else
@ -72,7 +72,7 @@ namespace DamageAssesment.Api.SurveyResponses.Providers
}
}
public async Task<(bool IsSuccess, dynamic SurveyResponse, string ErrorMessage)> GetSurveyResponseByIdAsync(int responseId)
public async Task<(bool IsSuccess, dynamic SurveyResponse, string ErrorMessage)> GetSurveyResponseByIdAsync(int responseId, string token)
{
try
{
@ -81,7 +81,7 @@ namespace DamageAssesment.Api.SurveyResponses.Providers
if (surveyResponse != null)
{
var answers = await getSurveyResponseByResponseIdAsync(surveyResponse);
var answers = await getSurveyResponseByResponseIdAsync(surveyResponse, token);
if (answers != null)
return (true, answers, "Request Successful.");
@ -105,16 +105,16 @@ namespace DamageAssesment.Api.SurveyResponses.Providers
public async Task<(bool IsSuccess, dynamic SurveyResponses, string ErrorMessage)> GetSurveyResponsesBySurveyAsync(int surveyId)
public async Task<(bool IsSuccess, dynamic SurveyResponses, string ErrorMessage)> GetSurveyResponsesBySurveyAsync(int surveyId, string token)
{
try
{
logger?.LogInformation("Querying to get Survey object from microservice");
var survey = await surveyServiceProvider.getSurveyAsync(surveyId);
var survey = await surveyServiceProvider.getSurveyAsync(surveyId,token);
if (survey != null)
{
var answers = await getSurveyResponsesBySurveyIdAsync(surveyId);
var answers = await getSurveyResponsesBySurveyIdAsync(surveyId, token);
if (answers != null)
return (true, answers, "Request Successful.");
@ -136,16 +136,16 @@ namespace DamageAssesment.Api.SurveyResponses.Providers
}
}
public async Task<(bool IsSuccess, dynamic SurveyResponses, string ErrorMessage)> GetSurveyResponsesBySurveyAndLocationAsync(int surveyId, int locationId)
public async Task<(bool IsSuccess, dynamic SurveyResponses, string ErrorMessage)> GetSurveyResponsesBySurveyAndLocationAsync(int surveyId, int locationId, string token)
{
try
{
logger?.LogInformation("Querying to get Survey object from microservice");
var survey = await surveyServiceProvider.getSurveyAsync(surveyId);
var survey = await surveyServiceProvider.getSurveyAsync(surveyId, token);
if (survey != null)
{
var answers = await getSurveyResponsesBySurveyIdLocationIdAsync(surveyId, locationId);
var answers = await getSurveyResponsesBySurveyIdLocationIdAsync(surveyId, locationId, token);
if (answers != null)
return (true, answers, "Request Successful.");
@ -167,16 +167,16 @@ namespace DamageAssesment.Api.SurveyResponses.Providers
}
}
public async Task<(bool IsSuccess, dynamic SurveyResponses, string ErrorMessage)> GetSurveyResponsesByMaintenanceCenterAsync(int surveyId)
public async Task<(bool IsSuccess, dynamic SurveyResponses, string ErrorMessage)> GetSurveyResponsesByMaintenanceCenterAsync(int surveyId, string token)
{
try
{
logger?.LogInformation("Querying to get Survey object from microservice");
var survey = await surveyServiceProvider.getSurveyAsync(surveyId);
var survey = await surveyServiceProvider.getSurveyAsync(surveyId, token);
if (survey != null)
{
var answers = await getResultsByMaintenanceCenterAsync(surveyId);
var answers = await getResultsByMaintenanceCenterAsync(surveyId,token);
if (answers != null)
return (true, answers, "Request Successful.");
@ -198,19 +198,19 @@ namespace DamageAssesment.Api.SurveyResponses.Providers
}
}
public async Task<(bool IsSuccess, dynamic SurveyResponses, string ErrorMessage)> GetResponsesByAnswerAsync(int surveyId, int questionId, string answer)
public async Task<(bool IsSuccess, dynamic SurveyResponses, string ErrorMessage)> GetResponsesByAnswerAsync(int surveyId, int questionId, string answer, string token)
{
try
{
logger?.LogInformation("Querying to get Survey object from microservice");
var survey = await surveyServiceProvider.getSurveyAsync(surveyId);
var question = await questionServiceProvider.getQuestionsAsync(questionId);
var survey = await surveyServiceProvider.getSurveyAsync(surveyId, token);
var question = await questionServiceProvider.getQuestionsAsync(questionId,token);
bool IsCorrectAnswer = answer.ToLower().Equals("yes") || answer.ToLower().Equals("no") ? true : false;
if (survey != null && question != null && IsCorrectAnswer)
{
var answers = await getSurveyResponsesByAnswerAsync(survey, question, answer);
var answers = await getSurveyResponsesByAnswerAsync(survey, question, answer, token);
if (answers != null)
return (true, answers, "Request Successful.");
@ -233,11 +233,11 @@ namespace DamageAssesment.Api.SurveyResponses.Providers
}
public async Task<(bool IsSuccess, dynamic surveyResponses, string ErrorMessage)> GetSurveyResponsesAsync()
public async Task<(bool IsSuccess, dynamic surveyResponses, string ErrorMessage)> GetSurveyResponsesAsync(string token)
{
try
{
var answers = await getAllSurveyResponsesAsync();
var answers = await getAllSurveyResponsesAsync(token);
if (answers != null)
return (true, answers, "Request Successful.");
@ -341,11 +341,11 @@ namespace DamageAssesment.Api.SurveyResponses.Providers
}
//Method to get Answers by region with surveyId as input parameter
private async Task<dynamic> getAnswersByRegionAndSurveyIdAsync(IQueryable<Db.SurveyResponse> surveyResponses)
private async Task<dynamic> getAnswersByRegionAndSurveyIdAsync(IQueryable<Db.SurveyResponse> surveyResponses, string token)
{
try
{
var answersList = await answerServiceProvider.getAnswersAsync();
var answersList = await answerServiceProvider.getAnswersAsync(token);
if (answersList == null || !answersList.Any())
return null;
@ -368,8 +368,8 @@ namespace DamageAssesment.Api.SurveyResponses.Providers
if (surveyAnswers == null || !surveyAnswers.Any())
return null;
var regions = await regionServiceProvider.getRegionsAsync();
var locations = await locationServiceProvider.getLocationsAsync();
var regions = await regionServiceProvider.getRegionsAsync(token);
var locations = await locationServiceProvider.getLocationsAsync(token);
if (regions == null || !regions.Any() || locations == null || !locations.Any())
return null;
@ -427,15 +427,15 @@ namespace DamageAssesment.Api.SurveyResponses.Providers
}
//Method to get Survey Response by ResponseId
private async Task<dynamic> getSurveyResponseByResponseIdAsync(Db.SurveyResponse surveyResponse)
private async Task<dynamic> getSurveyResponseByResponseIdAsync(Db.SurveyResponse surveyResponse, string token)
{
try
{
var employee = await employeeServiceProvider.getEmployeeAsync(surveyResponse.EmployeeId);
var answers = await answerServiceProvider.GetAnswersByResponseIdAsync(surveyResponse.Id);
var allQuestions = await questionServiceProvider.getQuestionsAsync();
var employee = await employeeServiceProvider.getEmployeeAsync(surveyResponse.EmployeeId, token);
var answers = await answerServiceProvider.GetAnswersByResponseIdAsync(surveyResponse.Id, token);
var allQuestions = await questionServiceProvider.getQuestionsAsync(token);
var questions = allQuestions.Where(s => s.SurveyId == surveyResponse.SurveyId);
var attachments = await attachmentServiceProvider.getAttachmentsAsync();
var attachments = await attachmentServiceProvider.getAttachmentsAsync(token);
var result = new
{
@ -470,20 +470,19 @@ namespace DamageAssesment.Api.SurveyResponses.Providers
//Method to get Survey Responses by surveyId
private async Task<dynamic> getSurveyResponsesBySurveyIdAsync(int surveyId)
private async Task<dynamic> getSurveyResponsesBySurveyIdAsync(int surveyId, string token)
{
try
{
var surveyResonses = await surveyResponseDbContext.SurveyResponses.Where(x => x.SurveyId == surveyId).ToListAsync();
var employees = await employeeServiceProvider.getEmployeesAsync();
var answers = await answerServiceProvider.getAnswersAsync();
var questions = await questionServiceProvider.getQuestionsAsync();
var employees = await employeeServiceProvider.getEmployeesAsync(token);
var answers = await answerServiceProvider.getAnswersAsync(token);
var questions = await questionServiceProvider.getQuestionsAsync(token);
var surveyQuestions = from q in questions where q.SurveyId == surveyId select q;
//var surveyQuestions = await questionServiceProvider.getSurveyQuestionsAsync(surveyId);
var attachments = await attachmentServiceProvider.getAttachmentsAsync();
var attachments = await attachmentServiceProvider.getAttachmentsAsync(token);
var result = from r in surveyResonses
select new
{
@ -520,16 +519,15 @@ namespace DamageAssesment.Api.SurveyResponses.Providers
//Method to get All Survey Responses
private async Task<dynamic> getAllSurveyResponsesAsync()
private async Task<dynamic> getAllSurveyResponsesAsync(string token)
{
try
{
var surveyResonses = await surveyResponseDbContext.SurveyResponses.ToListAsync();
var employees = await employeeServiceProvider.getEmployeesAsync();
var answers = await answerServiceProvider.getAnswersAsync();
var questions = await questionServiceProvider.getQuestionsAsync();
var attachments = await attachmentServiceProvider.getAttachmentsAsync();
var employees = await employeeServiceProvider.getEmployeesAsync(token);
var answers = await answerServiceProvider.getAnswersAsync(token);
var questions = await questionServiceProvider.getQuestionsAsync(token);
var attachments = await attachmentServiceProvider.getAttachmentsAsync(token);
var result = from r in surveyResonses
select new
@ -566,13 +564,13 @@ namespace DamageAssesment.Api.SurveyResponses.Providers
//Method to get Answers By Maintenance Center by surveyId
private async Task<dynamic> getResultsByMaintenanceCenterAsync(int surveyId)
private async Task<dynamic> getResultsByMaintenanceCenterAsync(int surveyId, string token)
{
try
{
var surveyResponses = await surveyResponseDbContext.SurveyResponses.Where(x => x.SurveyId == surveyId).ToListAsync();
var answers = await answerServiceProvider.getAnswersAsync();
var locations = await locationServiceProvider.getLocationsAsync();
var answers = await answerServiceProvider.getAnswersAsync(token);
var locations = await locationServiceProvider.getLocationsAsync(token);
var maintenanceCenters = locations.DistinctBy(m => m.MaintenanceCenter);
//get all the answers for the particular survey
@ -626,17 +624,16 @@ namespace DamageAssesment.Api.SurveyResponses.Providers
}
//Method to get Survey Responses by surveyId and LocationId
private async Task<dynamic> getSurveyResponsesBySurveyIdLocationIdAsync(int surveyId, int locationId)
private async Task<dynamic> getSurveyResponsesBySurveyIdLocationIdAsync(int surveyId, int locationId, string token)
{
try
{
var surveyResonses = await surveyResponseDbContext.SurveyResponses.Where(x => x.SurveyId == surveyId && x.LocationId.Equals(locationId)).ToListAsync();
var employees = await employeeServiceProvider.getEmployeesAsync();
var answers = await answerServiceProvider.getAnswersAsync();
var questions = await questionServiceProvider.getQuestionsAsync();
var employees = await employeeServiceProvider.getEmployeesAsync(token);
var answers = await answerServiceProvider.getAnswersAsync(token);
var questions = await questionServiceProvider.getQuestionsAsync(token);
var surveyQuestions = from q in questions where q.SurveyId == surveyId select q;
var attachments = await attachmentServiceProvider.getAttachmentsAsync();
var attachments = await attachmentServiceProvider.getAttachmentsAsync(token);
var result = from r in surveyResonses
select new
@ -674,14 +671,14 @@ namespace DamageAssesment.Api.SurveyResponses.Providers
//Method to get Survey Responses by surveyId questionId and answer
private async Task<dynamic> getSurveyResponsesByAnswerAsync(Survey survey, Question question, string answer)
private async Task<dynamic> getSurveyResponsesByAnswerAsync(Survey survey, Question question, string answer, string token)
{
try
{
var surveyResponses = await surveyResponseDbContext.SurveyResponses.Where(x => x.SurveyId == survey.Id).ToListAsync();
var answers = await answerServiceProvider.getAnswersAsync();
var employees = await employeeServiceProvider.getEmployeesAsync();
var attachments = await attachmentServiceProvider.getAttachmentsAsync();
var answers = await answerServiceProvider.getAnswersAsync(token);
var employees = await employeeServiceProvider.getEmployeesAsync(token);
var attachments = await attachmentServiceProvider.getAttachmentsAsync(token);
var result = from r in surveyResponses
select new
@ -720,16 +717,16 @@ namespace DamageAssesment.Api.SurveyResponses.Providers
}
async Task<bool> ProcessAnswers(AnswerRequest answerRequest, int surveyResponseId)
async Task<bool> ProcessAnswers(AnswerRequest answerRequest, int surveyResponseId,string token)
{
if (answerRequest != null)
{
var answer = await answerServiceProvider.PostAnswersAsync(new Models.Answer { QuestionId = answerRequest.QuestionId, AnswerText = answerRequest.AnswerText, Comment = answerRequest.Comment, SurveyResponseId = surveyResponseId });
var answer = await answerServiceProvider.PostAnswersAsync(new Models.Answer { QuestionId = answerRequest.QuestionId, AnswerText = answerRequest.AnswerText, Comment = answerRequest.Comment, SurveyResponseId = surveyResponseId }, token);
if (answer != null)
{
List<AnswerInfo> listAnswerInfo = new List<AnswerInfo>();
listAnswerInfo.Add(new AnswerInfo { AnswerId = answer.Id, postedFiles = answerRequest.PostedFiles });
var attachments = attachmentServiceProvider.PostAttachmentsAsync(new AttachmentInfo { ResponseId = surveyResponseId, Answers = listAnswerInfo });
var attachments = attachmentServiceProvider.PostAttachmentsAsync(new AttachmentInfo { ResponseId = surveyResponseId, Answers = listAnswerInfo }, token);
string message = $"Answer for question {answerRequest.QuestionId} saved to the database";
logger?.LogInformation(message);
@ -750,8 +747,7 @@ namespace DamageAssesment.Api.SurveyResponses.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, string token)
{
try
{
@ -761,7 +757,7 @@ namespace DamageAssesment.Api.SurveyResponses.Providers
if (response.IsSuccess)
{
var surveyResponse = response.SurveyResponse;
var tasks = request.Answers.Select(x => ProcessAnswers(x, surveyResponse.Id));
var tasks = request.Answers.Select(x => ProcessAnswers(x, surveyResponse.Id,token));
await Task.WhenAll(tasks);
return (true, surveyResponse, null);
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -10,11 +10,11 @@ namespace DamageAssesment.Api.SurveyResponses.Services
{
}
public async Task<List<Question>> getQuestionsAsync()
public async Task<List<Question>> getQuestionsAsync(string token)
{
try
{
var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null);
var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null,token);
var questions = JsonConvert.DeserializeObject<List<Question>>(responseJsonString);
if (questions == null || !questions.Any())
@ -28,12 +28,12 @@ namespace DamageAssesment.Api.SurveyResponses.Services
}
}
public async Task<List<SurveyQuestions>> getSurveyQuestionsAsync(int surveyId)
public async Task<List<SurveyQuestions>> getSurveyQuestionsAsync(int surveyId, string token)
{
try
{
url = urlBase + string.Format(configuration.GetValue<string>("RessourceSettings:SurveyQuestion"), surveyId);
var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null);
var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null, token);
var questions = JsonConvert.DeserializeObject<List<SurveyQuestions>>(responseJsonString);
if (questions == null || !questions.Any())
@ -48,12 +48,12 @@ namespace DamageAssesment.Api.SurveyResponses.Services
}
public async Task<Question> getQuestionsAsync(int questionId)
public async Task<Question> getQuestionsAsync(int questionId, string token)
{
try
{
url = urlBase + string.Format(configuration.GetValue<string>("RessourceSettings:QuestionById"), questionId);
var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null);
var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null, token);
var question = JsonConvert.DeserializeObject<Question>(responseJsonString);
if (question == null)

View File

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

View File

@ -10,11 +10,11 @@ namespace DamageAssesment.Api.SurveyResponses.Services
{
}
public async Task<List<Survey>> getSurveysAsync()
public async Task<List<Survey>> getSurveysAsync(string token)
{
try
{
var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null);
var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null, token);
var surveys = JsonConvert.DeserializeObject<List<Survey>>(responseJsonString);
if (surveys == null || !surveys.Any())
@ -28,12 +28,12 @@ namespace DamageAssesment.Api.SurveyResponses.Services
}
}
public async Task<Survey> getSurveyAsync(int surveyId)
public async Task<Survey> getSurveyAsync(int surveyId, string token)
{
try
{
url = urlBase + string.Format(configuration.GetValue<string>("RessourceSettings:SurveyById"), surveyId);
var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null);
var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null, token);
var survey = JsonConvert.DeserializeObject<Survey>(responseJsonString);
if (survey == null )

View File

@ -6,6 +6,9 @@
}
},
"AllowedHosts": "*",
"JwtSettings": {
"securitykey": "bWlhbWkgZGFkZSBzY2hvb2xzIHNlY3JldCBrZXk="
},
"EndPointSettings": {
"AnswerUrlBase": "http://localhost:5200",
"LocationUrlBase": "http://localhost:5213",