forked from MDCPS/DamageAssessment_Backend
		
	Compare commits
	
		
			8 Commits
		
	
	
		
			docker-Azu
			...
			docker-bra
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| e3ee2f81b4 | |||
| 2c7d4e6138 | |||
| 538580a0e0 | |||
| f7ccc89d53 | |||
| 9384a8b976 | |||
| c80749e292 | |||
| 04de1ee366 | |||
| 6f10e99627 | 
										
											Binary file not shown.
										
									
								
							@ -1,7 +0,0 @@
 | 
			
		||||
{
 | 
			
		||||
  "ExpandedNodes": [
 | 
			
		||||
    ""
 | 
			
		||||
  ],
 | 
			
		||||
  "SelectedNode": "\\DamageAssesment.sln",
 | 
			
		||||
  "PreviewInSolutionExplorer": false
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										3
									
								
								DamageAssesmentApi/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								DamageAssesmentApi/.gitignore
									
									
									
									
										vendored
									
									
								
							@ -395,5 +395,4 @@ FodyWeavers.xsd
 | 
			
		||||
*.msp
 | 
			
		||||
 | 
			
		||||
# JetBrains Rider
 | 
			
		||||
*.sln.iml
 | 
			
		||||
**/migrations/
 | 
			
		||||
*.sln.iml
 | 
			
		||||
@ -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)
 | 
			
		||||
        {
 | 
			
		||||
 | 
			
		||||
@ -13,12 +13,7 @@
 | 
			
		||||
    <PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="12.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.VisualStudio.Azure.Containers.Tools.Targets" Version="1.19.4" />
 | 
			
		||||
    <PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" />
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
 | 
			
		||||
@ -3,7 +3,6 @@ using System.ComponentModel.DataAnnotations.Schema;
 | 
			
		||||
 | 
			
		||||
namespace DamageAssesment.Api.Answers.Db
 | 
			
		||||
{
 | 
			
		||||
    [Table("Answers")]
 | 
			
		||||
    public class Answer
 | 
			
		||||
    {
 | 
			
		||||
        [Key]
 | 
			
		||||
 | 
			
		||||
@ -1,19 +1,13 @@
 | 
			
		||||
using Microsoft.EntityFrameworkCore;
 | 
			
		||||
using Microsoft.Extensions.Configuration;
 | 
			
		||||
 | 
			
		||||
namespace DamageAssesment.Api.Answers.Db
 | 
			
		||||
{
 | 
			
		||||
    public class AnswerDbContext:DbContext
 | 
			
		||||
    {
 | 
			
		||||
        private IConfiguration _Configuration { get; set; }
 | 
			
		||||
        public AnswerDbContext(DbContextOptions options,IConfiguration configuration):base(options) 
 | 
			
		||||
 | 
			
		||||
        public AnswerDbContext(DbContextOptions options):base(options) 
 | 
			
		||||
        {
 | 
			
		||||
            _Configuration= configuration;
 | 
			
		||||
        }
 | 
			
		||||
        protected override void OnConfiguring(DbContextOptionsBuilder options)
 | 
			
		||||
        {
 | 
			
		||||
            // connect to sql server with connection string from app settings
 | 
			
		||||
            options.UseSqlServer(_Configuration.GetConnectionString("AnswerConnection"));
 | 
			
		||||
            
 | 
			
		||||
        }
 | 
			
		||||
        public DbSet<Db.Answer> Answers { get; set; }
 | 
			
		||||
        protected override void OnModelCreating(ModelBuilder modelBuilder)
 | 
			
		||||
 | 
			
		||||
@ -1,79 +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);
 | 
			
		||||
var authkey = builder.Configuration.GetValue<string>("JwtSettings:securitykey");
 | 
			
		||||
builder.Services.AddAuthentication(item =>
 | 
			
		||||
{
 | 
			
		||||
    item.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
 | 
			
		||||
    item.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
 | 
			
		||||
}).AddJwtBearer(item =>
 | 
			
		||||
{
 | 
			
		||||
    item.RequireHttpsMetadata = true;
 | 
			
		||||
    item.SaveToken = true;
 | 
			
		||||
    item.TokenValidationParameters = new TokenValidationParameters()
 | 
			
		||||
    {
 | 
			
		||||
        ValidateIssuerSigningKey = true,
 | 
			
		||||
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(authkey)),
 | 
			
		||||
        ValidateIssuer = false,
 | 
			
		||||
        ValidateAudience = false,
 | 
			
		||||
        ClockSkew = TimeSpan.Zero
 | 
			
		||||
    };
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
// Add services to the container.
 | 
			
		||||
 | 
			
		||||
builder.Services.AddControllers();
 | 
			
		||||
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
 | 
			
		||||
builder.Services.AddEndpointsApiExplorer();
 | 
			
		||||
//builder.Services.AddSwaggerGen();
 | 
			
		||||
builder.Services.AddSwaggerGen(options =>
 | 
			
		||||
builder.Services.AddSwaggerGen(c =>
 | 
			
		||||
{
 | 
			
		||||
    // Include XML comments from your assembly
 | 
			
		||||
    var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
 | 
			
		||||
    var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
 | 
			
		||||
    options.IncludeXmlComments(xmlPath);
 | 
			
		||||
 | 
			
		||||
    OpenApiSecurityScheme securityDefinition = new OpenApiSecurityScheme()
 | 
			
		||||
    {
 | 
			
		||||
        Name = "Bearer",
 | 
			
		||||
        BearerFormat = "JWT",
 | 
			
		||||
        Scheme = "bearer",
 | 
			
		||||
        Description = "Specify the authorization token.",
 | 
			
		||||
        In = ParameterLocation.Header,
 | 
			
		||||
        Type = SecuritySchemeType.Http,
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    options.AddSecurityDefinition("jwt_auth", securityDefinition);
 | 
			
		||||
 | 
			
		||||
    // Make sure swagger UI requires a Bearer token specified
 | 
			
		||||
    OpenApiSecurityScheme securityScheme = new OpenApiSecurityScheme()
 | 
			
		||||
    {
 | 
			
		||||
        Reference = new OpenApiReference()
 | 
			
		||||
        {
 | 
			
		||||
            Id = "jwt_auth",
 | 
			
		||||
            Type = ReferenceType.SecurityScheme
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    OpenApiSecurityRequirement securityRequirements = new OpenApiSecurityRequirement()
 | 
			
		||||
    {
 | 
			
		||||
        {securityScheme, new string[] { }},
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    options.AddSecurityRequirement(securityRequirements);
 | 
			
		||||
    c.IncludeXmlComments(xmlPath);
 | 
			
		||||
});
 | 
			
		||||
builder.Services.AddScoped<IAnswersProvider, AnswersProvider>();
 | 
			
		||||
builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies()); //4/30
 | 
			
		||||
builder.Services.AddDbContext<AnswerDbContext>(option =>
 | 
			
		||||
{
 | 
			
		||||
    option.UseSqlServer("AnswerConnection");
 | 
			
		||||
    option.UseInMemoryDatabase("Answers");
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
var app = builder.Build();
 | 
			
		||||
@ -85,7 +35,7 @@ if (app.Environment.IsDevelopment())
 | 
			
		||||
    app.UseSwagger();
 | 
			
		||||
    app.UseSwaggerUI();
 | 
			
		||||
}
 | 
			
		||||
app.UseAuthentication();
 | 
			
		||||
 | 
			
		||||
app.UseAuthorization();
 | 
			
		||||
 | 
			
		||||
app.MapControllers();
 | 
			
		||||
 | 
			
		||||
@ -198,12 +198,13 @@ namespace DamageAssesment.Api.Answers.Providers
 | 
			
		||||
        {
 | 
			
		||||
            if (!answerDbContext.Answers.Any())
 | 
			
		||||
            {
 | 
			
		||||
                answerDbContext.Answers.Add(new Db.Answer() {  AnswerText = "Yes", Comment = "", QuestionId = 1, SurveyResponseId = 1 });
 | 
			
		||||
                answerDbContext.Answers.Add(new Db.Answer() {  AnswerText = "No", Comment = "myComment", QuestionId = 2, SurveyResponseId = 1 });
 | 
			
		||||
                //answerDbContext.Answers.Add(new Db.Answer() {  AnswerText = "No", Comment = "No Comment", QuestionId = 3, SurveyResponseId = 1 });
 | 
			
		||||
                //answerDbContext.Answers.Add(new Db.Answer() {  AnswerText = "Yes", Comment = "No Comment", QuestionId = 1, SurveyResponseId = 2 });
 | 
			
		||||
                //answerDbContext.Answers.Add(new Db.Answer() {  AnswerText = "No", Comment = "No Comment", QuestionId = 2, SurveyResponseId = 2 });
 | 
			
		||||
                //answerDbContext.Answers.Add(new Db.Answer() {  AnswerText = "No", Comment = "No Comment", QuestionId = 3, SurveyResponseId = 2 });
 | 
			
		||||
                answerDbContext.Answers.Add(new Db.Answer() { Id = 1, AnswerText = "Yes", Comment = "Comment test 4", QuestionId = 1, SurveyResponseId = 1 });
 | 
			
		||||
                answerDbContext.Answers.Add(new Db.Answer() { Id = 2, AnswerText = "No", Comment = "Comment test 5", QuestionId = 2, SurveyResponseId = 1 });
 | 
			
		||||
                // Uncomment the lines below to add more initial data if needed
 | 
			
		||||
                //answerDbContext.Answers.Add(new Db.Answer() { Id = 3, AnswerText = "No", Comment = "No Comment", QuestionId = 3, SurveyResponseId = 1 });
 | 
			
		||||
                //answerDbContext.Answers.Add(new Db.Answer() { Id = 4, AnswerText = "Yes", Comment = "No Comment", QuestionId = 1, SurveyResponseId = 2 });
 | 
			
		||||
                //answerDbContext.Answers.Add(new Db.Answer() { Id = 5, AnswerText = "No", Comment = "No Comment", QuestionId = 2, SurveyResponseId = 2 });
 | 
			
		||||
                //answerDbContext.Answers.Add(new Db.Answer() { Id = 6, AnswerText = "No", Comment = "No Comment", QuestionId = 3, SurveyResponseId = 2 });
 | 
			
		||||
                answerDbContext.SaveChanges();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@ -8,10 +8,5 @@
 | 
			
		||||
      "Microsoft.AspNetCore": "Warning"
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  "AllowedHosts": "*",
 | 
			
		||||
  "ConnectionStrings": {
 | 
			
		||||
    //"AnswerConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;"
 | 
			
		||||
    "AnswerConnection": "Server=tcp:da-dev.database.windows.net,1433;Initial Catalog=da-dev-db;Encrypt=True;User ID=admin-dev;Password=b3tgRABw8LGE75k;TrustServerCertificate=False;Connection Timeout=30;"
 | 
			
		||||
 | 
			
		||||
  }
 | 
			
		||||
  "AllowedHosts": "*"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -20,7 +20,7 @@ namespace DamageAssesment.Api.Attachments.Test
 | 
			
		||||
        public async Task GetAttachmentsAsync_ShouldReturnStatusCode200()
 | 
			
		||||
        {
 | 
			
		||||
            var mockAttachmentService = new Mock<IAttachmentsProvider>();
 | 
			
		||||
            var mockUploadService = new Mock<IAzureBlobService>();
 | 
			
		||||
            var mockUploadService = new Mock<IUploadService>();
 | 
			
		||||
            var mockResponse = await MockData.getOkResponse();
 | 
			
		||||
            mockAttachmentService.Setup(service => service.GetAttachmentsAsync()).ReturnsAsync(mockResponse);
 | 
			
		||||
            var AttachmentProvider = new AttachmentsController(mockAttachmentService.Object, mockUploadService.Object);
 | 
			
		||||
@ -33,7 +33,7 @@ namespace DamageAssesment.Api.Attachments.Test
 | 
			
		||||
        public async Task GetAttachmentsAsync_ShouldReturnStatusCode204()
 | 
			
		||||
        {
 | 
			
		||||
            var mockAttachmentService = new Mock<IAttachmentsProvider>();
 | 
			
		||||
            var mockUploadService = new Mock<IAzureBlobService>();
 | 
			
		||||
            var mockUploadService = new Mock<IUploadService>();
 | 
			
		||||
            var mockResponse = await MockData.getNoContentResponse();
 | 
			
		||||
            mockAttachmentService.Setup(service => service.GetAttachmentsAsync()).ReturnsAsync(mockResponse);
 | 
			
		||||
 | 
			
		||||
@ -47,7 +47,7 @@ namespace DamageAssesment.Api.Attachments.Test
 | 
			
		||||
        public async Task GetAttachmentAsync_ShouldReturnStatusCode200()
 | 
			
		||||
        {
 | 
			
		||||
            var mockAttachmentService = new Mock<IAttachmentsProvider>();
 | 
			
		||||
            var mockUploadService = new Mock<IAzureBlobService>();
 | 
			
		||||
            var mockUploadService = new Mock<IUploadService>();
 | 
			
		||||
            var mockResponse = await MockData.getOkResponse(1);
 | 
			
		||||
            mockAttachmentService.Setup(service => service.GetAttachmentByIdAsync(1)).ReturnsAsync(mockResponse);
 | 
			
		||||
 | 
			
		||||
@ -61,7 +61,7 @@ namespace DamageAssesment.Api.Attachments.Test
 | 
			
		||||
        public async Task GetAttachmentAsync_ShouldReturnStatusCode404()
 | 
			
		||||
        {
 | 
			
		||||
            var mockAttachmentService = new Mock<IAttachmentsProvider>();
 | 
			
		||||
            var mockUploadService = new Mock<IAzureBlobService>();
 | 
			
		||||
            var mockUploadService = new Mock<IUploadService>();
 | 
			
		||||
            var mockResponse = await MockData.getNotFoundResponse();
 | 
			
		||||
            mockAttachmentService.Setup(service => service.GetAttachmentByIdAsync(99)).ReturnsAsync(mockResponse);
 | 
			
		||||
            var AttachmentProvider = new AttachmentsController(mockAttachmentService.Object, mockUploadService.Object);
 | 
			
		||||
@ -73,7 +73,7 @@ namespace DamageAssesment.Api.Attachments.Test
 | 
			
		||||
        public async Task PostAttachmentAsync_ShouldReturnStatusCode200()
 | 
			
		||||
        {
 | 
			
		||||
            var mockAttachmentService = new Mock<IAttachmentsProvider>();
 | 
			
		||||
            var mockUploadService = new Mock<IAzureBlobService>();
 | 
			
		||||
            var mockUploadService = new Mock<IUploadService>();
 | 
			
		||||
            var mockResponse = await MockData.getOkResponse();
 | 
			
		||||
            var AttachmentResponse = await MockData.GetAttachmentInfo(0);
 | 
			
		||||
            var mockInputAttachment = await MockData.getInputAttachmentData();
 | 
			
		||||
@ -89,7 +89,7 @@ namespace DamageAssesment.Api.Attachments.Test
 | 
			
		||||
        public async Task PostAttachmentAsync_ShouldReturnStatusCode400()
 | 
			
		||||
        {
 | 
			
		||||
            var mockAttachmentService = new Mock<IAttachmentsProvider>();
 | 
			
		||||
            var mockUploadService = new Mock<IAzureBlobService>();
 | 
			
		||||
            var mockUploadService = new Mock<IUploadService>();
 | 
			
		||||
            var mockInputAttachment = await MockData.getInputAttachmentData();
 | 
			
		||||
            var mockResponse = await MockData.getBadRequestResponse();
 | 
			
		||||
            mockAttachmentService.Setup(service => service.PostAttachmentAsync(mockInputAttachment)).ReturnsAsync(mockResponse);
 | 
			
		||||
@ -105,7 +105,7 @@ namespace DamageAssesment.Api.Attachments.Test
 | 
			
		||||
        public async Task PutAttachmentAsync_ShouldReturnStatusCode200()
 | 
			
		||||
        {
 | 
			
		||||
            var mockAttachmentService = new Mock<IAttachmentsProvider>();
 | 
			
		||||
            var mockUploadService = new Mock<IAzureBlobService>();
 | 
			
		||||
            var mockUploadService = new Mock<IUploadService>();
 | 
			
		||||
            var mockResponse = await MockData.getOkResponse();
 | 
			
		||||
            var AttachmentResponse = await MockData.GetAttachmentInfo(1);
 | 
			
		||||
            var mockInputAttachment = await MockData.getInputAttachmentData();
 | 
			
		||||
@ -121,7 +121,7 @@ namespace DamageAssesment.Api.Attachments.Test
 | 
			
		||||
        public async Task PutAttachmentAsync_ShouldReturnStatusCode400()
 | 
			
		||||
        {
 | 
			
		||||
            var mockAttachmentService = new Mock<IAttachmentsProvider>();
 | 
			
		||||
            var mockUploadService = new Mock<IAzureBlobService>();
 | 
			
		||||
            var mockUploadService = new Mock<IUploadService>();
 | 
			
		||||
            var mockInputAttachment = await MockData.getInputAttachmentData();
 | 
			
		||||
            var mockResponse = await MockData.getBadRequestResponse();
 | 
			
		||||
            mockAttachmentService.Setup(service => service.PostAttachmentAsync(mockInputAttachment)).ReturnsAsync(mockResponse);
 | 
			
		||||
@ -136,7 +136,7 @@ namespace DamageAssesment.Api.Attachments.Test
 | 
			
		||||
        public async Task DeleteAttachmentAsync_ShouldReturnStatusCode200()
 | 
			
		||||
        {
 | 
			
		||||
            var mockAttachmentService = new Mock<IAttachmentsProvider>();
 | 
			
		||||
            var mockUploadService = new Mock<IAzureBlobService>();
 | 
			
		||||
            var mockUploadService = new Mock<IUploadService>();
 | 
			
		||||
            var mockResponse = await MockData.getOkResponse(1);
 | 
			
		||||
            mockAttachmentService.Setup(service => service.DeleteAttachmentAsync(1)).ReturnsAsync(mockResponse);
 | 
			
		||||
            mockUploadService.Setup(service => service.Deletefile(""));
 | 
			
		||||
@ -150,7 +150,7 @@ namespace DamageAssesment.Api.Attachments.Test
 | 
			
		||||
        public async Task DeleteAttachmentAsync_ShouldReturnStatusCode404()
 | 
			
		||||
        {
 | 
			
		||||
            var mockAttachmentService = new Mock<IAttachmentsProvider>();
 | 
			
		||||
            var mockUploadService = new Mock<IAzureBlobService>();
 | 
			
		||||
            var mockUploadService = new Mock<IUploadService>();
 | 
			
		||||
            var mockResponse = await MockData.getNotFoundResponse();
 | 
			
		||||
            mockAttachmentService.Setup(service => service.DeleteAttachmentAsync(1)).ReturnsAsync(mockResponse);
 | 
			
		||||
            var AttachmentProvider = new AttachmentsController(mockAttachmentService.Object, mockUploadService.Object);
 | 
			
		||||
 | 
			
		||||
@ -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,  IAzureBlobService azureBlobService)
 | 
			
		||||
        public AttachmentsController(IAttachmentsProvider AttachmentsProvider, IUploadService uploadService)
 | 
			
		||||
        {
 | 
			
		||||
            this.AttachmentProvider = AttachmentsProvider;
 | 
			
		||||
            this.azureBlobService = azureBlobService;
 | 
			
		||||
            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 = await azureBlobService.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 = await azureBlobService.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>
 | 
			
		||||
        /// Delete an existing attachment.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        [Authorize(Roles = "admin")]
 | 
			
		||||
        [HttpDelete("attachments/{id}")]
 | 
			
		||||
        public async Task<IActionResult> DeleteAttachment(int id)
 | 
			
		||||
        {
 | 
			
		||||
@ -150,7 +146,7 @@ namespace DamageAssesment.Api.Attachments.Controllers
 | 
			
		||||
            if (result.IsSuccess)
 | 
			
		||||
            {
 | 
			
		||||
                // deleting file from folder
 | 
			
		||||
                azureBlobService.Movefile(result.Attachment.URI);
 | 
			
		||||
                UploadService.Movefile(result.Attachment.URI);
 | 
			
		||||
                return Ok(result.Attachment);
 | 
			
		||||
            }
 | 
			
		||||
            return NotFound();
 | 
			
		||||
 | 
			
		||||
@ -0,0 +1 @@
 | 
			
		||||
sample
 | 
			
		||||
@ -14,19 +14,8 @@
 | 
			
		||||
    <PackageReference Include="Azure.Storage.Blobs" Version="12.16.0" />
 | 
			
		||||
    <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.21" />
 | 
			
		||||
    <PackageReference Include="Microsoft.AspNetCore.Hosting" Version="2.2.7" />
 | 
			
		||||
    <PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.9" />
 | 
			
		||||
    <PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.5" />
 | 
			
		||||
    <PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="7.0.5" />
 | 
			
		||||
    <PackageReference Include="Microsoft.AspNetCore.Hosting" Version="2.1.1" />
 | 
			
		||||
    <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.VisualStudio.Azure.Containers.Tools.Targets" Version="1.19.4" />
 | 
			
		||||
    <PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" />
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
 | 
			
		||||
@ -3,7 +3,6 @@ using System.ComponentModel.DataAnnotations.Schema;
 | 
			
		||||
 | 
			
		||||
namespace DamageAssesment.Api.Attachments.Db
 | 
			
		||||
{
 | 
			
		||||
    [Table("AnswerAttachments")]
 | 
			
		||||
    public class Attachment
 | 
			
		||||
    {
 | 
			
		||||
        [Key]
 | 
			
		||||
 | 
			
		||||
@ -1,19 +1,11 @@
 | 
			
		||||
using Microsoft.EntityFrameworkCore;
 | 
			
		||||
using Microsoft.Extensions.Configuration;
 | 
			
		||||
 | 
			
		||||
namespace DamageAssesment.Api.Attachments.Db
 | 
			
		||||
{
 | 
			
		||||
    public class AttachmentsDbContext:DbContext
 | 
			
		||||
    {
 | 
			
		||||
        private IConfiguration _Configuration { get; set; }
 | 
			
		||||
        public AttachmentsDbContext(DbContextOptions options, IConfiguration configuration) : base(options)
 | 
			
		||||
        public AttachmentsDbContext(DbContextOptions options) : base(options)
 | 
			
		||||
        {
 | 
			
		||||
            _Configuration = configuration;
 | 
			
		||||
        }
 | 
			
		||||
        protected override void OnConfiguring(DbContextOptionsBuilder options)
 | 
			
		||||
        {
 | 
			
		||||
            // connect to sql server with connection string from app settings
 | 
			
		||||
            options.UseSqlServer(_Configuration.GetConnectionString("AttachmentConnection"));
 | 
			
		||||
        }
 | 
			
		||||
        public DbSet<Db.Attachment> Attachments { get; set; }
 | 
			
		||||
        protected override void OnModelCreating(ModelBuilder modelBuilder)
 | 
			
		||||
 | 
			
		||||
@ -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,75 +1,25 @@
 | 
			
		||||
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);
 | 
			
		||||
var authkey = builder.Configuration.GetValue<string>("JwtSettings:securitykey");
 | 
			
		||||
builder.Services.AddAuthentication(item =>
 | 
			
		||||
{
 | 
			
		||||
    item.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
 | 
			
		||||
    item.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
 | 
			
		||||
}).AddJwtBearer(item =>
 | 
			
		||||
{
 | 
			
		||||
    item.RequireHttpsMetadata = true;
 | 
			
		||||
    item.SaveToken = true;
 | 
			
		||||
    item.TokenValidationParameters = new TokenValidationParameters()
 | 
			
		||||
    {
 | 
			
		||||
        ValidateIssuerSigningKey = true,
 | 
			
		||||
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(authkey)),
 | 
			
		||||
        ValidateIssuer = false,
 | 
			
		||||
        ValidateAudience = false,
 | 
			
		||||
        ClockSkew = TimeSpan.Zero
 | 
			
		||||
    };
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
// Add services to the container.
 | 
			
		||||
 | 
			
		||||
builder.Services.AddControllers();
 | 
			
		||||
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
 | 
			
		||||
builder.Services.AddEndpointsApiExplorer();
 | 
			
		||||
//builder.Services.AddSwaggerGen();
 | 
			
		||||
builder.Services.AddSwaggerGen(options =>
 | 
			
		||||
builder.Services.AddSwaggerGen(c =>
 | 
			
		||||
{
 | 
			
		||||
    // Include XML comments from your assembly
 | 
			
		||||
    var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
 | 
			
		||||
    var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
 | 
			
		||||
    options.IncludeXmlComments(xmlPath);
 | 
			
		||||
 | 
			
		||||
    OpenApiSecurityScheme securityDefinition = new OpenApiSecurityScheme()
 | 
			
		||||
    {
 | 
			
		||||
        Name = "Bearer",
 | 
			
		||||
        BearerFormat = "JWT",
 | 
			
		||||
        Scheme = "bearer",
 | 
			
		||||
        Description = "Specify the authorization token.",
 | 
			
		||||
        In = ParameterLocation.Header,
 | 
			
		||||
        Type = SecuritySchemeType.Http,
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    options.AddSecurityDefinition("jwt_auth", securityDefinition);
 | 
			
		||||
 | 
			
		||||
    // Make sure swagger UI requires a Bearer token specified
 | 
			
		||||
    OpenApiSecurityScheme securityScheme = new OpenApiSecurityScheme()
 | 
			
		||||
    {
 | 
			
		||||
        Reference = new OpenApiReference()
 | 
			
		||||
        {
 | 
			
		||||
            Id = "jwt_auth",
 | 
			
		||||
            Type = ReferenceType.SecurityScheme
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    OpenApiSecurityRequirement securityRequirements = new OpenApiSecurityRequirement()
 | 
			
		||||
    {
 | 
			
		||||
        {securityScheme, new string[] { }},
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    options.AddSecurityRequirement(securityRequirements);
 | 
			
		||||
    c.IncludeXmlComments(xmlPath);
 | 
			
		||||
});
 | 
			
		||||
builder.Services.AddScoped<IAttachmentsProvider, AttachmentsProvider>();
 | 
			
		||||
builder.Services.AddScoped<IUploadService, UploadService>();
 | 
			
		||||
@ -77,7 +27,7 @@ builder.Services.AddScoped<IAzureBlobService,AzureBlobService>();
 | 
			
		||||
builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies()); //4/30
 | 
			
		||||
builder.Services.AddDbContext<AttachmentsDbContext>(option =>
 | 
			
		||||
{
 | 
			
		||||
    option.UseSqlServer("AttachmentConnection");
 | 
			
		||||
    option.UseInMemoryDatabase("Attachments");
 | 
			
		||||
});
 | 
			
		||||
builder.Services.Configure<FormOptions>(o =>
 | 
			
		||||
{
 | 
			
		||||
@ -95,7 +45,6 @@ if (app.Environment.IsDevelopment())
 | 
			
		||||
    app.UseSwaggerUI();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
app.UseAuthentication();
 | 
			
		||||
app.UseAuthorization();
 | 
			
		||||
app.UseHttpsRedirection();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -21,7 +21,7 @@ namespace DamageAssesment.Api.Attachments.Providers
 | 
			
		||||
            this.logger = logger;
 | 
			
		||||
            this.mapper = mapper;
 | 
			
		||||
            this.uploadservice = uploadservice;
 | 
			
		||||
            //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();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,8 @@
 | 
			
		||||
{
 | 
			
		||||
  "Logging": {
 | 
			
		||||
    "LogLevel": {
 | 
			
		||||
      "Default": "Information",
 | 
			
		||||
      "Microsoft.AspNetCore": "Warning"
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@ -11,14 +11,6 @@
 | 
			
		||||
  "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"
 | 
			
		||||
  },
 | 
			
		||||
  "ConnectionStrings": {
 | 
			
		||||
    //"AttachmentConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;"
 | 
			
		||||
    "AttachmentConnection": "Server=tcp:da-dev.database.windows.net,1433;Initial Catalog=da-dev-db;Encrypt=True;User ID=admin-dev;Password=b3tgRABw8LGE75k;TrustServerCertificate=False;Connection Timeout=30;"
 | 
			
		||||
 | 
			
		||||
    "Deletepath": "DMS_Attachments/Deleted"
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
  
 | 
			
		||||
@ -15,9 +15,9 @@ namespace DamageAssesment.Api.DocuLinks.Test
 | 
			
		||||
        public async Task GetDocumentsLanguageAsync_ShouldReturnStatusCode204()
 | 
			
		||||
        {
 | 
			
		||||
            var mockDocumentService = new Mock<IDoculinkProvider>();
 | 
			
		||||
            var mockUploadService = new Mock<IAzureBlobService>();
 | 
			
		||||
            var mockUploadService = new Mock<IUploadService>();
 | 
			
		||||
            var mockResponse = await MockData.getNoContentResponse();
 | 
			
		||||
            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 = (NoContentResult)await DocumentProvider.GetDocumentsAsync("", "", null);
 | 
			
		||||
@ -29,7 +29,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
 | 
			
		||||
        public async Task GetDocumentsLinkTypeAsync_ShouldReturnStatusCode204()
 | 
			
		||||
        {
 | 
			
		||||
            var mockDocumentService = new Mock<IDoculinkProvider>();
 | 
			
		||||
            var mockUploadService = new Mock<IAzureBlobService>();
 | 
			
		||||
            var mockUploadService = new Mock<IUploadService>();
 | 
			
		||||
            var mockResponse = await MockData.getNoContentResponse();
 | 
			
		||||
            mockDocumentService.Setup(service => service.GetdocumentsByLinkAsync("forms", "en", true)).ReturnsAsync(mockResponse);
 | 
			
		||||
 | 
			
		||||
@ -42,12 +42,12 @@ namespace DamageAssesment.Api.DocuLinks.Test
 | 
			
		||||
        public async Task GetDocumentsAsync_ShouldReturnStatusCode200()
 | 
			
		||||
        {
 | 
			
		||||
            var mockDocumentService = new Mock<IDoculinkProvider>();
 | 
			
		||||
            var mockUploadService = new Mock<IAzureBlobService>();
 | 
			
		||||
            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);
 | 
			
		||||
        }
 | 
			
		||||
@ -55,7 +55,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
 | 
			
		||||
        public async Task GetActiveDocumentsAsync_ShouldReturnStatusCode200()
 | 
			
		||||
        {
 | 
			
		||||
            var mockDocumentService = new Mock<IDoculinkProvider>();
 | 
			
		||||
            var mockUploadService = new Mock<IAzureBlobService>();
 | 
			
		||||
            var mockUploadService = new Mock<IUploadService>();
 | 
			
		||||
            var mockResponse = await MockData.getOkResponses();
 | 
			
		||||
            mockDocumentService.Setup(service => service.GetdocumentsByLinkAsync("forms", "en", true)).ReturnsAsync(mockResponse);
 | 
			
		||||
 | 
			
		||||
@ -69,7 +69,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
 | 
			
		||||
        public async Task GetActiveDocumentsLinkTypeIdAsync_ShouldReturnStatusCode200()
 | 
			
		||||
        {
 | 
			
		||||
            var mockDocumentService = new Mock<IDoculinkProvider>();
 | 
			
		||||
            var mockUploadService = new Mock<IAzureBlobService>();
 | 
			
		||||
            var mockUploadService = new Mock<IUploadService>();
 | 
			
		||||
            var mockResponse = await MockData.getOkResponses();
 | 
			
		||||
            mockDocumentService.Setup(service => service.GetdocumentsByLinkTypeIdAsync(null, "en", true)).ReturnsAsync(mockResponse);
 | 
			
		||||
 | 
			
		||||
@ -82,7 +82,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
 | 
			
		||||
        public async Task GetDocumentsLinkTypeIdAsync_ShouldReturnStatusCode204()
 | 
			
		||||
        {
 | 
			
		||||
            var mockDocumentService = new Mock<IDoculinkProvider>();
 | 
			
		||||
            var mockUploadService = new Mock<IAzureBlobService>();
 | 
			
		||||
            var mockUploadService = new Mock<IUploadService>();
 | 
			
		||||
            var mockResponse = await MockData.getNoContentResponse();
 | 
			
		||||
            mockDocumentService.Setup(service => service.GetdocumentsByLinkTypeIdAsync(null, "en", true)).ReturnsAsync(mockResponse);
 | 
			
		||||
 | 
			
		||||
@ -95,9 +95,9 @@ namespace DamageAssesment.Api.DocuLinks.Test
 | 
			
		||||
        public async Task GetDocumentAsync_ShouldReturnStatusCode200()
 | 
			
		||||
        {
 | 
			
		||||
            var mockDocumentService = new Mock<IDoculinkProvider>();
 | 
			
		||||
            var mockUploadService = new Mock<IAzureBlobService>();
 | 
			
		||||
            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");
 | 
			
		||||
@ -109,7 +109,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
 | 
			
		||||
        public async Task GetDocumentAsync_ShouldReturnStatusCode404()
 | 
			
		||||
        {
 | 
			
		||||
            var mockDocumentService = new Mock<IDoculinkProvider>();
 | 
			
		||||
            var mockUploadService = new Mock<IAzureBlobService>();
 | 
			
		||||
            var mockUploadService = new Mock<IUploadService>();
 | 
			
		||||
            var mockResponse = await MockData.getNotFoundResponse();
 | 
			
		||||
            mockDocumentService.Setup(service => service.GetDocumentAsync(99, "forms", "en")).ReturnsAsync(mockResponse);
 | 
			
		||||
            var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object);
 | 
			
		||||
@ -120,7 +120,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
 | 
			
		||||
        public async Task PostDocumentAsync_ShouldReturnStatusCode200()
 | 
			
		||||
        {
 | 
			
		||||
            var mockDocumentService = new Mock<IDoculinkProvider>();
 | 
			
		||||
            var mockUploadService = new Mock<IAzureBlobService>();
 | 
			
		||||
            var mockUploadService = new Mock<IUploadService>();
 | 
			
		||||
            var mockResponse = await MockData.getOkResponse(1);
 | 
			
		||||
            var mockInputDocument = await MockData.getInputDocumentData();
 | 
			
		||||
            var DocumentResponse = await MockData.GetDocuLinksInfo(0);
 | 
			
		||||
@ -135,7 +135,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
 | 
			
		||||
        public async Task PostDocumentAsync_ShouldReturnStatusCode400()
 | 
			
		||||
        {
 | 
			
		||||
            var mockDocumentService = new Mock<IDoculinkProvider>();
 | 
			
		||||
            var mockUploadService = new Mock<IAzureBlobService>();
 | 
			
		||||
            var mockUploadService = new Mock<IUploadService>();
 | 
			
		||||
            var mockInputDocument = await MockData.getInputDocumentData();
 | 
			
		||||
            var mockResponse = await MockData.getBadRequestResponse();
 | 
			
		||||
            ReqDoculink documentInfo = null;
 | 
			
		||||
@ -150,13 +150,13 @@ namespace DamageAssesment.Api.DocuLinks.Test
 | 
			
		||||
        public async Task PutDocumentAsync_ShouldReturnStatusCode200()
 | 
			
		||||
        {
 | 
			
		||||
            var mockDocumentService = new Mock<IDoculinkProvider>();
 | 
			
		||||
            var mockUploadService = new Mock<IAzureBlobService>();
 | 
			
		||||
            var mockUploadService = new Mock<IUploadService>();
 | 
			
		||||
            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);
 | 
			
		||||
        }
 | 
			
		||||
@ -165,12 +165,12 @@ namespace DamageAssesment.Api.DocuLinks.Test
 | 
			
		||||
        public async Task PutDocumentAsync_ShouldReturnStatusCode400()
 | 
			
		||||
        {
 | 
			
		||||
            var mockDocumentService = new Mock<IDoculinkProvider>();
 | 
			
		||||
            var mockUploadService = new Mock<IAzureBlobService>();
 | 
			
		||||
            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);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@ -178,7 +178,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
 | 
			
		||||
        public async Task DeleteDocumentAsync_ShouldReturnStatusCode200()
 | 
			
		||||
        {
 | 
			
		||||
            var mockDocumentService = new Mock<IDoculinkProvider>();
 | 
			
		||||
            var mockUploadService = new Mock<IAzureBlobService>();
 | 
			
		||||
            var mockUploadService = new Mock<IUploadService>();
 | 
			
		||||
            var mockResponse = await MockData.getOkResponse(1);
 | 
			
		||||
            mockDocumentService.Setup(service => service.DeleteDocumentAsync(1)).ReturnsAsync(mockResponse);
 | 
			
		||||
            var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object);
 | 
			
		||||
@ -190,7 +190,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
 | 
			
		||||
        public async Task DeleteDocumentAsync_ShouldReturnStatusCode404()
 | 
			
		||||
        {
 | 
			
		||||
            var mockDocumentService = new Mock<IDoculinkProvider>();
 | 
			
		||||
            var mockUploadService = new Mock<IAzureBlobService>();
 | 
			
		||||
            var mockUploadService = new Mock<IUploadService>();
 | 
			
		||||
            var mockResponse = await MockData.getNotFoundResponse();
 | 
			
		||||
            mockDocumentService.Setup(service => service.DeleteDocumentAsync(1)).ReturnsAsync(mockResponse);
 | 
			
		||||
            var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object);
 | 
			
		||||
@ -206,7 +206,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
 | 
			
		||||
        public async Task GetDocumentCategoriesAsync_ShouldReturnStatusCode200()
 | 
			
		||||
        {
 | 
			
		||||
            var mockDocumentService = new Mock<IDoculinkProvider>();
 | 
			
		||||
            var mockUploadService = new Mock<IAzureBlobService>();
 | 
			
		||||
            var mockUploadService = new Mock<IUploadService>();
 | 
			
		||||
            var mockResponse = await LinkTypeMockData.getOkResponse();
 | 
			
		||||
            mockDocumentService.Setup(service => service.GetLinkTypesAsync("en")).ReturnsAsync(mockResponse);
 | 
			
		||||
            var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object);
 | 
			
		||||
@ -219,7 +219,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
 | 
			
		||||
        public async Task GetDocumentCategoriesAsync_ShouldReturnStatusCode204()
 | 
			
		||||
        {
 | 
			
		||||
            var mockDocumentService = new Mock<IDoculinkProvider>();
 | 
			
		||||
            var mockUploadService = new Mock<IAzureBlobService>();
 | 
			
		||||
            var mockUploadService = new Mock<IUploadService>();
 | 
			
		||||
            var mockResponse = await LinkTypeMockData.getNoContentResponse();
 | 
			
		||||
            mockDocumentService.Setup(service => service.GetLinkTypesAsync("en")).ReturnsAsync(mockResponse);
 | 
			
		||||
 | 
			
		||||
@ -233,9 +233,9 @@ namespace DamageAssesment.Api.DocuLinks.Test
 | 
			
		||||
        public async Task GetDocumentcategoryAsync_ShouldReturnStatusCode200()
 | 
			
		||||
        {
 | 
			
		||||
            var mockDocumentService = new Mock<IDoculinkProvider>();
 | 
			
		||||
            var mockUploadService = new Mock<IAzureBlobService>();
 | 
			
		||||
            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");
 | 
			
		||||
 | 
			
		||||
@ -246,7 +246,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
 | 
			
		||||
        public async Task GetDocumentcategoryAsync_ShouldReturnStatusCode404()
 | 
			
		||||
        {
 | 
			
		||||
            var mockDocumentService = new Mock<IDoculinkProvider>();
 | 
			
		||||
            var mockUploadService = new Mock<IAzureBlobService>();
 | 
			
		||||
            var mockUploadService = new Mock<IUploadService>();
 | 
			
		||||
            var mockResponse = await LinkTypeMockData.getNotFoundResponse();
 | 
			
		||||
            mockDocumentService.Setup(service => service.GetLinkTypeAsync(99, "en")).ReturnsAsync(mockResponse);
 | 
			
		||||
 | 
			
		||||
@ -259,7 +259,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
 | 
			
		||||
        public async Task PostDocumentcategoryAsync_ShouldReturnStatusCode200()
 | 
			
		||||
        {
 | 
			
		||||
            var mockDocumentService = new Mock<IDoculinkProvider>();
 | 
			
		||||
            var mockUploadService = new Mock<IAzureBlobService>();
 | 
			
		||||
            var mockUploadService = new Mock<IUploadService>();
 | 
			
		||||
            var mockResponse = await LinkTypeMockData.getOkResponse(1);
 | 
			
		||||
            var mockInputDocument = await LinkTypeMockData.getInputLinkData(0);
 | 
			
		||||
            mockDocumentService.Setup(service => service.PostLinkTypeAsync(mockInputDocument)).ReturnsAsync(mockResponse);
 | 
			
		||||
@ -273,7 +273,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
 | 
			
		||||
        public async Task PostDocumentcategoryAsync_ShouldReturnStatusCode400()
 | 
			
		||||
        {
 | 
			
		||||
            var mockDocumentService = new Mock<IDoculinkProvider>();
 | 
			
		||||
            var mockUploadService = new Mock<IAzureBlobService>();
 | 
			
		||||
            var mockUploadService = new Mock<IUploadService>();
 | 
			
		||||
            var mockInputDocument = await LinkTypeMockData.getInputLinkData(99);
 | 
			
		||||
            var mockResponse = await LinkTypeMockData.getBadRequestResponse();
 | 
			
		||||
            mockDocumentService.Setup(service => service.PostLinkTypeAsync(mockInputDocument)).ReturnsAsync(mockResponse);
 | 
			
		||||
@ -287,12 +287,12 @@ namespace DamageAssesment.Api.DocuLinks.Test
 | 
			
		||||
        public async Task PutDocumentcategoryAsync_ShouldReturnStatusCode200()
 | 
			
		||||
        {
 | 
			
		||||
            var mockDocumentService = new Mock<IDoculinkProvider>();
 | 
			
		||||
            var mockUploadService = new Mock<IAzureBlobService>();
 | 
			
		||||
            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);
 | 
			
		||||
        }
 | 
			
		||||
@ -301,12 +301,12 @@ namespace DamageAssesment.Api.DocuLinks.Test
 | 
			
		||||
        public async Task PutDocumentcategoryAsync_ShouldReturnStatusCode404()
 | 
			
		||||
        {
 | 
			
		||||
            var mockDocumentService = new Mock<IDoculinkProvider>();
 | 
			
		||||
            var mockUploadService = new Mock<IAzureBlobService>();
 | 
			
		||||
            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);
 | 
			
		||||
        }
 | 
			
		||||
@ -315,10 +315,10 @@ namespace DamageAssesment.Api.DocuLinks.Test
 | 
			
		||||
        public async Task PutDocumentcategoryAsync_ShouldReturnStatusCode400()
 | 
			
		||||
        {
 | 
			
		||||
            var mockDocumentService = new Mock<IDoculinkProvider>();
 | 
			
		||||
            var mockUploadService = new Mock<IAzureBlobService>();
 | 
			
		||||
            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);
 | 
			
		||||
 | 
			
		||||
@ -329,7 +329,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
 | 
			
		||||
        public async Task DeleteDocumentcategoryAsync_ShouldReturnStatusCode200()
 | 
			
		||||
        {
 | 
			
		||||
            var mockDocumentService = new Mock<IDoculinkProvider>();
 | 
			
		||||
            var mockUploadService = new Mock<IAzureBlobService>();
 | 
			
		||||
            var mockUploadService = new Mock<IUploadService>();
 | 
			
		||||
            var mockResponse = await LinkTypeMockData.getOkResponse(1);
 | 
			
		||||
 | 
			
		||||
            mockDocumentService.Setup(service => service.DeleteLinkTypeAsync(1)).ReturnsAsync(mockResponse);
 | 
			
		||||
@ -342,7 +342,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
 | 
			
		||||
        public async Task DeleteDocumentcategoryAsync_ShouldReturnStatusCode404()
 | 
			
		||||
        {
 | 
			
		||||
            var mockDocumentService = new Mock<IDoculinkProvider>();
 | 
			
		||||
            var mockUploadService = new Mock<IAzureBlobService>();
 | 
			
		||||
            var mockUploadService = new Mock<IUploadService>();
 | 
			
		||||
            var mockResponse = await LinkTypeMockData.getNotFoundResponse();
 | 
			
		||||
            mockDocumentService.Setup(service => service.DeleteLinkTypeAsync(1)).ReturnsAsync(mockResponse);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -14,28 +14,25 @@ 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()
 | 
			
		||||
                {
 | 
			
		||||
                    docName = "",
 | 
			
		||||
                    Path = "www.google.com",
 | 
			
		||||
                    IsAttachments = false,
 | 
			
		||||
                    Language = "en",
 | 
			
		||||
                    CustomOrder = 1
 | 
			
		||||
                    docName = "",Path="www.google.com",
 | 
			
		||||
                    IsAttachments=false,CustomOrder=1
 | 
			
		||||
                });
 | 
			
		||||
                list.Add(new DocuLinks.Models.ResDoculink()
 | 
			
		||||
                {
 | 
			
		||||
@ -43,10 +40,10 @@ namespace DamageAssesment.Api.DocuLinks.Test
 | 
			
		||||
                    Id = i,
 | 
			
		||||
                    linkTypeId = i,
 | 
			
		||||
                    IsActive = true,
 | 
			
		||||
                    titles = dicttitle,
 | 
			
		||||
                    description = dictdesc,
 | 
			
		||||
                    CustomOrder = i,
 | 
			
		||||
                    doclinksAttachments = doclinksAttachments
 | 
			
		||||
                    titles= dicttitle,
 | 
			
		||||
                    description=dictdesc,
 | 
			
		||||
                    CustomOrder=i,
 | 
			
		||||
                    doclinksAttachments= doclinksAttachments
 | 
			
		||||
                });
 | 
			
		||||
            }
 | 
			
		||||
           // List<ResDoculinks> doculinks = list.GroupBy(a => a.linkTypeId).Select(a => new ResDoculinks() { linkTypeId = a.Key, doculinks = a.ToList() }).ToList();
 | 
			
		||||
@ -123,8 +120,8 @@ namespace DamageAssesment.Api.DocuLinks.Test
 | 
			
		||||
        {
 | 
			
		||||
 | 
			
		||||
            List<FileModel> fileModels = new List<FileModel>();
 | 
			
		||||
            fileModels.Add(new FileModel() { FileName = "Sample", FileContent = "c2FtcGxl", FileExtension = ".txt", IsAttachments = true, CustomOrder = 1 });
 | 
			
		||||
            return new ReqDoculink() { Id = id, linkTypeId = 1, CustomOrder = 1, Files = fileModels };
 | 
			
		||||
            fileModels.Add( new FileModel() { FileName = "Sample", FileContent = "c2FtcGxl", FileExtension = ".txt",IsAttachments=true,CustomOrder=1 });
 | 
			
		||||
            return new ReqDoculink() { Id=id, linkTypeId = 1, CustomOrder = 1, Files = fileModels };
 | 
			
		||||
        }
 | 
			
		||||
        public static async Task<DocuLinks.Models.Doculink> getInputDocumentData()
 | 
			
		||||
        {
 | 
			
		||||
@ -134,14 +131,13 @@ namespace DamageAssesment.Api.DocuLinks.Test
 | 
			
		||||
                Language = "en",
 | 
			
		||||
                title = "tel",
 | 
			
		||||
                description = "Sample"
 | 
			
		||||
            });
 | 
			
		||||
            }); 
 | 
			
		||||
            List<DoculinkAttachments> doclinksAttachments = new List<DoculinkAttachments>();
 | 
			
		||||
            doclinksAttachments.Add(new DoculinkAttachments()
 | 
			
		||||
            {
 | 
			
		||||
                docName = "",
 | 
			
		||||
                Path = "www.google.com",
 | 
			
		||||
                IsAttachments = false,
 | 
			
		||||
                Language = "en",
 | 
			
		||||
                CustomOrder = 1
 | 
			
		||||
            });
 | 
			
		||||
            return new Models.Doculink
 | 
			
		||||
@ -149,9 +145,9 @@ namespace DamageAssesment.Api.DocuLinks.Test
 | 
			
		||||
                Id = 1,
 | 
			
		||||
                linkTypeId = 1,
 | 
			
		||||
                IsActive = true,
 | 
			
		||||
                CustomOrder = 1,
 | 
			
		||||
                CustomOrder=1,
 | 
			
		||||
                documentsTranslations = DocuLinksTranslations,
 | 
			
		||||
                doclinksAttachments = doclinksAttachments
 | 
			
		||||
                doclinksAttachments= doclinksAttachments
 | 
			
		||||
            };
 | 
			
		||||
        }
 | 
			
		||||
        public static async Task<List<DocuLinks.Models.Doculink>> getInputDocuLinksData()
 | 
			
		||||
@ -169,7 +165,6 @@ namespace DamageAssesment.Api.DocuLinks.Test
 | 
			
		||||
                docName = "",
 | 
			
		||||
                Path = "www.google.com",
 | 
			
		||||
                IsAttachments = false,
 | 
			
		||||
                Language="en",
 | 
			
		||||
                CustomOrder = 1
 | 
			
		||||
            });
 | 
			
		||||
            List<DocuLinks.Models.Doculink> DocuLinks = new List<Models.Doculink>();
 | 
			
		||||
 | 
			
		||||
@ -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,20 +12,18 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
 | 
			
		||||
    {
 | 
			
		||||
        private readonly IDoculinkProvider documentsProvider;
 | 
			
		||||
        private readonly IUploadService uploadService;
 | 
			
		||||
        private readonly IAzureBlobService azureBlobService;
 | 
			
		||||
 | 
			
		||||
        public DoculinkController(IDoculinkProvider documentsProvider, IAzureBlobService azureBlobService)
 | 
			
		||||
        public DoculinkController(IDoculinkProvider documentsProvider,IUploadService uploadService)
 | 
			
		||||
        {
 | 
			
		||||
 | 
			
		||||
            this.documentsProvider = documentsProvider;
 | 
			
		||||
            this.azureBlobService = azureBlobService;
 | 
			
		||||
            this.uploadService = uploadService; 
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 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)
 | 
			
		||||
@ -111,10 +104,9 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
 | 
			
		||||
            return NotFound();
 | 
			
		||||
        }
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Get all documents.
 | 
			
		||||
        /// Get all Doculink.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        
 | 
			
		||||
        [Authorize(Roles = "admin")]
 | 
			
		||||
        /// 
 | 
			
		||||
        [Route("doculinks")]
 | 
			
		||||
        [Route("doculinks/{linktype:alpha}")]
 | 
			
		||||
        [Route("doculinks/{linktype:alpha}/{language:alpha}")]
 | 
			
		||||
@ -162,7 +154,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}")]
 | 
			
		||||
@ -179,7 +170,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)
 | 
			
		||||
@ -190,7 +180,7 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
 | 
			
		||||
                if (dbdoc.IsSuccess)
 | 
			
		||||
                {
 | 
			
		||||
                    var documents = await this.documentsProvider.GetDocumentCounter();
 | 
			
		||||
                    Models.Doculink DocuLink= await azureBlobService.UpdateDocuments(documents.counter,dbdoc.Document, documentInfo);
 | 
			
		||||
                    Models.Doculink DocuLink= uploadService.UpdateDocuments(documents.counter,dbdoc.Document, documentInfo);
 | 
			
		||||
                    var result = await this.documentsProvider.UpdateDocumentAsync(id, DocuLink);
 | 
			
		||||
                    if (result.IsSuccess)
 | 
			
		||||
                    {
 | 
			
		||||
@ -205,7 +195,6 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Create new doclink.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
       // [Authorize(Roles = "admin")]
 | 
			
		||||
        [HttpPost]
 | 
			
		||||
        [Route("doculinks")]
 | 
			
		||||
        public async Task<IActionResult> CreateDocument(ReqDoculink documentInfo)
 | 
			
		||||
@ -214,8 +203,8 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
 | 
			
		||||
            {
 | 
			
		||||
                if (documentInfo != null)
 | 
			
		||||
                {
 | 
			
		||||
                    //var documents = await this.documentsProvider.GetDocumentCounter();
 | 
			
		||||
                    Models.Doculink DocuLink= await azureBlobService.UploadDocument(1, documentInfo);
 | 
			
		||||
                    var documents = await this.documentsProvider.GetDocumentCounter();
 | 
			
		||||
                    Models.Doculink DocuLink= uploadService.UploadDocument(documents.counter, documentInfo);
 | 
			
		||||
                    var result = await this.documentsProvider.PostDocumentAsync(DocuLink);
 | 
			
		||||
                    if (result.IsSuccess)
 | 
			
		||||
                    {
 | 
			
		||||
@ -233,7 +222,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)
 | 
			
		||||
@ -245,7 +233,7 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
 | 
			
		||||
                // deleting file from folder
 | 
			
		||||
                foreach (var item in result.Document.doclinksAttachments)
 | 
			
		||||
                {
 | 
			
		||||
                    azureBlobService.Movefile(item.Path);
 | 
			
		||||
                    uploadService.Movefile(item.Path);
 | 
			
		||||
                }
 | 
			
		||||
                return Ok(result.Document);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
@ -0,0 +1 @@
 | 
			
		||||
sample
 | 
			
		||||
@ -0,0 +1 @@
 | 
			
		||||
sample
 | 
			
		||||
@ -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">
 | 
			
		||||
 | 
			
		||||
@ -3,7 +3,6 @@ using System.ComponentModel.DataAnnotations.Schema;
 | 
			
		||||
 | 
			
		||||
namespace DamageAssesment.Api.DocuLinks.Db
 | 
			
		||||
{
 | 
			
		||||
    [Table("Doculinks")]
 | 
			
		||||
    public class Doculink
 | 
			
		||||
    {
 | 
			
		||||
        [Key]
 | 
			
		||||
 | 
			
		||||
@ -3,7 +3,6 @@ using System.ComponentModel.DataAnnotations;
 | 
			
		||||
 | 
			
		||||
namespace DamageAssesment.Api.DocuLinks.Db
 | 
			
		||||
{
 | 
			
		||||
    [Table("DoculinkAttachments")]
 | 
			
		||||
    public class DoculinkAttachments
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
@ -15,6 +14,5 @@ namespace DamageAssesment.Api.DocuLinks.Db
 | 
			
		||||
        public string Path { get; set; }
 | 
			
		||||
        public bool IsAttachments { get; set; }
 | 
			
		||||
        public int CustomOrder { get; set; }
 | 
			
		||||
        public string Language { get; set; }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -7,15 +7,8 @@ namespace DamageAssesment.Api.DocuLinks.Db
 | 
			
		||||
{
 | 
			
		||||
    public class DoculinkDbContext : DbContext
 | 
			
		||||
    {
 | 
			
		||||
        private IConfiguration _Configuration { get; set; }
 | 
			
		||||
        public DoculinkDbContext(DbContextOptions options, IConfiguration configuration) : base(options)
 | 
			
		||||
        public DoculinkDbContext(DbContextOptions options) : base(options)
 | 
			
		||||
        {
 | 
			
		||||
            _Configuration = configuration;
 | 
			
		||||
        }
 | 
			
		||||
        protected override void OnConfiguring(DbContextOptionsBuilder options)
 | 
			
		||||
        {
 | 
			
		||||
            // connect to sql server with connection string from app settings
 | 
			
		||||
            options.UseSqlServer(_Configuration.GetConnectionString("DoculinkConnection"));
 | 
			
		||||
        }
 | 
			
		||||
        public DbSet<Db.Doculink> Documents { get; set; }
 | 
			
		||||
        public DbSet<Db.LinkType> LinkTypes { get; set; }
 | 
			
		||||
 | 
			
		||||
@ -3,7 +3,6 @@ using System.ComponentModel.DataAnnotations.Schema;
 | 
			
		||||
 | 
			
		||||
namespace DamageAssesment.Api.DocuLinks.Db
 | 
			
		||||
{
 | 
			
		||||
    [Table("DoculinkTrans")]
 | 
			
		||||
    public class DoculinkTranslation
 | 
			
		||||
    {
 | 
			
		||||
        [Key]
 | 
			
		||||
 | 
			
		||||
@ -1,9 +1,7 @@
 | 
			
		||||
using System.ComponentModel.DataAnnotations;
 | 
			
		||||
using System.ComponentModel.DataAnnotations.Schema;
 | 
			
		||||
 | 
			
		||||
namespace DamageAssesment.Api.DocuLinks.Db
 | 
			
		||||
{
 | 
			
		||||
    [Table("DoculinkTypes")]
 | 
			
		||||
    public class LinkType
 | 
			
		||||
    {
 | 
			
		||||
        [Key]
 | 
			
		||||
 | 
			
		||||
@ -3,7 +3,6 @@ using System.ComponentModel.DataAnnotations;
 | 
			
		||||
 | 
			
		||||
namespace DamageAssesment.Api.DocuLinks.Db
 | 
			
		||||
{
 | 
			
		||||
    [Table("DoculinkTypeTrans")]
 | 
			
		||||
    public class LinksTranslation
 | 
			
		||||
    {
 | 
			
		||||
        [Key]
 | 
			
		||||
 | 
			
		||||
@ -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);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -8,7 +8,6 @@ namespace DamageAssesment.Api.DocuLinks.Models
 | 
			
		||||
        public string docName { get; set; }
 | 
			
		||||
        public string Path { get; set; }
 | 
			
		||||
        public bool IsAttachments { get; set; }
 | 
			
		||||
        public string Language { get; set; }
 | 
			
		||||
        public int CustomOrder { get; set; }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -17,7 +17,6 @@ namespace DamageAssesment.Api.DocuLinks.Models
 | 
			
		||||
        public string? FileExtension { get; set; }
 | 
			
		||||
        public int CustomOrder { get; set; }
 | 
			
		||||
        public string url { get;set; }
 | 
			
		||||
        public string Language { get; set; }
 | 
			
		||||
        public bool IsAttachments { get; set; }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -2,69 +2,19 @@ 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);
 | 
			
		||||
 | 
			
		||||
// Add services to the container.
 | 
			
		||||
var authkey = builder.Configuration.GetValue<string>("JwtSettings:securitykey");
 | 
			
		||||
builder.Services.AddAuthentication(item =>
 | 
			
		||||
{
 | 
			
		||||
    item.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
 | 
			
		||||
    item.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
 | 
			
		||||
}).AddJwtBearer(item =>
 | 
			
		||||
{
 | 
			
		||||
    item.RequireHttpsMetadata = true;
 | 
			
		||||
    item.SaveToken = true;
 | 
			
		||||
    item.TokenValidationParameters = new TokenValidationParameters()
 | 
			
		||||
    {
 | 
			
		||||
        ValidateIssuerSigningKey = true,
 | 
			
		||||
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(authkey)),
 | 
			
		||||
        ValidateIssuer = false,
 | 
			
		||||
        ValidateAudience = false,
 | 
			
		||||
        ClockSkew = TimeSpan.Zero
 | 
			
		||||
    };
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
builder.Services.AddControllers();
 | 
			
		||||
builder.Services.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();
 | 
			
		||||
@ -75,7 +25,7 @@ builder.Services.AddScoped<IAzureBlobService, AzureBlobService>();
 | 
			
		||||
builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies()); //4/30
 | 
			
		||||
builder.Services.AddDbContext<DoculinkDbContext>(option =>
 | 
			
		||||
{
 | 
			
		||||
    option.UseSqlServer("DoculinkConnection");
 | 
			
		||||
    option.UseInMemoryDatabase("DocumentConnection");
 | 
			
		||||
});
 | 
			
		||||
var app = builder.Build();
 | 
			
		||||
 | 
			
		||||
@ -86,7 +36,6 @@ if (app.Environment.IsDevelopment())
 | 
			
		||||
    app.UseSwaggerUI();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
app.UseAuthentication();
 | 
			
		||||
app.UseAuthorization();
 | 
			
		||||
 | 
			
		||||
app.MapControllers();
 | 
			
		||||
 | 
			
		||||
@ -1,129 +1,20 @@
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
{
 | 
			
		||||
    public class AzureBlobService : IAzureBlobService
 | 
			
		||||
    public class AzureBlobService: IAzureBlobService
 | 
			
		||||
    {
 | 
			
		||||
        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, Language = item.Language });
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                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, Language = item.Language });
 | 
			
		||||
                }
 | 
			
		||||
                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();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -6,8 +6,10 @@ using Microsoft.AspNetCore.Mvc;
 | 
			
		||||
using Microsoft.EntityFrameworkCore;
 | 
			
		||||
using Microsoft.EntityFrameworkCore.Metadata.Internal;
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Immutable;
 | 
			
		||||
using System.Diagnostics.Eventing.Reader;
 | 
			
		||||
using System.Reflection.Metadata;
 | 
			
		||||
using System.Xml;
 | 
			
		||||
using System.Xml.Linq;
 | 
			
		||||
 | 
			
		||||
namespace DamageAssesment.Api.DocuLinks.Providers
 | 
			
		||||
@ -19,22 +21,20 @@ namespace DamageAssesment.Api.DocuLinks.Providers
 | 
			
		||||
        private DoculinkDbContext DocumentDbContext;
 | 
			
		||||
        private ILogger<DoculinkProvider> logger;
 | 
			
		||||
        private IUploadService uploadservice;
 | 
			
		||||
        private IAzureBlobService azureBlobService;
 | 
			
		||||
        private IMapper mapper;
 | 
			
		||||
 | 
			
		||||
        public DoculinkProvider(DoculinkDbContext DocumentDbContext, ILogger<DoculinkProvider> logger, IMapper mapper, IUploadService uploadservice, IAzureBlobService azureBlobService)
 | 
			
		||||
        public DoculinkProvider(DoculinkDbContext DocumentDbContext, ILogger<DoculinkProvider> logger, IMapper mapper, IUploadService uploadservice)
 | 
			
		||||
        {
 | 
			
		||||
            this.DocumentDbContext = DocumentDbContext;
 | 
			
		||||
            this.logger = logger;
 | 
			
		||||
            this.mapper = mapper;
 | 
			
		||||
            this.uploadservice = uploadservice;
 | 
			
		||||
            this.azureBlobService = azureBlobService;
 | 
			
		||||
            //SeedData();
 | 
			
		||||
            SeedData();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        private async Task SeedDataAsync()
 | 
			
		||||
        private void SeedData()
 | 
			
		||||
        {
 | 
			
		||||
            if (!DocumentDbContext.LinkTypes.Any())
 | 
			
		||||
            {
 | 
			
		||||
@ -65,13 +65,20 @@ namespace DamageAssesment.Api.DocuLinks.Providers
 | 
			
		||||
                int counter = 0;
 | 
			
		||||
                for (int i = 1; i <= 4; i++)
 | 
			
		||||
                {
 | 
			
		||||
                    FileModel fileModel = new FileModel() { url = "www.google" + i + ".com", IsAttachments = false, CustomOrder = 1 };
 | 
			
		||||
                    ReqDoculink documentInfo = new ReqDoculink() { linkTypeId = i, CustomOrder = i, Files = new List<FileModel>() { fileModel } };
 | 
			
		||||
                    Db.DoculinkTranslation documents = new Db.DoculinkTranslation { DocumentId = i, title = "Test" + i, description = "ss" + i, Language = "en" };
 | 
			
		||||
                    Models.Doculink document = await azureBlobService.UploadDocument(counter, documentInfo);
 | 
			
		||||
                    int linkTypeId = 2;
 | 
			
		||||
                    FileModel fileModel = new FileModel();
 | 
			
		||||
                    if (i < 3)
 | 
			
		||||
                    {
 | 
			
		||||
                        linkTypeId = 1;
 | 
			
		||||
 | 
			
		||||
                        fileModel = new FileModel() { FileName = "Sample" + i, FileExtension = ".txt", FileContent = "c2FtcGxl", IsAttachments = true, CustomOrder = 1 };
 | 
			
		||||
                    }
 | 
			
		||||
                    else
 | 
			
		||||
                        fileModel = new FileModel() { url = "www.google" + i + ".com", IsAttachments = false, CustomOrder = 1 };
 | 
			
		||||
                    ReqDoculink documentInfo = new ReqDoculink() { linkTypeId = linkTypeId, CustomOrder = i, Files = new List<FileModel>() { fileModel } };
 | 
			
		||||
                    Models.Doculink document = uploadservice.UploadDocument(counter, documentInfo);
 | 
			
		||||
                    DocumentDbContext.Documents.Add(mapper.Map<Models.Doculink, Db.Doculink>(document));
 | 
			
		||||
                    DocumentDbContext.SaveChanges();
 | 
			
		||||
                    DocumentDbContext.DocumentsTranslations.AddRange(documents);
 | 
			
		||||
                    var dbattachments = mapper.Map<List<Models.DoculinkAttachments>, List<Db.DoculinkAttachments>>(document.doclinksAttachments);
 | 
			
		||||
                    dbattachments.ForEach(a => a.DocumentId = i);
 | 
			
		||||
                    DocumentDbContext.DoclinksAttachments.AddRange(dbattachments);
 | 
			
		||||
@ -79,6 +86,34 @@ namespace DamageAssesment.Api.DocuLinks.Providers
 | 
			
		||||
                    counter++;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            if (!DocumentDbContext.DocumentsTranslations.Any())
 | 
			
		||||
            {
 | 
			
		||||
                string[] titles = {
 | 
			
		||||
                         "Mobile App Damage Assessment Instructions",
 | 
			
		||||
                         "PC Damage Assessment Instructions",
 | 
			
		||||
                         "Emergency Evacuation centers",
 | 
			
		||||
                         "Mobile App Damage Assessment Instructions" };
 | 
			
		||||
                string[] esTranslations = {
 | 
			
		||||
                         "Instrucciones de Evaluación de Daños de la Aplicación Móvil",
 | 
			
		||||
                         "Instrucciones de Evaluación de Daños del PC",
 | 
			
		||||
                         "Centros de Evacuación de Emergencia",
 | 
			
		||||
                         "Instrucciones de Evaluación de Daños de la Aplicación Móvil"  };
 | 
			
		||||
                string[] frTranslations = {
 | 
			
		||||
                      "Instructions d'Évaluation des Dommages de l'Application Mobile",
 | 
			
		||||
                      "Instructions d'Évaluation des Dommages du PC",
 | 
			
		||||
                       "Centres d'Évacuation d'Urgence",
 | 
			
		||||
                       "Instructions d'Évaluation des Dommages de l'Application Mobile" };
 | 
			
		||||
                List<Db.DoculinkTranslation> documents = new List<Db.DoculinkTranslation>();
 | 
			
		||||
                for (int i = 0; i < 4; i++)
 | 
			
		||||
                {
 | 
			
		||||
                    documents.Add(new Db.DoculinkTranslation { DocumentId = i + 1, title = titles[i], description = titles[i], Language = "en" });
 | 
			
		||||
                    documents.Add(new Db.DoculinkTranslation { DocumentId = i + 1, title = esTranslations[i], description = esTranslations[i], Language = "es" });
 | 
			
		||||
                    documents.Add(new Db.DoculinkTranslation { DocumentId = i + 1, title = frTranslations[i], description = frTranslations[i], Language = "fr" });
 | 
			
		||||
                }
 | 
			
		||||
                DocumentDbContext.DocumentsTranslations.AddRange(documents);
 | 
			
		||||
                DocumentDbContext.SaveChanges();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
        public List<Models.DoculinkTranslation> GetDocumentTranslations(int id, string? language)
 | 
			
		||||
        {
 | 
			
		||||
@ -135,19 +170,7 @@ namespace DamageAssesment.Api.DocuLinks.Providers
 | 
			
		||||
            MultiLanguage = dicttitle;
 | 
			
		||||
            return MultiLanguage;
 | 
			
		||||
        }
 | 
			
		||||
        private List<Models.DoculinkAttachments> GetDocumentAttachment(int id, string? language)
 | 
			
		||||
        {
 | 
			
		||||
            if (string.IsNullOrEmpty(language))
 | 
			
		||||
            {
 | 
			
		||||
                return mapper.Map<List<Db.DoculinkAttachments>, List<Models.DoculinkAttachments>>(
 | 
			
		||||
                    DocumentDbContext.DoclinksAttachments.AsNoTracking().Where(a => a.DocumentId == id).ToList());
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                return mapper.Map<List<Db.DoculinkAttachments>, List<Models.DoculinkAttachments>>(
 | 
			
		||||
                DocumentDbContext.DoclinksAttachments.AsNoTracking().Where(a => a.DocumentId == id && a.Language == language).ToList());
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public async Task<(bool IsSuccess, IEnumerable<Models.ResDoculink> documents, string ErrorMessage)> GetdocumentsByLinkTypeIdAsync(int? linkTypeId, string? language, bool? isactive)
 | 
			
		||||
        {
 | 
			
		||||
 | 
			
		||||
@ -155,7 +178,7 @@ namespace DamageAssesment.Api.DocuLinks.Providers
 | 
			
		||||
            {
 | 
			
		||||
                logger?.LogInformation("Query Question");
 | 
			
		||||
                var documents = new List<Db.Doculink>();
 | 
			
		||||
                if (linkTypeId == null)
 | 
			
		||||
                if (linkTypeId==null)
 | 
			
		||||
                    documents = await DocumentDbContext.Documents.AsNoTracking().Where(q => (isactive == null || q.IsActive == isactive.Value)).ToListAsync();
 | 
			
		||||
                else
 | 
			
		||||
                    documents = await DocumentDbContext.Documents.AsNoTracking().Where(q => (isactive == null || q.IsActive == isactive.Value) &&
 | 
			
		||||
@ -169,9 +192,10 @@ namespace DamageAssesment.Api.DocuLinks.Providers
 | 
			
		||||
                        item.titles = multilan.titles;
 | 
			
		||||
                        item.description = multilan.description;
 | 
			
		||||
                        item.linktypes = CreateMultiLanguageLinkTypeObject(GetLinkTypeTranslations(item.linkTypeId, language));
 | 
			
		||||
                        item.doclinksAttachments = GetDocumentAttachment(item.Id, language);
 | 
			
		||||
                        item.doclinksAttachments = mapper.Map<List<Db.DoculinkAttachments>, List<Models.DoculinkAttachments>>(
 | 
			
		||||
                            DocumentDbContext.DoclinksAttachments.AsNoTracking().Where(a => a.DocumentId == item.Id).ToList());
 | 
			
		||||
                    }
 | 
			
		||||
                    // List<ResDoculinks> doculinks = result.GroupBy(a => a.linkTypeId).Select(a => new ResDoculinks() { linkTypeId = a.Key, doculinks = a.ToList() }).ToList();
 | 
			
		||||
                   // List<ResDoculinks> doculinks = result.GroupBy(a => a.linkTypeId).Select(a => new ResDoculinks() { linkTypeId = a.Key, doculinks = a.ToList() }).ToList();
 | 
			
		||||
                    return (true, result, null);
 | 
			
		||||
                }
 | 
			
		||||
                return (false, null, "Not found");
 | 
			
		||||
@ -204,8 +228,10 @@ namespace DamageAssesment.Api.DocuLinks.Providers
 | 
			
		||||
                        item.titles = multilan.titles;
 | 
			
		||||
                        item.description = multilan.description;
 | 
			
		||||
                        item.linktypes = CreateMultiLanguageLinkTypeObject(GetLinkTypeTranslations(item.linkTypeId, language));
 | 
			
		||||
                        item.doclinksAttachments = GetDocumentAttachment(item.Id, language);
 | 
			
		||||
                        item.doclinksAttachments = mapper.Map<List<Db.DoculinkAttachments>, List<Models.DoculinkAttachments>>(
 | 
			
		||||
                            DocumentDbContext.DoclinksAttachments.AsNoTracking().Where(a => a.DocumentId == item.Id).ToList());
 | 
			
		||||
                    }
 | 
			
		||||
                    //List<ResDoculinks> doculinks =  result.GroupBy(a => a.linkTypeId).Select(a => new ResDoculinks() { linkTypeId = a.Key, doculinks = a.ToList() }).ToList();
 | 
			
		||||
                    return (true, result, null);
 | 
			
		||||
                }
 | 
			
		||||
                return (false, null, "Not found");
 | 
			
		||||
@ -258,7 +284,8 @@ namespace DamageAssesment.Api.DocuLinks.Providers
 | 
			
		||||
                    result.documentsTranslations = mapper.Map<List<Db.DoculinkTranslation>, List<Models.DoculinkTranslation>>(
 | 
			
		||||
                            DocumentDbContext.DocumentsTranslations.Where(a => a.DocumentId == result.Id).ToList());
 | 
			
		||||
 | 
			
		||||
                    result.doclinksAttachments = GetDocumentAttachment(id, "");
 | 
			
		||||
                    result.doclinksAttachments = mapper.Map<List<Db.DoculinkAttachments>, List<Models.DoculinkAttachments>>(
 | 
			
		||||
                        DocumentDbContext.DoclinksAttachments.AsNoTracking().Where(a => a.DocumentId == id).ToList());
 | 
			
		||||
                    return (true, result, null);
 | 
			
		||||
                }
 | 
			
		||||
                return (false, null, "Not found");
 | 
			
		||||
@ -290,7 +317,8 @@ namespace DamageAssesment.Api.DocuLinks.Providers
 | 
			
		||||
                    result.linktypes = CreateMultiLanguageLinkTypeObject(GetLinkTypeTranslations(result.linkTypeId, language));
 | 
			
		||||
                    result.titles = multilan.titles;
 | 
			
		||||
                    result.description = multilan.description;
 | 
			
		||||
                    result.doclinksAttachments = GetDocumentAttachment(id, language);
 | 
			
		||||
                    result.doclinksAttachments = mapper.Map<List<Db.DoculinkAttachments>, List<Models.DoculinkAttachments>>(
 | 
			
		||||
                        DocumentDbContext.DoclinksAttachments.AsNoTracking().Where(a => a.DocumentId == id).ToList());
 | 
			
		||||
                    return (true, result, null);
 | 
			
		||||
                }
 | 
			
		||||
                return (false, null, "Not found");
 | 
			
		||||
@ -401,7 +429,8 @@ namespace DamageAssesment.Api.DocuLinks.Providers
 | 
			
		||||
                result.titles = multilan.titles;
 | 
			
		||||
                result.description = multilan.description;
 | 
			
		||||
                result.linktypes = CreateMultiLanguageLinkTypeObject(GetLinkTypeTranslations(result.linkTypeId, ""));
 | 
			
		||||
                result.doclinksAttachments = GetDocumentAttachment(id, "");
 | 
			
		||||
                result.doclinksAttachments = mapper.Map<List<Db.DoculinkAttachments>, List<Models.DoculinkAttachments>>(
 | 
			
		||||
                    DocumentDbContext.DoclinksAttachments.AsNoTracking().Where(a => a.DocumentId == id).ToList());
 | 
			
		||||
                Document.IsActive = false;
 | 
			
		||||
                DocumentDbContext.Documents.Update(Document);
 | 
			
		||||
                DocumentDbContext.SaveChanges();
 | 
			
		||||
@ -419,7 +448,7 @@ namespace DamageAssesment.Api.DocuLinks.Providers
 | 
			
		||||
        {
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                int AttachmentId = DocumentDbContext.Documents.Max(a => a.Id);
 | 
			
		||||
                int AttachmentId = DocumentDbContext.DoclinksAttachments.Max(a => a.Id);
 | 
			
		||||
                return (true, AttachmentId, "");
 | 
			
		||||
            }
 | 
			
		||||
            catch (Exception ex)
 | 
			
		||||
 | 
			
		||||
@ -30,9 +30,9 @@ namespace DamageAssesment.Api.DocuLinks.Providers
 | 
			
		||||
        {
 | 
			
		||||
            Models.Doculink Documents = new Models.Doculink();
 | 
			
		||||
            List<Models.DoculinkAttachments> attachments = new List<Models.DoculinkAttachments>();
 | 
			
		||||
            try
 | 
			
		||||
            try 
 | 
			
		||||
            {
 | 
			
		||||
                string path = "", UserfileName = "";
 | 
			
		||||
                string path = "", UserfileName="";
 | 
			
		||||
                var fullDirectoryPath = Path.Combine(Directory.GetCurrentDirectory(), uploadpath);
 | 
			
		||||
                if (!Directory.Exists(fullDirectoryPath)) //Create deirectory if does not exist
 | 
			
		||||
                    Directory.CreateDirectory(fullDirectoryPath);
 | 
			
		||||
@ -51,27 +51,20 @@ namespace DamageAssesment.Api.DocuLinks.Providers
 | 
			
		||||
                        }
 | 
			
		||||
                        else
 | 
			
		||||
                            path = item.url;
 | 
			
		||||
                        attachments.Add(new Models.DoculinkAttachments { docName = UserfileName, Path = path, IsAttachments = item.IsAttachments, CustomOrder = item.CustomOrder, Language = item.Language });
 | 
			
		||||
                        attachments.Add(new Models.DoculinkAttachments { docName=UserfileName,Path=path,IsAttachments=item.IsAttachments,CustomOrder=item.CustomOrder });
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                Documents = new Models.Doculink()
 | 
			
		||||
                {
 | 
			
		||||
                    linkTypeId = documentInfo.linkTypeId,
 | 
			
		||||
                    documentsTranslations = documentInfo.documentsTranslations,
 | 
			
		||||
                    doclinksAttachments = attachments,
 | 
			
		||||
                    IsDeleted = false,
 | 
			
		||||
                    CustomOrder = documentInfo.CustomOrder,
 | 
			
		||||
                    IsActive = true
 | 
			
		||||
                };
 | 
			
		||||
 | 
			
		||||
                Documents=new Models.Doculink (){ linkTypeId = documentInfo.linkTypeId,
 | 
			
		||||
                    documentsTranslations = documentInfo.documentsTranslations,doclinksAttachments=attachments,
 | 
			
		||||
                    IsDeleted=false,CustomOrder=documentInfo.CustomOrder, IsActive =true};
 | 
			
		||||
            
 | 
			
		||||
                return Documents;
 | 
			
		||||
            }
 | 
			
		||||
            catch (Exception ex)
 | 
			
		||||
            {
 | 
			
		||||
            catch (Exception ex) {
 | 
			
		||||
                return new Models.Doculink();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
           
 | 
			
		||||
        }
 | 
			
		||||
        public Models.Doculink UpdateDocuments(int counter, Models.Doculink document, ReqDoculink documentInfo)
 | 
			
		||||
        {
 | 
			
		||||
@ -87,28 +80,27 @@ 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);
 | 
			
		||||
                        var fileName = String.Format("Document_{0}_{1}{2}", document.Id, counter1, item.FileExtension);
 | 
			
		||||
                        var fileName = String.Format("Document_{0}{1}", counter, item.FileExtension);
 | 
			
		||||
                        path = Path.Combine(fullDirectoryPath, fileName);
 | 
			
		||||
                        File.WriteAllBytes(path, Convert.FromBase64String(item.FileContent));
 | 
			
		||||
                        counter1++;
 | 
			
		||||
                    }
 | 
			
		||||
                    else
 | 
			
		||||
                        path = item.url;
 | 
			
		||||
                    attachments.Add(new Models.DoculinkAttachments { docName = UserfileName, Path = path, IsAttachments = item.IsAttachments, CustomOrder = item.CustomOrder, Language = item.Language });
 | 
			
		||||
                    attachments.Add(new Models.DoculinkAttachments { docName = UserfileName, Path = path,IsAttachments=item.IsAttachments,CustomOrder=item.CustomOrder });
 | 
			
		||||
                }
 | 
			
		||||
                Models.Doculink Documents = new Models.Doculink()
 | 
			
		||||
                {
 | 
			
		||||
                    Id = documentInfo.Id,
 | 
			
		||||
                    linkTypeId = documentInfo.linkTypeId,
 | 
			
		||||
                    documentsTranslations = documentInfo.documentsTranslations,
 | 
			
		||||
                    documentsTranslations=documentInfo.documentsTranslations,
 | 
			
		||||
                    IsActive = true,
 | 
			
		||||
                    IsDeleted = false,
 | 
			
		||||
                    IsDeleted=false,
 | 
			
		||||
                    CustomOrder = documentInfo.CustomOrder,
 | 
			
		||||
                    doclinksAttachments = attachments
 | 
			
		||||
                };
 | 
			
		||||
@ -116,8 +108,7 @@ namespace DamageAssesment.Api.DocuLinks.Providers
 | 
			
		||||
                return Documents;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            catch (Exception ex)
 | 
			
		||||
            {
 | 
			
		||||
             catch (Exception ex) {
 | 
			
		||||
                return new Models.Doculink();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
@ -126,7 +117,7 @@ namespace DamageAssesment.Api.DocuLinks.Providers
 | 
			
		||||
            if (path != "")
 | 
			
		||||
            {
 | 
			
		||||
                FileInfo file = new FileInfo(path);
 | 
			
		||||
                if (file?.Exists ?? false)//check file exsit or not  
 | 
			
		||||
                if (file?.Exists??false)//check file exsit or not  
 | 
			
		||||
                {
 | 
			
		||||
                    file.Delete();
 | 
			
		||||
                }
 | 
			
		||||
@ -142,8 +133,8 @@ namespace DamageAssesment.Api.DocuLinks.Providers
 | 
			
		||||
                FileInfo file = new FileInfo(path);
 | 
			
		||||
                if (file?.Exists ?? false)//check file exsit or not  
 | 
			
		||||
                {
 | 
			
		||||
                    string filename = file.Name.Replace(file.Extension, " ") + DateTime.Now.ToShortDateString().Replace("/", "_") + file.Extension;
 | 
			
		||||
                    file.MoveTo(pathToSave + "\\" + filename);
 | 
			
		||||
                    string filename = file.Name.Replace(file.Extension, " ") + DateTime.Now.ToShortDateString().Replace("/","_") + file.Extension;
 | 
			
		||||
                    file.MoveTo(pathToSave+"\\"+ filename);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@ -0,0 +1,8 @@
 | 
			
		||||
{
 | 
			
		||||
  "Logging": {
 | 
			
		||||
    "LogLevel": {
 | 
			
		||||
      "Default": "Information",
 | 
			
		||||
      "Microsoft.AspNetCore": "Warning"
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@ -1,7 +1,4 @@
 | 
			
		||||
{
 | 
			
		||||
  "JwtSettings": {
 | 
			
		||||
    "securitykey": "bWlhbWkgZGFkZSBzY2hvb2xzIHNlY3JldCBrZXk="
 | 
			
		||||
  },
 | 
			
		||||
  "Logging": {
 | 
			
		||||
    "LogLevel": {
 | 
			
		||||
      "Default": "Information",
 | 
			
		||||
@ -9,15 +6,8 @@
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  "AllowedHosts": "*",
 | 
			
		||||
  "ConnectionStrings": {
 | 
			
		||||
    //"DoculinkConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;"
 | 
			
		||||
    "DoculinkConnection": "Server=tcp:da-dev.database.windows.net,1433;Initial Catalog=da-dev-db;Encrypt=True;User ID=admin-dev;Password=b3tgRABw8LGE75k;TrustServerCertificate=False;Connection Timeout=30;"
 | 
			
		||||
 | 
			
		||||
  },
 | 
			
		||||
  "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)
 | 
			
		||||
        {
 | 
			
		||||
 | 
			
		||||
@ -12,18 +12,8 @@
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="12.0.1" />
 | 
			
		||||
    <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.21" />
 | 
			
		||||
    <PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.9" />
 | 
			
		||||
    <PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.5" />
 | 
			
		||||
    <PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="7.0.5" />
 | 
			
		||||
    <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.VisualStudio.Azure.Containers.Tools.Targets" Version="1.19.4" />
 | 
			
		||||
    <PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" />
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
 | 
			
		||||
@ -1,9 +1,7 @@
 | 
			
		||||
using System.ComponentModel.DataAnnotations;
 | 
			
		||||
using System.ComponentModel.DataAnnotations.Schema;
 | 
			
		||||
 | 
			
		||||
namespace DamageAssesment.Api.Employees.Db
 | 
			
		||||
{
 | 
			
		||||
    [Table("Employees")]
 | 
			
		||||
    public class Employee
 | 
			
		||||
    {
 | 
			
		||||
        [Key]
 | 
			
		||||
 | 
			
		||||
@ -4,23 +4,18 @@ namespace DamageAssesment.Api.Employees.Db
 | 
			
		||||
{
 | 
			
		||||
    public class EmployeeDbContext: DbContext
 | 
			
		||||
    {
 | 
			
		||||
        private IConfiguration _Configuration { get; set; }
 | 
			
		||||
        public EmployeeDbContext(DbContextOptions options, IConfiguration configuration) : base(options)
 | 
			
		||||
        public DbSet<Db.Employee> Employees { get; set; }
 | 
			
		||||
        public EmployeeDbContext(DbContextOptions options) : base(options)
 | 
			
		||||
        {
 | 
			
		||||
            _Configuration = configuration;
 | 
			
		||||
        }
 | 
			
		||||
        protected override void OnConfiguring(DbContextOptionsBuilder options)
 | 
			
		||||
        {
 | 
			
		||||
            // connect to sql server with connection string from app settings
 | 
			
		||||
            options.UseSqlServer(_Configuration.GetConnectionString("EmployeeConnection"));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        protected override void OnModelCreating(ModelBuilder modelBuilder)
 | 
			
		||||
        {
 | 
			
		||||
            base.OnModelCreating(modelBuilder);
 | 
			
		||||
 | 
			
		||||
            modelBuilder.Entity<Employee>()
 | 
			
		||||
                .Property(item => item.Id)
 | 
			
		||||
                .ValueGeneratedOnAdd();
 | 
			
		||||
        }
 | 
			
		||||
        public DbSet<Db.Employee> Employees { get; set; }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1,81 +1,30 @@
 | 
			
		||||
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);
 | 
			
		||||
 | 
			
		||||
// 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 =>
 | 
			
		||||
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>();
 | 
			
		||||
builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies()); //4/30
 | 
			
		||||
builder.Services.AddDbContext<EmployeeDbContext>(option =>
 | 
			
		||||
{
 | 
			
		||||
    option.UseSqlServer("EmployeeConnection");
 | 
			
		||||
    option.UseInMemoryDatabase("Employees");
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
var app = builder.Build();
 | 
			
		||||
@ -94,7 +43,6 @@ if (app.Environment.IsDevelopment())
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
app.UseAuthentication();
 | 
			
		||||
app.UseAuthorization();
 | 
			
		||||
 | 
			
		||||
app.MapControllers();
 | 
			
		||||
 | 
			
		||||
@ -77,8 +77,7 @@ namespace DamageAssesment.Api.Employees.Providers
 | 
			
		||||
                    EmployeeDbContext.Employees.Add(_employee);
 | 
			
		||||
                    Employee.Id = _employee.Id;
 | 
			
		||||
                    EmployeeDbContext.SaveChanges();
 | 
			
		||||
                    //return (true, Employee, null);
 | 
			
		||||
                    return (true, mapper.Map<Db.Employee, Models.Employee>(_employee), null);
 | 
			
		||||
                    return (true, Employee, null);
 | 
			
		||||
                }
 | 
			
		||||
                return (false, null, "Employee code is already exits");
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
@ -0,0 +1,8 @@
 | 
			
		||||
{
 | 
			
		||||
  "Logging": {
 | 
			
		||||
    "LogLevel": {
 | 
			
		||||
      "Default": "Information",
 | 
			
		||||
      "Microsoft.AspNetCore": "Warning"
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@ -9,9 +9,9 @@
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  "AllowedHosts": "*",
 | 
			
		||||
  "ConnectionStrings": {
 | 
			
		||||
    //"EmployeeConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;"
 | 
			
		||||
    "EmployeeConnection": "Server=tcp:da-dev.database.windows.net,1433;Initial Catalog=da-dev-db;Encrypt=True;User ID=admin-dev;Password=b3tgRABw8LGE75k;TrustServerCertificate=False;Connection Timeout=30;"
 | 
			
		||||
 | 
			
		||||
  "settings": {
 | 
			
		||||
    "endpoint1": "xxx",
 | 
			
		||||
    "endpoint2": "xxx",
 | 
			
		||||
    "endpoint3": "xxx"
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -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)
 | 
			
		||||
        {
 | 
			
		||||
 | 
			
		||||
@ -11,17 +11,6 @@
 | 
			
		||||
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="12.0.1" />
 | 
			
		||||
    <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.AspNetCore.Authentication.JwtBearer" Version="6.0.21" />
 | 
			
		||||
    <PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.5" />
 | 
			
		||||
    <PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="7.0.5" />
 | 
			
		||||
 | 
			
		||||
@ -3,7 +3,6 @@ using System.ComponentModel.DataAnnotations.Schema;
 | 
			
		||||
 | 
			
		||||
namespace DamageAssesment.Api.Locations.Db
 | 
			
		||||
{
 | 
			
		||||
    [Table("Locations")]
 | 
			
		||||
    public class Location
 | 
			
		||||
    {
 | 
			
		||||
        [Key]
 | 
			
		||||
@ -21,6 +20,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; }
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -4,16 +4,6 @@ namespace DamageAssesment.Api.Locations.Db
 | 
			
		||||
{
 | 
			
		||||
    public class LocationDbContext : DbContext
 | 
			
		||||
    {
 | 
			
		||||
        private IConfiguration _Configuration { get; set; }
 | 
			
		||||
        public LocationDbContext(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("LocationConnection"));
 | 
			
		||||
        }
 | 
			
		||||
        public DbSet<Db.Location> Locations { get; set; }
 | 
			
		||||
        public DbSet<Db.Region> Regions { get; set; }
 | 
			
		||||
        public LocationDbContext(DbContextOptions options) : base(options)
 | 
			
		||||
 | 
			
		||||
@ -1,9 +1,7 @@
 | 
			
		||||
using System.ComponentModel.DataAnnotations;
 | 
			
		||||
using System.ComponentModel.DataAnnotations.Schema;
 | 
			
		||||
 | 
			
		||||
namespace DamageAssesment.Api.Locations.Db
 | 
			
		||||
{
 | 
			
		||||
    [Table("Regions")]
 | 
			
		||||
    public class Region
 | 
			
		||||
    {
 | 
			
		||||
        [Key]
 | 
			
		||||
 | 
			
		||||
@ -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,85 +1,32 @@
 | 
			
		||||
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);
 | 
			
		||||
 | 
			
		||||
// 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 =>
 | 
			
		||||
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>();
 | 
			
		||||
builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies()); //4/30
 | 
			
		||||
builder.Services.AddDbContext<LocationDbContext>(option =>
 | 
			
		||||
{
 | 
			
		||||
    option.UseSqlServer("LocationConnection");
 | 
			
		||||
    option.UseInMemoryDatabase("Locations");
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
var app = builder.Build();
 | 
			
		||||
// Add services to the container.
 | 
			
		||||
 | 
			
		||||
// Configure the HTTP request pipeline.
 | 
			
		||||
if (app.Environment.IsDevelopment())
 | 
			
		||||
@ -97,7 +44,6 @@ if (app.Environment.IsDevelopment())
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
app.UseAuthentication();
 | 
			
		||||
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" });
 | 
			
		||||
 | 
			
		||||
@ -0,0 +1,8 @@
 | 
			
		||||
{
 | 
			
		||||
  "Logging": {
 | 
			
		||||
    "LogLevel": {
 | 
			
		||||
      "Default": "Information",
 | 
			
		||||
      "Microsoft.AspNetCore": "Warning"
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@ -8,13 +8,5 @@
 | 
			
		||||
      "Microsoft.AspNetCore": "Warning"
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  "AllowedHosts": "*",
 | 
			
		||||
  //"ConnectionStrings": {
 | 
			
		||||
  //  "LocationConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;"
 | 
			
		||||
  //},
 | 
			
		||||
  "ConnectionStrings": {
 | 
			
		||||
    //"LocationConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;"
 | 
			
		||||
    "LocationConnection": "Server=tcp:da-dev.database.windows.net,1433;Initial Catalog=da-dev-db;Encrypt=True;User ID=admin-dev;Password=b3tgRABw8LGE75k;TrustServerCertificate=False;Connection Timeout=30;"
 | 
			
		||||
 | 
			
		||||
  }
 | 
			
		||||
  "AllowedHosts": "*"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,4 @@
 | 
			
		||||
using DamageAssesment.Api.Questions.Interfaces;
 | 
			
		||||
using Microsoft.AspNetCore.Authorization;
 | 
			
		||||
using Microsoft.AspNetCore.Mvc;
 | 
			
		||||
 | 
			
		||||
namespace DamageAssesment.Api.Questions.Controllers
 | 
			
		||||
@ -11,13 +10,16 @@ namespace DamageAssesment.Api.Questions.Controllers
 | 
			
		||||
 | 
			
		||||
        public QuestionsController(IQuestionsProvider questionsProvider)
 | 
			
		||||
        {
 | 
			
		||||
 | 
			
		||||
            this.questionsProvider = questionsProvider;
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// GET request for retrieving questions.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        //get all questions
 | 
			
		||||
        [Authorize(Roles = "admin,survey,user,report")]
 | 
			
		||||
 | 
			
		||||
        // get all questions
 | 
			
		||||
        [Route("questions")]
 | 
			
		||||
        [Route("questions/{language:alpha}")]
 | 
			
		||||
        [HttpGet]
 | 
			
		||||
@ -35,7 +37,6 @@ namespace DamageAssesment.Api.Questions.Controllers
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// GET request for retrieving a question by ID.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        [Authorize(Roles = "admin,survey,user,report")]
 | 
			
		||||
        [Route("questions/{id}/{language:alpha}")]
 | 
			
		||||
        [Route("questions/{id:int}")]
 | 
			
		||||
        [HttpGet]
 | 
			
		||||
@ -54,7 +55,6 @@ namespace DamageAssesment.Api.Questions.Controllers
 | 
			
		||||
        /// GET request for retrieving survey questions based on a survey ID.
 | 
			
		||||
        /// Uri: {Optional language}/GetSurveyQuestions/{surveyId} :Default returns question in all languages 
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        [Authorize(Roles = "admin,survey,user,report")]
 | 
			
		||||
        [Route("questions/bysurvey/{surveyId:int}")]
 | 
			
		||||
        [Route("questions/bysurvey/{surveyId:int}/{language:alpha}")]
 | 
			
		||||
        [HttpGet]
 | 
			
		||||
@ -71,7 +71,6 @@ namespace DamageAssesment.Api.Questions.Controllers
 | 
			
		||||
        /// PUT request for updating a question (multilingual).
 | 
			
		||||
        /// </summary>
 | 
			
		||||
 | 
			
		||||
        [Authorize(Roles = "admin")]
 | 
			
		||||
        [HttpPut("questions")]
 | 
			
		||||
        public async Task<IActionResult> UpdateQuestion(Models.Question question)
 | 
			
		||||
        {
 | 
			
		||||
@ -92,7 +91,6 @@ namespace DamageAssesment.Api.Questions.Controllers
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// POST request for creating a multiple question (multilingual).
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        [Authorize(Roles = "admin")]
 | 
			
		||||
        [HttpPost("questions/multiple")]
 | 
			
		||||
        public async Task<IActionResult> CreateQuestions(List<Models.Question> questions)
 | 
			
		||||
        {
 | 
			
		||||
@ -108,13 +106,12 @@ namespace DamageAssesment.Api.Questions.Controllers
 | 
			
		||||
 | 
			
		||||
                return BadRequest(result.ErrorMessage);
 | 
			
		||||
            }
 | 
			
		||||
            return CreatedAtRoute("DefaultApi", questions);
 | 
			
		||||
            return CreatedAtRoute("DefaultApi",questions);
 | 
			
		||||
        }
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// POST request for creating a new question (multilingual).
 | 
			
		||||
        /// </summary>
 | 
			
		||||
 | 
			
		||||
        [Authorize(Roles = "admin")]
 | 
			
		||||
        [HttpPost("questions")]
 | 
			
		||||
        public async Task<IActionResult> CreateQuestion(Models.Question question)
 | 
			
		||||
        {
 | 
			
		||||
@ -133,7 +130,6 @@ namespace DamageAssesment.Api.Questions.Controllers
 | 
			
		||||
        /// DELETE request for deleting a question based on ID.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
 | 
			
		||||
        [Authorize(Roles = "admin")]
 | 
			
		||||
        [HttpDelete("questions/{id}")]
 | 
			
		||||
        public async Task<IActionResult> DeleteQuestion(int id)
 | 
			
		||||
        {
 | 
			
		||||
@ -149,7 +145,6 @@ namespace DamageAssesment.Api.Questions.Controllers
 | 
			
		||||
        /// GET request for retrieving question categories.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
 | 
			
		||||
        [Authorize(Roles = "admin,user,report")]
 | 
			
		||||
        [HttpGet("questions/categories")]
 | 
			
		||||
        [HttpGet("questions/categories/{language:alpha}")]
 | 
			
		||||
        public async Task<IActionResult> GetQuestionCategoriesAsync(string? language)
 | 
			
		||||
@ -164,7 +159,7 @@ namespace DamageAssesment.Api.Questions.Controllers
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// GET request for retrieving a question category by ID.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        [Authorize(Roles = "admin,report")]
 | 
			
		||||
 | 
			
		||||
        [HttpGet("questions/categories/{id:int}")]
 | 
			
		||||
        [HttpGet("questions/categories/{id:int}/{language:alpha}")]
 | 
			
		||||
        public async Task<IActionResult> GetQuestionCategoryAsync(int id,string? language)
 | 
			
		||||
@ -181,7 +176,7 @@ namespace DamageAssesment.Api.Questions.Controllers
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// PUT request for updating a question category.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        [Authorize(Roles = "admin,survey,report")]
 | 
			
		||||
 | 
			
		||||
        [HttpPut("questions/categories")]
 | 
			
		||||
        public async Task<IActionResult> UpdateQuestionCategory(Models.QuestionCategory questionCategory)
 | 
			
		||||
        {
 | 
			
		||||
@ -203,7 +198,6 @@ namespace DamageAssesment.Api.Questions.Controllers
 | 
			
		||||
        /// POST request for creating a new question category.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
 | 
			
		||||
        [Authorize(Roles = "admin")]
 | 
			
		||||
        [HttpPost("questions/categories")]
 | 
			
		||||
        public async Task<IActionResult> CreateQuestionCategory(Models.QuestionCategory questionCategory)
 | 
			
		||||
        {
 | 
			
		||||
@ -222,7 +216,6 @@ namespace DamageAssesment.Api.Questions.Controllers
 | 
			
		||||
        /// DELETE request for deleting a question category based on ID.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
 | 
			
		||||
        [Authorize(Roles = "admin")]
 | 
			
		||||
        [HttpDelete("questions/categories/{id}")]
 | 
			
		||||
        public async Task<IActionResult> DeleteQuestionCategory(int id)
 | 
			
		||||
        {
 | 
			
		||||
 | 
			
		||||
@ -11,17 +11,6 @@
 | 
			
		||||
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="12.0.1" />
 | 
			
		||||
    <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.AspNetCore.Authentication.JwtBearer" Version="6.0.21" />
 | 
			
		||||
    <PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.5" />
 | 
			
		||||
    <PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="7.0.5" />
 | 
			
		||||
 | 
			
		||||
@ -3,7 +3,6 @@ using System.ComponentModel.DataAnnotations;
 | 
			
		||||
 | 
			
		||||
namespace DamageAssesment.Api.Questions.Db
 | 
			
		||||
{
 | 
			
		||||
    [Table("QuestionCategoryTrans")]
 | 
			
		||||
    public class CategoryTranslation
 | 
			
		||||
    {
 | 
			
		||||
        [Key]
 | 
			
		||||
 | 
			
		||||
@ -3,7 +3,6 @@ using System.ComponentModel.DataAnnotations.Schema;
 | 
			
		||||
 | 
			
		||||
namespace DamageAssesment.Api.Questions.Db
 | 
			
		||||
{
 | 
			
		||||
    [Table("Questions")]
 | 
			
		||||
    public class Question
 | 
			
		||||
    {
 | 
			
		||||
        [Key]
 | 
			
		||||
 | 
			
		||||
@ -1,10 +1,8 @@
 | 
			
		||||
using System.Buffers.Text;
 | 
			
		||||
using System.ComponentModel.DataAnnotations;
 | 
			
		||||
using System.ComponentModel.DataAnnotations.Schema;
 | 
			
		||||
 | 
			
		||||
namespace DamageAssesment.Api.Questions.Db
 | 
			
		||||
{
 | 
			
		||||
    [Table("QuestionCategories")]
 | 
			
		||||
    public class QuestionCategory
 | 
			
		||||
    {
 | 
			
		||||
        [Key]
 | 
			
		||||
 | 
			
		||||
@ -6,16 +6,6 @@ namespace DamageAssesment.Api.Questions.Db
 | 
			
		||||
{
 | 
			
		||||
    public class QuestionDbContext : DbContext
 | 
			
		||||
    {
 | 
			
		||||
        private IConfiguration _Configuration { get; set; }
 | 
			
		||||
        public QuestionDbContext(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("QuestionConnection"));
 | 
			
		||||
        }
 | 
			
		||||
        public DbSet<Db.Question> Questions { get; set; }
 | 
			
		||||
        public DbSet<Db.QuestionType> QuestionTypes { get; set; }
 | 
			
		||||
        public DbSet<Db.QuestionsTranslation> QuestionsTranslations { get; set; }
 | 
			
		||||
 | 
			
		||||
@ -1,9 +1,7 @@
 | 
			
		||||
using System.ComponentModel.DataAnnotations;
 | 
			
		||||
using System.ComponentModel.DataAnnotations.Schema;
 | 
			
		||||
 | 
			
		||||
namespace DamageAssesment.Api.Questions.Db
 | 
			
		||||
{
 | 
			
		||||
    [Table("QuestionTypes")]
 | 
			
		||||
    public class QuestionType
 | 
			
		||||
    {
 | 
			
		||||
        [Key]
 | 
			
		||||
 | 
			
		||||
@ -3,7 +3,6 @@ using System.ComponentModel.DataAnnotations.Schema;
 | 
			
		||||
 | 
			
		||||
namespace DamageAssesment.Api.Questions.Db
 | 
			
		||||
{
 | 
			
		||||
    [Table("QuestionTrans")]
 | 
			
		||||
    public class QuestionsTranslation
 | 
			
		||||
    {
 | 
			
		||||
        [Key]
 | 
			
		||||
 | 
			
		||||
@ -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; }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -5,7 +5,6 @@
 | 
			
		||||
        public int CategoryId { get; set; }
 | 
			
		||||
        public string IconName { get; set; }
 | 
			
		||||
        public string IconLibrary { get; set; }
 | 
			
		||||
        public object CategoryNames { get; set; }
 | 
			
		||||
        public List<MultiLanguage> QuestionsText { get; set; }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1,33 +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);
 | 
			
		||||
// 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();
 | 
			
		||||
@ -39,44 +17,16 @@ builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());
 | 
			
		||||
 | 
			
		||||
builder.Services.AddEndpointsApiExplorer();
 | 
			
		||||
//builder.Services.AddSwaggerGen();
 | 
			
		||||
builder.Services.AddSwaggerGen(options =>
 | 
			
		||||
builder.Services.AddSwaggerGen(c =>
 | 
			
		||||
{
 | 
			
		||||
    // Include XML comments from your assembly
 | 
			
		||||
    var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
 | 
			
		||||
    var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
 | 
			
		||||
    options.IncludeXmlComments(xmlPath);
 | 
			
		||||
 | 
			
		||||
    OpenApiSecurityScheme securityDefinition = new OpenApiSecurityScheme()
 | 
			
		||||
    {
 | 
			
		||||
        Name = "Bearer",
 | 
			
		||||
        BearerFormat = "JWT",
 | 
			
		||||
        Scheme = "bearer",
 | 
			
		||||
        Description = "Specify the authorization token.",
 | 
			
		||||
        In = ParameterLocation.Header,
 | 
			
		||||
        Type = SecuritySchemeType.Http,
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    options.AddSecurityDefinition("jwt_auth", securityDefinition);
 | 
			
		||||
 | 
			
		||||
    // Make sure swagger UI requires a Bearer token specified
 | 
			
		||||
    OpenApiSecurityScheme securityScheme = new OpenApiSecurityScheme()
 | 
			
		||||
    {
 | 
			
		||||
        Reference = new OpenApiReference()
 | 
			
		||||
        {
 | 
			
		||||
            Id = "jwt_auth",
 | 
			
		||||
            Type = ReferenceType.SecurityScheme
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
    OpenApiSecurityRequirement securityRequirements = new OpenApiSecurityRequirement()
 | 
			
		||||
    {
 | 
			
		||||
        {securityScheme, new string[] { }},
 | 
			
		||||
    };
 | 
			
		||||
    options.AddSecurityRequirement(securityRequirements);
 | 
			
		||||
    c.IncludeXmlComments(xmlPath);
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
builder.Services.AddDbContext<QuestionDbContext>(option =>
 | 
			
		||||
{
 | 
			
		||||
    option.UseSqlServer("QuestionConnection");
 | 
			
		||||
    option.UseInMemoryDatabase("Questions");
 | 
			
		||||
});
 | 
			
		||||
var app = builder.Build();
 | 
			
		||||
 | 
			
		||||
@ -93,7 +43,7 @@ if (app.Environment.IsDevelopment())
 | 
			
		||||
        questionProvider.SeedData();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
app.UseAuthentication();
 | 
			
		||||
 | 
			
		||||
app.UseAuthorization();
 | 
			
		||||
 | 
			
		||||
app.MapControllers();
 | 
			
		||||
 | 
			
		||||
@ -31,7 +31,8 @@ namespace DamageAssesment.Api.Questions.Providers
 | 
			
		||||
                questionDbContext.QuestionTypes.Add(new Db.QuestionType() { TypeText = "TextBox" });
 | 
			
		||||
                questionDbContext.SaveChanges();
 | 
			
		||||
            }
 | 
			
		||||
            if (!questionDbContext.QuestionsTranslations.Any())
 | 
			
		||||
 | 
			
		||||
            if (!questionDbContext.QuestionCategories.Any())
 | 
			
		||||
            {
 | 
			
		||||
                questionDbContext.QuestionCategories.Add(new Db.QuestionCategory() { IconName = "Flooding", IconLibrary = "https://example.com/images/img1.png" });
 | 
			
		||||
                questionDbContext.QuestionCategories.Add(new Db.QuestionCategory() { IconName = "Electrical", IconLibrary = "https://example.com/images/img2.png" });
 | 
			
		||||
@ -64,51 +65,14 @@ namespace DamageAssesment.Api.Questions.Providers
 | 
			
		||||
            if (!questionDbContext.Questions.Any())
 | 
			
		||||
            {
 | 
			
		||||
                var question1 = new Db.Question() { QuestionTypeId = 1, SurveyId = 1, QuestionNumber = 1, IsRequired = true, Comment = false, Key = true, CategoryId = 1 };
 | 
			
		||||
                var question2 = new Db.Question() { QuestionTypeId = 1, SurveyId = 1, QuestionNumber = 2, IsRequired = false, Comment = true, Key = false, CategoryId = 2 };
 | 
			
		||||
                var question2 = new Db.Question() { QuestionTypeId = 1, SurveyId = 1, QuestionNumber = 2, IsRequired = false, Comment = true, Key = false, CategoryId = 1 };
 | 
			
		||||
                var question3 = new Db.Question() { QuestionTypeId = 1, SurveyId = 2, QuestionNumber = 1, IsRequired = true, Comment = false, Key = true, CategoryId = 1 };
 | 
			
		||||
                var question4 = new Db.Question() { QuestionTypeId = 1, SurveyId = 2, QuestionNumber = 2, IsRequired = false, Comment = true, Key = false, CategoryId = 2 };
 | 
			
		||||
                var question5 = new Db.Question() { QuestionTypeId = 1, SurveyId = 3, QuestionNumber = 1, IsRequired = true, Comment = false, Key = true, CategoryId = 1 };
 | 
			
		||||
                var question6 = new Db.Question() { QuestionTypeId = 1, SurveyId = 3, QuestionNumber = 2, IsRequired = false, Comment = true, Key = false, CategoryId = 2 };
 | 
			
		||||
                var question7 = new Db.Question() { QuestionTypeId = 1, SurveyId = 3, QuestionNumber = 1, IsRequired = true, Comment = false, Key = true, CategoryId = 3};
 | 
			
		||||
                var question8 = new Db.Question() { QuestionTypeId = 1, SurveyId = 3, QuestionNumber = 2, IsRequired = false, Comment = true, Key = false, CategoryId = 4 };
 | 
			
		||||
                var question9 = new Db.Question() { QuestionTypeId = 1, SurveyId = 3, QuestionNumber = 1, IsRequired = true, Comment = true, Key = true, CategoryId = 5 };
 | 
			
		||||
                var question10 = new Db.Question() { QuestionTypeId = 1, SurveyId = 3, QuestionNumber = 2, IsRequired = false, Comment = false, Key = true, CategoryId = 1 };
 | 
			
		||||
                var question11 = new Db.Question() { QuestionTypeId = 1, SurveyId = 3, QuestionNumber = 1, IsRequired = true, Comment = false, Key = false, CategoryId = 2 };
 | 
			
		||||
                var question12 = new Db.Question() { QuestionTypeId = 1, SurveyId = 3, QuestionNumber = 2, IsRequired = false, Comment = true, Key = true, CategoryId = 3 };
 | 
			
		||||
                var question13 = new Db.Question() { QuestionTypeId = 1, SurveyId = 3, QuestionNumber = 1, IsRequired = true, Comment = false, Key = true, CategoryId = 4 };
 | 
			
		||||
                var question14 = new Db.Question() { QuestionTypeId = 1, SurveyId = 3, QuestionNumber = 2, IsRequired = false, Comment = true, Key = false, CategoryId = 5 };
 | 
			
		||||
                var question15 = new Db.Question() { QuestionTypeId = 1, SurveyId = 3, QuestionNumber = 1, IsRequired = true, Comment = false, Key = false, CategoryId = 1 };
 | 
			
		||||
                var question16 = new Db.Question() { QuestionTypeId = 1, SurveyId = 3, QuestionNumber = 2, IsRequired = false, Comment = true, Key = true, CategoryId = 2 };
 | 
			
		||||
                var question17 = new Db.Question() { QuestionTypeId = 1, SurveyId = 3, QuestionNumber = 1, IsRequired = true, Comment = false, Key = false, CategoryId = 3 };
 | 
			
		||||
                var question18 = new Db.Question() { QuestionTypeId = 1, SurveyId = 3, QuestionNumber = 2, IsRequired = false, Comment = true, Key = false, CategoryId = 4 };
 | 
			
		||||
                var question19 = new Db.Question() { QuestionTypeId = 1, SurveyId = 3, QuestionNumber = 1, IsRequired = true, Comment = false, Key = true, CategoryId = 5 };
 | 
			
		||||
                var question20 = new Db.Question() { QuestionTypeId = 1, SurveyId = 3, QuestionNumber = 2, IsRequired = false, Comment = true, Key = false, CategoryId = 1 };
 | 
			
		||||
                var question21 = new Db.Question() { QuestionTypeId = 1, SurveyId = 3, QuestionNumber = 1, IsRequired = true, Comment = false, Key = true, CategoryId = 2 };
 | 
			
		||||
                var question22 = new Db.Question() { QuestionTypeId = 1, SurveyId = 3, QuestionNumber = 2, IsRequired = false, Comment = true, Key = true, CategoryId = 3 };
 | 
			
		||||
                var question4 = new Db.Question() { QuestionTypeId = 1, SurveyId = 2, QuestionNumber = 2, IsRequired = false, Comment = true, Key = false, CategoryId = 1 };
 | 
			
		||||
 | 
			
		||||
                questionDbContext.Questions.Add(question1);
 | 
			
		||||
                questionDbContext.Questions.Add(question2);
 | 
			
		||||
                questionDbContext.Questions.Add(question3);
 | 
			
		||||
                questionDbContext.Questions.Add(question4);
 | 
			
		||||
                questionDbContext.Questions.Add(question5);
 | 
			
		||||
                questionDbContext.Questions.Add(question6);
 | 
			
		||||
                questionDbContext.Questions.Add(question7);
 | 
			
		||||
                questionDbContext.Questions.Add(question8);
 | 
			
		||||
                questionDbContext.Questions.Add(question9);
 | 
			
		||||
                questionDbContext.Questions.Add(question10);
 | 
			
		||||
                questionDbContext.Questions.Add(question11);
 | 
			
		||||
                questionDbContext.Questions.Add(question12);
 | 
			
		||||
                questionDbContext.Questions.Add(question13);
 | 
			
		||||
                questionDbContext.Questions.Add(question14);
 | 
			
		||||
                questionDbContext.Questions.Add(question15);
 | 
			
		||||
                questionDbContext.Questions.Add(question16);
 | 
			
		||||
                questionDbContext.Questions.Add(question17);
 | 
			
		||||
                questionDbContext.Questions.Add(question18);
 | 
			
		||||
                questionDbContext.Questions.Add(question19);
 | 
			
		||||
                questionDbContext.Questions.Add(question20);
 | 
			
		||||
                questionDbContext.Questions.Add(question21);
 | 
			
		||||
                questionDbContext.Questions.Add(question22);
 | 
			
		||||
 | 
			
		||||
                questionDbContext.SaveChanges();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
@ -126,64 +90,6 @@ namespace DamageAssesment.Api.Questions.Providers
 | 
			
		||||
                questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 4, QuestionText = "Are the grounds flooded ?", Language = "en" });
 | 
			
		||||
                questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 4, QuestionText = "Les terrains sont-ils inondés ?", Language = "fr" });
 | 
			
		||||
                questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 4, QuestionText = "¿Están inundados los terrenos?", Language = "es" });
 | 
			
		||||
 | 
			
		||||
                questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 5, QuestionText = "Can you open?", Language = "en" });
 | 
			
		||||
                questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 6, QuestionText = "Is debris blocking access?", Language = "en" });
 | 
			
		||||
                questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 7, QuestionText = "Are the grounds flooded?", Language = "en" });
 | 
			
		||||
                questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 8, QuestionText = "Is the access blocked by flooding?", Language = "en" });
 | 
			
		||||
                questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 9, QuestionText = "Are any utility wires down?", Language = "en" });
 | 
			
		||||
                questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 10, QuestionText = "Do you have damage to windows, doors, or walls?", Language = "en" });
 | 
			
		||||
                questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 11, QuestionText = "Do you have roof damage?", Language = "en" });
 | 
			
		||||
                questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 12, QuestionText = "Do you have major water intrusion?", Language = "en" });
 | 
			
		||||
                questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 13, QuestionText = "Are any portable classrooms damaged and unusable?", Language = "en" });
 | 
			
		||||
                questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 14, QuestionText = "Does your facility need to be secured/boarded?", Language = "en" });
 | 
			
		||||
                questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 15, QuestionText = "Are you without commercial power?", Language = "en" });
 | 
			
		||||
                questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 16, QuestionText = "Are you without water pressure?", Language = "en" });
 | 
			
		||||
                questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 17, QuestionText = "Are you without telephones?", Language = "en" });
 | 
			
		||||
                questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 18, QuestionText = "Are traffic signals damaged/missing?", Language = "en" });
 | 
			
		||||
                questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 19, QuestionText = "Are you without an operable fire alarm?", Language = "en" });
 | 
			
		||||
                questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 20, QuestionText = "Are you without an operable public address?", Language = "en" });
 | 
			
		||||
                questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 21, QuestionText = "Do you have major debris?", Language = "en" });
 | 
			
		||||
                questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 22, QuestionText = "Are there any problems or issues not addressed above that would impede you from opening? If yes, please explain below?", Language = "en" });
 | 
			
		||||
 | 
			
		||||
                questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 5, QuestionText = "Pouvez-vous ouvrir ?", Language = "fr" });
 | 
			
		||||
                questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 6, QuestionText = "Est-ce que des débris bloquent l'accès ?", Language = "fr" });
 | 
			
		||||
                questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 7, QuestionText = "Les terrains sont-ils inondés ?", Language = "fr" });
 | 
			
		||||
                questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 8, QuestionText = "L'accès est-il bloqué par des inondations ?", Language = "fr" });
 | 
			
		||||
                questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 9, QuestionText = "Des câbles d'utilité sont-ils tombés ?", Language = "fr" });
 | 
			
		||||
                questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 10, QuestionText = "Avez-vous des dommages aux fenêtres, portes ou murs ?", Language = "fr" });
 | 
			
		||||
                questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 11, QuestionText = "Avez-vous des dommages au toit ?", Language = "fr" });
 | 
			
		||||
                questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 12, QuestionText = "Avez-vous une intrusion d'eau majeure ?", Language = "fr" });
 | 
			
		||||
                questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 13, QuestionText = "Les salles de classe portables sont-elles endommagées et inutilisables ?", Language = "fr" });
 | 
			
		||||
                questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 14, QuestionText = "Votre établissement a-t-il besoin d'être sécurisé/protégé ?", Language = "fr" });
 | 
			
		||||
                questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 15, QuestionText = "Êtes-vous sans alimentation électrique commerciale ?", Language = "fr" });
 | 
			
		||||
                questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 16, QuestionText = "Êtes-vous sans pression d'eau ?", Language = "fr" });
 | 
			
		||||
                questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 17, QuestionText = "Êtes-vous sans téléphones ?", Language = "fr" });
 | 
			
		||||
                questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 18, QuestionText = "Les feux de circulation sont-ils endommagés/absents ?", Language = "fr" });
 | 
			
		||||
                questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 19, QuestionText = "N'avez-vous pas d'alarme incendie fonctionnelle ?", Language = "fr" });
 | 
			
		||||
                questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 20, QuestionText = "N'avez-vous pas de système de sonorisation opérationnel ?", Language = "fr" });
 | 
			
		||||
                questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 21, QuestionText = "Avez-vous une grande quantité de débris ?", Language = "fr" });
 | 
			
		||||
                questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 22, QuestionText = "Y a-t-il des problèmes ou des problèmes non abordés ci-dessus qui vous empêcheraient d'ouvrir ? Si oui, veuillez expliquer ci-dessous.", Language = "fr" });
 | 
			
		||||
 | 
			
		||||
                questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 5, QuestionText = "¿Puedes abrir ?", Language = "es" });
 | 
			
		||||
                questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 6, QuestionText = "¿Los escombros bloquean el acceso?", Language = "es" });
 | 
			
		||||
                questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 7, QuestionText = "¿Están inundados los terrenos?", Language = "es" });
 | 
			
		||||
                questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 8, QuestionText = "¿El acceso está bloqueado por inundaciones?", Language = "es" });
 | 
			
		||||
                questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 9, QuestionText = "¿Hay cables de utilidad caídos?", Language = "es" });
 | 
			
		||||
                questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 10, QuestionText = "¿Tienes daños en ventanas, puertas o paredes?", Language = "es" });
 | 
			
		||||
                questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 11, QuestionText = "¿Tienes daños en el techo?", Language = "es" });
 | 
			
		||||
                questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 12, QuestionText = "¿Tienes una gran intrusión de agua?", Language = "es" });
 | 
			
		||||
                questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 13, QuestionText = "¿Hay aulas portátiles dañadas e inutilizables?", Language = "es" });
 | 
			
		||||
                questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 14, QuestionText = "¿Tu instalación necesita ser asegurada/tabicada?", Language = "es" });
 | 
			
		||||
                questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 15, QuestionText = "¿No tienes energía comercial?", Language = "es" });
 | 
			
		||||
                questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 16, QuestionText = "¿No tienes presión de agua?", Language = "es" });
 | 
			
		||||
                questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 17, QuestionText = "¿No tienes teléfonos?", Language = "es" });
 | 
			
		||||
                questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 18, QuestionText = "¿Los semáforos están dañados/faltan?", Language = "es" });
 | 
			
		||||
                questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 19, QuestionText = "¿No tienes una alarma de incendios operativa?", Language = "es" });
 | 
			
		||||
                questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 20, QuestionText = "¿No tienes un sistema de megafonía operativo?", Language = "es" });
 | 
			
		||||
                questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 21, QuestionText = "¿Tienes una gran cantidad de escombros?", Language = "es" });
 | 
			
		||||
                questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 22, QuestionText = "¿Hay algún problema o asunto no abordado anteriormente que le impida abrir? Si es así, por favor explíquelo a continuación.", Language = "es" });
 | 
			
		||||
 | 
			
		||||
                questionDbContext.SaveChanges();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
