forked from MDCPS/DamageAssessment_Backend
		
	Compare commits
	
		
			41 Commits
		
	
	
		
			sql-userac
			...
			docker-sql
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 6e305d0db3 | |||
| e82bae41c7 | |||
| 70e3e24875 | |||
| a3a4a85bc1 | |||
| 94e340d941 | |||
| 8b05f61f44 | |||
| 1c26852670 | |||
| 9188ded00e | |||
| 4b9ab46901 | |||
| f967e38c81 | |||
| 5ad4478670 | |||
| d7005479c5 | |||
| 3de53c1198 | |||
| 5cc331202b | |||
| 9ec9b8b96f | |||
| e58782243c | |||
| 795c7c021d | |||
| b209c2619e | |||
| b131994274 | |||
| fcc0205175 | |||
| 0c90a6caaa | |||
| 0ed7641a8b | |||
| 92666d6efa | |||
| 9aa3f230c5 | |||
| 99a7802cf6 | |||
| db5e14bde4 | |||
| 1df15e9a6d | |||
| 66215d1fce | |||
| 281a789deb | |||
| 8ccb37f45b | |||
| fc154274a0 | |||
| 1fba3e81f1 | |||
| f00c7dd99c | |||
| b7e5e7d7fe | |||
| 43eb29c2e8 | |||
| 45c61ee729 | |||
| 17df019d55 | |||
| d0650c36f3 | |||
| 19fac4d810 | |||
| 17cd993a56 | |||
| 6fbe21979f | 
@ -1,6 +1,7 @@
 | 
			
		||||
using DamageAssesment.Api.Answers.Interfaces;
 | 
			
		||||
using Microsoft.AspNetCore.Authorization;
 | 
			
		||||
using Microsoft.AspNetCore.Mvc;
 | 
			
		||||
using Microsoft.EntityFrameworkCore;
 | 
			
		||||
using Microsoft.OpenApi.Any;
 | 
			
		||||
 | 
			
		||||
