Compare commits

..

11 Commits

37 changed files with 538 additions and 494 deletions

View File

@ -9,10 +9,6 @@ using System.Reflection;
using System.Text; using System.Text;
var builder = WebApplication.CreateBuilder(args); var builder = WebApplication.CreateBuilder(args);
builder.Services.AddCors(p => p.AddPolicy("DamageAppCorsPolicy", build => {
build.WithOrigins("*").AllowAnyMethod().AllowAnyHeader().AllowAnyOrigin();
}));
var authkey = builder.Configuration.GetValue<string>("JwtSettings:securitykey"); var authkey = builder.Configuration.GetValue<string>("JwtSettings:securitykey");
builder.Services.AddAuthentication(item => builder.Services.AddAuthentication(item =>
{ {
@ -89,7 +85,6 @@ if (app.Environment.IsDevelopment())
app.UseSwagger(); app.UseSwagger();
app.UseSwaggerUI(); app.UseSwaggerUI();
} }
app.UseCors("DamageAppCorsPolicy");
app.UseAuthentication(); app.UseAuthentication();
app.UseAuthorization(); app.UseAuthorization();

View File

@ -11,11 +11,7 @@ using System.Reflection;
using System.Text; using System.Text;
var builder = WebApplication.CreateBuilder(args); var builder = WebApplication.CreateBuilder(args);
builder.Services.AddCors(p => p.AddPolicy("DamageAppCorsPolicy", build => {
build.WithOrigins("*").AllowAnyMethod().AllowAnyHeader().AllowAnyOrigin();
}));
var authkey = builder.Configuration.GetValue<string>("JwtSettings:securitykey"); var authkey = builder.Configuration.GetValue<string>("JwtSettings:securitykey");
builder.Services.AddAuthentication(item => builder.Services.AddAuthentication(item =>
{ {
item.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; item.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
@ -99,7 +95,7 @@ if (app.Environment.IsDevelopment())
app.UseSwagger(); app.UseSwagger();
app.UseSwaggerUI(); app.UseSwaggerUI();
} }
app.UseCors("DamageAppCorsPolicy");
app.UseAuthentication(); app.UseAuthentication();
app.UseAuthorization(); app.UseAuthorization();
app.UseHttpsRedirection(); app.UseHttpsRedirection();

View File

@ -25,7 +25,7 @@ namespace DamageAssesment.Api.Attachments.Providers
this.httpContextAccessor = httpContextAccessor; this.httpContextAccessor = httpContextAccessor;
baseUrl = $"{httpContextAccessor.HttpContext.Request.Scheme}://{httpContextAccessor.HttpContext.Request.Host}"; baseUrl = $"{httpContextAccessor.HttpContext.Request.Scheme}://{httpContextAccessor.HttpContext.Request.Host}";
baseUrl = baseUrl + "/attachments/download"; 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()
{ {

View File

@ -265,7 +265,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)
{ {

View File

@ -9,12 +9,9 @@ using System.Text;
using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Models;
var builder = WebApplication.CreateBuilder(args); var builder = WebApplication.CreateBuilder(args);
builder.Services.AddCors(p => p.AddPolicy("DamageAppCorsPolicy", build => {
build.WithOrigins("*").AllowAnyMethod().AllowAnyHeader().AllowAnyOrigin();
}));
// Add services to the container. // Add services to the container.
var authkey = builder.Configuration.GetValue<string>("JwtSettings:securitykey"); var authkey = builder.Configuration.GetValue<string>("JwtSettings:securitykey");
builder.Services.AddAuthentication(item => builder.Services.AddAuthentication(item =>
{ {
item.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; item.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
@ -89,7 +86,7 @@ if (app.Environment.IsDevelopment())
app.UseSwagger(); app.UseSwagger();
app.UseSwaggerUI(); app.UseSwaggerUI();
} }
app.UseCors("DamageAppCorsPolicy");
app.UseAuthentication(); app.UseAuthentication();
app.UseAuthorization(); app.UseAuthorization();

View File

@ -122,7 +122,7 @@ namespace DamageAssesment.Api.DocuLinks.Providers
if (item.IsAttachments) if (item.IsAttachments)
{ {
UserfileName = Path.GetFileName(item.FileName+item.FileExtension); UserfileName = Path.GetFileName(item.FileName+item.FileExtension);
var fileName = String.Format("Document_{0}{1}", counter1, item.FileExtension); var fileName = String.Format("Document_{0}_{1}{2}", document.Id, counter1, 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++; counter1++;

View File

@ -9,12 +9,9 @@ using System.Reflection;
using System.Text; using System.Text;
var builder = WebApplication.CreateBuilder(args); var builder = WebApplication.CreateBuilder(args);
builder.Services.AddCors(p => p.AddPolicy("DamageAppCorsPolicy", build => {
build.WithOrigins("*").AllowAnyMethod().AllowAnyHeader().AllowAnyOrigin();
}));
// Add services to the container. // Add services to the container.
var authkey = builder.Configuration.GetValue<string>("JwtSettings:securitykey"); var authkey = builder.Configuration.GetValue<string>("JwtSettings:securitykey");
builder.Services.AddAuthentication(item => builder.Services.AddAuthentication(item =>
{ {
item.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; item.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
@ -96,7 +93,7 @@ if (app.Environment.IsDevelopment())
employeesProvider.SeedData(); employeesProvider.SeedData();
} }
} }
app.UseCors("DamageAppCorsPolicy");
app.UseAuthentication(); app.UseAuthentication();
app.UseAuthorization(); app.UseAuthorization();

View File

@ -9,12 +9,9 @@ using System.Reflection;
using System.Text; using System.Text;
var builder = WebApplication.CreateBuilder(args); var builder = WebApplication.CreateBuilder(args);
builder.Services.AddCors(p => p.AddPolicy("DamageAppCorsPolicy", build => {
build.WithOrigins("*").AllowAnyMethod().AllowAnyHeader().AllowAnyOrigin();
}));
// Add services to the container. // Add services to the container.
var authkey = builder.Configuration.GetValue<string>("JwtSettings:securitykey"); var authkey = builder.Configuration.GetValue<string>("JwtSettings:securitykey");
builder.Services.AddAuthentication(item => builder.Services.AddAuthentication(item =>
{ {
item.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; item.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
@ -99,7 +96,7 @@ if (app.Environment.IsDevelopment())
regionProvider.SeedData(); regionProvider.SeedData();
} }
} }
app.UseCors("DamageAppCorsPolicy");
app.UseAuthentication(); app.UseAuthentication();
app.UseAuthorization(); app.UseAuthorization();

View File

@ -9,9 +9,6 @@ using System.Reflection;
using System.Text; using System.Text;
var builder = WebApplication.CreateBuilder(args); var builder = WebApplication.CreateBuilder(args);
builder.Services.AddCors(p => p.AddPolicy("DamageAppCorsPolicy", build => {
build.WithOrigins("*").AllowAnyMethod().AllowAnyHeader().AllowAnyOrigin();
}));
// Add services to the container. // Add services to the container.
var authkey = builder.Configuration.GetValue<string>("JwtSettings:securitykey"); var authkey = builder.Configuration.GetValue<string>("JwtSettings:securitykey");
builder.Services.AddAuthentication(item => builder.Services.AddAuthentication(item =>
@ -96,7 +93,6 @@ if (app.Environment.IsDevelopment())
questionProvider.SeedData(); questionProvider.SeedData();
} }
} }
app.UseCors("DamageAppCorsPolicy");
app.UseAuthentication(); app.UseAuthentication();
app.UseAuthorization(); app.UseAuthorization();

View File

@ -16,9 +16,6 @@ const int intervalToRetry = 2; //2 seconds
const int maxRetryForCircuitBraker = 5; const int maxRetryForCircuitBraker = 5;
const int intervalForCircuitBraker = 5; //5 seconds const int intervalForCircuitBraker = 5; //5 seconds
builder.Services.AddCors(p => p.AddPolicy("DamageAppCorsPolicy", build => {
build.WithOrigins("*").AllowAnyMethod().AllowAnyHeader().AllowAnyOrigin();
}));
// Add services to the container. // Add services to the container.
var authkey = builder.Configuration.GetValue<string>("JwtSettings:securitykey"); var authkey = builder.Configuration.GetValue<string>("JwtSettings:securitykey");
@ -109,7 +106,7 @@ if (app.Environment.IsDevelopment())
app.UseSwagger(); app.UseSwagger();
app.UseSwaggerUI(); app.UseSwaggerUI();
} }
app.UseCors("DamageAppCorsPolicy");
app.UseAuthentication(); app.UseAuthentication();
app.UseAuthorization(); app.UseAuthorization();

View File

@ -443,6 +443,7 @@ namespace DamageAssesment.Api.Responses.Providers
var answersList = await answerServiceProvider.getAnswersAsync(token); var answersList = await answerServiceProvider.getAnswersAsync(token);
if (answersList == null || !answersList.Any()) if (answersList == null || !answersList.Any())
return null; return null;
//get all the answers for the particular survey //get all the answers for the particular survey
var surveyAnswers = answersList.Join( var surveyAnswers = answersList.Join(
surveyResponses, surveyResponses,
@ -538,14 +539,14 @@ namespace DamageAssesment.Api.Responses.Providers
surveyResponse.LocationId, surveyResponse.LocationId,
surveyResponse.EmployeeId, surveyResponse.EmployeeId,
surveyResponse.ClientDevice, surveyResponse.ClientDevice,
// surveyResponse.KeyAnswerResult, surveyResponse.KeyAnswerResult,
surveyResponse.Longitute, surveyResponse.Longitute,
surveyResponse.Latitude, surveyResponse.Latitude,
Employee = employee, Employee = employee,
answers = from ans in answers answers = from ans in answers
select new select new
{ {
// ans.QuestionId, ans.QuestionId,
ans.Id, ans.Id,
ans.AnswerText, ans.AnswerText,
ans.Comment, ans.Comment,
@ -602,16 +603,16 @@ namespace DamageAssesment.Api.Responses.Providers
r.LocationId, r.LocationId,
r.EmployeeId, r.EmployeeId,
r.ClientDevice, r.ClientDevice,
// r.KeyAnswerResult, r.KeyAnswerResult,
r.Longitute, r.Longitute,
r.Latitude, 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(), 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 answers = from ans in answers
where ans.SurveyResponseId == r.Id where ans.SurveyResponseId == r.Id
select new select new
{ {
ans.Id, ans.Id,
// ans.QuestionId, ans.QuestionId,
ans.AnswerText, ans.AnswerText,
ans.Comment, ans.Comment,
Questions = (from q in surveyQuestions where q.Id == ans.QuestionId select new { q.Id, q.QuestionNumber, q.CategoryId, q.Text }).SingleOrDefault(), Questions = (from q in surveyQuestions where q.Id == ans.QuestionId select new { q.Id, q.QuestionNumber, q.CategoryId, q.Text }).SingleOrDefault(),
@ -654,11 +655,7 @@ namespace DamageAssesment.Api.Responses.Providers
} }
} }
surveyResonses = surveyResonses
.OrderByDescending(obj => obj.Id)
.GroupBy(obj => new { obj.SurveyId, obj.EmployeeId, obj.LocationId })
.Select(group => group.FirstOrDefault()) // or .FirstOrDefault() if you want to handle empty groups
.ToList();
var answers = await answerServiceProvider.getAnswersAsync(token); var answers = await answerServiceProvider.getAnswersAsync(token);
var questions = await questionServiceProvider.getQuestionsAsync(null, token); var questions = await questionServiceProvider.getQuestionsAsync(null, token);
var attachments = await attachmentServiceProvider.getAttachmentsAsync(token); var attachments = await attachmentServiceProvider.getAttachmentsAsync(token);
@ -671,16 +668,16 @@ namespace DamageAssesment.Api.Responses.Providers
r.LocationId, r.LocationId,
r.EmployeeId, r.EmployeeId,
r.ClientDevice, r.ClientDevice,
// r.KeyAnswerResult, r.KeyAnswerResult,
r.Longitute, r.Longitute,
r.Latitude, r.Latitude,
// Employee = employeeid != 0 ? _employee : (from e in employees where r.EmployeeId == e.Id select new { e.Id, e.Name, e.BirthDate, e.Email, e.OfficePhoneNumber }).SingleOrDefault(), 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
select new select new
{ {
ans.Id, ans.Id,
// ans.QuestionId, ans.QuestionId,
ans.AnswerText, ans.AnswerText,
ans.Comment, ans.Comment,
Questions = (from q in questions where q.Id == ans.QuestionId select new { q.Id, q.QuestionNumber, q.CategoryId, q.Text }).SingleOrDefault(), Questions = (from q in questions where q.Id == ans.QuestionId select new { q.Id, q.QuestionNumber, q.CategoryId, q.Text }).SingleOrDefault(),
@ -937,16 +934,16 @@ namespace DamageAssesment.Api.Responses.Providers
r.LocationId, r.LocationId,
r.EmployeeId, r.EmployeeId,
r.ClientDevice, r.ClientDevice,
// r.KeyAnswerResult, r.KeyAnswerResult,
r.Longitute, r.Longitute,
r.Latitude, r.Latitude,
// Employee = (from e in employees where r.EmployeeId == e.Id select new { e.Id, e.Name, e.BirthDate, e.Email, e.OfficePhoneNumber }).SingleOrDefault(), 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
select new select new
{ {
// ans.QuestionId, ans.QuestionId,
ans.Id, ans.Id,
ans.AnswerText, ans.AnswerText,
ans.Comment, ans.Comment,
@ -1007,10 +1004,10 @@ namespace DamageAssesment.Api.Responses.Providers
r.LocationId, r.LocationId,
r.EmployeeId, r.EmployeeId,
r.ClientDevice, r.ClientDevice,
// r.KeyAnswerResult, r.KeyAnswerResult,
r.Longitute, r.Longitute,
r.Latitude, r.Latitude,
// Employee = (from e in employees where r.EmployeeId == e.Id select new { e.Id, e.Name, e.BirthDate, e.Email, e.OfficePhoneNumber }).SingleOrDefault(), 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
@ -1018,7 +1015,7 @@ namespace DamageAssesment.Api.Responses.Providers
select new select new
{ {
// ans.QuestionId, ans.QuestionId,
AnswerId = ans.Id, AnswerId = ans.Id,
ans.AnswerText, ans.AnswerText,
ans.Comment, ans.Comment,

View File

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

View File

@ -29,38 +29,7 @@ namespace DamageAssesment.Api.Surveys.Controllers
} }
return NoContent(); return NoContent();
} }
/// <summary>
/// GET request for retrieving all active surveys.
/// </summary>
[Authorize(Roles = "admin,survey,user,report")]
[Route("surveys/active")]
[Route("surveys/active/{language:alpha}")]
[HttpGet]
public async Task<ActionResult> GetActiveSurveysAsync(string? language)
{
var result = await this.surveyProvider.GetActiveSurveysAsync(true,language);
if (result.IsSuccess)
{
return Ok(result.Surveys);
}
return NoContent();
}
/// <summary>
/// GET request for retrieving all inactive surveys.
/// </summary>
[Authorize(Roles = "admin,survey,user,report")]
[Route("surveys/inactive")]
[Route("surveys/inactive/{language:alpha}")]
[HttpGet]
public async Task<ActionResult> GetInActiveSurveysAsync(string? language)
{
var result = await this.surveyProvider.GetActiveSurveysAsync(false, language);
if (result.IsSuccess)
{
return Ok(result.Surveys);
}
return NoContent();
}
/// <summary> /// <summary>
/// GET request for retrieving surveys by ID. /// GET request for retrieving surveys by ID.
/// </summary> /// </summary>

View File

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

View File

@ -9,9 +9,7 @@ using System.Reflection;
using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Models;
var builder = WebApplication.CreateBuilder(args); var builder = WebApplication.CreateBuilder(args);
builder.Services.AddCors(p => p.AddPolicy("DamageAppCorsPolicy", build => {
build.WithOrigins("*").AllowAnyMethod().AllowAnyHeader().AllowAnyOrigin();
}));
// Add services to the container. // Add services to the container.
var authkey = builder.Configuration.GetValue<string>("JwtSettings:securitykey"); var authkey = builder.Configuration.GetValue<string>("JwtSettings:securitykey");
builder.Services.AddAuthentication(item => builder.Services.AddAuthentication(item =>
@ -95,7 +93,6 @@ if (app.Environment.IsDevelopment())
} }
} }
app.UseCors("DamageAppCorsPolicy");
app.UseAuthentication(); app.UseAuthentication();
app.UseAuthorization(); app.UseAuthorization();

View File

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

View File

@ -18,9 +18,9 @@ namespace DamageAssesment.Api.UsersAccess.Test
public async Task GetTokenAsync_ShouldReturnStatusCode200() public async Task GetTokenAsync_ShouldReturnStatusCode200()
{ {
var response = await MockData.getTokenResponse(true,null); var response = await MockData.getTokenResponse(true,null);
mockService.Setup(service => service.AuthenticateAsync()).ReturnsAsync(response); mockService.Setup(service => service.AuthenticateAsync("Emp1")).ReturnsAsync(response);
var controller = new UsersAccessController(mockService.Object); var controller = new UsersAccessController(mockService.Object);
var result = (OkObjectResult)await controller.AuthenticateAsync(); var result = (OkObjectResult)await controller.AuthenticateAsync("Emp1");
Assert.Equal(200, result.StatusCode); Assert.Equal(200, result.StatusCode);
} }
@ -28,9 +28,9 @@ namespace DamageAssesment.Api.UsersAccess.Test
public async Task GetTokenAsync_ShouldReturnStatusCode401() public async Task GetTokenAsync_ShouldReturnStatusCode401()
{ {
var response = await MockData.getTokenResponse(false, null); var response = await MockData.getTokenResponse(false, null);
mockService.Setup(service => service.AuthenticateAsync()).ReturnsAsync(response); mockService.Setup(service => service.AuthenticateAsync("Emp1")).ReturnsAsync(response);
var controller = new UsersAccessController(mockService.Object); var controller = new UsersAccessController(mockService.Object);
var result = (UnauthorizedObjectResult)await controller.AuthenticateAsync(); var result = (UnauthorizedObjectResult)await controller.AuthenticateAsync("Emp1");
Assert.Equal(401, result.StatusCode); Assert.Equal(401, result.StatusCode);
} }

View File

@ -8,38 +8,36 @@ namespace DamageAssesment.Api.UsersAccess.Controllers
[ApiController] [ApiController]
public class UsersAccessController : ControllerBase public class UsersAccessController : ControllerBase
{ {
private readonly IUsersAccessProvider userAccessProvider; private IUsersAccessProvider userAccessProvider;
public UsersAccessController(IUsersAccessProvider userAccessProvider) public UsersAccessController(IUsersAccessProvider userAccessProvider)
{ {
this.userAccessProvider = userAccessProvider; this.userAccessProvider = userAccessProvider;
} }
[HttpPost("dadeschools/token")] [HttpPost("dadeschooltoken")]
public async Task<ActionResult> DadeSchoolAuthenticateAsync(UserCredentials userCredentials) public async Task<ActionResult> DadeSchoolAuthenticateAsync(string username, string password)
{ {
var result = await userAccessProvider.AuthenticateAsync(userCredentials.username, userCredentials.password); var result = await userAccessProvider.DadeSchoolAuthenticateAsync(username, password);
if (result.IsSuccess) if (result.IsSuccess)
{ {
return Ok(result.TokenResponse); return Ok(result.TokenResponse);
} }
return Unauthorized(result.ErrorMessage); return Unauthorized(result.ErrorMessage);
} }
[Authorize(Policy = "Dadeschools")] [Authorize(Policy = "Dadeschools")]
[HttpGet("damageapp/token")] [HttpPost("token/{employecode}")]
public async Task<ActionResult> AuthenticateAsync() public async Task<ActionResult> AuthenticateAsync(string employecode)
{ {
var result = await userAccessProvider.AuthenticateAsync(); var result = await userAccessProvider.AuthenticateAsync(employecode);
if (result.IsSuccess) if (result.IsSuccess)
{ {
return Ok(result.TokenResponse); return Ok(result.TokenResponse);
} }
return Unauthorized(result.ErrorMessage); return Unauthorized(result.ErrorMessage);
} }
[Authorize(Policy = "Dadeschools")] [Authorize(Policy = "Dadeschools")]
[HttpPost("damageapp/refreshtoken")] [HttpPost("refreshtoken")]
public async Task<ActionResult> RefreshTokenAsync(TokenResponse tokenResponse) public async Task<ActionResult> RefreshTokenAsync(TokenResponse tokenResponse)
{ {
var result = await userAccessProvider.RefreshTokenAsync(tokenResponse); var result = await userAccessProvider.RefreshTokenAsync(tokenResponse);
@ -50,7 +48,7 @@ namespace DamageAssesment.Api.UsersAccess.Controllers
return Unauthorized(result.ErrorMessage); return Unauthorized(result.ErrorMessage);
} }
[Authorize(Policy = "DamageApp", Roles = "admin")] [Authorize(Policy = "DamageApp", Roles ="admin")]
[HttpGet("users")] [HttpGet("users")]
public async Task<ActionResult> GetUsersAsync() public async Task<ActionResult> GetUsersAsync()
{ {
@ -62,7 +60,7 @@ namespace DamageAssesment.Api.UsersAccess.Controllers
return NoContent(); return NoContent();
} }
// [Authorize(Policy = "DamageApp", Roles = "admin")] [Authorize(Policy = "DamageApp", Roles = "admin")]
[HttpGet("users/{Id}")] [HttpGet("users/{Id}")]
public async Task<ActionResult> GetUsersAsync(int Id) public async Task<ActionResult> GetUsersAsync(int Id)
{ {
@ -74,7 +72,7 @@ namespace DamageAssesment.Api.UsersAccess.Controllers
return NotFound(); return NotFound();
} }
//[Authorize(Policy = "DamageApp", Roles = "admin")] [Authorize(Policy = "DamageApp", Roles = "admin")]
[HttpGet("roles")] [HttpGet("roles")]
public async Task<ActionResult> GetRolesAsync() public async Task<ActionResult> GetRolesAsync()
{ {
@ -85,7 +83,7 @@ namespace DamageAssesment.Api.UsersAccess.Controllers
} }
return NoContent(); return NoContent();
} }
//[Authorize(Policy = "DamageApp", Roles = "admin")] [Authorize(Policy = "DamageApp", Roles = "admin")]
[HttpPost("users")] [HttpPost("users")]
public async Task<ActionResult> PostUserAsync(User user) public async Task<ActionResult> PostUserAsync(User user)
{ {
@ -97,7 +95,7 @@ namespace DamageAssesment.Api.UsersAccess.Controllers
return BadRequest(result.ErrorMessage); return BadRequest(result.ErrorMessage);
} }
//[Authorize(Policy = "DamageApp", Roles = "admin")] [Authorize(Policy = "DamageApp", Roles = "admin")]
[HttpPut("users/{Id}")] [HttpPut("users/{Id}")]
public async Task<ActionResult> PutUserAsync(int Id, User user) public async Task<ActionResult> PutUserAsync(int Id, User user)
{ {

View File

@ -27,7 +27,6 @@
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.18.1" /> <PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.18.1" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" /> <PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" /> <PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" />
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="6.21.0" />
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@ -4,7 +4,7 @@ namespace DamageAssesment.Api.UsersAccess.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

@ -7,7 +7,5 @@ namespace DamageAssesment.Api.UsersAccess.Interfaces
{ {
Task<string> GenerateToken(Models.User user); Task<string> GenerateToken(Models.User user);
Task<TokenResponse> TokenAuthenticate(Models.User user, Claim[] claims); Task<TokenResponse> TokenAuthenticate(Models.User user, Claim[] claims);
Task<string> ConvertJsonToDadeSchoolsJwt(string json);
} }
} }

View File

@ -4,15 +4,14 @@ namespace DamageAssesment.Api.UsersAccess.Interfaces
{ {
public interface IUsersAccessProvider public interface IUsersAccessProvider
{ {
public Task<(bool IsSuccess, IEnumerable<object> Users, string ErrorMessage)> GetUsersAsync(); public Task<(bool IsSuccess, IEnumerable< Models.User> Users, string ErrorMessage)> GetUsersAsync();
public Task<(bool IsSuccess, object User, string ErrorMessage)> GetUsersAsync(int Id); 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)> 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)> PutUserAsync(int Id,Models.User User);
public Task<(bool IsSuccess, Models.User User, string ErrorMessage)> DeleteUserAsync(int Id); 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, IEnumerable<Models.Role> Roles, string ErrorMessage)> GetRolesAsync();
public Task<(bool IsSuccess, Models.TokenResponse TokenResponse, string ErrorMessage)> AuthenticateAsync(); public Task<(bool IsSuccess, Models.TokenResponse TokenResponse, string ErrorMessage)> AuthenticateAsync(string employeCode);
public Task<(bool IsSuccess, DadeSchoolToken TokenResponse, string ErrorMessage)> AuthenticateAsync(string username, string password); 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 Task<(bool IsSuccess, Models.TokenResponse TokenResponse, string ErrorMessage)>RefreshTokenAsync(TokenResponse tokenResponse);
public void seedData(); public void seedData();
} }

View File

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

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

View File

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

View File

@ -17,13 +17,9 @@ const int maxRetryForCircuitBraker = 5;
const int intervalForCircuitBraker = 5; //5 seconds const int intervalForCircuitBraker = 5; //5 seconds
var builder = WebApplication.CreateBuilder(args); var builder = WebApplication.CreateBuilder(args);
builder.Services.AddCors(p => p.AddPolicy("DamageAppCorsPolicy", build =>
{
build.WithOrigins("*").AllowAnyMethod().AllowAnyHeader().AllowAnyOrigin();
}));
// Add services to the container. // Add services to the container.
var authkey = builder.Configuration.GetValue<string>("JwtSettings:securitykey"); var authkey = builder.Configuration.GetValue<string>("JwtSettings:securitykey");
var mode = builder.Configuration.GetValue<string>("ModeSettings:mode");
builder.Services.AddAuthentication(). builder.Services.AddAuthentication().
@ -54,27 +50,22 @@ builder.Services.AddAuthorization(options =>
.RequireAuthenticatedUser() .RequireAuthenticatedUser()
.AddAuthenticationSchemes("DamageApp") .AddAuthenticationSchemes("DamageApp")
.Build(); .Build();
var DadeschoolsPolicy = new AuthorizationPolicyBuilder()
var DadeschoolsPolicy = new AuthorizationPolicyBuilder().RequireAuthenticatedUser() .RequireAuthenticatedUser()
.AddAuthenticationSchemes("Dadeschools") .AddAuthenticationSchemes("Dadeschools")
.Build(); .Build();
var DadeschoolsPolicyOffline = new AuthorizationPolicyBuilder().RequireAssertion(_ => true)
.Build();
var allPolicy = new AuthorizationPolicyBuilder() var allPolicy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser() .RequireAuthenticatedUser()
.AddAuthenticationSchemes("DamageApp", "Dadeschools") .AddAuthenticationSchemes("DamageApp", "Dadeschools")
.Build(); .Build();
options.AddPolicy("DamageApp", DamageAppPolicy); options.AddPolicy("DamageApp", DamageAppPolicy);
options.AddPolicy("Dadeschools", mode == "online" ? DadeschoolsPolicy : DadeschoolsPolicyOffline); options.AddPolicy("Dadeschools", DadeschoolsPolicy);
options.AddPolicy("AllPolicies", allPolicy); options.AddPolicy("AllPolicies", allPolicy);
options.DefaultPolicy = options.GetPolicy("DamageApp")!; options.DefaultPolicy = options.GetPolicy("DamageApp")!;
}); });
var _jwtsettings = builder.Configuration.GetSection("JwtSettings"); var _jwtsettings = builder.Configuration.GetSection("JwtSettings");
builder.Services.Configure<JwtSettings>(_jwtsettings); builder.Services.Configure<JwtSettings>(_jwtsettings);
builder.Services.AddHttpContextAccessor();
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
@ -148,7 +139,6 @@ if (app.Environment.IsDevelopment())
} }
} }
app.UseCors("DamageAppCorsPolicy");
app.UseAuthentication(); app.UseAuthentication();
app.UseAuthorization(); app.UseAuthorization();

View File

@ -2,19 +2,15 @@
using DamageAssesment.Api.UsersAccess.Db; using DamageAssesment.Api.UsersAccess.Db;
using DamageAssesment.Api.UsersAccess.Interfaces; using DamageAssesment.Api.UsersAccess.Interfaces;
using DamageAssesment.Api.UsersAccess.Models; using DamageAssesment.Api.UsersAccess.Models;
using Microsoft.AspNetCore.Http;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using Microsoft.IdentityModel.Tokens; using Microsoft.IdentityModel.Tokens;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System.Data; using System.Data;
using Newtonsoft.Json; using Newtonsoft.Json;
using System.IdentityModel.Tokens.Jwt; using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims; using System.Security.Claims;
using System.Text; using System.Text;
namespace DamageAssesment.Api.UsersAccess.Providers namespace DamageAssesment.Api.UsersAccess.Providers
{ {
public class UsersAccessProvider : IUsersAccessProvider public class UsersAccessProvider : IUsersAccessProvider
@ -22,23 +18,21 @@ namespace DamageAssesment.Api.UsersAccess.Providers
private readonly UsersAccessDbContext userAccessDbContext; private readonly UsersAccessDbContext userAccessDbContext;
private readonly ILogger<UsersAccessProvider> logger; private readonly ILogger<UsersAccessProvider> logger;
private readonly IMapper mapper; private readonly IMapper mapper;
private readonly IEmployeeServiceProvider employeeServiceProvider; //private readonly IEmployeeServiceProvider employeeServiceProvider;
private readonly JwtSettings jwtSettings; private readonly JwtSettings jwtSettings;
private readonly ITokenServiceProvider tokenServiceProvider; private readonly ITokenServiceProvider tokenServiceProvider;
private readonly IConfiguration configuration; private readonly IConfiguration configuration;
private readonly IHttpContextAccessor httpContextAccessor;
public UsersAccessProvider(IConfiguration configuration, IOptions<JwtSettings> options, ITokenServiceProvider tokenServiceProvider, IHttpContextAccessor httpContextAccessor, UsersAccessDbContext userAccessDbContext, IEmployeeServiceProvider employeeServiceProvider, ILogger<UsersAccessProvider> logger, IMapper mapper) public UsersAccessProvider(IConfiguration configuration,IOptions<JwtSettings> options, ITokenServiceProvider tokenServiceProvider, UsersAccessDbContext userAccessDbContext, IEmployeeServiceProvider employeeServiceProvider, ILogger<UsersAccessProvider> logger, IMapper mapper)
{ {
this.userAccessDbContext = userAccessDbContext; this.userAccessDbContext = userAccessDbContext;
this.employeeServiceProvider = employeeServiceProvider; //this.employeeServiceProvider = employeeServiceProvider;
this.logger = logger; this.logger = logger;
this.mapper = mapper; this.mapper = mapper;
jwtSettings = options.Value; jwtSettings = options.Value;
this.tokenServiceProvider = tokenServiceProvider; this.tokenServiceProvider = tokenServiceProvider;
this.httpContextAccessor = httpContextAccessor;
this.configuration = configuration; this.configuration = configuration;
seedData(); // seedData();
} }
public void seedData() public void seedData()
@ -53,69 +47,26 @@ namespace DamageAssesment.Api.UsersAccess.Providers
if (!userAccessDbContext.Roles.Any()) if (!userAccessDbContext.Roles.Any())
{ {
userAccessDbContext.Roles.Add(new Db.Role { Name = "admin", Description = "Administrator role have full access" }); userAccessDbContext.Roles.Add(new Db.Role { Name = "admin", Description ="Administrator role have full access" });
userAccessDbContext.Roles.Add(new Db.Role { Name = "user", Description = " User role" }); userAccessDbContext.Roles.Add(new Db.Role { Name = "user", Description =" User role"});
userAccessDbContext.Roles.Add(new Db.Role { Name = "survey", Description = "Survey role" }); userAccessDbContext.Roles.Add(new Db.Role { Name = "survey", Description ="Survey role" });
userAccessDbContext.Roles.Add(new Db.Role { Name = "report", Description = "Report role" }); userAccessDbContext.Roles.Add(new Db.Role { Name = "report", Description ="Report role"});
userAccessDbContext.Roles.Add(new Db.Role { Name = "document", Description = "Document role" }); userAccessDbContext.Roles.Add(new Db.Role { Name = "document", Description ="Document role" });
userAccessDbContext.SaveChanges(); userAccessDbContext.SaveChanges();
} }
} }
private string GetToken()
{ public async Task<(bool IsSuccess, IEnumerable<Models.User> Users, string ErrorMessage)> GetUsersAsync()
string token = httpContextAccessor.HttpContext.Request.Headers.Authorization;
if (token != null)
{
token = token.Replace("Bearer ", string.Empty);
}
else
{
token = "";
}
return token;
}
public async Task<(bool IsSuccess, IEnumerable<object> Users, string ErrorMessage)> GetUsersAsync()
{ {
try try
{ {
logger?.LogInformation("Gell all Users from DB"); logger?.LogInformation("Gell all Users from DB");
var users = await userAccessDbContext.Users.ToListAsync(); var users = await userAccessDbContext.Users.ToListAsync();
List<object> userslist = new List<object>();
if (users != null) if (users != null)
{ {
var employees = await employeeServiceProvider.getEmployeesAsync(GetToken());
var roles = await userAccessDbContext.Roles.ToListAsync();
foreach (Db.User user in users)
{
var employee = employees.SingleOrDefault(a => a.Id == user.EmployeeId);
var role = roles.SingleOrDefault(s => s.Id == user.RoleId);
string FirstName = null, LastName = null, EmployeeName = null;
if (employee != null)
{
string[] names = employee.Name.Split(' ');
EmployeeName = employee.Name;
FirstName = names[0];
LastName = EmployeeName.Replace(FirstName + " ", "");
}
userslist.Add(new
{
Id = user.Id,
EmployeeId = user.EmployeeId,
EmployeeCode = user.EmployeeCode,
FirstName = FirstName,
LastName = LastName,
EmployeeName = EmployeeName,
RoleId = user.RoleId,
RoleName = (role != null) ? role.Name : null,
IsActive = user.IsActive,
CreatedDate = user.CreateDate,
UpdatedDate = user.UpdateDate
});
}
logger?.LogInformation($"{users.Count} Items(s) found"); logger?.LogInformation($"{users.Count} Items(s) found");
// var result = mapper.Map<IEnumerable<Db.User>, IEnumerable<Models.User>>(users); var result = mapper.Map<IEnumerable<Db.User>, IEnumerable<Models.User>>(users);
return (true, userslist, null); return (true, result, null);
} }
return (false, null, "Not found"); return (false, null, "Not found");
} }
@ -125,42 +76,18 @@ namespace DamageAssesment.Api.UsersAccess.Providers
return (false, null, ex.Message); return (false, null, ex.Message);
} }
} }
public async Task<(bool IsSuccess, object User, string ErrorMessage)> GetUsersAsync(int Id)
public async Task<(bool IsSuccess, Models.User User, string ErrorMessage)> GetUsersAsync(int Id)
{ {
try try
{ {
logger?.LogInformation("Querying Users table"); logger?.LogInformation("Querying Users table");
var user = await userAccessDbContext.Users.SingleOrDefaultAsync(s => s.Id == Id); var user = await userAccessDbContext.Users.SingleOrDefaultAsync(s => s.Id == Id);
if (user != null) if (user != null)
{ {
var employee = await employeeServiceProvider.getEmployeeAsync(user.EmployeeId, GetToken());
var role = await userAccessDbContext.Roles.SingleOrDefaultAsync(s => s.Id == user.RoleId);
string FirstName = null, LastName = null, EmployeeName = null;
if (employee != null)
{
string[] names = employee.Name.Split(' ');
EmployeeName = employee.Name;
FirstName = names[0];
LastName = EmployeeName.Replace(FirstName + " ", "");
}
var data = new
{
Id = user.Id,
EmployeeId = user.EmployeeId,
EmployeeCode = user.EmployeeCode,
FirstName = FirstName,
LastName = LastName,
EmployeeName = EmployeeName,
RoleId = user.RoleId,
RoleName = (role != null) ? role.Name : null,
IsActive = user.IsActive,
CreatedDate = user.CreateDate,
UpdatedDate = user.UpdateDate
};
logger?.LogInformation($"User Id: {Id} found"); logger?.LogInformation($"User Id: {Id} found");
var result = mapper.Map<Db.User, Models.User>(user); var result = mapper.Map<Db.User, Models.User>(user);
return (true, data, null); return (true, result, null);
} }
return (false, null, "Not found"); return (false, null, "Not found");
} }
@ -206,12 +133,18 @@ namespace DamageAssesment.Api.UsersAccess.Providers
if (_user != null) if (_user != null)
{ {
Db.User vUsers = mapper.Map<Models.User, Db.User>(user); int count = userAccessDbContext.Users.Where(u => u.Id != user.Id).Count();
vUsers.UpdateDate = DateTime.Now; if (count == 0)
userAccessDbContext.Users.Update(vUsers); {
userAccessDbContext.SaveChanges(); await userAccessDbContext.SaveChangesAsync();
user.Id = Id; logger?.LogInformation($"Employee Id: {user.EmployeeId} updated successfuly");
return (true, user, "Successful"); return (true, mapper.Map<Db.User, Models.User>(_user), $"Employee Id: {_user.EmployeeId} updated successfuly");
}
else
{
logger?.LogInformation($"Employee Id: {user.EmployeeId} is already exist");
return (false, null, $"Employee Id: {user.EmployeeId} is already exist");
}
} }
else else
{ {
@ -257,19 +190,7 @@ namespace DamageAssesment.Api.UsersAccess.Providers
return (false, null, ex.Message); return (false, null, ex.Message);
} }
} }
public async Task<(bool IsSuccess, DadeSchoolToken TokenResponse, string ErrorMessage)> DadeSchoolAuthenticateAsync(string username, string password)
public async Task<(bool IsSuccess, DadeSchoolToken TokenResponse, string ErrorMessage)> AuthenticateAsync(string username, string password)
{
var mode = configuration.GetValue<string>("ModeSettings:mode");
if (mode == "online")
return await DadeSchoolAuthenticateAsync(username, password);
else if (mode == "offline") return await DadeSchoolAuthenticateFakeAsync(username, password);
else return (false, null, "Invalid mode");
}
private async Task<(bool IsSuccess, DadeSchoolToken TokenResponse, string ErrorMessage)> DadeSchoolAuthenticateAsync(string username, string password)
{ {
try try
{ {
@ -291,44 +212,6 @@ namespace DamageAssesment.Api.UsersAccess.Providers
return (true, JsonConvert.DeserializeObject<DadeSchoolToken>(responseString), ""); return (true, JsonConvert.DeserializeObject<DadeSchoolToken>(responseString), "");
} }
return (false, null, responseString); return (false, null, responseString);
}
catch (Exception ex)
{
return (false, null, ex.Message);
}
}
private async Task<(bool IsSuccess, DadeSchoolToken TokenResponse, string ErrorMessage)> DadeSchoolAuthenticateFakeAsync(string username, string password)
{
try
{
var defaultPassword = configuration.GetValue<string>("ModeSettings:userPassword");
if (password != defaultPassword)
return (false, null, "Invalid Password");
long unixTimeNow = (long)DateTime.UtcNow.Subtract(DateTime.UnixEpoch).TotalSeconds;
var tokenObject = new Models.FakeToken
{
nbf = unixTimeNow,
exp = unixTimeNow + 259200,
iat = unixTimeNow,
auth_time = unixTimeNow,
sub = username
};
var tokenString = JsonConvert.SerializeObject(tokenObject);
var jwtToken = await tokenServiceProvider.ConvertJsonToDadeSchoolsJwt(tokenString);
var response = new DadeSchoolToken
{
access_token = jwtToken,
expires_in = 262800,
scope = "openid profile",
token_type = "Bearer"
};
return (true, response, "");
} }
catch (Exception ex) catch (Exception ex)
{ {
@ -336,72 +219,56 @@ namespace DamageAssesment.Api.UsersAccess.Providers
} }
} }
public async Task<(bool IsSuccess, TokenResponse TokenResponse, string ErrorMessage)> AuthenticateAsync(string employecode)
private string DecodeJwtToken(string token)
{ {
try
{
var handler = new JwtSecurityTokenHandler();
var jsonToken = handler.ReadToken(token);
var tokenS = handler.ReadToken(token) as JwtSecurityToken;
if (tokenS == null) if (employecode != null)
return null; {
//implementation for dadeschools authentication
// var employees = await employeeServiceProvider.getEmployeesAsync();
// var employee = employees.Where(e=> e.EmployeeCode.ToLower() == employecode.ToLower()).SingleOrDefault();
var user = userAccessDbContext.Users.Where(x => x.IsActive == true && x.EmployeeCode.ToLower() == employecode.ToLower()).SingleOrDefault();
var payload = tokenS.Payload.SerializeToJson(); if (user != null)
return payload; {
}
catch
{
return null;
}
}
public async Task<(bool IsSuccess, TokenResponse TokenResponse, string ErrorMessage)> AuthenticateAsync() var r = await GetRolesAsync();
{ var role = r.Roles.Where(x => x.Id == user.RoleId).SingleOrDefault();
var dadeschoolsToken = GetToken();
var decodedToken = DecodeJwtToken(dadeschoolsToken);
var tokenObject = decodedToken == null ? null : JObject.Parse(decodedToken);
if (tokenObject == null) var authClaims = new List<Claim> {
return (false, null, "JWT authentication is required");
var employecode = (string)tokenObject["sub"];
var user = userAccessDbContext.Users.Where(x => x.IsActive == true && x.EmployeeCode.ToLower() == employecode.ToLower()).SingleOrDefault();
if (user != null)
{
var r = await GetRolesAsync();
var role = r.Roles.Where(x => x.Id == user.RoleId).SingleOrDefault();
var authClaims = new List<Claim> {
new Claim(ClaimTypes.Name, user.EmployeeCode), new Claim(ClaimTypes.Name, user.EmployeeCode),
new Claim(ClaimTypes.Role, role.Name), new Claim(ClaimTypes.Role, role.Name),
new Claim(JwtRegisteredClaimNames.Jti,Guid.NewGuid().ToString()) new Claim(JwtRegisteredClaimNames.Jti,Guid.NewGuid().ToString())
}; };
/// Generate Token /// Generate Token
var tokenhandler = new JwtSecurityTokenHandler(); var tokenhandler = new JwtSecurityTokenHandler();
var tokenkey = Encoding.UTF8.GetBytes(jwtSettings.securitykey); var tokenkey = Encoding.UTF8.GetBytes(jwtSettings.securitykey);
var tokendesc = new SecurityTokenDescriptor var tokendesc = new SecurityTokenDescriptor
{ {
Audience = "", Audience = "",
NotBefore = DateTime.Now, NotBefore = DateTime.Now,
Subject = new ClaimsIdentity(authClaims), Subject = new ClaimsIdentity(authClaims),
Expires = DateTime.Now.AddDays(3), Expires = DateTime.Now.AddMinutes(30),
SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(tokenkey), SecurityAlgorithms.HmacSha256) SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(tokenkey), SecurityAlgorithms.HmacSha256)
}; };
var token = tokenhandler.CreateToken(tokendesc); var token = tokenhandler.CreateToken(tokendesc);
string finaltoken = tokenhandler.WriteToken(token); string finaltoken = tokenhandler.WriteToken(token);
var response = new TokenResponse() { jwttoken = finaltoken, refreshtoken = await tokenServiceProvider.GenerateToken(mapper.Map<Db.User, Models.User>(user)) }; var response = new TokenResponse() { jwttoken = finaltoken, refreshtoken = await tokenServiceProvider.GenerateToken(mapper.Map<Db.User,Models.User>(user)) };
return (true, response, "Authentication success and token issued."); return (true, response, "Authentication success and token issued.");
} }
else else
{ {
return (false, null, "user inactive or not exist."); return (false, null, "user inactive or not exist.");
} }
}
else
{
return (false, null, "Credentials are required to authenticate.");
}
} }
public async Task<(bool IsSuccess, IEnumerable<Models.Role> Roles, string ErrorMessage)> GetRolesAsync() public async Task<(bool IsSuccess, IEnumerable<Models.Role> Roles, string ErrorMessage)> GetRolesAsync()
{ {

View File

@ -10,11 +10,11 @@ namespace DamageAssesment.Api.UsersAccess.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())
@ -28,12 +28,12 @@ namespace DamageAssesment.Api.UsersAccess.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

@ -14,7 +14,7 @@ namespace DamageAssesment.Api.UsersAccess.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
{ {
@ -22,7 +22,7 @@ namespace DamageAssesment.Api.UsersAccess.Services
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");

View File

@ -6,10 +6,8 @@ using DamageAssesment.Api.UsersAccess.Db;
using DamageAssesment.Api.UsersAccess.Interfaces; using DamageAssesment.Api.UsersAccess.Interfaces;
using DamageAssesment.Api.UsersAccess.Models; using DamageAssesment.Api.UsersAccess.Models;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using Microsoft.IdentityModel.Tokens; using Microsoft.IdentityModel.Tokens;
using Newtonsoft.Json.Linq;
namespace DamageAssesment.Api.UsersAccess.Services namespace DamageAssesment.Api.UsersAccess.Services
{ {
@ -17,11 +15,9 @@ namespace DamageAssesment.Api.UsersAccess.Services
{ {
private readonly UsersAccessDbContext usersAccessDbContext; private readonly UsersAccessDbContext usersAccessDbContext;
private readonly JwtSettings jwtSettings; private readonly JwtSettings jwtSettings;
private readonly IConfiguration configuration; public TokenServiceProvider(IOptions<JwtSettings> options, UsersAccessDbContext usersAccessDbContext)
public TokenServiceProvider(IOptions<JwtSettings> options, UsersAccessDbContext usersAccessDbContext, IConfiguration configuration)
{ {
this.usersAccessDbContext = usersAccessDbContext; this.usersAccessDbContext = usersAccessDbContext;
this.configuration = configuration;
this.jwtSettings = options.Value; this.jwtSettings = options.Value;
} }
public async Task<string> GenerateToken(Models.User user) public async Task<string> GenerateToken(Models.User user)
@ -59,27 +55,5 @@ namespace DamageAssesment.Api.UsersAccess.Services
var jwttoken = new JwtSecurityTokenHandler().WriteToken(token); var jwttoken = new JwtSecurityTokenHandler().WriteToken(token);
return new TokenResponse() { jwttoken = jwttoken, refreshtoken = await GenerateToken(user) }; return new TokenResponse() { jwttoken = jwttoken, refreshtoken = await GenerateToken(user) };
} }
public async Task<string> ConvertJsonToDadeSchoolsJwt(string json)
{
var jsonObject = JObject.Parse(json);
var claims = new Claim[jsonObject.Count];
int i = 0;
foreach (var property in jsonObject.Properties())
{
claims[i++] = new Claim(property.Name, property.Value.ToString());
}
var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(configuration.GetValue<string>("Dadeschools:TokenClientSecret")));
var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256);
var tokenDescriptor = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(claims),
Expires = DateTime.UtcNow.AddDays(3),
SigningCredentials = credentials
};
var tokenHandler = new JwtSecurityTokenHandler();
var token = tokenHandler.CreateToken(tokenDescriptor);
return tokenHandler.WriteToken(token);
}
} }
} }