@ -313,7 +219,6 @@ namespace DamageAssesment.Api.Questions.Providers
 | 
			
		||||
                            CategoryId = item.Id,
 | 
			
		||||
                            IconLibrary = item.IconLibrary,
 | 
			
		||||
                            IconName = item.IconName,
 | 
			
		||||
                            CategoryNames= CreateCategoryMultiLanguageObject(GetCategoryTranslations(item.Id, language)),
 | 
			
		||||
                            QuestionsText = GetSurveyQuestion(mapper.Map<List<Db.Question>, List<Models.MultiLanguage>>(questions.Where(a => a.CategoryId == item.Id).ToList()), language)
 | 
			
		||||
                        });
 | 
			
		||||
                    }
 | 
			
		||||
@ -349,7 +254,6 @@ namespace DamageAssesment.Api.Questions.Providers
 | 
			
		||||
            var dbquestiontranslation = mapper.Map<List<Models.QuestionsTranslation>, List<Db.QuestionsTranslation>>(Question.Questions);
 | 
			
		||||
            dbquestion.QuestionTypeId = questionDbContext.QuestionTypes.Where(a => a.TypeText == Question.TypeText).Select(a => a.Id).FirstOrDefault();
 | 
			
		||||
            questionDbContext.Questions.Add(dbquestion);
 | 
			
		||||
            questionDbContext.SaveChanges();
 | 
			
		||||
            dbquestiontranslation.ForEach(i => i.QuestionId = dbquestion.Id);
 | 
			
		||||
            questionDbContext.QuestionsTranslations.AddRange(dbquestiontranslation);
 | 
			
		||||
            questionDbContext.SaveChanges();
 | 
			
		||||