namespace DamageAssesment.Api.Answers.Controllers
 | 
			
		||||
{
 | 
			
		||||
@ -15,7 +16,7 @@ namespace DamageAssesment.Api.Answers.Controllers
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Get all answers
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        [Authorize(Roles = "admin")]
 | 
			
		||||
        
 | 
			
		||||
        [HttpGet("answers")]
 | 
			
		||||
        public async Task<ActionResult> GetAnswersAsync() {
 | 
			
		||||
        
 | 
			
		||||
@ -31,7 +32,7 @@ namespace DamageAssesment.Api.Answers.Controllers
 | 
			
		||||
        /// Get an answer based on answerId.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
 | 
			
		||||
        [Authorize(Roles = "admin")]
 | 
			
		||||
 | 
			
		||||
        [HttpGet("answers/{id}")]
 | 
			
		||||
        public async Task<ActionResult> GetAnswerByIdAsync(int id)
 | 
			
		||||
        {
 | 
			
		||||
@ -47,7 +48,6 @@ namespace DamageAssesment.Api.Answers.Controllers
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Get all answers based on responseId.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        [Authorize(Roles = "admin")]
 | 
			
		||||
        [HttpGet("answers/byresponse/{responseid}")]
 | 
			
		||||
        public async Task<IActionResult> GetAnswersByResponseId(int responseid)
 | 
			
		||||
        {
 | 
			
		||||
@ -61,7 +61,7 @@ namespace DamageAssesment.Api.Answers.Controllers
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Get all answers based on questionId.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        [Authorize(Roles = "admin")]
 | 
			
		||||
 | 
			
		||||
        [HttpGet("answers/byquestion/{questionid}")]
 | 
			
		||||
        public async Task<IActionResult> AnswersByQuestionId(int questionid)
 | 
			
		||||
        {
 | 
			
		||||
@ -75,7 +75,7 @@ namespace DamageAssesment.Api.Answers.Controllers
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Update an existing answer.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        [Authorize(Roles = "admin")]
 | 
			
		||||
 | 
			
		||||
        [HttpPut("answers")]
 | 
			
		||||
        public async Task<IActionResult> UpdateAnswer(Models.Answer answer)
 | 
			
		||||
        {
 | 
			
		||||
@ -96,7 +96,7 @@ namespace DamageAssesment.Api.Answers.Controllers
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Save a new answer.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        [Authorize(Roles = "admin")]
 | 
			
		||||
 | 
			
		||||
        [HttpPost("answers")]
 | 
			
		||||
        public async Task<IActionResult> CreateAnswer(Models.Answer answer)
 | 
			
		||||
        {
 | 
			
		||||
@ -114,7 +114,7 @@ namespace DamageAssesment.Api.Answers.Controllers
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        ///  Delete an existing answer.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        [Authorize(Roles = "admin")]
 | 
			
		||||
 | 
			
		||||
        [HttpDelete("answers/{id}")]
 | 
			
		||||
        public async Task<IActionResult> DeleteAnswer(int id)
 | 
			
		||||
        {
 | 
			
		||||
 | 
			
		||||
@ -1,77 +1,29 @@
 | 
			
		||||
using DamageAssesment.Api.Answers.Db;
 | 
			
		||||
using DamageAssesment.Api.Answers.Interfaces;
 | 
			
		||||
using DamageAssesment.Api.Answers.Providers;
 | 
			
		||||
using Microsoft.AspNetCore.Authentication.JwtBearer;
 | 
			
		||||
using Microsoft.EntityFrameworkCore;
 | 
			
		||||
using Microsoft.IdentityModel.Tokens;
 | 
			
		||||
using Microsoft.OpenApi.Models;
 | 
			
		||||
using System.Reflection;
 | 
			
		||||
using System.Text;
 | 
			
		||||
 | 
			
		||||
var builder = WebApplication.CreateBuilder(args);
 | 
			
		||||
 | 
			
		||||
// Add services to the container.
 | 
			
		||||
 | 
			
		||||
// CORS setup to allow requests from any origin.
 | 
			
		||||
builder.Services.AddCors(p => p.AddPolicy("DamageAppCorsPolicy", build => {
 | 
			
		||||
    build.WithOrigins("*").AllowAnyMethod().AllowAnyHeader().AllowAnyOrigin();
 | 
			
		||||
}));
 | 
			
		||||
 | 
			
		||||
var authkey = builder.Configuration.GetValue<string>("JwtSettings:securitykey");
 | 
			
		||||
builder.Services.AddAuthentication(item =>
 | 
			
		||||
{
 | 
			
		||||
    item.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
 | 
			
		||||
    item.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
 | 
			
		||||
}).AddJwtBearer(item =>
 | 
			
		||||
{
 | 
			
		||||
    item.RequireHttpsMetadata = true;
 | 
			
		||||
    item.SaveToken = true;
 | 
			
		||||
    item.TokenValidationParameters = new TokenValidationParameters()
 | 
			
		||||
    {
 | 
			
		||||
        ValidateIssuerSigningKey = true,
 | 
			
		||||
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(authkey)),
 | 
			
		||||
        ValidateIssuer = false,
 | 
			
		||||
        ValidateAudience = false,
 | 
			
		||||
        ClockSkew = TimeSpan.Zero
 | 
			
		||||
    };
 | 
			
		||||
});
 | 
			
		||||
// Add services to the container.
 | 
			
		||||
 | 
			
		||||
builder.Services.AddControllers();
 | 
			
		||||
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
 | 
			
		||||
builder.Services.AddEndpointsApiExplorer();
 | 
			
		||||
//builder.Services.AddSwaggerGen();
 | 
			
		||||
builder.Services.AddSwaggerGen(options =>
 | 
			
		||||
// Add Swagger/OpenAPI documentation support.
 | 
			
		||||
builder.Services.AddSwaggerGen(c =>
 | 
			
		||||
{
 | 
			
		||||
    // Include XML comments from your assembly
 | 
			
		||||
    var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
 | 
			
		||||
    var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
 | 
			
		||||
    options.IncludeXmlComments(xmlPath);
 | 
			
		||||
 | 
			
		||||
    OpenApiSecurityScheme securityDefinition = new OpenApiSecurityScheme()
 | 
			
		||||
    {
 | 
			
		||||
        Name = "Bearer",
 | 
			
		||||
        BearerFormat = "JWT",
 | 
			
		||||
        Scheme = "bearer",
 | 
			
		||||
        Description = "Specify the authorization token.",
 | 
			
		||||
        In = ParameterLocation.Header,
 | 
			
		||||
        Type = SecuritySchemeType.Http,
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    options.AddSecurityDefinition("jwt_auth", securityDefinition);
 | 
			
		||||
 | 
			
		||||
    // Make sure swagger UI requires a Bearer token specified
 | 
			
		||||
    OpenApiSecurityScheme securityScheme = new OpenApiSecurityScheme()
 | 
			
		||||
    {
 | 
			
		||||
        Reference = new OpenApiReference()
 | 
			
		||||
        {
 | 
			
		||||
            Id = "jwt_auth",
 | 
			
		||||
            Type = ReferenceType.SecurityScheme
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    OpenApiSecurityRequirement securityRequirements = new OpenApiSecurityRequirement()
 | 
			
		||||
    {
 | 
			
		||||
        {securityScheme, new string[] { }},
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    options.AddSecurityRequirement(securityRequirements);
 | 
			
		||||
    c.IncludeXmlComments(xmlPath);
 | 
			
		||||
});
 | 
			
		||||
builder.Services.AddScoped<IAnswersProvider, AnswersProvider>();
 | 
			
		||||
builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies()); //4/30
 | 
			
		||||
@ -80,8 +32,11 @@ builder.Services.AddDbContext<AnswerDbContext>(option =>
 | 
			
		||||
    option.UseSqlServer("AnswerConnection");
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
var app = builder.Build();
 | 
			
		||||
builder.Services.AddCors(p => p.AddPolicy("DamageAppCorsPolicy", build => {
 | 
			
		||||
    build.WithOrigins("*").AllowAnyMethod().AllowAnyHeader().AllowAnyOrigin();
 | 
			
		||||
}));
 | 
			
		||||
 | 
			
		||||
var app = builder.Build();
 | 
			
		||||
 | 
			
		||||
// Configure the HTTP request pipeline.
 | 
			
		||||
if (app.Environment.IsDevelopment())
 | 
			
		||||
@ -90,9 +45,12 @@ if (app.Environment.IsDevelopment())
 | 
			
		||||
    app.UseSwaggerUI();
 | 
			
		||||
}
 | 
			
		||||
app.UseCors("DamageAppCorsPolicy");
 | 
			
		||||
app.UseAuthentication();
 | 
			
		||||
app.UseAuthorization();
 | 
			
		||||
 | 
			
		||||
// Enable CORS, authentication, and authorization middleware.
 | 
			
		||||
app.UseCors("DamageAppCorsPolicy");
 | 
			
		||||
app.UseAuthorization();
 | 
			
		||||
// Map controllers to their respective routes.
 | 
			
		||||
app.MapControllers();
 | 
			
		||||
 | 
			
		||||
app.Run();
 | 
			
		||||
 | 
			
		||||
@ -11,6 +11,7 @@
 | 
			
		||||
  "AllowedHosts": "*",
 | 
			
		||||
  "ConnectionStrings": {
 | 
			
		||||
    //"AnswerConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;"
 | 
			
		||||
    // "AnswerConnection": "Server=localhost,1433;Database=da_survey_dev;User Id=sa;Password=Password123;TrustServerCertificate=True;",
 | 
			
		||||
    "AnswerConnection": "Server=207.180.248.35;Database=da_survey_dev;User Id=sa;Password=YourStrongPassw0rd;TrustServerCertificate=True;"
 | 
			
		||||
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@ -79,8 +79,8 @@ namespace DamageAssesment.Api.Attachments.Test
 | 
			
		||||
            var mockInputAttachment = await MockData.getInputAttachmentData();
 | 
			
		||||
            mockAttachmentService.Setup(service => service.PostAttachmentAsync(mockInputAttachment)).ReturnsAsync(mockResponse);
 | 
			
		||||
 | 
			
		||||
            var AttachmentProvider = new AttachmentsController(mockAttachmentService.Object, mockUploadService.Object);
 | 
			
		||||
            var result = (NoContentResult)await AttachmentProvider.UploadAttachmentAsync(AttachmentResponse);
 | 
			
		||||
            var AttachmentProvider = new AttachmentsController(mockAttachmentService.Object, mockUploadService.Object);            
 | 
			
		||||
            var result = (NoContentResult) await AttachmentProvider.UploadAttachmentAsync(AttachmentResponse);
 | 
			
		||||
 | 
			
		||||
            Assert.Equal(204, result.StatusCode);
 | 
			
		||||
        }
 | 
			
		||||
@ -95,8 +95,8 @@ namespace DamageAssesment.Api.Attachments.Test
 | 
			
		||||
            mockAttachmentService.Setup(service => service.PostAttachmentAsync(mockInputAttachment)).ReturnsAsync(mockResponse);
 | 
			
		||||
 | 
			
		||||
            var AttachmentProvider = new AttachmentsController(mockAttachmentService.Object, mockUploadService.Object);
 | 
			
		||||
            AttachmentInfo attachmentInfo = new AttachmentInfo();
 | 
			
		||||
            var result = (BadRequestObjectResult)await AttachmentProvider.UploadAttachmentAsync(attachmentInfo);
 | 
			
		||||
            AttachmentInfo attachmentInfo=new AttachmentInfo();
 | 
			
		||||
            var result = (BadRequestObjectResult) await AttachmentProvider.UploadAttachmentAsync(attachmentInfo);
 | 
			
		||||
 | 
			
		||||
            Assert.Equal(400, result.StatusCode);
 | 
			
		||||
        }
 | 
			
		||||
@ -112,7 +112,7 @@ namespace DamageAssesment.Api.Attachments.Test
 | 
			
		||||
            mockAttachmentService.Setup(service => service.PostAttachmentAsync(mockInputAttachment)).ReturnsAsync(mockResponse);
 | 
			
		||||
 | 
			
		||||
            var AttachmentProvider = new AttachmentsController(mockAttachmentService.Object, mockUploadService.Object);
 | 
			
		||||
            var result = (NoContentResult)await AttachmentProvider.UpdateAttachmentAsync(AttachmentResponse);
 | 
			
		||||
            var result = (NoContentResult) await AttachmentProvider.UpdateAttachmentAsync(AttachmentResponse);
 | 
			
		||||
 | 
			
		||||
            Assert.Equal(204, result.StatusCode);
 | 
			
		||||
        }
 | 
			
		||||
@ -128,7 +128,7 @@ namespace DamageAssesment.Api.Attachments.Test
 | 
			
		||||
 | 
			
		||||
            var AttachmentProvider = new AttachmentsController(mockAttachmentService.Object, mockUploadService.Object);
 | 
			
		||||
            AttachmentInfo attachmentInfo = new AttachmentInfo();
 | 
			
		||||
            var result = (BadRequestObjectResult)await AttachmentProvider.UpdateAttachmentAsync(attachmentInfo);
 | 
			
		||||
            var result = (BadRequestObjectResult) await AttachmentProvider.UpdateAttachmentAsync(attachmentInfo);
 | 
			
		||||
 | 
			
		||||
            Assert.Equal(400, result.StatusCode);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,6 @@
 | 
			
		||||
using Azure;
 | 
			
		||||
using DamageAssesment.Api.Attachments.Interfaces;
 | 
			
		||||
using DamageAssesment.Api.Attachments.Models;
 | 
			
		||||
using Microsoft.AspNetCore.Authorization;
 | 
			
		||||
using Microsoft.AspNetCore.Http;
 | 
			
		||||
using Microsoft.AspNetCore.Mvc;
 | 
			
		||||
using System.Net.Http.Headers;
 | 
			
		||||
@ -13,17 +12,16 @@ namespace DamageAssesment.Api.Attachments.Controllers
 | 
			
		||||
    {
 | 
			
		||||
        private IAttachmentsProvider AttachmentProvider;
 | 
			
		||||
        private IUploadService UploadService;
 | 
			
		||||
        private IAzureBlobService azureBlobService;
 | 
			
		||||
 | 
			
		||||
        public AttachmentsController(IAttachmentsProvider AttachmentsProvider, IUploadService UploadService)
 | 
			
		||||
        public AttachmentsController(IAttachmentsProvider AttachmentsProvider, IUploadService uploadService)
 | 
			
		||||
        {
 | 
			
		||||
            this.AttachmentProvider = AttachmentsProvider;
 | 
			
		||||
            this.UploadService = UploadService;
 | 
			
		||||
            this.UploadService = uploadService;  
 | 
			
		||||
        }
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Get all attachments.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        [Authorize(Roles = "admin")]
 | 
			
		||||
 | 
			
		||||
        [HttpGet("attachments")]
 | 
			
		||||
        public async Task<ActionResult> GetAttachmentsAsync()
 | 
			
		||||
        {
 | 
			
		||||
@ -39,7 +37,6 @@ namespace DamageAssesment.Api.Attachments.Controllers
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Get all attachments by attachmentId.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        [Authorize(Roles = "admin")]
 | 
			
		||||
        [HttpGet("attachments/{id}")]
 | 
			
		||||
        public async Task<ActionResult> GetAttachmentbyIdAsync(int id)
 | 
			
		||||
        {
 | 
			
		||||
@ -83,7 +80,7 @@ namespace DamageAssesment.Api.Attachments.Controllers
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Save new Attachment(s)
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        [Authorize(Roles = "admin")]
 | 
			
		||||
 | 
			
		||||
        [HttpPost("attachments"), DisableRequestSizeLimit]
 | 
			
		||||
        public async Task<IActionResult> UploadAttachmentAsync(AttachmentInfo attachmentInfo)
 | 
			
		||||
        {
 | 
			
		||||
@ -92,7 +89,7 @@ namespace DamageAssesment.Api.Attachments.Controllers
 | 
			
		||||
                if (attachmentInfo.Answers.Count > 0)
 | 
			
		||||
                {
 | 
			
		||||
                    var Attachments =  await this.AttachmentProvider.GetAttachmentCounter();
 | 
			
		||||
                    List<Models.Attachment> attachments =  UploadService.UploadAttachment(attachmentInfo.ResponseId, Attachments.counter, attachmentInfo.Answers);
 | 
			
		||||
                    List<Models.Attachment> attachments = UploadService.UploadAttachment(attachmentInfo.ResponseId, Attachments.counter, attachmentInfo.Answers);
 | 
			
		||||
                    var result =  await this.AttachmentProvider.PostAttachmentAsync(attachments);
 | 
			
		||||
                    if (result.IsSuccess)
 | 
			
		||||
                    {
 | 
			
		||||
@ -110,7 +107,7 @@ namespace DamageAssesment.Api.Attachments.Controllers
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Modify an new attachment.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        [Authorize(Roles = "admin")]
 | 
			
		||||
 | 
			
		||||
        [HttpPut("attachments"), DisableRequestSizeLimit]
 | 
			
		||||
        public async Task<IActionResult> UpdateAttachmentAsync(AttachmentInfo attachmentInfo)
 | 
			
		||||
        {
 | 
			
		||||
@ -121,7 +118,7 @@ namespace DamageAssesment.Api.Attachments.Controllers
 | 
			
		||||
                    var res =  await this.AttachmentProvider.GetAttachmentInfo(attachmentInfo.Answers);
 | 
			
		||||
                    if (res.IsSuccess)
 | 
			
		||||
                    {
 | 
			
		||||
                        List<Models.Attachment> attachments =  UploadService.UpdateAttachments(attachmentInfo.ResponseId, attachmentInfo.Answers, res.Attachments);
 | 
			
		||||
                        List<Models.Attachment> attachments = UploadService.UpdateAttachments(attachmentInfo.ResponseId, attachmentInfo.Answers, res.Attachments);
 | 
			
		||||
                        var result = await this.AttachmentProvider.PutAttachmentAsync(attachments);
 | 
			
		||||
                        if (result.IsSuccess)
 | 
			
		||||
                        {
 | 
			
		||||
@ -141,7 +138,6 @@ namespace DamageAssesment.Api.Attachments.Controllers
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// download an existing attachment.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        [Authorize(Roles = "admin")]
 | 
			
		||||
        [HttpGet("attachments/download/{id}")]
 | 
			
		||||
        public async Task<IActionResult> downloadfile(int id)
 | 
			
		||||
        {
 | 
			
		||||
@ -216,7 +212,6 @@ namespace DamageAssesment.Api.Attachments.Controllers
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Delete an existing attachment.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        [Authorize(Roles = "admin")]
 | 
			
		||||
        [HttpDelete("attachments/{id}")]
 | 
			
		||||
        public async Task<IActionResult> DeleteAttachment(int id)
 | 
			
		||||
        {
 | 
			
		||||
 | 
			
		||||
@ -1,15 +1,10 @@
 | 
			
		||||
using Azure.Storage.Blobs.Models;
 | 
			
		||||
using DamageAssesment.Api.Attachments.Models;
 | 
			
		||||
 | 
			
		||||
namespace DamageAssesment.Api.Attachments.Interfaces
 | 
			
		||||
{
 | 
			
		||||
    public interface IAzureBlobService
 | 
			
		||||
    {
 | 
			
		||||
        Task<List<Azure.Response<BlobContentInfo>>> UploadFiles(List<IFormFile> files);
 | 
			
		||||
        Task<List<Attachment>> UploadAttachment(int responseId, int answerId, int counter, List<IFormFile> postedFile);
 | 
			
		||||
        Task<List<Attachment>> UploadAttachment(int responseId, int counter, List<AnswerInfo> answers);
 | 
			
		||||
        Task<List<Attachment>> UpdateAttachments(int responseId, List<AnswerInfo> answers, IEnumerable<Models.Attachment> attachments);
 | 
			
		||||
        void Deletefile(string path);
 | 
			
		||||
        void Movefile(string path);
 | 
			
		||||
        void DeleteFile(string path);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1,79 +1,31 @@
 | 
			
		||||
using DamageAssesment.Api.Attachments.Db;
 | 
			
		||||
using DamageAssesment.Api.Attachments.Interfaces;
 | 
			
		||||
using DamageAssesment.Api.Attachments.Providers;
 | 
			
		||||
using Microsoft.AspNetCore.Authentication.JwtBearer;
 | 
			
		||||
using Microsoft.AspNetCore.Http.Features;
 | 
			
		||||
using Microsoft.EntityFrameworkCore;
 | 
			
		||||
using Microsoft.Extensions.FileProviders;
 | 
			
		||||
using Microsoft.IdentityModel.Tokens;
 | 
			
		||||
using Microsoft.OpenApi.Models;
 | 
			
		||||
using System.Reflection;
 | 
			
		||||
using System.Text;
 | 
			
		||||
 | 
			
		||||
var builder = WebApplication.CreateBuilder(args);
 | 
			
		||||
 | 
			
		||||
// CORS setup to allow requests from any origin.
 | 
			
		||||
builder.Services.AddCors(p => p.AddPolicy("DamageAppCorsPolicy", build => {
 | 
			
		||||
    build.WithOrigins("*").AllowAnyMethod().AllowAnyHeader().AllowAnyOrigin();
 | 
			
		||||
}));
 | 
			
		||||
var authkey = builder.Configuration.GetValue<string>("JwtSettings:securitykey");
 | 
			
		||||
 | 
			
		||||
builder.Services.AddAuthentication(item =>
 | 
			
		||||
{
 | 
			
		||||
    item.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
 | 
			
		||||
    item.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
 | 
			
		||||
}).AddJwtBearer(item =>
 | 
			
		||||
{
 | 
			
		||||
    item.RequireHttpsMetadata = true;
 | 
			
		||||
    item.SaveToken = true;
 | 
			
		||||
    item.TokenValidationParameters = new TokenValidationParameters()
 | 
			
		||||
    {
 | 
			
		||||
        ValidateIssuerSigningKey = true,
 | 
			
		||||
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(authkey)),
 | 
			
		||||
        ValidateIssuer = false,
 | 
			
		||||
        ValidateAudience = false,
 | 
			
		||||
        ClockSkew = TimeSpan.Zero
 | 
			
		||||
    };
 | 
			
		||||
});
 | 
			
		||||
// Add services to the container.
 | 
			
		||||
 | 
			
		||||
builder.Services.AddControllers();
 | 
			
		||||
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
 | 
			
		||||
builder.Services.AddEndpointsApiExplorer();
 | 
			
		||||
//builder.Services.AddSwaggerGen();
 | 
			
		||||
builder.Services.AddSwaggerGen(options =>
 | 
			
		||||
// Add Swagger/OpenAPI documentation support.
 | 
			
		||||
builder.Services.AddSwaggerGen(c =>
 | 
			
		||||
{
 | 
			
		||||
    // Include XML comments from your assembly
 | 
			
		||||
    var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
 | 
			
		||||
    var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
 | 
			
		||||
    options.IncludeXmlComments(xmlPath);
 | 
			
		||||
 | 
			
		||||
    OpenApiSecurityScheme securityDefinition = new OpenApiSecurityScheme()
 | 
			
		||||
    {
 | 
			
		||||
        Name = "Bearer",
 | 
			
		||||
        BearerFormat = "JWT",
 | 
			
		||||
        Scheme = "bearer",
 | 
			
		||||
        Description = "Specify the authorization token.",
 | 
			
		||||
        In = ParameterLocation.Header,
 | 
			
		||||
        Type = SecuritySchemeType.Http,
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    options.AddSecurityDefinition("jwt_auth", securityDefinition);
 | 
			
		||||
 | 
			
		||||
    // Make sure swagger UI requires a Bearer token specified
 | 
			
		||||
    OpenApiSecurityScheme securityScheme = new OpenApiSecurityScheme()
 | 
			
		||||
    {
 | 
			
		||||
        Reference = new OpenApiReference()
 | 
			
		||||
        {
 | 
			
		||||
            Id = "jwt_auth",
 | 
			
		||||
            Type = ReferenceType.SecurityScheme
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    OpenApiSecurityRequirement securityRequirements = new OpenApiSecurityRequirement()
 | 
			
		||||
    {
 | 
			
		||||
        {securityScheme, new string[] { }},
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    options.AddSecurityRequirement(securityRequirements);
 | 
			
		||||
    c.IncludeXmlComments(xmlPath);
 | 
			
		||||
});
 | 
			
		||||
builder.Services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
 | 
			
		||||
builder.Services.AddScoped<IAttachmentsProvider, AttachmentsProvider>();
 | 
			
		||||
@ -90,6 +42,9 @@ builder.Services.Configure<FormOptions>(o =>
 | 
			
		||||
    o.MultipartBodyLengthLimit = int.MaxValue;
 | 
			
		||||
    o.MemoryBufferThreshold = int.MaxValue;
 | 
			
		||||
});
 | 
			
		||||
builder.Services.AddCors(p => p.AddPolicy("DamageAppCorsPolicy", build => {
 | 
			
		||||
    build.WithOrigins("*").AllowAnyMethod().AllowAnyHeader().AllowAnyOrigin();
 | 
			
		||||
}));
 | 
			
		||||
 | 
			
		||||
var app = builder.Build();
 | 
			
		||||
 | 
			
		||||
@ -99,11 +54,12 @@ if (app.Environment.IsDevelopment())
 | 
			
		||||
    app.UseSwagger();
 | 
			
		||||
    app.UseSwaggerUI();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Enable CORS, authentication, and authorization middleware.
 | 
			
		||||
 | 
			
		||||
app.UseCors("DamageAppCorsPolicy");
 | 
			
		||||
app.UseAuthentication();
 | 
			
		||||
app.UseAuthorization();
 | 
			
		||||
app.UseHttpsRedirection();
 | 
			
		||||
 | 
			
		||||
app.MapControllers();
 | 
			
		||||
app.UseStaticFiles();
 | 
			
		||||
app.Run();
 | 
			
		||||
 | 
			
		||||
@ -25,7 +25,7 @@ namespace DamageAssesment.Api.Attachments.Providers
 | 
			
		||||
            this.httpContextAccessor = httpContextAccessor;
 | 
			
		||||
            baseUrl = $"{httpContextAccessor.HttpContext.Request.Scheme}://{httpContextAccessor.HttpContext.Request.Host}";
 | 
			
		||||
            baseUrl = baseUrl + "/attachments/download";
 | 
			
		||||
           // SeedData();
 | 
			
		||||
            //SeedData();
 | 
			
		||||
        }
 | 
			
		||||
        public async Task<(bool IsSuccess, IEnumerable<Models.Attachment> Attachments, string ErrorMessage)> GetAttachmentsAsync()
 | 
			
		||||
        {
 | 
			
		||||
 | 
			
		||||
@ -3,9 +3,6 @@ using Azure.Storage.Blobs;
 | 
			
		||||
using Azure.Storage.Blobs.Models;
 | 
			
		||||
using Azure.Storage.Blobs.Specialized;
 | 
			
		||||
using DamageAssesment.Api.Attachments.Interfaces;
 | 
			
		||||
using DamageAssesment.Api.Attachments.Models;
 | 
			
		||||
using System.Diagnostics.Metrics;
 | 
			
		||||
using System.Text;
 | 
			
		||||
 | 
			
		||||
namespace DamageAssesment.Api.Attachments.Providers
 | 
			
		||||
{
 | 
			
		||||
@ -13,95 +10,11 @@ namespace DamageAssesment.Api.Attachments.Providers
 | 
			
		||||
    {
 | 
			
		||||
        BlobServiceClient _blobClient;
 | 
			
		||||
        BlobContainerClient _containerClient;
 | 
			
		||||
        string azureConnectionString;
 | 
			
		||||
        private string uploadpath = "";
 | 
			
		||||
        private string Deletepath = "";
 | 
			
		||||
        public AzureBlobService(IConfiguration configuration)
 | 
			
		||||
        string azureConnectionString = "<Primary Connection String>";
 | 
			
		||||
        public AzureBlobService()
 | 
			
		||||
        {
 | 
			
		||||
            uploadpath = configuration.GetValue<string>("Fileupload:folderpath");
 | 
			
		||||
            Deletepath = configuration.GetValue<string>("Fileupload:Deletepath");
 | 
			
		||||
            _blobClient = new BlobServiceClient(configuration.GetValue<string>("Fileupload:BlobConnectionString"));
 | 
			
		||||
            _containerClient = _blobClient.GetBlobContainerClient(configuration.GetValue<string>("Fileupload:BlobContainerName"));
 | 
			
		||||
        }
 | 
			
		||||
        public async Task<List<Attachment>> UploadAttachment(int responseId, int answerId, int counter, List<IFormFile> postedFile)
 | 
			
		||||
        {
 | 
			
		||||
            var pathToSave = Path.Combine(uploadpath, "Response-" + responseId);
 | 
			
		||||
            String fullDirectoryPath = Path.Combine(pathToSave, "Answer-" + answerId);
 | 
			
		||||
            List<Models.Attachment> attachments = new List<Models.Attachment>();
 | 
			
		||||
            foreach (IFormFile item in postedFile)
 | 
			
		||||
            {
 | 
			
		||||
 | 
			
		||||
                counter++;
 | 
			
		||||
                var UserfileName = Path.GetFileName(item.FileName);
 | 
			
		||||
                var extension = System.IO.Path.GetExtension(UserfileName);
 | 
			
		||||
                var fileName = String.Format("Attachment_{0}{1}", counter, extension);
 | 
			
		||||
                var stream = item.OpenReadStream();
 | 
			
		||||
                BlobClient client = _containerClient.GetBlobClient(fullDirectoryPath + "/" + fileName);
 | 
			
		||||
                string dbPath = fullDirectoryPath + "/" + fileName;
 | 
			
		||||
                var result = await client.UploadAsync(stream, true);
 | 
			
		||||
                attachments.Add(new Models.Attachment { AnswerId = answerId, ResponseId = responseId, IsDeleted = false, FileName = UserfileName, URI = dbPath });
 | 
			
		||||
            }
 | 
			
		||||
            return attachments;
 | 
			
		||||
        }
 | 
			
		||||
        public async Task<List<Attachment>> UploadAttachment(int responseId, int counter, List<AnswerInfo> answers)
 | 
			
		||||
        {
 | 
			
		||||
            List<Models.Attachment> attachments = new List<Models.Attachment>();
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                foreach (var item in answers)
 | 
			
		||||
                {
 | 
			
		||||
                    int answerId = item.AnswerId;
 | 
			
		||||
                    var pathToSave = Path.Combine(uploadpath, "Response-" + responseId);
 | 
			
		||||
                    String fullDirectoryPath = Path.Combine(pathToSave, "Answer-" + answerId);
 | 
			
		||||
                    foreach (var file in item.postedFiles)
 | 
			
		||||
                    {
 | 
			
		||||
                        counter++;
 | 
			
		||||
 | 
			
		||||
                        var UserfileName = Path.GetFileName(file.FileName);
 | 
			
		||||
                        var fileName = String.Format("Attachment_{0}{1}", counter, file.FileExtension);
 | 
			
		||||
                        byte[] byteArray = Convert.FromBase64String(file.FileContent);
 | 
			
		||||
                        MemoryStream stream = new MemoryStream(byteArray);
 | 
			
		||||
                        BlobClient client = _containerClient.GetBlobClient(fullDirectoryPath + "/" + fileName);
 | 
			
		||||
                        string dbPath = fullDirectoryPath + "/" + fileName;
 | 
			
		||||
                        var result = await client.UploadAsync(stream, true);
 | 
			
		||||
                        attachments.Add(new Models.Attachment { AnswerId = answerId, ResponseId = responseId, IsDeleted = false, FileName = UserfileName, URI = dbPath });
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                return attachments;
 | 
			
		||||
            }
 | 
			
		||||
            catch (Exception ex)
 | 
			
		||||
            {
 | 
			
		||||
                return new List<Models.Attachment>();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
        public async Task<List<Attachment>> UpdateAttachments(int responseId, List<AnswerInfo> answers, IEnumerable<Models.Attachment> attachments)
 | 
			
		||||
        {
 | 
			
		||||
            List<Models.Attachment> Dbattachments = new List<Models.Attachment>();
 | 
			
		||||
            foreach (Models.Attachment searchFile in attachments)
 | 
			
		||||
            {
 | 
			
		||||
                Movefile(searchFile.URI);
 | 
			
		||||
            }
 | 
			
		||||
            foreach (var item in answers)
 | 
			
		||||
            {
 | 
			
		||||
                int answerId = item.AnswerId;
 | 
			
		||||
                var pathToSave = Path.Combine(uploadpath, "Response-" + responseId);
 | 
			
		||||
                String fullDirectoryPath = Path.Combine(pathToSave, "Answer-" + answerId);
 | 
			
		||||
                foreach (var file in item.postedFiles)
 | 
			
		||||
                {
 | 
			
		||||
                    Models.Attachment attachment = attachments.Where(a => a.Id == file.AttachmentId).FirstOrDefault();
 | 
			
		||||
                    var UserfileName = Path.GetFileName(file.FileName);
 | 
			
		||||
                    var fileName = String.Format("Attachment_{0}{1}", attachment?.Id, file.FileExtension);
 | 
			
		||||
                    byte[] byteArray = Convert.FromBase64String(file.FileContent);
 | 
			
		||||
                    MemoryStream stream = new MemoryStream(byteArray);
 | 
			
		||||
                    BlobClient client = _containerClient.GetBlobClient(fullDirectoryPath + "/" + fileName);
 | 
			
		||||
                    string dbPath = fullDirectoryPath + "/" + fileName;
 | 
			
		||||
                    var result = await client.UploadAsync(stream, true);
 | 
			
		||||
                    Dbattachments.Add(new Models.Attachment { Id = attachment.Id, AnswerId = answerId, ResponseId = responseId, IsDeleted = false, FileName = UserfileName, URI = dbPath });
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            return Dbattachments;
 | 
			
		||||
            _blobClient = new BlobServiceClient(azureConnectionString);
 | 
			
		||||
            _containerClient = _blobClient.GetBlobContainerClient("apiimages");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public async Task<List<Azure.Response<BlobContentInfo>>> UploadFiles(List<IFormFile> files)
 | 
			
		||||
@ -122,52 +35,10 @@ namespace DamageAssesment.Api.Attachments.Providers
 | 
			
		||||
 | 
			
		||||
            return azureResponse;
 | 
			
		||||
        }
 | 
			
		||||
        public string getMovefilename(string movefilename)
 | 
			
		||||
        public void DeleteFile(string url)
 | 
			
		||||
        {
 | 
			
		||||
            var list = movefilename.Split('.');
 | 
			
		||||
            if (list.Length > 0)
 | 
			
		||||
                list[list.Length - 1] = DateTime.Now.ToShortDateString().Replace("/", "_") + "_" + DateTime.Now.ToShortTimeString().Replace("/", "_") + "." + list[list.Length - 1];
 | 
			
		||||
            return string.Join("_", list);
 | 
			
		||||
        }
 | 
			
		||||
        public void Movefile(string path)
 | 
			
		||||
        {
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                if (path != "")
 | 
			
		||||
                {
 | 
			
		||||
                    string MovePath = getMovefilename(path.Replace(uploadpath, Deletepath));
 | 
			
		||||
                    // Get references to the source and destination blobs
 | 
			
		||||
                    BlobClient sourceBlobClient = _containerClient.GetBlobClient(path);
 | 
			
		||||
                    BlobClient destinationBlobClient = _containerClient.GetBlobClient(MovePath);
 | 
			
		||||
                    // Start the copy operation from the source to the destination
 | 
			
		||||
                    destinationBlobClient.StartCopyFromUri(sourceBlobClient.Uri);
 | 
			
		||||
 | 
			
		||||
                    // Check if the copy operation completed successfully
 | 
			
		||||
                    WaitForCopyToComplete(destinationBlobClient);
 | 
			
		||||
 | 
			
		||||
                    // Delete the source blob after a successful copy
 | 
			
		||||
                    sourceBlobClient.DeleteIfExists();
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            catch (Exception ex)
 | 
			
		||||
            {
 | 
			
		||||
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        static void WaitForCopyToComplete(BlobClient blobClient)
 | 
			
		||||
        {
 | 
			
		||||
            BlobProperties properties = blobClient.GetProperties();
 | 
			
		||||
 | 
			
		||||
            while (properties.CopyStatus == CopyStatus.Pending)
 | 
			
		||||
            {
 | 
			
		||||
                Task.Delay(TimeSpan.FromSeconds(1));
 | 
			
		||||
                properties = blobClient.GetProperties();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        public void Deletefile(string url)
 | 
			
		||||
        {
 | 
			
		||||
            BlobClient sourceBlobClient = _containerClient.GetBlobClient(url);
 | 
			
		||||
            sourceBlobClient.DeleteIfExists();
 | 
			
		||||
            var blob = _containerClient.GetBlockBlobClient(url);
 | 
			
		||||
            blob.DeleteIfExists();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -11,14 +11,12 @@
 | 
			
		||||
  "AllowedHosts": "*",
 | 
			
		||||
  "Fileupload": {
 | 
			
		||||
    "folderpath": "DMS_Attachments/Active",
 | 
			
		||||
    "Deletepath": "DMS_Attachments/Deleted",
 | 
			
		||||
    "BlobConnectionString": "DefaultEndpointsProtocol=https;AccountName=damagedoculink;AccountKey=blynpwrAQtthEneXC5f4vFewJ3tPV+QZUt1AX3nefZScPPjkr5hMoC18B9ni6/ZYdhRiERPQw+hB+AStonf+iw==;EndpointSuffix=core.windows.net",
 | 
			
		||||
    "BlobContainerName": "doculinks"
 | 
			
		||||
    "Deletepath": "DMS_Attachments/Deleted"
 | 
			
		||||
  },
 | 
			
		||||
  "ConnectionStrings": {
 | 
			
		||||
    //"AttachmentConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;"
 | 
			
		||||
    // "AttachmentConnection": "Server=localhost,1433;Database=da_survey_dev;User Id=sa;Password=Password123;TrustServerCertificate=True;"
 | 
			
		||||
    "AttachmentConnection": "Server=207.180.248.35;Database=da_survey_dev;User Id=sa;Password=YourStrongPassw0rd;TrustServerCertificate=True;"
 | 
			
		||||
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
  
 | 
			
		||||
@ -44,10 +44,10 @@ namespace DamageAssesment.Api.DocuLinks.Test
 | 
			
		||||
            var mockDocumentService = new Mock<IDoculinkProvider>();
 | 
			
		||||
            var mockUploadService = new Mock<IUploadService>();
 | 
			
		||||
            var mockResponse = await MockData.getOkResponses();
 | 
			
		||||
            mockDocumentService.Setup(service => service.GetdocumentsByLinkAsync("forms", "en", null)).ReturnsAsync(mockResponse);
 | 
			
		||||
            mockDocumentService.Setup(service => service.GetdocumentsByLinkAsync("forms","en", null)).ReturnsAsync(mockResponse);
 | 
			
		||||
 | 
			
		||||
            var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object);
 | 
			
		||||
            var result = (OkObjectResult)await DocumentProvider.GetDocumentsAsync("forms", "en", null);
 | 
			
		||||
            var result = (OkObjectResult)await DocumentProvider.GetDocumentsAsync("forms","en", null);
 | 
			
		||||
 | 
			
		||||
            Assert.Equal(200, result.StatusCode);
 | 
			
		||||
        }
 | 
			
		||||
@ -97,7 +97,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
 | 
			
		||||
            var mockDocumentService = new Mock<IDoculinkProvider>();
 | 
			
		||||
            var mockUploadService = new Mock<IUploadService>();
 | 
			
		||||
            var mockResponse = await MockData.getOkResponse(1);
 | 
			
		||||
            mockDocumentService.Setup(service => service.GetDocumentAsync(1, "forms", "en")).ReturnsAsync(mockResponse);
 | 
			
		||||
            mockDocumentService.Setup(service => service.GetDocumentAsync(1,"forms","en")).ReturnsAsync(mockResponse);
 | 
			
		||||
 | 
			
		||||
            var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object);
 | 
			
		||||
            var result = (OkObjectResult)await DocumentProvider.GetDocumentAsync(1, "forms", "en");
 | 
			
		||||
@ -154,9 +154,9 @@ namespace DamageAssesment.Api.DocuLinks.Test
 | 
			
		||||
            var mockResponse = await MockData.getOkResponse(1);
 | 
			
		||||
            var mockInputDocument = await MockData.getInputDocumentData();
 | 
			
		||||
            var DocumentResponse = await MockData.GetDocuLinksInfo(1);
 | 
			
		||||
            mockDocumentService.Setup(service => service.UpdateDocumentAsync(1, mockInputDocument)).ReturnsAsync(mockResponse);
 | 
			
		||||
            mockDocumentService.Setup(service => service.UpdateDocumentAsync(1,mockInputDocument)).ReturnsAsync(mockResponse);
 | 
			
		||||
            var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object);
 | 
			
		||||
            var result = (NotFoundResult)await DocumentProvider.UpdateDocument(1, DocumentResponse);
 | 
			
		||||
            var result = (NotFoundResult)await DocumentProvider.UpdateDocument(1,DocumentResponse);
 | 
			
		||||
 | 
			
		||||
            Assert.Equal(404, result.StatusCode);
 | 
			
		||||
        }
 | 
			
		||||
@ -168,9 +168,9 @@ namespace DamageAssesment.Api.DocuLinks.Test
 | 
			
		||||
            var mockUploadService = new Mock<IUploadService>();
 | 
			
		||||
            var mockResponse = await MockData.getBadRequestResponse();
 | 
			
		||||
            var mockInputDocument = await MockData.getInputDocumentData();
 | 
			
		||||
            mockDocumentService.Setup(service => service.UpdateDocumentAsync(99, mockInputDocument)).ReturnsAsync(mockResponse);
 | 
			
		||||
            mockDocumentService.Setup(service => service.UpdateDocumentAsync(99,mockInputDocument)).ReturnsAsync(mockResponse);
 | 
			
		||||
            var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object);
 | 
			
		||||
            var result = (BadRequestObjectResult)await DocumentProvider.UpdateDocument(99, null);
 | 
			
		||||
            var result = (BadRequestObjectResult)await DocumentProvider.UpdateDocument(99,null);
 | 
			
		||||
            Assert.Equal(400, result.StatusCode);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@ -257,7 +257,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
 | 
			
		||||
            var mockDocumentService = new Mock<IDoculinkProvider>();
 | 
			
		||||
            var mockUploadService = new Mock<IUploadService>();
 | 
			
		||||
            var mockResponse = await LinkTypeMockData.getOkResponse(1);
 | 
			
		||||
            mockDocumentService.Setup(service => service.GetLinkTypeAsync(1, "en")).ReturnsAsync(mockResponse);
 | 
			
		||||
            mockDocumentService.Setup(service => service.GetLinkTypeAsync(1,"en")).ReturnsAsync(mockResponse);
 | 
			
		||||
            var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object);
 | 
			
		||||
            var result = (OkObjectResult)await DocumentProvider.GetLinkTypeAsync(1, "en");
 | 
			
		||||
 | 
			
		||||
@ -312,9 +312,9 @@ namespace DamageAssesment.Api.DocuLinks.Test
 | 
			
		||||
            var mockUploadService = new Mock<IUploadService>();
 | 
			
		||||
            var mockResponse = await LinkTypeMockData.getOkResponse(1);
 | 
			
		||||
            var mockInputDocument = await LinkTypeMockData.getInputLinkData(1);
 | 
			
		||||
            mockDocumentService.Setup(service => service.UpdateLinkTypeAsync(1, mockInputDocument)).ReturnsAsync(mockResponse);
 | 
			
		||||
            mockDocumentService.Setup(service => service.UpdateLinkTypeAsync(1,mockInputDocument)).ReturnsAsync(mockResponse);
 | 
			
		||||
            var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object);
 | 
			
		||||
            var result = (OkObjectResult)await DocumentProvider.UpdateLinkType(1, mockInputDocument);
 | 
			
		||||
            var result = (OkObjectResult)await DocumentProvider.UpdateLinkType(1,mockInputDocument);
 | 
			
		||||
 | 
			
		||||
            Assert.Equal(200, result.StatusCode);
 | 
			
		||||
        }
 | 
			
		||||
@ -326,9 +326,9 @@ namespace DamageAssesment.Api.DocuLinks.Test
 | 
			
		||||
            var mockUploadService = new Mock<IUploadService>();
 | 
			
		||||
            var mockResponse = await LinkTypeMockData.getNotFoundResponse();
 | 
			
		||||
            var mockInputDocument = await LinkTypeMockData.getInputLinkData(99);
 | 
			
		||||
            mockDocumentService.Setup(service => service.UpdateLinkTypeAsync(99, mockInputDocument)).ReturnsAsync(mockResponse);
 | 
			
		||||
            mockDocumentService.Setup(service => service.UpdateLinkTypeAsync(99,mockInputDocument)).ReturnsAsync(mockResponse);
 | 
			
		||||
            var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object);
 | 
			
		||||
            var result = (NotFoundObjectResult)await DocumentProvider.UpdateLinkType(99, mockInputDocument);
 | 
			
		||||
            var result = (NotFoundObjectResult)await DocumentProvider.UpdateLinkType(99,mockInputDocument);
 | 
			
		||||
 | 
			
		||||
            Assert.Equal(404, result.StatusCode);
 | 
			
		||||
        }
 | 
			
		||||
@ -340,7 +340,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
 | 
			
		||||
            var mockUploadService = new Mock<IUploadService>();
 | 
			
		||||
            var mockResponse = await LinkTypeMockData.getBadRequestResponse();
 | 
			
		||||
            var mockInputDocument = await LinkTypeMockData.getInputLinkData(1);
 | 
			
		||||
            mockDocumentService.Setup(service => service.UpdateLinkTypeAsync(1, mockInputDocument)).ReturnsAsync(mockResponse);
 | 
			
		||||
            mockDocumentService.Setup(service => service.UpdateLinkTypeAsync(1,mockInputDocument)).ReturnsAsync(mockResponse);
 | 
			
		||||
            var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object);
 | 
			
		||||
            var result = (BadRequestObjectResult)await DocumentProvider.UpdateLinkType(1, mockInputDocument);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -14,19 +14,19 @@ namespace DamageAssesment.Api.DocuLinks.Test
 | 
			
		||||
        public static async Task<(bool, List<DocuLinks.Models.ResDoculink>, string)> getOkResponses()
 | 
			
		||||
        {
 | 
			
		||||
            List<DocuLinks.Models.ResDoculink> list = new List<DocuLinks.Models.ResDoculink>();
 | 
			
		||||
 | 
			
		||||
            
 | 
			
		||||
            for (int i = 1; i < 4; i++)
 | 
			
		||||
            {
 | 
			
		||||
                Dictionary<string, string> dicttitle = new Dictionary<string, string>();
 | 
			
		||||
                Dictionary<string, string> dictdesc = new Dictionary<string, string>();
 | 
			
		||||
                Dictionary<string, string> dictdesc = new Dictionary<string, string>(); 
 | 
			
		||||
                dicttitle.Add("en", "test"); dicttitle.Add("fr", "tester");
 | 
			
		||||
                dictdesc.Add("en", "test"); dictdesc.Add("fr", "tester");
 | 
			
		||||
                dictdesc.Add("en", "test"); dictdesc.Add("fr", "tester"); 
 | 
			
		||||
                List<DoculinkTranslation> DocuLinksTranslations = new List<DoculinkTranslation>();
 | 
			
		||||
                DocuLinksTranslations.Add(new DoculinkTranslation()
 | 
			
		||||
                {
 | 
			
		||||
                    Language = "en",
 | 
			
		||||
                    title = "tel" + i,
 | 
			
		||||
                    description = "Sample" + i
 | 
			
		||||
                    title = "tel"+i,
 | 
			
		||||
                    description = "Sample"+i
 | 
			
		||||
                });
 | 
			
		||||
                List<DoculinkAttachments> doclinksAttachments = new List<DoculinkAttachments>();
 | 
			
		||||
                doclinksAttachments.Add(new DoculinkAttachments()
 | 
			
		||||
@ -41,10 +41,10 @@ namespace DamageAssesment.Api.DocuLinks.Test
 | 
			
		||||
                    Id = i,
 | 
			
		||||
                    linkTypeId = i,
 | 
			
		||||
                    IsActive = true,
 | 
			
		||||
                    titles = dicttitle,
 | 
			
		||||
                    description = dictdesc,
 | 
			
		||||
                    CustomOrder = i,
 | 
			
		||||
                    doclinksAttachments = doclinksAttachments
 | 
			
		||||
                    titles= dicttitle,
 | 
			
		||||
                    description=dictdesc,
 | 
			
		||||
                    CustomOrder=i,
 | 
			
		||||
                    doclinksAttachments= doclinksAttachments
 | 
			
		||||
                });
 | 
			
		||||
            }
 | 
			
		||||
           // List<ResDoculinks> doculinks = list.GroupBy(a => a.linkTypeId).Select(a => new ResDoculinks() { linkTypeId = a.Key, doculinks = a.ToList() }).ToList();
 | 
			
		||||
@ -122,8 +122,8 @@ namespace DamageAssesment.Api.DocuLinks.Test
 | 
			
		||||
        {
 | 
			
		||||
 | 
			
		||||
            List<FileModel> fileModels = new List<FileModel>();
 | 
			
		||||
            fileModels.Add(new FileModel() { FileName = "Sample", FileContent = "c2FtcGxl", FileExtension = ".txt", IsAttachments = true, CustomOrder = 1 });
 | 
			
		||||
            return new ReqDoculink() { Id = id, linkTypeId = 1, CustomOrder = 1, Files = fileModels };
 | 
			
		||||
            fileModels.Add( new FileModel() { FileName = "Sample", FileContent = "c2FtcGxl", FileExtension = ".txt",IsAttachments=true,CustomOrder=1 });
 | 
			
		||||
            return new ReqDoculink() { Id=id, linkTypeId = 1, CustomOrder = 1, Files = fileModels };
 | 
			
		||||
        }
 | 
			
		||||
        public static async Task<DocuLinks.Models.Doculink> getInputDocumentData()
 | 
			
		||||
        {
 | 
			
		||||
@ -133,7 +133,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
 | 
			
		||||
                Language = "en",
 | 
			
		||||
                title = "tel",
 | 
			
		||||
                description = "Sample"
 | 
			
		||||
            });
 | 
			
		||||
            }); 
 | 
			
		||||
            List<DoculinkAttachments> doclinksAttachments = new List<DoculinkAttachments>();
 | 
			
		||||
            doclinksAttachments.Add(new DoculinkAttachments()
 | 
			
		||||
            {
 | 
			
		||||
@ -148,9 +148,9 @@ namespace DamageAssesment.Api.DocuLinks.Test
 | 
			
		||||
                Id = 1,
 | 
			
		||||
                linkTypeId = 1,
 | 
			
		||||
                IsActive = true,
 | 
			
		||||
                CustomOrder = 1,
 | 
			
		||||
                CustomOrder=1,
 | 
			
		||||
                documentsTranslations = DocuLinksTranslations,
 | 
			
		||||
                doclinksAttachments = doclinksAttachments
 | 
			
		||||
                doclinksAttachments= doclinksAttachments
 | 
			
		||||
            };
 | 
			
		||||
        }
 | 
			
		||||
        public static async Task<List<DocuLinks.Models.Doculink>> getInputDocuLinksData()
 | 
			
		||||
 | 
			
		||||
@ -2,7 +2,6 @@
 | 
			
		||||
using DamageAssesment.Api.DocuLinks.Interfaces;
 | 
			
		||||
using DamageAssesment.Api.DocuLinks.Models;
 | 
			
		||||
using DamageAssesment.Api.DocuLinks.Providers;
 | 
			
		||||
using Microsoft.AspNetCore.Authorization;
 | 
			
		||||
using Microsoft.AspNetCore.Http;
 | 
			
		||||
using Microsoft.AspNetCore.Mvc;
 | 
			
		||||
 | 
			
		||||
@ -13,7 +12,6 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
 | 
			
		||||
    {
 | 
			
		||||
        private readonly IDoculinkProvider documentsProvider;
 | 
			
		||||
        private readonly IUploadService uploadService;
 | 
			
		||||
        private readonly IAzureBlobService azureBlobService;
 | 
			
		||||
 | 
			
		||||
        public DoculinkController(IDoculinkProvider documentsProvider, IUploadService uploadService)
 | 
			
		||||
        {
 | 
			
		||||
@ -26,7 +24,6 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
 | 
			
		||||
        /// Get all Doculink type.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        [HttpGet]
 | 
			
		||||
        [Authorize(Roles = "admin")]
 | 
			
		||||
        [Route("doculinks/types")]
 | 
			
		||||
        [Route("doculinks/types/{language:alpha}")]
 | 
			
		||||
        public async Task<IActionResult> GetLinkTypesAsync(string? language)
 | 
			
		||||
@ -41,7 +38,6 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Get a Doculink type by id.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        [Authorize(Roles = "admin")]
 | 
			
		||||
        [HttpGet]
 | 
			
		||||
        [Route("doculinks/types/{id}")]
 | 
			
		||||
        [Route("doculinks/types/{id}/{language:alpha}")]
 | 
			
		||||
@ -57,7 +53,6 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Update a existing Doculink type.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        [Authorize(Roles = "admin")]
 | 
			
		||||
        [HttpPut]
 | 
			
		||||
        [Route("doculinks/types/{id}")]
 | 
			
		||||
        public async Task<IActionResult> UpdateLinkType(int id, Models.LinkType linkType)
 | 
			
		||||
@ -79,7 +74,6 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Create a new Doculink type.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        [Authorize(Roles = "admin")]
 | 
			
		||||
        [HttpPost]
 | 
			
		||||
        [Route("doculinks/types")]
 | 
			
		||||
        public async Task<IActionResult> CreateLinkType(Models.LinkType linkType)
 | 
			
		||||
@ -98,7 +92,6 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Delete a  existing Doculink type by id.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        [Authorize(Roles = "admin")]
 | 
			
		||||
        [HttpDelete]
 | 
			
		||||
        [Route("doculinks/types/{id}")]
 | 
			
		||||
        public async Task<IActionResult> DeleteLinkType(int id)
 | 
			
		||||
@ -113,7 +106,6 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// download an existing attachment.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        [Authorize(Roles = "admin")]
 | 
			
		||||
        [HttpGet("doculinks/download/{id}")]
 | 
			
		||||
        public async Task<IActionResult> downloadfile(int id)
 | 
			
		||||
        {
 | 
			
		||||
@ -188,8 +180,7 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Get all Doculink.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        
 | 
			
		||||
        [Authorize(Roles = "admin")]
 | 
			
		||||
        /// 
 | 
			
		||||
        [Route("doculinks")]
 | 
			
		||||
        [Route("doculinks/{linktype:alpha}")]
 | 
			
		||||
        [Route("doculinks/{linktype:alpha}/{language:alpha}")]
 | 
			
		||||
@ -237,7 +228,6 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Get a Doculink by id.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        [Authorize(Roles = "admin")]
 | 
			
		||||
        [HttpGet]
 | 
			
		||||
        [Route("doculinks/{id}")]
 | 
			
		||||
        [Route("doculinks/{id}/{linktype:alpha}")]
 | 
			
		||||
@ -254,7 +244,6 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// update existing doclink.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        [Authorize(Roles = "admin")]
 | 
			
		||||
        [HttpPut]
 | 
			
		||||
        [Route("doculinks/{id}")]
 | 
			
		||||
        public async Task<IActionResult> UpdateDocument(int id, ReqDoculink documentInfo)
 | 
			
		||||
@ -294,7 +283,6 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Create new doclink.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
       // [Authorize(Roles = "admin")]
 | 
			
		||||
        [HttpPost]
 | 
			
		||||
        [Route("doculinks")]
 | 
			
		||||
        public async Task<IActionResult> CreateDocument(ReqDoculink documentInfo)
 | 
			
		||||
@ -322,7 +310,6 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Delete Doculink by id.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        [Authorize(Roles = "admin")]
 | 
			
		||||
        [HttpDelete]
 | 
			
		||||
        [Route("doculinks/{id}")]
 | 
			
		||||
        public async Task<IActionResult> DeleteDocument(int id)
 | 
			
		||||
 | 
			
		||||
@ -11,8 +11,7 @@
 | 
			
		||||
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="12.0.1" />
 | 
			
		||||
    <PackageReference Include="Azure.Storage.Blobs" Version="12.18.0" />
 | 
			
		||||
    <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.21" />
 | 
			
		||||
    <PackageReference Include="Azure.Storage.Blobs" Version="12.16.0" />
 | 
			
		||||
    <PackageReference Include="Microsoft.AspNetCore.Hosting" Version="2.2.7" />
 | 
			
		||||
    <PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.9" />
 | 
			
		||||
    <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="7.0.9">
 | 
			
		||||
 | 
			
		||||
@ -15,7 +15,7 @@ namespace DamageAssesment.Api.DocuLinks.Db
 | 
			
		||||
        protected override void OnConfiguring(DbContextOptionsBuilder options)
 | 
			
		||||
        {
 | 
			
		||||
            // connect to sql server with connection string from app settings
 | 
			
		||||
            options.UseSqlServer(_Configuration.GetConnectionString("DoculinkConnection"));
 | 
			
		||||
            options.UseSqlServer(_Configuration.GetConnectionString("DoculinConnection"));
 | 
			
		||||
        }
 | 
			
		||||
        public DbSet<Db.Doculink> Documents { get; set; }
 | 
			
		||||
        public DbSet<Db.LinkType> LinkTypes { get; set; }
 | 
			
		||||
 | 
			
		||||
@ -1,14 +1,10 @@
 | 
			
		||||
using Azure.Storage.Blobs.Models;
 | 
			
		||||
using DamageAssesment.Api.DocuLinks.Models;
 | 
			
		||||
 | 
			
		||||
namespace DamageAssesment.Api.DocuLinks.Interfaces
 | 
			
		||||
{
 | 
			
		||||
    public interface IAzureBlobService
 | 
			
		||||
    {
 | 
			
		||||
        Task<List<Azure.Response<BlobContentInfo>>> UploadFiles(List<IFormFile> files);
 | 
			
		||||
        Task<Models.Doculink> UploadDocument(int counter, ReqDoculink documentInfo);
 | 
			
		||||
        Task<Models.Doculink> UpdateDocuments(int counter, Models.Doculink document, ReqDoculink documentInfo);
 | 
			
		||||
        void DeleteFile(string path);
 | 
			
		||||
        void Movefile(string path);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -2,72 +2,24 @@ using DamageAssesment.Api.DocuLinks.Db;
 | 
			
		||||
using DamageAssesment.Api.DocuLinks.Interfaces;
 | 
			
		||||
using DamageAssesment.Api.DocuLinks.Providers;
 | 
			
		||||
using Microsoft.EntityFrameworkCore;
 | 
			
		||||
using Microsoft.AspNetCore.Authentication.JwtBearer;
 | 
			
		||||
using Microsoft.IdentityModel.Tokens;
 | 
			
		||||
using System.Reflection;
 | 
			
		||||
using System.Text;
 | 
			
		||||
using Microsoft.OpenApi.Models;
 | 
			
		||||
 | 
			
		||||
var builder = WebApplication.CreateBuilder(args);
 | 
			
		||||
 | 
			
		||||
// CORS setup to allow requests from any origin.
 | 
			
		||||
builder.Services.AddCors(p => p.AddPolicy("DamageAppCorsPolicy", build => {
 | 
			
		||||
    build.WithOrigins("*").AllowAnyMethod().AllowAnyHeader().AllowAnyOrigin();
 | 
			
		||||
}));
 | 
			
		||||
// Add services to the container.
 | 
			
		||||
var authkey = builder.Configuration.GetValue<string>("JwtSettings:securitykey");
 | 
			
		||||
 | 
			
		||||
builder.Services.AddAuthentication(item =>
 | 
			
		||||
{
 | 
			
		||||
    item.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
 | 
			
		||||
    item.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
 | 
			
		||||
}).AddJwtBearer(item =>
 | 
			
		||||
{
 | 
			
		||||
    item.RequireHttpsMetadata = true;
 | 
			
		||||
    item.SaveToken = true;
 | 
			
		||||
    item.TokenValidationParameters = new TokenValidationParameters()
 | 
			
		||||
    {
 | 
			
		||||
        ValidateIssuerSigningKey = true,
 | 
			
		||||
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(authkey)),
 | 
			
		||||
        ValidateIssuer = false,
 | 
			
		||||
        ValidateAudience = false,
 | 
			
		||||
        ClockSkew = TimeSpan.Zero
 | 
			
		||||
    };
 | 
			
		||||
});
 | 
			
		||||
// Add services to the container.
 | 
			
		||||
 | 
			
		||||
builder.Services.AddControllers();
 | 
			
		||||
builder.Services.AddSwaggerGen(options =>
 | 
			
		||||
builder.Services.AddSwaggerGen(c =>
 | 
			
		||||
{
 | 
			
		||||
    // Include XML comments from your assembly
 | 
			
		||||
    var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
 | 
			
		||||
    var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
 | 
			
		||||
    options.IncludeXmlComments(xmlPath);
 | 
			
		||||
 | 
			
		||||
    OpenApiSecurityScheme securityDefinition = new OpenApiSecurityScheme()
 | 
			
		||||
    {
 | 
			
		||||
        Name = "Bearer",
 | 
			
		||||
        BearerFormat = "JWT",
 | 
			
		||||
        Scheme = "bearer",
 | 
			
		||||
        Description = "Specify the authorization token.",
 | 
			
		||||
        In = ParameterLocation.Header,
 | 
			
		||||
        Type = SecuritySchemeType.Http,
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    options.AddSecurityDefinition("jwt_auth", securityDefinition);
 | 
			
		||||
 | 
			
		||||
    // Make sure swagger UI requires a Bearer token specified
 | 
			
		||||
    OpenApiSecurityScheme securityScheme = new OpenApiSecurityScheme()
 | 
			
		||||
    {
 | 
			
		||||
        Reference = new OpenApiReference()
 | 
			
		||||
        {
 | 
			
		||||
            Id = "jwt_auth",
 | 
			
		||||
            Type = ReferenceType.SecurityScheme
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    OpenApiSecurityRequirement securityRequirements = new OpenApiSecurityRequirement()
 | 
			
		||||
    {
 | 
			
		||||
        {securityScheme, new string[] { }},
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    options.AddSecurityRequirement(securityRequirements);
 | 
			
		||||
    c.IncludeXmlComments(xmlPath);
 | 
			
		||||
});
 | 
			
		||||
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
 | 
			
		||||
builder.Services.AddEndpointsApiExplorer();
 | 
			
		||||
@ -79,8 +31,11 @@ builder.Services.AddScoped<IAzureBlobService, AzureBlobService>();
 | 
			
		||||
builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies()); //4/30
 | 
			
		||||
builder.Services.AddDbContext<DoculinkDbContext>(option =>
 | 
			
		||||
{
 | 
			
		||||
    option.UseSqlServer("DoculinkConnection");
 | 
			
		||||
    option.UseSqlServer("DoculinConnection");
 | 
			
		||||
});
 | 
			
		||||
builder.Services.AddCors(p => p.AddPolicy("DamageAppCorsPolicy", build => {
 | 
			
		||||
    build.WithOrigins("*").AllowAnyMethod().AllowAnyHeader().AllowAnyOrigin();
 | 
			
		||||
}));
 | 
			
		||||
var app = builder.Build();
 | 
			
		||||
 | 
			
		||||
// Configure the HTTP request pipeline.
 | 
			
		||||
@ -89,8 +44,11 @@ if (app.Environment.IsDevelopment())
 | 
			
		||||
    app.UseSwagger();
 | 
			
		||||
    app.UseSwaggerUI();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// Enable CORS, authentication, and authorization middleware.
 | 
			
		||||
 | 
			
		||||
app.UseCors("DamageAppCorsPolicy");
 | 
			
		||||
app.UseAuthentication();
 | 
			
		||||
app.UseAuthorization();
 | 
			
		||||
 | 
			
		||||
app.MapControllers();
 | 
			
		||||
 | 
			
		||||
@ -1,17 +1,8 @@
 | 
			
		||||
 | 
			
		||||
using Azure;
 | 
			
		||||
using Azure.Storage.Blobs;
 | 
			
		||||
using Azure.Storage.Blobs.Models;
 | 
			
		||||
using Azure.Storage.Blobs.Specialized;
 | 
			
		||||
using DamageAssesment.Api.DocuLinks.Interfaces;
 | 
			
		||||
using DamageAssesment.Api.DocuLinks.Models;
 | 
			
		||||
using Microsoft.AspNetCore.Mvc.Filters;
 | 
			
		||||
using Microsoft.Extensions.Configuration;
 | 
			
		||||
using Microsoft.VisualBasic;
 | 
			
		||||
using System.ComponentModel;
 | 
			
		||||
using System.IO;
 | 
			
		||||
using System.Text;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
 | 
			
		||||
namespace DamageAssesment.Api.DocuLinks.Providers
 | 
			
		||||
{
 | 
			
		||||
@ -19,111 +10,11 @@ namespace DamageAssesment.Api.DocuLinks.Providers
 | 
			
		||||
    {
 | 
			
		||||
        BlobServiceClient _blobClient;
 | 
			
		||||
        BlobContainerClient _containerClient;
 | 
			
		||||
        string azureConnectionString;
 | 
			
		||||
        private string uploadpath = "";
 | 
			
		||||
        private string Deletepath = "";
 | 
			
		||||
        public AzureBlobService(IConfiguration configuration)
 | 
			
		||||
        string azureConnectionString = "<Primary Connection String>";
 | 
			
		||||
        public AzureBlobService()
 | 
			
		||||
        {
 | 
			
		||||
            uploadpath = configuration.GetValue<string>("Fileupload:folderpath");
 | 
			
		||||
            Deletepath = configuration.GetValue<string>("Fileupload:Deletepath");
 | 
			
		||||
            _blobClient = new BlobServiceClient(configuration.GetValue<string>("Fileupload:BlobConnectionString"));
 | 
			
		||||
            _containerClient = _blobClient.GetBlobContainerClient(configuration.GetValue<string>("Fileupload:BlobContainerName"));
 | 
			
		||||
        }
 | 
			
		||||
        public async Task<Models.Doculink> UploadDocument(int counter, ReqDoculink documentInfo)
 | 
			
		||||
        {
 | 
			
		||||
            Models.Doculink Documents = new Models.Doculink();
 | 
			
		||||
            List <Models.DoculinkAttachments> attachments = new List<Models.DoculinkAttachments>();
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                string path = "", UserfileName = "";
 | 
			
		||||
                if (documentInfo.Files != null)
 | 
			
		||||
                {
 | 
			
		||||
 | 
			
		||||
                    int counter1 = 1;
 | 
			
		||||
                    foreach (var item in documentInfo.Files)
 | 
			
		||||
                    {
 | 
			
		||||
                        if (item.IsAttachments)
 | 
			
		||||
                        {
 | 
			
		||||
                            UserfileName = Path.GetFileName(item.FileName);
 | 
			
		||||
                            var fileName = String.Format("Document_{0}_{1}{2}", counter, counter1, item.FileExtension);
 | 
			
		||||
                            byte[] byteArray = Convert.FromBase64String(item.FileContent);
 | 
			
		||||
                            MemoryStream stream = new MemoryStream(byteArray);
 | 
			
		||||
                            BlobClient client = _containerClient.GetBlobClient(uploadpath + "/" + fileName);
 | 
			
		||||
                            var result = await client.UploadAsync(stream, true);
 | 
			
		||||
                            path = uploadpath + "/" + fileName;
 | 
			
		||||
                            counter1++;
 | 
			
		||||
                        }
 | 
			
		||||
                        else
 | 
			
		||||
                            path = item.url;
 | 
			
		||||
                        attachments.Add(new Models.DoculinkAttachments { docName = UserfileName, Path = path, IsAttachments = item.IsAttachments, CustomOrder = item.CustomOrder });
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                Documents = new Models.Doculink()
 | 
			
		||||
                {
 | 
			
		||||
                    linkTypeId = documentInfo.linkTypeId,
 | 
			
		||||
                    documentsTranslations = documentInfo.documentsTranslations,
 | 
			
		||||
                    doclinksAttachments = attachments,
 | 
			
		||||
                    IsDeleted = false,
 | 
			
		||||
                    CustomOrder = documentInfo.CustomOrder,
 | 
			
		||||
                    IsActive = true
 | 
			
		||||
                };
 | 
			
		||||
 | 
			
		||||
                return Documents;
 | 
			
		||||
            }
 | 
			
		||||
            catch (Exception ex)
 | 
			
		||||
            {
 | 
			
		||||
                return new Models.Doculink();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public async Task<Models.Doculink> UpdateDocuments(int counter, Models.Doculink document, ReqDoculink documentInfo)
 | 
			
		||||
        {
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                foreach (var item in document.doclinksAttachments)
 | 
			
		||||
                {
 | 
			
		||||
                     Movefile(item.Path);
 | 
			
		||||
                }
 | 
			
		||||
                string path = "", UserfileName = "";
 | 
			
		||||
                List<Models.DoculinkAttachments> attachments = new List<Models.DoculinkAttachments>();
 | 
			
		||||
                int counter1 = 1;
 | 
			
		||||
                foreach (var item in documentInfo.Files)
 | 
			
		||||
                {
 | 
			
		||||
                    if (item.IsAttachments)
 | 
			
		||||
                    {
 | 
			
		||||
                        UserfileName = Path.GetFileName(item.FileName);
 | 
			
		||||
                        var fileName = String.Format("Document_{0}_{1}{2)", document.Id, counter1, item.FileExtension);
 | 
			
		||||
                        byte[] byteArray = Encoding.UTF8.GetBytes(item.FileContent);
 | 
			
		||||
                        MemoryStream stream = new MemoryStream(byteArray);
 | 
			
		||||
                        BlobClient client = _containerClient.GetBlobClient(uploadpath + "/" + fileName);
 | 
			
		||||
                        path = uploadpath + "/" + fileName;
 | 
			
		||||
                        var result = await client.UploadAsync(stream, true);
 | 
			
		||||
                        counter1++;
 | 
			
		||||
                    }
 | 
			
		||||
                    else
 | 
			
		||||
                        path = item.url;
 | 
			
		||||
                    attachments.Add(new Models.DoculinkAttachments { docName = UserfileName, Path = path, IsAttachments = item.IsAttachments, CustomOrder = item.CustomOrder });
 | 
			
		||||
                }
 | 
			
		||||
                Models.Doculink Documents = new Models.Doculink()
 | 
			
		||||
                {
 | 
			
		||||
                    Id = documentInfo.Id,
 | 
			
		||||
                    linkTypeId = documentInfo.linkTypeId,
 | 
			
		||||
                    documentsTranslations = documentInfo.documentsTranslations,
 | 
			
		||||
                    IsActive = true,
 | 
			
		||||
                    IsDeleted = false,
 | 
			
		||||
                    CustomOrder = documentInfo.CustomOrder,
 | 
			
		||||
                    doclinksAttachments = attachments
 | 
			
		||||
                };
 | 
			
		||||
 | 
			
		||||
                return Documents;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            catch (Exception ex)
 | 
			
		||||
            {
 | 
			
		||||
                return new Models.Doculink();
 | 
			
		||||
            }
 | 
			
		||||
            _blobClient = new BlobServiceClient(azureConnectionString);
 | 
			
		||||
            _containerClient = _blobClient.GetBlobContainerClient("apiimages");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public async Task<List<Azure.Response<BlobContentInfo>>> UploadFiles(List<IFormFile> files)
 | 
			
		||||
@ -144,52 +35,10 @@ namespace DamageAssesment.Api.DocuLinks.Providers
 | 
			
		||||
 | 
			
		||||
            return azureResponse;
 | 
			
		||||
        }
 | 
			
		||||
        public string getMovefilename(string movefilename)
 | 
			
		||||
        {
 | 
			
		||||
            var list = movefilename.Split('.');
 | 
			
		||||
            if (list.Length > 0)
 | 
			
		||||
                list[list.Length - 1] = DateTime.Now.ToShortDateString().Replace("/", "_") +"_"+ DateTime.Now.ToShortTimeString().Replace("/", "_")+"." + list[list.Length - 1];
 | 
			
		||||
            return string.Join("_", list);
 | 
			
		||||
        }
 | 
			
		||||
        public void Movefile(string path)
 | 
			
		||||
        {
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                if (path != "")
 | 
			
		||||
                {
 | 
			
		||||
                    string MovePath = getMovefilename(path.Replace(uploadpath, Deletepath));
 | 
			
		||||
                    // Get references to the source and destination blobs
 | 
			
		||||
                    BlobClient sourceBlobClient = _containerClient.GetBlobClient(path);
 | 
			
		||||
                    BlobClient destinationBlobClient = _containerClient.GetBlobClient(MovePath);
 | 
			
		||||
                    // Start the copy operation from the source to the destination
 | 
			
		||||
                     destinationBlobClient.StartCopyFromUri(sourceBlobClient.Uri);
 | 
			
		||||
 | 
			
		||||
                    // Check if the copy operation completed successfully
 | 
			
		||||
                     WaitForCopyToComplete(destinationBlobClient);
 | 
			
		||||
 | 
			
		||||
                    // Delete the source blob after a successful copy
 | 
			
		||||
                     sourceBlobClient.DeleteIfExists();
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            catch(Exception ex)
 | 
			
		||||
            {
 | 
			
		||||
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        static void  WaitForCopyToComplete(BlobClient blobClient)
 | 
			
		||||
        {
 | 
			
		||||
            BlobProperties properties =  blobClient.GetProperties();
 | 
			
		||||
 | 
			
		||||
            while (properties.CopyStatus == CopyStatus.Pending)
 | 
			
		||||
            {
 | 
			
		||||
                 Task.Delay(TimeSpan.FromSeconds(1));
 | 
			
		||||
                properties =  blobClient.GetProperties();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        public void DeleteFile(string url)
 | 
			
		||||
        {
 | 
			
		||||
            BlobClient sourceBlobClient = _containerClient.GetBlobClient(url);
 | 
			
		||||
            sourceBlobClient.DeleteIfExists();
 | 
			
		||||
            var blob = _containerClient.GetBlockBlobClient(url);
 | 
			
		||||
            blob.DeleteIfExists();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -24,12 +24,11 @@ namespace DamageAssesment.Api.DocuLinks.Providers
 | 
			
		||||
        private DoculinkDbContext DocumentDbContext;
 | 
			
		||||
        private ILogger<DoculinkProvider> logger;
 | 
			
		||||
        private IUploadService uploadservice;
 | 
			
		||||
        private IAzureBlobService azureBlobService;
 | 
			
		||||
        private IMapper mapper;
 | 
			
		||||
        private readonly IHttpContextAccessor httpContextAccessor;
 | 
			
		||||
        private string baseUrl;
 | 
			
		||||
 | 
			
		||||
        public DoculinkProvider(DoculinkDbContext DocumentDbContext, ILogger<DoculinkProvider> logger, IMapper mapper, IUploadService uploadservice, IAzureBlobService azureBlobService, IHttpContextAccessor httpContextAccessor)
 | 
			
		||||
        public DoculinkProvider(DoculinkDbContext DocumentDbContext, ILogger<DoculinkProvider> logger, IMapper mapper, IUploadService uploadservice, IHttpContextAccessor httpContextAccessor)
 | 
			
		||||
        {
 | 
			
		||||
            this.DocumentDbContext = DocumentDbContext;
 | 
			
		||||
            this.logger = logger;
 | 
			
		||||
@ -38,13 +37,12 @@ namespace DamageAssesment.Api.DocuLinks.Providers
 | 
			
		||||
            this.httpContextAccessor = httpContextAccessor;
 | 
			
		||||
            baseUrl = $"{httpContextAccessor.HttpContext.Request.Scheme}://{httpContextAccessor.HttpContext.Request.Host}";
 | 
			
		||||
            baseUrl = baseUrl + "/doculinks/download";
 | 
			
		||||
            this.azureBlobService = azureBlobService;
 | 
			
		||||
            //SeedData();
 | 
			
		||||
            SeedData();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        private async Task SeedDataAsync()
 | 
			
		||||
        private void SeedData()
 | 
			
		||||
        {
 | 
			
		||||
            if (!DocumentDbContext.LinkTypes.Any())
 | 
			
		||||
            {
 | 
			
		||||
 | 
			
		||||
@ -116,16 +116,15 @@ namespace DamageAssesment.Api.DocuLinks.Providers
 | 
			
		||||
 | 
			
		||||
                string path = "", UserfileName = "";
 | 
			
		||||
                List<Models.DoculinkAttachments> attachments = new List<Models.DoculinkAttachments>();
 | 
			
		||||
                int counter1 = 1;
 | 
			
		||||
                foreach (var item in documentInfo.Files)
 | 
			
		||||
                {
 | 
			
		||||
                    counter++;
 | 
			
		||||
                    if (item.IsAttachments)
 | 
			
		||||
                    {
 | 
			
		||||
                        UserfileName = Path.GetFileName(item.FileName+item.FileExtension);
 | 
			
		||||
                        var fileName = String.Format("Document_{0}{1}", counter1, item.FileExtension);
 | 
			
		||||
                        var fileName = String.Format("Document_{0}{1}", counter, item.FileExtension);
 | 
			
		||||
                        path = Path.Combine(fullDirectoryPath, fileName);
 | 
			
		||||
                        File.WriteAllBytes(path, Convert.FromBase64String(item.FileContent));
 | 
			
		||||
                        counter1++;
 | 
			
		||||
                    }
 | 
			
		||||
                    else
 | 
			
		||||
                        path = item.url;
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,4 @@
 | 
			
		||||
{
 | 
			
		||||
  "JwtSettings": {
 | 
			
		||||
    "securitykey": "bWlhbWkgZGFkZSBzY2hvb2xzIHNlY3JldCBrZXk="
 | 
			
		||||
  },
 | 
			
		||||
  "Logging": {
 | 
			
		||||
    "LogLevel": {
 | 
			
		||||
      "Default": "Information",
 | 
			
		||||
@ -10,14 +7,13 @@
 | 
			
		||||
  },
 | 
			
		||||
  "AllowedHosts": "*",
 | 
			
		||||
  "ConnectionStrings": {
 | 
			
		||||
    //"DoculinkConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;"
 | 
			
		||||
    "DoculinkConnection": "Server=207.180.248.35;Database=da_survey_dev;User Id=sa;Password=YourStrongPassw0rd;TrustServerCertificate=True;"
 | 
			
		||||
    //"DoculinConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;",
 | 
			
		||||
    //"DoculinConnection": "Server=localhost,1433;Database=da_survey_dev;User Id=sa;Password=Password123;TrustServerCertificate=True;"
 | 
			
		||||
    "DoculinConnection": "Server=207.180.248.35;Database=da_survey_dev;User Id=sa;Password=YourStrongPassw0rd;TrustServerCertificate=True;"
 | 
			
		||||
 | 
			
		||||
  },
 | 
			
		||||
  "Fileupload": {
 | 
			
		||||
    "folderpath": "DASA_Documents/Active",
 | 
			
		||||
    "Deletepath": "DASA_Documents/Deleted",
 | 
			
		||||
    "BlobConnectionString": "DefaultEndpointsProtocol=https;AccountName=damagedoculink;AccountKey=blynpwrAQtthEneXC5f4vFewJ3tPV+QZUt1AX3nefZScPPjkr5hMoC18B9ni6/ZYdhRiERPQw+hB+AStonf+iw==;EndpointSuffix=core.windows.net",
 | 
			
		||||
    "BlobContainerName": "doculinks"
 | 
			
		||||
    "Deletepath": "DASA_Documents/Deleted"
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,4 @@
 | 
			
		||||
using DamageAssesment.Api.Employees.Interfaces;
 | 
			
		||||
using Microsoft.AspNetCore.Authorization;
 | 
			
		||||
using Microsoft.AspNetCore.Http;
 | 
			
		||||
using Microsoft.AspNetCore.Mvc;
 | 
			
		||||
 | 
			
		||||
@ -19,7 +18,7 @@ namespace DamageAssesment.Api.Employees.Controllers
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// GET request for retrieving employees.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        [Authorize(Roles = "admin")]
 | 
			
		||||
 | 
			
		||||
        [HttpGet("employees")]
 | 
			
		||||
        public async Task<ActionResult> GetEmployeesAsync()
 | 
			
		||||
        {
 | 
			
		||||
@ -36,7 +35,7 @@ namespace DamageAssesment.Api.Employees.Controllers
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// GET request for retrieving an employee by ID.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        [Authorize(Roles = "admin")]
 | 
			
		||||
        
 | 
			
		||||
        [HttpGet("employees/{id}")]
 | 
			
		||||
        public async Task<ActionResult> GetEmployeeByIdAsync(int id)
 | 
			
		||||
        {
 | 
			
		||||
@ -49,12 +48,11 @@ namespace DamageAssesment.Api.Employees.Controllers
 | 
			
		||||
            return NotFound();
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
   
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// PUT request for updating an existing employee.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <param name="Employee">The updated employee object.</param>
 | 
			
		||||
        [Authorize(Roles = "admin")]
 | 
			
		||||
        [HttpPut("employees/{id}")]
 | 
			
		||||
        public async Task<IActionResult> UpdateEmployee(int id, Models.Employee Employee)
 | 
			
		||||
        {
 | 
			
		||||
@ -77,7 +75,6 @@ namespace DamageAssesment.Api.Employees.Controllers
 | 
			
		||||
        /// POST request for creating a new employee.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <param name="Employee">The employee information for creating a new employee.</param>
 | 
			
		||||
        [Authorize(Roles = "admin")]
 | 
			
		||||
        [HttpPost("employees")]
 | 
			
		||||
        public async Task<IActionResult> CreateEmployee(Models.Employee Employee)
 | 
			
		||||
        {
 | 
			
		||||
@ -96,7 +93,6 @@ namespace DamageAssesment.Api.Employees.Controllers
 | 
			
		||||
        /// DELETE request for deleting an existing employee.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <param name="id">The ID of the employee to be deleted.</param>
 | 
			
		||||
        [Authorize(Roles = "admin")]
 | 
			
		||||
        [HttpDelete("employees/{id}")]
 | 
			
		||||
        public async Task<IActionResult> DeleteEmployee(int id)
 | 
			
		||||
        {
 | 
			
		||||
 | 
			
		||||
@ -1,77 +1,29 @@
 | 
			
		||||
using DamageAssesment.Api.Employees.Db;
 | 
			
		||||
using DamageAssesment.Api.Employees.Interfaces;
 | 
			
		||||
using DamageAssesment.Api.Employees.Providers;
 | 
			
		||||
using Microsoft.AspNetCore.Authentication.JwtBearer;
 | 
			
		||||
using Microsoft.EntityFrameworkCore;
 | 
			
		||||
using Microsoft.IdentityModel.Tokens;
 | 
			
		||||
using Microsoft.OpenApi.Models;
 | 
			
		||||
using System.Reflection;
 | 
			
		||||
using System.Text;
 | 
			
		||||
 | 
			
		||||
var builder = WebApplication.CreateBuilder(args);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// CORS setup to allow requests from any origin.
 | 
			
		||||
builder.Services.AddCors(p => p.AddPolicy("DamageAppCorsPolicy", build => {
 | 
			
		||||
    build.WithOrigins("*").AllowAnyMethod().AllowAnyHeader().AllowAnyOrigin();
 | 
			
		||||
}));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// Add services to the container.
 | 
			
		||||
var authkey = builder.Configuration.GetValue<string>("JwtSettings:securitykey");
 | 
			
		||||
 | 
			
		||||
builder.Services.AddAuthentication(item =>
 | 
			
		||||
{
 | 
			
		||||
    item.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
 | 
			
		||||
    item.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
 | 
			
		||||
}).AddJwtBearer(item =>
 | 
			
		||||
{
 | 
			
		||||
    item.RequireHttpsMetadata = true;
 | 
			
		||||
    item.SaveToken = true;
 | 
			
		||||
    item.TokenValidationParameters = new TokenValidationParameters()
 | 
			
		||||
    {
 | 
			
		||||
        ValidateIssuerSigningKey = true,
 | 
			
		||||
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(authkey)),
 | 
			
		||||
        ValidateIssuer = false,
 | 
			
		||||
        ValidateAudience = false,
 | 
			
		||||
        ClockSkew = TimeSpan.Zero
 | 
			
		||||
    };
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
builder.Services.AddControllers();
 | 
			
		||||
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
 | 
			
		||||
builder.Services.AddEndpointsApiExplorer();
 | 
			
		||||
//builder.Services.AddSwaggerGen();
 | 
			
		||||
builder.Services.AddSwaggerGen(options =>
 | 
			
		||||
// Add Swagger/OpenAPI documentation support.
 | 
			
		||||
builder.Services.AddSwaggerGen(c =>
 | 
			
		||||
{
 | 
			
		||||
    // Include XML comments from your assembly
 | 
			
		||||
    var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
 | 
			
		||||
    var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
 | 
			
		||||
    options.IncludeXmlComments(xmlPath);
 | 
			
		||||
 | 
			
		||||
    OpenApiSecurityScheme securityDefinition = new OpenApiSecurityScheme()
 | 
			
		||||
    {
 | 
			
		||||
        Name = "Bearer",
 | 
			
		||||
        BearerFormat = "JWT",
 | 
			
		||||
        Scheme = "bearer",
 | 
			
		||||
        Description = "Specify the authorization token.",
 | 
			
		||||
        In = ParameterLocation.Header,
 | 
			
		||||
        Type = SecuritySchemeType.Http,
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    options.AddSecurityDefinition("jwt_auth", securityDefinition);
 | 
			
		||||
 | 
			
		||||
    // Make sure swagger UI requires a Bearer token specified
 | 
			
		||||
    OpenApiSecurityScheme securityScheme = new OpenApiSecurityScheme()
 | 
			
		||||
    {
 | 
			
		||||
        Reference = new OpenApiReference()
 | 
			
		||||
        {
 | 
			
		||||
            Id = "jwt_auth",
 | 
			
		||||
            Type = ReferenceType.SecurityScheme
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    OpenApiSecurityRequirement securityRequirements = new OpenApiSecurityRequirement()
 | 
			
		||||
    {
 | 
			
		||||
        {securityScheme, new string[] { }},
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    options.AddSecurityRequirement(securityRequirements);
 | 
			
		||||
    c.IncludeXmlComments(xmlPath);
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
builder.Services.AddScoped<IEmployeesProvider, EmployeesProvider>();
 | 
			
		||||
@ -80,7 +32,9 @@ builder.Services.AddDbContext<EmployeeDbContext>(option =>
 | 
			
		||||
{
 | 
			
		||||
    option.UseSqlServer("EmployeeConnection");
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
builder.Services.AddCors(p => p.AddPolicy("DamageAppCorsPolicy", build => {
 | 
			
		||||
    build.WithOrigins("*").AllowAnyMethod().AllowAnyHeader().AllowAnyOrigin();
 | 
			
		||||
}));
 | 
			
		||||
var app = builder.Build();
 | 
			
		||||
 | 
			
		||||
// Configure the HTTP request pipeline.
 | 
			
		||||
@ -96,8 +50,12 @@ if (app.Environment.IsDevelopment())
 | 
			
		||||
        employeesProvider.SeedData();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
app.UseCors("DamageAppCorsPolicy");
 | 
			
		||||
app.UseAuthentication();
 | 
			
		||||
 | 
			
		||||
// Enable CORS, authentication, and authorization middleware.
 | 
			
		||||
app.UseCors("DamageAppCorsPolicy");
 | 
			
		||||
 | 
			
		||||
app.UseAuthorization();
 | 
			
		||||
 | 
			
		||||
app.MapControllers();
 | 
			
		||||
 | 
			
		||||
@ -9,8 +9,14 @@
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  "AllowedHosts": "*",
 | 
			
		||||
  "settings": {
 | 
			
		||||
    "endpoint1": "xxx",
 | 
			
		||||
    "endpoint2": "xxx",
 | 
			
		||||
    "endpoint3": "xxx"
 | 
			
		||||
  },
 | 
			
		||||
  "ConnectionStrings": {
 | 
			
		||||
    //"EmployeeConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;"
 | 
			
		||||
    //"EmployeeConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;",
 | 
			
		||||
    //"EmployeeConnection": "Server=localhost,1433;Database=da_survey_dev;User Id=sa;Password=Password123;TrustServerCertificate=True;"
 | 
			
		||||
    "EmployeeConnection": "Server=207.180.248.35;Database=da_survey_dev;User Id=sa;Password=YourStrongPassw0rd;TrustServerCertificate=True;"
 | 
			
		||||
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,4 @@
 | 
			
		||||
using DamageAssesment.Api.Locations.Interfaces;
 | 
			
		||||
using Microsoft.AspNetCore.Authorization;
 | 
			
		||||
using Microsoft.AspNetCore.Http;
 | 
			
		||||
using Microsoft.AspNetCore.Mvc;
 | 
			
		||||
 | 
			
		||||
@ -16,7 +15,7 @@ namespace DamageAssesment.Api.Locations.Controllers
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Get all locations.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        [Authorize(Roles = "admin")]
 | 
			
		||||
 | 
			
		||||
        [HttpGet("locations")]
 | 
			
		||||
        public async Task<ActionResult> GetLocationsAsync()
 | 
			
		||||
        {
 | 
			
		||||
@ -32,7 +31,7 @@ namespace DamageAssesment.Api.Locations.Controllers
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Get all locations based on locationdId.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        [Authorize(Roles = "admin")]
 | 
			
		||||
 | 
			
		||||
        [HttpGet("locations/{id}")]
 | 
			
		||||
        public async Task<ActionResult> GetLocationByIdAsync(int id)
 | 
			
		||||
        {
 | 
			
		||||
@ -48,7 +47,7 @@ namespace DamageAssesment.Api.Locations.Controllers
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Update a Location.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        [Authorize(Roles = "admin")]
 | 
			
		||||
 | 
			
		||||
        [HttpPut("locations/{id}")]
 | 
			
		||||
        public async Task<IActionResult> UpdateLocation(int id, Models.Location Location)
 | 
			
		||||
        {
 | 
			
		||||
@ -66,7 +65,7 @@ namespace DamageAssesment.Api.Locations.Controllers
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Save a new location.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        [Authorize(Roles = "admin")]
 | 
			
		||||
 | 
			
		||||
        [HttpPost("locations")]
 | 
			
		||||
        public async Task<IActionResult> CreateLocation(Models.Location Location)
 | 
			
		||||
        {
 | 
			
		||||
@ -84,7 +83,7 @@ namespace DamageAssesment.Api.Locations.Controllers
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Delete an existing location.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        [Authorize(Roles = "admin")]
 | 
			
		||||
 | 
			
		||||
        [HttpDelete("locations/{id}")]
 | 
			
		||||
        public async Task<IActionResult> DeleteLocation(int id)
 | 
			
		||||
        {
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,4 @@
 | 
			
		||||
using DamageAssesment.Api.Locations.Interfaces;
 | 
			
		||||
using Microsoft.AspNetCore.Authorization;
 | 
			
		||||
using Microsoft.AspNetCore.Mvc;
 | 
			
		||||
 | 
			
		||||
namespace DamageAssesment.Api.Locations.Controllers
 | 
			
		||||
@ -16,7 +15,7 @@ namespace DamageAssesment.Api.Locations.Controllers
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Get all regions.2
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        [Authorize(Roles = "admin")]
 | 
			
		||||
 | 
			
		||||
        [HttpGet("regions")]
 | 
			
		||||
        public async Task<ActionResult> GetRegionsAsync()
 | 
			
		||||
        {
 | 
			
		||||
@ -30,7 +29,7 @@ namespace DamageAssesment.Api.Locations.Controllers
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// GET request for retrieving a region by its ID.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        [Authorize(Roles = "admin")]
 | 
			
		||||
 | 
			
		||||
        [HttpGet("regions/{id}")]
 | 
			
		||||
        public async Task<ActionResult> GetRegionAsync(int id)
 | 
			
		||||
        {
 | 
			
		||||
@ -44,7 +43,7 @@ namespace DamageAssesment.Api.Locations.Controllers
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// POST request for creating a new region.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        [Authorize(Roles = "admin")]
 | 
			
		||||
 | 
			
		||||
        [HttpPost("regions")]
 | 
			
		||||
        public async Task<ActionResult> PostRegionAsync(Models.Region region)
 | 
			
		||||
        {
 | 
			
		||||
@ -58,7 +57,7 @@ namespace DamageAssesment.Api.Locations.Controllers
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// PUT request for updating an existing region.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        [Authorize(Roles = "admin")]
 | 
			
		||||
 | 
			
		||||
        [HttpPut("regions/{id}")]
 | 
			
		||||
        public async Task<ActionResult> PutRegionAsync(int id, Models.Region region)
 | 
			
		||||
        {
 | 
			
		||||
@ -76,7 +75,7 @@ namespace DamageAssesment.Api.Locations.Controllers
 | 
			
		||||
        /// DELETE request for deleting a region based on ID.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
 | 
			
		||||
        [Authorize(Roles = "admin")]
 | 
			
		||||
 | 
			
		||||
        [HttpDelete("regions/{id}")]
 | 
			
		||||
        public async Task<ActionResult> DeleteRegionAsync(int id)
 | 
			
		||||
        {
 | 
			
		||||
 | 
			
		||||
@ -21,6 +21,10 @@ namespace DamageAssesment.Api.Locations.Db
 | 
			
		||||
 | 
			
		||||
        [StringLength(2)]
 | 
			
		||||
        public string SchoolType { get; set; }
 | 
			
		||||
        public int? DataValue { get; set; }
 | 
			
		||||
        public int? Enrollment { get; set; }
 | 
			
		||||
        public double? Longitute { get; set; }
 | 
			
		||||
        public double? Latitude { get; set; }
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -11,5 +11,9 @@ namespace DamageAssesment.Api.Locations.Models
 | 
			
		||||
        public string Name { get; set; }
 | 
			
		||||
        public string MaintenanceCenter { get; set; }
 | 
			
		||||
        public string SchoolType { get; set; }
 | 
			
		||||
        public int? DataValue { get; set; }
 | 
			
		||||
        public int? Enrollment { get; set; }
 | 
			
		||||
        public double? Longitute { get; set; }
 | 
			
		||||
        public double? Latitude { get; set; }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1,76 +1,28 @@
 | 
			
		||||
using DamageAssesment.Api.Locations.Db;
 | 
			
		||||
using DamageAssesment.Api.Locations.Interfaces;
 | 
			
		||||
using DamageAssesment.Api.Locations.Providers;
 | 
			
		||||
using Microsoft.AspNetCore.Authentication.JwtBearer;
 | 
			
		||||
using Microsoft.EntityFrameworkCore;
 | 
			
		||||
using Microsoft.IdentityModel.Tokens;
 | 
			
		||||
using Microsoft.OpenApi.Models;
 | 
			
		||||
using System.Reflection;
 | 
			
		||||
using System.Text;
 | 
			
		||||
 | 
			
		||||
var builder = WebApplication.CreateBuilder(args);
 | 
			
		||||
// CORS setup to allow requests from any origin.
 | 
			
		||||
builder.Services.AddCors(p => p.AddPolicy("DamageAppCorsPolicy", build => {
 | 
			
		||||
    build.WithOrigins("*").AllowAnyMethod().AllowAnyHeader().AllowAnyOrigin();
 | 
			
		||||
}));
 | 
			
		||||
// Add services to the container.
 | 
			
		||||
var authkey = builder.Configuration.GetValue<string>("JwtSettings:securitykey");
 | 
			
		||||
 | 
			
		||||
builder.Services.AddAuthentication(item =>
 | 
			
		||||
{
 | 
			
		||||
    item.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
 | 
			
		||||
    item.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
 | 
			
		||||
}).AddJwtBearer(item =>
 | 
			
		||||
{
 | 
			
		||||
    item.RequireHttpsMetadata = true;
 | 
			
		||||
    item.SaveToken = true;
 | 
			
		||||
    item.TokenValidationParameters = new TokenValidationParameters()
 | 
			
		||||
    {
 | 
			
		||||
        ValidateIssuerSigningKey = true,
 | 
			
		||||
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(authkey)),
 | 
			
		||||
        ValidateIssuer = false,
 | 
			
		||||
        ValidateAudience = false,
 | 
			
		||||
        ClockSkew = TimeSpan.Zero
 | 
			
		||||
    };
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
// Add services to the container.
 | 
			
		||||
// Add controller services and API Explorer for endpoint discovery.
 | 
			
		||||
builder.Services.AddControllers();
 | 
			
		||||
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
 | 
			
		||||
builder.Services.AddEndpointsApiExplorer();
 | 
			
		||||
//builder.Services.AddSwaggerGen();
 | 
			
		||||
builder.Services.AddSwaggerGen(options =>
 | 
			
		||||
// Add Swagger/OpenAPI documentation support.
 | 
			
		||||
builder.Services.AddSwaggerGen(c =>
 | 
			
		||||
{
 | 
			
		||||
    // Include XML comments from your assembly
 | 
			
		||||
    var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
 | 
			
		||||
    var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
 | 
			
		||||
    options.IncludeXmlComments(xmlPath);
 | 
			
		||||
 | 
			
		||||
    OpenApiSecurityScheme securityDefinition = new OpenApiSecurityScheme()
 | 
			
		||||
    {
 | 
			
		||||
        Name = "Bearer",
 | 
			
		||||
        BearerFormat = "JWT",
 | 
			
		||||
        Scheme = "bearer",
 | 
			
		||||
        Description = "Specify the authorization token.",
 | 
			
		||||
        In = ParameterLocation.Header,
 | 
			
		||||
        Type = SecuritySchemeType.Http,
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    options.AddSecurityDefinition("jwt_auth", securityDefinition);
 | 
			
		||||
 | 
			
		||||
    // Make sure swagger UI requires a Bearer token specified
 | 
			
		||||
    OpenApiSecurityScheme securityScheme = new OpenApiSecurityScheme()
 | 
			
		||||
    {
 | 
			
		||||
        Reference = new OpenApiReference()
 | 
			
		||||
        {
 | 
			
		||||
            Id = "jwt_auth",
 | 
			
		||||
            Type = ReferenceType.SecurityScheme
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    OpenApiSecurityRequirement securityRequirements = new OpenApiSecurityRequirement()
 | 
			
		||||
    {
 | 
			
		||||
        {securityScheme, new string[] { }},
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    options.AddSecurityRequirement(securityRequirements);
 | 
			
		||||
    c.IncludeXmlComments(xmlPath);
 | 
			
		||||
});
 | 
			
		||||
builder.Services.AddScoped<ILocationsProvider, LocationsProvider>();
 | 
			
		||||
builder.Services.AddScoped<IRegionsProvider, RegionsProvider>();
 | 
			
		||||
@ -79,10 +31,10 @@ builder.Services.AddDbContext<LocationDbContext>(option =>
 | 
			
		||||
{
 | 
			
		||||
    option.UseSqlServer("LocationConnection");
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
builder.Services.AddCors(p => p.AddPolicy("DamageAppCorsPolicy", build => {
 | 
			
		||||
    build.WithOrigins("*").AllowAnyMethod().AllowAnyHeader().AllowAnyOrigin();
 | 
			
		||||
}));
 | 
			
		||||
var app = builder.Build();
 | 
			
		||||
// Add services to the container.
 | 
			
		||||
 | 
			
		||||
// Configure the HTTP request pipeline.
 | 
			
		||||
if (app.Environment.IsDevelopment())
 | 
			
		||||
@ -99,8 +51,12 @@ if (app.Environment.IsDevelopment())
 | 
			
		||||
        regionProvider.SeedData();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
app.UseCors("DamageAppCorsPolicy");
 | 
			
		||||
app.UseAuthentication();
 | 
			
		||||
 | 
			
		||||
// Enable CORS, authentication, and authorization middleware.
 | 
			
		||||
app.UseCors("DamageAppCorsPolicy");
 | 
			
		||||
 | 
			
		||||
app.UseAuthorization();
 | 
			
		||||
 | 
			
		||||
app.MapControllers();
 | 
			
		||||
 | 
			
		||||
@ -17,7 +17,7 @@ namespace DamageAssesment.Api.Locations.Providers
 | 
			
		||||
            this.locationDbContext = locationDbContext;
 | 
			
		||||
            this.logger = logger;
 | 
			
		||||
            this.mapper = mapper;
 | 
			
		||||
          //  SeedData();
 | 
			
		||||
            //  SeedData();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public async Task<(bool IsSuccess, IEnumerable<Models.Location> Locations, string ErrorMessage)> GetLocationsAsync()
 | 
			
		||||
@ -28,6 +28,8 @@ namespace DamageAssesment.Api.Locations.Providers
 | 
			
		||||
                var locations = await locationDbContext.Locations.AsNoTracking().ToListAsync();
 | 
			
		||||
                if (locations != null)
 | 
			
		||||
                {
 | 
			
		||||
                    int maxenrollment = (int)locations.Max(a => a.Enrollment);
 | 
			
		||||
                    foreach (Db.Location item in locations) { item.DataValue = GetHeatmapdata(item.Enrollment, maxenrollment); }
 | 
			
		||||
                    logger?.LogInformation($"{locations.Count} Locations(s) found");
 | 
			
		||||
                    var result = mapper.Map<IEnumerable<Db.Location>, IEnumerable<Models.Location>>(locations);
 | 
			
		||||
                    return (true, result, null);
 | 
			
		||||
@ -46,9 +48,12 @@ namespace DamageAssesment.Api.Locations.Providers
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                logger?.LogInformation("Query Location");
 | 
			
		||||
 | 
			
		||||
                int maxenrollment = (int)await locationDbContext.Locations.AsNoTracking().MaxAsync(a => a.Enrollment);
 | 
			
		||||
                var location = await locationDbContext.Locations.AsNoTracking().FirstOrDefaultAsync(q => q.Id == Id);
 | 
			
		||||
                if (location != null)
 | 
			
		||||
                {
 | 
			
		||||
                {if(maxenrollment>0)
 | 
			
		||||
                        location.DataValue = GetHeatmapdata(location.Enrollment, maxenrollment);
 | 
			
		||||
                    logger?.LogInformation($"{location}  found");
 | 
			
		||||
                    var result = mapper.Map<Db.Location, Models.Location>(location);
 | 
			
		||||
                    return (true, result, null);
 | 
			
		||||
@ -61,6 +66,10 @@ namespace DamageAssesment.Api.Locations.Providers
 | 
			
		||||
                return (false, null, ex.Message);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        private int GetHeatmapdata(int? enrollment,int maxenrollment)
 | 
			
		||||
        {
 | 
			
		||||
            return (enrollment != null ? enrollment.Value : 0) * 100 / maxenrollment;
 | 
			
		||||
        }
 | 
			
		||||
        public async Task<(bool IsSuccess, Models.Location Location, string ErrorMessage)> PostLocationAsync(Models.Location location)
 | 
			
		||||
        {
 | 
			
		||||
            try
 | 
			
		||||
@ -139,9 +148,9 @@ namespace DamageAssesment.Api.Locations.Providers
 | 
			
		||||
        {
 | 
			
		||||
            if (!locationDbContext.Locations.Any())
 | 
			
		||||
            {
 | 
			
		||||
                locationDbContext.Locations.Add(new Db.Location() { LocationCode = "0091", RegionId = 5, Name = "BOB GRAHAM EDUCATION CENTER", MaintenanceCenter = "1", SchoolType = "K8" });
 | 
			
		||||
                locationDbContext.Locations.Add(new Db.Location() { LocationCode = "0092", RegionId = 1, Name = "NORMAN S. EDELCUP/SUNNY ISLES BEACH K-8", MaintenanceCenter = "1", SchoolType = "K8" });
 | 
			
		||||
                locationDbContext.Locations.Add(new Db.Location() { LocationCode = "7511", RegionId = 4, Name = "MIAMI SPRINGS SHS", MaintenanceCenter = "2", SchoolType = "S" });
 | 
			
		||||
                locationDbContext.Locations.Add(new Db.Location() { LocationCode = "0091", RegionId = 5, Name = "BOB GRAHAM EDUCATION CENTER", MaintenanceCenter = "1", SchoolType = "K8", DataValue = 25,Enrollment=780,Latitude= 25.83604,Longitute= -80.21618 });
 | 
			
		||||
                locationDbContext.Locations.Add(new Db.Location() { LocationCode = "0092", RegionId = 1, Name = "NORMAN S. EDELCUP/SUNNY ISLES BEACH K-8", MaintenanceCenter = "1", SchoolType = "K8", DataValue = 46, Enrollment = 650, Latitude = 20.83604, Longitute = -40.21618 });
 | 
			
		||||
                locationDbContext.Locations.Add(new Db.Location() { LocationCode = "7511", RegionId = 4, Name = "MIAMI SPRINGS SHS", MaintenanceCenter = "2", SchoolType = "S", DataValue = 12, Enrollment = 500, Latitude = 53.83604, Longitute = -60.21618 });
 | 
			
		||||
                //locationDbContext.Locations.Add(new Db.Location() { Id = 3, LocationCode = "Loc3", RegionId = 3, Name = "BOB GRAHAM EDUCATION CENTER 3", MaintenanceCenter = "1", SchoolType = "US" });
 | 
			
		||||
                //locationDbContext.Locations.Add(new Db.Location() { Id = 4, LocationCode = "Loc4", RegionId = 1, Name = "BOB GRAHAM EDUCATION CENTER 4", MaintenanceCenter = "1", SchoolType = "US" });
 | 
			
		||||
                //locationDbContext.Locations.Add(new Db.Location() { Id = 5, LocationCode = "Loc5", RegionId = 2, Name = "BOB GRAHAM EDUCATION CENTER 5", MaintenanceCenter = "1", SchoolType = "US" });
 | 
			
		||||
 | 
			
		||||
@ -10,7 +10,8 @@
 | 
			
		||||
  },
 | 
			
		||||
  "AllowedHosts": "*",
 | 
			
		||||
  "ConnectionStrings": {
 | 
			
		||||
    //"LocationConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;"
 | 
			
		||||
    //"LocationConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;",
 | 
			
		||||
    // "LocationConnection": "Server=localhost,1433;Database=da_survey_dev;User Id=sa;Password=Password123;TrustServerCertificate=True;"
 | 
			
		||||
    "LocationConnection": "Server=207.180.248.35;Database=da_survey_dev;User Id=sa;Password=YourStrongPassw0rd;TrustServerCertificate=True;"
 | 
			
		||||
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,5 @@
 | 
			
		||||
using DamageAssesment.Api.Questions.Interfaces;
 | 
			
		||||
using DamageAssesment.Api.Questions.Models;
 | 
			
		||||
using Microsoft.AspNetCore.Authorization;
 | 
			
		||||
using Microsoft.AspNetCore.Mvc;
 | 
			
		||||
 | 
			
		||||
namespace DamageAssesment.Api.Questions.Controllers
 | 
			
		||||
@ -12,13 +11,16 @@ namespace DamageAssesment.Api.Questions.Controllers
 | 
			
		||||
 | 
			
		||||
        public QuestionsController(IQuestionsProvider questionsProvider)
 | 
			
		||||
        {
 | 
			
		||||
 | 
			
		||||
            this.questionsProvider = questionsProvider;
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// GET request for retrieving questions.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        //get all questions
 | 
			
		||||
        [Authorize(Roles = "admin,survey,user,report")]
 | 
			
		||||
 | 
			
		||||
        // get all questions
 | 
			
		||||
        [Route("questions")]
 | 
			
		||||
        [Route("questions/{language:alpha}")]
 | 
			
		||||
        [HttpGet]
 | 
			
		||||
@ -36,7 +38,6 @@ namespace DamageAssesment.Api.Questions.Controllers
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// GET request for retrieving a question by ID.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        [Authorize(Roles = "admin,survey,user,report")]
 | 
			
		||||
        [Route("questions/{id}/{language:alpha}")]
 | 
			
		||||
        [Route("questions/{id:int}")]
 | 
			
		||||
        [HttpGet]
 | 
			
		||||
@ -55,7 +56,6 @@ namespace DamageAssesment.Api.Questions.Controllers
 | 
			
		||||
        /// GET request for retrieving survey questions based on a survey ID.
 | 
			
		||||
        /// Uri: {Optional language}/GetSurveyQuestions/{surveyId} :Default returns question in all languages 
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        [Authorize(Roles = "admin,survey,user,report")]
 | 
			
		||||
        [Route("questions/bysurvey/{surveyId:int}")]
 | 
			
		||||
        [Route("questions/bysurvey/{surveyId:int}/{language:alpha}")]
 | 
			
		||||
        [HttpGet]
 | 
			
		||||
@ -72,7 +72,6 @@ namespace DamageAssesment.Api.Questions.Controllers
 | 
			
		||||
        /// PUT request for updating a question (multilingual).
 | 
			
		||||
        /// </summary>
 | 
			
		||||
 | 
			
		||||
        [Authorize(Roles = "admin")]
 | 
			
		||||
        [HttpPut("questions")]
 | 
			
		||||
        public async Task<IActionResult> UpdateQuestion(Models.Question question)
 | 
			
		||||
        {
 | 
			
		||||
@ -93,7 +92,6 @@ namespace DamageAssesment.Api.Questions.Controllers
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// POST request for creating a multiple question (multilingual).
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        [Authorize(Roles = "admin")]
 | 
			
		||||
        [HttpPost("questions/multiple")]
 | 
			
		||||
        public async Task<IActionResult> CreateQuestions(List<Models.Question> questions)
 | 
			
		||||
        {
 | 
			
		||||
@ -109,7 +107,7 @@ namespace DamageAssesment.Api.Questions.Controllers
 | 
			
		||||
 | 
			
		||||
                return BadRequest(result.ErrorMessage);
 | 
			
		||||
            }
 | 
			
		||||
            return CreatedAtRoute("DefaultApi", questions);
 | 
			
		||||
            return CreatedAtRoute("DefaultApi",questions);
 | 
			
		||||
        }
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// PUT request for update a multiple question (multilingual) for survey.
 | 
			
		||||
@ -135,7 +133,6 @@ namespace DamageAssesment.Api.Questions.Controllers
 | 
			
		||||
        /// POST request for creating a new question (multilingual).
 | 
			
		||||
        /// </summary>
 | 
			
		||||
 | 
			
		||||
        [Authorize(Roles = "admin")]
 | 
			
		||||
        [HttpPost("questions")]
 | 
			
		||||
        public async Task<IActionResult> CreateQuestion(Models.Question question)
 | 
			
		||||
        {
 | 
			
		||||
@ -154,7 +151,6 @@ namespace DamageAssesment.Api.Questions.Controllers
 | 
			
		||||
        /// DELETE request for deleting a question based on ID.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
 | 
			
		||||
        [Authorize(Roles = "admin")]
 | 
			
		||||
        [HttpDelete("questions/{id}")]
 | 
			
		||||
        public async Task<IActionResult> DeleteQuestion(int id)
 | 
			
		||||
        {
 | 
			
		||||
@ -170,7 +166,6 @@ namespace DamageAssesment.Api.Questions.Controllers
 | 
			
		||||
        /// GET request for retrieving question categories.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
 | 
			
		||||
        [Authorize(Roles = "admin,user,report")]
 | 
			
		||||
        [HttpGet("questions/categories")]
 | 
			
		||||
        [HttpGet("questions/categories/{language:alpha}")]
 | 
			
		||||
        public async Task<IActionResult> GetQuestionCategoriesAsync(string? language)
 | 
			
		||||
@ -185,7 +180,7 @@ namespace DamageAssesment.Api.Questions.Controllers
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// GET request for retrieving a question category by ID.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        [Authorize(Roles = "admin,report")]
 | 
			
		||||
 | 
			
		||||
        [HttpGet("questions/categories/{id:int}")]
 | 
			
		||||
        [HttpGet("questions/categories/{id:int}/{language:alpha}")]
 | 
			
		||||
        public async Task<IActionResult> GetQuestionCategoryAsync(int id,string? language)
 | 
			
		||||
@ -202,7 +197,7 @@ namespace DamageAssesment.Api.Questions.Controllers
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// PUT request for updating a question category.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        [Authorize(Roles = "admin,survey,report")]
 | 
			
		||||
 | 
			
		||||
        [HttpPut("questions/categories")]
 | 
			
		||||
        public async Task<IActionResult> UpdateQuestionCategory(Models.QuestionCategory questionCategory)
 | 
			
		||||
        {
 | 
			
		||||
@ -224,7 +219,6 @@ namespace DamageAssesment.Api.Questions.Controllers
 | 
			
		||||
        /// POST request for creating a new question category.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
 | 
			
		||||
        [Authorize(Roles = "admin")]
 | 
			
		||||
        [HttpPost("questions/categories")]
 | 
			
		||||
        public async Task<IActionResult> CreateQuestionCategory(Models.QuestionCategory questionCategory)
 | 
			
		||||
        {
 | 
			
		||||
@ -243,7 +237,6 @@ namespace DamageAssesment.Api.Questions.Controllers
 | 
			
		||||
        /// DELETE request for deleting a question category based on ID.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
 | 
			
		||||
        [Authorize(Roles = "admin")]
 | 
			
		||||
        [HttpDelete("questions/categories/{id}")]
 | 
			
		||||
        public async Task<IActionResult> DeleteQuestionCategory(int id)
 | 
			
		||||
        {
 | 
			
		||||
 | 
			
		||||
@ -12,7 +12,7 @@
 | 
			
		||||
        public bool IsRequired { get; set; }
 | 
			
		||||
        public bool Comment { get; set; }
 | 
			
		||||
        public bool Key { get; set; }
 | 
			
		||||
        public int SurveyId { get; set; }
 | 
			
		||||
        public int? SurveyId { get; set; }
 | 
			
		||||
        public int CategoryId { get; set; }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1,36 +1,11 @@
 | 
			
		||||
using DamageAssesment.Api.Questions.Db;
 | 
			
		||||
using DamageAssesment.Api.Questions.Interfaces;
 | 
			
		||||
using DamageAssesment.Api.Questions.Providers;
 | 
			
		||||
using Microsoft.AspNetCore.Authentication.JwtBearer;
 | 
			
		||||
using Microsoft.EntityFrameworkCore;
 | 
			
		||||
using Microsoft.IdentityModel.Tokens;
 | 
			
		||||
using Microsoft.OpenApi.Models;
 | 
			
		||||
using System.Reflection;
 | 
			
		||||
using System.Text;
 | 
			
		||||
 | 
			
		||||
var builder = WebApplication.CreateBuilder(args);
 | 
			
		||||
builder.Services.AddCors(p => p.AddPolicy("DamageAppCorsPolicy", build => {
 | 
			
		||||
    build.WithOrigins("*").AllowAnyMethod().AllowAnyHeader().AllowAnyOrigin();
 | 
			
		||||
}));
 | 
			
		||||
// Add services to the container.
 | 
			
		||||
var authkey = builder.Configuration.GetValue<string>("JwtSettings:securitykey");
 | 
			
		||||
builder.Services.AddAuthentication(item =>
 | 
			
		||||
{
 | 
			
		||||
    item.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
 | 
			
		||||
    item.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
 | 
			
		||||
}).AddJwtBearer(item =>
 | 
			
		||||
{
 | 
			
		||||
    item.RequireHttpsMetadata = true;
 | 
			
		||||
    item.SaveToken = true;
 | 
			
		||||
    item.TokenValidationParameters = new TokenValidationParameters()
 | 
			
		||||
    {
 | 
			
		||||
        ValidateIssuerSigningKey = true,
 | 
			
		||||
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(authkey)),
 | 
			
		||||
        ValidateIssuer = false,
 | 
			
		||||
        ValidateAudience = false,
 | 
			
		||||
        ClockSkew = TimeSpan.Zero
 | 
			
		||||
    };
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
// Add services to the container.
 | 
			
		||||
 | 
			
		||||
builder.Services.AddControllers();
 | 
			
		||||
@ -40,47 +15,28 @@ builder.Services.AddControllers();
 | 
			
		||||
builder.Services.AddScoped<IQuestionsProvider, QuestionsProvider>();
 | 
			
		||||
builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());
 | 
			
		||||
 | 
			
		||||
// CORS setup to allow requests from any origin.
 | 
			
		||||
builder.Services.AddCors(p => p.AddPolicy("DamageAppCorsPolicy", build => {
 | 
			
		||||
    build.WithOrigins("*").AllowAnyMethod().AllowAnyHeader().AllowAnyOrigin();
 | 
			
		||||
}));
 | 
			
		||||
 | 
			
		||||
// Add controller services and API Explorer for endpoint discovery.
 | 
			
		||||
builder.Services.AddEndpointsApiExplorer();
 | 
			
		||||
//builder.Services.AddSwaggerGen();
 | 
			
		||||
builder.Services.AddSwaggerGen(options =>
 | 
			
		||||
// Add Swagger/OpenAPI documentation support.
 | 
			
		||||
builder.Services.AddSwaggerGen(c =>
 | 
			
		||||
{
 | 
			
		||||
    // Include XML comments from your assembly
 | 
			
		||||
    var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
 | 
			
		||||
    var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
 | 
			
		||||
    options.IncludeXmlComments(xmlPath);
 | 
			
		||||
 | 
			
		||||
    OpenApiSecurityScheme securityDefinition = new OpenApiSecurityScheme()
 | 
			
		||||
    {
 | 
			
		||||
        Name = "Bearer",
 | 
			
		||||
        BearerFormat = "JWT",
 | 
			
		||||
        Scheme = "bearer",
 | 
			
		||||
        Description = "Specify the authorization token.",
 | 
			
		||||
        In = ParameterLocation.Header,
 | 
			
		||||
        Type = SecuritySchemeType.Http,
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    options.AddSecurityDefinition("jwt_auth", securityDefinition);
 | 
			
		||||
 | 
			
		||||
    // Make sure swagger UI requires a Bearer token specified
 | 
			
		||||
    OpenApiSecurityScheme securityScheme = new OpenApiSecurityScheme()
 | 
			
		||||
    {
 | 
			
		||||
        Reference = new OpenApiReference()
 | 
			
		||||
        {
 | 
			
		||||
            Id = "jwt_auth",
 | 
			
		||||
            Type = ReferenceType.SecurityScheme
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
    OpenApiSecurityRequirement securityRequirements = new OpenApiSecurityRequirement()
 | 
			
		||||
    {
 | 
			
		||||
        {securityScheme, new string[] { }},
 | 
			
		||||
    };
 | 
			
		||||
    options.AddSecurityRequirement(securityRequirements);
 | 
			
		||||
    c.IncludeXmlComments(xmlPath);
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
builder.Services.AddDbContext<QuestionDbContext>(option =>
 | 
			
		||||
{
 | 
			
		||||
    option.UseSqlServer("QuestionConnection");
 | 
			
		||||
});
 | 
			
		||||
builder.Services.AddCors(p => p.AddPolicy("DamageAppCorsPolicy", build => {
 | 
			
		||||
    build.WithOrigins("*").AllowAnyMethod().AllowAnyHeader().AllowAnyOrigin();
 | 
			
		||||
}));
 | 
			
		||||
var app = builder.Build();
 | 
			
		||||
 | 
			
		||||
// Configure the HTTP request pipeline.
 | 
			
		||||
@ -96,8 +52,10 @@ if (app.Environment.IsDevelopment())
 | 
			
		||||
        questionProvider.SeedData();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// Enable CORS, authentication, and authorization middleware.
 | 
			
		||||
app.UseCors("DamageAppCorsPolicy");
 | 
			
		||||
app.UseAuthentication();
 | 
			
		||||
app.UseAuthorization();
 | 
			
		||||
 | 
			
		||||
app.MapControllers();
 | 
			
		||||
 | 
			
		||||
@ -363,7 +363,7 @@ namespace DamageAssesment.Api.Questions.Providers
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                List<Models.MultiLanguage> results = new List<MultiLanguage>();
 | 
			
		||||
                logger?.LogInformation("Query Question");
 | 
			
		||||
               logger?.LogInformation("Query Question");
 | 
			
		||||
                foreach (Models.Question Question in Questions)
 | 
			
		||||
                {
 | 
			
		||||
                    results.Add(InsertQuestion(Question));
 | 
			
		||||
 | 
			
		||||
@ -11,6 +11,7 @@
 | 
			
		||||
  "AllowedHosts": "*",
 | 
			
		||||
  "ConnectionStrings": {
 | 
			
		||||
    //"QuestionConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;"
 | 
			
		||||
    // "QuestionConnection": "Server=localhost,1433;Database=da_survey_dev;User Id=sa;Password=Password123;TrustServerCertificate=True;"
 | 
			
		||||
    "QuestionConnection": "Server=207.180.248.35;Database=da_survey_dev;User Id=sa;Password=YourStrongPassw0rd;TrustServerCertificate=True;"
 | 
			
		||||
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@ -86,9 +86,8 @@ namespace DamageAssesment.Api.Questions.Test
 | 
			
		||||
            List<Models.Question> Questions = new List<Models.Question>();
 | 
			
		||||
            QuestionsTranslations.Add(QuestionsTranslation);
 | 
			
		||||
            Questions.Models.Question question = new Questions.Models.Question() { Id = 1, Questions = QuestionsTranslations, TypeText = "Text 1", SurveyId = 1, QuestionNumber = 1, IsRequired = true, Comment = false, Key = true, CategoryId = 1 };
 | 
			
		||||
            Questions.Add(question);
 | 
			
		||||
              Questions.Add(question);
 | 
			
		||||
            return Questions;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -356,5 +356,6 @@ namespace DamageAssesment.Api.Questions.Test
 | 
			
		||||
 | 
			
		||||
            Assert.Equal(404, result.StatusCode);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -25,16 +25,17 @@ namespace DamageAssesment.SurveyResponses.Test
 | 
			
		||||
            SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject();
 | 
			
		||||
            var mockResponse = await MockData.getOkResponse(mockRequestObject);
 | 
			
		||||
            mockSurveyResponseService.Setup(service => service.GetSurveyResponsesAsync(1)).ReturnsAsync(mockResponse);
 | 
			
		||||
            var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
 | 
			
		||||
            var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
 | 
			
		||||
            var result = (OkObjectResult)await surveyResponseProvider.GetSurveyResponsesAsync(1);
 | 
			
		||||
            Assert.Equal(200, result.StatusCode);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact(DisplayName = "Get Responses - BadRequest case")]
 | 
			
		||||
        public async Task GetSurveyResponsesAsync_ShouldReturnStatusCode204()
 | 
			
		||||
        {
 | 
			
		||||
            var mockResponse = await MockData.getResponse();
 | 
			
		||||
            mockSurveyResponseService.Setup(service => service.GetSurveyResponsesAsync(1)).ReturnsAsync(mockResponse);
 | 
			
		||||
            var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
 | 
			
		||||
            var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
 | 
			
		||||
            var result = (BadRequestObjectResult)await surveyResponseProvider.GetSurveyResponsesAsync(1);
 | 
			
		||||
            Assert.Equal(400, result.StatusCode);
 | 
			
		||||
        }
 | 
			
		||||
@ -45,7 +46,7 @@ namespace DamageAssesment.SurveyResponses.Test
 | 
			
		||||
            SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject();
 | 
			
		||||
            var mockResponse = await MockData.getOkResponse();
 | 
			
		||||
            mockSurveyResponseService.Setup(service => service.GetSurveyResponsesBySurveyAsync(1, 1)).ReturnsAsync(mockResponse);
 | 
			
		||||
            var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
 | 
			
		||||
            var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
 | 
			
		||||
            var result = (OkObjectResult)await surveyResponseProvider.GetSurveyResponsesAsync(1, 1);
 | 
			
		||||
            Assert.Equal(200, result.StatusCode);
 | 
			
		||||
        }
 | 
			
		||||
@ -55,7 +56,7 @@ namespace DamageAssesment.SurveyResponses.Test
 | 
			
		||||
        {
 | 
			
		||||
            var mockResponse = await MockData.getResponse();
 | 
			
		||||
            mockSurveyResponseService.Setup(service => service.GetSurveyResponsesBySurveyAsync(1, 1)).ReturnsAsync(mockResponse);
 | 
			
		||||
            var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
 | 
			
		||||
            var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
 | 
			
		||||
            var result = (NoContentResult)await surveyResponseProvider.GetSurveyResponsesAsync(1, 1);
 | 
			
		||||
            Assert.Equal(204, result.StatusCode);
 | 
			
		||||
        }
 | 
			
		||||
@ -69,7 +70,7 @@ namespace DamageAssesment.SurveyResponses.Test
 | 
			
		||||
            SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject();
 | 
			
		||||
            var mockResponse = await MockData.getOkResponse();
 | 
			
		||||
            mockSurveyResponseService.Setup(service => service.GetSurveyResponsesBySurveyAndLocationAsync(1, 1, 1)).ReturnsAsync(mockResponse);
 | 
			
		||||
            var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
 | 
			
		||||
            var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
 | 
			
		||||
            var result = (OkObjectResult)await surveyResponseProvider.GetSurveyResponsesBySurveyAndLocationAsync(1, 1, 1);
 | 
			
		||||
            Assert.Equal(200, result.StatusCode);
 | 
			
		||||
        }
 | 
			
		||||
@ -79,7 +80,7 @@ namespace DamageAssesment.SurveyResponses.Test
 | 
			
		||||
        {
 | 
			
		||||
            var mockResponse = await MockData.getResponse();
 | 
			
		||||
            mockSurveyResponseService.Setup(service => service.GetSurveyResponsesBySurveyAndLocationAsync(1, 1, 1)).ReturnsAsync(mockResponse);
 | 
			
		||||
            var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
 | 
			
		||||
            var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
 | 
			
		||||
            var result = (NoContentResult)await surveyResponseProvider.GetSurveyResponsesBySurveyAndLocationAsync(1, 1, 1);
 | 
			
		||||
            Assert.Equal(204, result.StatusCode);
 | 
			
		||||
        }
 | 
			
		||||
@ -90,7 +91,7 @@ namespace DamageAssesment.SurveyResponses.Test
 | 
			
		||||
            SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject();
 | 
			
		||||
            var mockResponse = await MockData.getOkResponse();
 | 
			
		||||
            mockSurveyResponseService.Setup(service => service.GetResponsesByAnswerAsync(1, 1, "Yes", 1)).ReturnsAsync(mockResponse);
 | 
			
		||||
            var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
 | 
			
		||||
            var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
 | 
			
		||||
            var result = (OkObjectResult)await surveyResponseProvider.GetSurveyResponsesByAnswerAsyncAsync(1, 1, "Yes", 1);
 | 
			
		||||
            Assert.Equal(200, result.StatusCode);
 | 
			
		||||
        }
 | 
			
		||||
@ -100,7 +101,7 @@ namespace DamageAssesment.SurveyResponses.Test
 | 
			
		||||
        {
 | 
			
		||||
            var mockResponse = await MockData.getResponse();
 | 
			
		||||
            mockSurveyResponseService.Setup(service => service.GetResponsesByAnswerAsync(1, 1, "Yes", 1)).ReturnsAsync(mockResponse);
 | 
			
		||||
            var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
 | 
			
		||||
            var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
 | 
			
		||||
            var result = (NoContentResult)await surveyResponseProvider.GetSurveyResponsesByAnswerAsyncAsync(1, 1, "Yes", 1);
 | 
			
		||||
            Assert.Equal(204, result.StatusCode);
 | 
			
		||||
        }
 | 
			
		||||
@ -112,7 +113,7 @@ namespace DamageAssesment.SurveyResponses.Test
 | 
			
		||||
            SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject();
 | 
			
		||||
            var mockResponse = await MockData.getOkResponse();
 | 
			
		||||
            mockSurveyResponseService.Setup(service => service.GetAnswersByRegionAsync(1, 1)).ReturnsAsync(mockResponse);
 | 
			
		||||
            var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
 | 
			
		||||
            var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
 | 
			
		||||
            var result = (OkObjectResult)await surveyResponseProvider.GetAnswersByRegionAsync(1, 1);
 | 
			
		||||
            Assert.Equal(200, result.StatusCode);
 | 
			
		||||
        }
 | 
			
		||||
@ -122,7 +123,7 @@ namespace DamageAssesment.SurveyResponses.Test
 | 
			
		||||
        {
 | 
			
		||||
            var mockResponse = await MockData.getResponse();
 | 
			
		||||
            mockSurveyResponseService.Setup(service => service.GetAnswersByRegionAsync(1, 1)).ReturnsAsync(mockResponse);
 | 
			
		||||
            var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
 | 
			
		||||
            var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
 | 
			
		||||
            var result = (NoContentResult)await surveyResponseProvider.GetAnswersByRegionAsync(1, 1);
 | 
			
		||||
            Assert.Equal(204, result.StatusCode);
 | 
			
		||||
        }
 | 
			
		||||
@ -133,7 +134,7 @@ namespace DamageAssesment.SurveyResponses.Test
 | 
			
		||||
            SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject();
 | 
			
		||||
            var mockResponse = await MockData.getOkResponse();
 | 
			
		||||
            mockSurveyResponseService.Setup(service => service.GetSurveyResponsesByMaintenanceCenterAsync(1, 1)).ReturnsAsync(mockResponse);
 | 
			
		||||
            var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
 | 
			
		||||
            var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
 | 
			
		||||
            var result = (OkObjectResult)await surveyResponseProvider.GetAnswersByMaintenaceCentersync(1, 1);
 | 
			
		||||
            Assert.Equal(200, result.StatusCode);
 | 
			
		||||
        }
 | 
			
		||||
@ -143,7 +144,7 @@ namespace DamageAssesment.SurveyResponses.Test
 | 
			
		||||
        {
 | 
			
		||||
            var mockResponse = await MockData.getResponse();
 | 
			
		||||
            mockSurveyResponseService.Setup(service => service.GetSurveyResponsesByMaintenanceCenterAsync(1, 1)).ReturnsAsync(mockResponse);
 | 
			
		||||
            var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
 | 
			
		||||
            var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
 | 
			
		||||
            var result = (NoContentResult)await surveyResponseProvider.GetAnswersByMaintenaceCentersync(1, 1);
 | 
			
		||||
            Assert.Equal(204, result.StatusCode);
 | 
			
		||||
        }
 | 
			
		||||
@ -154,7 +155,7 @@ namespace DamageAssesment.SurveyResponses.Test
 | 
			
		||||
            SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject();
 | 
			
		||||
            var mockResponse = await MockData.getOkResponse();
 | 
			
		||||
            mockSurveyResponseService.Setup(service => service.GetSurveyResponseByIdAsync(1)).ReturnsAsync(mockResponse);
 | 
			
		||||
            var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
 | 
			
		||||
            var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
 | 
			
		||||
            var result = (OkObjectResult)await surveyResponseProvider.GetSurveyResponseByIdAsync(1);
 | 
			
		||||
            Assert.Equal(200, result.StatusCode);
 | 
			
		||||
        }
 | 
			
		||||
@ -164,7 +165,7 @@ namespace DamageAssesment.SurveyResponses.Test
 | 
			
		||||
        {
 | 
			
		||||
            var mockResponse = await MockData.getResponse();
 | 
			
		||||
            mockSurveyResponseService.Setup(service => service.GetSurveyResponseByIdAsync(1)).ReturnsAsync(mockResponse);
 | 
			
		||||
            var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
 | 
			
		||||
            var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
 | 
			
		||||
            var result = (NoContentResult)await surveyResponseProvider.GetSurveyResponseByIdAsync(1);
 | 
			
		||||
            Assert.Equal(204, result.StatusCode);
 | 
			
		||||
        }
 | 
			
		||||
@ -176,7 +177,7 @@ namespace DamageAssesment.SurveyResponses.Test
 | 
			
		||||
            SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject();
 | 
			
		||||
            var mockResponse = await MockData.getOkResponse(mockRequestObject);
 | 
			
		||||
            mockSurveyResponseService.Setup(service => service.PostSurveyResponseAsync(mockRequestObject)).ReturnsAsync(mockResponse);
 | 
			
		||||
            var surveyResponseController = new ResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
 | 
			
		||||
            var surveyResponseController = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
 | 
			
		||||
            var result = (OkObjectResult)await surveyResponseController.PostSurveysAsync(mockRequestObject);
 | 
			
		||||
            Assert.Equal(200, result.StatusCode);
 | 
			
		||||
        }
 | 
			
		||||
@ -187,7 +188,7 @@ namespace DamageAssesment.SurveyResponses.Test
 | 
			
		||||
            SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject();
 | 
			
		||||
            var mockResponse = await MockData.getResponse();
 | 
			
		||||
            mockSurveyResponseService.Setup(service => service.PostSurveyResponseAsync(mockRequestObject)).ReturnsAsync(mockResponse);
 | 
			
		||||
            var surveyResponseController = new ResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
 | 
			
		||||
            var surveyResponseController = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
 | 
			
		||||
            var result = (BadRequestObjectResult)await surveyResponseController.PostSurveysAsync(mockRequestObject);
 | 
			
		||||
            Assert.Equal(400, result.StatusCode);
 | 
			
		||||
        }
 | 
			
		||||
@ -198,7 +199,7 @@ namespace DamageAssesment.SurveyResponses.Test
 | 
			
		||||
            SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject();
 | 
			
		||||
            var mockResponse = await MockData.getOkResponse(mockRequestObject);
 | 
			
		||||
            mockSurveyResponseService.Setup(service => service.PutSurveyResponseAsync(1, mockRequestObject)).ReturnsAsync(mockResponse);
 | 
			
		||||
            var surveyResponseController = new ResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
 | 
			
		||||
            var surveyResponseController = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
 | 
			
		||||
            var result = (OkObjectResult)await surveyResponseController.PutSurveyResponseAsync(1, mockRequestObject);
 | 
			
		||||
            Assert.Equal(200, result.StatusCode);
 | 
			
		||||
        }
 | 
			
		||||
@ -209,7 +210,7 @@ namespace DamageAssesment.SurveyResponses.Test
 | 
			
		||||
            SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject();
 | 
			
		||||
            var mockResponse = await MockData.getResponse();
 | 
			
		||||
            mockSurveyResponseService.Setup(service => service.PutSurveyResponseAsync(1, mockRequestObject)).ReturnsAsync(mockResponse); ;
 | 
			
		||||
            var surveyResponseController = new ResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
 | 
			
		||||
            var surveyResponseController = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
 | 
			
		||||
            var result = (BadRequestObjectResult)await surveyResponseController.PutSurveyResponseAsync(1, mockRequestObject);
 | 
			
		||||
            Assert.Equal(400, result.StatusCode);
 | 
			
		||||
        }
 | 
			
		||||
@ -220,7 +221,7 @@ namespace DamageAssesment.SurveyResponses.Test
 | 
			
		||||
            SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject();
 | 
			
		||||
            var mockResponse = await MockData.getOkResponse(mockRequestObject);
 | 
			
		||||
            mockSurveyResponseService.Setup(service => service.DeleteSurveyResponseAsync(1)).ReturnsAsync(mockResponse);
 | 
			
		||||
            var surveyResponseController = new ResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
 | 
			
		||||
            var surveyResponseController = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
 | 
			
		||||
            var result = (OkObjectResult)await surveyResponseController.DeleteSurveyResponseAsync(1);
 | 
			
		||||
            Assert.Equal(200, result.StatusCode);
 | 
			
		||||
        }
 | 
			
		||||
@ -230,7 +231,7 @@ namespace DamageAssesment.SurveyResponses.Test
 | 
			
		||||
        {
 | 
			
		||||
            var mockResponse = await MockData.getResponse();
 | 
			
		||||
            mockSurveyResponseService.Setup(service => service.DeleteSurveyResponseAsync(1)).ReturnsAsync(mockResponse); ;
 | 
			
		||||
            var surveyResponseController = new ResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
 | 
			
		||||
            var surveyResponseController = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
 | 
			
		||||
            var result = (NotFoundResult)await surveyResponseController.DeleteSurveyResponseAsync(1);
 | 
			
		||||
            Assert.Equal(404, result.StatusCode);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@ -1,17 +1,16 @@
 | 
			
		||||
using DamageAssesment.Api.Responses.Interfaces;
 | 
			
		||||
using DamageAssesment.Api.Responses.Models;
 | 
			
		||||
using Microsoft.AspNetCore.Authorization;
 | 
			
		||||
using Microsoft.AspNetCore.Mvc;
 | 
			
		||||
 | 
			
		||||
namespace DamageAssesment.Api.Responses.Controllers
 | 
			
		||||
{
 | 
			
		||||
    [ApiController]
 | 
			
		||||
    public class ResponsesController : ControllerBase
 | 
			
		||||
    public class SurveyResponsesController : ControllerBase
 | 
			
		||||
    {
 | 
			
		||||
        private readonly ISurveysResponse surveyResponseProvider;
 | 
			
		||||
        private readonly IExcelExportService excelExportService;
 | 
			
		||||
 | 
			
		||||
        public ResponsesController(ISurveysResponse surveyResponseProvider, IExcelExportService excelExportService)
 | 
			
		||||
        public SurveyResponsesController(ISurveysResponse surveyResponseProvider, IExcelExportService excelExportService)
 | 
			
		||||
        {
 | 
			
		||||
            this.surveyResponseProvider = surveyResponseProvider;
 | 
			
		||||
            this.excelExportService = excelExportService;
 | 
			
		||||
@ -20,7 +19,6 @@ namespace DamageAssesment.Api.Responses.Controllers
 | 
			
		||||
        /// GET request for retrieving survey responses.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
 | 
			
		||||
        [Authorize(Roles = "admin,survey,user,report")]
 | 
			
		||||
        [Route("responses/{employeeid:int}")]
 | 
			
		||||
        [Route("responses")]
 | 
			
		||||
        [HttpGet]
 | 
			
		||||
@ -40,7 +38,6 @@ namespace DamageAssesment.Api.Responses.Controllers
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// GET request for retrieving survey responses by survey ID.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        [Authorize(Roles = "admin,survey,user,report")]
 | 
			
		||||
        [Route("responses/bysurvey/{surveyid:int}/{employeeid:int}")]
 | 
			
		||||
        [Route("responses/bysurvey/{surveyid:int}")]
 | 
			
		||||
        [HttpGet]
 | 
			
		||||
@ -59,7 +56,6 @@ namespace DamageAssesment.Api.Responses.Controllers
 | 
			
		||||
        /// <param name="surveyid">The ID of the survey for which responses are to be retrieved.</param>
 | 
			
		||||
        /// <param name="locationid">The ID of the location for which responses are to be retrieved.</param>
 | 
			
		||||
 | 
			
		||||
        [Authorize(Roles = "admin,survey,user,report")]
 | 
			
		||||
        [Route("responses/{surveyid:int}/{locationid:int}/{employeeid:int}")]
 | 
			
		||||
        [Route("responses/{surveyid:int}/{locationid:int}")]
 | 
			
		||||
        [HttpGet]
 | 
			
		||||
@ -79,7 +75,6 @@ namespace DamageAssesment.Api.Responses.Controllers
 | 
			
		||||
        /// <param name="questionId">The ID of the question for which responses are to be retrieved.</param>
 | 
			
		||||
        /// <param name="answer">The answer for which responses are to be retrieved.</param>
 | 
			
		||||
 | 
			
		||||
        [Authorize(Roles = "admin,survey,user,report")]
 | 
			
		||||
        [Route("responses/byanswer/{surveyid:int}/{questionid:int}/{answer:alpha}/{employeeid:int}")]
 | 
			
		||||
        [Route("responses/byanswer/{surveyid:int}/{questionid:int}/{answer:alpha}")]
 | 
			
		||||
        [HttpGet]
 | 
			
		||||
@ -98,7 +93,6 @@ namespace DamageAssesment.Api.Responses.Controllers
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <param name="surveyId">The ID of the survey for which answers are to be retrieved.</param>
 | 
			
		||||
 | 
			
		||||
        [Authorize(Roles = "admin,survey,user,report")]
 | 
			
		||||
        [Route("responses/byregion/{surveyid:int}")]
 | 
			
		||||
        [Route("responses/byregion/{surveyid:int}/{employeeid}")]
 | 
			
		||||
        [HttpGet]
 | 
			
		||||
@ -115,7 +109,6 @@ namespace DamageAssesment.Api.Responses.Controllers
 | 
			
		||||
        /// GET request for retrieving survey responses by survey ID and maintenance center.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <param name="surveyId">The ID of the survey for which responses are to be retrieved.</param>
 | 
			
		||||
        [Authorize(Roles = "admin,survey,user,report")]
 | 
			
		||||
        [Route("responses/bymaintenancecenter/{surveyid:int}/{employeeid:int}")]
 | 
			
		||||
        [Route("responses/bymaintenancecenter/{surveyid:int}")]
 | 
			
		||||
        [HttpGet]
 | 
			
		||||
@ -133,7 +126,6 @@ namespace DamageAssesment.Api.Responses.Controllers
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <param name="responseId">The ID of the survey response to be retrieved.</param>
 | 
			
		||||
 | 
			
		||||
        [Authorize(Roles = "admin,survey,user,report")]
 | 
			
		||||
        [HttpGet("responses/{id}")]
 | 
			
		||||
        public async Task<ActionResult> GetSurveyResponseByIdAsync(int id)
 | 
			
		||||
        {
 | 
			
		||||
@ -150,7 +142,6 @@ namespace DamageAssesment.Api.Responses.Controllers
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <param name="surveyResponse">The survey response object to be created.</param>
 | 
			
		||||
 | 
			
		||||
        [Authorize(Roles = "admin,survey,user,report")]
 | 
			
		||||
        [HttpPost("responses")]
 | 
			
		||||
        public async Task<ActionResult> PostSurveysAsync(Models.SurveyResponse surveyResponse)
 | 
			
		||||
        {
 | 
			
		||||
@ -167,7 +158,6 @@ namespace DamageAssesment.Api.Responses.Controllers
 | 
			
		||||
        /// <param name="Id">The ID of the survey response to be updated.</param>
 | 
			
		||||
        /// <param name="surveyResponse">The updated survey response object.</param>
 | 
			
		||||
 | 
			
		||||
        [Authorize(Roles = "admin,survey,user,report")]
 | 
			
		||||
        [HttpPut("responses/{id}")]
 | 
			
		||||
        public async Task<ActionResult> PutSurveyResponseAsync(int id, Models.SurveyResponse surveyResponse)
 | 
			
		||||
        {
 | 
			
		||||
@ -185,7 +175,6 @@ namespace DamageAssesment.Api.Responses.Controllers
 | 
			
		||||
        /// DELETE request for deleting an existing survey response.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
 | 
			
		||||
        [Authorize(Roles = "admin,survey,user,report")]
 | 
			
		||||
        [HttpDelete("responses/{id}")]
 | 
			
		||||
        public async Task<ActionResult> DeleteSurveyResponseAsync(int id)
 | 
			
		||||
        {
 | 
			
		||||
@ -201,7 +190,6 @@ namespace DamageAssesment.Api.Responses.Controllers
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <param name="request">The answers to be submitted for the survey.</param>
 | 
			
		||||
 | 
			
		||||
        [Authorize(Roles = "admin,survey,user,report")]
 | 
			
		||||
        [HttpPost("responses/answers")]
 | 
			
		||||
        public async Task<ActionResult> PostSurveyAnswersAsync(Request request)
 | 
			
		||||
        {
 | 
			
		||||
@ -215,8 +203,6 @@ namespace DamageAssesment.Api.Responses.Controllers
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Get All active surveys .
 | 
			
		||||
        /// </summary>
 | 
			
		||||
 | 
			
		||||
        [Authorize(Roles = "admin,survey,user,report")]
 | 
			
		||||
        [Route("responses/surveys/active")]
 | 
			
		||||
        [Route("responses/surveys/active/{language:alpha}")]
 | 
			
		||||
        [Route("responses/surveys/active/{employeeid:int}")]
 | 
			
		||||
@ -234,7 +220,6 @@ namespace DamageAssesment.Api.Responses.Controllers
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Export all survey response data based on survey id.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        [Authorize(Roles = "admin,survey,user,report")]
 | 
			
		||||
        [HttpGet]
 | 
			
		||||
        [Route("responses/surveys/export/{surveyid}")]
 | 
			
		||||
        public async Task<ActionResult> GetExcelSurveysAsync(int surveyid, string language, bool IsAdmin = false)
 | 
			
		||||
@ -265,7 +250,6 @@ namespace DamageAssesment.Api.Responses.Controllers
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Get all historical surveys .
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        [Authorize(Roles = "admin,survey,user,report")]
 | 
			
		||||
        [Route("responses/surveys/historic")]
 | 
			
		||||
        [Route("responses/surveys/historic/{language:alpha}")]
 | 
			
		||||
        [Route("responses/surveys/historic/{employeeid:int}")]
 | 
			
		||||
@ -4,9 +4,9 @@ namespace DamageAssesment.Api.Responses.Interfaces
 | 
			
		||||
{
 | 
			
		||||
    public interface IAnswerServiceProvider
 | 
			
		||||
    {
 | 
			
		||||
        Task<List<Answer>> getAnswersAsync(string token);
 | 
			
		||||
        Task<List<Models.Answer>> GetAnswersByResponseIdAsync(int responseId, string token);
 | 
			
		||||
        Task<List<Answer>> getAnswersAsync();
 | 
			
		||||
        Task<List<Models.Answer>> GetAnswersByResponseIdAsync(int responseId);
 | 
			
		||||
 | 
			
		||||
        Task<Models.Answer> PostAnswersAsync(Models.Answer answer, string token);
 | 
			
		||||
        Task<Models.Answer> PostAnswersAsync(Models.Answer answer);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -4,7 +4,7 @@ namespace DamageAssesment.Api.Responses.Interfaces
 | 
			
		||||
{
 | 
			
		||||
    public interface IAttachmentServiceProvider
 | 
			
		||||
    {
 | 
			
		||||
        Task<List<Attachment>> getAttachmentsAsync(string token);
 | 
			
		||||
        Task<IEnumerable<Attachment>> PostAttachmentsAsync(Models.AttachmentInfo attachmentInfo, string token);
 | 
			
		||||
        Task<List<Attachment>> getAttachmentsAsync();
 | 
			
		||||
        Task<IEnumerable<Attachment>> PostAttachmentsAsync(Models.AttachmentInfo attachmentInfo);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1,10 +1,10 @@
 | 
			
		||||
using DamageAssesment.Api.Responses.Models;
 | 
			
		||||
using DamageAssesment.Api.Responses.Models;
 | 
			
		||||
 | 
			
		||||
namespace DamageAssesment.Api.Responses.Interfaces
 | 
			
		||||
{
 | 
			
		||||
    public interface IEmployeeServiceProvider
 | 
			
		||||
    {
 | 
			
		||||
        Task<List<Employee>> getEmployeesAsync(string token);
 | 
			
		||||
        Task<Employee> getEmployeeAsync(int employeeId, string token);
 | 
			
		||||
        Task<List<Employee>> getEmployeesAsync();
 | 
			
		||||
        Task<Employee> getEmployeeAsync(int employeeId);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1,9 +1,9 @@
 | 
			
		||||
using DamageAssesment.Api.Responses.Models;
 | 
			
		||||
using DamageAssesment.Api.Responses.Models;
 | 
			
		||||
 | 
			
		||||
namespace DamageAssesment.Api.Responses.Interfaces
 | 
			
		||||
{
 | 
			
		||||
    public interface IHttpUtil
 | 
			
		||||
    {
 | 
			
		||||
        Task<string> SendAsync(HttpMethod method, string url, string JsonInput, string token);
 | 
			
		||||
        Task<string> SendAsync(HttpMethod method, string url, string JsonInput);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -4,6 +4,6 @@ namespace DamageAssesment.Api.Responses.Interfaces
 | 
			
		||||
{
 | 
			
		||||
    public interface ILocationServiceProvider
 | 
			
		||||
    {
 | 
			
		||||
        Task<List<Location>> getLocationsAsync(string token);
 | 
			
		||||
        Task<List<Location>> getLocationsAsync();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -4,9 +4,9 @@ namespace DamageAssesment.Api.Responses.Interfaces
 | 
			
		||||
{
 | 
			
		||||
    public interface IQuestionServiceProvider
 | 
			
		||||
    {
 | 
			
		||||
        Task<List<Question>> getQuestionsAsync(string language, string token);
 | 
			
		||||
        Task<List<SurveyQuestions>> getSurveyQuestionsAsync(int surveyId, string token);
 | 
			
		||||
        Task<Question> getQuestionsAsync(int questionId, string token);
 | 
			
		||||
        Task<List<QuestionCategory>> GetQuestionCategoriesAsync(string? language, string token);
 | 
			
		||||
        Task<List<Question>> getQuestionsAsync(string language);
 | 
			
		||||
        Task<List<SurveyQuestions>> getSurveyQuestionsAsync(int surveyId);
 | 
			
		||||
        Task<Question> getQuestionsAsync(int questionId);
 | 
			
		||||
        Task<List<QuestionCategory>> GetQuestionCategoriesAsync(string? language);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -4,6 +4,6 @@ namespace DamageAssesment.Api.Responses.Interfaces
 | 
			
		||||
{
 | 
			
		||||
    public interface IRegionServiceProvider
 | 
			
		||||
    {
 | 
			
		||||
        Task<List<Region>> getRegionsAsync(string token);
 | 
			
		||||
        Task<List<Region>> getRegionsAsync();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -4,7 +4,7 @@ namespace DamageAssesment.Api.Responses.Interfaces
 | 
			
		||||
{
 | 
			
		||||
    public interface ISurveyServiceProvider
 | 
			
		||||
    {
 | 
			
		||||
        Task<List<Survey>> getSurveysAsync(string language,string token);
 | 
			
		||||
        Task<Survey> getSurveyAsync(int surveyId,string token);
 | 
			
		||||
        Task<List<Survey>> getSurveysAsync(string language);
 | 
			
		||||
        Task<Survey> getSurveyAsync(int surveyId);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -11,6 +11,6 @@ namespace DamageAssesment.Api.Responses.Models
 | 
			
		||||
        public string OfficePhoneNumber { get; set; }
 | 
			
		||||
        public string Email { get; set; }
 | 
			
		||||
        public bool IsActive { get; set; }
 | 
			
		||||
        public string PreferredLanguage { get; set; }
 | 
			
		||||
        public string? PreferredLanguage { get; set; }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -8,5 +8,9 @@
 | 
			
		||||
        public string Name { get; set; }
 | 
			
		||||
        public string MaintenanceCenter { get; set; }
 | 
			
		||||
        public string SchoolType { get; set; }
 | 
			
		||||
        public int? DataValue { get; set; }
 | 
			
		||||
        public int? Enrollment { get; set; }
 | 
			
		||||
        public double? Longitute { get; set; }
 | 
			
		||||
        public double? Latitude { get; set; }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -5,10 +5,6 @@ using DamageAssesment.Api.Responses.Providers;
 | 
			
		||||
using Microsoft.EntityFrameworkCore;
 | 
			
		||||
using Polly;
 | 
			
		||||
using System.Reflection;
 | 
			
		||||
using Microsoft.OpenApi.Models;
 | 
			
		||||
using Microsoft.AspNetCore.Authentication.JwtBearer;
 | 
			
		||||
using Microsoft.IdentityModel.Tokens;
 | 
			
		||||
using System.Text;
 | 
			
		||||
 | 
			
		||||
var builder = WebApplication.CreateBuilder(args);
 | 
			
		||||
const int maxApiCallRetries = 3;
 | 
			
		||||
@ -16,31 +12,14 @@ const int intervalToRetry = 2; //2 seconds
 | 
			
		||||
const int maxRetryForCircuitBraker = 5;
 | 
			
		||||
const int intervalForCircuitBraker = 5; //5 seconds
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// Add services to the container.
 | 
			
		||||
 | 
			
		||||
builder.Services.AddControllers();
 | 
			
		||||
// CORS setup to allow requests from any origin.
 | 
			
		||||
builder.Services.AddCors(p => p.AddPolicy("DamageAppCorsPolicy", build => {
 | 
			
		||||
    build.WithOrigins("*").AllowAnyMethod().AllowAnyHeader().AllowAnyOrigin();
 | 
			
		||||
}));
 | 
			
		||||
 | 
			
		||||
// Add services to the container.
 | 
			
		||||
var authkey = builder.Configuration.GetValue<string>("JwtSettings:securitykey");
 | 
			
		||||
builder.Services.AddAuthentication(item =>
 | 
			
		||||
{
 | 
			
		||||
    item.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
 | 
			
		||||
    item.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
 | 
			
		||||
}).AddJwtBearer(item =>
 | 
			
		||||
{
 | 
			
		||||
    item.RequireHttpsMetadata = true;
 | 
			
		||||
    item.SaveToken = true;
 | 
			
		||||
    item.TokenValidationParameters = new TokenValidationParameters()
 | 
			
		||||
    {
 | 
			
		||||
        ValidateIssuerSigningKey = true,
 | 
			
		||||
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(authkey)),
 | 
			
		||||
        ValidateIssuer = false,
 | 
			
		||||
        ValidateAudience = false,
 | 
			
		||||
        ClockSkew = TimeSpan.Zero
 | 
			
		||||
    };
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
builder.Services.AddControllers();
 | 
			
		||||
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
 | 
			
		||||
 | 
			
		||||
builder.Services.AddScoped<ISurveysResponse, SurveyResponsesProvider>();
 | 
			
		||||
@ -52,7 +31,6 @@ builder.Services.AddScoped<IEmployeeServiceProvider, EmployeeServiceProvider>();
 | 
			
		||||
builder.Services.AddScoped<IAttachmentServiceProvider, AttachmentServiceProvider>();
 | 
			
		||||
builder.Services.AddScoped<ISurveyServiceProvider, SurveyServiceProvider>();
 | 
			
		||||
builder.Services.AddScoped<IExcelExportService, ExcelExportService>();
 | 
			
		||||
builder.Services.AddHttpContextAccessor();
 | 
			
		||||
 | 
			
		||||
builder.Services.AddHttpClient<IHttpUtil, HttpUtil>().
 | 
			
		||||
    AddTransientHttpErrorPolicy(policy => policy.WaitAndRetryAsync(maxApiCallRetries, _ => TimeSpan.FromSeconds(intervalToRetry))).
 | 
			
		||||
@ -62,45 +40,21 @@ builder.Services.AddHttpClient<IHttpUtil, HttpUtil>().
 | 
			
		||||
builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());
 | 
			
		||||
builder.Services.AddEndpointsApiExplorer();
 | 
			
		||||
//builder.Services.AddSwaggerGen();
 | 
			
		||||
 | 
			
		||||
builder.Services.AddSwaggerGen(options =>
 | 
			
		||||
// Add Swagger/OpenAPI documentation support.
 | 
			
		||||
builder.Services.AddSwaggerGen(c =>
 | 
			
		||||
{
 | 
			
		||||
    // Include XML comments from your assembly
 | 
			
		||||
    var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
 | 
			
		||||
    var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
 | 
			
		||||
    options.IncludeXmlComments(xmlPath);
 | 
			
		||||
 | 
			
		||||
    OpenApiSecurityScheme securityDefinition = new OpenApiSecurityScheme()
 | 
			
		||||
    {
 | 
			
		||||
        Name = "Bearer",
 | 
			
		||||
        BearerFormat = "JWT",
 | 
			
		||||
        Scheme = "bearer",
 | 
			
		||||
        Description = "Specify the authorization token.",
 | 
			
		||||
        In = ParameterLocation.Header,
 | 
			
		||||
        Type = SecuritySchemeType.Http,
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    options.AddSecurityDefinition("jwt_auth", securityDefinition);
 | 
			
		||||
 | 
			
		||||
    // Make sure swagger UI requires a Bearer token specified
 | 
			
		||||
    OpenApiSecurityScheme securityScheme = new OpenApiSecurityScheme()
 | 
			
		||||
    {
 | 
			
		||||
        Reference = new OpenApiReference()
 | 
			
		||||
        {
 | 
			
		||||
            Id = "jwt_auth",
 | 
			
		||||
            Type = ReferenceType.SecurityScheme
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
    OpenApiSecurityRequirement securityRequirements = new OpenApiSecurityRequirement()
 | 
			
		||||
    {
 | 
			
		||||
        {securityScheme, new string[] { }},
 | 
			
		||||
    };
 | 
			
		||||
    options.AddSecurityRequirement(securityRequirements);
 | 
			
		||||
    c.IncludeXmlComments(xmlPath);
 | 
			
		||||
});
 | 
			
		||||
builder.Services.AddDbContext<SurveyResponseDbContext>(option =>
 | 
			
		||||
{
 | 
			
		||||
    option.UseSqlServer("ResponsesConnection");
 | 
			
		||||
});
 | 
			
		||||
builder.Services.AddCors(p => p.AddPolicy("DamageAppCorsPolicy", build => {
 | 
			
		||||
    build.WithOrigins("*").AllowAnyMethod().AllowAnyHeader().AllowAnyOrigin();
 | 
			
		||||
}));
 | 
			
		||||
var app = builder.Build();
 | 
			
		||||
 | 
			
		||||
// Configure the HTTP request pipeline.
 | 
			
		||||
@ -109,8 +63,8 @@ if (app.Environment.IsDevelopment())
 | 
			
		||||
    app.UseSwagger();
 | 
			
		||||
    app.UseSwaggerUI();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
app.UseCors("DamageAppCorsPolicy");
 | 
			
		||||
app.UseAuthentication();
 | 
			
		||||
app.UseAuthorization();
 | 
			
		||||
 | 
			
		||||
app.MapControllers();
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
  "profiles": {
 | 
			
		||||
    "DamageAssesment.Api.Responses": {
 | 
			
		||||
    "DamageAssesment.Api.SurveyResponses": {
 | 
			
		||||
      "commandName": "Project",
 | 
			
		||||
      "launchBrowser": true,
 | 
			
		||||
      "launchUrl": "swagger",
 | 
			
		||||
 | 
			
		||||
@ -2,7 +2,6 @@
 | 
			
		||||
using DamageAssesment.Api.Responses.Db;
 | 
			
		||||
using DamageAssesment.Api.Responses.Interfaces;
 | 
			
		||||
using DamageAssesment.Api.Responses.Models;
 | 
			
		||||
using DamageAssesment.Api.Responses.Services;
 | 
			
		||||
using Microsoft.EntityFrameworkCore;
 | 
			
		||||
using Microsoft.EntityFrameworkCore.Metadata.Internal;
 | 
			
		||||
using System.Reflection;
 | 
			
		||||
@ -22,10 +21,8 @@ namespace DamageAssesment.Api.Responses.Providers
 | 
			
		||||
        private readonly IQuestionServiceProvider questionServiceProvider;
 | 
			
		||||
        private readonly ISurveyServiceProvider surveyServiceProvider;
 | 
			
		||||
        private readonly IMapper mapper;
 | 
			
		||||
        private readonly IHttpContextAccessor httpContextAccessor;
 | 
			
		||||
        private string token;
 | 
			
		||||
 | 
			
		||||
        public SurveyResponsesProvider(SurveyResponseDbContext surveyResponseDbContext, ILogger<SurveyResponsesProvider> logger, IAnswerServiceProvider answerServiceProvider, IRegionServiceProvider regionServiceProvider, ILocationServiceProvider locationServiceProvider, IEmployeeServiceProvider employeeServiceProvider, IAttachmentServiceProvider attachmentServiceProvider, IQuestionServiceProvider questionServiceProvider, ISurveyServiceProvider surveyServiceProvider, IMapper mapper, IHttpContextAccessor httpContextAccessor)
 | 
			
		||||
        public SurveyResponsesProvider(SurveyResponseDbContext surveyResponseDbContext, ILogger<SurveyResponsesProvider> logger, IAnswerServiceProvider answerServiceProvider, IRegionServiceProvider regionServiceProvider, ILocationServiceProvider locationServiceProvider, IEmployeeServiceProvider employeeServiceProvider, IAttachmentServiceProvider attachmentServiceProvider, IQuestionServiceProvider questionServiceProvider, ISurveyServiceProvider surveyServiceProvider, IMapper mapper)
 | 
			
		||||
        {
 | 
			
		||||
            this.surveyResponseDbContext = surveyResponseDbContext;
 | 
			
		||||
            this.logger = logger;
 | 
			
		||||
@ -36,20 +33,8 @@ namespace DamageAssesment.Api.Responses.Providers
 | 
			
		||||
            this.attachmentServiceProvider = attachmentServiceProvider;
 | 
			
		||||
            this.questionServiceProvider = questionServiceProvider;
 | 
			
		||||
            this.surveyServiceProvider = surveyServiceProvider;
 | 
			
		||||
            this.httpContextAccessor = httpContextAccessor;
 | 
			
		||||
            this.mapper = mapper;
 | 
			
		||||
            SeedData();
 | 
			
		||||
 | 
			
		||||
            token = httpContextAccessor.HttpContext.Request.Headers.Authorization;
 | 
			
		||||
            if (token != null)
 | 
			
		||||
            {
 | 
			
		||||
                token = token.Replace("Bearer ", string.Empty);
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                token = "";
 | 
			
		||||
            }
 | 
			
		||||
            // seedData();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void SeedData()
 | 
			
		||||
@ -139,7 +124,7 @@ namespace DamageAssesment.Api.Responses.Providers
 | 
			
		||||
            {
 | 
			
		||||
                logger?.LogInformation("Querying to get SurveyResponse object from DB");
 | 
			
		||||
                //get all the survey that already taken by the employee
 | 
			
		||||
                var surveys = await surveyServiceProvider.getSurveysAsync(language, token);
 | 
			
		||||
                var surveys = await surveyServiceProvider.getSurveysAsync(language);
 | 
			
		||||
                surveys = surveys.Where(s => s.IsEnabled == true && s.Status == SurveyStatus.ACTIVE.ToString()).ToList();
 | 
			
		||||
                if (employeeid == null || employeeid == 0)
 | 
			
		||||
                    return (true, surveys, null);
 | 
			
		||||
@ -160,7 +145,7 @@ namespace DamageAssesment.Api.Responses.Providers
 | 
			
		||||
            {
 | 
			
		||||
                logger?.LogInformation("Querying to get SurveyResponse object from DB");
 | 
			
		||||
 | 
			
		||||
                var surveys = await surveyServiceProvider.getSurveysAsync(language, token);
 | 
			
		||||
                var surveys = await surveyServiceProvider.getSurveysAsync(language);
 | 
			
		||||
                // returning only historic data: end date is less than current date.
 | 
			
		||||
                surveys = surveys.Where(s => s.Status == SurveyStatus.INACTIVE.ToString()).ToList();
 | 
			
		||||
                if (employeeid == null || employeeid == 0)
 | 
			
		||||
@ -185,7 +170,7 @@ namespace DamageAssesment.Api.Responses.Providers
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                logger?.LogInformation("Querying to get Survey object from microservice");
 | 
			
		||||
                var survey = await surveyServiceProvider.getSurveyAsync(surveyId, token);
 | 
			
		||||
                var survey = await surveyServiceProvider.getSurveyAsync(surveyId);
 | 
			
		||||
 | 
			
		||||
                if (survey != null)
 | 
			
		||||
                {
 | 
			
		||||
@ -216,7 +201,7 @@ namespace DamageAssesment.Api.Responses.Providers
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                logger?.LogInformation("Querying to get Survey object from microservice");
 | 
			
		||||
                var survey = await surveyServiceProvider.getSurveyAsync(surveyId, token);
 | 
			
		||||
                var survey = await surveyServiceProvider.getSurveyAsync(surveyId);
 | 
			
		||||
 | 
			
		||||
                if (survey != null)
 | 
			
		||||
                {
 | 
			
		||||
@ -247,7 +232,7 @@ namespace DamageAssesment.Api.Responses.Providers
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                logger?.LogInformation("Querying to get Survey object from microservice");
 | 
			
		||||
                var survey = await surveyServiceProvider.getSurveyAsync(surveyId, token);
 | 
			
		||||
                var survey = await surveyServiceProvider.getSurveyAsync(surveyId);
 | 
			
		||||
 | 
			
		||||
                if (survey != null)
 | 
			
		||||
                {
 | 
			
		||||
@ -278,8 +263,8 @@ namespace DamageAssesment.Api.Responses.Providers
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                logger?.LogInformation("Querying to get Survey object from microservice");
 | 
			
		||||
                var survey = await surveyServiceProvider.getSurveyAsync(surveyId, token);
 | 
			
		||||
                var question = await questionServiceProvider.getQuestionsAsync(questionId, token);
 | 
			
		||||
                var survey = await surveyServiceProvider.getSurveyAsync(surveyId);
 | 
			
		||||
                var question = await questionServiceProvider.getQuestionsAsync(questionId);
 | 
			
		||||
                bool IsCorrectAnswer = answer.ToLower().Equals("yes") || answer.ToLower().Equals("no") ? true : false;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -440,7 +425,7 @@ namespace DamageAssesment.Api.Responses.Providers
 | 
			
		||||
        {
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                var answersList = await answerServiceProvider.getAnswersAsync(token);
 | 
			
		||||
                var answersList = await answerServiceProvider.getAnswersAsync();
 | 
			
		||||
                if (answersList == null || !answersList.Any())
 | 
			
		||||
                    return null;
 | 
			
		||||
                //get all the answers for the particular survey
 | 
			
		||||
@ -462,8 +447,8 @@ namespace DamageAssesment.Api.Responses.Providers
 | 
			
		||||
                if (surveyAnswers == null || !surveyAnswers.Any())
 | 
			
		||||
                    return null;
 | 
			
		||||
 | 
			
		||||
                var regions = await regionServiceProvider.getRegionsAsync(token);
 | 
			
		||||
                var locations = await locationServiceProvider.getLocationsAsync(token);
 | 
			
		||||
                var regions = await regionServiceProvider.getRegionsAsync();
 | 
			
		||||
                var locations = await locationServiceProvider.getLocationsAsync();
 | 
			
		||||
 | 
			
		||||
                if (regions == null || !regions.Any() || locations == null || !locations.Any())
 | 
			
		||||
                    return null;
 | 
			
		||||
@ -525,27 +510,29 @@ namespace DamageAssesment.Api.Responses.Providers
 | 
			
		||||
        {
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                var employee = await employeeServiceProvider.getEmployeeAsync(surveyResponse.EmployeeId, token);
 | 
			
		||||
                var answers = await answerServiceProvider.GetAnswersByResponseIdAsync(surveyResponse.Id, token);
 | 
			
		||||
                var allQuestions = await questionServiceProvider.getQuestionsAsync(null, token);
 | 
			
		||||
                var employee = await employeeServiceProvider.getEmployeeAsync(surveyResponse.EmployeeId);
 | 
			
		||||
                var answers = await answerServiceProvider.GetAnswersByResponseIdAsync(surveyResponse.Id);
 | 
			
		||||
                var allQuestions = await questionServiceProvider.getQuestionsAsync(null);
 | 
			
		||||
                var questions = allQuestions.Where(s => s.SurveyId == surveyResponse.SurveyId);
 | 
			
		||||
                var attachments = await attachmentServiceProvider.getAttachmentsAsync(token);
 | 
			
		||||
 | 
			
		||||
                var result = new
 | 
			
		||||
                {
 | 
			
		||||
                var attachments = await attachmentServiceProvider.getAttachmentsAsync();
 | 
			
		||||
                var Locations = await locationServiceProvider.getLocationsAsync();
 | 
			
		||||
                var location = Locations.Where(a => a.Id == surveyResponse.LocationId).FirstOrDefault();
 | 
			
		||||
                var result = new{
 | 
			
		||||
                    surveyResponse.Id,
 | 
			
		||||
                    surveyResponse.SurveyId,
 | 
			
		||||
                    surveyResponse.LocationId,
 | 
			
		||||
                    surveyResponse.EmployeeId,
 | 
			
		||||
                    surveyResponse.ClientDevice,
 | 
			
		||||
                  //  surveyResponse.KeyAnswerResult,
 | 
			
		||||
                    surveyResponse.Longitute,
 | 
			
		||||
                    surveyResponse.Latitude,
 | 
			
		||||
                    surveyResponse.KeyAnswerResult,
 | 
			
		||||
                    DataValue=(location!=null?location.DataValue:0),
 | 
			
		||||
                    Enrollment= (location != null ? location.Enrollment : 0),
 | 
			
		||||
                    Longitute = (location != null ? location.Longitute : surveyResponse.Longitute),
 | 
			
		||||
                    Latitude=(location != null ? location.Latitude : surveyResponse.Latitude),
 | 
			
		||||
                    Employee = employee,
 | 
			
		||||
                    answers = from ans in answers
 | 
			
		||||
                              select new
 | 
			
		||||
                              {
 | 
			
		||||
                                //  ans.QuestionId,
 | 
			
		||||
                                  ans.QuestionId,
 | 
			
		||||
                                  ans.Id,
 | 
			
		||||
                                  ans.AnswerText,
 | 
			
		||||
                                  ans.Comment,
 | 
			
		||||
@ -574,52 +561,96 @@ namespace DamageAssesment.Api.Responses.Providers
 | 
			
		||||
                if (employeeid == 0)
 | 
			
		||||
                {
 | 
			
		||||
                    surveyResonses = await surveyResponseDbContext.SurveyResponses.Where(x => x.SurveyId == surveyId).ToListAsync();
 | 
			
		||||
                    employees = await employeeServiceProvider.getEmployeesAsync(token);
 | 
			
		||||
                    employees = await employeeServiceProvider.getEmployeesAsync();
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    surveyResonses = await surveyResponseDbContext.SurveyResponses.Where(x => x.SurveyId == surveyId && x.EmployeeId == employeeid).ToListAsync();
 | 
			
		||||
                    employee = await employeeServiceProvider.getEmployeeAsync(employeeid, token);
 | 
			
		||||
                    employee = await employeeServiceProvider.getEmployeeAsync(employeeid);
 | 
			
		||||
                }
 | 
			
		||||
                surveyResonses = surveyResonses
 | 
			
		||||
                .OrderByDescending(obj => obj.Id)
 | 
			
		||||
                .GroupBy(obj => new { obj.SurveyId, obj.LocationId })//obj.EmployeeId,
 | 
			
		||||
                .Select(group => group.FirstOrDefault())  // or .FirstOrDefault() if you want to handle empty groups
 | 
			
		||||
                .ToList();
 | 
			
		||||
 | 
			
		||||
                var answers = await answerServiceProvider.getAnswersAsync(token);
 | 
			
		||||
                var questions = await questionServiceProvider.getQuestionsAsync(null, token);
 | 
			
		||||
                var answers = await answerServiceProvider.getAnswersAsync();
 | 
			
		||||
                var questions = await questionServiceProvider.getQuestionsAsync(null);
 | 
			
		||||
                var Locations = await locationServiceProvider.getLocationsAsync();
 | 
			
		||||
                var surveyQuestions = from q in questions where q.SurveyId == surveyId select q;
 | 
			
		||||
 | 
			
		||||
                //var surveyQuestions = await questionServiceProvider.getSurveyQuestionsAsync(surveyId);
 | 
			
		||||
 | 
			
		||||
                var attachments = await attachmentServiceProvider.getAttachmentsAsync(token);
 | 
			
		||||
                var result = from r in surveyResonses
 | 
			
		||||
                             select new
 | 
			
		||||
                             {
 | 
			
		||||
                                 r.Id,
 | 
			
		||||
                                 r.SurveyId,
 | 
			
		||||
                                 r.LocationId,
 | 
			
		||||
                                 r.EmployeeId,
 | 
			
		||||
                                 r.ClientDevice,
 | 
			
		||||
                                // r.KeyAnswerResult,
 | 
			
		||||
                                 r.Longitute,
 | 
			
		||||
                                 r.Latitude,
 | 
			
		||||
                                // Employee = (from e in employees where e.Id == r.EmployeeId select new { e.Id, e.Name, e.BirthDate, e.Email, e.OfficePhoneNumber }).SingleOrDefault(),
 | 
			
		||||
                                 answers = from ans in answers
 | 
			
		||||
                                           where ans.SurveyResponseId == r.Id
 | 
			
		||||
                                           select new
 | 
			
		||||
                                           {
 | 
			
		||||
                                               ans.Id,
 | 
			
		||||
                                             //  ans.QuestionId,
 | 
			
		||||
                                               ans.AnswerText,
 | 
			
		||||
                                               ans.Comment,
 | 
			
		||||
                                               Questions = (from q in surveyQuestions where q.Id == ans.QuestionId select new { q.Id, q.QuestionNumber, q.CategoryId, q.Text }).SingleOrDefault(),
 | 
			
		||||
                                               Attachments = from att in attachments where att.AnswerId == ans.Id select new { att.Id, att.URI }
 | 
			
		||||
                var attachments = await attachmentServiceProvider.getAttachmentsAsync();
 | 
			
		||||
 | 
			
		||||
                                           }
 | 
			
		||||
                             };
 | 
			
		||||
                return result;
 | 
			
		||||
                if (employeeid == 0)
 | 
			
		||||
                {
 | 
			
		||||
                    var result = from r in surveyResonses
 | 
			
		||||
                                 join loc in Locations on r.LocationId equals loc.Id
 | 
			
		||||
                                 select new
 | 
			
		||||
                                 {
 | 
			
		||||
                                     r.Id,
 | 
			
		||||
                                     r.SurveyId,
 | 
			
		||||
                                     r.LocationId,
 | 
			
		||||
                                     r.EmployeeId,
 | 
			
		||||
                                     r.ClientDevice,
 | 
			
		||||
                                    // r.KeyAnswerResult,
 | 
			
		||||
                                     loc.DataValue,
 | 
			
		||||
                                     loc.Enrollment,
 | 
			
		||||
                                     loc.Longitute,
 | 
			
		||||
                                     loc.Latitude,
 | 
			
		||||
                                    // Employee = (from e in employees where e.Id == r.EmployeeId select new { e.Id, e.Name, e.BirthDate, e.Email, e.OfficePhoneNumber }).SingleOrDefault(),
 | 
			
		||||
                                     answers = from ans in answers
 | 
			
		||||
                                               where ans.SurveyResponseId == r.Id
 | 
			
		||||
                                               select new
 | 
			
		||||
                                               {
 | 
			
		||||
                                                   ans.Id,
 | 
			
		||||
                                                //   ans.QuestionId,
 | 
			
		||||
                                                   ans.AnswerText,
 | 
			
		||||
                                                   ans.Comment,
 | 
			
		||||
                                                   Questions = (from q in surveyQuestions where q.Id == ans.QuestionId select new { q.Id, q.QuestionNumber, q.CategoryId, q.Text }).SingleOrDefault(),
 | 
			
		||||
                                                   Attachments = from att in attachments where att.AnswerId == ans.Id select new { att.Id, att.URI }
 | 
			
		||||
 | 
			
		||||
                                               }
 | 
			
		||||
                                 };
 | 
			
		||||
                    return result;
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    object _employee = new { };
 | 
			
		||||
                    if (employee != null)
 | 
			
		||||
                    {
 | 
			
		||||
                        _employee = new { employee.Id, employee.Name, employee.BirthDate, employee.Email, employee.OfficePhoneNumber };
 | 
			
		||||
                    }
 | 
			
		||||
                    var result = from r in surveyResonses
 | 
			
		||||
                                 join loc in Locations on r.LocationId equals loc.Id
 | 
			
		||||
                                 select new
 | 
			
		||||
                                 {
 | 
			
		||||
                                     r.Id,
 | 
			
		||||
                                     r.SurveyId,
 | 
			
		||||
                                     r.LocationId,
 | 
			
		||||
                                     r.EmployeeId,
 | 
			
		||||
                                     r.ClientDevice,
 | 
			
		||||
                                   //  r.KeyAnswerResult,
 | 
			
		||||
                                     loc.DataValue,
 | 
			
		||||
                                     loc.Enrollment,
 | 
			
		||||
                                     loc.Longitute,
 | 
			
		||||
                                     loc.Latitude,
 | 
			
		||||
                                   //  Employee = _employee,
 | 
			
		||||
                                     answers = from ans in answers
 | 
			
		||||
                                               where ans.SurveyResponseId == r.Id
 | 
			
		||||
                                               select new
 | 
			
		||||
                                               {
 | 
			
		||||
                                                   ans.Id,
 | 
			
		||||
                                             //      ans.QuestionId,
 | 
			
		||||
                                                   ans.AnswerText,
 | 
			
		||||
                                                   ans.Comment,
 | 
			
		||||
                                                   Questions = (from q in questions where q.Id == ans.QuestionId select new { q.Id, q.QuestionNumber, q.CategoryId, q.Text }).SingleOrDefault(),
 | 
			
		||||
                                                   Attachments = from att in attachments where att.AnswerId == ans.Id select new { att.Id, att.URI }
 | 
			
		||||
                                               }
 | 
			
		||||
                                 };
 | 
			
		||||
 | 
			
		||||
                    return result;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            catch (Exception ex)
 | 
			
		||||
            {
 | 
			
		||||
@ -641,12 +672,12 @@ namespace DamageAssesment.Api.Responses.Providers
 | 
			
		||||
                if (employeeid == 0)
 | 
			
		||||
                {
 | 
			
		||||
                    surveyResonses = await surveyResponseDbContext.SurveyResponses.ToListAsync();
 | 
			
		||||
                    employees = await employeeServiceProvider.getEmployeesAsync(token);
 | 
			
		||||
                    employees = await employeeServiceProvider.getEmployeesAsync();
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    surveyResonses = await surveyResponseDbContext.SurveyResponses.Where(x => x.EmployeeId == employeeid).ToListAsync();
 | 
			
		||||
                    employee = await employeeServiceProvider.getEmployeeAsync(employeeid, token);
 | 
			
		||||
                    employee = await employeeServiceProvider.getEmployeeAsync(employeeid);
 | 
			
		||||
 | 
			
		||||
                    if (employee != null)
 | 
			
		||||
                    {
 | 
			
		||||
@ -654,16 +685,14 @@ namespace DamageAssesment.Api.Responses.Providers
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                surveyResonses = surveyResonses
 | 
			
		||||
                .OrderByDescending(obj => obj.Id)
 | 
			
		||||
                .GroupBy(obj => new { obj.SurveyId, obj.EmployeeId, obj.LocationId })
 | 
			
		||||
                .Select(group => group.FirstOrDefault())  // or .FirstOrDefault() if you want to handle empty groups
 | 
			
		||||
                .ToList();
 | 
			
		||||
                var answers = await answerServiceProvider.getAnswersAsync(token);
 | 
			
		||||
                var questions = await questionServiceProvider.getQuestionsAsync(null, token);
 | 
			
		||||
                var attachments = await attachmentServiceProvider.getAttachmentsAsync(token);
 | 
			
		||||
 | 
			
		||||
                var answers = await answerServiceProvider.getAnswersAsync();
 | 
			
		||||
                var questions = await questionServiceProvider.getQuestionsAsync(null);
 | 
			
		||||
                var attachments = await attachmentServiceProvider.getAttachmentsAsync();
 | 
			
		||||
 | 
			
		||||
                var Locations = await locationServiceProvider.getLocationsAsync();
 | 
			
		||||
                var result = from r in surveyResonses
 | 
			
		||||
                             join loc in Locations on r.LocationId equals loc.Id
 | 
			
		||||
                             select new
 | 
			
		||||
                             {
 | 
			
		||||
                                 r.Id,
 | 
			
		||||
@ -672,15 +701,17 @@ namespace DamageAssesment.Api.Responses.Providers
 | 
			
		||||
                                 r.EmployeeId,
 | 
			
		||||
                                 r.ClientDevice,
 | 
			
		||||
                               //  r.KeyAnswerResult,
 | 
			
		||||
                                 r.Longitute,
 | 
			
		||||
                                 r.Latitude,
 | 
			
		||||
                                // Employee = employeeid != 0 ? _employee : (from e in employees where r.EmployeeId == e.Id select new { e.Id, e.Name, e.BirthDate, e.Email, e.OfficePhoneNumber }).SingleOrDefault(),
 | 
			
		||||
                                 loc.DataValue,
 | 
			
		||||
                                 loc.Enrollment,
 | 
			
		||||
                                 loc.Longitute,
 | 
			
		||||
                                 loc.Latitude,
 | 
			
		||||
                               //  Employee = employeeid != 0 ? _employee : (from e in employees where r.EmployeeId == e.Id select new { e.Id, e.Name, e.BirthDate, e.Email, e.OfficePhoneNumber }).SingleOrDefault(),
 | 
			
		||||
                                 answers = from ans in answers
 | 
			
		||||
                                           where ans.SurveyResponseId == r.Id
 | 
			
		||||
                                           select new
 | 
			
		||||
                                           {
 | 
			
		||||
                                               ans.Id,
 | 
			
		||||
                                           //    ans.QuestionId,
 | 
			
		||||
                                         //      ans.QuestionId,
 | 
			
		||||
                                               ans.AnswerText,
 | 
			
		||||
                                               ans.Comment,
 | 
			
		||||
                                               Questions = (from q in questions where q.Id == ans.QuestionId select new { q.Id, q.QuestionNumber, q.CategoryId, q.Text }).SingleOrDefault(),
 | 
			
		||||
@ -688,6 +719,8 @@ namespace DamageAssesment.Api.Responses.Providers
 | 
			
		||||
                                           }
 | 
			
		||||
                             };
 | 
			
		||||
                return result;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            }
 | 
			
		||||
            catch (Exception ex)
 | 
			
		||||
            {
 | 
			
		||||
@ -703,12 +736,12 @@ namespace DamageAssesment.Api.Responses.Providers
 | 
			
		||||
                if (string.IsNullOrEmpty(language)) language = "en";
 | 
			
		||||
                List<Db.SurveyResponse> surveyResonses;
 | 
			
		||||
                surveyResonses = await surveyResponseDbContext.SurveyResponses.Where(a => a.SurveyId == surveyId).ToListAsync();
 | 
			
		||||
                var answers = await answerServiceProvider.getAnswersAsync(token);
 | 
			
		||||
                var Locations = await locationServiceProvider.getLocationsAsync(token);
 | 
			
		||||
                var regions = await regionServiceProvider.getRegionsAsync(token);
 | 
			
		||||
                var questions = await questionServiceProvider.getQuestionsAsync(language, token);
 | 
			
		||||
                var categories = await questionServiceProvider.GetQuestionCategoriesAsync(language, token);
 | 
			
		||||
                var attachments = await attachmentServiceProvider.getAttachmentsAsync(token);
 | 
			
		||||
                var answers = await answerServiceProvider.getAnswersAsync();
 | 
			
		||||
                var Locations = await locationServiceProvider.getLocationsAsync();
 | 
			
		||||
                var regions = await regionServiceProvider.getRegionsAsync();
 | 
			
		||||
                var questions = await questionServiceProvider.getQuestionsAsync(language);
 | 
			
		||||
                var categories = await questionServiceProvider.GetQuestionCategoriesAsync(language);
 | 
			
		||||
                var attachments = await attachmentServiceProvider.getAttachmentsAsync();
 | 
			
		||||
                List<object> questionLists = new List<object>();
 | 
			
		||||
                var allques = from res in surveyResonses
 | 
			
		||||
                              join loc in Locations on res.LocationId equals loc.Id
 | 
			
		||||
@ -840,8 +873,8 @@ namespace DamageAssesment.Api.Responses.Providers
 | 
			
		||||
                {
 | 
			
		||||
                    surveyResponses = await surveyResponseDbContext.SurveyResponses.Where(x => x.SurveyId == surveyId && x.EmployeeId == employeeid).ToListAsync();
 | 
			
		||||
                }
 | 
			
		||||
                var answers = await answerServiceProvider.getAnswersAsync(token);
 | 
			
		||||
                var locations = await locationServiceProvider.getLocationsAsync(token);
 | 
			
		||||
                var answers = await answerServiceProvider.getAnswersAsync();
 | 
			
		||||
                var locations = await locationServiceProvider.getLocationsAsync();
 | 
			
		||||
                var maintenanceCenters = locations.DistinctBy(m => m.MaintenanceCenter);
 | 
			
		||||
 | 
			
		||||
                //get all the answers for the particular survey
 | 
			
		||||
@ -907,12 +940,12 @@ namespace DamageAssesment.Api.Responses.Providers
 | 
			
		||||
                if (employeeid == 0)
 | 
			
		||||
                {
 | 
			
		||||
                    surveyResonses = await surveyResponseDbContext.SurveyResponses.Where(x => x.SurveyId == surveyId && x.LocationId == locationId).ToListAsync();
 | 
			
		||||
                    employees = await employeeServiceProvider.getEmployeesAsync(token);
 | 
			
		||||
                    employees = await employeeServiceProvider.getEmployeesAsync();
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    surveyResonses = await surveyResponseDbContext.SurveyResponses.Where(x => x.SurveyId == surveyId && x.EmployeeId == employeeid && x.LocationId == locationId).ToListAsync();
 | 
			
		||||
                    employee = await employeeServiceProvider.getEmployeeAsync(employeeid, token);
 | 
			
		||||
                    employee = await employeeServiceProvider.getEmployeeAsync(employeeid);
 | 
			
		||||
 | 
			
		||||
                    if (employee != null)
 | 
			
		||||
                    {
 | 
			
		||||
@ -924,12 +957,14 @@ namespace DamageAssesment.Api.Responses.Providers
 | 
			
		||||
                .GroupBy(obj => new { obj.SurveyId,  obj.LocationId }) //obj.EmployeeId,
 | 
			
		||||
                .Select(group => group.FirstOrDefault())  // or .FirstOrDefault() if you want to handle empty groups
 | 
			
		||||
                .ToList();
 | 
			
		||||
                var answers = await answerServiceProvider.getAnswersAsync(token);
 | 
			
		||||
                var questions = await questionServiceProvider.getQuestionsAsync(null, token);
 | 
			
		||||
                var answers = await answerServiceProvider.getAnswersAsync();
 | 
			
		||||
                var questions = await questionServiceProvider.getQuestionsAsync(null);
 | 
			
		||||
                var surveyQuestions = from q in questions where q.SurveyId == surveyId select q;
 | 
			
		||||
                var attachments = await attachmentServiceProvider.getAttachmentsAsync(token);
 | 
			
		||||
                var attachments = await attachmentServiceProvider.getAttachmentsAsync();
 | 
			
		||||
 | 
			
		||||
                var Locations = await locationServiceProvider.getLocationsAsync();
 | 
			
		||||
                var result = from r in surveyResonses
 | 
			
		||||
                             join loc in Locations on r.LocationId equals loc.Id
 | 
			
		||||
                             select new
 | 
			
		||||
                             {
 | 
			
		||||
                                 r.Id,
 | 
			
		||||
@ -938,9 +973,11 @@ namespace DamageAssesment.Api.Responses.Providers
 | 
			
		||||
                                 r.EmployeeId,
 | 
			
		||||
                                 r.ClientDevice,
 | 
			
		||||
                               //  r.KeyAnswerResult,
 | 
			
		||||
                                 r.Longitute,
 | 
			
		||||
                                 r.Latitude,
 | 
			
		||||
                               //  Employee = (from e in employees where r.EmployeeId == e.Id select new { e.Id, e.Name, e.BirthDate, e.Email, e.OfficePhoneNumber }).SingleOrDefault(),
 | 
			
		||||
                                 loc.DataValue,
 | 
			
		||||
                                 loc.Enrollment,
 | 
			
		||||
                                 loc.Longitute,
 | 
			
		||||
                                 loc.Latitude,
 | 
			
		||||
                               //  Employee = employeeid != 0 ? _employee : (from e in employees where r.EmployeeId == e.Id select new { e.Id, e.Name, e.BirthDate, e.Email, e.OfficePhoneNumber }).SingleOrDefault(),
 | 
			
		||||
                                 answers = from ans in answers
 | 
			
		||||
                                           where ans.SurveyResponseId == r.Id
 | 
			
		||||
 | 
			
		||||
@ -955,6 +992,7 @@ namespace DamageAssesment.Api.Responses.Providers
 | 
			
		||||
                                           }
 | 
			
		||||
                             };
 | 
			
		||||
                return result;
 | 
			
		||||
 | 
			
		||||
            }
 | 
			
		||||
            catch (Exception ex)
 | 
			
		||||
            {
 | 
			
		||||
@ -977,12 +1015,12 @@ namespace DamageAssesment.Api.Responses.Providers
 | 
			
		||||
                if (employeeid == 0)
 | 
			
		||||
                {
 | 
			
		||||
                    surveyResponses = await surveyResponseDbContext.SurveyResponses.Where(x => x.SurveyId == survey.Id).ToListAsync();
 | 
			
		||||
                    employees = await employeeServiceProvider.getEmployeesAsync(token);
 | 
			
		||||
                    employees = await employeeServiceProvider.getEmployeesAsync();
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    surveyResponses = await surveyResponseDbContext.SurveyResponses.Where(x => x.SurveyId == survey.Id && x.EmployeeId == employeeid).ToListAsync();
 | 
			
		||||
                    employee = await employeeServiceProvider.getEmployeeAsync(employeeid, token);
 | 
			
		||||
                    employee = await employeeServiceProvider.getEmployeeAsync(employeeid);
 | 
			
		||||
 | 
			
		||||
                    if (employee != null)
 | 
			
		||||
                    {
 | 
			
		||||
@ -996,10 +1034,11 @@ namespace DamageAssesment.Api.Responses.Providers
 | 
			
		||||
                .ToList();
 | 
			
		||||
                //var surveyResponses = await surveyResponseDbContext.Responses.Where(x => x.SurveyId == survey.Id).ToListAsync();
 | 
			
		||||
                // var employees = await employeeServiceProvider.getEmployeesAsync();
 | 
			
		||||
                var answers = await answerServiceProvider.getAnswersAsync(token);
 | 
			
		||||
                var attachments = await attachmentServiceProvider.getAttachmentsAsync(token);
 | 
			
		||||
 | 
			
		||||
                var answers = await answerServiceProvider.getAnswersAsync();
 | 
			
		||||
                var attachments = await attachmentServiceProvider.getAttachmentsAsync();
 | 
			
		||||
                var Locations = await locationServiceProvider.getLocationsAsync();
 | 
			
		||||
                var result = from r in surveyResponses
 | 
			
		||||
                             join loc in Locations on r.LocationId equals loc.Id
 | 
			
		||||
                             select new
 | 
			
		||||
                             {
 | 
			
		||||
                                 r.Id,
 | 
			
		||||
@ -1007,10 +1046,12 @@ namespace DamageAssesment.Api.Responses.Providers
 | 
			
		||||
                                 r.LocationId,
 | 
			
		||||
                                 r.EmployeeId,
 | 
			
		||||
                                 r.ClientDevice,
 | 
			
		||||
                                // r.KeyAnswerResult,
 | 
			
		||||
                                 r.Longitute,
 | 
			
		||||
                                 r.Latitude,
 | 
			
		||||
                               //  Employee = (from e in employees where r.EmployeeId == e.Id select new { e.Id, e.Name, e.BirthDate, e.Email, e.OfficePhoneNumber }).SingleOrDefault(),
 | 
			
		||||
                             //    r.KeyAnswerResult,
 | 
			
		||||
                                 loc.DataValue,
 | 
			
		||||
                                 loc.Enrollment,
 | 
			
		||||
                                 loc.Longitute,
 | 
			
		||||
                                 loc.Latitude,
 | 
			
		||||
                               //  Employee = employeeid != 0 ? _employee : (from e in employees where r.EmployeeId == e.Id select new { e.Id, e.Name, e.BirthDate, e.Email, e.OfficePhoneNumber }).SingleOrDefault(),
 | 
			
		||||
                                 answers = from ans in answers
 | 
			
		||||
                                           where ans.SurveyResponseId == r.Id
 | 
			
		||||
                                           && ans.QuestionId == question.Id
 | 
			
		||||
@ -1040,12 +1081,12 @@ namespace DamageAssesment.Api.Responses.Providers
 | 
			
		||||
        {
 | 
			
		||||
            if (answerRequest != null)
 | 
			
		||||
            {
 | 
			
		||||
                var answer = await answerServiceProvider.PostAnswersAsync(new Models.Answer { QuestionId = answerRequest.QuestionId, AnswerText = answerRequest.AnswerText, Comment = answerRequest.Comment, SurveyResponseId = surveyResponseId }, token);
 | 
			
		||||
                var answer = await answerServiceProvider.PostAnswersAsync(new Models.Answer { QuestionId = answerRequest.QuestionId, AnswerText = answerRequest.AnswerText, Comment = answerRequest.Comment, SurveyResponseId = surveyResponseId });
 | 
			
		||||
                if (answer != null)
 | 
			
		||||
                {
 | 
			
		||||
                    List<AnswerInfo> listAnswerInfo = new List<AnswerInfo>();
 | 
			
		||||
                    listAnswerInfo.Add(new AnswerInfo { AnswerId = answer.Id, postedFiles = answerRequest.PostedFiles });
 | 
			
		||||
                    var attachments = attachmentServiceProvider.PostAttachmentsAsync(new AttachmentInfo { ResponseId = surveyResponseId, Answers = listAnswerInfo }, token);
 | 
			
		||||
                    var attachments = attachmentServiceProvider.PostAttachmentsAsync(new AttachmentInfo { ResponseId = surveyResponseId, Answers = listAnswerInfo });
 | 
			
		||||
 | 
			
		||||
                    string message = $"Answer for question {answerRequest.QuestionId} saved to the database";
 | 
			
		||||
                    logger?.LogInformation(message);
 | 
			
		||||
@ -1066,6 +1107,7 @@ namespace DamageAssesment.Api.Responses.Providers
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        public async Task<(bool IsSuccess, Models.SurveyResponse SurveyResponse, string ErrorMessage)> PostSurveyAnswersAsync(Models.Request request)
 | 
			
		||||
        {
 | 
			
		||||
            try
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,5 @@
 | 
			
		||||
using DamageAssesment.Api.Responses.Interfaces;
 | 
			
		||||
using DamageAssesment.Api.Responses.Models;
 | 
			
		||||
using Microsoft.Extensions.Primitives;
 | 
			
		||||
using Newtonsoft.Json;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -11,11 +10,11 @@ namespace DamageAssesment.Api.Responses.Services
 | 
			
		||||
        public AnswerServiceProvider(IConfiguration configuration, IHttpUtil httpUtil, ILogger<AnswerServiceProvider> logger) : base(configuration, httpUtil, logger, configuration.GetValue<string>("RessourceSettings:Answer"), configuration.GetValue<string>("EndPointSettings:AnswerUrlBase"))
 | 
			
		||||
        {
 | 
			
		||||
        }
 | 
			
		||||
        public async Task<List<Answer>> getAnswersAsync(string token)
 | 
			
		||||
        public async Task<List<Answer>> getAnswersAsync()
 | 
			
		||||
        {
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null, token);
 | 
			
		||||
                var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null);
 | 
			
		||||
                var answers = JsonConvert.DeserializeObject<List<Answer>>(responseJsonString);
 | 
			
		||||
 | 
			
		||||
                if (answers == null || !answers.Any())
 | 
			
		||||
@ -29,12 +28,12 @@ namespace DamageAssesment.Api.Responses.Services
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public async Task<List<Answer>> GetAnswersByResponseIdAsync(int responseId, string token)
 | 
			
		||||
        public async Task<List<Answer>> GetAnswersByResponseIdAsync(int responseId)
 | 
			
		||||
        {
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                url = urlBase + string.Format(configuration.GetValue<string>("RessourceSettings:AnswerByResponse"), responseId);
 | 
			
		||||
                var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null,token);
 | 
			
		||||
                var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null);
 | 
			
		||||
                var answers = JsonConvert.DeserializeObject<List<Answer>>(responseJsonString);
 | 
			
		||||
 | 
			
		||||
                if (answers == null || !answers.Any())
 | 
			
		||||
@ -48,12 +47,12 @@ namespace DamageAssesment.Api.Responses.Services
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public async Task<Answer> PostAnswersAsync(Answer answer, string token )
 | 
			
		||||
        public async Task<Answer> PostAnswersAsync(Answer answer)
 | 
			
		||||
        {
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                var requestJsonString = JsonConvert.SerializeObject(answer);
 | 
			
		||||
                var responseJsonString = await httpUtil.SendAsync(HttpMethod.Post, url, requestJsonString, token);
 | 
			
		||||
                var responseJsonString = await httpUtil.SendAsync(HttpMethod.Post, url, requestJsonString);
 | 
			
		||||
                var answers = JsonConvert.DeserializeObject<Answer>(responseJsonString);
 | 
			
		||||
 | 
			
		||||
                if (answers == null)
 | 
			
		||||
 | 
			
		||||
@ -10,11 +10,11 @@ namespace DamageAssesment.Api.Responses.Services
 | 
			
		||||
        {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public async Task<List<Attachment>> getAttachmentsAsync(string token)
 | 
			
		||||
        public async Task<List<Attachment>> getAttachmentsAsync()
 | 
			
		||||
        {
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null,token);
 | 
			
		||||
                var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null);
 | 
			
		||||
                var attachments = JsonConvert.DeserializeObject<List<Attachment>>(responseJsonString);
 | 
			
		||||
 | 
			
		||||
                if (attachments == null || !attachments.Any())
 | 
			
		||||
@ -28,12 +28,12 @@ namespace DamageAssesment.Api.Responses.Services
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public async Task<IEnumerable<Attachment>> PostAttachmentsAsync(AttachmentInfo attachmentInfo, string token)
 | 
			
		||||
        public async Task<IEnumerable<Attachment>> PostAttachmentsAsync(AttachmentInfo attachmentInfo)
 | 
			
		||||
        {
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                var requestJsonString = JsonConvert.SerializeObject(attachmentInfo);
 | 
			
		||||
                var responseJsonString = await httpUtil.SendAsync(HttpMethod.Post, url, requestJsonString, token);
 | 
			
		||||
                var responseJsonString = await httpUtil.SendAsync(HttpMethod.Post, url, requestJsonString);
 | 
			
		||||
                var attachments = JsonConvert.DeserializeObject<IEnumerable<Attachment>>(responseJsonString);
 | 
			
		||||
 | 
			
		||||
                if (attachments == null)
 | 
			
		||||
 | 
			
		||||
@ -1,4 +1,4 @@
 | 
			
		||||
using DamageAssesment.Api.Responses.Interfaces;
 | 
			
		||||
using DamageAssesment.Api.Responses.Interfaces;
 | 
			
		||||
using DamageAssesment.Api.Responses.Models;
 | 
			
		||||
using Microsoft.AspNetCore.Mvc.Routing;
 | 
			
		||||
using Newtonsoft.Json;
 | 
			
		||||
@ -11,11 +11,11 @@ namespace DamageAssesment.Api.Responses.Services
 | 
			
		||||
        {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public async Task<List<Employee>> getEmployeesAsync(string token)
 | 
			
		||||
        public async Task<List<Employee>> getEmployeesAsync()
 | 
			
		||||
        {
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null,token);
 | 
			
		||||
                var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null);
 | 
			
		||||
                var employees = JsonConvert.DeserializeObject<List<Employee>>(responseJsonString);
 | 
			
		||||
 | 
			
		||||
                if (employees == null || !employees.Any())
 | 
			
		||||
@ -29,12 +29,12 @@ namespace DamageAssesment.Api.Responses.Services
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public async Task<Employee> getEmployeeAsync(int employeeId, string token)
 | 
			
		||||
        public async Task<Employee> getEmployeeAsync(int employeeId)
 | 
			
		||||
        {
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                url = urlBase + string.Format(configuration.GetValue<string>("RessourceSettings:EmployeeById"), employeeId); 
 | 
			
		||||
                var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null, token);
 | 
			
		||||
                var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null);
 | 
			
		||||
                var employee = JsonConvert.DeserializeObject<Employee>(responseJsonString);
 | 
			
		||||
 | 
			
		||||
                if (employee == null)
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,4 @@
 | 
			
		||||
using DamageAssesment.Api.Responses.Interfaces;
 | 
			
		||||
using DamageAssesment.Api.Responses.Models;
 | 
			
		||||
using DamageAssesment.Api.Responses.Interfaces;
 | 
			
		||||
using System.Net.Http.Headers;
 | 
			
		||||
using System.Text;
 | 
			
		||||
 | 
			
		||||
@ -15,18 +14,20 @@ namespace DamageAssesment.Api.Responses.Services
 | 
			
		||||
            this.httpClient = httpClient;
 | 
			
		||||
            this.logger = logger;
 | 
			
		||||
        }
 | 
			
		||||
        public async Task<string> SendAsync(HttpMethod method, string url, string JsonInput, string token)
 | 
			
		||||
        public async Task<string> SendAsync(HttpMethod method, string url, string JsonInput)
 | 
			
		||||
        {
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                var request = new HttpRequestMessage(method, url);
 | 
			
		||||
                request.Headers.Accept.Clear();
 | 
			
		||||
                request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
 | 
			
		||||
                request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
 | 
			
		||||
 | 
			
		||||
                //request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
 | 
			
		||||
                if (method == HttpMethod.Post)
 | 
			
		||||
                {
 | 
			
		||||
                    request.Content = new StringContent(JsonInput, Encoding.UTF8, "application/json");
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                var response = await httpClient.SendAsync(request, CancellationToken.None);
 | 
			
		||||
                response.EnsureSuccessStatusCode();
 | 
			
		||||
                var responseString = await response.Content.ReadAsStringAsync();
 | 
			
		||||
 | 
			
		||||
@ -10,11 +10,11 @@ namespace DamageAssesment.Api.Responses.Services
 | 
			
		||||
        {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public async Task<List<Location>> getLocationsAsync(string token)
 | 
			
		||||
        public async Task<List<Location>> getLocationsAsync()
 | 
			
		||||
        {
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null, token);
 | 
			
		||||
                var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null);
 | 
			
		||||
                var locations = JsonConvert.DeserializeObject<List<Location>>(responseJsonString);
 | 
			
		||||
 | 
			
		||||
                if (locations == null || !locations.Any())
 | 
			
		||||
 | 
			
		||||
@ -10,13 +10,13 @@ namespace DamageAssesment.Api.Responses.Services
 | 
			
		||||
        {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public async Task<List<Question>> getQuestionsAsync(string language, string token)
 | 
			
		||||
        public async Task<List<Question>> getQuestionsAsync(string language)
 | 
			
		||||
        {
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                if (!string.IsNullOrEmpty(language))
 | 
			
		||||
                    url = url + "/" + language;
 | 
			
		||||
                var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null, token);
 | 
			
		||||
                var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null);
 | 
			
		||||
                var questions = JsonConvert.DeserializeObject<List<Question>>(responseJsonString);
 | 
			
		||||
 | 
			
		||||
                if (questions == null || !questions.Any())
 | 
			
		||||
@ -29,15 +29,15 @@ namespace DamageAssesment.Api.Responses.Services
 | 
			
		||||
                return new List<Question>();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        public async Task<List<QuestionCategory>> GetQuestionCategoriesAsync(string? language, string token)
 | 
			
		||||
        public async Task<List<QuestionCategory>> GetQuestionCategoriesAsync(string? language)
 | 
			
		||||
        {
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                url = urlBase + configuration.GetValue<string>("RessourceSettings:QuestionCategory");
 | 
			
		||||
 | 
			
		||||
                
 | 
			
		||||
                if (!string.IsNullOrEmpty(language))
 | 
			
		||||
                    url = url + "/" + language;
 | 
			
		||||
                var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null, token);
 | 
			
		||||
                var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null);
 | 
			
		||||
                var questions = JsonConvert.DeserializeObject<List<QuestionCategory>>(responseJsonString);
 | 
			
		||||
 | 
			
		||||
                if (questions == null || !questions.Any())
 | 
			
		||||
@ -50,12 +50,13 @@ namespace DamageAssesment.Api.Responses.Services
 | 
			
		||||
                return new List<QuestionCategory>();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        public async Task<List<SurveyQuestions>> getSurveyQuestionsAsync(int surveyId, string token)
 | 
			
		||||
        
 | 
			
		||||
        public async Task<List<SurveyQuestions>> getSurveyQuestionsAsync(int surveyId)
 | 
			
		||||
        {
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                url = urlBase + string.Format(configuration.GetValue<string>("RessourceSettings:SurveyQuestion"), surveyId);
 | 
			
		||||
                var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null, token);
 | 
			
		||||
                var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null);
 | 
			
		||||
                var questions = JsonConvert.DeserializeObject<List<SurveyQuestions>>(responseJsonString);
 | 
			
		||||
 | 
			
		||||
                if (questions == null || !questions.Any())
 | 
			
		||||
@ -70,12 +71,12 @@ namespace DamageAssesment.Api.Responses.Services
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        public async Task<Question> getQuestionsAsync(int questionId, string token)
 | 
			
		||||
        public async Task<Question> getQuestionsAsync(int questionId)
 | 
			
		||||
        {
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                url = urlBase + string.Format(configuration.GetValue<string>("RessourceSettings:QuestionById"), questionId);
 | 
			
		||||
                var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null, token);
 | 
			
		||||
                var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null);
 | 
			
		||||
                var question = JsonConvert.DeserializeObject<Question>(responseJsonString);
 | 
			
		||||
 | 
			
		||||
                if (question == null)
 | 
			
		||||
 | 
			
		||||
@ -9,11 +9,11 @@ namespace DamageAssesment.Api.Responses.Services
 | 
			
		||||
        public RegionServiceProvider(IConfiguration configuration, IHttpUtil httpUtil, ILogger<RegionServiceProvider> logger) : base(configuration, httpUtil, logger, configuration.GetValue<string>("RessourceSettings:Region"), configuration.GetValue<string>("EndPointSettings:LocationUrlBase"))
 | 
			
		||||
        {
 | 
			
		||||
        }
 | 
			
		||||
        public async Task<List<Region>> getRegionsAsync(string token)
 | 
			
		||||
        public async Task<List<Region>> getRegionsAsync()
 | 
			
		||||
        {
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null, token);
 | 
			
		||||
                var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null);
 | 
			
		||||
                var regions = JsonConvert.DeserializeObject<List<Region>>(responseJsonString);
 | 
			
		||||
 | 
			
		||||
                if (regions == null || !regions.Any())
 | 
			
		||||
 | 
			
		||||
@ -4,19 +4,19 @@ using Newtonsoft.Json;
 | 
			
		||||
 | 
			
		||||
namespace DamageAssesment.Api.Responses.Services
 | 
			
		||||
{
 | 
			
		||||
    public class SurveyServiceProvider :ServiceProviderBase, ISurveyServiceProvider
 | 
			
		||||
    public class SurveyServiceProvider : ServiceProviderBase, ISurveyServiceProvider
 | 
			
		||||
    {
 | 
			
		||||
        public SurveyServiceProvider(IConfiguration configuration, IHttpUtil httpUtil, ILogger<EmployeeServiceProvider> logger) : base(configuration, httpUtil, logger, configuration.GetValue<string>("RessourceSettings:Survey"), configuration.GetValue<string>("EndPointSettings:SurveyUrlBase"))
 | 
			
		||||
        {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public async Task<List<Survey>> getSurveysAsync(string language, string token)
 | 
			
		||||
        public async Task<List<Survey>> getSurveysAsync(string language)
 | 
			
		||||
        {
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                if (!string.IsNullOrEmpty(language))
 | 
			
		||||
                    url = url + "/" + language;
 | 
			
		||||
                var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null, token);
 | 
			
		||||
                var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null);
 | 
			
		||||
                var surveys = JsonConvert.DeserializeObject<List<Survey>>(responseJsonString);
 | 
			
		||||
 | 
			
		||||
                if (surveys == null || !surveys.Any())
 | 
			
		||||
@ -30,15 +30,15 @@ namespace DamageAssesment.Api.Responses.Services
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public async Task<Survey> getSurveyAsync(int surveyId, string token)
 | 
			
		||||
        public async Task<Survey> getSurveyAsync(int surveyId)
 | 
			
		||||
        {
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                url = urlBase + string.Format(configuration.GetValue<string>("RessourceSettings:SurveyById"), surveyId);
 | 
			
		||||
                var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null, token);
 | 
			
		||||
                var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null);
 | 
			
		||||
                var survey = JsonConvert.DeserializeObject<Survey>(responseJsonString);
 | 
			
		||||
 | 
			
		||||
                if (survey == null )
 | 
			
		||||
                if (survey == null)
 | 
			
		||||
                    return null;
 | 
			
		||||
                else return survey;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
@ -6,13 +6,7 @@
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  "AllowedHosts": "*",
 | 
			
		||||
  "JwtSettings": {
 | 
			
		||||
    "securitykey": "bWlhbWkgZGFkZSBzY2hvb2xzIHNlY3JldCBrZXk="
 | 
			
		||||
  },
 | 
			
		||||
  "ConnectionStrings": {
 | 
			
		||||
    //"ResponsesConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;"
 | 
			
		||||
    "ResponsesConnection": "Server=207.180.248.35;Database=da_survey_dev;User Id=sa;Password=YourStrongPassw0rd;TrustServerCertificate=True;"
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  //"EndPointSettings": {
 | 
			
		||||
  //  "AnswerUrlBase": "http://localhost:5200",
 | 
			
		||||
  //  "LocationUrlBase": "http://localhost:5213",
 | 
			
		||||
@ -22,6 +16,7 @@
 | 
			
		||||
  //  "AttachmentUrlBase": "http://localhost:5243",
 | 
			
		||||
  //  "SurveyUrlBase": "http://localhost:5009"
 | 
			
		||||
  //},
 | 
			
		||||
  //Endpoints for docker-container  
 | 
			
		||||
  "EndPointSettings": {
 | 
			
		||||
    "AnswerUrlBase": "http://damageassesment.api.answers:80",
 | 
			
		||||
    "LocationUrlBase": "http://damageassesment.api.locations:80",
 | 
			
		||||
@ -45,5 +40,10 @@
 | 
			
		||||
    "AnswerByResponse": "/answers/byresponse/{0}",
 | 
			
		||||
    "Location": "/locations",
 | 
			
		||||
    "Region": "/regions"
 | 
			
		||||
  },
 | 
			
		||||
  "ConnectionStrings": {
 | 
			
		||||
    //"SurveyResponseConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;"
 | 
			
		||||
     //"ResponsesConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;"
 | 
			
		||||
    "ResponsesConnection": "Server=207.180.248.35;Database=da_survey_dev;User Id=sa;Password=YourStrongPassw0rd;TrustServerCertificate=True;"
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -0,0 +1,55 @@
 | 
			
		||||
// <auto-generated />
 | 
			
		||||
using DamageAssesment.Api.SurveyResponses.Db;
 | 
			
		||||
using Microsoft.EntityFrameworkCore;
 | 
			
		||||
using Microsoft.EntityFrameworkCore.Infrastructure;
 | 
			
		||||
using Microsoft.EntityFrameworkCore.Metadata;
 | 
			
		||||
using Microsoft.EntityFrameworkCore.Migrations;
 | 
			
		||||
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
 | 
			
		||||
 | 
			
		||||
#nullable disable
 | 
			
		||||
 | 
			
		||||
namespace DamageAssesment.Api.SurveyResponses.Migrations
 | 
			
		||||
{
 | 
			
		||||
    [DbContext(typeof(SurveyResponseDbContext))]
 | 
			
		||||
    [Migration("20230817221348_InitialSurveyResponse")]
 | 
			
		||||
    partial class InitialSurveyResponse
 | 
			
		||||
    {
 | 
			
		||||
        /// <inheritdoc />
 | 
			
		||||
        protected override void BuildTargetModel(ModelBuilder modelBuilder)
 | 
			
		||||
        {
 | 
			
		||||
#pragma warning disable 612, 618
 | 
			
		||||
            modelBuilder
 | 
			
		||||
                .HasAnnotation("ProductVersion", "7.0.9")
 | 
			
		||||
                .HasAnnotation("Relational:MaxIdentifierLength", 128);
 | 
			
		||||
 | 
			
		||||
            SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
 | 
			
		||||
 | 
			
		||||
            modelBuilder.Entity("DamageAssesment.Api.SurveyResponses.Db.SurveyResponse", b =>
 | 
			
		||||
                {
 | 
			
		||||
                    b.Property<int>("Id")
 | 
			
		||||
                        .ValueGeneratedOnAdd()
 | 
			
		||||
                        .HasColumnType("int");
 | 
			
		||||
 | 
			
		||||
                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
 | 
			
		||||
 | 
			
		||||
                    b.Property<string>("EmployeeId")
 | 
			
		||||
                        .IsRequired()
 | 
			
		||||
                        .HasMaxLength(6)
 | 
			
		||||
                        .HasColumnType("nvarchar(6)");
 | 
			
		||||
 | 
			
		||||
                    b.Property<string>("LocationId")
 | 
			
		||||
                        .IsRequired()
 | 
			
		||||
                        .HasMaxLength(4)
 | 
			
		||||
                        .HasColumnType("nvarchar(4)");
 | 
			
		||||
 | 
			
		||||
                    b.Property<int>("SurveyId")
 | 
			
		||||
                        .HasColumnType("int");
 | 
			
		||||
 | 
			
		||||
                    b.HasKey("Id");
 | 
			
		||||
 | 
			
		||||
                    b.ToTable("SurveyResponses");
 | 
			
		||||
                });
 | 
			
		||||
#pragma warning restore 612, 618
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,36 @@
 | 
			
		||||
using Microsoft.EntityFrameworkCore.Migrations;
 | 
			
		||||
 | 
			
		||||
#nullable disable
 | 
			
		||||
 | 
			
		||||
namespace DamageAssesment.Api.SurveyResponses.Migrations
 | 
			
		||||
{
 | 
			
		||||
    /// <inheritdoc />
 | 
			
		||||
    public partial class InitialSurveyResponse : Migration
 | 
			
		||||
    {
 | 
			
		||||
        /// <inheritdoc />
 | 
			
		||||
        protected override void Up(MigrationBuilder migrationBuilder)
 | 
			
		||||
        {
 | 
			
		||||
            migrationBuilder.CreateTable(
 | 
			
		||||
                name: "SurveyResponses",
 | 
			
		||||
                columns: table => new
 | 
			
		||||
                {
 | 
			
		||||
                    Id = table.Column<int>(type: "int", nullable: false)
 | 
			
		||||
                        .Annotation("SqlServer:Identity", "1, 1"),
 | 
			
		||||
                    SurveyId = table.Column<int>(type: "int", nullable: false),
 | 
			
		||||
                    LocationId = table.Column<string>(type: "nvarchar(4)", maxLength: 4, nullable: false),
 | 
			
		||||
                    EmployeeId = table.Column<string>(type: "nvarchar(6)", maxLength: 6, nullable: false)
 | 
			
		||||
                },
 | 
			
		||||
                constraints: table =>
 | 
			
		||||
                {
 | 
			
		||||
                    table.PrimaryKey("PK_SurveyResponses", x => x.Id);
 | 
			
		||||
                });
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <inheritdoc />
 | 
			
		||||
        protected override void Down(MigrationBuilder migrationBuilder)
 | 
			
		||||
        {
 | 
			
		||||
            migrationBuilder.DropTable(
 | 
			
		||||
                name: "SurveyResponses");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,52 @@
 | 
			
		||||
// <auto-generated />
 | 
			
		||||
using DamageAssesment.Api.SurveyResponses.Db;
 | 
			
		||||
using Microsoft.EntityFrameworkCore;
 | 
			
		||||
using Microsoft.EntityFrameworkCore.Infrastructure;
 | 
			
		||||
using Microsoft.EntityFrameworkCore.Metadata;
 | 
			
		||||
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
 | 
			
		||||
 | 
			
		||||
#nullable disable
 | 
			
		||||
 | 
			
		||||
namespace DamageAssesment.Api.SurveyResponses.Migrations
 | 
			
		||||
{
 | 
			
		||||
    [DbContext(typeof(SurveyResponseDbContext))]
 | 
			
		||||
    partial class SurveyResponseDbContextModelSnapshot : ModelSnapshot
 | 
			
		||||
    {
 | 
			
		||||
        protected override void BuildModel(ModelBuilder modelBuilder)
 | 
			
		||||
        {
 | 
			
		||||
#pragma warning disable 612, 618
 | 
			
		||||
            modelBuilder
 | 
			
		||||
                .HasAnnotation("ProductVersion", "7.0.9")
 | 
			
		||||
                .HasAnnotation("Relational:MaxIdentifierLength", 128);
 | 
			
		||||
 | 
			
		||||
            SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
 | 
			
		||||
 | 
			
		||||
            modelBuilder.Entity("DamageAssesment.Api.SurveyResponses.Db.SurveyResponse", b =>
 | 
			
		||||
                {
 | 
			
		||||
                    b.Property<int>("Id")
 | 
			
		||||
                        .ValueGeneratedOnAdd()
 | 
			
		||||
                        .HasColumnType("int");
 | 
			
		||||
 | 
			
		||||
                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
 | 
			
		||||
 | 
			
		||||
                    b.Property<string>("EmployeeId")
 | 
			
		||||
                        .IsRequired()
 | 
			
		||||
                        .HasMaxLength(6)
 | 
			
		||||
                        .HasColumnType("nvarchar(6)");
 | 
			
		||||
 | 
			
		||||
                    b.Property<string>("LocationId")
 | 
			
		||||
                        .IsRequired()
 | 
			
		||||
                        .HasMaxLength(4)
 | 
			
		||||
                        .HasColumnType("nvarchar(4)");
 | 
			
		||||
 | 
			
		||||
                    b.Property<int>("SurveyId")
 | 
			
		||||
                        .HasColumnType("int");
 | 
			
		||||
 | 
			
		||||
                    b.HasKey("Id");
 | 
			
		||||
 | 
			
		||||
                    b.ToTable("SurveyResponses");
 | 
			
		||||
                });
 | 
			
		||||
#pragma warning restore 612, 618
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -1,5 +1,4 @@
 | 
			
		||||
using DamageAssesment.Api.Surveys.Interfaces;
 | 
			
		||||
using Microsoft.AspNetCore.Authorization;
 | 
			
		||||
using Microsoft.AspNetCore.Mvc;
 | 
			
		||||
 | 
			
		||||
namespace DamageAssesment.Api.Surveys.Controllers
 | 
			
		||||
@ -16,7 +15,6 @@ namespace DamageAssesment.Api.Surveys.Controllers
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// GET request for retrieving surveys.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        [Authorize(Roles ="admin,survey,user,report")]
 | 
			
		||||
        [Route("surveys")]
 | 
			
		||||
        [Route("surveys/{language:alpha}")]
 | 
			
		||||
        [HttpGet]
 | 
			
		||||
@ -32,7 +30,6 @@ namespace DamageAssesment.Api.Surveys.Controllers
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// GET request for retrieving all active surveys.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        [Authorize(Roles = "admin,survey,user,report")]
 | 
			
		||||
        [Route("surveys/active")]
 | 
			
		||||
        [Route("surveys/active/{language:alpha}")]
 | 
			
		||||
        [HttpGet]
 | 
			
		||||
@ -48,7 +45,6 @@ namespace DamageAssesment.Api.Surveys.Controllers
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// GET request for retrieving all inactive surveys.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        [Authorize(Roles = "admin,survey,user,report")]
 | 
			
		||||
        [Route("surveys/inactive")]
 | 
			
		||||
        [Route("surveys/inactive/{language:alpha}")]
 | 
			
		||||
        [HttpGet]
 | 
			
		||||
@ -64,7 +60,6 @@ namespace DamageAssesment.Api.Surveys.Controllers
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// GET request for retrieving surveys by ID.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        [Authorize(Roles = "admin,survey,user,report")]
 | 
			
		||||
        [Route("surveys/{id:int}")]
 | 
			
		||||
        [Route("surveys/{id:int}/{language:alpha}")]
 | 
			
		||||
        [HttpGet]
 | 
			
		||||
@ -80,7 +75,6 @@ namespace DamageAssesment.Api.Surveys.Controllers
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// POST request for creating a new survey.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        [Authorize(Roles = "admin,survey,user,report")]
 | 
			
		||||
        [HttpPost("surveys")]
 | 
			
		||||
        public async Task<ActionResult> PostSurveysAsync(Models.Survey survey)
 | 
			
		||||
        {
 | 
			
		||||
@ -94,8 +88,6 @@ namespace DamageAssesment.Api.Surveys.Controllers
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// PUT request for updating an existing survey (surveyId,Updated Survey data).
 | 
			
		||||
        /// </summary>
 | 
			
		||||
 | 
			
		||||
        [Authorize(Roles = "admin,survey")]
 | 
			
		||||
        [HttpPut("surveys/{id}")]
 | 
			
		||||
        public async Task<ActionResult> PutSurveysAsync(int id, Models.Survey survey)
 | 
			
		||||
        {
 | 
			
		||||
@ -113,7 +105,6 @@ namespace DamageAssesment.Api.Surveys.Controllers
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// DELETE request for deleting a survey by ID.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        [Authorize(Roles = "admin,survey")]
 | 
			
		||||
        [HttpDelete("surveys/{id}")]
 | 
			
		||||
        public async Task<ActionResult> DeleteSurveysAsync(int id)
 | 
			
		||||
        {
 | 
			
		||||
 | 
			
		||||
@ -6,14 +6,15 @@ using Microsoft.EntityFrameworkCore;
 | 
			
		||||
using Microsoft.IdentityModel.Tokens;
 | 
			
		||||
using System.Text;
 | 
			
		||||
using System.Reflection;
 | 
			
		||||
using Microsoft.OpenApi.Models;
 | 
			
		||||
 | 
			
		||||
var builder = WebApplication.CreateBuilder(args);
 | 
			
		||||
builder.Services.AddCors(p => p.AddPolicy("DamageAppCorsPolicy", build => {
 | 
			
		||||
    build.WithOrigins("*").AllowAnyMethod().AllowAnyHeader().AllowAnyOrigin();
 | 
			
		||||
}));
 | 
			
		||||
 | 
			
		||||
// Add services to the container.
 | 
			
		||||
 | 
			
		||||
// Retrieve the security key for JWT token validation.
 | 
			
		||||
var authkey = builder.Configuration.GetValue<string>("JwtSettings:securitykey");
 | 
			
		||||
 | 
			
		||||
// Configure JWT authentication and validation.
 | 
			
		||||
builder.Services.AddAuthentication(item =>
 | 
			
		||||
{
 | 
			
		||||
    item.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
 | 
			
		||||
@ -32,53 +33,35 @@ builder.Services.AddAuthentication(item =>
 | 
			
		||||
    };
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
//CORS setup to allow requests from any origin.
 | 
			
		||||
builder.Services.AddCors(p => p.AddPolicy("DamageAppCorsPolicy", build => {
 | 
			
		||||
    build.WithOrigins("*").AllowAnyMethod().AllowAnyHeader().AllowAnyOrigin();
 | 
			
		||||
}));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// Add controller services and API Explorer for endpoint discovery.
 | 
			
		||||
builder.Services.AddControllers();
 | 
			
		||||
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
 | 
			
		||||
builder.Services.AddScoped<ISurveyProvider, SurveysProvider>();
 | 
			
		||||
builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());
 | 
			
		||||
builder.Services.AddEndpointsApiExplorer();
 | 
			
		||||
 | 
			
		||||
builder.Services.AddSwaggerGen(options =>
 | 
			
		||||
// Add Swagger/OpenAPI documentation support.
 | 
			
		||||
builder.Services.AddSwaggerGen(c =>
 | 
			
		||||
{
 | 
			
		||||
    // Include XML comments from your assembly
 | 
			
		||||
    var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
 | 
			
		||||
    var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
 | 
			
		||||
    options.IncludeXmlComments(xmlPath);
 | 
			
		||||
 | 
			
		||||
    OpenApiSecurityScheme securityDefinition = new OpenApiSecurityScheme()
 | 
			
		||||
    {
 | 
			
		||||
        Name = "Bearer",
 | 
			
		||||
        BearerFormat = "JWT",
 | 
			
		||||
        Scheme = "bearer",
 | 
			
		||||
        Description = "Specify the authorization token.",
 | 
			
		||||
        In = ParameterLocation.Header,
 | 
			
		||||
        Type = SecuritySchemeType.Http,
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    options.AddSecurityDefinition("jwt_auth", securityDefinition);
 | 
			
		||||
 | 
			
		||||
    // Make sure swagger UI requires a Bearer token specified
 | 
			
		||||
    OpenApiSecurityScheme securityScheme = new OpenApiSecurityScheme()
 | 
			
		||||
    {
 | 
			
		||||
        Reference = new OpenApiReference()
 | 
			
		||||
        {
 | 
			
		||||
            Id = "jwt_auth",
 | 
			
		||||
            Type = ReferenceType.SecurityScheme
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    OpenApiSecurityRequirement securityRequirements = new OpenApiSecurityRequirement()
 | 
			
		||||
    {
 | 
			
		||||
        {securityScheme, new string[] { }},
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    options.AddSecurityRequirement(securityRequirements);
 | 
			
		||||
    c.IncludeXmlComments(xmlPath);
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
// Configure the database context for SurveysDbContext using SQL Server.
 | 
			
		||||
builder.Services.AddDbContext<SurveysDbContext>(option =>
 | 
			
		||||
{
 | 
			
		||||
    option.UseSqlServer("SurveyConnection");
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
var app = builder.Build();
 | 
			
		||||
 | 
			
		||||
// Configure the HTTP request pipeline.
 | 
			
		||||
@ -86,7 +69,7 @@ if (app.Environment.IsDevelopment())
 | 
			
		||||
{
 | 
			
		||||
    app.UseSwagger();
 | 
			
		||||
    app.UseSwaggerUI();
 | 
			
		||||
 | 
			
		||||
    // Seed initial data in the database when in development mode
 | 
			
		||||
    using (var serviceScope = app.Services.CreateScope())
 | 
			
		||||
    {
 | 
			
		||||
        var services = serviceScope.ServiceProvider;
 | 
			
		||||
@ -94,11 +77,11 @@ if (app.Environment.IsDevelopment())
 | 
			
		||||
        surveyProvider.seedData();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Enable CORS, authentication, and authorization middleware.
 | 
			
		||||
app.UseCors("DamageAppCorsPolicy");
 | 
			
		||||
app.UseAuthentication();
 | 
			
		||||
app.UseAuthorization();
 | 
			
		||||
 | 
			
		||||
// Map controllers to their respective routes.
 | 
			
		||||
app.MapControllers();
 | 
			
		||||
 | 
			
		||||
app.Run();
 | 
			
		||||
 | 
			
		||||
@ -147,6 +147,7 @@ namespace DamageAssesment.Api.Surveys.Providers
 | 
			
		||||
                logger?.LogInformation("Get all Surveys from DB");
 | 
			
		||||
                //checking is enabled in survey response 
 | 
			
		||||
                var surveys = await surveyDbContext.Surveys.ToListAsync();//Where(s => s.IsEnabled == true)
 | 
			
		||||
 | 
			
		||||
                if (surveys != null)
 | 
			
		||||
                {
 | 
			
		||||
                    surveysList = from s in surveys
 | 
			
		||||
 | 
			
		||||
@ -11,7 +11,7 @@
 | 
			
		||||
  "AllowedHosts": "*",
 | 
			
		||||
  "ConnectionStrings": {
 | 
			
		||||
    //"SurveyConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;"
 | 
			
		||||
    //"SurveyConnection": "Server=localhost,1433;Database=da_survey_dev;User Id=sa;Password=Password123;TrustServerCertificate=True;",
 | 
			
		||||
    "SurveyConnection": "Server=207.180.248.35;Database=da_survey_dev;User Id=sa;Password=YourStrongPassw0rd;TrustServerCertificate=True;"
 | 
			
		||||
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1,30 +0,0 @@
 | 
			
		||||
<Project Sdk="Microsoft.NET.Sdk">
 | 
			
		||||
 | 
			
		||||
  <PropertyGroup>
 | 
			
		||||
    <TargetFramework>net6.0</TargetFramework>
 | 
			
		||||
    <ImplicitUsings>enable</ImplicitUsings>
 | 
			
		||||
    <Nullable>enable</Nullable>
 | 
			
		||||
 | 
			
		||||
    <IsPackable>false</IsPackable>
 | 
			
		||||
    <IsTestProject>true</IsTestProject>
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.3.2" />
 | 
			
		||||
    <PackageReference Include="Moq" Version="4.18.4" />
 | 
			
		||||
    <PackageReference Include="xunit" Version="2.4.2" />
 | 
			
		||||
    <PackageReference Include="xunit.runner.visualstudio" Version="2.4.5">
 | 
			
		||||
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
 | 
			
		||||
      <PrivateAssets>all</PrivateAssets>
 | 
			
		||||
    </PackageReference>
 | 
			
		||||
    <PackageReference Include="coverlet.collector" Version="3.1.2">
 | 
			
		||||
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
 | 
			
		||||
      <PrivateAssets>all</PrivateAssets>
 | 
			
		||||
    </PackageReference>
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <ProjectReference Include="..\DamageAssesment.Api.UsersAccess\DamageAssesment.Api.UsersAccess.csproj" />
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
 | 
			
		||||
</Project>
 | 
			
		||||
@ -1,44 +0,0 @@
 | 
			
		||||
using DamageAssesment.Api.UsersAccess.Models;
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Text;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
using Xunit.Sdk;
 | 
			
		||||
 | 
			
		||||
namespace DamageAssesment.Api.UsersAccess.Test
 | 
			
		||||
{
 | 
			
		||||
    public class MockData
 | 
			
		||||
    {
 | 
			
		||||
        public static async Task<(bool, Models.TokenResponse, string)> getTokenResponse(bool status, string message)
 | 
			
		||||
        {
 | 
			
		||||
            return (status, new Models.TokenResponse { jwttoken = "1234", refreshtoken = "12345" }, message);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static async Task<(bool, List<User>, string)> getUsers(bool status, string message)
 | 
			
		||||
        {
 | 
			
		||||
            List<User> users = new List<User>();
 | 
			
		||||
            users.Add(new User { Id = 1, EmployeeCode = "Emp1", EmployeeId = 1, RoleId = 1, IsActive = true, CreateDate = DateTime.Now });
 | 
			
		||||
            users.Add(new User { Id = 2, EmployeeCode = "Emp2", EmployeeId = 2, RoleId = 1, IsActive = true, CreateDate = DateTime.Now });
 | 
			
		||||
            users.Add(new User { Id = 3, EmployeeCode = "Emp3", EmployeeId = 3, RoleId = 1, IsActive = true, CreateDate = DateTime.Now });
 | 
			
		||||
            return (status, users, message);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static async Task<(bool, User, string)> getUser(bool status, string message)
 | 
			
		||||
        {
 | 
			
		||||
            User user = getUsers(status, message).Result.Item2.FirstOrDefault();
 | 
			
		||||
            return (status, user, message);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static async Task<(bool, List<Role>, string)> getRoles(bool status, string message)
 | 
			
		||||
        {
 | 
			
		||||
            List<Role> roles = new List<Role>();
 | 
			
		||||
            roles.Add(new Role { Id = 1, Name = "Role 1" });
 | 
			
		||||
            roles.Add(new Role { Id = 2, Name = "Role 2" });
 | 
			
		||||
            roles.Add(new Role { Id = 3, Name = "Role 3" });
 | 
			
		||||
 | 
			
		||||
            return (status, roles, message);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -1,194 +0,0 @@
 | 
			
		||||
using DamageAssesment.Api.UsersAccess.Controllers;
 | 
			
		||||
using DamageAssesment.Api.UsersAccess.Interfaces;
 | 
			
		||||
using Microsoft.AspNetCore.Mvc;
 | 
			
		||||
using Moq;
 | 
			
		||||
using Xunit;
 | 
			
		||||
 | 
			
		||||
namespace DamageAssesment.Api.UsersAccess.Test
 | 
			
		||||
{
 | 
			
		||||
    public class UsersAccessTest
 | 
			
		||||
    {
 | 
			
		||||
        private Mock<IUsersAccessProvider> mockService;
 | 
			
		||||
 | 
			
		||||
        public UsersAccessTest()
 | 
			
		||||
        {
 | 
			
		||||
            mockService = new Mock<IUsersAccessProvider>();
 | 
			
		||||
        }
 | 
			
		||||
        [Fact(DisplayName = "Get Token - Ok case")]
 | 
			
		||||
        public async Task GetTokenAsync_ShouldReturnStatusCode200()
 | 
			
		||||
        {
 | 
			
		||||
            var response = await MockData.getTokenResponse(true,null);
 | 
			
		||||
            mockService.Setup(service => service.AuthenticateAsync()).ReturnsAsync(response);
 | 
			
		||||
            var controller = new UsersAccessController(mockService.Object);
 | 
			
		||||
            var result = (OkObjectResult)await controller.AuthenticateAsync();
 | 
			
		||||
            Assert.Equal(200, result.StatusCode);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact(DisplayName = "Get Token - Unauthorized case")]
 | 
			
		||||
        public async Task GetTokenAsync_ShouldReturnStatusCode401()
 | 
			
		||||
        {
 | 
			
		||||
            var response = await MockData.getTokenResponse(false, null);
 | 
			
		||||
            mockService.Setup(service => service.AuthenticateAsync()).ReturnsAsync(response);
 | 
			
		||||
            var controller = new UsersAccessController(mockService.Object);
 | 
			
		||||
            var result = (UnauthorizedObjectResult)await controller.AuthenticateAsync();
 | 
			
		||||
            Assert.Equal(401, result.StatusCode);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        [Fact(DisplayName = "RefreshToken - Ok case")]
 | 
			
		||||
        public async Task RefreshTokenAsync_ShouldReturnStatusCode200()
 | 
			
		||||
        {
 | 
			
		||||
            var response = await MockData.getTokenResponse(true, null);
 | 
			
		||||
            mockService.Setup(service => service.RefreshTokenAsync(null)).ReturnsAsync(response);
 | 
			
		||||
            var controller = new UsersAccessController(mockService.Object);
 | 
			
		||||
            var result = (OkObjectResult)await controller.RefreshTokenAsync(null);
 | 
			
		||||
            Assert.Equal(200, result.StatusCode);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact(DisplayName = "RefreshToken - Unauthorized case")]
 | 
			
		||||
        public async Task RefreshTokenAsync_ShouldReturnStatusCode401()
 | 
			
		||||
        {
 | 
			
		||||
            var response = await MockData.getTokenResponse(false, null);
 | 
			
		||||
            mockService.Setup(service => service.RefreshTokenAsync(null)).ReturnsAsync(response);
 | 
			
		||||
            var controller = new UsersAccessController(mockService.Object);
 | 
			
		||||
            var result = (UnauthorizedObjectResult)await controller.RefreshTokenAsync(null);
 | 
			
		||||
            Assert.Equal(401, result.StatusCode);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact(DisplayName = "GetUsers - Ok case")]
 | 
			
		||||
        public async Task GetUsersAsync_ShouldReturnStatusCode200()
 | 
			
		||||
        {
 | 
			
		||||
            var response = await MockData.getUsers(true, null);
 | 
			
		||||
            mockService.Setup(service => service.GetUsersAsync()).ReturnsAsync(response);
 | 
			
		||||
            var controller = new UsersAccessController(mockService.Object);
 | 
			
		||||
            var result = (OkObjectResult)await controller.GetUsersAsync();
 | 
			
		||||
            Assert.Equal(200, result.StatusCode);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact(DisplayName = "GetUsers - NoContent case")]
 | 
			
		||||
        public async Task GetUsersAsync_ShouldReturnStatusCode204()
 | 
			
		||||
        {
 | 
			
		||||
            var response = await MockData.getUsers(false, null);
 | 
			
		||||
            mockService.Setup(service => service.GetUsersAsync()).ReturnsAsync(response);
 | 
			
		||||
            var controller = new UsersAccessController(mockService.Object);
 | 
			
		||||
            var result = (NoContentResult)await controller.GetUsersAsync();
 | 
			
		||||
            Assert.Equal(204, result.StatusCode);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact(DisplayName = "GetUser - Ok case")]
 | 
			
		||||
        public async Task GetUserAsync_ShouldReturnStatusCode200()
 | 
			
		||||
        {
 | 
			
		||||
            var response = await MockData.getUser(true, null);
 | 
			
		||||
            mockService.Setup(service => service.GetUsersAsync(1)).ReturnsAsync(response);
 | 
			
		||||
            var controller = new UsersAccessController(mockService.Object);
 | 
			
		||||
            var result = (OkObjectResult)await controller.GetUsersAsync(1);
 | 
			
		||||
            Assert.Equal(200, result.StatusCode);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact(DisplayName = "GetUser - NotFound case")]
 | 
			
		||||
        public async Task GetUserAsync_ShouldReturnStatusCode204()
 | 
			
		||||
        {
 | 
			
		||||
            var response = await MockData.getUser(false, null);
 | 
			
		||||
            mockService.Setup(service => service.GetUsersAsync(1)).ReturnsAsync(response);
 | 
			
		||||
            var controller = new UsersAccessController(mockService.Object);
 | 
			
		||||
            var result = (NotFoundResult)await controller.GetUsersAsync(1);
 | 
			
		||||
            Assert.Equal(404, result.StatusCode);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact(DisplayName = "GetRoles - Ok case")]
 | 
			
		||||
        public async Task GetRolesAsync_ShouldReturnStatusCode200()
 | 
			
		||||
        {
 | 
			
		||||
            var response = await MockData.getRoles(true, null);
 | 
			
		||||
            mockService.Setup(service => service.GetRolesAsync()).ReturnsAsync(response);
 | 
			
		||||
            var controller = new UsersAccessController(mockService.Object);
 | 
			
		||||
            var result = (OkObjectResult)await controller.GetRolesAsync();
 | 
			
		||||
            Assert.Equal(200, result.StatusCode);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact(DisplayName = "GetRoles - NoContent case")]
 | 
			
		||||
        public async Task GetRolesAsync_ShouldReturnStatusCode204()
 | 
			
		||||
        {
 | 
			
		||||
            var response = await MockData.getRoles(false, null);
 | 
			
		||||
            mockService.Setup(service => service.GetRolesAsync()).ReturnsAsync(response);
 | 
			
		||||
            var controller = new UsersAccessController(mockService.Object);
 | 
			
		||||
            var result = (NoContentResult)await controller.GetRolesAsync();
 | 
			
		||||
            Assert.Equal(204, result.StatusCode);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact(DisplayName = "PostUser - Ok case")]
 | 
			
		||||
        public async Task PostUserAsync_ShouldReturnStatusCode200()
 | 
			
		||||
        {
 | 
			
		||||
            var response = await MockData.getUser(true, null);
 | 
			
		||||
            var user = new Models.User { Id = 1, EmployeeCode = "Emp1", EmployeeId = 1, RoleId = 1, IsActive = true, CreateDate = DateTime.Now };
 | 
			
		||||
            mockService.Setup(service => service.PostUserAsync(user)).ReturnsAsync(response);
 | 
			
		||||
            var controller = new UsersAccessController(mockService.Object);
 | 
			
		||||
            var result = (OkObjectResult)await controller.PostUserAsync(user);
 | 
			
		||||
            Assert.Equal(200, result.StatusCode);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact(DisplayName = "PostUser - Bad Request case")]
 | 
			
		||||
        public async Task PostUserAsync_ShouldReturnStatusCode400()
 | 
			
		||||
        {
 | 
			
		||||
            var response = await MockData.getUser(false, null);
 | 
			
		||||
            var user = new Models.User { Id = 1, EmployeeCode = "Emp1", EmployeeId = 1, RoleId = 1, IsActive = true, CreateDate = DateTime.Now };
 | 
			
		||||
            mockService.Setup(service => service.PostUserAsync(user)).ReturnsAsync(response);
 | 
			
		||||
            var controller = new UsersAccessController(mockService.Object);
 | 
			
		||||
            var result = (BadRequestObjectResult)await controller.PostUserAsync(user);
 | 
			
		||||
            Assert.Equal(400, result.StatusCode);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact(DisplayName = "PutUser - Ok case")]
 | 
			
		||||
        public async Task PutUserAsync_ShouldReturnStatusCode200()
 | 
			
		||||
        {
 | 
			
		||||
            var response = await MockData.getUser(true, null);
 | 
			
		||||
            var user = new Models.User { Id = 1, EmployeeCode = "Emp1", EmployeeId = 1, RoleId = 1, IsActive = true, CreateDate = DateTime.Now };
 | 
			
		||||
            mockService.Setup(service => service.PutUserAsync(1,user)).ReturnsAsync(response);
 | 
			
		||||
            var controller = new UsersAccessController(mockService.Object);
 | 
			
		||||
            var result = (OkObjectResult)await controller.PutUserAsync(1,user);
 | 
			
		||||
            Assert.Equal(200, result.StatusCode);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact(DisplayName = "PutUser - BadRequest case")]
 | 
			
		||||
        public async Task PutUserAsync_ShouldReturnStatusCode400()
 | 
			
		||||
        {
 | 
			
		||||
            var response = await MockData.getUser(false, null);
 | 
			
		||||
            var user = new Models.User { Id = 1, EmployeeCode = "Emp1", EmployeeId = 1, RoleId = 1, IsActive = true, CreateDate = DateTime.Now };
 | 
			
		||||
            mockService.Setup(service => service.PutUserAsync(1,user)).ReturnsAsync(response);
 | 
			
		||||
            var controller = new UsersAccessController(mockService.Object);
 | 
			
		||||
            var result = (BadRequestObjectResult)await controller.PutUserAsync(1,user);
 | 
			
		||||
            Assert.Equal(400, result.StatusCode);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact(DisplayName = "PutUser - Not Found case")]
 | 
			
		||||
        public async Task PutUserAsync_ShouldReturnStatusCode404()
 | 
			
		||||
        {
 | 
			
		||||
            var response = await MockData.getUser(false, "Not Found");
 | 
			
		||||
            var user = new Models.User { Id = 1, EmployeeCode = "Emp1", EmployeeId = 1, RoleId = 1, IsActive = true, CreateDate = DateTime.Now };
 | 
			
		||||
            mockService.Setup(service => service.PutUserAsync(1, user)).ReturnsAsync(response);
 | 
			
		||||
            var controller = new UsersAccessController(mockService.Object);
 | 
			
		||||
            var result = (NotFoundObjectResult)await controller.PutUserAsync(1,user);
 | 
			
		||||
            Assert.Equal(404, result.StatusCode);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        [Fact(DisplayName = "DeleteUser - Ok case")]
 | 
			
		||||
        public async Task DeleteUserAsync_ShouldReturnStatusCode200()
 | 
			
		||||
        {
 | 
			
		||||
            var response = await MockData.getUser(true, null);
 | 
			
		||||
                    mockService.Setup(service => service.DeleteUserAsync(1)).ReturnsAsync(response);
 | 
			
		||||
            var controller = new UsersAccessController(mockService.Object);
 | 
			
		||||
            var result = (OkObjectResult)await controller.DeleteUserAsync(1);
 | 
			
		||||
            Assert.Equal(200, result.StatusCode);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact(DisplayName = "DeleteUser - Not Found case")]
 | 
			
		||||
        public async Task DeleteUserAsync_ShouldReturnStatusCode404()
 | 
			
		||||
        {
 | 
			
		||||
            var response = await MockData.getUser(false, "Not Found");
 | 
			
		||||
            mockService.Setup(service => service.DeleteUserAsync(1)).ReturnsAsync(response);
 | 
			
		||||
            var controller = new UsersAccessController(mockService.Object);
 | 
			
		||||
            var result = (NotFoundResult)await controller.DeleteUserAsync(1);
 | 
			
		||||
            Assert.Equal(404, result.StatusCode);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -1,129 +0,0 @@
 | 
			
		||||
using DamageAssesment.Api.UsersAccess.Interfaces;
 | 
			
		||||
using DamageAssesment.Api.UsersAccess.Models;
 | 
			
		||||
using Microsoft.AspNetCore.Authorization;
 | 
			
		||||
using Microsoft.AspNetCore.Mvc;
 | 
			
		||||
 | 
			
		||||
namespace DamageAssesment.Api.UsersAccess.Controllers
 | 
			
		||||
{
 | 
			
		||||
    [ApiController]
 | 
			
		||||
    public class UsersAccessController : ControllerBase
 | 
			
		||||
    {
 | 
			
		||||
        private readonly IUsersAccessProvider userAccessProvider;
 | 
			
		||||
 | 
			
		||||
        public UsersAccessController(IUsersAccessProvider userAccessProvider)
 | 
			
		||||
        {
 | 
			
		||||
            this.userAccessProvider = userAccessProvider;
 | 
			
		||||
        }
 | 
			
		||||
        [HttpPost("dadeschools/token")]
 | 
			
		||||
        public async Task<ActionResult> DadeSchoolAuthenticateAsync(UserCredentials userCredentials)
 | 
			
		||||
        {
 | 
			
		||||
            var result = await userAccessProvider.AuthenticateAsync(userCredentials.username, userCredentials.password);
 | 
			
		||||
 | 
			
		||||
            if (result.IsSuccess)
 | 
			
		||||
            {
 | 
			
		||||
                return Ok(result.TokenResponse);
 | 
			
		||||
            }
 | 
			
		||||
            return Unauthorized(result.ErrorMessage);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Authorize(Policy = "Dadeschools")]
 | 
			
		||||
        [HttpGet("damageapp/token")]
 | 
			
		||||
        public async Task<ActionResult> AuthenticateAsync()
 | 
			
		||||
        {
 | 
			
		||||
            var result = await userAccessProvider.AuthenticateAsync();
 | 
			
		||||
            if (result.IsSuccess)
 | 
			
		||||
            {
 | 
			
		||||
                return Ok(result.TokenResponse);
 | 
			
		||||
            }
 | 
			
		||||
            return Unauthorized(result.ErrorMessage);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Authorize(Policy = "Dadeschools")]
 | 
			
		||||
        [HttpPost("damageapp/refreshtoken")]
 | 
			
		||||
        public async Task<ActionResult> RefreshTokenAsync(TokenResponse tokenResponse)
 | 
			
		||||
        {
 | 
			
		||||
            var result = await userAccessProvider.RefreshTokenAsync(tokenResponse);
 | 
			
		||||
            if (result.IsSuccess)
 | 
			
		||||
            {
 | 
			
		||||
                return Ok(result.TokenResponse);
 | 
			
		||||
            }
 | 
			
		||||
            return Unauthorized(result.ErrorMessage);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Authorize(Policy = "DamageApp", Roles = "admin")]
 | 
			
		||||
        [HttpGet("users")]
 | 
			
		||||
        public async Task<ActionResult> GetUsersAsync()
 | 
			
		||||
        {
 | 
			
		||||
            var result = await userAccessProvider.GetUsersAsync();
 | 
			
		||||
            if (result.IsSuccess)
 | 
			
		||||
            {
 | 
			
		||||
                return Ok(result.Users);
 | 
			
		||||
            }
 | 
			
		||||
            return NoContent();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
       // [Authorize(Policy = "DamageApp", Roles = "admin")]
 | 
			
		||||
        [HttpGet("users/{Id}")]
 | 
			
		||||
        public async Task<ActionResult> GetUsersAsync(int Id)
 | 
			
		||||
        {
 | 
			
		||||
            var result = await userAccessProvider.GetUsersAsync(Id);
 | 
			
		||||
            if (result.IsSuccess)
 | 
			
		||||
            {
 | 
			
		||||
                return Ok(result.User);
 | 
			
		||||
            }
 | 
			
		||||
            return NotFound();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //[Authorize(Policy = "DamageApp", Roles = "admin")]
 | 
			
		||||
        [HttpGet("roles")]
 | 
			
		||||
        public async Task<ActionResult> GetRolesAsync()
 | 
			
		||||
        {
 | 
			
		||||
            var result = await userAccessProvider.GetRolesAsync();
 | 
			
		||||
            if (result.IsSuccess)
 | 
			
		||||
            {
 | 
			
		||||
                return Ok(result.Roles);
 | 
			
		||||
            }
 | 
			
		||||
            return NoContent();
 | 
			
		||||
        }
 | 
			
		||||
        //[Authorize(Policy = "DamageApp", Roles = "admin")]
 | 
			
		||||
        [HttpPost("users")]
 | 
			
		||||
        public async Task<ActionResult> PostUserAsync(User user)
 | 
			
		||||
        {
 | 
			
		||||
            var result = await userAccessProvider.PostUserAsync(user);
 | 
			
		||||
            if (result.IsSuccess)
 | 
			
		||||
            {
 | 
			
		||||
                return Ok(result.User);
 | 
			
		||||
            }
 | 
			
		||||
            return BadRequest(result.ErrorMessage);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //[Authorize(Policy = "DamageApp", Roles = "admin")]
 | 
			
		||||
        [HttpPut("users/{Id}")]
 | 
			
		||||
        public async Task<ActionResult> PutUserAsync(int Id, User user)
 | 
			
		||||
        {
 | 
			
		||||
            var result = await userAccessProvider.PutUserAsync(Id, user);
 | 
			
		||||
            if (result.IsSuccess)
 | 
			
		||||
            {
 | 
			
		||||
                return Ok(result.User);
 | 
			
		||||
            }
 | 
			
		||||
            if (result.ErrorMessage == "Not Found")
 | 
			
		||||
                return NotFound(result.ErrorMessage);
 | 
			
		||||
 | 
			
		||||
            return BadRequest(result.ErrorMessage);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Authorize(Policy = "DamageApp", Roles = "admin")]
 | 
			
		||||
        [HttpDelete("users/{Id}")]
 | 
			
		||||
        public async Task<ActionResult> DeleteUserAsync(int Id)
 | 
			
		||||
        {
 | 
			
		||||
            var result = await userAccessProvider.DeleteUserAsync(Id);
 | 
			
		||||
            if (result.IsSuccess)
 | 
			
		||||
            {
 | 
			
		||||
                return Ok(result.User);
 | 
			
		||||
            }
 | 
			
		||||
            return NotFound();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -1,33 +0,0 @@
 | 
			
		||||
<Project Sdk="Microsoft.NET.Sdk.Web">
 | 
			
		||||
 | 
			
		||||
  <PropertyGroup>
 | 
			
		||||
    <TargetFramework>net6.0</TargetFramework>
 | 
			
		||||
    <Nullable>enable</Nullable>
 | 
			
		||||
    <ImplicitUsings>enable</ImplicitUsings>
 | 
			
		||||
    <DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
 | 
			
		||||
    <DockerComposeProjectPath>..\docker-compose.dcproj</DockerComposeProjectPath>
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="12.0.1" />
 | 
			
		||||
    <PackageReference Include="IdentityServer4.AccessTokenValidation" Version="3.0.1" />
 | 
			
		||||
    <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.21" />
 | 
			
		||||
    <PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.9" />
 | 
			
		||||
    <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="7.0.9">
 | 
			
		||||
      <PrivateAssets>all</PrivateAssets>
 | 
			
		||||
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
 | 
			
		||||
    </PackageReference>
 | 
			
		||||
    <PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="7.0.9" />
 | 
			
		||||
    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="7.0.9" />
 | 
			
		||||
    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="7.0.9">
 | 
			
		||||
      <PrivateAssets>all</PrivateAssets>
 | 
			
		||||
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
 | 
			
		||||
    </PackageReference>
 | 
			
		||||
    <PackageReference Include="Microsoft.Extensions.Http.Polly" Version="7.0.10" />
 | 
			
		||||
    <PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.18.1" />
 | 
			
		||||
    <PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
 | 
			
		||||
    <PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" />
 | 
			
		||||
    <PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="6.21.0" />
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
 | 
			
		||||
</Project>
 | 
			
		||||
@ -1,21 +0,0 @@
 | 
			
		||||
using System.ComponentModel.DataAnnotations;
 | 
			
		||||
using System.ComponentModel.DataAnnotations.Schema;
 | 
			
		||||
using System.Text.Json.Serialization;
 | 
			
		||||
 | 
			
		||||
namespace DamageAssesment.Api.UsersAccess.Db
 | 
			
		||||
{
 | 
			
		||||
    public class Role
 | 
			
		||||
    {
 | 
			
		||||
        [Key]
 | 
			
		||||
        public int Id { get; set; }
 | 
			
		||||
 | 
			
		||||
        [StringLength(100)]
 | 
			
		||||
        [Required]
 | 
			
		||||
        public string Name { get; set; }
 | 
			
		||||
 | 
			
		||||
        // add a status field
 | 
			
		||||
 | 
			
		||||
        [StringLength(100)]
 | 
			
		||||
        public string? Description { get; set; }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -1,17 +0,0 @@
 | 
			
		||||
using Microsoft.EntityFrameworkCore.Metadata.Internal;
 | 
			
		||||
using System.ComponentModel.DataAnnotations;
 | 
			
		||||
using System.ComponentModel.DataAnnotations.Schema;
 | 
			
		||||
 | 
			
		||||
namespace DamageAssesment.Api.UsersAccess.Db
 | 
			
		||||
{
 | 
			
		||||
    public  class Token
 | 
			
		||||
    {
 | 
			
		||||
        [Key]
 | 
			
		||||
        public int Id { get; set; }
 | 
			
		||||
        [Required]
 | 
			
		||||
        [ForeignKey("User")]
 | 
			
		||||
        public int UserId { get; set; }
 | 
			
		||||
        public string? RefreshToken { get; set; }
 | 
			
		||||
        public bool? IsActive { get; set; }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -1,31 +0,0 @@
 | 
			
		||||
using System.ComponentModel.DataAnnotations;
 | 
			
		||||
using System.ComponentModel.DataAnnotations.Schema;
 | 
			
		||||
using System.Text.Json.Serialization;
 | 
			
		||||
 | 
			
		||||
namespace DamageAssesment.Api.UsersAccess.Db
 | 
			
		||||
{
 | 
			
		||||
    public class User
 | 
			
		||||
    {
 | 
			
		||||
        [Key]
 | 
			
		||||
        public int Id { get; set; }
 | 
			
		||||
 | 
			
		||||
        [ForeignKey("Employee")]
 | 
			
		||||
        public int EmployeeId { get; set; }
 | 
			
		||||
 | 
			
		||||
        [Required]
 | 
			
		||||
        [StringLength(50)]
 | 
			
		||||
        public string EmployeeCode { get; set; }
 | 
			
		||||
 | 
			
		||||
        [ForeignKey("Role")]
 | 
			
		||||
        [Required]
 | 
			
		||||
        public int RoleId { get; set; }
 | 
			
		||||
        [Required]
 | 
			
		||||
        public bool IsActive { get; set; } = true;
 | 
			
		||||
 | 
			
		||||
        [Required]
 | 
			
		||||
        public DateTime CreateDate { get; set; } = DateTime.Now;
 | 
			
		||||
 | 
			
		||||
        public DateTime? UpdateDate { get; set; }
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -1,39 +0,0 @@
 | 
			
		||||
using Microsoft.EntityFrameworkCore;
 | 
			
		||||
using Microsoft.Extensions.Configuration;
 | 
			
		||||
 | 
			
		||||
namespace DamageAssesment.Api.UsersAccess.Db
 | 
			
		||||
{
 | 
			
		||||
    public class UsersAccessDbContext : DbContext
 | 
			
		||||
    {
 | 
			
		||||
        public DbSet<Db.User> Users { get; set; }
 | 
			
		||||
        public DbSet<Db.Role> Roles { get; set; }
 | 
			
		||||
        public DbSet<Db.Token> Tokens { get; set; }
 | 
			
		||||
        private IConfiguration _Configuration { get; set; }
 | 
			
		||||
        public UsersAccessDbContext(DbContextOptions options, IConfiguration configuration) : base(options)
 | 
			
		||||
        {
 | 
			
		||||
            _Configuration = configuration;
 | 
			
		||||
        }
 | 
			
		||||
        protected override void OnConfiguring(DbContextOptionsBuilder options)
 | 
			
		||||
        {
 | 
			
		||||
            // connect to sql server with connection string from app settings
 | 
			
		||||
            options.UseSqlServer(_Configuration.GetConnectionString("UsersAccessConnection"));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        protected override void OnModelCreating(ModelBuilder modelBuilder)
 | 
			
		||||
        {
 | 
			
		||||
            base.OnModelCreating(modelBuilder);
 | 
			
		||||
 | 
			
		||||
            modelBuilder.Entity<User>()
 | 
			
		||||
                .Property(item => item.Id)
 | 
			
		||||
                .ValueGeneratedOnAdd();
 | 
			
		||||
 | 
			
		||||
            modelBuilder.Entity<Role>()
 | 
			
		||||
            .Property(item => item.Id)
 | 
			
		||||
            .ValueGeneratedOnAdd();
 | 
			
		||||
 | 
			
		||||
            modelBuilder.Entity<Token>()
 | 
			
		||||
            .Property(item => item.Id)
 | 
			
		||||
            .ValueGeneratedOnAdd();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -1,21 +0,0 @@
 | 
			
		||||
#See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging.
 | 
			
		||||
 | 
			
		||||
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
 | 
			
		||||
WORKDIR /app
 | 
			
		||||
EXPOSE 80
 | 
			
		||||
 | 
			
		||||
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
 | 
			
		||||
WORKDIR /src
 | 
			
		||||
COPY ["DamageAssesment.Api.UsersAccess/DamageAssesment.Api.UsersAccess.csproj", "DamageAssesment.Api.UsersAccess/"]
 | 
			
		||||
RUN dotnet restore "DamageAssesment.Api.UsersAccess/DamageAssesment.Api.UsersAccess.csproj"
 | 
			
		||||
COPY . .
 | 
			
		||||
WORKDIR "/src/DamageAssesment.Api.UsersAccess"
 | 
			
		||||
RUN dotnet build "DamageAssesment.Api.UsersAccess.csproj" -c Release -o /app/build
 | 
			
		||||
 | 
			
		||||
FROM build AS publish
 | 
			
		||||
RUN dotnet publish "DamageAssesment.Api.UsersAccess.csproj" -c Release -o /app/publish /p:UseAppHost=false
 | 
			
		||||
 | 
			
		||||
FROM base AS final
 | 
			
		||||
WORKDIR /app
 | 
			
		||||
COPY --from=publish /app/publish .
 | 
			
		||||
ENTRYPOINT ["dotnet", "DamageAssesment.Api.UsersAccess.dll"]
 | 
			
		||||
@ -1,10 +0,0 @@
 | 
			
		||||
using DamageAssesment.Api.UsersAccess.Models;
 | 
			
		||||
 | 
			
		||||
namespace DamageAssesment.Api.UsersAccess.Interfaces
 | 
			
		||||
{
 | 
			
		||||
    public interface IEmployeeServiceProvider
 | 
			
		||||
    {
 | 
			
		||||
        Task<List<Employee>> getEmployeesAsync(string token);
 | 
			
		||||
        Task<Employee> getEmployeeAsync(int employeeId, string token);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -1,12 +0,0 @@
 | 
			
		||||
namespace DamageAssesment.Api.UsersAccess.Interfaces
 | 
			
		||||
{
 | 
			
		||||
    public interface IRoleProvider
 | 
			
		||||
    {
 | 
			
		||||
       Task<(bool IsSuccess, IEnumerable< Models.Role> Roles, string ErrorMessage)> GetRolesAsync();
 | 
			
		||||
       Task<(bool IsSuccess, Models.Role Roles, string ErrorMessage)> GetRolesAsync(int Id);
 | 
			
		||||
       Task<(bool IsSuccess, Models.Role Role, string ErrorMessage)> PostRoleAsync(Models.Role Role);
 | 
			
		||||
       Task<(bool IsSuccess, Models.Role Role, string ErrorMessage)> PutRoleAsync(int Id,Models.Role Role);
 | 
			
		||||
       Task<(bool IsSuccess, Models.Role Role, string ErrorMessage)> DeleteRoleAsync(int Id);
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -1,13 +0,0 @@
 | 
			
		||||
using DamageAssesment.Api.UsersAccess.Models;
 | 
			
		||||
using System.Security.Claims;
 | 
			
		||||
 | 
			
		||||
namespace DamageAssesment.Api.UsersAccess.Interfaces
 | 
			
		||||
{
 | 
			
		||||
    public interface ITokenServiceProvider
 | 
			
		||||
    {
 | 
			
		||||
        Task<string> GenerateToken(Models.User user);
 | 
			
		||||
        Task<TokenResponse> TokenAuthenticate(Models.User user, Claim[] claims);
 | 
			
		||||
 | 
			
		||||
        Task<string> ConvertJsonToDadeSchoolsJwt(string json);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -1,19 +0,0 @@
 | 
			
		||||
using DamageAssesment.Api.UsersAccess.Models;
 | 
			
		||||
 | 
			
		||||
namespace DamageAssesment.Api.UsersAccess.Interfaces
 | 
			
		||||
{
 | 
			
		||||
    public interface IUsersAccessProvider
 | 
			
		||||
    {
 | 
			
		||||
       public Task<(bool IsSuccess, IEnumerable<object> Users, string ErrorMessage)> GetUsersAsync();
 | 
			
		||||
        public Task<(bool IsSuccess, object User, string ErrorMessage)> GetUsersAsync(int Id);
 | 
			
		||||
        public Task<(bool IsSuccess, Models.User User, string ErrorMessage)> PostUserAsync(Models.User User);
 | 
			
		||||
        public Task<(bool IsSuccess, Models.User User, string ErrorMessage)> PutUserAsync(int Id,Models.User User);
 | 
			
		||||
        public Task<(bool IsSuccess, Models.User User, string ErrorMessage)> DeleteUserAsync(int Id);
 | 
			
		||||
        public Task<(bool IsSuccess, IEnumerable<Models.Role> Roles, string ErrorMessage)> GetRolesAsync();
 | 
			
		||||
        public  Task<(bool IsSuccess, Models.TokenResponse TokenResponse, string ErrorMessage)> AuthenticateAsync();
 | 
			
		||||
        public Task<(bool IsSuccess, DadeSchoolToken TokenResponse, string ErrorMessage)> AuthenticateAsync(string username, string password);
 | 
			
		||||
 | 
			
		||||
        public Task<(bool IsSuccess, Models.TokenResponse TokenResponse, string ErrorMessage)>RefreshTokenAsync(TokenResponse tokenResponse);
 | 
			
		||||
        public void seedData();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -1,7 +0,0 @@
 | 
			
		||||
namespace DamageAssesment.Api.UsersAccess.Interfaces
 | 
			
		||||
{
 | 
			
		||||
    public interface IHttpUtil
 | 
			
		||||
    {
 | 
			
		||||
        Task<string> SendAsync(HttpMethod method, string url, string JsonInput, string token);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -1,10 +0,0 @@
 | 
			
		||||
namespace DamageAssesment.Api.UsersAccess.Models
 | 
			
		||||
{
 | 
			
		||||
    public class DadeSchoolToken
 | 
			
		||||
    {
 | 
			
		||||
        public string access_token { get; set; }
 | 
			
		||||
        public int expires_in { get; set; }
 | 
			
		||||
        public string token_type { get; set; }
 | 
			
		||||
        public string scope { get; set; }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -1,14 +0,0 @@
 | 
			
		||||
namespace DamageAssesment.Api.UsersAccess.Models
 | 
			
		||||
{
 | 
			
		||||
    public class Employee
 | 
			
		||||
    {
 | 
			
		||||
        public int Id { get; set; }
 | 
			
		||||
        public string EmployeeCode { get; set; }
 | 
			
		||||
        public string Name { get; set; }
 | 
			
		||||
        public DateTime BirthDate { get; set; }
 | 
			
		||||
        public string OfficePhoneNumber { get; set; }
 | 
			
		||||
        public string Email { get; set; }
 | 
			
		||||
        public bool IsActive { get; set; }
 | 
			
		||||
        public string PreferredLanguage { get; set; }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -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"};
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -1,9 +0,0 @@
 | 
			
		||||
using System.ComponentModel.DataAnnotations;
 | 
			
		||||
namespace DamageAssesment.Api.UsersAccess.Models
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
    public class JwtSettings
 | 
			
		||||
    {
 | 
			
		||||
        public string securitykey { get; set; }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -1,8 +0,0 @@
 | 
			
		||||
namespace DamageAssesment.Api.UsersAccess.Models
 | 
			
		||||
{
 | 
			
		||||
    public class Role { 
 | 
			
		||||
        public int Id { get; set; }
 | 
			
		||||
        public string Name { get; set; }
 | 
			
		||||
        public string Description { get; set; }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -1,10 +0,0 @@
 | 
			
		||||
namespace DamageAssesment.Api.UsersAccess.Models
 | 
			
		||||
{
 | 
			
		||||
    public  class Token
 | 
			
		||||
    { 
 | 
			
		||||
        public string Id { get; set; }
 | 
			
		||||
        public int UserId { get; set; } 
 | 
			
		||||
        public string RefreshToken { get; set; }
 | 
			
		||||
        public bool IsActive { get; set; }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -1,8 +0,0 @@
 | 
			
		||||
namespace DamageAssesment.Api.UsersAccess.Models
 | 
			
		||||
{
 | 
			
		||||
    public class TokenResponse
 | 
			
		||||
    {
 | 
			
		||||
        public string? jwttoken { get; set; }
 | 
			
		||||
        public string? refreshtoken { get; set; }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -1,13 +0,0 @@
 | 
			
		||||
namespace DamageAssesment.Api.UsersAccess.Models
 | 
			
		||||
{
 | 
			
		||||
    public class User
 | 
			
		||||
    {
 | 
			
		||||
        public int Id { get; set; }
 | 
			
		||||
        public int EmployeeId { get; set; }
 | 
			
		||||
        public string EmployeeCode { get; set; }
 | 
			
		||||
        public int RoleId { get; set; }
 | 
			
		||||
        public bool IsActive { get; set; }
 | 
			
		||||
        public DateTime CreateDate { get; set; }
 | 
			
		||||
        public DateTime UpdateDate { get; set; }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -1,5 +0,0 @@
 | 
			
		||||
public class UserCredentials
 | 
			
		||||
{
 | 
			
		||||
    public string username { get; set; }
 | 
			
		||||
    public string password { get; set; }
 | 
			
		||||
}
 | 
			
		||||
@ -1,14 +0,0 @@
 | 
			
		||||
namespace DamageAssesment.Api.UsersAccess.Profiles
 | 
			
		||||
{
 | 
			
		||||
    public class UsersAccessProfile : AutoMapper.Profile
 | 
			
		||||
    {
 | 
			
		||||
        public UsersAccessProfile()
 | 
			
		||||
        {
 | 
			
		||||
            CreateMap<Db.User, Models.User>();
 | 
			
		||||
            CreateMap<Models.User, Db.User>();
 | 
			
		||||
 | 
			
		||||
            CreateMap<Db.Role, Models.Role>();
 | 
			
		||||
            CreateMap<Models.Role, Db.Role>();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -17,13 +17,9 @@ const int maxRetryForCircuitBraker = 5;
 | 
			
		||||
const int intervalForCircuitBraker = 5; //5 seconds
 | 
			
		||||
 | 
			
		||||
var builder = WebApplication.CreateBuilder(args);
 | 
			
		||||
builder.Services.AddCors(p => p.AddPolicy("DamageAppCorsPolicy", build =>
 | 
			
		||||
{
 | 
			
		||||
    build.WithOrigins("*").AllowAnyMethod().AllowAnyHeader().AllowAnyOrigin();
 | 
			
		||||
}));
 | 
			
		||||
 | 
			
		||||
// Add services to the container.
 | 
			
		||||
var authkey = builder.Configuration.GetValue<string>("JwtSettings:securitykey");
 | 
			
		||||
var mode = builder.Configuration.GetValue<string>("ModeSettings:mode");
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
builder.Services.AddAuthentication().
 | 
			
		||||
@ -54,27 +50,23 @@ builder.Services.AddAuthorization(options =>
 | 
			
		||||
        .RequireAuthenticatedUser()
 | 
			
		||||
        .AddAuthenticationSchemes("DamageApp")
 | 
			
		||||
        .Build();
 | 
			
		||||
 | 
			
		||||
    var DadeschoolsPolicy = new AuthorizationPolicyBuilder().RequireAuthenticatedUser()
 | 
			
		||||
    var DadeschoolsPolicy = new AuthorizationPolicyBuilder()
 | 
			
		||||
        .RequireAuthenticatedUser()
 | 
			
		||||
        .AddAuthenticationSchemes("Dadeschools")
 | 
			
		||||
        .Build();
 | 
			
		||||
 | 
			
		||||
    var DadeschoolsPolicyOffline = new AuthorizationPolicyBuilder().RequireAssertion(_ => true)
 | 
			
		||||
                   .Build();
 | 
			
		||||
 | 
			
		||||
    var allPolicy = new AuthorizationPolicyBuilder()
 | 
			
		||||
        .RequireAuthenticatedUser()
 | 
			
		||||
        .AddAuthenticationSchemes("DamageApp", "Dadeschools")
 | 
			
		||||
        .Build();
 | 
			
		||||
    options.AddPolicy("DamageApp", DamageAppPolicy);
 | 
			
		||||
    options.AddPolicy("Dadeschools", mode == "online" ? DadeschoolsPolicy : DadeschoolsPolicyOffline);
 | 
			
		||||
    options.AddPolicy("Dadeschools", DadeschoolsPolicy);
 | 
			
		||||
    options.AddPolicy("AllPolicies", allPolicy);
 | 
			
		||||
    options.DefaultPolicy = options.GetPolicy("DamageApp")!;
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
var _jwtsettings = builder.Configuration.GetSection("JwtSettings");
 | 
			
		||||
builder.Services.Configure<JwtSettings>(_jwtsettings);
 | 
			
		||||
builder.Services.AddHttpContextAccessor();
 | 
			
		||||
 | 
			
		||||
builder.Services.AddControllers();
 | 
			
		||||
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
 | 
			
		||||
@ -130,7 +122,7 @@ builder.Services.AddSwaggerGen(options =>
 | 
			
		||||
 | 
			
		||||
builder.Services.AddDbContext<UsersAccessDbContext>(option =>
 | 
			
		||||
{
 | 
			
		||||
    option.UseSqlServer("UsersAccessConnection");
 | 
			
		||||
    option.UseInMemoryDatabase("UsersAccess");
 | 
			
		||||
});
 | 
			
		||||
var app = builder.Build();
 | 
			
		||||
 | 
			
		||||
@ -148,7 +140,6 @@ if (app.Environment.IsDevelopment())
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
app.UseCors("DamageAppCorsPolicy");
 | 
			
		||||
app.UseAuthentication();
 | 
			
		||||
app.UseAuthorization();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,37 +0,0 @@
 | 
			
		||||
{
 | 
			
		||||
  "profiles": {
 | 
			
		||||
    "DamageAssesment.Api.Users": {
 | 
			
		||||
      "commandName": "Project",
 | 
			
		||||
      "launchBrowser": true,
 | 
			
		||||
      "launchUrl": "swagger",
 | 
			
		||||
      "environmentVariables": {
 | 
			
		||||
        "ASPNETCORE_ENVIRONMENT": "Development"
 | 
			
		||||
      },
 | 
			
		||||
      "dotnetRunMessages": true,
 | 
			
		||||
      "applicationUrl": "http://localhost:5027"
 | 
			
		||||
    },
 | 
			
		||||
    "IIS Express": {
 | 
			
		||||
      "commandName": "IISExpress",
 | 
			
		||||
      "launchBrowser": true,
 | 
			
		||||
      "launchUrl": "swagger",
 | 
			
		||||
      "environmentVariables": {
 | 
			
		||||
        "ASPNETCORE_ENVIRONMENT": "Development"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "Docker": {
 | 
			
		||||
      "commandName": "Docker",
 | 
			
		||||
      "launchBrowser": true,
 | 
			
		||||
      "launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}/swagger",
 | 
			
		||||
      "publishAllPorts": true
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  "$schema": "https://json.schemastore.org/launchsettings.json",
 | 
			
		||||
  "iisSettings": {
 | 
			
		||||
    "windowsAuthentication": false,
 | 
			
		||||
    "anonymousAuthentication": true,
 | 
			
		||||
    "iisExpress": {
 | 
			
		||||
      "applicationUrl": "http://localhost:28382",
 | 
			
		||||
      "sslPort": 0
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@ -1,469 +0,0 @@
 | 
			
		||||
using AutoMapper;
 | 
			
		||||
using DamageAssesment.Api.UsersAccess.Db;
 | 
			
		||||
using DamageAssesment.Api.UsersAccess.Interfaces;
 | 
			
		||||
using DamageAssesment.Api.UsersAccess.Models;
 | 
			
		||||
using Microsoft.AspNetCore.Http;
 | 
			
		||||
using Microsoft.EntityFrameworkCore;
 | 
			
		||||
using Microsoft.Extensions.Options;
 | 
			
		||||
using Microsoft.IdentityModel.Tokens;
 | 
			
		||||
using Newtonsoft.Json;
 | 
			
		||||
using Newtonsoft.Json.Linq;
 | 
			
		||||
using System.Data;
 | 
			
		||||
using Newtonsoft.Json;
 | 
			
		||||
using System.IdentityModel.Tokens.Jwt;
 | 
			
		||||
using System.Security.Claims;
 | 
			
		||||
using System.Text;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
namespace DamageAssesment.Api.UsersAccess.Providers
 | 
			
		||||
{
 | 
			
		||||
    public class UsersAccessProvider : IUsersAccessProvider
 | 
			
		||||
    {
 | 
			
		||||
        private readonly UsersAccessDbContext userAccessDbContext;
 | 
			
		||||
        private readonly ILogger<UsersAccessProvider> logger;
 | 
			
		||||
        private readonly IMapper mapper;
 | 
			
		||||
        private readonly IEmployeeServiceProvider employeeServiceProvider;
 | 
			
		||||
        private readonly JwtSettings jwtSettings;
 | 
			
		||||
        private readonly ITokenServiceProvider tokenServiceProvider;
 | 
			
		||||
        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)
 | 
			
		||||
        {
 | 
			
		||||
            this.userAccessDbContext = userAccessDbContext;
 | 
			
		||||
            this.employeeServiceProvider = employeeServiceProvider;
 | 
			
		||||
            this.logger = logger;
 | 
			
		||||
            this.mapper = mapper;
 | 
			
		||||
            jwtSettings = options.Value;
 | 
			
		||||
            this.tokenServiceProvider = tokenServiceProvider;
 | 
			
		||||
            this.httpContextAccessor = httpContextAccessor;
 | 
			
		||||
            this.configuration = configuration;
 | 
			
		||||
            seedData();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void seedData()
 | 
			
		||||
        {
 | 
			
		||||
            if (!userAccessDbContext.Users.Any())
 | 
			
		||||
            {
 | 
			
		||||
                userAccessDbContext.Users.Add(new Db.User { EmployeeId = 1, EmployeeCode = "Emp1", RoleId = 1, IsActive = true, CreateDate = DateTime.Now });
 | 
			
		||||
                userAccessDbContext.Users.Add(new Db.User { EmployeeId = 2, EmployeeCode = "Emp2", RoleId = 2, IsActive = true, CreateDate = DateTime.Now });
 | 
			
		||||
                //userAccessDbContext.Users.Add(new Db.User { EmployeeId = 3, EmployeeCode = "Emp3", RoleId = 3, IsActive = true, CreateDate = DateTime.Now });
 | 
			
		||||
                userAccessDbContext.SaveChanges();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            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 = "user", Description = " User 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 = "document", Description = "Document role" });
 | 
			
		||||
                userAccessDbContext.SaveChanges();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        private string GetToken()
 | 
			
		||||
        {
 | 
			
		||||
            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
 | 
			
		||||
            {
 | 
			
		||||
                logger?.LogInformation("Gell all Users from DB");
 | 
			
		||||
                var users = await userAccessDbContext.Users.ToListAsync();
 | 
			
		||||
                List<object> userslist = new List<object>();
 | 
			
		||||
                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");
 | 
			
		||||
                    // var result = mapper.Map<IEnumerable<Db.User>, IEnumerable<Models.User>>(users);
 | 
			
		||||
                    return (true, userslist, null);
 | 
			
		||||
                }
 | 
			
		||||
                return (false, null, "Not found");
 | 
			
		||||
            }
 | 
			
		||||
            catch (Exception ex)
 | 
			
		||||
            {
 | 
			
		||||
                logger?.LogError(ex.ToString());
 | 
			
		||||
                return (false, null, ex.Message);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        public async Task<(bool IsSuccess, object User, string ErrorMessage)> GetUsersAsync(int Id)
 | 
			
		||||
        {
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                logger?.LogInformation("Querying Users table");
 | 
			
		||||
 | 
			
		||||
                var user = await userAccessDbContext.Users.SingleOrDefaultAsync(s => s.Id == Id);
 | 
			
		||||
                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");
 | 
			
		||||
                    var result = mapper.Map<Db.User, Models.User>(user);
 | 
			
		||||
                    return (true, data, null);
 | 
			
		||||
                }
 | 
			
		||||
                return (false, null, "Not found");
 | 
			
		||||
            }
 | 
			
		||||
            catch (Exception ex)
 | 
			
		||||
            {
 | 
			
		||||
                logger?.LogError(ex.ToString());
 | 
			
		||||
                return (false, null, ex.Message);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public async Task<(bool IsSuccess, Models.User User, string ErrorMessage)> PostUserAsync(Models.User user)
 | 
			
		||||
        {
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                if (user != null)
 | 
			
		||||
                {
 | 
			
		||||
                    var _user = mapper.Map<Models.User, Db.User>(user);
 | 
			
		||||
                    userAccessDbContext.Users.Add(_user);
 | 
			
		||||
                    user.Id = _user.Id;
 | 
			
		||||
                    await userAccessDbContext.SaveChangesAsync();
 | 
			
		||||
                    return (true, user, "Successful");
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    logger?.LogInformation($"null object cannot be added");
 | 
			
		||||
                    return (false, null, $"null object cannot be added");
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            catch (Exception ex)
 | 
			
		||||
            {
 | 
			
		||||
                logger?.LogError(ex.ToString());
 | 
			
		||||
                return (false, null, ex.Message);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public async Task<(bool IsSuccess, Models.User User, string ErrorMessage)> PutUserAsync(int Id, Models.User user)
 | 
			
		||||
        {
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                if (user != null)
 | 
			
		||||
                {
 | 
			
		||||
                    var _user = await userAccessDbContext.Users.AsNoTracking().Where(s => s.Id == Id).SingleOrDefaultAsync();
 | 
			
		||||
 | 
			
		||||
                    if (_user != null)
 | 
			
		||||
                    {
 | 
			
		||||
                        Db.User vUsers = mapper.Map<Models.User, Db.User>(user);
 | 
			
		||||
                        vUsers.UpdateDate = DateTime.Now;
 | 
			
		||||
                        userAccessDbContext.Users.Update(vUsers);
 | 
			
		||||
                        userAccessDbContext.SaveChanges();
 | 
			
		||||
                        user.Id = Id;
 | 
			
		||||
                        return (true, user, "Successful");
 | 
			
		||||
                    }
 | 
			
		||||
                    else
 | 
			
		||||
                    {
 | 
			
		||||
                        logger?.LogInformation($"User Id : {Id} Not found");
 | 
			
		||||
                        return (false, null, "Not Found");
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    logger?.LogInformation($"User Id: {Id} Bad Request");
 | 
			
		||||
                    return (false, null, "Bad request");
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            catch (Exception ex)
 | 
			
		||||
            {
 | 
			
		||||
                logger?.LogError(ex.ToString());
 | 
			
		||||
                return (false, null, ex.Message);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public async Task<(bool IsSuccess, Models.User User, string ErrorMessage)> DeleteUserAsync(int Id)
 | 
			
		||||
        {
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                var user = await userAccessDbContext.Users.Where(x => x.Id == Id).SingleOrDefaultAsync();
 | 
			
		||||
 | 
			
		||||
                if (user != null)
 | 
			
		||||
                {
 | 
			
		||||
                    userAccessDbContext.Users.Remove(user);
 | 
			
		||||
                    await userAccessDbContext.SaveChangesAsync();
 | 
			
		||||
                    logger?.LogInformation($"User Id: {Id} deleted Successfuly");
 | 
			
		||||
                    return (true, mapper.Map<Db.User, Models.User>(user), $"User Id: {Id} deleted Successfuly");
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    logger?.LogInformation($"User Id : {Id} Not found");
 | 
			
		||||
                    return (false, null, "Not Found");
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            catch (Exception ex)
 | 
			
		||||
            {
 | 
			
		||||
                logger?.LogError(ex.ToString());
 | 
			
		||||
                return (false, null, ex.Message);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        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
 | 
			
		||||
            {
 | 
			
		||||
                var client = new HttpClient();
 | 
			
		||||
                var request = new HttpRequestMessage(HttpMethod.Post, configuration.GetValue<string>("Dadeschools:TokenUrl"));
 | 
			
		||||
                var collection = new List<KeyValuePair<string, string>>();
 | 
			
		||||
                collection.Add(new("client_id", configuration.GetValue<string>("Dadeschools:TokenClientId")));
 | 
			
		||||
                collection.Add(new("client_secret", configuration.GetValue<string>("Dadeschools:TokenClientSecret")));
 | 
			
		||||
                collection.Add(new("scope", configuration.GetValue<string>("Dadeschools:scope")));
 | 
			
		||||
                collection.Add(new("grant_type", configuration.GetValue<string>("Dadeschools:grant_type")));
 | 
			
		||||
                collection.Add(new("username", username));
 | 
			
		||||
                collection.Add(new("password", password));
 | 
			
		||||
                var content = new FormUrlEncodedContent(collection);
 | 
			
		||||
                request.Content = content;
 | 
			
		||||
                var response = await client.SendAsync(request);
 | 
			
		||||
                var responseString = await response.Content.ReadAsStringAsync();
 | 
			
		||||
                if (response.IsSuccessStatusCode)
 | 
			
		||||
                {
 | 
			
		||||
                    return (true, JsonConvert.DeserializeObject<DadeSchoolToken>(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)
 | 
			
		||||
            {
 | 
			
		||||
                return (false, null, ex.Message);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        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)
 | 
			
		||||
                    return null;
 | 
			
		||||
 | 
			
		||||
                var payload = tokenS.Payload.SerializeToJson();
 | 
			
		||||
                return payload;
 | 
			
		||||
            }
 | 
			
		||||
            catch
 | 
			
		||||
            {
 | 
			
		||||
                return null;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public async Task<(bool IsSuccess, TokenResponse TokenResponse, string ErrorMessage)> AuthenticateAsync()
 | 
			
		||||
        {
 | 
			
		||||
            var dadeschoolsToken = GetToken();
 | 
			
		||||
            var decodedToken = DecodeJwtToken(dadeschoolsToken);
 | 
			
		||||
            var tokenObject = decodedToken == null ? null : JObject.Parse(decodedToken);
 | 
			
		||||
 | 
			
		||||
            if (tokenObject == null)
 | 
			
		||||
                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.Role, role.Name),
 | 
			
		||||
                               new Claim(JwtRegisteredClaimNames.Jti,Guid.NewGuid().ToString())
 | 
			
		||||
 | 
			
		||||
                              };
 | 
			
		||||
 | 
			
		||||
                /// Generate Token
 | 
			
		||||
                var tokenhandler = new JwtSecurityTokenHandler();
 | 
			
		||||
                var tokenkey = Encoding.UTF8.GetBytes(jwtSettings.securitykey);
 | 
			
		||||
                var tokendesc = new SecurityTokenDescriptor
 | 
			
		||||
                {
 | 
			
		||||
                    Audience = "",
 | 
			
		||||
                    NotBefore = DateTime.Now,
 | 
			
		||||
                    Subject = new ClaimsIdentity(authClaims),
 | 
			
		||||
                    Expires = DateTime.Now.AddDays(3),
 | 
			
		||||
                    SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(tokenkey), SecurityAlgorithms.HmacSha256)
 | 
			
		||||
                };
 | 
			
		||||
                var token = tokenhandler.CreateToken(tokendesc);
 | 
			
		||||
                string finaltoken = tokenhandler.WriteToken(token);
 | 
			
		||||
 | 
			
		||||
                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.");
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                return (false, null, "user inactive or not exist.");
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
        public async Task<(bool IsSuccess, IEnumerable<Models.Role> Roles, string ErrorMessage)> GetRolesAsync()
 | 
			
		||||
        {
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                logger?.LogInformation("Gell all Roles from DB");
 | 
			
		||||
                var roles = await userAccessDbContext.Roles.ToListAsync();
 | 
			
		||||
                if (roles != null)
 | 
			
		||||
                {
 | 
			
		||||
                    logger?.LogInformation($"{roles.Count} Items(s) found");
 | 
			
		||||
                    var result = mapper.Map<IEnumerable<Db.Role>, IEnumerable<Models.Role>>(roles);
 | 
			
		||||
                    return (true, result, null);
 | 
			
		||||
                }
 | 
			
		||||
                return (false, null, "Not found");
 | 
			
		||||
            }
 | 
			
		||||
            catch (Exception ex)
 | 
			
		||||
            {
 | 
			
		||||
                logger?.LogError(ex.ToString());
 | 
			
		||||
                return (false, null, ex.Message);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public async Task<(bool IsSuccess, Models.TokenResponse TokenResponse, string ErrorMessage)> RefreshTokenAsync(TokenResponse tokenResponse)
 | 
			
		||||
        {
 | 
			
		||||
            //Generate token
 | 
			
		||||
            var tokenhandler = new JwtSecurityTokenHandler();
 | 
			
		||||
            var tokenkey = Encoding.UTF8.GetBytes(this.jwtSettings.securitykey);
 | 
			
		||||
            SecurityToken securityToken;
 | 
			
		||||
            var principal = tokenhandler.ValidateToken(tokenResponse.jwttoken, new TokenValidationParameters
 | 
			
		||||
            {
 | 
			
		||||
                ValidateIssuerSigningKey = true,
 | 
			
		||||
                IssuerSigningKey = new SymmetricSecurityKey(tokenkey),
 | 
			
		||||
                ValidateIssuer = false,
 | 
			
		||||
                ValidateAudience = false,
 | 
			
		||||
 | 
			
		||||
            }, out securityToken);
 | 
			
		||||
 | 
			
		||||
            var token = securityToken as JwtSecurityToken;
 | 
			
		||||
            if (token != null && !token.Header.Alg.Equals(SecurityAlgorithms.HmacSha256))
 | 
			
		||||
            {
 | 
			
		||||
                return (false, null, "Unauthorized");
 | 
			
		||||
            }
 | 
			
		||||
            var username = principal.Identity?.Name;
 | 
			
		||||
 | 
			
		||||
            var tokens = await userAccessDbContext.Tokens.ToListAsync();
 | 
			
		||||
            var users = await userAccessDbContext.Users.ToListAsync();
 | 
			
		||||
 | 
			
		||||
            var user = (from u in users
 | 
			
		||||
                        join t in tokens
 | 
			
		||||
                        on u.Id equals t.UserId
 | 
			
		||||
                        where u.EmployeeId == 1
 | 
			
		||||
                        && t.RefreshToken == tokenResponse.refreshtoken
 | 
			
		||||
                        select u).FirstOrDefault();
 | 
			
		||||
 | 
			
		||||
            if (user == null)
 | 
			
		||||
                return (false, null, "Invalid Token Response object provided");
 | 
			
		||||
 | 
			
		||||
            var _user = mapper.Map<Db.User, Models.User>(user);
 | 
			
		||||
            var response = tokenServiceProvider.TokenAuthenticate(_user, principal.Claims.ToArray()).Result;
 | 
			
		||||
            return (true, response, "Token authenticated and refreshed.");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -1,50 +0,0 @@
 | 
			
		||||
using DamageAssesment.Api.UsersAccess.Interfaces;
 | 
			
		||||
using DamageAssesment.Api.UsersAccess.Models;
 | 
			
		||||
using Newtonsoft.Json;
 | 
			
		||||
 | 
			
		||||
namespace DamageAssesment.Api.UsersAccess.Services
 | 
			
		||||
{
 | 
			
		||||
    public class EmployeeServiceProvider : ServiceProviderBase, IEmployeeServiceProvider
 | 
			
		||||
    {
 | 
			
		||||
        public EmployeeServiceProvider(IConfiguration configuration, IHttpUtil httpUtil, ILogger<EmployeeServiceProvider> logger) : base(configuration, httpUtil, logger, configuration.GetValue<string>("RessourceSettings:Employee"), configuration.GetValue<string>("EndPointSettings:EmployeeUrlBase"))
 | 
			
		||||
        {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public async Task<List<Employee>> getEmployeesAsync(string token)
 | 
			
		||||
        {
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null,token);
 | 
			
		||||
                var employees = JsonConvert.DeserializeObject<List<Employee>>(responseJsonString);
 | 
			
		||||
 | 
			
		||||
                if (employees == null || !employees.Any())
 | 
			
		||||
                    return new List<Employee>();
 | 
			
		||||
                else return employees;
 | 
			
		||||
            }
 | 
			
		||||
            catch (Exception ex)
 | 
			
		||||
            {
 | 
			
		||||
                logger?.LogError($"Exception Found : {ex.Message} - Ref: EmployeeServiceProvider.getEmployeesAsync()");
 | 
			
		||||
                return new List<Employee>();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        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,token);
 | 
			
		||||
                var employee = JsonConvert.DeserializeObject<Employee>(responseJsonString);
 | 
			
		||||
 | 
			
		||||
                if (employee == null)
 | 
			
		||||
                    return null;
 | 
			
		||||
                else return employee;
 | 
			
		||||
            }
 | 
			
		||||
            catch (Exception ex)
 | 
			
		||||
            {
 | 
			
		||||
                logger?.LogError($"Exception Found : {ex.Message} - Ref: EmployeeServiceProvider.getEmployeeAsync()");
 | 
			
		||||
                return null;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -1,42 +0,0 @@
 | 
			
		||||
using DamageAssesment.Api.UsersAccess.Interfaces;
 | 
			
		||||
using System.Net.Http.Headers;
 | 
			
		||||
using System.Text;
 | 
			
		||||
 | 
			
		||||
namespace DamageAssesment.Api.UsersAccess.Services
 | 
			
		||||
{
 | 
			
		||||
    public class HttpUtil : IHttpUtil
 | 
			
		||||
    {
 | 
			
		||||
        private readonly HttpClient httpClient;
 | 
			
		||||
        private readonly ILogger<HttpUtil> logger;
 | 
			
		||||
 | 
			
		||||
        public HttpUtil(HttpClient httpClient, ILogger<HttpUtil> logger)
 | 
			
		||||
        {
 | 
			
		||||
            this.httpClient = httpClient;
 | 
			
		||||
            this.logger = logger;
 | 
			
		||||
        }
 | 
			
		||||
        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);
 | 
			
		||||
                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();
 | 
			
		||||
                return responseString;
 | 
			
		||||
            }
 | 
			
		||||
            catch (Exception ex)
 | 
			
		||||
            {
 | 
			
		||||
                logger?.LogError($"Exception Message : {ex.Message} - Ref: HttpUtil.SendAsync()");
 | 
			
		||||
                return null;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -1,25 +0,0 @@
 | 
			
		||||
using DamageAssesment.Api.UsersAccess.Interfaces;
 | 
			
		||||
 | 
			
		||||
namespace DamageAssesment.Api.UsersAccess.Services
 | 
			
		||||
{
 | 
			
		||||
    public class ServiceProviderBase
 | 
			
		||||
    {
 | 
			
		||||
        protected readonly IConfiguration configuration;
 | 
			
		||||
        protected readonly IHttpUtil httpUtil;
 | 
			
		||||
        protected readonly ILogger<ServiceProviderBase> logger;
 | 
			
		||||
        protected string ressource;
 | 
			
		||||
        protected string urlBase;
 | 
			
		||||
        protected string url;
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        public ServiceProviderBase(IConfiguration configuration, IHttpUtil httpUtil, ILogger<ServiceProviderBase> logger, string ressource, string urlBase)
 | 
			
		||||
        {
 | 
			
		||||
            this.configuration = configuration;
 | 
			
		||||
            this.httpUtil = httpUtil;
 | 
			
		||||
            this.logger = logger;
 | 
			
		||||
            this.ressource = ressource;
 | 
			
		||||
            this.urlBase = urlBase;
 | 
			
		||||
            url = urlBase + ressource;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user