View File

@ -8,24 +8,17 @@
"Microsoft.AspNetCore": "Warning" "Microsoft.AspNetCore": "Warning"
} }
}, },
//"EndPointSettings": {
// "EmployeeUrlBase": "http://localhost:5135"
//},
"EndPointSettings": { "EndPointSettings": {
"EmployeeUrlBase": "http://damageassesment.api.employees:80" "EmployeeUrlBase": "http://localhost:5135"
}, },
"RessourceSettings": { "RessourceSettings": {
"Employee": "/Employees", "Employee": "/Employees",
"EmployeeById": "/Employees/{0}" "EmployeeById": "/Employees/{0}"
}, },
"ModeSettings": {
"mode": "offline",
"userPassword": "^R,cVAvEy7Z.qPkH9"
},
"AllowedHosts": "*", "AllowedHosts": "*",
"Dadeschools": { "Dadeschools": {
"Authority": "https://graph2.dadeschools.net", "Authority": "https://dev-graph.dadeschools.net",
"TokenUrl": "https://graph2.dadeschools.net/connect/token", "TokenUrl": "https://dev-graph.dadeschools.net/connect/token",
"ClientId": "dmapi", "ClientId": "dmapi",
"ClientSecret": "bfce2c8d-2064-4a02-b19d-7f1d42b16eae", "ClientSecret": "bfce2c8d-2064-4a02-b19d-7f1d42b16eae",
"TokenClientId": "damage_assessment_postman", "TokenClientId": "damage_assessment_postman",
@ -47,5 +40,6 @@
"ConnectionStrings": { "ConnectionStrings": {
// "UsersAccessConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;" // "UsersAccessConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;"
"UsersAccessConnection": "Server=207.180.248.35;Database=da_survey_dev;User Id=sa;Password=YourStrongPassw0rd;TrustServerCertificate=True;" "UsersAccessConnection": "Server=207.180.248.35;Database=da_survey_dev;User Id=sa;Password=YourStrongPassw0rd;TrustServerCertificate=True;"
} }
} }