@ -363,7 +267,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));
 | 
			
		||||
 | 
			
		||||
@ -0,0 +1,8 @@
 | 
			
		||||
{
 | 
			
		||||
  "Logging": {
 | 
			
		||||
    "LogLevel": {
 | 
			
		||||
      "Default": "Information",
 | 
			
		||||
      "Microsoft.AspNetCore": "Warning"
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@ -8,10 +8,5 @@
 | 
			
		||||
      "Microsoft.AspNetCore": "Warning"
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  "AllowedHosts": "*",
 | 
			
		||||
  "ConnectionStrings": {
 | 
			
		||||
    //"QuestionConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;"
 | 
			
		||||
    "QuestionConnection": "Server=tcp:da-dev.database.windows.net,1433;Initial Catalog=da-dev-db;Encrypt=True;User ID=admin-dev;Password=b3tgRABw8LGE75k;TrustServerCertificate=False;Connection Timeout=30;"
 | 
			
		||||
 | 
			
		||||
  }
 | 
			
		||||
  "AllowedHosts": "*"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -10,7 +10,7 @@
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.9" />
 | 
			
		||||
    <PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.5" />
 | 
			
		||||
    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.5.0" />
 | 
			
		||||
    <PackageReference Include="Moq" Version="4.18.4" />
 | 
			
		||||
    <PackageReference Include="xunit" Version="2.4.2" />
 | 
			
		||||
 | 
			
		||||
@ -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}")]
 | 
			
		||||
@ -11,21 +11,7 @@
 | 
			
		||||
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="12.0.1" />
 | 
			
		||||
    <PackageReference Include="ClosedXML" Version="0.102.1" />
 | 
			
		||||
    <PackageReference Include="EPPlus" Version="6.2.10" />
 | 
			
		||||
    <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.Configuration.Json" Version="7.0.0" />
 | 
			
		||||
    <PackageReference Include="Microsoft.Extensions.Http.Polly" Version="7.0.9" />
 | 
			
		||||
    <PackageReference Include="EPPlus" Version="7.0.0" />
 | 
			
		||||
    <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.21" />
 | 
			
		||||
    <PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.5" />
 | 
			
		||||
    <PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="7.0.5" />
 | 
			
		||||
 | 
			
		||||
@ -3,7 +3,6 @@ using System.ComponentModel.DataAnnotations.Schema;
 | 
			
		||||
 | 
			
		||||
namespace DamageAssesment.Api.Responses.Db
 | 
			
		||||
{
 | 
			
		||||
    [Table("SurveyResponses")]
 | 
			
		||||
    public class SurveyResponse
 | 
			
		||||
    {
 | 
			
		||||
        [Key]
 | 
			
		||||
 | 
			
		||||
@ -4,18 +4,13 @@ namespace DamageAssesment.Api.Responses.Db
 | 
			
		||||
{
 | 
			
		||||
    public class SurveyResponseDbContext:DbContext
 | 
			
		||||
    {
 | 
			
		||||
        private IConfiguration _Configuration { get; set; }
 | 
			
		||||
        public SurveyResponseDbContext(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("ResponsesConnection"));
 | 
			
		||||
        }
 | 
			
		||||
        public DbSet<Db.SurveyResponse> SurveyResponses { get; set; }
 | 
			
		||||
 | 
			
		||||
        public SurveyResponseDbContext(DbContextOptions options) : base(options)
 | 
			
		||||
        {
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        protected override void OnModelCreating(ModelBuilder modelBuilder)
 | 
			
		||||
        {
 | 
			
		||||
            base.OnModelCreating(modelBuilder);
 | 
			
		||||
 | 
			
		||||
@ -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; }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -3,7 +3,7 @@
 | 
			
		||||
    public class SurveyExport
 | 
			
		||||
    {
 | 
			
		||||
        public int Id { get; set; }
 | 
			
		||||
        public string SurveyQuestion { get; set; }  
 | 
			
		||||
        public string SurveyQuestion { get; set; }
 | 
			
		||||
        public string Answer { get; set; }
 | 
			
		||||
        public string Category { 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;
 | 
			
		||||
@ -18,24 +14,6 @@ const int intervalForCircuitBraker = 5; //5 seconds
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// Add services to the container.
 | 
			
		||||
var authkey = builder.Configuration.GetValue<string>("JwtSettings:securitykey");
 | 
			
		||||
builder.Services.AddAuthentication(item =>
 | 
			
		||||
{
 | 
			
		||||
    item.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
 | 
			
		||||
    item.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
 | 
			
		||||
}).AddJwtBearer(item =>
 | 
			
		||||
{
 | 
			
		||||
    item.RequireHttpsMetadata = true;
 | 
			
		||||
    item.SaveToken = true;
 | 
			
		||||
    item.TokenValidationParameters = new TokenValidationParameters()
 | 
			
		||||
    {
 | 
			
		||||
        ValidateIssuerSigningKey = true,
 | 
			
		||||
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(authkey)),
 | 
			
		||||
        ValidateIssuer = false,
 | 
			
		||||
        ValidateAudience = false,
 | 
			
		||||
        ClockSkew = TimeSpan.Zero
 | 
			
		||||
    };
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
builder.Services.AddControllers();
 | 
			
		||||
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
 | 
			
		||||
@ -49,7 +27,6 @@ builder.Services.AddScoped<IEmployeeServiceProvider, EmployeeServiceProvider>();
 | 
			
		||||
builder.Services.AddScoped<IAttachmentServiceProvider, AttachmentServiceProvider>();
 | 
			
		||||
builder.Services.AddScoped<ISurveyServiceProvider, SurveyServiceProvider>();
 | 
			
		||||
builder.Services.AddScoped<IExcelExportService, ExcelExportService>();
 | 
			
		||||
builder.Services.AddHttpContextAccessor();
 | 
			
		||||
 | 
			
		||||
builder.Services.AddHttpClient<IHttpUtil, HttpUtil>().
 | 
			
		||||
    AddTransientHttpErrorPolicy(policy => policy.WaitAndRetryAsync(maxApiCallRetries, _ => TimeSpan.FromSeconds(intervalToRetry))).
 | 
			
		||||
@ -59,44 +36,16 @@ builder.Services.AddHttpClient<IHttpUtil, HttpUtil>().
 | 
			
		||||
builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());
 | 
			
		||||
builder.Services.AddEndpointsApiExplorer();
 | 
			
		||||
//builder.Services.AddSwaggerGen();
 | 
			
		||||
 | 
			
		||||
builder.Services.AddSwaggerGen(options =>
 | 
			
		||||
builder.Services.AddSwaggerGen(c =>
 | 
			
		||||
{
 | 
			
		||||
    // Include XML comments from your assembly
 | 
			
		||||
    var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
 | 
			
		||||
    var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
 | 
			
		||||
    options.IncludeXmlComments(xmlPath);
 | 
			
		||||
 | 
			
		||||
    OpenApiSecurityScheme securityDefinition = new OpenApiSecurityScheme()
 | 
			
		||||
    {
 | 
			
		||||
        Name = "Bearer",
 | 
			
		||||
        BearerFormat = "JWT",
 | 
			
		||||
        Scheme = "bearer",
 | 
			
		||||
        Description = "Specify the authorization token.",
 | 
			
		||||
        In = ParameterLocation.Header,
 | 
			
		||||
        Type = SecuritySchemeType.Http,
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    options.AddSecurityDefinition("jwt_auth", securityDefinition);
 | 
			
		||||
 | 
			
		||||
    // Make sure swagger UI requires a Bearer token specified
 | 
			
		||||
    OpenApiSecurityScheme securityScheme = new OpenApiSecurityScheme()
 | 
			
		||||
    {
 | 
			
		||||
        Reference = new OpenApiReference()
 | 
			
		||||
        {
 | 
			
		||||
            Id = "jwt_auth",
 | 
			
		||||
            Type = ReferenceType.SecurityScheme
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
    OpenApiSecurityRequirement securityRequirements = new OpenApiSecurityRequirement()
 | 
			
		||||
    {
 | 
			
		||||
        {securityScheme, new string[] { }},
 | 
			
		||||
    };
 | 
			
		||||
    options.AddSecurityRequirement(securityRequirements);
 | 
			
		||||
    c.IncludeXmlComments(xmlPath);
 | 
			
		||||
});
 | 
			
		||||
builder.Services.AddDbContext<SurveyResponseDbContext>(option =>
 | 
			
		||||
{
 | 
			
		||||
    option.UseSqlServer("ResponsesConnection");
 | 
			
		||||
    option.UseInMemoryDatabase("Responses");
 | 
			
		||||
});
 | 
			
		||||
var app = builder.Build();
 | 
			
		||||
 | 
			
		||||
@ -107,7 +56,6 @@ if (app.Environment.IsDevelopment())
 | 
			
		||||
    app.UseSwaggerUI();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
app.UseAuthentication();
 | 
			
		||||
app.UseAuthorization();
 | 
			
		||||
 | 
			
		||||
app.MapControllers();
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
  "profiles": {
 | 
			
		||||
    "DamageAssesment.Api.Responses": {
 | 
			
		||||
    "DamageAssesment.Api.SurveyResponses": {
 | 
			
		||||
      "commandName": "Project",
 | 
			
		||||
      "launchBrowser": true,
 | 
			
		||||
      "launchUrl": "swagger",
 | 
			
		||||
 | 
			
		||||
@ -1,16 +1,16 @@
 | 
			
		||||
using ClosedXML.Excel;
 | 
			
		||||
using DamageAssesment.Api.Responses.Interfaces;
 | 
			
		||||
using DamageAssesment.Api.Responses.Interfaces;
 | 
			
		||||
using DamageAssesment.Api.Responses.Models;
 | 
			
		||||
using OfficeOpenXml;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.ComponentModel;
 | 
			
		||||
 | 
			
		||||
namespace DamageAssesment.Api.Responses.Providers
 | 
			
		||||
{
 | 
			
		||||
    public class ExcelExportService: IExcelExportService
 | 
			
		||||
    public class ExcelExportService : IExcelExportService
 | 
			
		||||
    {
 | 
			
		||||
        public byte[] ExportToExcel<T1>(List<object> responses)
 | 
			
		||||
        { 
 | 
			
		||||
            ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
 | 
			
		||||
        {
 | 
			
		||||
            ExcelPackage.LicenseContext = OfficeOpenXml.LicenseContext.NonCommercial;
 | 
			
		||||
            using (var package = new ExcelPackage())
 | 
			
		||||
            {
 | 
			
		||||
                // Create the first worksheet and populate it with responses
 | 
			
		||||
@ -29,7 +29,7 @@ namespace DamageAssesment.Api.Responses.Providers
 | 
			
		||||
                for (int col = 1; col <= properties.Length; col++)
 | 
			
		||||
                {
 | 
			
		||||
                    worksheet.Cells[1, col].Value = properties[col - 1].Name;
 | 
			
		||||
                    if(properties[col - 1].Name.ToLower().Contains("attachment"))
 | 
			
		||||
                    if (properties[col - 1].Name.ToLower().Contains("attachment"))
 | 
			
		||||
                        IsAttchments.Add(col);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
@ -38,8 +38,8 @@ namespace DamageAssesment.Api.Responses.Providers
 | 
			
		||||
                {
 | 
			
		||||
                    for (int col = 1; col <= properties.Length; col++)
 | 
			
		||||
                    {
 | 
			
		||||
                       
 | 
			
		||||
                            string value = Convert.ToString(properties[col - 1].GetValue(data[row - 2]));
 | 
			
		||||
 | 
			
		||||
                        string value = Convert.ToString(properties[col - 1].GetValue(data[row - 2]));
 | 
			
		||||
                        if (IsAttchments.Where(a => a == col).Count() > 0 && !string.IsNullOrEmpty(value))
 | 
			
		||||
                        {
 | 
			
		||||
                            List<string> attachments = value.Split("##").ToList();
 | 
			
		||||
@ -53,7 +53,7 @@ namespace DamageAssesment.Api.Responses.Providers
 | 
			
		||||
                        }
 | 
			
		||||
                        else
 | 
			
		||||
                            worksheet.Cells[row, col].Value = value;
 | 
			
		||||
                        
 | 
			
		||||
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
@ -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()
 | 
			
		||||
@ -135,7 +120,7 @@ namespace DamageAssesment.Api.Responses.Providers
 | 
			
		||||
            {
 | 
			
		||||
                logger?.LogInformation("Querying to get SurveyResponse object from DB");
 | 
			
		||||
                //get all the survey that already taken by the employee
 | 
			
		||||
                var surveys = await surveyServiceProvider.getSurveysAsync(language, token);
 | 
			
		||||
                var surveys = await surveyServiceProvider.getSurveysAsync(language);
 | 
			
		||||
                surveys = surveys.Where(s => s.IsEnabled == true && s.Status == SurveyStatus.ACTIVE.ToString()).ToList();
 | 
			
		||||
                if (employeeid == null || employeeid == 0)
 | 
			
		||||
                    return (true, surveys, null);
 | 
			
		||||
@ -156,7 +141,7 @@ namespace DamageAssesment.Api.Responses.Providers
 | 
			
		||||
            {
 | 
			
		||||
                logger?.LogInformation("Querying to get SurveyResponse object from DB");
 | 
			
		||||
 | 
			
		||||
                var surveys = await surveyServiceProvider.getSurveysAsync(language, token);
 | 
			
		||||
                var surveys = await surveyServiceProvider.getSurveysAsync(language);
 | 
			
		||||
                // returning only historic data: end date is less than current date.
 | 
			
		||||
                surveys = surveys.Where(s => s.Status == SurveyStatus.INACTIVE.ToString()).ToList();
 | 
			
		||||
                if (employeeid == null || employeeid == 0)
 | 
			
		||||
@ -181,7 +166,7 @@ namespace DamageAssesment.Api.Responses.Providers
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                logger?.LogInformation("Querying to get Survey object from microservice");
 | 
			
		||||
                var survey = await surveyServiceProvider.getSurveyAsync(surveyId, token);
 | 
			
		||||
                var survey = await surveyServiceProvider.getSurveyAsync(surveyId);
 | 
			
		||||
 | 
			
		||||
                if (survey != null)
 | 
			
		||||
                {
 | 
			
		||||
@ -212,7 +197,7 @@ namespace DamageAssesment.Api.Responses.Providers
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                logger?.LogInformation("Querying to get Survey object from microservice");
 | 
			
		||||
                var survey = await surveyServiceProvider.getSurveyAsync(surveyId, token);
 | 
			
		||||
                var survey = await surveyServiceProvider.getSurveyAsync(surveyId);
 | 
			
		||||
 | 
			
		||||
                if (survey != null)
 | 
			
		||||
                {
 | 
			
		||||
@ -243,7 +228,7 @@ namespace DamageAssesment.Api.Responses.Providers
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                logger?.LogInformation("Querying to get Survey object from microservice");
 | 
			
		||||
                var survey = await surveyServiceProvider.getSurveyAsync(surveyId, token);
 | 
			
		||||
                var survey = await surveyServiceProvider.getSurveyAsync(surveyId);
 | 
			
		||||
 | 
			
		||||
                if (survey != null)
 | 
			
		||||
                {
 | 
			
		||||
@ -274,8 +259,8 @@ namespace DamageAssesment.Api.Responses.Providers
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                logger?.LogInformation("Querying to get Survey object from microservice");
 | 
			
		||||
                var survey = await surveyServiceProvider.getSurveyAsync(surveyId, token);
 | 
			
		||||
                var question = await questionServiceProvider.getQuestionsAsync(questionId, token);
 | 
			
		||||
                var survey = await surveyServiceProvider.getSurveyAsync(surveyId);
 | 
			
		||||
                var question = await questionServiceProvider.getQuestionsAsync(questionId);
 | 
			
		||||
                bool IsCorrectAnswer = answer.ToLower().Equals("yes") || answer.ToLower().Equals("no") ? true : false;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -436,7 +421,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;
 | 
			
		||||
 | 
			
		||||
@ -459,8 +444,8 @@ namespace DamageAssesment.Api.Responses.Providers
 | 
			
		||||
                if (surveyAnswers == null || !surveyAnswers.Any())
 | 
			
		||||
                    return null;
 | 
			
		||||
 | 
			
		||||
                var regions = await regionServiceProvider.getRegionsAsync(token);
 | 
			
		||||
                var locations = await locationServiceProvider.getLocationsAsync(token);
 | 
			
		||||
                var regions = await regionServiceProvider.getRegionsAsync();
 | 
			
		||||
                var locations = await locationServiceProvider.getLocationsAsync();
 | 
			
		||||
 | 
			
		||||
                if (regions == null || !regions.Any() || locations == null || !locations.Any())
 | 
			
		||||
                    return null;
 | 
			
		||||
@ -470,18 +455,18 @@ namespace DamageAssesment.Api.Responses.Providers
 | 
			
		||||
                var result = from answer in surveyAnswers
 | 
			
		||||
                             from location in locations
 | 
			
		||||
                             where answer.LocationId.Equals(location.Id)
 | 
			
		||||
                             select new 
 | 
			
		||||
                             select new
 | 
			
		||||
                             {
 | 
			
		||||
                                answer.Id,
 | 
			
		||||
                                answer.QuestionId,
 | 
			
		||||
                                answer.AnswerText,
 | 
			
		||||
                                answer.Comment,
 | 
			
		||||
                                location.RegionId,
 | 
			
		||||
                                LocationId = location.Id,
 | 
			
		||||
                                answer.SurveyResponseId
 | 
			
		||||
                                 answer.Id,
 | 
			
		||||
                                 answer.QuestionId,
 | 
			
		||||
                                 answer.AnswerText,
 | 
			
		||||
                                 answer.Comment,
 | 
			
		||||
                                 location.RegionId,
 | 
			
		||||
                                 LocationId = location.Id,
 | 
			
		||||
                                 answer.SurveyResponseId
 | 
			
		||||
                             };
 | 
			
		||||
 | 
			
		||||
               
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                //group records by answer and region
 | 
			
		||||
                var q = from e in result
 | 
			
		||||
@ -489,13 +474,13 @@ namespace DamageAssesment.Api.Responses.Providers
 | 
			
		||||
                        select new
 | 
			
		||||
                        {
 | 
			
		||||
                            g.Key.RegionId,
 | 
			
		||||
                            Answers = new 
 | 
			
		||||
                            Answers = new
 | 
			
		||||
                            {
 | 
			
		||||
                                g.Key.AnswerText,
 | 
			
		||||
                                Counter = g.Count()
 | 
			
		||||
                            }
 | 
			
		||||
                        };
 | 
			
		||||
                
 | 
			
		||||
 | 
			
		||||
                //build the result
 | 
			
		||||
 | 
			
		||||
                List<dynamic> resultList = new List<dynamic>();
 | 
			
		||||
@ -503,9 +488,9 @@ namespace DamageAssesment.Api.Responses.Providers
 | 
			
		||||
                {
 | 
			
		||||
                    var answers = from u in q.ToList()
 | 
			
		||||
                                  where u.RegionId.Equals(region.Id)
 | 
			
		||||
                                  select u.Answers; 
 | 
			
		||||
   
 | 
			
		||||
                    resultList.Add(new { RegionId = region.Id, region.Name, region.Abbreviation, Answers = answers});
 | 
			
		||||
                                  select u.Answers;
 | 
			
		||||
 | 
			
		||||
                    resultList.Add(new { RegionId = region.Id, region.Name, region.Abbreviation, Answers = answers });
 | 
			
		||||
                }
 | 
			
		||||
                //return the object result
 | 
			
		||||
                return new { Regions = resultList };
 | 
			
		||||
@ -522,22 +507,24 @@ 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,
 | 
			
		||||
                    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
 | 
			
		||||
@ -571,47 +558,92 @@ namespace DamageAssesment.Api.Responses.Providers
 | 
			
		||||
                if (employeeid == 0)
 | 
			
		||||
                {
 | 
			
		||||
                    surveyResonses = await surveyResponseDbContext.SurveyResponses.Where(x => x.SurveyId == surveyId).ToListAsync();
 | 
			
		||||
                    employees = await employeeServiceProvider.getEmployeesAsync(token);
 | 
			
		||||
                    employees = await employeeServiceProvider.getEmployeesAsync();
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    surveyResonses = await surveyResponseDbContext.SurveyResponses.Where(x => x.SurveyId == surveyId && x.EmployeeId == employeeid).ToListAsync();
 | 
			
		||||
                    employee = await employeeServiceProvider.getEmployeeAsync(employeeid, token);
 | 
			
		||||
                    employee = await employeeServiceProvider.getEmployeeAsync(employeeid);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                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)
 | 
			
		||||
            {
 | 
			
		||||
@ -633,12 +665,12 @@ namespace DamageAssesment.Api.Responses.Providers
 | 
			
		||||
                if (employeeid == 0)
 | 
			
		||||
                {
 | 
			
		||||
                    surveyResonses = await surveyResponseDbContext.SurveyResponses.ToListAsync();
 | 
			
		||||
                    employees = await employeeServiceProvider.getEmployeesAsync(token);
 | 
			
		||||
                    employees = await employeeServiceProvider.getEmployeesAsync();
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    surveyResonses = await surveyResponseDbContext.SurveyResponses.Where(x => x.EmployeeId == employeeid).ToListAsync();
 | 
			
		||||
                    employee = await employeeServiceProvider.getEmployeeAsync(employeeid, token);
 | 
			
		||||
                    employee = await employeeServiceProvider.getEmployeeAsync(employeeid);
 | 
			
		||||
 | 
			
		||||
                    if (employee != null)
 | 
			
		||||
                    {
 | 
			
		||||
@ -647,11 +679,13 @@ namespace DamageAssesment.Api.Responses.Providers
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                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,
 | 
			
		||||
@ -660,8 +694,10 @@ namespace DamageAssesment.Api.Responses.Providers
 | 
			
		||||
                                 r.EmployeeId,
 | 
			
		||||
                                 r.ClientDevice,
 | 
			
		||||
                                 r.KeyAnswerResult,
 | 
			
		||||
                                 r.Longitute,
 | 
			
		||||
                                 r.Latitude,
 | 
			
		||||
                                 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
 | 
			
		||||
@ -676,6 +712,8 @@ namespace DamageAssesment.Api.Responses.Providers
 | 
			
		||||
                                           }
 | 
			
		||||
                             };
 | 
			
		||||
                return result;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            }
 | 
			
		||||
            catch (Exception ex)
 | 
			
		||||
            {
 | 
			
		||||
@ -691,12 +729,12 @@ namespace DamageAssesment.Api.Responses.Providers
 | 
			
		||||
                if (string.IsNullOrEmpty(language)) language = "en";
 | 
			
		||||
                List<Db.SurveyResponse> surveyResonses;
 | 
			
		||||
                surveyResonses = await surveyResponseDbContext.SurveyResponses.Where(a => a.SurveyId == surveyId).ToListAsync();
 | 
			
		||||
                var answers = await answerServiceProvider.getAnswersAsync(token);
 | 
			
		||||
                var Locations = await locationServiceProvider.getLocationsAsync(token);
 | 
			
		||||
                var regions = await regionServiceProvider.getRegionsAsync(token);
 | 
			
		||||
                var questions = await questionServiceProvider.getQuestionsAsync(language, token);
 | 
			
		||||
                var categories = await questionServiceProvider.GetQuestionCategoriesAsync(language, token);
 | 
			
		||||
                var attachments = await attachmentServiceProvider.getAttachmentsAsync(token);
 | 
			
		||||
                var answers = await answerServiceProvider.getAnswersAsync();
 | 
			
		||||
                var Locations = await locationServiceProvider.getLocationsAsync();
 | 
			
		||||
                var regions = await regionServiceProvider.getRegionsAsync();
 | 
			
		||||
                var questions = await questionServiceProvider.getQuestionsAsync(language);
 | 
			
		||||
                var categories = await questionServiceProvider.GetQuestionCategoriesAsync(language);
 | 
			
		||||
                var attachments = await attachmentServiceProvider.getAttachmentsAsync();
 | 
			
		||||
                List<object> questionLists = new List<object>();
 | 
			
		||||
                var allques = from res in surveyResonses
 | 
			
		||||
                              join loc in Locations on res.LocationId equals loc.Id
 | 
			
		||||
@ -828,8 +866,8 @@ namespace DamageAssesment.Api.Responses.Providers
 | 
			
		||||
                {
 | 
			
		||||
                    surveyResponses = await surveyResponseDbContext.SurveyResponses.Where(x => x.SurveyId == surveyId && x.EmployeeId == employeeid).ToListAsync();
 | 
			
		||||
                }
 | 
			
		||||
                var answers = await answerServiceProvider.getAnswersAsync(token);
 | 
			
		||||
                var locations = await locationServiceProvider.getLocationsAsync(token);
 | 
			
		||||
                var answers = await answerServiceProvider.getAnswersAsync();
 | 
			
		||||
                var locations = await locationServiceProvider.getLocationsAsync();
 | 
			
		||||
                var maintenanceCenters = locations.DistinctBy(m => m.MaintenanceCenter);
 | 
			
		||||
 | 
			
		||||
                //get all the answers for the particular survey
 | 
			
		||||
@ -858,7 +896,7 @@ namespace DamageAssesment.Api.Responses.Providers
 | 
			
		||||
                                       select new
 | 
			
		||||
                                       {
 | 
			
		||||
                                           g.Key.MaintenanceCenter,
 | 
			
		||||
                                           Answers = new 
 | 
			
		||||
                                           Answers = new
 | 
			
		||||
                                           {
 | 
			
		||||
                                               g.Key.AnswerText,
 | 
			
		||||
                                               Counter = g.Count()
 | 
			
		||||
@ -895,12 +933,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)
 | 
			
		||||
                    {
 | 
			
		||||
@ -908,12 +946,14 @@ namespace DamageAssesment.Api.Responses.Providers
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                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,
 | 
			
		||||
@ -922,9 +962,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
 | 
			
		||||
 | 
			
		||||
@ -939,6 +981,7 @@ namespace DamageAssesment.Api.Responses.Providers
 | 
			
		||||
                                           }
 | 
			
		||||
                             };
 | 
			
		||||
                return result;
 | 
			
		||||
 | 
			
		||||
            }
 | 
			
		||||
            catch (Exception ex)
 | 
			
		||||
            {
 | 
			
		||||
@ -961,12 +1004,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)
 | 
			
		||||
                    {
 | 
			
		||||
@ -976,10 +1019,11 @@ namespace DamageAssesment.Api.Responses.Providers
 | 
			
		||||
 | 
			
		||||
                //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,
 | 
			
		||||
@ -988,9 +1032,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
 | 
			
		||||
                                           && ans.QuestionId == question.Id
 | 
			
		||||
@ -1020,12 +1066,12 @@ namespace DamageAssesment.Api.Responses.Providers
 | 
			
		||||
        {
 | 
			
		||||
            if (answerRequest != null)
 | 
			
		||||
            {
 | 
			
		||||
                var answer = await answerServiceProvider.PostAnswersAsync(new Models.Answer { QuestionId = answerRequest.QuestionId, AnswerText = answerRequest.AnswerText, Comment = answerRequest.Comment, SurveyResponseId = surveyResponseId }, token);
 | 
			
		||||
                var answer = await answerServiceProvider.PostAnswersAsync(new Models.Answer { QuestionId = answerRequest.QuestionId, AnswerText = answerRequest.AnswerText, Comment = answerRequest.Comment, SurveyResponseId = surveyResponseId });
 | 
			
		||||
                if (answer != null)
 | 
			
		||||
                {
 | 
			
		||||
                    List<AnswerInfo> listAnswerInfo = new List<AnswerInfo>();
 | 
			
		||||
                    listAnswerInfo.Add(new AnswerInfo { AnswerId = answer.Id, postedFiles = answerRequest.PostedFiles });
 | 
			
		||||
                    var attachments = attachmentServiceProvider.PostAttachmentsAsync(new AttachmentInfo { ResponseId = surveyResponseId, Answers = listAnswerInfo }, token);
 | 
			
		||||
                    var attachments = attachmentServiceProvider.PostAttachmentsAsync(new AttachmentInfo { ResponseId = surveyResponseId, Answers = listAnswerInfo });
 | 
			
		||||
 | 
			
		||||
                    string message = $"Answer for question {answerRequest.QuestionId} saved to the database";
 | 
			
		||||
                    logger?.LogInformation(message);
 | 
			
		||||
@ -1046,13 +1092,14 @@ namespace DamageAssesment.Api.Responses.Providers
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        public async Task<(bool IsSuccess, Models.SurveyResponse SurveyResponse, string ErrorMessage)> PostSurveyAnswersAsync(Models.Request request)
 | 
			
		||||
        {
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                if (request != null)
 | 
			
		||||
                {
 | 
			
		||||
                    var response = await PostSurveyResponseAsync(new Models.SurveyResponse { SurveyId = request.SurveyId, EmployeeId = request.EmployeeId, LocationId = request.LocationId, ClientDevice = request.ClientDevice, KeyAnswerResult = request.KeyAnswerResult, Latitude = Convert.ToDouble(request.Latitude), Longitute = Convert.ToDouble(request.Longitute), CreatedDate=DateTime.Now });
 | 
			
		||||
                    var response = await PostSurveyResponseAsync(new Models.SurveyResponse { SurveyId = request.SurveyId, EmployeeId = request.EmployeeId, LocationId = request.LocationId, ClientDevice = request.ClientDevice, KeyAnswerResult = request.KeyAnswerResult, Latitude = Convert.ToDouble(request.Latitude), Longitute = Convert.ToDouble(request.Longitute), CreatedDate = DateTime.Now });
 | 
			
		||||
                    if (response.IsSuccess)
 | 
			
		||||
                    {
 | 
			
		||||
                        var surveyResponse = response.SurveyResponse;
 | 
			
		||||
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user