View File

@ -0,0 +1,30 @@
<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.5.0" />
<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.2.0">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\DamageAssesment.Api.Responses\DamageAssesment.Api.Responses.csproj" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,30 @@

using DamageAssesment.Api.Responses.Models;
using System.Collections.Generic;
using System.Text;
namespace DamageAssesment.Api.Responses.Test
{
public class MockData
{
public static async Task<(bool, SurveyResponse, string)> getOkResponse(SurveyResponse data)
{
return (true, data, null);
}
public static async Task<(bool, dynamic, string)> getOkResponse()
{
return (true, new { }, null);
}
public static async Task<(bool, Models.SurveyResponse, string)> getResponse()
{
return (false, null, null);
}
public static async Task<Models.SurveyResponse> getSurveyResponseObject()
{
return new Models.SurveyResponse { EmployeeId = 1, LocationId = 1, SurveyId = 1, Id = 1 };
}
}
}

View File

@ -0,0 +1,251 @@
using DamageAssesment.Api.Responses.Controllers;
using DamageAssesment.Api.Responses.Interfaces;
using DamageAssesment.Api.Responses.Models;
using DamageAssesment.Api.Responses.Test;
using Microsoft.AspNetCore.Mvc;
using Moq;
using Xunit;
namespace DamageAssesment.SurveyResponses.Test
{
public class ResponsesServiceTest
{
private Mock<ISurveysResponse> mockSurveyResponseService;
private string token { get; set; }
public ResponsesServiceTest()
{
mockSurveyResponseService = new Mock<ISurveysResponse>();
token = Guid.NewGuid().ToString();
}
[Fact(DisplayName = "Get Responses - Ok case")]
public async Task GetSurveyResponsesAsync_ShouldReturnStatusCode200()
{
SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject();
var mockResponse = await MockData.getOkResponse(mockRequestObject);
mockSurveyResponseService.Setup(service => service.GetSurveyResponsesAsync()).ReturnsAsync(mockResponse);
var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object);
var result = (OkObjectResult)await surveyResponseProvider.GetSurveyResponsesAsync();
Assert.Equal(200, result.StatusCode);
}
[Fact(DisplayName = "Get Responses - BadRequest case")]
public async Task GetSurveyResponsesAsync_ShouldReturnStatusCode204()
{
var mockResponse = await MockData.getResponse();
mockSurveyResponseService.Setup(service => service.GetSurveyResponsesAsync()).ReturnsAsync(mockResponse);
var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object);
var result = (BadRequestObjectResult)await surveyResponseProvider.GetSurveyResponsesAsync();
Assert.Equal(400, result.StatusCode);
}
[Fact(DisplayName = "Get Responses by surveyId - Ok case")]
public async Task GetSurveyResponsesBySurveyAsync_ShouldReturnStatusCode200()
{
SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject();
var mockResponse = await MockData.getOkResponse();
<<<<<<<< HEAD:DamageAssesmentApi/DamageAssesment.Api.Responses.Test/SurveyResponsesServiceTest.cs
mockSurveyResponseService.Setup(service => service.GetSurveyResponsesBySurveyAsync(1,1)).ReturnsAsync(mockResponse);
var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object);
var result = (OkObjectResult)await surveyResponseProvider.GetSurveyResponsesAsync(1,1);
========
mockSurveyResponseService.Setup(service => service.GetSurveyResponsesBySurveyAsync(1)).ReturnsAsync(mockResponse);
var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object);
var result = (OkObjectResult)await surveyResponseProvider.GetSurveyResponsesAsync(1);
>>>>>>>> Azure-Integration:DamageAssesmentApi/DamageAssesment.Responses.Test/ResponsesServiceTest.cs
Assert.Equal(200, result.StatusCode);
}
[Fact(DisplayName = "Get Responses by surveyId - NoContent case")]
public async Task GetSurveyResponsesBySurveyAsync_ShouldReturnStatusCode204()
{
var mockResponse = await MockData.getResponse();
<<<<<<<< HEAD:DamageAssesmentApi/DamageAssesment.Api.Responses.Test/SurveyResponsesServiceTest.cs
mockSurveyResponseService.Setup(service => service.GetSurveyResponsesBySurveyAsync(1,1)).ReturnsAsync(mockResponse);
var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object);
var result = (NoContentResult)await surveyResponseProvider.GetSurveyResponsesAsync(1,1);
========
mockSurveyResponseService.Setup(service => service.GetSurveyResponsesBySurveyAsync(1)).ReturnsAsync(mockResponse);
var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object);
var result = (NoContentResult)await surveyResponseProvider.GetSurveyResponsesAsync(1);
>>>>>>>> Azure-Integration:DamageAssesmentApi/DamageAssesment.Responses.Test/ResponsesServiceTest.cs
Assert.Equal(204, result.StatusCode);
}
[Fact(DisplayName = "Get Responses by surveyId and locationId - Ok case")]
public async Task GetSurveyResponsesBySurveyLocationAsync_ShouldReturnStatusCode200()
{
SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject();
var mockResponse = await MockData.getOkResponse();
mockSurveyResponseService.Setup(service => service.GetSurveyResponsesBySurveyAndLocationAsync(1, 1)).ReturnsAsync(mockResponse);
var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object);
var result = (OkObjectResult)await surveyResponseProvider.GetSurveyResponsesBySurveyAndLocationAsync(1, 1);
Assert.Equal(200, result.StatusCode);
}
[Fact(DisplayName = "Get Responses by surveyId and locationId - NoContent case")]
public async Task GetSurveyResponsesBySurveyLocationAsync_ShouldReturnStatusCode204()
{
var mockResponse = await MockData.getResponse();
mockSurveyResponseService.Setup(service => service.GetSurveyResponsesBySurveyAndLocationAsync(1, 1)).ReturnsAsync(mockResponse);
var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object);
var result = (NoContentResult)await surveyResponseProvider.GetSurveyResponsesBySurveyAndLocationAsync(1, 1);
Assert.Equal(204, result.StatusCode);
}
[Fact(DisplayName = "Get Responses by surveyId and QuestionId and Answer - Ok case")]
public async Task GetSurveyResponsesBySurveyQuestionAnswerAsync_ShouldReturnStatusCode200()
{
SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject();
var mockResponse = await MockData.getOkResponse();
mockSurveyResponseService.Setup(service => service.GetResponsesByAnswerAsync(1, 1, "Yes")).ReturnsAsync(mockResponse);
var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object);
var result = (OkObjectResult)await surveyResponseProvider.GetSurveyResponsesByAnswerAsyncAsync(1, 1, "Yes");
Assert.Equal(200, result.StatusCode);
}
[Fact(DisplayName = "Get Responses by surveyId and QuestionId and Answer - NoContent case")]
public async Task GetSurveyResponsesBySurveyQuestionAnswerAsync_ShouldReturnStatusCode204()
{
var mockResponse = await MockData.getResponse();
mockSurveyResponseService.Setup(service => service.GetResponsesByAnswerAsync(1, 1, "Yes")).ReturnsAsync(mockResponse);
var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object);
var result = (NoContentResult)await surveyResponseProvider.GetSurveyResponsesByAnswerAsyncAsync(1, 1, "Yes");
Assert.Equal(204, result.StatusCode);
}
[Fact(DisplayName = "Get Responses by region and surveyId - Ok case")]
public async Task GetSurveyResponsesByRegionSurveyAsync_ShouldReturnStatusCode200()
{
SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject();
var mockResponse = await MockData.getOkResponse();
mockSurveyResponseService.Setup(service => service.GetAnswersByRegionAsync(1)).ReturnsAsync(mockResponse);
var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object);
var result = (OkObjectResult)await surveyResponseProvider.GetAnswersByRegionAsync(1);
Assert.Equal(200, result.StatusCode);
}
[Fact(DisplayName = "Get Responses by region and surveyId - NoContent Case")]
public async Task GetSurveyResponsesByRegionSurveyAsync_ShouldReturnStatusCode204()
{
var mockResponse = await MockData.getResponse();
mockSurveyResponseService.Setup(service => service.GetAnswersByRegionAsync(1)).ReturnsAsync(mockResponse);
var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object);
var result = (NoContentResult)await surveyResponseProvider.GetAnswersByRegionAsync(1);
Assert.Equal(204, result.StatusCode);
}
[Fact(DisplayName = "Get Responses by maintenanceCenter and surveyId - Ok case")]
public async Task GetSurveyResponsesMaintenanceCenterSurveyAsync_ShouldReturnStatusCode200()
{
SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject();
var mockResponse = await MockData.getOkResponse();
mockSurveyResponseService.Setup(service => service.GetSurveyResponsesByMaintenanceCenterAsync(1)).ReturnsAsync(mockResponse);
var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object);
var result = (OkObjectResult)await surveyResponseProvider.GetAnswersByMaintenaceCentersync(1);
Assert.Equal(200, result.StatusCode);
}
[Fact(DisplayName = "Get Responses by maintenanceCenter and surveyId - No Content Case")]
public async Task GetSurveyResponsesMaintenanceCenterSurveyAsync_ShouldReturnStatusCode204()
{
var mockResponse = await MockData.getResponse();
mockSurveyResponseService.Setup(service => service.GetSurveyResponsesByMaintenanceCenterAsync(1)).ReturnsAsync(mockResponse);
var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object);
var result = (NoContentResult)await surveyResponseProvider.GetAnswersByMaintenaceCentersync(1);
Assert.Equal(204, result.StatusCode);
}
[Fact(DisplayName = "Get SurveyResponse by responseId- Ok case")]
public async Task GetSurveyResponsesByResponseIdyAsync_ShouldReturnStatusCode200()
{
SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject();
var mockResponse = await MockData.getOkResponse();
mockSurveyResponseService.Setup(service => service.GetSurveyResponseByIdAsync(1)).ReturnsAsync(mockResponse);
var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object);
var result = (OkObjectResult)await surveyResponseProvider.GetSurveyResponseByIdAsync(1);
Assert.Equal(200, result.StatusCode);
}
[Fact(DisplayName = "Get Responses by maintenanceCenter and surveyId - NoContent Case")]
public async Task GetSurveyResponsesByResponseIdyAsync_ShouldReturnStatusCode204()
{
var mockResponse = await MockData.getResponse();
mockSurveyResponseService.Setup(service => service.GetSurveyResponseByIdAsync(1)).ReturnsAsync(mockResponse);
var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object);
var result = (NoContentResult)await surveyResponseProvider.GetSurveyResponseByIdAsync(1);
Assert.Equal(204, result.StatusCode);
}
[Fact(DisplayName = "Post Responses - Ok case")]
public async Task PostSurveyAsync_ShouldReturnStatusCode200()
{
SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject();
var mockResponse = await MockData.getOkResponse(mockRequestObject);
mockSurveyResponseService.Setup(service => service.PostSurveyResponseAsync(mockRequestObject)).ReturnsAsync(mockResponse);
var surveyResponseController = new ResponsesController(mockSurveyResponseService.Object);
var result = (OkObjectResult)await surveyResponseController.PostSurveysAsync(mockRequestObject);
Assert.Equal(200, result.StatusCode);
}
[Fact(DisplayName = "Post Responses - BadRequest case")]
public async Task PostSurveyAsync_ShouldReturnStatusCode400()
{
SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject();
var mockResponse = await MockData.getResponse();
mockSurveyResponseService.Setup(service => service.PostSurveyResponseAsync(mockRequestObject)).ReturnsAsync(mockResponse);
var surveyResponseController = new ResponsesController(mockSurveyResponseService.Object);
var result = (BadRequestObjectResult)await surveyResponseController.PostSurveysAsync(mockRequestObject);
Assert.Equal(400, result.StatusCode);
}
[Fact(DisplayName = "Put Responses - Ok case")]
public async Task PutSurveyAsync_ShouldReturnStatusCode200()
{
SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject();
var mockResponse = await MockData.getOkResponse(mockRequestObject);
mockSurveyResponseService.Setup(service => service.PutSurveyResponseAsync(1, mockRequestObject)).ReturnsAsync(mockResponse);
var surveyResponseController = new ResponsesController(mockSurveyResponseService.Object);
var result = (OkObjectResult)await surveyResponseController.PutSurveyResponseAsync(1, mockRequestObject);
Assert.Equal(200, result.StatusCode);
}
[Fact(DisplayName = "Put Responses - BadRequest case")]
public async Task PutSurveyAsync_ShouldReturnStatusCode404()
{
SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject();
var mockResponse = await MockData.getResponse();
mockSurveyResponseService.Setup(service => service.PutSurveyResponseAsync(1, mockRequestObject)).ReturnsAsync(mockResponse); ;
var surveyResponseController = new ResponsesController(mockSurveyResponseService.Object);
var result = (BadRequestObjectResult)await surveyResponseController.PutSurveyResponseAsync(1, mockRequestObject);
Assert.Equal(400, result.StatusCode);
}
[Fact(DisplayName = "Delete Responses - Ok case")]
public async Task DeleteSurveyAsync_ShouldReturnStatusCode200()
{
SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject();
var mockResponse = await MockData.getOkResponse(mockRequestObject);
mockSurveyResponseService.Setup(service => service.DeleteSurveyResponseAsync(1)).ReturnsAsync(mockResponse);
var surveyResponseController = new ResponsesController(mockSurveyResponseService.Object);
var result = (OkObjectResult)await surveyResponseController.DeleteSurveyResponseAsync(1);
Assert.Equal(200, result.StatusCode);
}
[Fact(DisplayName = "Delete Responses - NotFound case")]
public async Task DeleteSurveyAsync_ShouldReturnStatusCode404()
{
var mockResponse = await MockData.getResponse();
mockSurveyResponseService.Setup(service => service.DeleteSurveyResponseAsync(1)).ReturnsAsync(mockResponse); ;
var surveyResponseController = new ResponsesController(mockSurveyResponseService.Object);
var result = (NotFoundResult)await surveyResponseController.DeleteSurveyResponseAsync(1);
Assert.Equal(404, result.StatusCode);
}
}
}

View File

@ -0,0 +1,80 @@
version: '3.4'
services:
answers:
image: santhoshsnair/damageassesmentapianswers:latest
environment:
- ASPNETCORE_ENVIRONMENT=Development
ports:
- "6001:80"
attachments:
image: santhoshsnair/damageassesmentapiattachments:latest
environment:
- ASPNETCORE_ENVIRONMENT=Development
ports:
- "6002:80"
employees:
image: santhoshsnair/damageassesmentapiemployees:latest
environment:
- ASPNETCORE_ENVIRONMENT=Development
ports:
- "6003:80"
locations:
image: santhoshsnair/damageassesmentapilocations:latest
environment:
- ASPNETCORE_ENVIRONMENT=Development
ports:
- "6004:80"
questions:
image: santhoshsnair/damageassesmentapiquestions:latest
environment:
- ASPNETCORE_ENVIRONMENT=Development
ports:
- "6005:80"
responses:
image: santhoshsnair/damageassesmentapisurveyresponses:latest
environment:
- ASPNETCORE_ENVIRONMENT=Development
- services__Answers=http://10.0.0.4:19081/dasapp/answers/
- services__Locations=http://10.0.0.4:19081/dasapp/locations/
- services__Questions=http://10.0.0.4:19081/dasapp/questions/
- services__Employees=http://10.0.0.4:19081/dasapp/employees/
- services__Attachments=http://10.0.0.4:19081/dasapp/attachments/
- services__Surveys=http://10.0.0.4:19081/dasapp/survey/
ports:
- "6006:80"
surveys:
image: santhoshsnair/damageassesmentapisurveys:latest
environment:
- ASPNETCORE_ENVIRONMENT=Development
ports:
- "6007:80"
doculinks:
image: santhoshsnair/damageassesmentapidoculinks:latest
environment:
- ASPNETCORE_ENVIRONMENT=Development
ports:
- "6009:80"
sqlserver:
image: mcr.microsoft.com/mssql/server:2019-latest
environment:
- SA_PASSWORD=your_password
- ACCEPT_EULA=Y
ports:
- "1433:1433"
volumes:
- ./sql_data:/var/opt/mssql/data

View File

@ -9,7 +9,9 @@
<DockerServiceName>damageassesment.api.answers</DockerServiceName> <DockerServiceName>damageassesment.api.answers</DockerServiceName>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<None Include="docker-compos.tst.yml" />
<None Include="docker-compose.sql.yml" /> <None Include="docker-compose.sql.yml" />
<None Include="docker-compose.asf.yml" />
<None Include="docker-compose.override.yml"> <None Include="docker-compose.override.yml">
<DependentUpon>docker-compose.yml</DependentUpon> <DependentUpon>docker-compose.yml</DependentUpon>
</None> </None>

View File

@ -10,8 +10,7 @@ $microservices = @(
"DamageAssesment.Api.Locations", "DamageAssesment.Api.Locations",
"DamageAssesment.Api.Questions", "DamageAssesment.Api.Questions",
"DamageAssesment.Api.Responses", "DamageAssesment.Api.Responses",
"DamageAssesment.Api.Surveys", "DamageAssesment.Api.Surveys"
"DamageAssesment.Api.UsersAccess"
) )