From 77816605d1106cf6c2176aad059e3abc115ce1e0 Mon Sep 17 00:00:00 2001 From: Reginald Cherenfant Jasmin Date: Wed, 20 Sep 2023 00:32:30 -0400 Subject: [PATCH 1/7] implementation of Authentication using JWT. Security applied on all microservices endpoints. --- .../Controllers/AnswersController.cs | 16 +- .../DamageAssesment.Api.Answers/Program.cs | 58 +++- .../Controllers/AttachmentsController.cs | 9 +- .../Program.cs | 57 +++- .../Controllers/DocumentsController.cs | 21 +- .../DASA_Documents/Active/Document_1.txt | 1 - .../DamageAssesment.Api.DocuLinks.csproj | 1 + .../DamageAssesment.Api.Documents/Program.cs | 59 +++- .../Properties/launchSettings.json | 2 +- .../appsettings.json | 4 + .../Controllers/EmployeesController.cs | 10 +- .../DamageAssesment.Api.Employees/Program.cs | 56 +++- .../appsettings.json | 7 +- .../Controllers/LocationsController.cs | 11 +- .../Controllers/RegionsController.cs | 11 +- .../DamageAssesment.Api.Locations/Program.cs | 60 +++- .../Controllers/QuestionsController.cs | 19 +- .../Models/Question.cs | 2 +- .../DamageAssesment.Api.Questions/Program.cs | 58 +++- .../Controllers/SurveyResponsesController.cs | 37 ++- ...j => DamageAssesment.Api.Responses.csproj} | 0 .../Interfaces/IAnswerServiceProvider.cs | 6 +- .../Interfaces/IAttachmentServiceProvider.cs | 4 +- .../Interfaces/IEmployeeServiceProvider.cs | 4 +- .../Interfaces/IHttpUtil.cs | 2 +- .../Interfaces/ILocationServiceProvider.cs | 2 +- .../Interfaces/IQuestionServiceProvider.cs | 6 +- .../Interfaces/IRegionServiceProvider.cs | 2 +- .../Interfaces/ISurveyServiceProvider.cs | 4 +- .../Interfaces/ISurveysResponse.cs | 16 +- .../Models/Employee.cs | 2 +- .../Program.cs | 56 +++- .../Providers/SurveyResponsesProvider.cs | 114 ++++--- .../Services/AnswerServiceProvider.cs | 13 +- .../Services/AttachmentServiceProvider.cs | 8 +- .../Services/EmployeeServiceProvider.cs | 8 +- .../Services/HttpUtil.cs | 7 +- .../Services/LocationServiceProvider.cs | 4 +- .../Services/QuestionServiceProvider.cs | 12 +- .../Services/RegionServiceProvider.cs | 4 +- .../Services/SurveyServiceProvider.cs | 8 +- .../appsettings.json | 3 + .../Controllers/SurveysController.cs | 9 +- .../DamageAssesment.Api.Surveys/Program.cs | 37 ++- .../Controllers/UsersAccessController.cs | 127 ++++++++ .../DamageAssesment.Api.UsersAccess.csproj | 20 ++ .../Db/Role.cs | 21 ++ .../Db/Token.cs | 17 + .../Db/User.cs | 31 ++ .../Db/UsersAccessDbContext.cs | 32 ++ .../Interfaces/IEmployeeServiceProvider.cs | 10 + .../Interfaces/IHttpUtil.cs | 7 + .../Interfaces/IRoleProvider.cs | 12 + .../Interfaces/ITokenServiceProvider.cs | 11 + .../Interfaces/IUsersAccessProvider.cs | 17 + .../Models/Employee.cs | 14 + .../Models/JwtSettings.cs | 9 + .../Models/Role.cs | 8 + .../Models/Token.cs | 10 + .../Models/TokenResponse.cs | 8 + .../Models/User.cs | 13 + .../Models/UserCredentials.cs | 5 + .../Profiles/UsersAccessProfile.cs | 14 + .../Program.cs | 146 +++++++++ .../Properties/launchSettings.json | 31 ++ .../Providers/UserAccessProvider.cs | 305 ++++++++++++++++++ .../Services/EmployeeServiceProvider.cs | 50 +++ .../Services/HttpUtil.cs | 42 +++ .../Services/ServiceProviderBase.cs | 25 ++ .../Services/TokenServiceProvider.cs | 59 ++++ .../appsettings.Development.json | 8 + .../appsettings.json | 36 +++ ...DamageAssesment.Api.Responses.Test.csproj} | 2 +- .../SurveyResponsesServiceTest.cs | 32 +- DamageAssesmentApi/DamageAssesment.sln | 11 +- 75 files changed, 1744 insertions(+), 219 deletions(-) delete mode 100644 DamageAssesmentApi/DamageAssesment.Api.Documents/DASA_Documents/Active/Document_1.txt rename DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/{DamageAssesment.Api.SurveyResponses.csproj => DamageAssesment.Api.Responses.csproj} (100%) create mode 100644 DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Controllers/UsersAccessController.cs create mode 100644 DamageAssesmentApi/DamageAssesment.Api.UsersAccess/DamageAssesment.Api.UsersAccess.csproj create mode 100644 DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Db/Role.cs create mode 100644 DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Db/Token.cs create mode 100644 DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Db/User.cs create mode 100644 DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Db/UsersAccessDbContext.cs create mode 100644 DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Interfaces/IEmployeeServiceProvider.cs create mode 100644 DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Interfaces/IHttpUtil.cs create mode 100644 DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Interfaces/IRoleProvider.cs create mode 100644 DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Interfaces/ITokenServiceProvider.cs create mode 100644 DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Interfaces/IUsersAccessProvider.cs create mode 100644 DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Models/Employee.cs create mode 100644 DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Models/JwtSettings.cs create mode 100644 DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Models/Role.cs create mode 100644 DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Models/Token.cs create mode 100644 DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Models/TokenResponse.cs create mode 100644 DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Models/User.cs create mode 100644 DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Models/UserCredentials.cs create mode 100644 DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Profiles/UsersAccessProfile.cs create mode 100644 DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Program.cs create mode 100644 DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Properties/launchSettings.json create mode 100644 DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Providers/UserAccessProvider.cs create mode 100644 DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Services/EmployeeServiceProvider.cs create mode 100644 DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Services/HttpUtil.cs create mode 100644 DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Services/ServiceProviderBase.cs create mode 100644 DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Services/TokenServiceProvider.cs create mode 100644 DamageAssesmentApi/DamageAssesment.Api.UsersAccess/appsettings.Development.json create mode 100644 DamageAssesmentApi/DamageAssesment.Api.UsersAccess/appsettings.json rename DamageAssesmentApi/DamageAssesment.SurveyResponses.Test/{DamageAssesment.Api.SurveyResponses.Test.csproj => DamageAssesment.Api.Responses.Test.csproj} (95%) diff --git a/DamageAssesmentApi/DamageAssesment.Api.Answers/Controllers/AnswersController.cs b/DamageAssesmentApi/DamageAssesment.Api.Answers/Controllers/AnswersController.cs index a86cbf1..f794283 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Answers/Controllers/AnswersController.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.Answers/Controllers/AnswersController.cs @@ -1,7 +1,6 @@ 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 { @@ -16,7 +15,7 @@ namespace DamageAssesment.Api.Answers.Controllers /// /// Get all answers /// - + [Authorize(Roles = "admin")] [HttpGet("Answers")] public async Task GetAnswersAsync() { @@ -32,7 +31,7 @@ namespace DamageAssesment.Api.Answers.Controllers /// Get an answer based on answerId. /// - + [Authorize(Roles = "admin")] [HttpGet("Answers/{Id}")] public async Task GetAnswerByIdAsync(int Id) { @@ -48,6 +47,7 @@ namespace DamageAssesment.Api.Answers.Controllers /// /// Get all answers based on responseId. /// + [Authorize(Roles = "admin")] [HttpGet("Answers/ByResponse/{responseid}")] public async Task GetAnswersByResponseId(int responseid) { @@ -61,7 +61,7 @@ namespace DamageAssesment.Api.Answers.Controllers /// /// Get all answers based on questionId. /// - + [Authorize(Roles = "admin")] [HttpGet("Answers/ByQuestion/{questionid}")] public async Task AnswersByQuestionId(int questionid) { @@ -75,7 +75,7 @@ namespace DamageAssesment.Api.Answers.Controllers /// /// Update an existing answer. /// - + [Authorize(Roles = "admin")] [HttpPut("Answers")] public async Task UpdateAnswer(Models.Answer answer) { @@ -96,7 +96,7 @@ namespace DamageAssesment.Api.Answers.Controllers /// /// Save a new answer. /// - + [Authorize(Roles = "admin")] [HttpPost("Answers")] public async Task CreateAnswer(Models.Answer answer) { @@ -114,7 +114,7 @@ namespace DamageAssesment.Api.Answers.Controllers /// /// Delete an existing answer. /// - + [Authorize(Roles = "admin")] [HttpDelete("Answers/{id}")] public async Task DeleteAnswer(int id) { diff --git a/DamageAssesmentApi/DamageAssesment.Api.Answers/Program.cs b/DamageAssesmentApi/DamageAssesment.Api.Answers/Program.cs index 7229cf9..95475fe 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Answers/Program.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.Answers/Program.cs @@ -1,23 +1,73 @@ 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("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(c => +builder.Services.AddSwaggerGen(options => { // Include XML comments from your assembly var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"; var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile); - c.IncludeXmlComments(xmlPath); + options.IncludeXmlComments(xmlPath); + + OpenApiSecurityScheme securityDefinition = new OpenApiSecurityScheme() + { + Name = "Bearer", + BearerFormat = "JWT", + Scheme = "bearer", + Description = "Specify the authorization token.", + In = ParameterLocation.Header, + Type = SecuritySchemeType.Http, + }; + + options.AddSecurityDefinition("jwt_auth", securityDefinition); + + // Make sure swagger UI requires a Bearer token specified + OpenApiSecurityScheme securityScheme = new OpenApiSecurityScheme() + { + Reference = new OpenApiReference() + { + Id = "jwt_auth", + Type = ReferenceType.SecurityScheme + } + }; + + OpenApiSecurityRequirement securityRequirements = new OpenApiSecurityRequirement() + { + {securityScheme, new string[] { }}, + }; + + options.AddSecurityRequirement(securityRequirements); }); builder.Services.AddScoped(); builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies()); //4/30 @@ -35,7 +85,7 @@ if (app.Environment.IsDevelopment()) app.UseSwagger(); app.UseSwaggerUI(); } - +app.UseAuthentication(); app.UseAuthorization(); app.MapControllers(); diff --git a/DamageAssesmentApi/DamageAssesment.Api.Attachments/Controllers/AttachmentsController.cs b/DamageAssesmentApi/DamageAssesment.Api.Attachments/Controllers/AttachmentsController.cs index 0fcec65..4245281 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Attachments/Controllers/AttachmentsController.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.Attachments/Controllers/AttachmentsController.cs @@ -1,6 +1,7 @@ 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; @@ -21,7 +22,7 @@ namespace DamageAssesment.Api.Attachments.Controllers /// /// Get all attachments. /// - + [Authorize(Roles = "admin")] [HttpGet("Attachments")] public async Task GetAttachmentsAsync() { @@ -37,6 +38,7 @@ namespace DamageAssesment.Api.Attachments.Controllers /// /// Get all attachments by attachmentId. /// + [Authorize(Roles = "admin")] [HttpGet("Attachments/{id}")] public async Task GetAttachmentbyIdAsync(int id) { @@ -80,7 +82,7 @@ namespace DamageAssesment.Api.Attachments.Controllers /// /// Save new Attachment(s) /// - + [Authorize(Roles = "admin")] [HttpPost("Attachments"), DisableRequestSizeLimit] public async Task UploadAttachmentAsync(AttachmentInfo attachmentInfo) { @@ -107,7 +109,7 @@ namespace DamageAssesment.Api.Attachments.Controllers /// /// Modify an new attachment. /// - + [Authorize(Roles = "admin")] [HttpPut("Attachments"), DisableRequestSizeLimit] public async Task UpdateAttachmentAsync(AttachmentInfo attachmentInfo) { @@ -138,6 +140,7 @@ namespace DamageAssesment.Api.Attachments.Controllers /// /// Delete an existing attachment. /// + [Authorize(Roles = "admin")] [HttpDelete("Attachments/{id}")] public async Task DeleteAttachment(int id) { diff --git a/DamageAssesmentApi/DamageAssesment.Api.Attachments/Program.cs b/DamageAssesmentApi/DamageAssesment.Api.Attachments/Program.cs index 61ce1c5..9368b21 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Attachments/Program.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.Attachments/Program.cs @@ -1,25 +1,75 @@ 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("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(c => +builder.Services.AddSwaggerGen(options => { // Include XML comments from your assembly var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"; var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile); - c.IncludeXmlComments(xmlPath); + options.IncludeXmlComments(xmlPath); + + OpenApiSecurityScheme securityDefinition = new OpenApiSecurityScheme() + { + Name = "Bearer", + BearerFormat = "JWT", + Scheme = "bearer", + Description = "Specify the authorization token.", + In = ParameterLocation.Header, + Type = SecuritySchemeType.Http, + }; + + options.AddSecurityDefinition("jwt_auth", securityDefinition); + + // Make sure swagger UI requires a Bearer token specified + OpenApiSecurityScheme securityScheme = new OpenApiSecurityScheme() + { + Reference = new OpenApiReference() + { + Id = "jwt_auth", + Type = ReferenceType.SecurityScheme + } + }; + + OpenApiSecurityRequirement securityRequirements = new OpenApiSecurityRequirement() + { + {securityScheme, new string[] { }}, + }; + + options.AddSecurityRequirement(securityRequirements); }); builder.Services.AddScoped(); builder.Services.AddScoped(); @@ -45,6 +95,7 @@ if (app.Environment.IsDevelopment()) app.UseSwaggerUI(); } +app.UseAuthentication(); app.UseAuthorization(); app.UseHttpsRedirection(); diff --git a/DamageAssesmentApi/DamageAssesment.Api.Documents/Controllers/DocumentsController.cs b/DamageAssesmentApi/DamageAssesment.Api.Documents/Controllers/DocumentsController.cs index dcf43b9..baeb7b3 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Documents/Controllers/DocumentsController.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.Documents/Controllers/DocumentsController.cs @@ -2,6 +2,7 @@ using DamageAssesment.Api.Documents.Interfaces; using DamageAssesment.Api.Documents.Models; using DamageAssesment.Api.Documents.Providers; +using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; @@ -24,6 +25,7 @@ namespace DamageAssesment.Api.Documents.Controllers /// Get all document link type. /// [HttpGet] + [Authorize(Roles = "admin")] [Route("doculinks/types")] public async Task GetLinkTypesAsync() { @@ -37,6 +39,7 @@ namespace DamageAssesment.Api.Documents.Controllers /// /// Get a document link type by id. /// + [Authorize(Roles = "admin")] [HttpGet] [Route("doculinks/types/{id}")] public async Task GetLinkTypeAsync(int id) @@ -51,6 +54,7 @@ namespace DamageAssesment.Api.Documents.Controllers /// /// Update a existing document link type. /// + [Authorize(Roles = "admin")] [HttpPut] [Route("doculinks/types")] public async Task UpdateLinkType(Models.LinkType linkType) @@ -72,6 +76,7 @@ namespace DamageAssesment.Api.Documents.Controllers /// /// Create a new document link type. /// + [Authorize(Roles = "admin")] [HttpPost] [Route("doculinks/types")] public async Task CreateLinkType(Models.LinkType linkType) @@ -90,6 +95,7 @@ namespace DamageAssesment.Api.Documents.Controllers /// /// Delete a existing document link type by id. /// + [Authorize(Roles = "admin")] [HttpDelete] [Route("doculinks/types/{id}")] public async Task DeleteLinkType(int id) @@ -101,11 +107,12 @@ namespace DamageAssesment.Api.Documents.Controllers } return NotFound(); } - /// - /// Get all documents. - /// - /// - [Route("doculinks")] + /// + /// Get all documents. + /// + + [Authorize(Roles = "admin")] + [Route("doculinks")] [Route("doculinks/{linktype:alpha}")] [Route("doculinks/{linktype:alpha}/{language:alpha}")] [HttpGet] @@ -138,6 +145,7 @@ namespace DamageAssesment.Api.Documents.Controllers /// /// Get a document by id. /// + [Authorize(Roles = "admin")] [HttpGet] [Route("doculinks/{id}")] [Route("doculinks/{id}/{linktype:alpha}")] @@ -154,6 +162,7 @@ namespace DamageAssesment.Api.Documents.Controllers /// /// Upload new document. /// + [Authorize(Roles = "admin")] [HttpPut] [Route("doculinks/{id}")] public async Task UpdateDocument(int id,DocumentInfo documentInfo) @@ -178,6 +187,7 @@ namespace DamageAssesment.Api.Documents.Controllers /// /// update existing document. /// + [Authorize(Roles = "admin")] [HttpPost] [Route("doculinks")] public async Task CreateDocument(DocumentInfo documentInfo) @@ -205,6 +215,7 @@ namespace DamageAssesment.Api.Documents.Controllers /// /// Delete document by id. /// + [Authorize(Roles = "admin")] [HttpDelete] [Route("doculinks/{id}")] public async Task DeleteDocument(int id) diff --git a/DamageAssesmentApi/DamageAssesment.Api.Documents/DASA_Documents/Active/Document_1.txt b/DamageAssesmentApi/DamageAssesment.Api.Documents/DASA_Documents/Active/Document_1.txt deleted file mode 100644 index eed7e79..0000000 --- a/DamageAssesmentApi/DamageAssesment.Api.Documents/DASA_Documents/Active/Document_1.txt +++ /dev/null @@ -1 +0,0 @@ -sample \ No newline at end of file diff --git a/DamageAssesmentApi/DamageAssesment.Api.Documents/DamageAssesment.Api.DocuLinks.csproj b/DamageAssesmentApi/DamageAssesment.Api.Documents/DamageAssesment.Api.DocuLinks.csproj index dab0e6c..f7da769 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Documents/DamageAssesment.Api.DocuLinks.csproj +++ b/DamageAssesmentApi/DamageAssesment.Api.Documents/DamageAssesment.Api.DocuLinks.csproj @@ -10,6 +10,7 @@ + diff --git a/DamageAssesmentApi/DamageAssesment.Api.Documents/Program.cs b/DamageAssesmentApi/DamageAssesment.Api.Documents/Program.cs index c9db54e..8134622 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Documents/Program.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.Documents/Program.cs @@ -2,23 +2,73 @@ using DamageAssesment.Api.Documents.Db; using DamageAssesment.Api.Documents.Interfaces; using DamageAssesment.Api.Documents.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("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(c => +builder.Services.AddSwaggerGen(options => { // Include XML comments from your assembly var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"; var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile); - c.IncludeXmlComments(xmlPath); + options.IncludeXmlComments(xmlPath); + + OpenApiSecurityScheme securityDefinition = new OpenApiSecurityScheme() + { + Name = "Bearer", + BearerFormat = "JWT", + Scheme = "bearer", + Description = "Specify the authorization token.", + In = ParameterLocation.Header, + Type = SecuritySchemeType.Http, + }; + + options.AddSecurityDefinition("jwt_auth", securityDefinition); + + // Make sure swagger UI requires a Bearer token specified + OpenApiSecurityScheme securityScheme = new OpenApiSecurityScheme() + { + Reference = new OpenApiReference() + { + Id = "jwt_auth", + Type = ReferenceType.SecurityScheme + } + }; + + OpenApiSecurityRequirement securityRequirements = new OpenApiSecurityRequirement() + { + {securityScheme, new string[] { }}, + }; + + options.AddSecurityRequirement(securityRequirements); }); // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle builder.Services.AddEndpointsApiExplorer(); -builder.Services.AddSwaggerGen(); +//builder.Services.AddSwaggerGen(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); @@ -36,6 +86,7 @@ if (app.Environment.IsDevelopment()) app.UseSwaggerUI(); } +app.UseAuthentication(); app.UseAuthorization(); app.MapControllers(); diff --git a/DamageAssesmentApi/DamageAssesment.Api.Documents/Properties/launchSettings.json b/DamageAssesmentApi/DamageAssesment.Api.Documents/Properties/launchSettings.json index e4e08ae..fcc4c27 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Documents/Properties/launchSettings.json +++ b/DamageAssesmentApi/DamageAssesment.Api.Documents/Properties/launchSettings.json @@ -14,7 +14,7 @@ "dotnetRunMessages": true, "launchBrowser": true, "launchUrl": "swagger", - "applicationUrl": "http://localhost:5133", + "applicationUrl": "http://localhost:5136", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } diff --git a/DamageAssesmentApi/DamageAssesment.Api.Documents/appsettings.json b/DamageAssesmentApi/DamageAssesment.Api.Documents/appsettings.json index e38d9fb..9d665b2 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Documents/appsettings.json +++ b/DamageAssesmentApi/DamageAssesment.Api.Documents/appsettings.json @@ -6,8 +6,12 @@ } }, "AllowedHosts": "*", + "JwtSettings": { + "securitykey": "bWlhbWkgZGFkZSBzY2hvb2xzIHNlY3JldCBrZXk=" + }, "Fileupload": { "folderpath": "DASA_Documents/Active", "Deletepath": "DASA_Documents/Deleted" } } + diff --git a/DamageAssesmentApi/DamageAssesment.Api.Employees/Controllers/EmployeesController.cs b/DamageAssesmentApi/DamageAssesment.Api.Employees/Controllers/EmployeesController.cs index f5e0d88..019df03 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Employees/Controllers/EmployeesController.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.Employees/Controllers/EmployeesController.cs @@ -1,4 +1,5 @@ using DamageAssesment.Api.Employees.Interfaces; +using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; @@ -18,7 +19,7 @@ namespace DamageAssesment.Api.Employees.Controllers /// /// GET request for retrieving employees. /// - + [Authorize(Roles = "admin")] [HttpGet("Employees")] public async Task GetEmployeesAsync() { @@ -35,7 +36,7 @@ namespace DamageAssesment.Api.Employees.Controllers /// /// GET request for retrieving an employee by ID. /// - + [Authorize(Roles = "admin")] [HttpGet("Employees/{id}")] public async Task GetEmployeeByIdAsync(int id) { @@ -48,11 +49,12 @@ namespace DamageAssesment.Api.Employees.Controllers return NotFound(); } - + /// /// PUT request for updating an existing employee. /// /// The updated employee object. + [Authorize(Roles = "admin")] [HttpPut("Employees/{id}")] public async Task UpdateEmployee(int id, Models.Employee Employee) { @@ -75,6 +77,7 @@ namespace DamageAssesment.Api.Employees.Controllers /// POST request for creating a new employee. /// /// The employee information for creating a new employee. + [Authorize(Roles = "admin")] [HttpPost("Employees")] public async Task CreateEmployee(Models.Employee Employee) { @@ -93,6 +96,7 @@ namespace DamageAssesment.Api.Employees.Controllers /// DELETE request for deleting an existing employee. /// /// The ID of the employee to be deleted. + [Authorize(Roles = "admin")] [HttpDelete("Employees/{id}")] public async Task DeleteEmployee(int id) { diff --git a/DamageAssesmentApi/DamageAssesment.Api.Employees/Program.cs b/DamageAssesmentApi/DamageAssesment.Api.Employees/Program.cs index 1e88127..a4cf2df 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Employees/Program.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.Employees/Program.cs @@ -1,23 +1,74 @@ 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("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(c => +builder.Services.AddSwaggerGen(options => { // Include XML comments from your assembly var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"; var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile); - c.IncludeXmlComments(xmlPath); + options.IncludeXmlComments(xmlPath); + + OpenApiSecurityScheme securityDefinition = new OpenApiSecurityScheme() + { + Name = "Bearer", + BearerFormat = "JWT", + Scheme = "bearer", + Description = "Specify the authorization token.", + In = ParameterLocation.Header, + Type = SecuritySchemeType.Http, + }; + + options.AddSecurityDefinition("jwt_auth", securityDefinition); + + // Make sure swagger UI requires a Bearer token specified + OpenApiSecurityScheme securityScheme = new OpenApiSecurityScheme() + { + Reference = new OpenApiReference() + { + Id = "jwt_auth", + Type = ReferenceType.SecurityScheme + } + }; + + OpenApiSecurityRequirement securityRequirements = new OpenApiSecurityRequirement() + { + {securityScheme, new string[] { }}, + }; + + options.AddSecurityRequirement(securityRequirements); }); builder.Services.AddScoped(); @@ -43,6 +94,7 @@ if (app.Environment.IsDevelopment()) } } +app.UseAuthentication(); app.UseAuthorization(); app.MapControllers(); diff --git a/DamageAssesmentApi/DamageAssesment.Api.Employees/appsettings.json b/DamageAssesmentApi/DamageAssesment.Api.Employees/appsettings.json index 1a1f3fe..ff5949d 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Employees/appsettings.json +++ b/DamageAssesmentApi/DamageAssesment.Api.Employees/appsettings.json @@ -8,10 +8,5 @@ "Microsoft.AspNetCore": "Warning" } }, - "AllowedHosts": "*", - "settings": { - "endpoint1": "xxx", - "endpoint2": "xxx", - "endpoint3": "xxx" - } + "AllowedHosts": "*" } diff --git a/DamageAssesmentApi/DamageAssesment.Api.Locations/Controllers/LocationsController.cs b/DamageAssesmentApi/DamageAssesment.Api.Locations/Controllers/LocationsController.cs index d9bbea3..da06bee 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Locations/Controllers/LocationsController.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.Locations/Controllers/LocationsController.cs @@ -1,4 +1,5 @@ using DamageAssesment.Api.Locations.Interfaces; +using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; @@ -15,7 +16,7 @@ namespace DamageAssesment.Api.Locations.Controllers /// /// Get all locations. /// - + [Authorize(Roles = "admin")] [HttpGet("Locations")] public async Task GetLocationsAsync() { @@ -31,7 +32,7 @@ namespace DamageAssesment.Api.Locations.Controllers /// /// Get all locations based on locationdId. /// - + [Authorize(Roles = "admin")] [HttpGet("Locations/{id}")] public async Task GetLocationByIdAsync(int id) { @@ -47,7 +48,7 @@ namespace DamageAssesment.Api.Locations.Controllers /// /// Update a Location. /// - + [Authorize(Roles = "admin")] [HttpPut("Locations/{id}")] public async Task UpdateLocation(int id, Models.Location Location) { @@ -65,7 +66,7 @@ namespace DamageAssesment.Api.Locations.Controllers /// /// Save a new location. /// - + [Authorize(Roles = "admin")] [HttpPost("Locations")] public async Task CreateLocation(Models.Location Location) { @@ -83,7 +84,7 @@ namespace DamageAssesment.Api.Locations.Controllers /// /// Delete an existing location. /// - + [Authorize(Roles = "admin")] [HttpDelete("Locations/{id}")] public async Task DeleteLocation(int id) { diff --git a/DamageAssesmentApi/DamageAssesment.Api.Locations/Controllers/RegionsController.cs b/DamageAssesmentApi/DamageAssesment.Api.Locations/Controllers/RegionsController.cs index 172043c..d7fe03c 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Locations/Controllers/RegionsController.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.Locations/Controllers/RegionsController.cs @@ -1,4 +1,5 @@ using DamageAssesment.Api.Locations.Interfaces; +using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; namespace DamageAssesment.Api.Locations.Controllers @@ -15,7 +16,7 @@ namespace DamageAssesment.Api.Locations.Controllers /// /// Get all regions.2 /// - + [Authorize(Roles = "admin")] [HttpGet("regions")] public async Task GetRegionsAsync() { @@ -29,7 +30,7 @@ namespace DamageAssesment.Api.Locations.Controllers /// /// GET request for retrieving a region by its ID. /// - + [Authorize(Roles = "admin")] [HttpGet("regions/{id}")] public async Task GetRegionAsync(int id) { @@ -43,7 +44,7 @@ namespace DamageAssesment.Api.Locations.Controllers /// /// POST request for creating a new region. /// - + [Authorize(Roles = "admin")] [HttpPost("regions")] public async Task PostRegionAsync(Models.Region region) { @@ -57,7 +58,7 @@ namespace DamageAssesment.Api.Locations.Controllers /// /// PUT request for updating an existing region. /// - + [Authorize(Roles = "admin")] [HttpPut("regions/{id}")] public async Task PutRegionAsync(int id, Models.Region region) { @@ -75,7 +76,7 @@ namespace DamageAssesment.Api.Locations.Controllers /// DELETE request for deleting a region based on ID. /// - + [Authorize(Roles = "admin")] [HttpDelete("regions/{id}")] public async Task DeleteRegionAsync(int id) { diff --git a/DamageAssesmentApi/DamageAssesment.Api.Locations/Program.cs b/DamageAssesmentApi/DamageAssesment.Api.Locations/Program.cs index 200e39b..6563a8b 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Locations/Program.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.Locations/Program.cs @@ -1,23 +1,73 @@ 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("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(c => +builder.Services.AddSwaggerGen(options => { // Include XML comments from your assembly var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"; var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile); - c.IncludeXmlComments(xmlPath); + options.IncludeXmlComments(xmlPath); + + OpenApiSecurityScheme securityDefinition = new OpenApiSecurityScheme() + { + Name = "Bearer", + BearerFormat = "JWT", + Scheme = "bearer", + Description = "Specify the authorization token.", + In = ParameterLocation.Header, + Type = SecuritySchemeType.Http, + }; + + options.AddSecurityDefinition("jwt_auth", securityDefinition); + + // Make sure swagger UI requires a Bearer token specified + OpenApiSecurityScheme securityScheme = new OpenApiSecurityScheme() + { + Reference = new OpenApiReference() + { + Id = "jwt_auth", + Type = ReferenceType.SecurityScheme + } + }; + + OpenApiSecurityRequirement securityRequirements = new OpenApiSecurityRequirement() + { + {securityScheme, new string[] { }}, + }; + + options.AddSecurityRequirement(securityRequirements); }); builder.Services.AddScoped(); builder.Services.AddScoped(); @@ -26,7 +76,10 @@ builder.Services.AddDbContext(option => { option.UseInMemoryDatabase("Locations"); }); + + var app = builder.Build(); +// Add services to the container. // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) @@ -44,6 +97,7 @@ if (app.Environment.IsDevelopment()) } } +app.UseAuthentication(); app.UseAuthorization(); app.MapControllers(); diff --git a/DamageAssesmentApi/DamageAssesment.Api.Questions/Controllers/QuestionsController.cs b/DamageAssesmentApi/DamageAssesment.Api.Questions/Controllers/QuestionsController.cs index 17024eb..3799b40 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Questions/Controllers/QuestionsController.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.Questions/Controllers/QuestionsController.cs @@ -1,4 +1,5 @@ using DamageAssesment.Api.Questions.Interfaces; +using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; namespace DamageAssesment.Api.Questions.Controllers @@ -10,16 +11,14 @@ namespace DamageAssesment.Api.Questions.Controllers public QuestionsController(IQuestionsProvider questionsProvider) { - this.questionsProvider = questionsProvider; - } - /// /// GET request for retrieving questions. /// - // get all questions + //get all questions + [Authorize(Roles = "admin,survey,user,report")] [Route("Questions")] [Route("Questions/{language:alpha}")] [HttpGet] @@ -37,6 +36,7 @@ namespace DamageAssesment.Api.Questions.Controllers /// /// GET request for retrieving a question by ID. /// + [Authorize(Roles = "admin,survey,user,report")] [Route("Questions/{id}/{language:alpha}")] [Route("Questions/{id:int}")] [HttpGet] @@ -55,6 +55,7 @@ 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 /// + [Authorize(Roles = "admin,survey,user,report")] [Route("Questions/BySurvey/{surveyId:int}")] [Route("Questions/BySurvey/{surveyId:int}/{language:alpha}")] [HttpGet] @@ -71,6 +72,7 @@ namespace DamageAssesment.Api.Questions.Controllers /// PUT request for updating a question (multilingual). /// + [Authorize(Roles = "admin")] [HttpPut("Questions")] public async Task UpdateQuestion(Models.Question question) { @@ -92,6 +94,7 @@ namespace DamageAssesment.Api.Questions.Controllers /// POST request for creating a new question (multilingual). /// + [Authorize(Roles = "admin")] [HttpPost("Questions")] public async Task CreateQuestion(Models.Question question) { @@ -110,6 +113,7 @@ namespace DamageAssesment.Api.Questions.Controllers /// DELETE request for deleting a question based on ID. /// + [Authorize(Roles = "admin")] [HttpDelete("Questions/{id}")] public async Task DeleteQuestion(int id) { @@ -125,6 +129,7 @@ namespace DamageAssesment.Api.Questions.Controllers /// GET request for retrieving question categories. /// + [Authorize(Roles = "admin,user,report")] [HttpGet("Questions/Categories")] [HttpGet("Questions/Categories/{language:alpha}")] public async Task GetQuestionCategoriesAsync(string? language) @@ -139,7 +144,7 @@ namespace DamageAssesment.Api.Questions.Controllers /// /// GET request for retrieving a question category by ID. /// - + [Authorize(Roles = "admin,report")] [HttpGet("Questions/Categories/{id:int}")] [HttpGet("Questions/Categories/{id:int}/{language:alpha}")] public async Task GetQuestionCategoryAsync(int id,string? language) @@ -156,7 +161,7 @@ namespace DamageAssesment.Api.Questions.Controllers /// /// PUT request for updating a question category. /// - + [Authorize(Roles = "admin,survey,report")] [HttpPut("Questions/Categories")] public async Task UpdateQuestionCategory(Models.QuestionCategory questionCategory) { @@ -178,6 +183,7 @@ namespace DamageAssesment.Api.Questions.Controllers /// POST request for creating a new question category. /// + [Authorize(Roles = "admin")] [HttpPost("Questions/Categories")] public async Task CreateQuestionCategory(Models.QuestionCategory questionCategory) { @@ -196,6 +202,7 @@ namespace DamageAssesment.Api.Questions.Controllers /// DELETE request for deleting a question category based on ID. /// + [Authorize(Roles = "admin")] [HttpDelete("Questions/Categories/{id}")] public async Task DeleteQuestionCategory(int id) { diff --git a/DamageAssesmentApi/DamageAssesment.Api.Questions/Models/Question.cs b/DamageAssesmentApi/DamageAssesment.Api.Questions/Models/Question.cs index b6c1668..f7fe7fb 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Questions/Models/Question.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.Questions/Models/Question.cs @@ -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; } } } diff --git a/DamageAssesmentApi/DamageAssesment.Api.Questions/Program.cs b/DamageAssesmentApi/DamageAssesment.Api.Questions/Program.cs index 073cb10..ac0eed7 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Questions/Program.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.Questions/Program.cs @@ -1,11 +1,33 @@ 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("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(); @@ -17,13 +39,41 @@ builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies()); builder.Services.AddEndpointsApiExplorer(); //builder.Services.AddSwaggerGen(); -builder.Services.AddSwaggerGen(c => +builder.Services.AddSwaggerGen(options => { // Include XML comments from your assembly var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"; var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile); - c.IncludeXmlComments(xmlPath); + options.IncludeXmlComments(xmlPath); + + OpenApiSecurityScheme securityDefinition = new OpenApiSecurityScheme() + { + Name = "Bearer", + BearerFormat = "JWT", + Scheme = "bearer", + Description = "Specify the authorization token.", + In = ParameterLocation.Header, + Type = SecuritySchemeType.Http, + }; + + options.AddSecurityDefinition("jwt_auth", securityDefinition); + + // Make sure swagger UI requires a Bearer token specified + OpenApiSecurityScheme securityScheme = new OpenApiSecurityScheme() + { + Reference = new OpenApiReference() + { + Id = "jwt_auth", + Type = ReferenceType.SecurityScheme + } + }; + OpenApiSecurityRequirement securityRequirements = new OpenApiSecurityRequirement() + { + {securityScheme, new string[] { }}, + }; + options.AddSecurityRequirement(securityRequirements); }); + builder.Services.AddDbContext(option => { option.UseInMemoryDatabase("Questions"); @@ -43,7 +93,7 @@ if (app.Environment.IsDevelopment()) questionProvider.SeedData(); } } - +app.UseAuthentication(); app.UseAuthorization(); app.MapControllers(); diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Controllers/SurveyResponsesController.cs b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Controllers/SurveyResponsesController.cs index e5f3917..3e9246f 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Controllers/SurveyResponsesController.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Controllers/SurveyResponsesController.cs @@ -3,6 +3,7 @@ using DamageAssesment.Api.SurveyResponses.Models; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Configuration; +using System.IdentityModel.Tokens.Jwt; namespace DamageAssesment.Api.SurveyResponses.Controllers { @@ -10,10 +11,20 @@ namespace DamageAssesment.Api.SurveyResponses.Controllers public class SurveyResponsesController : ControllerBase { private readonly ISurveysResponse surveyResponseProvider; - - public SurveyResponsesController(ISurveysResponse surveyResponseProvider) + private string token; + private readonly IHttpContextAccessor httpContextAccessor; + public SurveyResponsesController(ISurveysResponse surveyResponseProvider, IHttpContextAccessor httpContextAccessor) { this.surveyResponseProvider = surveyResponseProvider; + this.httpContextAccessor = httpContextAccessor; + token = httpContextAccessor.HttpContext.Request.Headers.Authorization; + if (token != null) + { + token = token.Replace("Bearer ", string.Empty); + } else + { + token = ""; + } } /// /// GET request for retrieving survey responses. @@ -22,7 +33,7 @@ namespace DamageAssesment.Api.SurveyResponses.Controllers [HttpGet("Responses")] public async Task GetSurveyResponsesAsync() { - var result = await this.surveyResponseProvider.GetSurveyResponsesAsync(); + var result = await this.surveyResponseProvider.GetSurveyResponsesAsync(token); if (result.IsSuccess) { return Ok(result.surveyResponses); @@ -36,11 +47,11 @@ namespace DamageAssesment.Api.SurveyResponses.Controllers /// /// GET request for retrieving survey responses by survey ID. /// - + [HttpGet("Responses/BySurvey/{surveyid}")] public async Task GetSurveyResponsesAsync(int surveyid) { - var result = await this.surveyResponseProvider.GetSurveyResponsesBySurveyAsync(surveyid); + var result = await this.surveyResponseProvider.GetSurveyResponsesBySurveyAsync(surveyid, token); if (result.IsSuccess) { return Ok(result.SurveyResponses); @@ -56,7 +67,7 @@ namespace DamageAssesment.Api.SurveyResponses.Controllers [HttpGet("Responses/{surveyid}/{locationid}")] public async Task GetSurveyResponsesBySurveyAndLocationAsync(int surveyid, int locationid) { - var result = await this.surveyResponseProvider.GetSurveyResponsesBySurveyAndLocationAsync(surveyid, locationid); + var result = await this.surveyResponseProvider.GetSurveyResponsesBySurveyAndLocationAsync(surveyid, locationid, token); if (result.IsSuccess) { return Ok(result.SurveyResponses); @@ -73,8 +84,8 @@ namespace DamageAssesment.Api.SurveyResponses.Controllers [HttpGet("Responses/ByAnswer/{surveyid}/{questionid}/{answer}")] public async Task GetSurveyResponsesByAnswerAsyncAsync(int surveyid, int questionid, string answer) - { - var result = await surveyResponseProvider.GetResponsesByAnswerAsync(surveyid, questionid, answer); + { + var result = await surveyResponseProvider.GetResponsesByAnswerAsync(surveyid, questionid, answer, token); if (result.IsSuccess) { return Ok(result.SurveyResponses); @@ -90,7 +101,7 @@ namespace DamageAssesment.Api.SurveyResponses.Controllers [HttpGet("Responses/ByRegion/{surveyid}")] public async Task GetAnswersByRegionAsync(int surveyid) { - var result = await this.surveyResponseProvider.GetAnswersByRegionAsync(surveyid); + var result = await this.surveyResponseProvider.GetAnswersByRegionAsync(surveyid, token); if (result.IsSuccess) { return Ok(result.Answers); @@ -105,7 +116,7 @@ namespace DamageAssesment.Api.SurveyResponses.Controllers [HttpGet("Responses/ByMaintenanceCenter/{surveyid}")] public async Task GetAnswersByMaintenaceCentersync(int surveyid) { - var result = await this.surveyResponseProvider.GetSurveyResponsesByMaintenanceCenterAsync(surveyid); + var result = await this.surveyResponseProvider.GetSurveyResponsesByMaintenanceCenterAsync(surveyid, token); if (result.IsSuccess) { return Ok(result.SurveyResponses); @@ -120,7 +131,7 @@ namespace DamageAssesment.Api.SurveyResponses.Controllers [HttpGet("Responses/{id}")] public async Task GetSurveyResponseByIdAsync(int id) { - var result = await this.surveyResponseProvider.GetSurveyResponseByIdAsync(id); + var result = await this.surveyResponseProvider.GetSurveyResponseByIdAsync(id, token); if (result.IsSuccess) { return Ok(result.SurveyResponse); @@ -165,7 +176,7 @@ namespace DamageAssesment.Api.SurveyResponses.Controllers /// /// DELETE request for deleting an existing survey response. /// - + [HttpDelete("Responses/{id}")] public async Task DeleteSurveyResponseAsync(int id) { @@ -184,7 +195,7 @@ namespace DamageAssesment.Api.SurveyResponses.Controllers [HttpPost("Responses/Answers")] public async Task PostSurveyAnswersAsync(Request request) { - var result = await this.surveyResponseProvider.PostSurveyAnswersAsync(request); + var result = await this.surveyResponseProvider.PostSurveyAnswersAsync(request, token); if (result.IsSuccess) return Ok(result.SurveyResponse); diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/DamageAssesment.Api.SurveyResponses.csproj b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/DamageAssesment.Api.Responses.csproj similarity index 100% rename from DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/DamageAssesment.Api.SurveyResponses.csproj rename to DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/DamageAssesment.Api.Responses.csproj diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/IAnswerServiceProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/IAnswerServiceProvider.cs index e947659..2517daa 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/IAnswerServiceProvider.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/IAnswerServiceProvider.cs @@ -4,9 +4,9 @@ namespace DamageAssesment.Api.SurveyResponses.Interfaces { public interface IAnswerServiceProvider { - Task> getAnswersAsync(); - Task> GetAnswersByResponseIdAsync(int responseId); + Task> getAnswersAsync(string token); + Task> GetAnswersByResponseIdAsync(int responseId, string token); - Task PostAnswersAsync(Models.Answer answer); + Task PostAnswersAsync(Models.Answer answer, string token); } } diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/IAttachmentServiceProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/IAttachmentServiceProvider.cs index a20c91c..f22c3d0 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/IAttachmentServiceProvider.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/IAttachmentServiceProvider.cs @@ -4,7 +4,7 @@ namespace DamageAssesment.Api.SurveyResponses.Interfaces { public interface IAttachmentServiceProvider { - Task> getAttachmentsAsync(); - Task> PostAttachmentsAsync(Models.AttachmentInfo attachmentInfo); + Task> getAttachmentsAsync(string token); + Task> PostAttachmentsAsync(Models.AttachmentInfo attachmentInfo, string token); } } diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/IEmployeeServiceProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/IEmployeeServiceProvider.cs index 62031d5..9b1d2e1 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/IEmployeeServiceProvider.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/IEmployeeServiceProvider.cs @@ -4,7 +4,7 @@ namespace DamageAssesment.Api.SurveyResponses.Interfaces { public interface IEmployeeServiceProvider { - Task> getEmployeesAsync(); - Task getEmployeeAsync(int employeeId); + Task> getEmployeesAsync(string token); + Task getEmployeeAsync(int employeeId, string token); } } diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/IHttpUtil.cs b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/IHttpUtil.cs index e3f1e66..f262fa5 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/IHttpUtil.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/IHttpUtil.cs @@ -4,6 +4,6 @@ namespace DamageAssesment.Api.SurveyResponses.Interfaces { public interface IHttpUtil { - Task SendAsync(HttpMethod method, string url, string JsonInput); + Task SendAsync(HttpMethod method, string url, string JsonInput, string token); } } diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/ILocationServiceProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/ILocationServiceProvider.cs index 75db3f1..aae34b0 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/ILocationServiceProvider.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/ILocationServiceProvider.cs @@ -4,6 +4,6 @@ namespace DamageAssesment.Api.SurveyResponses.Interfaces { public interface ILocationServiceProvider { - Task> getLocationsAsync(); + Task> getLocationsAsync(string token); } } diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/IQuestionServiceProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/IQuestionServiceProvider.cs index ab5f5ba..4530034 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/IQuestionServiceProvider.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/IQuestionServiceProvider.cs @@ -4,8 +4,8 @@ namespace DamageAssesment.Api.SurveyResponses.Interfaces { public interface IQuestionServiceProvider { - Task> getQuestionsAsync(); - Task> getSurveyQuestionsAsync(int surveyId); - Task getQuestionsAsync(int questionId); + Task> getQuestionsAsync(string token); + Task> getSurveyQuestionsAsync(int surveyId, string token); + Task getQuestionsAsync(int questionId, string token); } } diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/IRegionServiceProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/IRegionServiceProvider.cs index 8aeb1f8..1d26e11 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/IRegionServiceProvider.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/IRegionServiceProvider.cs @@ -4,6 +4,6 @@ namespace DamageAssesment.Api.SurveyResponses.Interfaces { public interface IRegionServiceProvider { - Task> getRegionsAsync(); + Task> getRegionsAsync(string token); } } diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/ISurveyServiceProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/ISurveyServiceProvider.cs index 97d6461..7609d1d 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/ISurveyServiceProvider.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/ISurveyServiceProvider.cs @@ -4,7 +4,7 @@ namespace DamageAssesment.Api.SurveyResponses.Interfaces { public interface ISurveyServiceProvider { - Task> getSurveysAsync(); - Task getSurveyAsync(int surveyId); + Task> getSurveysAsync(string token); + Task getSurveyAsync(int surveyId,string token); } } diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/ISurveysResponse.cs b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/ISurveysResponse.cs index 536353c..de31140 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/ISurveysResponse.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/ISurveysResponse.cs @@ -5,19 +5,19 @@ namespace DamageAssesment.Api.SurveyResponses.Interfaces { public interface ISurveysResponse { - Task<(bool IsSuccess, dynamic Answers, string ErrorMessage)> GetAnswersByRegionAsync(int surveyId); + Task<(bool IsSuccess, dynamic Answers, string ErrorMessage)> GetAnswersByRegionAsync(int surveyId, string token); Task<(bool IsSuccess, Models.SurveyResponse SurveyResponse, string ErrorMessage)> PostSurveyResponseAsync(Models.SurveyResponse surveyResponse); // Task<(bool IsSuccess,dynamic surveyResponses, string ErrorMessage)> GetSurveyResponseAsync(int responseId); - Task<(bool IsSuccess, dynamic surveyResponses, string ErrorMessage)> GetSurveyResponsesAsync(); + Task<(bool IsSuccess, dynamic surveyResponses, string ErrorMessage)> GetSurveyResponsesAsync(string token); Task<(bool IsSuccess, Models.SurveyResponse SurveyResponse, string ErrorMessage)> PutSurveyResponseAsync(int Id, Models.SurveyResponse surveyResponse); Task<(bool IsSuccess, Models.SurveyResponse SurveyResponse, string ErrorMessage)> DeleteSurveyResponseAsync(int Id); - Task<(bool IsSuccess, dynamic SurveyResponse, string ErrorMessage)> GetSurveyResponseByIdAsync(int responseId); - Task<(bool IsSuccess, dynamic SurveyResponses, string ErrorMessage)> GetSurveyResponsesBySurveyAsync(int surveyId); - Task<(bool IsSuccess, dynamic SurveyResponses, string ErrorMessage)> GetSurveyResponsesBySurveyAndLocationAsync(int surveyId, int locationId); - Task<(bool IsSuccess, dynamic SurveyResponses, string ErrorMessage)> GetSurveyResponsesByMaintenanceCenterAsync(int surveyId); - Task<(bool IsSuccess, dynamic SurveyResponses, string ErrorMessage)> GetResponsesByAnswerAsync(int surveyId, int questionId, string answer); + Task<(bool IsSuccess, dynamic SurveyResponse, string ErrorMessage)> GetSurveyResponseByIdAsync(int responseId, string token); + Task<(bool IsSuccess, dynamic SurveyResponses, string ErrorMessage)> GetSurveyResponsesBySurveyAsync(int surveyId, string token); + Task<(bool IsSuccess, dynamic SurveyResponses, string ErrorMessage)> GetSurveyResponsesBySurveyAndLocationAsync(int surveyId, int locationId, string token); + Task<(bool IsSuccess, dynamic SurveyResponses, string ErrorMessage)> GetSurveyResponsesByMaintenanceCenterAsync(int surveyId, string token); + Task<(bool IsSuccess, dynamic SurveyResponses, string ErrorMessage)> GetResponsesByAnswerAsync(int surveyId, int questionId, string answer, string token); - Task<(bool IsSuccess, Models.SurveyResponse SurveyResponse, string ErrorMessage)> PostSurveyAnswersAsync(Request request); + Task<(bool IsSuccess, Models.SurveyResponse SurveyResponse, string ErrorMessage)> PostSurveyAnswersAsync(Request request, string token); } } diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/Employee.cs b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/Employee.cs index 9a06020..ab21448 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/Employee.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/Employee.cs @@ -11,6 +11,6 @@ namespace DamageAssesment.Api.SurveyResponses.Models public string OfficePhoneNumber { get; set; } public string Email { get; set; } public bool IsActive { get; set; } - public string? PreferredLanguage { get; set; } + public string PreferredLanguage { get; set; } } } diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Program.cs b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Program.cs index 8d27911..550d49c 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Program.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Program.cs @@ -5,6 +5,10 @@ using DamageAssesment.Api.SurveyResponses.Providers; using Microsoft.EntityFrameworkCore; using Polly; using System.Reflection; +using Microsoft.OpenApi.Models; +using Microsoft.AspNetCore.Authentication.JwtBearer; +using Microsoft.IdentityModel.Tokens; +using System.Text; var builder = WebApplication.CreateBuilder(args); const int maxApiCallRetries = 3; @@ -14,6 +18,24 @@ const int intervalForCircuitBraker = 5; //5 seconds // Add services to the container. +var authkey = builder.Configuration.GetValue("JwtSettings:securitykey"); +builder.Services.AddAuthentication(item => +{ + item.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; + item.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; +}).AddJwtBearer(item => +{ + item.RequireHttpsMetadata = true; + item.SaveToken = true; + item.TokenValidationParameters = new TokenValidationParameters() + { + ValidateIssuerSigningKey = true, + IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(authkey)), + ValidateIssuer = false, + ValidateAudience = false, + ClockSkew = TimeSpan.Zero + }; +}); builder.Services.AddControllers(); // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle @@ -26,6 +48,7 @@ builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); +builder.Services.AddHttpContextAccessor(); builder.Services.AddHttpClient(). AddTransientHttpErrorPolicy(policy => policy.WaitAndRetryAsync(maxApiCallRetries, _ => TimeSpan.FromSeconds(intervalToRetry))). @@ -35,12 +58,40 @@ builder.Services.AddHttpClient(). builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies()); builder.Services.AddEndpointsApiExplorer(); //builder.Services.AddSwaggerGen(); -builder.Services.AddSwaggerGen(c => + +builder.Services.AddSwaggerGen(options => { // Include XML comments from your assembly var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"; var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile); - c.IncludeXmlComments(xmlPath); + options.IncludeXmlComments(xmlPath); + + OpenApiSecurityScheme securityDefinition = new OpenApiSecurityScheme() + { + Name = "Bearer", + BearerFormat = "JWT", + Scheme = "bearer", + Description = "Specify the authorization token.", + In = ParameterLocation.Header, + Type = SecuritySchemeType.Http, + }; + + options.AddSecurityDefinition("jwt_auth", securityDefinition); + + // Make sure swagger UI requires a Bearer token specified + OpenApiSecurityScheme securityScheme = new OpenApiSecurityScheme() + { + Reference = new OpenApiReference() + { + Id = "jwt_auth", + Type = ReferenceType.SecurityScheme + } + }; + OpenApiSecurityRequirement securityRequirements = new OpenApiSecurityRequirement() + { + {securityScheme, new string[] { }}, + }; + options.AddSecurityRequirement(securityRequirements); }); builder.Services.AddDbContext(option => { @@ -55,6 +106,7 @@ if (app.Environment.IsDevelopment()) app.UseSwaggerUI(); } +app.UseAuthentication(); app.UseAuthorization(); app.MapControllers(); diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Providers/SurveyResponsesProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Providers/SurveyResponsesProvider.cs index 1f82d8c..d3641b1 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Providers/SurveyResponsesProvider.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Providers/SurveyResponsesProvider.cs @@ -48,7 +48,7 @@ namespace DamageAssesment.Api.SurveyResponses.Providers } } - public async Task<(bool IsSuccess, dynamic Answers, string ErrorMessage)> GetAnswersByRegionAsync(int surveyId) + public async Task<(bool IsSuccess, dynamic Answers, string ErrorMessage)> GetAnswersByRegionAsync(int surveyId,string token) { try { @@ -57,7 +57,7 @@ namespace DamageAssesment.Api.SurveyResponses.Providers if (listSurveyResponse.Any()) { - var answers = await getAnswersByRegionAndSurveyIdAsync(listSurveyResponse); + var answers = await getAnswersByRegionAndSurveyIdAsync(listSurveyResponse,token); return (true, answers, "Request Successful."); } else @@ -72,7 +72,7 @@ namespace DamageAssesment.Api.SurveyResponses.Providers } } - public async Task<(bool IsSuccess, dynamic SurveyResponse, string ErrorMessage)> GetSurveyResponseByIdAsync(int responseId) + public async Task<(bool IsSuccess, dynamic SurveyResponse, string ErrorMessage)> GetSurveyResponseByIdAsync(int responseId, string token) { try { @@ -81,7 +81,7 @@ namespace DamageAssesment.Api.SurveyResponses.Providers if (surveyResponse != null) { - var answers = await getSurveyResponseByResponseIdAsync(surveyResponse); + var answers = await getSurveyResponseByResponseIdAsync(surveyResponse, token); if (answers != null) return (true, answers, "Request Successful."); @@ -105,16 +105,16 @@ namespace DamageAssesment.Api.SurveyResponses.Providers - public async Task<(bool IsSuccess, dynamic SurveyResponses, string ErrorMessage)> GetSurveyResponsesBySurveyAsync(int surveyId) + public async Task<(bool IsSuccess, dynamic SurveyResponses, string ErrorMessage)> GetSurveyResponsesBySurveyAsync(int surveyId, string token) { try { logger?.LogInformation("Querying to get Survey object from microservice"); - var survey = await surveyServiceProvider.getSurveyAsync(surveyId); + var survey = await surveyServiceProvider.getSurveyAsync(surveyId,token); if (survey != null) { - var answers = await getSurveyResponsesBySurveyIdAsync(surveyId); + var answers = await getSurveyResponsesBySurveyIdAsync(surveyId, token); if (answers != null) return (true, answers, "Request Successful."); @@ -136,16 +136,16 @@ namespace DamageAssesment.Api.SurveyResponses.Providers } } - public async Task<(bool IsSuccess, dynamic SurveyResponses, string ErrorMessage)> GetSurveyResponsesBySurveyAndLocationAsync(int surveyId, int locationId) + public async Task<(bool IsSuccess, dynamic SurveyResponses, string ErrorMessage)> GetSurveyResponsesBySurveyAndLocationAsync(int surveyId, int locationId, string token) { try { logger?.LogInformation("Querying to get Survey object from microservice"); - var survey = await surveyServiceProvider.getSurveyAsync(surveyId); + var survey = await surveyServiceProvider.getSurveyAsync(surveyId, token); if (survey != null) { - var answers = await getSurveyResponsesBySurveyIdLocationIdAsync(surveyId, locationId); + var answers = await getSurveyResponsesBySurveyIdLocationIdAsync(surveyId, locationId, token); if (answers != null) return (true, answers, "Request Successful."); @@ -167,16 +167,16 @@ namespace DamageAssesment.Api.SurveyResponses.Providers } } - public async Task<(bool IsSuccess, dynamic SurveyResponses, string ErrorMessage)> GetSurveyResponsesByMaintenanceCenterAsync(int surveyId) + public async Task<(bool IsSuccess, dynamic SurveyResponses, string ErrorMessage)> GetSurveyResponsesByMaintenanceCenterAsync(int surveyId, string token) { try { logger?.LogInformation("Querying to get Survey object from microservice"); - var survey = await surveyServiceProvider.getSurveyAsync(surveyId); + var survey = await surveyServiceProvider.getSurveyAsync(surveyId, token); if (survey != null) { - var answers = await getResultsByMaintenanceCenterAsync(surveyId); + var answers = await getResultsByMaintenanceCenterAsync(surveyId,token); if (answers != null) return (true, answers, "Request Successful."); @@ -198,19 +198,19 @@ namespace DamageAssesment.Api.SurveyResponses.Providers } } - public async Task<(bool IsSuccess, dynamic SurveyResponses, string ErrorMessage)> GetResponsesByAnswerAsync(int surveyId, int questionId, string answer) + public async Task<(bool IsSuccess, dynamic SurveyResponses, string ErrorMessage)> GetResponsesByAnswerAsync(int surveyId, int questionId, string answer, string token) { try { logger?.LogInformation("Querying to get Survey object from microservice"); - var survey = await surveyServiceProvider.getSurveyAsync(surveyId); - var question = await questionServiceProvider.getQuestionsAsync(questionId); + var survey = await surveyServiceProvider.getSurveyAsync(surveyId, token); + var question = await questionServiceProvider.getQuestionsAsync(questionId,token); bool IsCorrectAnswer = answer.ToLower().Equals("yes") || answer.ToLower().Equals("no") ? true : false; if (survey != null && question != null && IsCorrectAnswer) { - var answers = await getSurveyResponsesByAnswerAsync(survey, question, answer); + var answers = await getSurveyResponsesByAnswerAsync(survey, question, answer, token); if (answers != null) return (true, answers, "Request Successful."); @@ -233,11 +233,11 @@ namespace DamageAssesment.Api.SurveyResponses.Providers } - public async Task<(bool IsSuccess, dynamic surveyResponses, string ErrorMessage)> GetSurveyResponsesAsync() + public async Task<(bool IsSuccess, dynamic surveyResponses, string ErrorMessage)> GetSurveyResponsesAsync(string token) { try { - var answers = await getAllSurveyResponsesAsync(); + var answers = await getAllSurveyResponsesAsync(token); if (answers != null) return (true, answers, "Request Successful."); @@ -341,11 +341,11 @@ namespace DamageAssesment.Api.SurveyResponses.Providers } //Method to get Answers by region with surveyId as input parameter - private async Task getAnswersByRegionAndSurveyIdAsync(IQueryable surveyResponses) + private async Task getAnswersByRegionAndSurveyIdAsync(IQueryable surveyResponses, string token) { try { - var answersList = await answerServiceProvider.getAnswersAsync(); + var answersList = await answerServiceProvider.getAnswersAsync(token); if (answersList == null || !answersList.Any()) return null; @@ -368,8 +368,8 @@ namespace DamageAssesment.Api.SurveyResponses.Providers if (surveyAnswers == null || !surveyAnswers.Any()) return null; - var regions = await regionServiceProvider.getRegionsAsync(); - var locations = await locationServiceProvider.getLocationsAsync(); + var regions = await regionServiceProvider.getRegionsAsync(token); + var locations = await locationServiceProvider.getLocationsAsync(token); if (regions == null || !regions.Any() || locations == null || !locations.Any()) return null; @@ -427,15 +427,15 @@ namespace DamageAssesment.Api.SurveyResponses.Providers } //Method to get Survey Response by ResponseId - private async Task getSurveyResponseByResponseIdAsync(Db.SurveyResponse surveyResponse) + private async Task getSurveyResponseByResponseIdAsync(Db.SurveyResponse surveyResponse, string token) { try { - var employee = await employeeServiceProvider.getEmployeeAsync(surveyResponse.EmployeeId); - var answers = await answerServiceProvider.GetAnswersByResponseIdAsync(surveyResponse.Id); - var allQuestions = await questionServiceProvider.getQuestionsAsync(); + var employee = await employeeServiceProvider.getEmployeeAsync(surveyResponse.EmployeeId, token); + var answers = await answerServiceProvider.GetAnswersByResponseIdAsync(surveyResponse.Id, token); + var allQuestions = await questionServiceProvider.getQuestionsAsync(token); var questions = allQuestions.Where(s => s.SurveyId == surveyResponse.SurveyId); - var attachments = await attachmentServiceProvider.getAttachmentsAsync(); + var attachments = await attachmentServiceProvider.getAttachmentsAsync(token); var result = new { @@ -470,20 +470,19 @@ namespace DamageAssesment.Api.SurveyResponses.Providers //Method to get Survey Responses by surveyId - private async Task getSurveyResponsesBySurveyIdAsync(int surveyId) + private async Task getSurveyResponsesBySurveyIdAsync(int surveyId, string token) { try { var surveyResonses = await surveyResponseDbContext.SurveyResponses.Where(x => x.SurveyId == surveyId).ToListAsync(); - - var employees = await employeeServiceProvider.getEmployeesAsync(); - var answers = await answerServiceProvider.getAnswersAsync(); - var questions = await questionServiceProvider.getQuestionsAsync(); + var employees = await employeeServiceProvider.getEmployeesAsync(token); + var answers = await answerServiceProvider.getAnswersAsync(token); + var questions = await questionServiceProvider.getQuestionsAsync(token); var surveyQuestions = from q in questions where q.SurveyId == surveyId select q; //var surveyQuestions = await questionServiceProvider.getSurveyQuestionsAsync(surveyId); - var attachments = await attachmentServiceProvider.getAttachmentsAsync(); + var attachments = await attachmentServiceProvider.getAttachmentsAsync(token); var result = from r in surveyResonses select new { @@ -520,16 +519,15 @@ namespace DamageAssesment.Api.SurveyResponses.Providers //Method to get All Survey Responses - private async Task getAllSurveyResponsesAsync() + private async Task getAllSurveyResponsesAsync(string token) { try { var surveyResonses = await surveyResponseDbContext.SurveyResponses.ToListAsync(); - - var employees = await employeeServiceProvider.getEmployeesAsync(); - var answers = await answerServiceProvider.getAnswersAsync(); - var questions = await questionServiceProvider.getQuestionsAsync(); - var attachments = await attachmentServiceProvider.getAttachmentsAsync(); + var employees = await employeeServiceProvider.getEmployeesAsync(token); + var answers = await answerServiceProvider.getAnswersAsync(token); + var questions = await questionServiceProvider.getQuestionsAsync(token); + var attachments = await attachmentServiceProvider.getAttachmentsAsync(token); var result = from r in surveyResonses select new @@ -566,13 +564,13 @@ namespace DamageAssesment.Api.SurveyResponses.Providers //Method to get Answers By Maintenance Center by surveyId - private async Task getResultsByMaintenanceCenterAsync(int surveyId) + private async Task getResultsByMaintenanceCenterAsync(int surveyId, string token) { try { var surveyResponses = await surveyResponseDbContext.SurveyResponses.Where(x => x.SurveyId == surveyId).ToListAsync(); - var answers = await answerServiceProvider.getAnswersAsync(); - var locations = await locationServiceProvider.getLocationsAsync(); + var answers = await answerServiceProvider.getAnswersAsync(token); + var locations = await locationServiceProvider.getLocationsAsync(token); var maintenanceCenters = locations.DistinctBy(m => m.MaintenanceCenter); //get all the answers for the particular survey @@ -626,17 +624,16 @@ namespace DamageAssesment.Api.SurveyResponses.Providers } //Method to get Survey Responses by surveyId and LocationId - private async Task getSurveyResponsesBySurveyIdLocationIdAsync(int surveyId, int locationId) + private async Task getSurveyResponsesBySurveyIdLocationIdAsync(int surveyId, int locationId, string token) { try { var surveyResonses = await surveyResponseDbContext.SurveyResponses.Where(x => x.SurveyId == surveyId && x.LocationId.Equals(locationId)).ToListAsync(); - - var employees = await employeeServiceProvider.getEmployeesAsync(); - var answers = await answerServiceProvider.getAnswersAsync(); - var questions = await questionServiceProvider.getQuestionsAsync(); + var employees = await employeeServiceProvider.getEmployeesAsync(token); + var answers = await answerServiceProvider.getAnswersAsync(token); + var questions = await questionServiceProvider.getQuestionsAsync(token); var surveyQuestions = from q in questions where q.SurveyId == surveyId select q; - var attachments = await attachmentServiceProvider.getAttachmentsAsync(); + var attachments = await attachmentServiceProvider.getAttachmentsAsync(token); var result = from r in surveyResonses select new @@ -674,14 +671,14 @@ namespace DamageAssesment.Api.SurveyResponses.Providers //Method to get Survey Responses by surveyId questionId and answer - private async Task getSurveyResponsesByAnswerAsync(Survey survey, Question question, string answer) + private async Task getSurveyResponsesByAnswerAsync(Survey survey, Question question, string answer, string token) { try { var surveyResponses = await surveyResponseDbContext.SurveyResponses.Where(x => x.SurveyId == survey.Id).ToListAsync(); - var answers = await answerServiceProvider.getAnswersAsync(); - var employees = await employeeServiceProvider.getEmployeesAsync(); - var attachments = await attachmentServiceProvider.getAttachmentsAsync(); + var answers = await answerServiceProvider.getAnswersAsync(token); + var employees = await employeeServiceProvider.getEmployeesAsync(token); + var attachments = await attachmentServiceProvider.getAttachmentsAsync(token); var result = from r in surveyResponses select new @@ -720,16 +717,16 @@ namespace DamageAssesment.Api.SurveyResponses.Providers } - async Task ProcessAnswers(AnswerRequest answerRequest, int surveyResponseId) + async Task ProcessAnswers(AnswerRequest answerRequest, int surveyResponseId,string token) { if (answerRequest != null) { - var answer = await answerServiceProvider.PostAnswersAsync(new Models.Answer { QuestionId = answerRequest.QuestionId, AnswerText = answerRequest.AnswerText, Comment = answerRequest.Comment, SurveyResponseId = surveyResponseId }); + var answer = await answerServiceProvider.PostAnswersAsync(new Models.Answer { QuestionId = answerRequest.QuestionId, AnswerText = answerRequest.AnswerText, Comment = answerRequest.Comment, SurveyResponseId = surveyResponseId }, token); if (answer != null) { List listAnswerInfo = new List(); listAnswerInfo.Add(new AnswerInfo { AnswerId = answer.Id, postedFiles = answerRequest.PostedFiles }); - var attachments = attachmentServiceProvider.PostAttachmentsAsync(new AttachmentInfo { ResponseId = surveyResponseId, Answers = listAnswerInfo }); + var attachments = attachmentServiceProvider.PostAttachmentsAsync(new AttachmentInfo { ResponseId = surveyResponseId, Answers = listAnswerInfo }, token); string message = $"Answer for question {answerRequest.QuestionId} saved to the database"; logger?.LogInformation(message); @@ -750,8 +747,7 @@ namespace DamageAssesment.Api.SurveyResponses.Providers } } - - public async Task<(bool IsSuccess, Models.SurveyResponse SurveyResponse, string ErrorMessage)> PostSurveyAnswersAsync(Models.Request request) + public async Task<(bool IsSuccess, Models.SurveyResponse SurveyResponse, string ErrorMessage)> PostSurveyAnswersAsync(Models.Request request, string token) { try { @@ -761,7 +757,7 @@ namespace DamageAssesment.Api.SurveyResponses.Providers if (response.IsSuccess) { var surveyResponse = response.SurveyResponse; - var tasks = request.Answers.Select(x => ProcessAnswers(x, surveyResponse.Id)); + var tasks = request.Answers.Select(x => ProcessAnswers(x, surveyResponse.Id,token)); await Task.WhenAll(tasks); return (true, surveyResponse, null); } diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/AnswerServiceProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/AnswerServiceProvider.cs index 695ad3e..5ee1a39 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/AnswerServiceProvider.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/AnswerServiceProvider.cs @@ -1,5 +1,6 @@ using DamageAssesment.Api.SurveyResponses.Interfaces; using DamageAssesment.Api.SurveyResponses.Models; +using Microsoft.Extensions.Primitives; using Newtonsoft.Json; @@ -10,11 +11,11 @@ namespace DamageAssesment.Api.SurveyResponses.Services public AnswerServiceProvider(IConfiguration configuration, IHttpUtil httpUtil, ILogger logger) : base(configuration, httpUtil, logger, configuration.GetValue("RessourceSettings:Answer"), configuration.GetValue("EndPointSettings:AnswerUrlBase")) { } - public async Task> getAnswersAsync() + public async Task> getAnswersAsync(string token) { try { - var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null); + var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null, token); var answers = JsonConvert.DeserializeObject>(responseJsonString); if (answers == null || !answers.Any()) @@ -28,12 +29,12 @@ namespace DamageAssesment.Api.SurveyResponses.Services } } - public async Task> GetAnswersByResponseIdAsync(int responseId) + public async Task> GetAnswersByResponseIdAsync(int responseId, string token) { try { url = urlBase + string.Format(configuration.GetValue("RessourceSettings:AnswerByResponse"), responseId); - var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null); + var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null,token); var answers = JsonConvert.DeserializeObject>(responseJsonString); if (answers == null || !answers.Any()) @@ -47,12 +48,12 @@ namespace DamageAssesment.Api.SurveyResponses.Services } } - public async Task PostAnswersAsync(Answer answer) + public async Task PostAnswersAsync(Answer answer, string token ) { try { var requestJsonString = JsonConvert.SerializeObject(answer); - var responseJsonString = await httpUtil.SendAsync(HttpMethod.Post, url, requestJsonString); + var responseJsonString = await httpUtil.SendAsync(HttpMethod.Post, url, requestJsonString, token); var answers = JsonConvert.DeserializeObject(responseJsonString); if (answers == null) diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/AttachmentServiceProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/AttachmentServiceProvider.cs index 120e60f..25601fe 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/AttachmentServiceProvider.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/AttachmentServiceProvider.cs @@ -10,11 +10,11 @@ namespace DamageAssesment.Api.SurveyResponses.Services { } - public async Task> getAttachmentsAsync() + public async Task> getAttachmentsAsync(string token) { try { - var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null); + var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null,token); var attachments = JsonConvert.DeserializeObject>(responseJsonString); if (attachments == null || !attachments.Any()) @@ -28,12 +28,12 @@ namespace DamageAssesment.Api.SurveyResponses.Services } } - public async Task> PostAttachmentsAsync(AttachmentInfo attachmentInfo) + public async Task> PostAttachmentsAsync(AttachmentInfo attachmentInfo, string token) { try { var requestJsonString = JsonConvert.SerializeObject(attachmentInfo); - var responseJsonString = await httpUtil.SendAsync(HttpMethod.Post, url, requestJsonString); + var responseJsonString = await httpUtil.SendAsync(HttpMethod.Post, url, requestJsonString, token); var attachments = JsonConvert.DeserializeObject>(responseJsonString); if (attachments == null) diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/EmployeeServiceProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/EmployeeServiceProvider.cs index 8dd1352..0a598a6 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/EmployeeServiceProvider.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/EmployeeServiceProvider.cs @@ -11,11 +11,11 @@ namespace DamageAssesment.Api.SurveyResponses.Services { } - public async Task> getEmployeesAsync() + public async Task> getEmployeesAsync(string token) { try { - var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null); + var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null,token); var employees = JsonConvert.DeserializeObject>(responseJsonString); if (employees == null || !employees.Any()) @@ -29,12 +29,12 @@ namespace DamageAssesment.Api.SurveyResponses.Services } } - public async Task getEmployeeAsync(int employeeId) + public async Task getEmployeeAsync(int employeeId, string token) { try { url = urlBase + string.Format(configuration.GetValue("RessourceSettings:EmployeeById"), employeeId); - var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null); + var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null, token); var employee = JsonConvert.DeserializeObject(responseJsonString); if (employee == null) diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/HttpUtil.cs b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/HttpUtil.cs index 8b4755d..09e3582 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/HttpUtil.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/HttpUtil.cs @@ -1,4 +1,5 @@ using DamageAssesment.Api.SurveyResponses.Interfaces; +using DamageAssesment.Api.SurveyResponses.Models; using System.Net.Http.Headers; using System.Text; @@ -14,20 +15,18 @@ namespace DamageAssesment.Api.SurveyResponses.Services this.httpClient = httpClient; this.logger = logger; } - public async Task SendAsync(HttpMethod method, string url, string JsonInput) + public async Task SendAsync(HttpMethod method, string url, string JsonInput, string token) { try { var request = new HttpRequestMessage(method, url); request.Headers.Accept.Clear(); request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); - - //request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token); + request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token); if (method == HttpMethod.Post) { request.Content = new StringContent(JsonInput, Encoding.UTF8, "application/json"); } - var response = await httpClient.SendAsync(request, CancellationToken.None); response.EnsureSuccessStatusCode(); var responseString = await response.Content.ReadAsStringAsync(); diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/LocationServiceProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/LocationServiceProvider.cs index 2e3fa32..62ebf09 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/LocationServiceProvider.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/LocationServiceProvider.cs @@ -10,11 +10,11 @@ namespace DamageAssesment.Api.SurveyResponses.Services { } - public async Task> getLocationsAsync() + public async Task> getLocationsAsync(string token) { try { - var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null); + var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null, token); var locations = JsonConvert.DeserializeObject>(responseJsonString); if (locations == null || !locations.Any()) diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/QuestionServiceProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/QuestionServiceProvider.cs index 138011f..9f163c2 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/QuestionServiceProvider.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/QuestionServiceProvider.cs @@ -10,11 +10,11 @@ namespace DamageAssesment.Api.SurveyResponses.Services { } - public async Task> getQuestionsAsync() + public async Task> getQuestionsAsync(string token) { try { - var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null); + var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null,token); var questions = JsonConvert.DeserializeObject>(responseJsonString); if (questions == null || !questions.Any()) @@ -28,12 +28,12 @@ namespace DamageAssesment.Api.SurveyResponses.Services } } - public async Task> getSurveyQuestionsAsync(int surveyId) + public async Task> getSurveyQuestionsAsync(int surveyId, string token) { try { url = urlBase + string.Format(configuration.GetValue("RessourceSettings:SurveyQuestion"), surveyId); - var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null); + var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null, token); var questions = JsonConvert.DeserializeObject>(responseJsonString); if (questions == null || !questions.Any()) @@ -48,12 +48,12 @@ namespace DamageAssesment.Api.SurveyResponses.Services } - public async Task getQuestionsAsync(int questionId) + public async Task getQuestionsAsync(int questionId, string token) { try { url = urlBase + string.Format(configuration.GetValue("RessourceSettings:QuestionById"), questionId); - var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null); + var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null, token); var question = JsonConvert.DeserializeObject(responseJsonString); if (question == null) diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/RegionServiceProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/RegionServiceProvider.cs index 091512e..1b6ea07 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/RegionServiceProvider.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/RegionServiceProvider.cs @@ -9,11 +9,11 @@ namespace DamageAssesment.Api.SurveyResponses.Services public RegionServiceProvider(IConfiguration configuration, IHttpUtil httpUtil, ILogger logger) : base(configuration, httpUtil, logger, configuration.GetValue("RessourceSettings:Region"), configuration.GetValue("EndPointSettings:LocationUrlBase")) { } - public async Task> getRegionsAsync() + public async Task> getRegionsAsync(string token) { try { - var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null); + var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null, token); var regions = JsonConvert.DeserializeObject>(responseJsonString); if (regions == null || !regions.Any()) diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/SurveyServiceProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/SurveyServiceProvider.cs index c9df4db..fc08135 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/SurveyServiceProvider.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/SurveyServiceProvider.cs @@ -10,11 +10,11 @@ namespace DamageAssesment.Api.SurveyResponses.Services { } - public async Task> getSurveysAsync() + public async Task> getSurveysAsync(string token) { try { - var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null); + var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null, token); var surveys = JsonConvert.DeserializeObject>(responseJsonString); if (surveys == null || !surveys.Any()) @@ -28,12 +28,12 @@ namespace DamageAssesment.Api.SurveyResponses.Services } } - public async Task getSurveyAsync(int surveyId) + public async Task getSurveyAsync(int surveyId, string token) { try { url = urlBase + string.Format(configuration.GetValue("RessourceSettings:SurveyById"), surveyId); - var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null); + var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null, token); var survey = JsonConvert.DeserializeObject(responseJsonString); if (survey == null ) diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/appsettings.json b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/appsettings.json index d7b64fc..011232a 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/appsettings.json +++ b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/appsettings.json @@ -6,6 +6,9 @@ } }, "AllowedHosts": "*", + "JwtSettings": { + "securitykey": "bWlhbWkgZGFkZSBzY2hvb2xzIHNlY3JldCBrZXk=" + }, "EndPointSettings": { "AnswerUrlBase": "http://localhost:5200", "LocationUrlBase": "http://localhost:5213", diff --git a/DamageAssesmentApi/DamageAssesment.Api.Surveys/Controllers/SurveysController.cs b/DamageAssesmentApi/DamageAssesment.Api.Surveys/Controllers/SurveysController.cs index 7853716..2500f8b 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Surveys/Controllers/SurveysController.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.Surveys/Controllers/SurveysController.cs @@ -1,4 +1,5 @@ using DamageAssesment.Api.Surveys.Interfaces; +using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; namespace DamageAssesment.Api.Surveys.Controllers @@ -15,7 +16,7 @@ namespace DamageAssesment.Api.Surveys.Controllers /// /// GET request for retrieving surveys. /// - + [Authorize(Roles ="admin,survey,user,report")] [Route("Surveys")] [Route("Surveys/{language:alpha}")] [HttpGet] @@ -32,6 +33,7 @@ namespace DamageAssesment.Api.Surveys.Controllers /// /// GET request for retrieving surveys by ID. /// + [Authorize(Roles = "admin,survey,user,report")] [Route("Surveys/{id:int}")] [Route("Surveys/{id:int}/{language:alpha}")] [HttpGet] @@ -47,7 +49,7 @@ namespace DamageAssesment.Api.Surveys.Controllers /// /// POST request for creating a new survey. /// - + [Authorize(Roles = "admin,survey,user,report")] [HttpPost("Surveys")] public async Task PostSurveysAsync(Models.Survey survey) { @@ -62,7 +64,7 @@ namespace DamageAssesment.Api.Surveys.Controllers /// PUT request for updating an existing survey (surveyId,Updated Survey data). /// - + [Authorize(Roles = "admin,survey")] [HttpPut("Surveys/{id}")] public async Task PutSurveysAsync(int id, Models.Survey survey) { @@ -80,6 +82,7 @@ namespace DamageAssesment.Api.Surveys.Controllers /// /// DELETE request for deleting a survey by ID. /// + [Authorize(Roles = "admin,survey")] [HttpDelete("Surveys/{id}")] public async Task DeleteSurveysAsync(int id) { diff --git a/DamageAssesmentApi/DamageAssesment.Api.Surveys/Program.cs b/DamageAssesmentApi/DamageAssesment.Api.Surveys/Program.cs index fadf4de..433cc8b 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Surveys/Program.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.Surveys/Program.cs @@ -6,6 +6,7 @@ using Microsoft.EntityFrameworkCore; using Microsoft.IdentityModel.Tokens; using System.Text; using System.Reflection; +using Microsoft.OpenApi.Models; var builder = WebApplication.CreateBuilder(args); @@ -34,14 +35,44 @@ builder.Services.AddControllers(); builder.Services.AddScoped(); builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies()); builder.Services.AddEndpointsApiExplorer(); -//builder.Services.AddSwaggerGen(); -builder.Services.AddSwaggerGen(c => + +builder.Services.AddSwaggerGen(options => { // Include XML comments from your assembly var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"; var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile); - c.IncludeXmlComments(xmlPath); + options.IncludeXmlComments(xmlPath); + + OpenApiSecurityScheme securityDefinition = new OpenApiSecurityScheme() + { + Name = "Bearer", + BearerFormat = "JWT", + Scheme = "bearer", + Description = "Specify the authorization token.", + In = ParameterLocation.Header, + Type = SecuritySchemeType.Http, + }; + + options.AddSecurityDefinition("jwt_auth", securityDefinition); + + // Make sure swagger UI requires a Bearer token specified + OpenApiSecurityScheme securityScheme = new OpenApiSecurityScheme() + { + Reference = new OpenApiReference() + { + Id = "jwt_auth", + Type = ReferenceType.SecurityScheme + } + }; + + OpenApiSecurityRequirement securityRequirements = new OpenApiSecurityRequirement() + { + {securityScheme, new string[] { }}, + }; + + options.AddSecurityRequirement(securityRequirements); }); + builder.Services.AddDbContext(option => { option.UseInMemoryDatabase("Surveys"); diff --git a/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Controllers/UsersAccessController.cs b/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Controllers/UsersAccessController.cs new file mode 100644 index 0000000..d18eb40 --- /dev/null +++ b/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Controllers/UsersAccessController.cs @@ -0,0 +1,127 @@ +using DamageAssesment.Api.UsersAccess.Interfaces; +using DamageAssesment.Api.UsersAccess.Models; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using System.IdentityModel.Tokens.Jwt; +using System.IO; + +namespace DamageAssesment.Api.UsersAccess.Controllers +{ + [ApiController] + public class UsersAccessController : ControllerBase + { + private IUsersAccessProvider userAccessProvider; + + public UsersAccessController(IUsersAccessProvider userAccessProvider) + { + this.userAccessProvider = userAccessProvider; + } + [Authorize(Policy = "Dadeschools")] + [HttpPost("token/{employecode}")] + public async Task AuthenticateAsync(string employecode) + { + /* if (Request.Headers.TryGetValue("Authorization", out var headerAuth)) + { + var jwtToken = headerAuth.First().Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)[1]; + var handler = new JwtSecurityTokenHandler(); + var jsonToken = handler.ReadToken(jwtToken) as JwtSecurityToken; + return Ok(jsonToken.Payload.Sub); + } */ + + var result = await userAccessProvider.AuthenticateAsync(employecode); + if (result.IsSuccess) + { + return Ok(result.TokenResponse); + } + return Unauthorized(result.ErrorMessage); + } + + [Authorize(Policy = "Dadeschools")] + [HttpPost("refreshtoken")] + public async Task RefreshTokenAsync(TokenResponse tokenResponse) + { + var result = await userAccessProvider.RefreshTokenAsync(tokenResponse); + if (result.IsSuccess) + { + return Ok(result.TokenResponse); + } + return Unauthorized(result.ErrorMessage); + } + + [Authorize(Policy = "DamageApp", Roles ="admin")] + [HttpGet("users")] + public async Task GetUsersAsync() + { + var result = await userAccessProvider.GetUsersAsync(); + if (result.IsSuccess) + { + return Ok(result.Users); + } + return NoContent(); + } + + [Authorize(Policy = "DamageApp", Roles = "admin")] + [HttpGet("users/{Id}")] + public async Task GetUsersAsync(int Id) + { + var result = await userAccessProvider.GetUsersAsync(Id); + if (result.IsSuccess) + { + return Ok(result.User); + } + return NotFound(); + } + + [Authorize(Policy = "DamageApp", Roles = "admin")] + [HttpGet("roles")] + public async Task GetRolesAsync() + { + var result = await userAccessProvider.GetRolesAsync(); + if (result.IsSuccess) + { + return Ok(result.Roles); + } + return NoContent(); + } + [Authorize(Policy = "DamageApp", Roles = "admin")] + [HttpPost("users")] + public async Task PostUserAsync(User user) + { + var result = await userAccessProvider.PostUserAsync(user); + if (result.IsSuccess) + { + return Ok(result.User); + } + return BadRequest(result.ErrorMessage); + } + + [Authorize(Policy = "DamageApp", Roles = "admin")] + [HttpPut("users/{Id}")] + public async Task PutUserAsync(int Id, User user) + { + var result = await userAccessProvider.PutUserAsync(Id, user); + if (result.IsSuccess) + { + return Ok(result.User); + } + if (result.ErrorMessage == "Not Found") + return NotFound(result.ErrorMessage); + + return BadRequest(result.ErrorMessage); + } + + [Authorize(Policy = "DamageApp", Roles = "admin")] + [HttpDelete("users/{Id}")] + public async Task DeleteSurveysAsync(int Id) + { + var result = await userAccessProvider.DeleteUserAsync(Id); + if (result.IsSuccess) + { + return Ok(result.User); + } + return NotFound(); + } + + + } +} diff --git a/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/DamageAssesment.Api.UsersAccess.csproj b/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/DamageAssesment.Api.UsersAccess.csproj new file mode 100644 index 0000000..6eb08de --- /dev/null +++ b/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/DamageAssesment.Api.UsersAccess.csproj @@ -0,0 +1,20 @@ + + + + net6.0 + enable + enable + + + + + + + + + + + + + + diff --git a/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Db/Role.cs b/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Db/Role.cs new file mode 100644 index 0000000..93e522a --- /dev/null +++ b/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Db/Role.cs @@ -0,0 +1,21 @@ +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Text.Json.Serialization; + +namespace DamageAssesment.Api.UsersAccess.Db +{ + public class Role + { + [Key] + public int Id { get; set; } + + [StringLength(100)] + [Required] + public string Name { get; set; } + + // add a status field + + [StringLength(100)] + public string? Description { get; set; } + } +} diff --git a/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Db/Token.cs b/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Db/Token.cs new file mode 100644 index 0000000..bdfe576 --- /dev/null +++ b/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Db/Token.cs @@ -0,0 +1,17 @@ +using Microsoft.EntityFrameworkCore.Metadata.Internal; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace DamageAssesment.Api.UsersAccess.Db +{ + public class Token + { + [Key] + public int Id { get; set; } + [Required] + [ForeignKey("User")] + public int UserId { get; set; } + public string? RefreshToken { get; set; } + public bool? IsActive { get; set; } + } +} diff --git a/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Db/User.cs b/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Db/User.cs new file mode 100644 index 0000000..f99deb8 --- /dev/null +++ b/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Db/User.cs @@ -0,0 +1,31 @@ +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Text.Json.Serialization; + +namespace DamageAssesment.Api.UsersAccess.Db +{ + public class User + { + [Key] + public int Id { get; set; } + + [ForeignKey("Employee")] + public int EmployeeId { get; set; } + + [Required] + [StringLength(50)] + public string EmployeeCode { get; set; } + + [ForeignKey("Role")] + [Required] + public int RoleId { get; set; } + [Required] + public bool IsActive { get; set; } = true; + + [Required] + public DateTime CreateDate { get; set; } = DateTime.Now; + + public DateTime? UpdateDate { get; set; } + + } +} diff --git a/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Db/UsersAccessDbContext.cs b/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Db/UsersAccessDbContext.cs new file mode 100644 index 0000000..2c9a2e1 --- /dev/null +++ b/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Db/UsersAccessDbContext.cs @@ -0,0 +1,32 @@ +using Microsoft.EntityFrameworkCore; + +namespace DamageAssesment.Api.UsersAccess.Db +{ + public class UsersAccessDbContext : DbContext + { + public DbSet Users { get; set; } + public DbSet Roles { get; set; } + public DbSet Tokens { get; set; } + public UsersAccessDbContext(DbContextOptions options) : base(options) + { + + } + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + base.OnModelCreating(modelBuilder); + + modelBuilder.Entity() + .Property(item => item.Id) + .ValueGeneratedOnAdd(); + + modelBuilder.Entity() + .Property(item => item.Id) + .ValueGeneratedOnAdd(); + + modelBuilder.Entity() + .Property(item => item.Id) + .ValueGeneratedOnAdd(); + } + } +} diff --git a/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Interfaces/IEmployeeServiceProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Interfaces/IEmployeeServiceProvider.cs new file mode 100644 index 0000000..255a954 --- /dev/null +++ b/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Interfaces/IEmployeeServiceProvider.cs @@ -0,0 +1,10 @@ +using DamageAssesment.Api.UsersAccess.Models; + +namespace DamageAssesment.Api.UsersAccess.Interfaces +{ + public interface IEmployeeServiceProvider + { + Task> getEmployeesAsync(); + Task getEmployeeAsync(int employeeId); + } +} diff --git a/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Interfaces/IHttpUtil.cs b/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Interfaces/IHttpUtil.cs new file mode 100644 index 0000000..3d0a8ed --- /dev/null +++ b/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Interfaces/IHttpUtil.cs @@ -0,0 +1,7 @@ +namespace DamageAssesment.Api.UsersAccess.Interfaces +{ + public interface IHttpUtil + { + Task SendAsync(HttpMethod method, string url, string JsonInput); + } +} diff --git a/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Interfaces/IRoleProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Interfaces/IRoleProvider.cs new file mode 100644 index 0000000..6ca0209 --- /dev/null +++ b/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Interfaces/IRoleProvider.cs @@ -0,0 +1,12 @@ +namespace DamageAssesment.Api.UsersAccess.Interfaces +{ + public interface IRoleProvider + { + Task<(bool IsSuccess, IEnumerable< Models.Role> Roles, string ErrorMessage)> GetRolesAsync(); + Task<(bool IsSuccess, Models.Role Roles, string ErrorMessage)> GetRolesAsync(int Id); + Task<(bool IsSuccess, Models.Role Role, string ErrorMessage)> PostRoleAsync(Models.Role Role); + Task<(bool IsSuccess, Models.Role Role, string ErrorMessage)> PutRoleAsync(int Id,Models.Role Role); + Task<(bool IsSuccess, Models.Role Role, string ErrorMessage)> DeleteRoleAsync(int Id); + + } +} diff --git a/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Interfaces/ITokenServiceProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Interfaces/ITokenServiceProvider.cs new file mode 100644 index 0000000..6115e7c --- /dev/null +++ b/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Interfaces/ITokenServiceProvider.cs @@ -0,0 +1,11 @@ +using DamageAssesment.Api.UsersAccess.Models; +using System.Security.Claims; + +namespace DamageAssesment.Api.UsersAccess.Interfaces +{ + public interface ITokenServiceProvider + { + Task GenerateToken(Models.User user); + Task TokenAuthenticate(Models.User user, Claim[] claims); + } +} \ No newline at end of file diff --git a/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Interfaces/IUsersAccessProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Interfaces/IUsersAccessProvider.cs new file mode 100644 index 0000000..ea64376 --- /dev/null +++ b/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Interfaces/IUsersAccessProvider.cs @@ -0,0 +1,17 @@ +using DamageAssesment.Api.UsersAccess.Models; + +namespace DamageAssesment.Api.UsersAccess.Interfaces +{ + public interface IUsersAccessProvider + { + public Task<(bool IsSuccess, IEnumerable< Models.User> Users, string ErrorMessage)> GetUsersAsync(); + public Task<(bool IsSuccess, Models.User User, string ErrorMessage)> GetUsersAsync(int Id); + public Task<(bool IsSuccess, Models.User User, string ErrorMessage)> PostUserAsync(Models.User User); + public Task<(bool IsSuccess, Models.User User, string ErrorMessage)> PutUserAsync(int Id,Models.User User); + public Task<(bool IsSuccess, Models.User User, string ErrorMessage)> DeleteUserAsync(int Id); + public Task<(bool IsSuccess, IEnumerable Roles, string ErrorMessage)> GetRolesAsync(); + public Task<(bool IsSuccess, Models.TokenResponse TokenResponse, string ErrorMessage)> AuthenticateAsync(string employeCode); + public Task<(bool IsSuccess, Models.TokenResponse TokenResponse, string ErrorMessage)>RefreshTokenAsync(TokenResponse tokenResponse); + public void seedData(); + } +} diff --git a/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Models/Employee.cs b/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Models/Employee.cs new file mode 100644 index 0000000..b08d156 --- /dev/null +++ b/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Models/Employee.cs @@ -0,0 +1,14 @@ +namespace DamageAssesment.Api.UsersAccess.Models +{ + public class Employee + { + public int Id { get; set; } + public string EmployeeCode { get; set; } + public string Name { get; set; } + public DateTime BirthDate { get; set; } + public string OfficePhoneNumber { get; set; } + public string Email { get; set; } + public bool IsActive { get; set; } + public string PreferredLanguage { get; set; } + } +} diff --git a/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Models/JwtSettings.cs b/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Models/JwtSettings.cs new file mode 100644 index 0000000..3f9dadf --- /dev/null +++ b/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Models/JwtSettings.cs @@ -0,0 +1,9 @@ +using System.ComponentModel.DataAnnotations; +namespace DamageAssesment.Api.UsersAccess.Models +{ + + public class JwtSettings + { + public string securitykey { get; set; } + } +} \ No newline at end of file diff --git a/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Models/Role.cs b/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Models/Role.cs new file mode 100644 index 0000000..a275c60 --- /dev/null +++ b/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Models/Role.cs @@ -0,0 +1,8 @@ +namespace DamageAssesment.Api.UsersAccess.Models +{ + public class Role { + public int Id { get; set; } + public string Name { get; set; } + public string Description { get; set; } + } +} diff --git a/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Models/Token.cs b/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Models/Token.cs new file mode 100644 index 0000000..87f1ae3 --- /dev/null +++ b/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Models/Token.cs @@ -0,0 +1,10 @@ +namespace DamageAssesment.Api.UsersAccess.Models +{ + public class Token + { + public string Id { get; set; } + public int UserId { get; set; } + public string RefreshToken { get; set; } + public bool IsActive { get; set; } + } +} diff --git a/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Models/TokenResponse.cs b/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Models/TokenResponse.cs new file mode 100644 index 0000000..4d0b6da --- /dev/null +++ b/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Models/TokenResponse.cs @@ -0,0 +1,8 @@ +namespace DamageAssesment.Api.UsersAccess.Models +{ + public class TokenResponse + { + public string? jwttoken { get; set; } + public string? refreshtoken { get; set; } + } +} \ No newline at end of file diff --git a/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Models/User.cs b/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Models/User.cs new file mode 100644 index 0000000..e43bc20 --- /dev/null +++ b/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Models/User.cs @@ -0,0 +1,13 @@ +namespace DamageAssesment.Api.UsersAccess.Models +{ + public class User + { + public int Id { get; set; } + public int EmployeeId { get; set; } + public string EmployeeCode { get; set; } + public int RoleId { get; set; } + public bool IsActive { get; set; } + public DateTime CreateDate { get; set; } + public DateTime UpdateDate { get; set; } + } +} diff --git a/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Models/UserCredentials.cs b/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Models/UserCredentials.cs new file mode 100644 index 0000000..cf01fa3 --- /dev/null +++ b/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Models/UserCredentials.cs @@ -0,0 +1,5 @@ +public class UserCredentials +{ + public string username { get; set; } + // public string? password { get; set; } +} \ No newline at end of file diff --git a/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Profiles/UsersAccessProfile.cs b/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Profiles/UsersAccessProfile.cs new file mode 100644 index 0000000..bf744eb --- /dev/null +++ b/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Profiles/UsersAccessProfile.cs @@ -0,0 +1,14 @@ +namespace DamageAssesment.Api.UsersAccess.Profiles +{ + public class UsersAccessProfile : AutoMapper.Profile + { + public UsersAccessProfile() + { + CreateMap(); + CreateMap(); + + CreateMap(); + CreateMap(); + } + } +} diff --git a/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Program.cs b/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Program.cs new file mode 100644 index 0000000..a7d12a5 --- /dev/null +++ b/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Program.cs @@ -0,0 +1,146 @@ +using DamageAssesment.Api.UsersAccess.Db; +using DamageAssesment.Api.UsersAccess.Interfaces; +using DamageAssesment.Api.UsersAccess.Providers; +using DamageAssesment.Api.UsersAccess.Models; +using Microsoft.EntityFrameworkCore; +using Microsoft.IdentityModel.Tokens; +using System.Text; +using Polly; +using DamageAssesment.Api.UsersAccess.Services; +using Microsoft.OpenApi.Models; +using System.Reflection; +using Microsoft.AspNetCore.Authorization; + +const int maxApiCallRetries = 3; +const int intervalToRetry = 2; //2 seconds +const int maxRetryForCircuitBraker = 5; +const int intervalForCircuitBraker = 5; //5 seconds + +var builder = WebApplication.CreateBuilder(args); + +// Add services to the container. +var authkey = builder.Configuration.GetValue("JwtSettings:securitykey"); + + +builder.Services.AddAuthentication(). + AddJwtBearer("DamageApp", 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 + }; +}).AddJwtBearer("Dadeschools", options => +{ + options.Authority = builder.Configuration["Dadeschools:Authority"]; + options.TokenValidationParameters.ValidTypes = new[] { "at+jwt" }; + options.TokenValidationParameters.ValidateAudience = false; +}); + + +builder.Services.AddAuthorization(options => +{ + var DamageAppPolicy = new AuthorizationPolicyBuilder() + .RequireAuthenticatedUser() + .AddAuthenticationSchemes("DamageApp") + .Build(); + var DadeschoolsPolicy = new AuthorizationPolicyBuilder() + .RequireAuthenticatedUser() + .AddAuthenticationSchemes("Dadeschools") + .Build(); + var allPolicy = new AuthorizationPolicyBuilder() + .RequireAuthenticatedUser() + .AddAuthenticationSchemes("DamageApp", "Dadeschools") + .Build(); + options.AddPolicy("DamageApp", DamageAppPolicy); + options.AddPolicy("Dadeschools", DadeschoolsPolicy); + options.AddPolicy("AllPolicies", allPolicy); + options.DefaultPolicy = options.GetPolicy("DamageApp")!; +}); + +var _jwtsettings = builder.Configuration.GetSection("JwtSettings"); +builder.Services.Configure(_jwtsettings); + +builder.Services.AddControllers(); +// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle +builder.Services.AddScoped(); +builder.Services.AddScoped(); +builder.Services.AddScoped(); + +builder.Services.AddHttpClient(). + AddTransientHttpErrorPolicy(policy => policy.WaitAndRetryAsync(maxApiCallRetries, _ => TimeSpan.FromSeconds(intervalToRetry))). + AddTransientHttpErrorPolicy(policy => policy.CircuitBreakerAsync(maxRetryForCircuitBraker, TimeSpan.FromSeconds(intervalForCircuitBraker))); + +builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies()); +builder.Services.AddEndpointsApiExplorer(); +//builder.Services.AddSwaggerGen(); + +builder.Services.AddSwaggerGen(options => +{ + + // 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); +}); + +builder.Services.AddDbContext(option => +{ + option.UseInMemoryDatabase("UsersAccess"); +}); +var app = builder.Build(); + +// Configure the HTTP request pipeline. +if (app.Environment.IsDevelopment()) +{ + app.UseSwagger(); + app.UseSwaggerUI(); + + using (var serviceScope = app.Services.CreateScope()) + { + var services = serviceScope.ServiceProvider; + var usersAccessProvider = services.GetRequiredService(); + usersAccessProvider.seedData(); + } +} + +app.UseAuthentication(); +app.UseAuthorization(); + +app.MapControllers(); +app.Run(); diff --git a/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Properties/launchSettings.json b/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Properties/launchSettings.json new file mode 100644 index 0000000..859e680 --- /dev/null +++ b/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Properties/launchSettings.json @@ -0,0 +1,31 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:28382", + "sslPort": 0 + } + }, + "profiles": { + "DamageAssesment.Api.Users": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "swagger", + "applicationUrl": "http://localhost:5027", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "swagger", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Providers/UserAccessProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Providers/UserAccessProvider.cs new file mode 100644 index 0000000..63a9772 --- /dev/null +++ b/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Providers/UserAccessProvider.cs @@ -0,0 +1,305 @@ +using AutoMapper; +using DamageAssesment.Api.UsersAccess.Db; +using DamageAssesment.Api.UsersAccess.Interfaces; +using DamageAssesment.Api.UsersAccess.Models; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Options; +using Microsoft.IdentityModel.Tokens; +using System.Data; +using System.IdentityModel.Tokens.Jwt; +using System.Security.Claims; +using System.Text; + +namespace DamageAssesment.Api.UsersAccess.Providers +{ + public class UsersAccessProvider : IUsersAccessProvider + { + private readonly UsersAccessDbContext userAccessDbContext; + private readonly ILogger logger; + private readonly IMapper mapper; + //private readonly IEmployeeServiceProvider employeeServiceProvider; + private readonly JwtSettings jwtSettings; + private readonly ITokenServiceProvider tokenServiceProvider; + + public UsersAccessProvider(IOptions options, ITokenServiceProvider tokenServiceProvider, UsersAccessDbContext userAccessDbContext, IEmployeeServiceProvider employeeServiceProvider, ILogger logger, IMapper mapper) + { + this.userAccessDbContext = userAccessDbContext; + //this.employeeServiceProvider = employeeServiceProvider; + this.logger = logger; + this.mapper = mapper; + jwtSettings = options.Value; + this.tokenServiceProvider = tokenServiceProvider; + // seedData(); + } + + public void seedData() + { + if (!userAccessDbContext.Users.Any()) + { + userAccessDbContext.Users.Add(new Db.User { Id = 1, EmployeeId = 1, EmployeeCode = "Emp1", RoleId = 1, IsActive = true, CreateDate = DateTime.Now }); + userAccessDbContext.Users.Add(new Db.User { Id = 2, EmployeeId = 2, EmployeeCode = "Emp2", RoleId = 2, IsActive = true, CreateDate = DateTime.Now }); + userAccessDbContext.Users.Add(new Db.User { Id = 3, EmployeeId = 3, EmployeeCode = "Emp3", RoleId = 3, IsActive = true, CreateDate = DateTime.Now }); + userAccessDbContext.SaveChanges(); + } + + if (!userAccessDbContext.Roles.Any()) + { + userAccessDbContext.Roles.Add(new Db.Role { Id = 1, Name = "admin", Description ="Administrator role have full access" }); + userAccessDbContext.Roles.Add(new Db.Role { Id = 2, Name = "user", Description =" User role"}); + userAccessDbContext.Roles.Add(new Db.Role { Id = 3, Name = "survey", Description ="Survey role" }); + userAccessDbContext.Roles.Add(new Db.Role { Id = 4, Name = "report", Description ="Report role"}); + userAccessDbContext.Roles.Add(new Db.Role { Id = 5, Name = "document", Description ="Document role" }); + userAccessDbContext.SaveChanges(); + } + } + + public async Task<(bool IsSuccess, IEnumerable Users, string ErrorMessage)> GetUsersAsync() + { + try + { + logger?.LogInformation("Gell all Users from DB"); + var users = await userAccessDbContext.Users.ToListAsync(); + if (users != null) + { + logger?.LogInformation($"{users.Count} Items(s) found"); + var result = mapper.Map, IEnumerable>(users); + return (true, result, null); + } + return (false, null, "Not found"); + } + catch (Exception ex) + { + logger?.LogError(ex.ToString()); + return (false, null, ex.Message); + } + } + + public async Task<(bool IsSuccess, Models.User User, string ErrorMessage)> GetUsersAsync(int Id) + { + try + { + logger?.LogInformation("Querying Users table"); + var user = await userAccessDbContext.Users.SingleOrDefaultAsync(s => s.Id == Id); + if (user != null) + { + logger?.LogInformation($"User Id: {Id} found"); + var result = mapper.Map(user); + return (true, result, null); + } + return (false, null, "Not found"); + } + catch (Exception ex) + { + logger?.LogError(ex.ToString()); + return (false, null, ex.Message); + } + } + + public async Task<(bool IsSuccess, Models.User User, string ErrorMessage)> PostUserAsync(Models.User user) + { + try + { + if (user != null) + { + var _user = mapper.Map(user); + userAccessDbContext.Users.Add(_user); + user.Id = _user.Id; + await userAccessDbContext.SaveChangesAsync(); + return (true, user, "Successful"); + } + else + { + logger?.LogInformation($"null object cannot be added"); + return (false, null, $"null object cannot be added"); + } + } + catch (Exception ex) + { + logger?.LogError(ex.ToString()); + return (false, null, ex.Message); + } + } + + public async Task<(bool IsSuccess, Models.User User, string ErrorMessage)> PutUserAsync(int Id, Models.User user) + { + try + { + if (user != null) + { + var _user = await userAccessDbContext.Users.AsNoTracking().Where(s => s.Id == Id).SingleOrDefaultAsync(); + + if (_user != null) + { + int count = userAccessDbContext.Users.Where(u => u.Id != user.Id).Count(); + if (count == 0) + { + await userAccessDbContext.SaveChangesAsync(); + logger?.LogInformation($"Employee Id: {user.EmployeeId} updated successfuly"); + return (true, mapper.Map(_user), $"Employee Id: {_user.EmployeeId} updated successfuly"); + } + else + { + logger?.LogInformation($"Employee Id: {user.EmployeeId} is already exist"); + return (false, null, $"Employee Id: {user.EmployeeId} is already exist"); + } + } + else + { + logger?.LogInformation($"User Id : {Id} Not found"); + return (false, null, "Not Found"); + } + } + else + { + logger?.LogInformation($"User Id: {Id} Bad Request"); + return (false, null, "Bad request"); + } + } + catch (Exception ex) + { + logger?.LogError(ex.ToString()); + return (false, null, ex.Message); + } + } + + public async Task<(bool IsSuccess, Models.User User, string ErrorMessage)> DeleteUserAsync(int Id) + { + try + { + var user = await userAccessDbContext.Users.Where(x => x.Id == Id).SingleOrDefaultAsync(); + + if (user != null) + { + userAccessDbContext.Users.Remove(user); + await userAccessDbContext.SaveChangesAsync(); + logger?.LogInformation($"User Id: {Id} deleted Successfuly"); + return (true, mapper.Map(user), $"User Id: {Id} deleted Successfuly"); + } + else + { + logger?.LogInformation($"User Id : {Id} Not found"); + return (false, null, "Not Found"); + } + } + catch (Exception ex) + { + logger?.LogError(ex.ToString()); + return (false, null, ex.Message); + } + } + + public async Task<(bool IsSuccess, TokenResponse TokenResponse, string ErrorMessage)> AuthenticateAsync(string employecode) + { + + if (employecode != null) + { + //implementation for dadeschools authentication + // var employees = await employeeServiceProvider.getEmployeesAsync(); + // var employee = employees.Where(e=> e.EmployeeCode.ToLower() == employecode.ToLower()).SingleOrDefault(); + var user = userAccessDbContext.Users.Where(x => x.IsActive == true && x.EmployeeCode.ToLower() == employecode.ToLower()).SingleOrDefault(); + + if (user != null) + { + + var r = await GetRolesAsync(); + var role = r.Roles.Where(x => x.Id == user.RoleId).SingleOrDefault(); + + var authClaims = new List { + new Claim(ClaimTypes.Name, user.EmployeeCode), + new Claim(ClaimTypes.Role, role.Name), + new Claim(JwtRegisteredClaimNames.Jti,Guid.NewGuid().ToString()) + + }; + + /// Generate Token + var tokenhandler = new JwtSecurityTokenHandler(); + var tokenkey = Encoding.UTF8.GetBytes(jwtSettings.securitykey); + var tokendesc = new SecurityTokenDescriptor + { + Audience = "", + NotBefore = DateTime.Now, + Subject = new ClaimsIdentity(authClaims), + Expires = DateTime.Now.AddMinutes(30), + SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(tokenkey), SecurityAlgorithms.HmacSha256) + }; + var token = tokenhandler.CreateToken(tokendesc); + string finaltoken = tokenhandler.WriteToken(token); + + var response = new TokenResponse() { jwttoken = finaltoken, refreshtoken = await tokenServiceProvider.GenerateToken(mapper.Map(user)) }; + return (true, response, "Authentication success and token issued."); + } + else + { + return (false, null, "user inactive or not exist."); + } + } + + else + { + return (false, null, "Credentials are required to authenticate."); + } + } + public async Task<(bool IsSuccess, IEnumerable Roles, string ErrorMessage)> GetRolesAsync() + { + try + { + logger?.LogInformation("Gell all Roles from DB"); + var roles = await userAccessDbContext.Roles.ToListAsync(); + if (roles != null) + { + logger?.LogInformation($"{roles.Count} Items(s) found"); + var result = mapper.Map, IEnumerable>(roles); + return (true, result, null); + } + return (false, null, "Not found"); + } + catch (Exception ex) + { + logger?.LogError(ex.ToString()); + return (false, null, ex.Message); + } + } + + public async Task<(bool IsSuccess, Models.TokenResponse TokenResponse, string ErrorMessage)> RefreshTokenAsync(TokenResponse tokenResponse) + { + //Generate token + var tokenhandler = new JwtSecurityTokenHandler(); + var tokenkey = Encoding.UTF8.GetBytes(this.jwtSettings.securitykey); + SecurityToken securityToken; + var principal = tokenhandler.ValidateToken(tokenResponse.jwttoken, new TokenValidationParameters + { + ValidateIssuerSigningKey = true, + IssuerSigningKey = new SymmetricSecurityKey(tokenkey), + ValidateIssuer = false, + ValidateAudience = false, + + }, out securityToken); + + var token = securityToken as JwtSecurityToken; + if (token != null && !token.Header.Alg.Equals(SecurityAlgorithms.HmacSha256)) + { + return (false, null, "Unauthorized"); + } + var username = principal.Identity?.Name; + + var tokens = await userAccessDbContext.Tokens.ToListAsync(); + var users = await userAccessDbContext.Users.ToListAsync(); + + var user = (from u in users + join t in tokens + on u.Id equals t.UserId + where u.EmployeeId == 1 + && t.RefreshToken == tokenResponse.refreshtoken + select u).FirstOrDefault(); + + if (user == null) + return (false, null, "Invalid Token Response object provided"); + + var _user = mapper.Map(user); + var response = tokenServiceProvider.TokenAuthenticate(_user, principal.Claims.ToArray()).Result; + return (true, response, "Token authenticated and refreshed."); + } + + + } +} diff --git a/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Services/EmployeeServiceProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Services/EmployeeServiceProvider.cs new file mode 100644 index 0000000..a06c646 --- /dev/null +++ b/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Services/EmployeeServiceProvider.cs @@ -0,0 +1,50 @@ +using DamageAssesment.Api.UsersAccess.Interfaces; +using DamageAssesment.Api.UsersAccess.Models; +using Newtonsoft.Json; + +namespace DamageAssesment.Api.UsersAccess.Services +{ + public class EmployeeServiceProvider : ServiceProviderBase, IEmployeeServiceProvider + { + public EmployeeServiceProvider(IConfiguration configuration, IHttpUtil httpUtil, ILogger logger) : base(configuration, httpUtil, logger, configuration.GetValue("RessourceSettings:Employee"), configuration.GetValue("EndPointSettings:EmployeeUrlBase")) + { + } + + public async Task> getEmployeesAsync() + { + try + { + var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null); + var employees = JsonConvert.DeserializeObject>(responseJsonString); + + if (employees == null || !employees.Any()) + return new List(); + else return employees; + } + catch (Exception ex) + { + logger?.LogError($"Exception Found : {ex.Message} - Ref: EmployeeServiceProvider.getEmployeesAsync()"); + return new List(); + } + } + + public async Task getEmployeeAsync(int employeeId) + { + try + { + url = urlBase + string.Format(configuration.GetValue("RessourceSettings:EmployeeById"), employeeId); + var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null); + var employee = JsonConvert.DeserializeObject(responseJsonString); + + if (employee == null) + return null; + else return employee; + } + catch (Exception ex) + { + logger?.LogError($"Exception Found : {ex.Message} - Ref: EmployeeServiceProvider.getEmployeeAsync()"); + return null; + } + } + } +} diff --git a/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Services/HttpUtil.cs b/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Services/HttpUtil.cs new file mode 100644 index 0000000..973278d --- /dev/null +++ b/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Services/HttpUtil.cs @@ -0,0 +1,42 @@ +using DamageAssesment.Api.UsersAccess.Interfaces; +using System.Net.Http.Headers; +using System.Text; + +namespace DamageAssesment.Api.UsersAccess.Services +{ + public class HttpUtil : IHttpUtil + { + private readonly HttpClient httpClient; + private readonly ILogger logger; + + public HttpUtil(HttpClient httpClient, ILogger logger) + { + this.httpClient = httpClient; + this.logger = logger; + } + public async Task SendAsync(HttpMethod method, string url, string JsonInput) + { + try + { + var request = new HttpRequestMessage(method, url); + request.Headers.Accept.Clear(); + request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); + + //request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token); + if (method == HttpMethod.Post) + { + request.Content = new StringContent(JsonInput, Encoding.UTF8, "application/json"); + } + var response = await httpClient.SendAsync(request, CancellationToken.None); + response.EnsureSuccessStatusCode(); + var responseString = await response.Content.ReadAsStringAsync(); + return responseString; + } + catch (Exception ex) + { + logger?.LogError($"Exception Message : {ex.Message} - Ref: HttpUtil.SendAsync()"); + return null; + } + } + } +} diff --git a/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Services/ServiceProviderBase.cs b/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Services/ServiceProviderBase.cs new file mode 100644 index 0000000..a90b839 --- /dev/null +++ b/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Services/ServiceProviderBase.cs @@ -0,0 +1,25 @@ +using DamageAssesment.Api.UsersAccess.Interfaces; + +namespace DamageAssesment.Api.UsersAccess.Services +{ + public class ServiceProviderBase + { + protected readonly IConfiguration configuration; + protected readonly IHttpUtil httpUtil; + protected readonly ILogger logger; + protected string ressource; + protected string urlBase; + protected string url; + + + public ServiceProviderBase(IConfiguration configuration, IHttpUtil httpUtil, ILogger logger, string ressource, string urlBase) + { + this.configuration = configuration; + this.httpUtil = httpUtil; + this.logger = logger; + this.ressource = ressource; + this.urlBase = urlBase; + url = urlBase + ressource; + } + } +} diff --git a/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Services/TokenServiceProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Services/TokenServiceProvider.cs new file mode 100644 index 0000000..91645b9 --- /dev/null +++ b/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Services/TokenServiceProvider.cs @@ -0,0 +1,59 @@ +using System.IdentityModel.Tokens.Jwt; +using System.Security.Claims; +using System.Security.Cryptography; +using System.Text; +using DamageAssesment.Api.UsersAccess.Db; +using DamageAssesment.Api.UsersAccess.Interfaces; +using DamageAssesment.Api.UsersAccess.Models; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Options; +using Microsoft.IdentityModel.Tokens; + +namespace DamageAssesment.Api.UsersAccess.Services +{ + public class TokenServiceProvider : ITokenServiceProvider + { + private readonly UsersAccessDbContext usersAccessDbContext; + private readonly JwtSettings jwtSettings; + public TokenServiceProvider(IOptions options, UsersAccessDbContext usersAccessDbContext) + { + this.usersAccessDbContext = usersAccessDbContext; + this.jwtSettings = options.Value; + } + public async Task GenerateToken(Models.User user) + { + var randomnumber = new byte[32]; + using (var ramdomnumbergenerator = RandomNumberGenerator.Create()) + { + ramdomnumbergenerator.GetBytes(randomnumber); + string refreshtoken = Convert.ToBase64String(randomnumber); + var token = await usersAccessDbContext.Tokens.FirstOrDefaultAsync(item => item.UserId == user.Id); + if (token != null) + { + token.RefreshToken = refreshtoken; + } + else + { + usersAccessDbContext.Tokens.Add(new Db.Token() + { + UserId = user.Id, + RefreshToken = refreshtoken, + IsActive = true + }); + } + await usersAccessDbContext.SaveChangesAsync(); + + return refreshtoken; + } + } + + public async Task TokenAuthenticate(Models.User user, Claim[] claims) + { + var token = new JwtSecurityToken(claims: claims, expires: DateTime.Now.AddSeconds(20), + signingCredentials: new SigningCredentials(new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtSettings.securitykey)), SecurityAlgorithms.HmacSha256) + ); + var jwttoken = new JwtSecurityTokenHandler().WriteToken(token); + return new TokenResponse() { jwttoken = jwttoken, refreshtoken = await GenerateToken(user) }; + } + } +} \ No newline at end of file diff --git a/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/appsettings.Development.json b/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/appsettings.Development.json new file mode 100644 index 0000000..0c208ae --- /dev/null +++ b/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/appsettings.Development.json @@ -0,0 +1,8 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + } +} diff --git a/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/appsettings.json b/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/appsettings.json new file mode 100644 index 0000000..38fe47e --- /dev/null +++ b/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/appsettings.json @@ -0,0 +1,36 @@ +{ + "JwtSettings": { + "securitykey": "bWlhbWkgZGFkZSBzY2hvb2xzIHNlY3JldCBrZXk=" + }, + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "EndPointSettings": { + "EmployeeUrlBase": "http://localhost:5135" + }, + "RessourceSettings": { + "Employee": "/Employees", + "EmployeeById": "/Employees/{0}" + }, + "AllowedHosts": "*", + "Dadeschools": { + "Authority": "https://dev-graph.dadeschools.net", + "TokenUrl": "https://dev-graph.dadeschools.net/connect/token", + "ClientId": "dmapi", + "ClientSecret": "bfce2c8d-2064-4a02-b19d-7f1d42b16eae", + "Name": "Dadeschools Identity Server" + }, + "Scopes": [ + { + "Name": "openid", + "Description": "Request an authentication token on your behalf" + }, + { + "Name": "profile", + "Description": "Read basic information about you such as your date of brith and full name" + } + ] +} diff --git a/DamageAssesmentApi/DamageAssesment.SurveyResponses.Test/DamageAssesment.Api.SurveyResponses.Test.csproj b/DamageAssesmentApi/DamageAssesment.SurveyResponses.Test/DamageAssesment.Api.Responses.Test.csproj similarity index 95% rename from DamageAssesmentApi/DamageAssesment.SurveyResponses.Test/DamageAssesment.Api.SurveyResponses.Test.csproj rename to DamageAssesmentApi/DamageAssesment.SurveyResponses.Test/DamageAssesment.Api.Responses.Test.csproj index a384a67..03b9b5c 100644 --- a/DamageAssesmentApi/DamageAssesment.SurveyResponses.Test/DamageAssesment.Api.SurveyResponses.Test.csproj +++ b/DamageAssesmentApi/DamageAssesment.SurveyResponses.Test/DamageAssesment.Api.Responses.Test.csproj @@ -24,7 +24,7 @@ - + diff --git a/DamageAssesmentApi/DamageAssesment.SurveyResponses.Test/SurveyResponsesServiceTest.cs b/DamageAssesmentApi/DamageAssesment.SurveyResponses.Test/SurveyResponsesServiceTest.cs index 47685a5..593038d 100644 --- a/DamageAssesmentApi/DamageAssesment.SurveyResponses.Test/SurveyResponsesServiceTest.cs +++ b/DamageAssesmentApi/DamageAssesment.SurveyResponses.Test/SurveyResponsesServiceTest.cs @@ -12,10 +12,12 @@ namespace DamageAssesment.SurveyResponses.Test { public class SurveyResponsesServiceTest { - Mock mockSurveyResponseService; + private Mock mockSurveyResponseService; + private string token { get; set; } public SurveyResponsesServiceTest() { mockSurveyResponseService = new Mock(); + token = Guid.NewGuid().ToString(); } [Fact(DisplayName = "Get SurveyResponses - Ok case")] @@ -23,7 +25,7 @@ namespace DamageAssesment.SurveyResponses.Test { SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject(); var mockResponse = await MockData.getOkResponse(mockRequestObject); - mockSurveyResponseService.Setup(service => service.GetSurveyResponsesAsync()).ReturnsAsync(mockResponse); + mockSurveyResponseService.Setup(service => service.GetSurveyResponsesAsync(token)).ReturnsAsync(mockResponse); var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object); var result = (OkObjectResult)await surveyResponseProvider.GetSurveyResponsesAsync(); Assert.Equal(200, result.StatusCode); @@ -33,7 +35,7 @@ namespace DamageAssesment.SurveyResponses.Test public async Task GetSurveyResponsesAsync_ShouldReturnStatusCode204() { var mockResponse = await MockData.getResponse(); - mockSurveyResponseService.Setup(service => service.GetSurveyResponsesAsync()).ReturnsAsync(mockResponse); + mockSurveyResponseService.Setup(service => service.GetSurveyResponsesAsync(token)).ReturnsAsync(mockResponse); var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object); var result = (BadRequestObjectResult)await surveyResponseProvider.GetSurveyResponsesAsync(); Assert.Equal(400, result.StatusCode); @@ -44,7 +46,7 @@ namespace DamageAssesment.SurveyResponses.Test { SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject(); var mockResponse = await MockData.getOkResponse(); - mockSurveyResponseService.Setup(service => service.GetSurveyResponsesBySurveyAsync(1)).ReturnsAsync(mockResponse); + mockSurveyResponseService.Setup(service => service.GetSurveyResponsesBySurveyAsync(1, token)).ReturnsAsync(mockResponse); var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object); var result = (OkObjectResult)await surveyResponseProvider.GetSurveyResponsesAsync(1); Assert.Equal(200, result.StatusCode); @@ -54,7 +56,7 @@ namespace DamageAssesment.SurveyResponses.Test public async Task GetSurveyResponsesBySurveyAsync_ShouldReturnStatusCode204() { var mockResponse = await MockData.getResponse(); - mockSurveyResponseService.Setup(service => service.GetSurveyResponsesBySurveyAsync(1)).ReturnsAsync(mockResponse); + mockSurveyResponseService.Setup(service => service.GetSurveyResponsesBySurveyAsync(1, token)).ReturnsAsync(mockResponse); var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object); var result = (NoContentResult)await surveyResponseProvider.GetSurveyResponsesAsync(1); Assert.Equal(204, result.StatusCode); @@ -68,7 +70,7 @@ namespace DamageAssesment.SurveyResponses.Test { SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject(); var mockResponse = await MockData.getOkResponse(); - mockSurveyResponseService.Setup(service => service.GetSurveyResponsesBySurveyAndLocationAsync(1, 1)).ReturnsAsync(mockResponse); + mockSurveyResponseService.Setup(service => service.GetSurveyResponsesBySurveyAndLocationAsync(1, 1, token)).ReturnsAsync(mockResponse); var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object); var result = (OkObjectResult)await surveyResponseProvider.GetSurveyResponsesBySurveyAndLocationAsync(1, 1); Assert.Equal(200, result.StatusCode); @@ -78,7 +80,7 @@ namespace DamageAssesment.SurveyResponses.Test public async Task GetSurveyResponsesBySurveyLocationAsync_ShouldReturnStatusCode204() { var mockResponse = await MockData.getResponse(); - mockSurveyResponseService.Setup(service => service.GetSurveyResponsesBySurveyAndLocationAsync(1, 1)).ReturnsAsync(mockResponse); + mockSurveyResponseService.Setup(service => service.GetSurveyResponsesBySurveyAndLocationAsync(1, 1, token)).ReturnsAsync(mockResponse); var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object); var result = (NoContentResult)await surveyResponseProvider.GetSurveyResponsesBySurveyAndLocationAsync(1, 1); Assert.Equal(204, result.StatusCode); @@ -89,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")).ReturnsAsync(mockResponse); + mockSurveyResponseService.Setup(service => service.GetResponsesByAnswerAsync(1, 1, "Yes", token)).ReturnsAsync(mockResponse); var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object); var result = (OkObjectResult)await surveyResponseProvider.GetSurveyResponsesByAnswerAsyncAsync(1, 1, "Yes"); Assert.Equal(200, result.StatusCode); @@ -99,7 +101,7 @@ namespace DamageAssesment.SurveyResponses.Test public async Task GetSurveyResponsesBySurveyQuestionAnswerAsync_ShouldReturnStatusCode204() { var mockResponse = await MockData.getResponse(); - mockSurveyResponseService.Setup(service => service.GetResponsesByAnswerAsync(1, 1, "Yes")).ReturnsAsync(mockResponse); + mockSurveyResponseService.Setup(service => service.GetResponsesByAnswerAsync(1, 1, "Yes", token)).ReturnsAsync(mockResponse); var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object); var result = (NoContentResult)await surveyResponseProvider.GetSurveyResponsesByAnswerAsyncAsync(1, 1, "Yes"); Assert.Equal(204, result.StatusCode); @@ -111,7 +113,7 @@ namespace DamageAssesment.SurveyResponses.Test { SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject(); var mockResponse = await MockData.getOkResponse(); - mockSurveyResponseService.Setup(service => service.GetAnswersByRegionAsync(1)).ReturnsAsync(mockResponse); + mockSurveyResponseService.Setup(service => service.GetAnswersByRegionAsync(1, token)).ReturnsAsync(mockResponse); var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object); var result = (OkObjectResult)await surveyResponseProvider.GetAnswersByRegionAsync(1); Assert.Equal(200, result.StatusCode); @@ -121,7 +123,7 @@ namespace DamageAssesment.SurveyResponses.Test public async Task GetSurveyResponsesByRegionSurveyAsync_ShouldReturnStatusCode204() { var mockResponse = await MockData.getResponse(); - mockSurveyResponseService.Setup(service => service.GetAnswersByRegionAsync(1)).ReturnsAsync(mockResponse); + mockSurveyResponseService.Setup(service => service.GetAnswersByRegionAsync(1, token)).ReturnsAsync(mockResponse); var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object); var result = (NoContentResult)await surveyResponseProvider.GetAnswersByRegionAsync(1); Assert.Equal(204, result.StatusCode); @@ -132,7 +134,7 @@ namespace DamageAssesment.SurveyResponses.Test { SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject(); var mockResponse = await MockData.getOkResponse(); - mockSurveyResponseService.Setup(service => service.GetSurveyResponsesByMaintenanceCenterAsync(1)).ReturnsAsync(mockResponse); + mockSurveyResponseService.Setup(service => service.GetSurveyResponsesByMaintenanceCenterAsync(1, token)).ReturnsAsync(mockResponse); var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object); var result = (OkObjectResult)await surveyResponseProvider.GetAnswersByMaintenaceCentersync(1); Assert.Equal(200, result.StatusCode); @@ -142,7 +144,7 @@ namespace DamageAssesment.SurveyResponses.Test public async Task GetSurveyResponsesMaintenanceCenterSurveyAsync_ShouldReturnStatusCode204() { var mockResponse = await MockData.getResponse(); - mockSurveyResponseService.Setup(service => service.GetSurveyResponsesByMaintenanceCenterAsync(1)).ReturnsAsync(mockResponse); + mockSurveyResponseService.Setup(service => service.GetSurveyResponsesByMaintenanceCenterAsync(1, token)).ReturnsAsync(mockResponse); var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object); var result = (NoContentResult)await surveyResponseProvider.GetAnswersByMaintenaceCentersync(1); Assert.Equal(204, result.StatusCode); @@ -153,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); + mockSurveyResponseService.Setup(service => service.GetSurveyResponseByIdAsync(1, token)).ReturnsAsync(mockResponse); var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object); var result = (OkObjectResult)await surveyResponseProvider.GetSurveyResponseByIdAsync(1); Assert.Equal(200, result.StatusCode); @@ -163,7 +165,7 @@ namespace DamageAssesment.SurveyResponses.Test public async Task GetSurveyResponsesByResponseIdyAsync_ShouldReturnStatusCode204() { var mockResponse = await MockData.getResponse(); - mockSurveyResponseService.Setup(service => service.GetSurveyResponseByIdAsync(1)).ReturnsAsync(mockResponse); + mockSurveyResponseService.Setup(service => service.GetSurveyResponseByIdAsync(1, token)).ReturnsAsync(mockResponse); var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object); var result = (NoContentResult)await surveyResponseProvider.GetSurveyResponseByIdAsync(1); Assert.Equal(204, result.StatusCode); diff --git a/DamageAssesmentApi/DamageAssesment.sln b/DamageAssesmentApi/DamageAssesment.sln index 0cb2d7c..a9ec1fe 100644 --- a/DamageAssesmentApi/DamageAssesment.sln +++ b/DamageAssesmentApi/DamageAssesment.sln @@ -17,13 +17,13 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DamageAssesment.Api.Locations", "DamageAssesment.Api.Locations\DamageAssesment.Api.Locations.csproj", "{746C67BF-9949-4361-B5D2-358C7607750E}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DamageAssesment.Api.SurveyResponses", "DamageAssesment.Api.SurveyResponses\DamageAssesment.Api.SurveyResponses.csproj", "{D11808FE-AD1C-4BA6-87FD-9D18B2DC81F2}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DamageAssesment.Api.Responses", "DamageAssesment.Api.SurveyResponses\DamageAssesment.Api.Responses.csproj", "{D11808FE-AD1C-4BA6-87FD-9D18B2DC81F2}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DamageAssesment.Api.Questions.Test", "DamageAssesment.Api.QuestionsTest\DamageAssesment.Api.Questions.Test.csproj", "{35CD9231-034D-4999-BCFC-1786DD007ED2}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DamageAssesment.Api.Surveys.Test", "DamageAssesment.Api.Surveys.Test\DamageAssesment.Api.Surveys.Test.csproj", "{ADFB79E3-83C9-454F-A070-49D167BD28CC}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DamageAssesment.Api.SurveyResponses.Test", "DamageAssesment.SurveyResponses.Test\DamageAssesment.Api.SurveyResponses.Test.csproj", "{6F4B9C9D-CE5D-421A-876F-57D0FEDF8049}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DamageAssesment.Api.Responses.Test", "DamageAssesment.SurveyResponses.Test\DamageAssesment.Api.Responses.Test.csproj", "{6F4B9C9D-CE5D-421A-876F-57D0FEDF8049}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DamageAssesment.Api.Attachments.Test", "DamageAssesment.Api.Attachments.Test\DamageAssesment.Api.Attachments.Test.csproj", "{730E5718-FCE1-42C0-AB76-EA020896A788}" EndProject @@ -41,6 +41,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DamageAssesment.Api.DocuLin EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DamageAssesment.Api.DocuLinks.Test", "DamageAssesment.Api.Documents.Test\DamageAssesment.Api.DocuLinks.Test.csproj", "{884BA4AC-9170-49B1-BD6B-850B350C95C0}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DamageAssesment.Api.UsersAccess", "DamageAssesment.Api.UsersAccess\DamageAssesment.Api.UsersAccess.csproj", "{40240AD6-90D2-4128-BCDF-12C77D1B1B55}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -76,7 +78,6 @@ Global {ADFB79E3-83C9-454F-A070-49D167BD28CC}.Release|Any CPU.ActiveCfg = Release|Any CPU {ADFB79E3-83C9-454F-A070-49D167BD28CC}.Release|Any CPU.Build.0 = Release|Any CPU {6F4B9C9D-CE5D-421A-876F-57D0FEDF8049}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6F4B9C9D-CE5D-421A-876F-57D0FEDF8049}.Debug|Any CPU.Build.0 = Debug|Any CPU {6F4B9C9D-CE5D-421A-876F-57D0FEDF8049}.Release|Any CPU.ActiveCfg = Release|Any CPU {6F4B9C9D-CE5D-421A-876F-57D0FEDF8049}.Release|Any CPU.Build.0 = Release|Any CPU {730E5718-FCE1-42C0-AB76-EA020896A788}.Debug|Any CPU.ActiveCfg = Debug|Any CPU @@ -111,6 +112,10 @@ Global {884BA4AC-9170-49B1-BD6B-850B350C95C0}.Debug|Any CPU.Build.0 = Debug|Any CPU {884BA4AC-9170-49B1-BD6B-850B350C95C0}.Release|Any CPU.ActiveCfg = Release|Any CPU {884BA4AC-9170-49B1-BD6B-850B350C95C0}.Release|Any CPU.Build.0 = Release|Any CPU + {40240AD6-90D2-4128-BCDF-12C77D1B1B55}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {40240AD6-90D2-4128-BCDF-12C77D1B1B55}.Debug|Any CPU.Build.0 = Debug|Any CPU + {40240AD6-90D2-4128-BCDF-12C77D1B1B55}.Release|Any CPU.ActiveCfg = Release|Any CPU + {40240AD6-90D2-4128-BCDF-12C77D1B1B55}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE From 4ebd40108d93f51be4307fd7d458f2fce9c63581 Mon Sep 17 00:00:00 2001 From: Reginald CHERENFANT JASMIN Date: Wed, 20 Sep 2023 09:47:27 -0500 Subject: [PATCH 2/7] Dadeschools JWT based authentication integration --- .../Controllers/SurveyResponsesController.cs | 3 --- 1 file changed, 3 deletions(-) diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Controllers/SurveyResponsesController.cs b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Controllers/SurveyResponsesController.cs index 3e9246f..2d90851 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Controllers/SurveyResponsesController.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Controllers/SurveyResponsesController.cs @@ -1,9 +1,6 @@ using DamageAssesment.Api.SurveyResponses.Interfaces; using DamageAssesment.Api.SurveyResponses.Models; -using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; -using Microsoft.Extensions.Configuration; -using System.IdentityModel.Tokens.Jwt; namespace DamageAssesment.Api.SurveyResponses.Controllers { From f6387fc371d156b94056c8c9079341bb900fbdda Mon Sep 17 00:00:00 2001 From: Reginald Cherenfant Jasmin Date: Tue, 26 Sep 2023 01:13:19 -0400 Subject: [PATCH 3/7] adding Test project for userAccess module --- ...amageAssesment.Api.UsersAccess.Test.csproj | 30 +++ .../MockData.cs | 44 ++++ .../UsersAccessTest.cs | 194 ++++++++++++++++++ .../Controllers/UsersAccessController.cs | 2 +- DamageAssesmentApi/DamageAssesment.sln | 6 + 5 files changed, 275 insertions(+), 1 deletion(-) create mode 100644 DamageAssesmentApi/DamageAssesment.Api.UsersAccess.Test/DamageAssesment.Api.UsersAccess.Test.csproj create mode 100644 DamageAssesmentApi/DamageAssesment.Api.UsersAccess.Test/MockData.cs create mode 100644 DamageAssesmentApi/DamageAssesment.Api.UsersAccess.Test/UsersAccessTest.cs diff --git a/DamageAssesmentApi/DamageAssesment.Api.UsersAccess.Test/DamageAssesment.Api.UsersAccess.Test.csproj b/DamageAssesmentApi/DamageAssesment.Api.UsersAccess.Test/DamageAssesment.Api.UsersAccess.Test.csproj new file mode 100644 index 0000000..e655693 --- /dev/null +++ b/DamageAssesmentApi/DamageAssesment.Api.UsersAccess.Test/DamageAssesment.Api.UsersAccess.Test.csproj @@ -0,0 +1,30 @@ + + + + net6.0 + enable + enable + + false + true + + + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + + + + diff --git a/DamageAssesmentApi/DamageAssesment.Api.UsersAccess.Test/MockData.cs b/DamageAssesmentApi/DamageAssesment.Api.UsersAccess.Test/MockData.cs new file mode 100644 index 0000000..b25ec9a --- /dev/null +++ b/DamageAssesmentApi/DamageAssesment.Api.UsersAccess.Test/MockData.cs @@ -0,0 +1,44 @@ +using DamageAssesment.Api.UsersAccess.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Xunit.Sdk; + +namespace DamageAssesment.Api.UsersAccess.Test +{ + public class MockData + { + public static async Task<(bool, Models.TokenResponse, string)> getTokenResponse(bool status, string message) + { + return (status, new Models.TokenResponse { jwttoken = "1234", refreshtoken = "12345" }, message); + } + + public static async Task<(bool, List, string)> getUsers(bool status, string message) + { + List users = new List(); + users.Add(new User { Id = 1, EmployeeCode = "Emp1", EmployeeId = 1, RoleId = 1, IsActive = true, CreateDate = DateTime.Now }); + users.Add(new User { Id = 2, EmployeeCode = "Emp2", EmployeeId = 2, RoleId = 1, IsActive = true, CreateDate = DateTime.Now }); + users.Add(new User { Id = 3, EmployeeCode = "Emp3", EmployeeId = 3, RoleId = 1, IsActive = true, CreateDate = DateTime.Now }); + return (status, users, message); + } + + public static async Task<(bool, User, string)> getUser(bool status, string message) + { + User user = getUsers(status, message).Result.Item2.FirstOrDefault(); + return (status, user, message); + } + + public static async Task<(bool, List, string)> getRoles(bool status, string message) + { + List roles = new List(); + roles.Add(new Role { Id = 1, Name = "Role 1" }); + roles.Add(new Role { Id = 2, Name = "Role 2" }); + roles.Add(new Role { Id = 3, Name = "Role 3" }); + + return (status, roles, message); + } + + } +} diff --git a/DamageAssesmentApi/DamageAssesment.Api.UsersAccess.Test/UsersAccessTest.cs b/DamageAssesmentApi/DamageAssesment.Api.UsersAccess.Test/UsersAccessTest.cs new file mode 100644 index 0000000..46165f3 --- /dev/null +++ b/DamageAssesmentApi/DamageAssesment.Api.UsersAccess.Test/UsersAccessTest.cs @@ -0,0 +1,194 @@ +using DamageAssesment.Api.UsersAccess.Controllers; +using DamageAssesment.Api.UsersAccess.Interfaces; +using Microsoft.AspNetCore.Mvc; +using Moq; +using Xunit; + +namespace DamageAssesment.Api.UsersAccess.Test +{ + public class UsersAccessTest + { + private Mock mockService; + + public UsersAccessTest() + { + mockService = new Mock(); + } + [Fact(DisplayName = "Get Token - Ok case")] + public async Task GetTokenAsync_ShouldReturnStatusCode200() + { + var response = await MockData.getTokenResponse(true,null); + mockService.Setup(service => service.AuthenticateAsync("Emp1")).ReturnsAsync(response); + var controller = new UsersAccessController(mockService.Object); + var result = (OkObjectResult)await controller.AuthenticateAsync("Emp1"); + Assert.Equal(200, result.StatusCode); + } + + [Fact(DisplayName = "Get Token - Unauthorized case")] + public async Task GetTokenAsync_ShouldReturnStatusCode401() + { + var response = await MockData.getTokenResponse(false, null); + mockService.Setup(service => service.AuthenticateAsync("Emp1")).ReturnsAsync(response); + var controller = new UsersAccessController(mockService.Object); + var result = (UnauthorizedObjectResult)await controller.AuthenticateAsync("Emp1"); + Assert.Equal(401, result.StatusCode); + } + + + [Fact(DisplayName = "RefreshToken - Ok case")] + public async Task RefreshTokenAsync_ShouldReturnStatusCode200() + { + var response = await MockData.getTokenResponse(true, null); + mockService.Setup(service => service.RefreshTokenAsync(null)).ReturnsAsync(response); + var controller = new UsersAccessController(mockService.Object); + var result = (OkObjectResult)await controller.RefreshTokenAsync(null); + Assert.Equal(200, result.StatusCode); + } + + [Fact(DisplayName = "RefreshToken - Unauthorized case")] + public async Task RefreshTokenAsync_ShouldReturnStatusCode401() + { + var response = await MockData.getTokenResponse(false, null); + mockService.Setup(service => service.RefreshTokenAsync(null)).ReturnsAsync(response); + var controller = new UsersAccessController(mockService.Object); + var result = (UnauthorizedObjectResult)await controller.RefreshTokenAsync(null); + Assert.Equal(401, result.StatusCode); + } + + [Fact(DisplayName = "GetUsers - Ok case")] + public async Task GetUsersAsync_ShouldReturnStatusCode200() + { + var response = await MockData.getUsers(true, null); + mockService.Setup(service => service.GetUsersAsync()).ReturnsAsync(response); + var controller = new UsersAccessController(mockService.Object); + var result = (OkObjectResult)await controller.GetUsersAsync(); + Assert.Equal(200, result.StatusCode); + } + + [Fact(DisplayName = "GetUsers - NoContent case")] + public async Task GetUsersAsync_ShouldReturnStatusCode204() + { + var response = await MockData.getUsers(false, null); + mockService.Setup(service => service.GetUsersAsync()).ReturnsAsync(response); + var controller = new UsersAccessController(mockService.Object); + var result = (NoContentResult)await controller.GetUsersAsync(); + Assert.Equal(204, result.StatusCode); + } + + [Fact(DisplayName = "GetUser - Ok case")] + public async Task GetUserAsync_ShouldReturnStatusCode200() + { + var response = await MockData.getUser(true, null); + mockService.Setup(service => service.GetUsersAsync(1)).ReturnsAsync(response); + var controller = new UsersAccessController(mockService.Object); + var result = (OkObjectResult)await controller.GetUsersAsync(1); + Assert.Equal(200, result.StatusCode); + } + + [Fact(DisplayName = "GetUser - NotFound case")] + public async Task GetUserAsync_ShouldReturnStatusCode204() + { + var response = await MockData.getUser(false, null); + mockService.Setup(service => service.GetUsersAsync(1)).ReturnsAsync(response); + var controller = new UsersAccessController(mockService.Object); + var result = (NotFoundResult)await controller.GetUsersAsync(1); + Assert.Equal(404, result.StatusCode); + } + + [Fact(DisplayName = "GetRoles - Ok case")] + public async Task GetRolesAsync_ShouldReturnStatusCode200() + { + var response = await MockData.getRoles(true, null); + mockService.Setup(service => service.GetRolesAsync()).ReturnsAsync(response); + var controller = new UsersAccessController(mockService.Object); + var result = (OkObjectResult)await controller.GetRolesAsync(); + Assert.Equal(200, result.StatusCode); + } + + [Fact(DisplayName = "GetRoles - NoContent case")] + public async Task GetRolesAsync_ShouldReturnStatusCode204() + { + var response = await MockData.getRoles(false, null); + mockService.Setup(service => service.GetRolesAsync()).ReturnsAsync(response); + var controller = new UsersAccessController(mockService.Object); + var result = (NoContentResult)await controller.GetRolesAsync(); + Assert.Equal(204, result.StatusCode); + } + + [Fact(DisplayName = "PostUser - Ok case")] + public async Task PostUserAsync_ShouldReturnStatusCode200() + { + var response = await MockData.getUser(true, null); + var user = new Models.User { Id = 1, EmployeeCode = "Emp1", EmployeeId = 1, RoleId = 1, IsActive = true, CreateDate = DateTime.Now }; + mockService.Setup(service => service.PostUserAsync(user)).ReturnsAsync(response); + var controller = new UsersAccessController(mockService.Object); + var result = (OkObjectResult)await controller.PostUserAsync(user); + Assert.Equal(200, result.StatusCode); + } + + [Fact(DisplayName = "PostUser - Bad Request case")] + public async Task PostUserAsync_ShouldReturnStatusCode400() + { + var response = await MockData.getUser(false, null); + var user = new Models.User { Id = 1, EmployeeCode = "Emp1", EmployeeId = 1, RoleId = 1, IsActive = true, CreateDate = DateTime.Now }; + mockService.Setup(service => service.PostUserAsync(user)).ReturnsAsync(response); + var controller = new UsersAccessController(mockService.Object); + var result = (BadRequestObjectResult)await controller.PostUserAsync(user); + Assert.Equal(400, result.StatusCode); + } + + [Fact(DisplayName = "PutUser - Ok case")] + public async Task PutUserAsync_ShouldReturnStatusCode200() + { + var response = await MockData.getUser(true, null); + var user = new Models.User { Id = 1, EmployeeCode = "Emp1", EmployeeId = 1, RoleId = 1, IsActive = true, CreateDate = DateTime.Now }; + mockService.Setup(service => service.PutUserAsync(1,user)).ReturnsAsync(response); + var controller = new UsersAccessController(mockService.Object); + var result = (OkObjectResult)await controller.PutUserAsync(1,user); + Assert.Equal(200, result.StatusCode); + } + + [Fact(DisplayName = "PutUser - BadRequest case")] + public async Task PutUserAsync_ShouldReturnStatusCode400() + { + var response = await MockData.getUser(false, null); + var user = new Models.User { Id = 1, EmployeeCode = "Emp1", EmployeeId = 1, RoleId = 1, IsActive = true, CreateDate = DateTime.Now }; + mockService.Setup(service => service.PutUserAsync(1,user)).ReturnsAsync(response); + var controller = new UsersAccessController(mockService.Object); + var result = (BadRequestObjectResult)await controller.PutUserAsync(1,user); + Assert.Equal(400, result.StatusCode); + } + + [Fact(DisplayName = "PutUser - Not Found case")] + public async Task PutUserAsync_ShouldReturnStatusCode404() + { + var response = await MockData.getUser(false, "Not Found"); + var user = new Models.User { Id = 1, EmployeeCode = "Emp1", EmployeeId = 1, RoleId = 1, IsActive = true, CreateDate = DateTime.Now }; + mockService.Setup(service => service.PutUserAsync(1, user)).ReturnsAsync(response); + var controller = new UsersAccessController(mockService.Object); + var result = (NotFoundObjectResult)await controller.PutUserAsync(1,user); + Assert.Equal(404, result.StatusCode); + } + + + [Fact(DisplayName = "DeleteUser - Ok case")] + public async Task DeleteUserAsync_ShouldReturnStatusCode200() + { + var response = await MockData.getUser(true, null); + mockService.Setup(service => service.DeleteUserAsync(1)).ReturnsAsync(response); + var controller = new UsersAccessController(mockService.Object); + var result = (OkObjectResult)await controller.DeleteUserAsync(1); + Assert.Equal(200, result.StatusCode); + } + + [Fact(DisplayName = "DeleteUser - Not Found case")] + public async Task DeleteUserAsync_ShouldReturnStatusCode404() + { + var response = await MockData.getUser(false, "Not Found"); + mockService.Setup(service => service.DeleteUserAsync(1)).ReturnsAsync(response); + var controller = new UsersAccessController(mockService.Object); + var result = (NotFoundResult)await controller.DeleteUserAsync(1); + Assert.Equal(404, result.StatusCode); + } + } +} \ No newline at end of file diff --git a/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Controllers/UsersAccessController.cs b/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Controllers/UsersAccessController.cs index d18eb40..b8b2760 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Controllers/UsersAccessController.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Controllers/UsersAccessController.cs @@ -112,7 +112,7 @@ namespace DamageAssesment.Api.UsersAccess.Controllers [Authorize(Policy = "DamageApp", Roles = "admin")] [HttpDelete("users/{Id}")] - public async Task DeleteSurveysAsync(int Id) + public async Task DeleteUserAsync(int Id) { var result = await userAccessProvider.DeleteUserAsync(Id); if (result.IsSuccess) diff --git a/DamageAssesmentApi/DamageAssesment.sln b/DamageAssesmentApi/DamageAssesment.sln index a9ec1fe..7efdefc 100644 --- a/DamageAssesmentApi/DamageAssesment.sln +++ b/DamageAssesmentApi/DamageAssesment.sln @@ -43,6 +43,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DamageAssesment.Api.DocuLin EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DamageAssesment.Api.UsersAccess", "DamageAssesment.Api.UsersAccess\DamageAssesment.Api.UsersAccess.csproj", "{40240AD6-90D2-4128-BCDF-12C77D1B1B55}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DamageAssesment.Api.UsersAccess.Test", "DamageAssesment.Api.UsersAccess.Test\DamageAssesment.Api.UsersAccess.Test.csproj", "{ADAF9385-262C-4A37-A603-A53B77EA515D}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -116,6 +118,10 @@ Global {40240AD6-90D2-4128-BCDF-12C77D1B1B55}.Debug|Any CPU.Build.0 = Debug|Any CPU {40240AD6-90D2-4128-BCDF-12C77D1B1B55}.Release|Any CPU.ActiveCfg = Release|Any CPU {40240AD6-90D2-4128-BCDF-12C77D1B1B55}.Release|Any CPU.Build.0 = Release|Any CPU + {ADAF9385-262C-4A37-A603-A53B77EA515D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {ADAF9385-262C-4A37-A603-A53B77EA515D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {ADAF9385-262C-4A37-A603-A53B77EA515D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {ADAF9385-262C-4A37-A603-A53B77EA515D}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE From 46520c7e623a1f73557f17a329b59836311e2c9e Mon Sep 17 00:00:00 2001 From: Reginald CHERENFANT JASMIN Date: Tue, 26 Sep 2023 15:22:26 -0500 Subject: [PATCH 4/7] Update test case project for UserAccess and SurveyResponse modules. Renaming of SurveyResponses to Responses. --- ...esController.cs => ResponsesController.cs} | 60 ++++++-------- .../Db/SurveyResponse.cs | 2 +- .../Db/SurveyResponseDbContext.cs | 2 +- .../Interfaces/IAnswerServiceProvider.cs | 4 +- .../Interfaces/IAttachmentServiceProvider.cs | 4 +- .../Interfaces/IEmployeeServiceProvider.cs | 4 +- .../Interfaces/IHttpUtil.cs | 4 +- .../Interfaces/ILocationServiceProvider.cs | 4 +- .../Interfaces/IQuestionServiceProvider.cs | 4 +- .../Interfaces/IRegionServiceProvider.cs | 4 +- .../Interfaces/ISurveyServiceProvider.cs | 4 +- .../Interfaces/ISurveysResponse.cs | 21 +++-- .../Models/Answer.cs | 2 +- .../Models/AnswerRequest.cs | 2 +- .../Models/Attachment.cs | 2 +- .../Models/AttachmentInfo.cs | 2 +- .../Models/Employee.cs | 2 +- .../Models/Location.cs | 2 +- .../Models/Question.cs | 2 +- .../Models/Region.cs | 2 +- .../Models/Request.cs | 2 +- .../Models/Survey.cs | 2 +- .../Models/SurveyQuestion.cs | 2 +- .../Models/SurveyResponse.cs | 2 +- .../Models/SurveyTranslation.cs | 2 +- .../Profiles/SurveyResponsesProvider.cs | 2 +- .../Program.cs | 8 +- .../Properties/launchSettings.json | 2 +- .../Providers/SurveyResponsesProvider.cs | 77 ++++++++++------- .../Services/AnswerServiceProvider.cs | 6 +- .../Services/AttachmentServiceProvider.cs | 6 +- .../Services/EmployeeServiceProvider.cs | 6 +- .../Services/HttpUtil.cs | 6 +- .../Services/LocationServiceProvider.cs | 6 +- .../Services/QuestionServiceProvider.cs | 6 +- .../Services/RegionServiceProvider.cs | 6 +- .../Services/ServiceProviderBase.cs | 4 +- .../Services/SurveyServiceProvider.cs | 6 +- .../Controllers/UsersAccessController.cs | 10 --- .../MockData.cs | 4 +- ...ServiceTest.cs => ResponsesServiceTest.cs} | 83 +++++++++---------- DamageAssesmentApi/DamageAssesment.sln | 1 + 42 files changed, 187 insertions(+), 195 deletions(-) rename DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Controllers/{SurveyResponsesController.cs => ResponsesController.cs} (85%) rename DamageAssesmentApi/DamageAssesment.SurveyResponses.Test/{SurveyResponsesServiceTest.cs => ResponsesServiceTest.cs} (76%) diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Controllers/SurveyResponsesController.cs b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Controllers/ResponsesController.cs similarity index 85% rename from DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Controllers/SurveyResponsesController.cs rename to DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Controllers/ResponsesController.cs index 2d90851..08290e9 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Controllers/SurveyResponsesController.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Controllers/ResponsesController.cs @@ -1,36 +1,26 @@ -using DamageAssesment.Api.SurveyResponses.Interfaces; -using DamageAssesment.Api.SurveyResponses.Models; +using DamageAssesment.Api.Responses.Interfaces; +using DamageAssesment.Api.Responses.Models; +using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -namespace DamageAssesment.Api.SurveyResponses.Controllers +namespace DamageAssesment.Api.Responses.Controllers { [ApiController] - public class SurveyResponsesController : ControllerBase + public class ResponsesController : ControllerBase { private readonly ISurveysResponse surveyResponseProvider; - private string token; - private readonly IHttpContextAccessor httpContextAccessor; - public SurveyResponsesController(ISurveysResponse surveyResponseProvider, IHttpContextAccessor httpContextAccessor) + public ResponsesController(ISurveysResponse surveyResponseProvider) { this.surveyResponseProvider = surveyResponseProvider; - this.httpContextAccessor = httpContextAccessor; - token = httpContextAccessor.HttpContext.Request.Headers.Authorization; - if (token != null) - { - token = token.Replace("Bearer ", string.Empty); - } else - { - token = ""; - } } /// /// GET request for retrieving survey responses. /// - + [Authorize(Roles = "admin,survey,user,report")] [HttpGet("Responses")] public async Task GetSurveyResponsesAsync() { - var result = await this.surveyResponseProvider.GetSurveyResponsesAsync(token); + var result = await this.surveyResponseProvider.GetSurveyResponsesAsync(); if (result.IsSuccess) { return Ok(result.surveyResponses); @@ -44,11 +34,11 @@ namespace DamageAssesment.Api.SurveyResponses.Controllers /// /// GET request for retrieving survey responses by survey ID. /// - + [Authorize(Roles = "admin,survey,user,report")] [HttpGet("Responses/BySurvey/{surveyid}")] public async Task GetSurveyResponsesAsync(int surveyid) { - var result = await this.surveyResponseProvider.GetSurveyResponsesBySurveyAsync(surveyid, token); + var result = await this.surveyResponseProvider.GetSurveyResponsesBySurveyAsync(surveyid); if (result.IsSuccess) { return Ok(result.SurveyResponses); @@ -60,11 +50,11 @@ namespace DamageAssesment.Api.SurveyResponses.Controllers /// /// The ID of the survey for which responses are to be retrieved. /// The ID of the location for which responses are to be retrieved. - + [Authorize(Roles = "admin,survey,user,report")] [HttpGet("Responses/{surveyid}/{locationid}")] public async Task GetSurveyResponsesBySurveyAndLocationAsync(int surveyid, int locationid) { - var result = await this.surveyResponseProvider.GetSurveyResponsesBySurveyAndLocationAsync(surveyid, locationid, token); + var result = await this.surveyResponseProvider.GetSurveyResponsesBySurveyAndLocationAsync(surveyid, locationid); if (result.IsSuccess) { return Ok(result.SurveyResponses); @@ -78,11 +68,11 @@ namespace DamageAssesment.Api.SurveyResponses.Controllers /// The ID of the survey for which responses are to be retrieved. /// The ID of the question for which responses are to be retrieved. /// The answer for which responses are to be retrieved. - + [Authorize(Roles = "admin,survey,user,report")] [HttpGet("Responses/ByAnswer/{surveyid}/{questionid}/{answer}")] public async Task GetSurveyResponsesByAnswerAsyncAsync(int surveyid, int questionid, string answer) { - var result = await surveyResponseProvider.GetResponsesByAnswerAsync(surveyid, questionid, answer, token); + var result = await surveyResponseProvider.GetResponsesByAnswerAsync(surveyid, questionid, answer); if (result.IsSuccess) { return Ok(result.SurveyResponses); @@ -94,11 +84,11 @@ namespace DamageAssesment.Api.SurveyResponses.Controllers /// GET request for retrieving answers from survey responses by survey ID and region. /// /// The ID of the survey for which answers are to be retrieved. - + [Authorize(Roles = "admin,survey,user,report")] [HttpGet("Responses/ByRegion/{surveyid}")] public async Task GetAnswersByRegionAsync(int surveyid) { - var result = await this.surveyResponseProvider.GetAnswersByRegionAsync(surveyid, token); + var result = await this.surveyResponseProvider.GetAnswersByRegionAsync(surveyid); if (result.IsSuccess) { return Ok(result.Answers); @@ -109,11 +99,11 @@ namespace DamageAssesment.Api.SurveyResponses.Controllers /// GET request for retrieving survey responses by survey ID and maintenance center. /// /// The ID of the survey for which responses are to be retrieved. - + [Authorize(Roles = "admin,survey,user,report")] [HttpGet("Responses/ByMaintenanceCenter/{surveyid}")] public async Task GetAnswersByMaintenaceCentersync(int surveyid) { - var result = await this.surveyResponseProvider.GetSurveyResponsesByMaintenanceCenterAsync(surveyid, token); + var result = await this.surveyResponseProvider.GetSurveyResponsesByMaintenanceCenterAsync(surveyid); if (result.IsSuccess) { return Ok(result.SurveyResponses); @@ -124,11 +114,11 @@ namespace DamageAssesment.Api.SurveyResponses.Controllers /// GET request for retrieving a survey response by response ID. /// /// The ID of the survey response to be retrieved. - + [Authorize(Roles = "admin,survey,user,report")] [HttpGet("Responses/{id}")] public async Task GetSurveyResponseByIdAsync(int id) { - var result = await this.surveyResponseProvider.GetSurveyResponseByIdAsync(id, token); + var result = await this.surveyResponseProvider.GetSurveyResponseByIdAsync(id); if (result.IsSuccess) { return Ok(result.SurveyResponse); @@ -140,7 +130,7 @@ namespace DamageAssesment.Api.SurveyResponses.Controllers /// POST request for creating a new survey response. /// /// The survey response object to be created. - + [Authorize(Roles = "admin,survey,user,report")] [HttpPost("Responses")] public async Task PostSurveysAsync(Models.SurveyResponse surveyResponse) { @@ -156,7 +146,7 @@ namespace DamageAssesment.Api.SurveyResponses.Controllers /// /// The ID of the survey response to be updated. /// The updated survey response object. - + [Authorize(Roles = "admin,survey,user,report")] [HttpPut("Responses/{id}")] public async Task PutSurveyResponseAsync(int id, Models.SurveyResponse surveyResponse) { @@ -173,7 +163,7 @@ namespace DamageAssesment.Api.SurveyResponses.Controllers /// /// DELETE request for deleting an existing survey response. /// - + [Authorize(Roles = "admin,survey,user,report")] [HttpDelete("Responses/{id}")] public async Task DeleteSurveyResponseAsync(int id) { @@ -188,11 +178,11 @@ namespace DamageAssesment.Api.SurveyResponses.Controllers /// POST request for submitting survey with multiple answers. /// /// The answers to be submitted for the survey. - + [Authorize(Roles = "admin,survey,user,report")] [HttpPost("Responses/Answers")] public async Task PostSurveyAnswersAsync(Request request) { - var result = await this.surveyResponseProvider.PostSurveyAnswersAsync(request, token); + var result = await this.surveyResponseProvider.PostSurveyAnswersAsync(request); if (result.IsSuccess) return Ok(result.SurveyResponse); diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Db/SurveyResponse.cs b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Db/SurveyResponse.cs index 2169097..14704cb 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Db/SurveyResponse.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Db/SurveyResponse.cs @@ -1,7 +1,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; -namespace DamageAssesment.Api.SurveyResponses.Db +namespace DamageAssesment.Api.Responses.Db { public class SurveyResponse { diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Db/SurveyResponseDbContext.cs b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Db/SurveyResponseDbContext.cs index 61726ad..c1fae2d 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Db/SurveyResponseDbContext.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Db/SurveyResponseDbContext.cs @@ -1,6 +1,6 @@ using Microsoft.EntityFrameworkCore; -namespace DamageAssesment.Api.SurveyResponses.Db +namespace DamageAssesment.Api.Responses.Db { public class SurveyResponseDbContext:DbContext { diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/IAnswerServiceProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/IAnswerServiceProvider.cs index 2517daa..7c23f55 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/IAnswerServiceProvider.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/IAnswerServiceProvider.cs @@ -1,6 +1,6 @@ -using DamageAssesment.Api.SurveyResponses.Models; +using DamageAssesment.Api.Responses.Models; -namespace DamageAssesment.Api.SurveyResponses.Interfaces +namespace DamageAssesment.Api.Responses.Interfaces { public interface IAnswerServiceProvider { diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/IAttachmentServiceProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/IAttachmentServiceProvider.cs index f22c3d0..15f76a5 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/IAttachmentServiceProvider.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/IAttachmentServiceProvider.cs @@ -1,6 +1,6 @@ -using DamageAssesment.Api.SurveyResponses.Models; +using DamageAssesment.Api.Responses.Models; -namespace DamageAssesment.Api.SurveyResponses.Interfaces +namespace DamageAssesment.Api.Responses.Interfaces { public interface IAttachmentServiceProvider { diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/IEmployeeServiceProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/IEmployeeServiceProvider.cs index 9b1d2e1..b7f8143 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/IEmployeeServiceProvider.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/IEmployeeServiceProvider.cs @@ -1,6 +1,6 @@ -using DamageAssesment.Api.SurveyResponses.Models; +using DamageAssesment.Api.Responses.Models; -namespace DamageAssesment.Api.SurveyResponses.Interfaces +namespace DamageAssesment.Api.Responses.Interfaces { public interface IEmployeeServiceProvider { diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/IHttpUtil.cs b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/IHttpUtil.cs index f262fa5..cf63c3b 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/IHttpUtil.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/IHttpUtil.cs @@ -1,6 +1,6 @@ -using DamageAssesment.Api.SurveyResponses.Models; +using DamageAssesment.Api.Responses.Models; -namespace DamageAssesment.Api.SurveyResponses.Interfaces +namespace DamageAssesment.Api.Responses.Interfaces { public interface IHttpUtil { diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/ILocationServiceProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/ILocationServiceProvider.cs index aae34b0..75ab80e 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/ILocationServiceProvider.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/ILocationServiceProvider.cs @@ -1,6 +1,6 @@ -using DamageAssesment.Api.SurveyResponses.Models; +using DamageAssesment.Api.Responses.Models; -namespace DamageAssesment.Api.SurveyResponses.Interfaces +namespace DamageAssesment.Api.Responses.Interfaces { public interface ILocationServiceProvider { diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/IQuestionServiceProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/IQuestionServiceProvider.cs index 4530034..b37a171 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/IQuestionServiceProvider.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/IQuestionServiceProvider.cs @@ -1,6 +1,6 @@ -using DamageAssesment.Api.SurveyResponses.Models; +using DamageAssesment.Api.Responses.Models; -namespace DamageAssesment.Api.SurveyResponses.Interfaces +namespace DamageAssesment.Api.Responses.Interfaces { public interface IQuestionServiceProvider { diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/IRegionServiceProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/IRegionServiceProvider.cs index 1d26e11..a97193e 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/IRegionServiceProvider.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/IRegionServiceProvider.cs @@ -1,6 +1,6 @@ -using DamageAssesment.Api.SurveyResponses.Models; +using DamageAssesment.Api.Responses.Models; -namespace DamageAssesment.Api.SurveyResponses.Interfaces +namespace DamageAssesment.Api.Responses.Interfaces { public interface IRegionServiceProvider { diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/ISurveyServiceProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/ISurveyServiceProvider.cs index 7609d1d..60de3bd 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/ISurveyServiceProvider.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/ISurveyServiceProvider.cs @@ -1,6 +1,6 @@ -using DamageAssesment.Api.SurveyResponses.Models; +using DamageAssesment.Api.Responses.Models; -namespace DamageAssesment.Api.SurveyResponses.Interfaces +namespace DamageAssesment.Api.Responses.Interfaces { public interface ISurveyServiceProvider { diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/ISurveysResponse.cs b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/ISurveysResponse.cs index de31140..180c723 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/ISurveysResponse.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/ISurveysResponse.cs @@ -1,23 +1,22 @@ -using DamageAssesment.Api.SurveyResponses.Models; -using Microsoft.AspNetCore.Mvc; +using DamageAssesment.Api.Responses.Models; -namespace DamageAssesment.Api.SurveyResponses.Interfaces +namespace DamageAssesment.Api.Responses.Interfaces { public interface ISurveysResponse { - Task<(bool IsSuccess, dynamic Answers, string ErrorMessage)> GetAnswersByRegionAsync(int surveyId, string token); + Task<(bool IsSuccess, dynamic Answers, string ErrorMessage)> GetAnswersByRegionAsync(int surveyId); Task<(bool IsSuccess, Models.SurveyResponse SurveyResponse, string ErrorMessage)> PostSurveyResponseAsync(Models.SurveyResponse surveyResponse); // Task<(bool IsSuccess,dynamic surveyResponses, string ErrorMessage)> GetSurveyResponseAsync(int responseId); - Task<(bool IsSuccess, dynamic surveyResponses, string ErrorMessage)> GetSurveyResponsesAsync(string token); + Task<(bool IsSuccess, dynamic surveyResponses, string ErrorMessage)> GetSurveyResponsesAsync(); Task<(bool IsSuccess, Models.SurveyResponse SurveyResponse, string ErrorMessage)> PutSurveyResponseAsync(int Id, Models.SurveyResponse surveyResponse); Task<(bool IsSuccess, Models.SurveyResponse SurveyResponse, string ErrorMessage)> DeleteSurveyResponseAsync(int Id); - Task<(bool IsSuccess, dynamic SurveyResponse, string ErrorMessage)> GetSurveyResponseByIdAsync(int responseId, string token); - Task<(bool IsSuccess, dynamic SurveyResponses, string ErrorMessage)> GetSurveyResponsesBySurveyAsync(int surveyId, string token); - Task<(bool IsSuccess, dynamic SurveyResponses, string ErrorMessage)> GetSurveyResponsesBySurveyAndLocationAsync(int surveyId, int locationId, string token); - Task<(bool IsSuccess, dynamic SurveyResponses, string ErrorMessage)> GetSurveyResponsesByMaintenanceCenterAsync(int surveyId, string token); - Task<(bool IsSuccess, dynamic SurveyResponses, string ErrorMessage)> GetResponsesByAnswerAsync(int surveyId, int questionId, string answer, string token); + Task<(bool IsSuccess, dynamic SurveyResponse, string ErrorMessage)> GetSurveyResponseByIdAsync(int responseId); + Task<(bool IsSuccess, dynamic SurveyResponses, string ErrorMessage)> GetSurveyResponsesBySurveyAsync(int surveyId); + Task<(bool IsSuccess, dynamic SurveyResponses, string ErrorMessage)> GetSurveyResponsesBySurveyAndLocationAsync(int surveyId, int locationId); + Task<(bool IsSuccess, dynamic SurveyResponses, string ErrorMessage)> GetSurveyResponsesByMaintenanceCenterAsync(int surveyId); + Task<(bool IsSuccess, dynamic SurveyResponses, string ErrorMessage)> GetResponsesByAnswerAsync(int surveyId, int questionId, string answer); - Task<(bool IsSuccess, Models.SurveyResponse SurveyResponse, string ErrorMessage)> PostSurveyAnswersAsync(Request request, string token); + Task<(bool IsSuccess, Models.SurveyResponse SurveyResponse, string ErrorMessage)> PostSurveyAnswersAsync(Request request); } } diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/Answer.cs b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/Answer.cs index d607a2f..d507630 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/Answer.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/Answer.cs @@ -1,6 +1,6 @@ using System.ComponentModel.DataAnnotations; -namespace DamageAssesment.Api.SurveyResponses.Models +namespace DamageAssesment.Api.Responses.Models { public class Answer { diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/AnswerRequest.cs b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/AnswerRequest.cs index 3d86488..2921faf 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/AnswerRequest.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/AnswerRequest.cs @@ -1,4 +1,4 @@ -namespace DamageAssesment.Api.SurveyResponses.Models +namespace DamageAssesment.Api.Responses.Models { public class AnswerRequest { diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/Attachment.cs b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/Attachment.cs index 92ab874..6194789 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/Attachment.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/Attachment.cs @@ -1,6 +1,6 @@ using System.ComponentModel.DataAnnotations; -namespace DamageAssesment.Api.SurveyResponses.Models +namespace DamageAssesment.Api.Responses.Models { public class Attachment { diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/AttachmentInfo.cs b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/AttachmentInfo.cs index e3e30b9..8c31831 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/AttachmentInfo.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/AttachmentInfo.cs @@ -1,4 +1,4 @@ -namespace DamageAssesment.Api.SurveyResponses.Models +namespace DamageAssesment.Api.Responses.Models { public class AttachmentInfo { diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/Employee.cs b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/Employee.cs index ab21448..3a84d81 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/Employee.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/Employee.cs @@ -1,6 +1,6 @@ using System.ComponentModel.DataAnnotations; -namespace DamageAssesment.Api.SurveyResponses.Models +namespace DamageAssesment.Api.Responses.Models { public class Employee { diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/Location.cs b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/Location.cs index 078a5ef..d5996d2 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/Location.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/Location.cs @@ -1,4 +1,4 @@ -namespace DamageAssesment.Api.SurveyResponses.Models +namespace DamageAssesment.Api.Responses.Models { public class Location { diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/Question.cs b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/Question.cs index 37abb4b..aac31f5 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/Question.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/Question.cs @@ -1,6 +1,6 @@ using System.Collections.Generic; -namespace DamageAssesment.Api.SurveyResponses.Models +namespace DamageAssesment.Api.Responses.Models { public class Question { diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/Region.cs b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/Region.cs index 3fc5ad7..0f3ee9d 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/Region.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/Region.cs @@ -1,6 +1,6 @@ using System.ComponentModel.DataAnnotations; -namespace DamageAssesment.Api.SurveyResponses.Models +namespace DamageAssesment.Api.Responses.Models { public class Region { diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/Request.cs b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/Request.cs index 5060914..322314d 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/Request.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/Request.cs @@ -1,4 +1,4 @@ -namespace DamageAssesment.Api.SurveyResponses.Models +namespace DamageAssesment.Api.Responses.Models { public class Request { diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/Survey.cs b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/Survey.cs index b47193e..8265046 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/Survey.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/Survey.cs @@ -1,6 +1,6 @@ using System.ComponentModel.DataAnnotations; -namespace DamageAssesment.Api.SurveyResponses.Models +namespace DamageAssesment.Api.Responses.Models { public class Survey { diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/SurveyQuestion.cs b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/SurveyQuestion.cs index d510b4e..da3668f 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/SurveyQuestion.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/SurveyQuestion.cs @@ -1,4 +1,4 @@ -namespace DamageAssesment.Api.SurveyResponses.Models +namespace DamageAssesment.Api.Responses.Models { public class SurveyQuestions { diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/SurveyResponse.cs b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/SurveyResponse.cs index 37862ca..56d2048 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/SurveyResponse.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/SurveyResponse.cs @@ -1,7 +1,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; -namespace DamageAssesment.Api.SurveyResponses.Models +namespace DamageAssesment.Api.Responses.Models { public class SurveyResponse { diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/SurveyTranslation.cs b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/SurveyTranslation.cs index 29a1b7c..022172f 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/SurveyTranslation.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/SurveyTranslation.cs @@ -1,4 +1,4 @@ -namespace DamageAssesment.Api.SurveyResponses.Models +namespace DamageAssesment.Api.Responses.Models { public class SurveyTranslation { diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Profiles/SurveyResponsesProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Profiles/SurveyResponsesProvider.cs index d7c65a0..8208db7 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Profiles/SurveyResponsesProvider.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Profiles/SurveyResponsesProvider.cs @@ -1,4 +1,4 @@ -namespace DamageAssesment.Api.SurveyResponses.Profiles +namespace DamageAssesment.Api.Responses.Profiles { public class SurveyResponsesProvider : AutoMapper.Profile { diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Program.cs b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Program.cs index 550d49c..82f2076 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Program.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Program.cs @@ -1,7 +1,7 @@ -using DamageAssesment.Api.SurveyResponses.Db; -using DamageAssesment.Api.SurveyResponses.Interfaces; -using DamageAssesment.Api.SurveyResponses.Services; -using DamageAssesment.Api.SurveyResponses.Providers; +using DamageAssesment.Api.Responses.Db; +using DamageAssesment.Api.Responses.Interfaces; +using DamageAssesment.Api.Responses.Services; +using DamageAssesment.Api.Responses.Providers; using Microsoft.EntityFrameworkCore; using Polly; using System.Reflection; diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Properties/launchSettings.json b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Properties/launchSettings.json index 0d51b15..f43ced8 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Properties/launchSettings.json +++ b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Properties/launchSettings.json @@ -9,7 +9,7 @@ } }, "profiles": { - "DamageAssesment.Api.SurveyResponses": { + "DamageAssesment.Api.Responses": { "commandName": "Project", "dotnetRunMessages": true, "launchBrowser": true, diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Providers/SurveyResponsesProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Providers/SurveyResponsesProvider.cs index d3641b1..eaba58f 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Providers/SurveyResponsesProvider.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Providers/SurveyResponsesProvider.cs @@ -1,10 +1,10 @@ using AutoMapper; -using DamageAssesment.Api.SurveyResponses.Db; -using DamageAssesment.Api.SurveyResponses.Interfaces; -using DamageAssesment.Api.SurveyResponses.Models; +using DamageAssesment.Api.Responses.Db; +using DamageAssesment.Api.Responses.Interfaces; +using DamageAssesment.Api.Responses.Models; using Microsoft.EntityFrameworkCore; -namespace DamageAssesment.Api.SurveyResponses.Providers +namespace DamageAssesment.Api.Responses.Providers { public class SurveyResponsesProvider : ISurveysResponse { @@ -18,8 +18,10 @@ namespace DamageAssesment.Api.SurveyResponses.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 logger, IAnswerServiceProvider answerServiceProvider, IRegionServiceProvider regionServiceProvider, ILocationServiceProvider locationServiceProvider, IEmployeeServiceProvider employeeServiceProvider, IAttachmentServiceProvider attachmentServiceProvider, IQuestionServiceProvider questionServiceProvider, ISurveyServiceProvider surveyServiceProvider, IMapper mapper) + public SurveyResponsesProvider(SurveyResponseDbContext surveyResponseDbContext, ILogger logger, IAnswerServiceProvider answerServiceProvider, IRegionServiceProvider regionServiceProvider, ILocationServiceProvider locationServiceProvider, IEmployeeServiceProvider employeeServiceProvider, IAttachmentServiceProvider attachmentServiceProvider, IQuestionServiceProvider questionServiceProvider, ISurveyServiceProvider surveyServiceProvider, IMapper mapper, IHttpContextAccessor httpContextAccessor) { this.surveyResponseDbContext = surveyResponseDbContext; this.logger = logger; @@ -30,8 +32,19 @@ namespace DamageAssesment.Api.SurveyResponses.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(); } private void seedData() @@ -42,13 +55,13 @@ namespace DamageAssesment.Api.SurveyResponses.Providers surveyResponseDbContext.SurveyResponses.Add(new Db.SurveyResponse { Id = 2, SurveyId = 1, EmployeeId = 2, LocationId = 2, ClientDevice = "Desktop", Latitude = 98.8767, Longitute = -129.9897, KeyAnswerResult = "true", CreatedDate = DateTime.Now }); surveyResponseDbContext.SurveyResponses.Add(new Db.SurveyResponse { Id = 3, SurveyId = 3, EmployeeId = 4, LocationId = 1, ClientDevice = "Mobile", Latitude = 98.8767, Longitute = -129.9897, KeyAnswerResult = "true", CreatedDate = DateTime.Now }); surveyResponseDbContext.SurveyResponses.Add(new Db.SurveyResponse { Id = 4, SurveyId = 4, EmployeeId = 1, LocationId = 2, ClientDevice = "Desktop", Latitude = 98.8767, Longitute = -129.9897, KeyAnswerResult = "false", CreatedDate = DateTime.Now }); - surveyResponseDbContext.SurveyResponses.Add(new Db.SurveyResponse { Id = 6, SurveyId = 1, EmployeeId = 4, LocationId = 2, ClientDevice = "Desktop", Latitude = 98.8767, Longitute = -129.9897, KeyAnswerResult = "true", CreatedDate = DateTime.Now }); - surveyResponseDbContext.SurveyResponses.Add(new Db.SurveyResponse { Id = 7, SurveyId = 1, EmployeeId = 4, LocationId = 3, ClientDevice = "Desktop", Latitude = 98.8767, Longitute = -129.9897, KeyAnswerResult = "false", CreatedDate = DateTime.Now }); + surveyResponseDbContext.SurveyResponses.Add(new Db.SurveyResponse { Id = 5, SurveyId = 1, EmployeeId = 4, LocationId = 2, ClientDevice = "Desktop", Latitude = 98.8767, Longitute = -129.9897, KeyAnswerResult = "true", CreatedDate = DateTime.Now }); + surveyResponseDbContext.SurveyResponses.Add(new Db.SurveyResponse { Id = 6, SurveyId = 1, EmployeeId = 4, LocationId = 3, ClientDevice = "Desktop", Latitude = 98.8767, Longitute = -129.9897, KeyAnswerResult = "false", CreatedDate = DateTime.Now }); surveyResponseDbContext.SaveChanges(); } } - public async Task<(bool IsSuccess, dynamic Answers, string ErrorMessage)> GetAnswersByRegionAsync(int surveyId,string token) + public async Task<(bool IsSuccess, dynamic Answers, string ErrorMessage)> GetAnswersByRegionAsync(int surveyId) { try { @@ -57,7 +70,7 @@ namespace DamageAssesment.Api.SurveyResponses.Providers if (listSurveyResponse.Any()) { - var answers = await getAnswersByRegionAndSurveyIdAsync(listSurveyResponse,token); + var answers = await getAnswersByRegionAndSurveyIdAsync(listSurveyResponse); return (true, answers, "Request Successful."); } else @@ -72,7 +85,7 @@ namespace DamageAssesment.Api.SurveyResponses.Providers } } - public async Task<(bool IsSuccess, dynamic SurveyResponse, string ErrorMessage)> GetSurveyResponseByIdAsync(int responseId, string token) + public async Task<(bool IsSuccess, dynamic SurveyResponse, string ErrorMessage)> GetSurveyResponseByIdAsync(int responseId) { try { @@ -81,7 +94,7 @@ namespace DamageAssesment.Api.SurveyResponses.Providers if (surveyResponse != null) { - var answers = await getSurveyResponseByResponseIdAsync(surveyResponse, token); + var answers = await getSurveyResponseByResponseIdAsync(surveyResponse); if (answers != null) return (true, answers, "Request Successful."); @@ -105,7 +118,7 @@ namespace DamageAssesment.Api.SurveyResponses.Providers - public async Task<(bool IsSuccess, dynamic SurveyResponses, string ErrorMessage)> GetSurveyResponsesBySurveyAsync(int surveyId, string token) + public async Task<(bool IsSuccess, dynamic SurveyResponses, string ErrorMessage)> GetSurveyResponsesBySurveyAsync(int surveyId) { try { @@ -114,7 +127,7 @@ namespace DamageAssesment.Api.SurveyResponses.Providers if (survey != null) { - var answers = await getSurveyResponsesBySurveyIdAsync(surveyId, token); + var answers = await getSurveyResponsesBySurveyIdAsync(surveyId); if (answers != null) return (true, answers, "Request Successful."); @@ -136,7 +149,7 @@ namespace DamageAssesment.Api.SurveyResponses.Providers } } - public async Task<(bool IsSuccess, dynamic SurveyResponses, string ErrorMessage)> GetSurveyResponsesBySurveyAndLocationAsync(int surveyId, int locationId, string token) + public async Task<(bool IsSuccess, dynamic SurveyResponses, string ErrorMessage)> GetSurveyResponsesBySurveyAndLocationAsync(int surveyId, int locationId) { try { @@ -145,7 +158,7 @@ namespace DamageAssesment.Api.SurveyResponses.Providers if (survey != null) { - var answers = await getSurveyResponsesBySurveyIdLocationIdAsync(surveyId, locationId, token); + var answers = await getSurveyResponsesBySurveyIdLocationIdAsync(surveyId, locationId); if (answers != null) return (true, answers, "Request Successful."); @@ -167,7 +180,7 @@ namespace DamageAssesment.Api.SurveyResponses.Providers } } - public async Task<(bool IsSuccess, dynamic SurveyResponses, string ErrorMessage)> GetSurveyResponsesByMaintenanceCenterAsync(int surveyId, string token) + public async Task<(bool IsSuccess, dynamic SurveyResponses, string ErrorMessage)> GetSurveyResponsesByMaintenanceCenterAsync(int surveyId) { try { @@ -176,7 +189,7 @@ namespace DamageAssesment.Api.SurveyResponses.Providers if (survey != null) { - var answers = await getResultsByMaintenanceCenterAsync(surveyId,token); + var answers = await getResultsByMaintenanceCenterAsync(surveyId); if (answers != null) return (true, answers, "Request Successful."); @@ -198,7 +211,7 @@ namespace DamageAssesment.Api.SurveyResponses.Providers } } - public async Task<(bool IsSuccess, dynamic SurveyResponses, string ErrorMessage)> GetResponsesByAnswerAsync(int surveyId, int questionId, string answer, string token) + public async Task<(bool IsSuccess, dynamic SurveyResponses, string ErrorMessage)> GetResponsesByAnswerAsync(int surveyId, int questionId, string answer) { try { @@ -210,7 +223,7 @@ namespace DamageAssesment.Api.SurveyResponses.Providers if (survey != null && question != null && IsCorrectAnswer) { - var answers = await getSurveyResponsesByAnswerAsync(survey, question, answer, token); + var answers = await getSurveyResponsesByAnswerAsync(survey, question, answer); if (answers != null) return (true, answers, "Request Successful."); @@ -233,11 +246,11 @@ namespace DamageAssesment.Api.SurveyResponses.Providers } - public async Task<(bool IsSuccess, dynamic surveyResponses, string ErrorMessage)> GetSurveyResponsesAsync(string token) + public async Task<(bool IsSuccess, dynamic surveyResponses, string ErrorMessage)> GetSurveyResponsesAsync() { try { - var answers = await getAllSurveyResponsesAsync(token); + var answers = await getAllSurveyResponsesAsync(); if (answers != null) return (true, answers, "Request Successful."); @@ -341,7 +354,7 @@ namespace DamageAssesment.Api.SurveyResponses.Providers } //Method to get Answers by region with surveyId as input parameter - private async Task getAnswersByRegionAndSurveyIdAsync(IQueryable surveyResponses, string token) + private async Task getAnswersByRegionAndSurveyIdAsync(IQueryable surveyResponses) { try { @@ -427,7 +440,7 @@ namespace DamageAssesment.Api.SurveyResponses.Providers } //Method to get Survey Response by ResponseId - private async Task getSurveyResponseByResponseIdAsync(Db.SurveyResponse surveyResponse, string token) + private async Task getSurveyResponseByResponseIdAsync(Db.SurveyResponse surveyResponse) { try { @@ -470,7 +483,7 @@ namespace DamageAssesment.Api.SurveyResponses.Providers //Method to get Survey Responses by surveyId - private async Task getSurveyResponsesBySurveyIdAsync(int surveyId, string token) + private async Task getSurveyResponsesBySurveyIdAsync(int surveyId) { try { @@ -519,7 +532,7 @@ namespace DamageAssesment.Api.SurveyResponses.Providers //Method to get All Survey Responses - private async Task getAllSurveyResponsesAsync(string token) + private async Task getAllSurveyResponsesAsync() { try { @@ -564,7 +577,7 @@ namespace DamageAssesment.Api.SurveyResponses.Providers //Method to get Answers By Maintenance Center by surveyId - private async Task getResultsByMaintenanceCenterAsync(int surveyId, string token) + private async Task getResultsByMaintenanceCenterAsync(int surveyId) { try { @@ -624,7 +637,7 @@ namespace DamageAssesment.Api.SurveyResponses.Providers } //Method to get Survey Responses by surveyId and LocationId - private async Task getSurveyResponsesBySurveyIdLocationIdAsync(int surveyId, int locationId, string token) + private async Task getSurveyResponsesBySurveyIdLocationIdAsync(int surveyId, int locationId) { try { @@ -671,7 +684,7 @@ namespace DamageAssesment.Api.SurveyResponses.Providers //Method to get Survey Responses by surveyId questionId and answer - private async Task getSurveyResponsesByAnswerAsync(Survey survey, Question question, string answer, string token) + private async Task getSurveyResponsesByAnswerAsync(Survey survey, Question question, string answer) { try { @@ -717,7 +730,7 @@ namespace DamageAssesment.Api.SurveyResponses.Providers } - async Task ProcessAnswers(AnswerRequest answerRequest, int surveyResponseId,string token) + async Task ProcessAnswers(AnswerRequest answerRequest, int surveyResponseId) { if (answerRequest != null) { @@ -747,7 +760,7 @@ namespace DamageAssesment.Api.SurveyResponses.Providers } } - public async Task<(bool IsSuccess, Models.SurveyResponse SurveyResponse, string ErrorMessage)> PostSurveyAnswersAsync(Models.Request request, string token) + public async Task<(bool IsSuccess, Models.SurveyResponse SurveyResponse, string ErrorMessage)> PostSurveyAnswersAsync(Models.Request request) { try { @@ -757,7 +770,7 @@ namespace DamageAssesment.Api.SurveyResponses.Providers if (response.IsSuccess) { var surveyResponse = response.SurveyResponse; - var tasks = request.Answers.Select(x => ProcessAnswers(x, surveyResponse.Id,token)); + var tasks = request.Answers.Select(x => ProcessAnswers(x, surveyResponse.Id)); await Task.WhenAll(tasks); return (true, surveyResponse, null); } diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/AnswerServiceProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/AnswerServiceProvider.cs index 5ee1a39..b550ff1 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/AnswerServiceProvider.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/AnswerServiceProvider.cs @@ -1,10 +1,10 @@ -using DamageAssesment.Api.SurveyResponses.Interfaces; -using DamageAssesment.Api.SurveyResponses.Models; +using DamageAssesment.Api.Responses.Interfaces; +using DamageAssesment.Api.Responses.Models; using Microsoft.Extensions.Primitives; using Newtonsoft.Json; -namespace DamageAssesment.Api.SurveyResponses.Services +namespace DamageAssesment.Api.Responses.Services { public class AnswerServiceProvider : ServiceProviderBase, IAnswerServiceProvider { diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/AttachmentServiceProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/AttachmentServiceProvider.cs index 25601fe..9ace258 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/AttachmentServiceProvider.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/AttachmentServiceProvider.cs @@ -1,8 +1,8 @@ -using DamageAssesment.Api.SurveyResponses.Interfaces; -using DamageAssesment.Api.SurveyResponses.Models; +using DamageAssesment.Api.Responses.Interfaces; +using DamageAssesment.Api.Responses.Models; using Newtonsoft.Json; -namespace DamageAssesment.Api.SurveyResponses.Services +namespace DamageAssesment.Api.Responses.Services { public class AttachmentServiceProvider : ServiceProviderBase, IAttachmentServiceProvider { diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/EmployeeServiceProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/EmployeeServiceProvider.cs index 0a598a6..507fc18 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/EmployeeServiceProvider.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/EmployeeServiceProvider.cs @@ -1,9 +1,9 @@ -using DamageAssesment.Api.SurveyResponses.Interfaces; -using DamageAssesment.Api.SurveyResponses.Models; +using DamageAssesment.Api.Responses.Interfaces; +using DamageAssesment.Api.Responses.Models; using Microsoft.AspNetCore.Mvc.Routing; using Newtonsoft.Json; -namespace DamageAssesment.Api.SurveyResponses.Services +namespace DamageAssesment.Api.Responses.Services { public class EmployeeServiceProvider : ServiceProviderBase, IEmployeeServiceProvider { diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/HttpUtil.cs b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/HttpUtil.cs index 09e3582..3f8ca2d 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/HttpUtil.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/HttpUtil.cs @@ -1,9 +1,9 @@ -using DamageAssesment.Api.SurveyResponses.Interfaces; -using DamageAssesment.Api.SurveyResponses.Models; +using DamageAssesment.Api.Responses.Interfaces; +using DamageAssesment.Api.Responses.Models; using System.Net.Http.Headers; using System.Text; -namespace DamageAssesment.Api.SurveyResponses.Services +namespace DamageAssesment.Api.Responses.Services { public class HttpUtil : IHttpUtil { diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/LocationServiceProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/LocationServiceProvider.cs index 62ebf09..2d38ca3 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/LocationServiceProvider.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/LocationServiceProvider.cs @@ -1,8 +1,8 @@ -using DamageAssesment.Api.SurveyResponses.Interfaces; -using DamageAssesment.Api.SurveyResponses.Models; +using DamageAssesment.Api.Responses.Interfaces; +using DamageAssesment.Api.Responses.Models; using Newtonsoft.Json; -namespace DamageAssesment.Api.SurveyResponses.Services +namespace DamageAssesment.Api.Responses.Services { public class LocationServiceProvider :ServiceProviderBase, ILocationServiceProvider { diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/QuestionServiceProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/QuestionServiceProvider.cs index 9f163c2..4f2e75f 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/QuestionServiceProvider.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/QuestionServiceProvider.cs @@ -1,8 +1,8 @@ -using DamageAssesment.Api.SurveyResponses.Interfaces; -using DamageAssesment.Api.SurveyResponses.Models; +using DamageAssesment.Api.Responses.Interfaces; +using DamageAssesment.Api.Responses.Models; using Newtonsoft.Json; -namespace DamageAssesment.Api.SurveyResponses.Services +namespace DamageAssesment.Api.Responses.Services { public class QuestionServiceProvider : ServiceProviderBase, IQuestionServiceProvider { diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/RegionServiceProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/RegionServiceProvider.cs index 1b6ea07..13de3d6 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/RegionServiceProvider.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/RegionServiceProvider.cs @@ -1,8 +1,8 @@ -using DamageAssesment.Api.SurveyResponses.Interfaces; -using DamageAssesment.Api.SurveyResponses.Models; +using DamageAssesment.Api.Responses.Interfaces; +using DamageAssesment.Api.Responses.Models; using Newtonsoft.Json; -namespace DamageAssesment.Api.SurveyResponses.Services +namespace DamageAssesment.Api.Responses.Services { public class RegionServiceProvider : ServiceProviderBase, IRegionServiceProvider { diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/ServiceProviderBase.cs b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/ServiceProviderBase.cs index af1aa65..1196f5b 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/ServiceProviderBase.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/ServiceProviderBase.cs @@ -1,6 +1,6 @@ -using DamageAssesment.Api.SurveyResponses.Interfaces; +using DamageAssesment.Api.Responses.Interfaces; -namespace DamageAssesment.Api.SurveyResponses.Services +namespace DamageAssesment.Api.Responses.Services { public class ServiceProviderBase { diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/SurveyServiceProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/SurveyServiceProvider.cs index fc08135..2e9732e 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/SurveyServiceProvider.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/SurveyServiceProvider.cs @@ -1,8 +1,8 @@ -using DamageAssesment.Api.SurveyResponses.Interfaces; -using DamageAssesment.Api.SurveyResponses.Models; +using DamageAssesment.Api.Responses.Interfaces; +using DamageAssesment.Api.Responses.Models; using Newtonsoft.Json; -namespace DamageAssesment.Api.SurveyResponses.Services +namespace DamageAssesment.Api.Responses.Services { public class SurveyServiceProvider :ServiceProviderBase, ISurveyServiceProvider { diff --git a/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Controllers/UsersAccessController.cs b/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Controllers/UsersAccessController.cs index b8b2760..e0aae67 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Controllers/UsersAccessController.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.UsersAccess/Controllers/UsersAccessController.cs @@ -2,8 +2,6 @@ using DamageAssesment.Api.UsersAccess.Models; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -using System.IdentityModel.Tokens.Jwt; -using System.IO; namespace DamageAssesment.Api.UsersAccess.Controllers { @@ -20,14 +18,6 @@ namespace DamageAssesment.Api.UsersAccess.Controllers [HttpPost("token/{employecode}")] public async Task AuthenticateAsync(string employecode) { - /* if (Request.Headers.TryGetValue("Authorization", out var headerAuth)) - { - var jwtToken = headerAuth.First().Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)[1]; - var handler = new JwtSecurityTokenHandler(); - var jsonToken = handler.ReadToken(jwtToken) as JwtSecurityToken; - return Ok(jsonToken.Payload.Sub); - } */ - var result = await userAccessProvider.AuthenticateAsync(employecode); if (result.IsSuccess) { diff --git a/DamageAssesmentApi/DamageAssesment.SurveyResponses.Test/MockData.cs b/DamageAssesmentApi/DamageAssesment.SurveyResponses.Test/MockData.cs index 5be421f..c7a52de 100644 --- a/DamageAssesmentApi/DamageAssesment.SurveyResponses.Test/MockData.cs +++ b/DamageAssesmentApi/DamageAssesment.SurveyResponses.Test/MockData.cs @@ -1,9 +1,9 @@  -using DamageAssesment.Api.SurveyResponses.Models; +using DamageAssesment.Api.Responses.Models; using System.Collections.Generic; using System.Text; -namespace DamageAssesment.Api.SurveyResponses.Test +namespace DamageAssesment.Api.Responses.Test { public class MockData { diff --git a/DamageAssesmentApi/DamageAssesment.SurveyResponses.Test/SurveyResponsesServiceTest.cs b/DamageAssesmentApi/DamageAssesment.SurveyResponses.Test/ResponsesServiceTest.cs similarity index 76% rename from DamageAssesmentApi/DamageAssesment.SurveyResponses.Test/SurveyResponsesServiceTest.cs rename to DamageAssesmentApi/DamageAssesment.SurveyResponses.Test/ResponsesServiceTest.cs index 593038d..57e3630 100644 --- a/DamageAssesmentApi/DamageAssesment.SurveyResponses.Test/SurveyResponsesServiceTest.cs +++ b/DamageAssesmentApi/DamageAssesment.SurveyResponses.Test/ResponsesServiceTest.cs @@ -1,20 +1,19 @@ -using DamageAssesment.Api.SurveyResponses.Controllers; -using DamageAssesment.Api.SurveyResponses.Interfaces; -using DamageAssesment.Api.SurveyResponses.Models; -using DamageAssesment.Api.SurveyResponses.Test; +using DamageAssesment.Api.Responses.Controllers; +using DamageAssesment.Api.Responses.Interfaces; +using DamageAssesment.Api.Responses.Models; +using DamageAssesment.Api.Responses.Test; using Microsoft.AspNetCore.Mvc; -using Microsoft.EntityFrameworkCore.Infrastructure; using Moq; using Xunit; -using Xunit.Sdk; + namespace DamageAssesment.SurveyResponses.Test { - public class SurveyResponsesServiceTest + public class ResponsesServiceTest { private Mock mockSurveyResponseService; private string token { get; set; } - public SurveyResponsesServiceTest() + public ResponsesServiceTest() { mockSurveyResponseService = new Mock(); token = Guid.NewGuid().ToString(); @@ -25,8 +24,8 @@ namespace DamageAssesment.SurveyResponses.Test { SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject(); var mockResponse = await MockData.getOkResponse(mockRequestObject); - mockSurveyResponseService.Setup(service => service.GetSurveyResponsesAsync(token)).ReturnsAsync(mockResponse); - var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object); + mockSurveyResponseService.Setup(service => service.GetSurveyResponsesAsync()).ReturnsAsync(mockResponse); + var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object); var result = (OkObjectResult)await surveyResponseProvider.GetSurveyResponsesAsync(); Assert.Equal(200, result.StatusCode); } @@ -35,8 +34,8 @@ namespace DamageAssesment.SurveyResponses.Test public async Task GetSurveyResponsesAsync_ShouldReturnStatusCode204() { var mockResponse = await MockData.getResponse(); - mockSurveyResponseService.Setup(service => service.GetSurveyResponsesAsync(token)).ReturnsAsync(mockResponse); - var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object); + mockSurveyResponseService.Setup(service => service.GetSurveyResponsesAsync()).ReturnsAsync(mockResponse); + var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object); var result = (BadRequestObjectResult)await surveyResponseProvider.GetSurveyResponsesAsync(); Assert.Equal(400, result.StatusCode); } @@ -46,8 +45,8 @@ namespace DamageAssesment.SurveyResponses.Test { SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject(); var mockResponse = await MockData.getOkResponse(); - mockSurveyResponseService.Setup(service => service.GetSurveyResponsesBySurveyAsync(1, token)).ReturnsAsync(mockResponse); - var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object); + mockSurveyResponseService.Setup(service => service.GetSurveyResponsesBySurveyAsync(1)).ReturnsAsync(mockResponse); + var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object); var result = (OkObjectResult)await surveyResponseProvider.GetSurveyResponsesAsync(1); Assert.Equal(200, result.StatusCode); } @@ -56,8 +55,8 @@ namespace DamageAssesment.SurveyResponses.Test public async Task GetSurveyResponsesBySurveyAsync_ShouldReturnStatusCode204() { var mockResponse = await MockData.getResponse(); - mockSurveyResponseService.Setup(service => service.GetSurveyResponsesBySurveyAsync(1, token)).ReturnsAsync(mockResponse); - var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object); + mockSurveyResponseService.Setup(service => service.GetSurveyResponsesBySurveyAsync(1)).ReturnsAsync(mockResponse); + var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object); var result = (NoContentResult)await surveyResponseProvider.GetSurveyResponsesAsync(1); Assert.Equal(204, result.StatusCode); } @@ -70,8 +69,8 @@ namespace DamageAssesment.SurveyResponses.Test { SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject(); var mockResponse = await MockData.getOkResponse(); - mockSurveyResponseService.Setup(service => service.GetSurveyResponsesBySurveyAndLocationAsync(1, 1, token)).ReturnsAsync(mockResponse); - var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object); + mockSurveyResponseService.Setup(service => service.GetSurveyResponsesBySurveyAndLocationAsync(1, 1)).ReturnsAsync(mockResponse); + var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object); var result = (OkObjectResult)await surveyResponseProvider.GetSurveyResponsesBySurveyAndLocationAsync(1, 1); Assert.Equal(200, result.StatusCode); } @@ -80,8 +79,8 @@ namespace DamageAssesment.SurveyResponses.Test public async Task GetSurveyResponsesBySurveyLocationAsync_ShouldReturnStatusCode204() { var mockResponse = await MockData.getResponse(); - mockSurveyResponseService.Setup(service => service.GetSurveyResponsesBySurveyAndLocationAsync(1, 1, token)).ReturnsAsync(mockResponse); - var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object); + mockSurveyResponseService.Setup(service => service.GetSurveyResponsesBySurveyAndLocationAsync(1, 1)).ReturnsAsync(mockResponse); + var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object); var result = (NoContentResult)await surveyResponseProvider.GetSurveyResponsesBySurveyAndLocationAsync(1, 1); Assert.Equal(204, result.StatusCode); } @@ -91,8 +90,8 @@ namespace DamageAssesment.SurveyResponses.Test { SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject(); var mockResponse = await MockData.getOkResponse(); - mockSurveyResponseService.Setup(service => service.GetResponsesByAnswerAsync(1, 1, "Yes", token)).ReturnsAsync(mockResponse); - var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object); + mockSurveyResponseService.Setup(service => service.GetResponsesByAnswerAsync(1, 1, "Yes")).ReturnsAsync(mockResponse); + var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object); var result = (OkObjectResult)await surveyResponseProvider.GetSurveyResponsesByAnswerAsyncAsync(1, 1, "Yes"); Assert.Equal(200, result.StatusCode); } @@ -101,8 +100,8 @@ namespace DamageAssesment.SurveyResponses.Test public async Task GetSurveyResponsesBySurveyQuestionAnswerAsync_ShouldReturnStatusCode204() { var mockResponse = await MockData.getResponse(); - mockSurveyResponseService.Setup(service => service.GetResponsesByAnswerAsync(1, 1, "Yes", token)).ReturnsAsync(mockResponse); - var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object); + mockSurveyResponseService.Setup(service => service.GetResponsesByAnswerAsync(1, 1, "Yes")).ReturnsAsync(mockResponse); + var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object); var result = (NoContentResult)await surveyResponseProvider.GetSurveyResponsesByAnswerAsyncAsync(1, 1, "Yes"); Assert.Equal(204, result.StatusCode); } @@ -113,8 +112,8 @@ namespace DamageAssesment.SurveyResponses.Test { SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject(); var mockResponse = await MockData.getOkResponse(); - mockSurveyResponseService.Setup(service => service.GetAnswersByRegionAsync(1, token)).ReturnsAsync(mockResponse); - var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object); + mockSurveyResponseService.Setup(service => service.GetAnswersByRegionAsync(1)).ReturnsAsync(mockResponse); + var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object); var result = (OkObjectResult)await surveyResponseProvider.GetAnswersByRegionAsync(1); Assert.Equal(200, result.StatusCode); } @@ -123,8 +122,8 @@ namespace DamageAssesment.SurveyResponses.Test public async Task GetSurveyResponsesByRegionSurveyAsync_ShouldReturnStatusCode204() { var mockResponse = await MockData.getResponse(); - mockSurveyResponseService.Setup(service => service.GetAnswersByRegionAsync(1, token)).ReturnsAsync(mockResponse); - var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object); + mockSurveyResponseService.Setup(service => service.GetAnswersByRegionAsync(1)).ReturnsAsync(mockResponse); + var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object); var result = (NoContentResult)await surveyResponseProvider.GetAnswersByRegionAsync(1); Assert.Equal(204, result.StatusCode); } @@ -134,8 +133,8 @@ namespace DamageAssesment.SurveyResponses.Test { SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject(); var mockResponse = await MockData.getOkResponse(); - mockSurveyResponseService.Setup(service => service.GetSurveyResponsesByMaintenanceCenterAsync(1, token)).ReturnsAsync(mockResponse); - var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object); + mockSurveyResponseService.Setup(service => service.GetSurveyResponsesByMaintenanceCenterAsync(1)).ReturnsAsync(mockResponse); + var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object); var result = (OkObjectResult)await surveyResponseProvider.GetAnswersByMaintenaceCentersync(1); Assert.Equal(200, result.StatusCode); } @@ -144,8 +143,8 @@ namespace DamageAssesment.SurveyResponses.Test public async Task GetSurveyResponsesMaintenanceCenterSurveyAsync_ShouldReturnStatusCode204() { var mockResponse = await MockData.getResponse(); - mockSurveyResponseService.Setup(service => service.GetSurveyResponsesByMaintenanceCenterAsync(1, token)).ReturnsAsync(mockResponse); - var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object); + mockSurveyResponseService.Setup(service => service.GetSurveyResponsesByMaintenanceCenterAsync(1)).ReturnsAsync(mockResponse); + var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object); var result = (NoContentResult)await surveyResponseProvider.GetAnswersByMaintenaceCentersync(1); Assert.Equal(204, result.StatusCode); } @@ -155,8 +154,8 @@ namespace DamageAssesment.SurveyResponses.Test { SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject(); var mockResponse = await MockData.getOkResponse(); - mockSurveyResponseService.Setup(service => service.GetSurveyResponseByIdAsync(1, token)).ReturnsAsync(mockResponse); - var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object); + mockSurveyResponseService.Setup(service => service.GetSurveyResponseByIdAsync(1)).ReturnsAsync(mockResponse); + var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object); var result = (OkObjectResult)await surveyResponseProvider.GetSurveyResponseByIdAsync(1); Assert.Equal(200, result.StatusCode); } @@ -165,8 +164,8 @@ namespace DamageAssesment.SurveyResponses.Test public async Task GetSurveyResponsesByResponseIdyAsync_ShouldReturnStatusCode204() { var mockResponse = await MockData.getResponse(); - mockSurveyResponseService.Setup(service => service.GetSurveyResponseByIdAsync(1, token)).ReturnsAsync(mockResponse); - var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object); + mockSurveyResponseService.Setup(service => service.GetSurveyResponseByIdAsync(1)).ReturnsAsync(mockResponse); + var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object); var result = (NoContentResult)await surveyResponseProvider.GetSurveyResponseByIdAsync(1); Assert.Equal(204, result.StatusCode); } @@ -178,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 SurveyResponsesController(mockSurveyResponseService.Object); + var surveyResponseController = new ResponsesController(mockSurveyResponseService.Object); var result = (OkObjectResult)await surveyResponseController.PostSurveysAsync(mockRequestObject); Assert.Equal(200, result.StatusCode); } @@ -189,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 SurveyResponsesController(mockSurveyResponseService.Object); + var surveyResponseController = new ResponsesController(mockSurveyResponseService.Object); var result = (BadRequestObjectResult)await surveyResponseController.PostSurveysAsync(mockRequestObject); Assert.Equal(400, result.StatusCode); } @@ -200,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 SurveyResponsesController(mockSurveyResponseService.Object); + var surveyResponseController = new ResponsesController(mockSurveyResponseService.Object); var result = (OkObjectResult)await surveyResponseController.PutSurveyResponseAsync(1, mockRequestObject); Assert.Equal(200, result.StatusCode); } @@ -211,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 SurveyResponsesController(mockSurveyResponseService.Object); + var surveyResponseController = new ResponsesController(mockSurveyResponseService.Object); var result = (BadRequestObjectResult)await surveyResponseController.PutSurveyResponseAsync(1, mockRequestObject); Assert.Equal(400, result.StatusCode); } @@ -222,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 SurveyResponsesController(mockSurveyResponseService.Object); + var surveyResponseController = new ResponsesController(mockSurveyResponseService.Object); var result = (OkObjectResult)await surveyResponseController.DeleteSurveyResponseAsync(1); Assert.Equal(200, result.StatusCode); } @@ -232,7 +231,7 @@ namespace DamageAssesment.SurveyResponses.Test { var mockResponse = await MockData.getResponse(); mockSurveyResponseService.Setup(service => service.DeleteSurveyResponseAsync(1)).ReturnsAsync(mockResponse); ; - var surveyResponseController = new SurveyResponsesController(mockSurveyResponseService.Object); + var surveyResponseController = new ResponsesController(mockSurveyResponseService.Object); var result = (NotFoundResult)await surveyResponseController.DeleteSurveyResponseAsync(1); Assert.Equal(404, result.StatusCode); } diff --git a/DamageAssesmentApi/DamageAssesment.sln b/DamageAssesmentApi/DamageAssesment.sln index 7efdefc..e3f518b 100644 --- a/DamageAssesmentApi/DamageAssesment.sln +++ b/DamageAssesmentApi/DamageAssesment.sln @@ -80,6 +80,7 @@ Global {ADFB79E3-83C9-454F-A070-49D167BD28CC}.Release|Any CPU.ActiveCfg = Release|Any CPU {ADFB79E3-83C9-454F-A070-49D167BD28CC}.Release|Any CPU.Build.0 = Release|Any CPU {6F4B9C9D-CE5D-421A-876F-57D0FEDF8049}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6F4B9C9D-CE5D-421A-876F-57D0FEDF8049}.Debug|Any CPU.Build.0 = Debug|Any CPU {6F4B9C9D-CE5D-421A-876F-57D0FEDF8049}.Release|Any CPU.ActiveCfg = Release|Any CPU {6F4B9C9D-CE5D-421A-876F-57D0FEDF8049}.Release|Any CPU.Build.0 = Release|Any CPU {730E5718-FCE1-42C0-AB76-EA020896A788}.Debug|Any CPU.ActiveCfg = Debug|Any CPU From 15acd00959fba9f7f8caad3fb411e3eb0024108f Mon Sep 17 00:00:00 2001 From: Reginald CHERENFANT JASMIN Date: Tue, 26 Sep 2023 15:38:59 -0500 Subject: [PATCH 5/7] Project Folder Name changed from SurveyResponses to Responses --- .../Controllers/ResponsesController.cs | 0 .../DamageAssesment.Api.Responses.csproj | 0 .../Db/SurveyResponse.cs | 0 .../Db/SurveyResponseDbContext.cs | 0 .../Interfaces/IAnswerServiceProvider.cs | 0 .../Interfaces/IAttachmentServiceProvider.cs | 0 .../Interfaces/IEmployeeServiceProvider.cs | 0 .../Interfaces/IHttpUtil.cs | 0 .../Interfaces/ILocationServiceProvider.cs | 0 .../Interfaces/IQuestionServiceProvider.cs | 0 .../Interfaces/IRegionServiceProvider.cs | 0 .../Interfaces/ISurveyServiceProvider.cs | 0 .../Interfaces/ISurveysResponse.cs | 0 .../Models/Answer.cs | 0 .../Models/AnswerRequest.cs | 0 .../Models/Attachment.cs | 0 .../Models/AttachmentInfo.cs | 0 .../Models/Employee.cs | 0 .../Models/Location.cs | 0 .../Models/Question.cs | 0 .../Models/Region.cs | 0 .../Models/Request.cs | 0 .../Models/Survey.cs | 0 .../Models/SurveyQuestion.cs | 0 .../Models/SurveyResponse.cs | 0 .../Models/SurveyTranslation.cs | 0 .../Profiles/SurveyResponsesProvider.cs | 0 .../Program.cs | 0 .../Properties/launchSettings.json | 0 .../Providers/SurveyResponsesProvider.cs | 0 .../Services/AnswerServiceProvider.cs | 0 .../Services/AttachmentServiceProvider.cs | 0 .../Services/EmployeeServiceProvider.cs | 0 .../Services/HttpUtil.cs | 0 .../Services/LocationServiceProvider.cs | 0 .../Services/QuestionServiceProvider.cs | 0 .../Services/RegionServiceProvider.cs | 0 .../Services/ServiceProviderBase.cs | 0 .../Services/SurveyServiceProvider.cs | 0 .../appsettings.Development.json | 0 .../appsettings.Production.json | 0 .../appsettings.Test.json | 0 .../appsettings.json | 0 .../DamageAssesment.Api.Responses.Test.csproj | 2 +- .../MockData.cs | 0 .../ResponsesServiceTest.cs | 0 DamageAssesmentApi/DamageAssesment.sln | 4 ++-- 47 files changed, 3 insertions(+), 3 deletions(-) rename DamageAssesmentApi/{DamageAssesment.Api.SurveyResponses => DamageAssesment.Api.Responses}/Controllers/ResponsesController.cs (100%) rename DamageAssesmentApi/{DamageAssesment.Api.SurveyResponses => DamageAssesment.Api.Responses}/DamageAssesment.Api.Responses.csproj (100%) rename DamageAssesmentApi/{DamageAssesment.Api.SurveyResponses => DamageAssesment.Api.Responses}/Db/SurveyResponse.cs (100%) rename DamageAssesmentApi/{DamageAssesment.Api.SurveyResponses => DamageAssesment.Api.Responses}/Db/SurveyResponseDbContext.cs (100%) rename DamageAssesmentApi/{DamageAssesment.Api.SurveyResponses => DamageAssesment.Api.Responses}/Interfaces/IAnswerServiceProvider.cs (100%) rename DamageAssesmentApi/{DamageAssesment.Api.SurveyResponses => DamageAssesment.Api.Responses}/Interfaces/IAttachmentServiceProvider.cs (100%) rename DamageAssesmentApi/{DamageAssesment.Api.SurveyResponses => DamageAssesment.Api.Responses}/Interfaces/IEmployeeServiceProvider.cs (100%) rename DamageAssesmentApi/{DamageAssesment.Api.SurveyResponses => DamageAssesment.Api.Responses}/Interfaces/IHttpUtil.cs (100%) rename DamageAssesmentApi/{DamageAssesment.Api.SurveyResponses => DamageAssesment.Api.Responses}/Interfaces/ILocationServiceProvider.cs (100%) rename DamageAssesmentApi/{DamageAssesment.Api.SurveyResponses => DamageAssesment.Api.Responses}/Interfaces/IQuestionServiceProvider.cs (100%) rename DamageAssesmentApi/{DamageAssesment.Api.SurveyResponses => DamageAssesment.Api.Responses}/Interfaces/IRegionServiceProvider.cs (100%) rename DamageAssesmentApi/{DamageAssesment.Api.SurveyResponses => DamageAssesment.Api.Responses}/Interfaces/ISurveyServiceProvider.cs (100%) rename DamageAssesmentApi/{DamageAssesment.Api.SurveyResponses => DamageAssesment.Api.Responses}/Interfaces/ISurveysResponse.cs (100%) rename DamageAssesmentApi/{DamageAssesment.Api.SurveyResponses => DamageAssesment.Api.Responses}/Models/Answer.cs (100%) rename DamageAssesmentApi/{DamageAssesment.Api.SurveyResponses => DamageAssesment.Api.Responses}/Models/AnswerRequest.cs (100%) rename DamageAssesmentApi/{DamageAssesment.Api.SurveyResponses => DamageAssesment.Api.Responses}/Models/Attachment.cs (100%) rename DamageAssesmentApi/{DamageAssesment.Api.SurveyResponses => DamageAssesment.Api.Responses}/Models/AttachmentInfo.cs (100%) rename DamageAssesmentApi/{DamageAssesment.Api.SurveyResponses => DamageAssesment.Api.Responses}/Models/Employee.cs (100%) rename DamageAssesmentApi/{DamageAssesment.Api.SurveyResponses => DamageAssesment.Api.Responses}/Models/Location.cs (100%) rename DamageAssesmentApi/{DamageAssesment.Api.SurveyResponses => DamageAssesment.Api.Responses}/Models/Question.cs (100%) rename DamageAssesmentApi/{DamageAssesment.Api.SurveyResponses => DamageAssesment.Api.Responses}/Models/Region.cs (100%) rename DamageAssesmentApi/{DamageAssesment.Api.SurveyResponses => DamageAssesment.Api.Responses}/Models/Request.cs (100%) rename DamageAssesmentApi/{DamageAssesment.Api.SurveyResponses => DamageAssesment.Api.Responses}/Models/Survey.cs (100%) rename DamageAssesmentApi/{DamageAssesment.Api.SurveyResponses => DamageAssesment.Api.Responses}/Models/SurveyQuestion.cs (100%) rename DamageAssesmentApi/{DamageAssesment.Api.SurveyResponses => DamageAssesment.Api.Responses}/Models/SurveyResponse.cs (100%) rename DamageAssesmentApi/{DamageAssesment.Api.SurveyResponses => DamageAssesment.Api.Responses}/Models/SurveyTranslation.cs (100%) rename DamageAssesmentApi/{DamageAssesment.Api.SurveyResponses => DamageAssesment.Api.Responses}/Profiles/SurveyResponsesProvider.cs (100%) rename DamageAssesmentApi/{DamageAssesment.Api.SurveyResponses => DamageAssesment.Api.Responses}/Program.cs (100%) rename DamageAssesmentApi/{DamageAssesment.Api.SurveyResponses => DamageAssesment.Api.Responses}/Properties/launchSettings.json (100%) rename DamageAssesmentApi/{DamageAssesment.Api.SurveyResponses => DamageAssesment.Api.Responses}/Providers/SurveyResponsesProvider.cs (100%) rename DamageAssesmentApi/{DamageAssesment.Api.SurveyResponses => DamageAssesment.Api.Responses}/Services/AnswerServiceProvider.cs (100%) rename DamageAssesmentApi/{DamageAssesment.Api.SurveyResponses => DamageAssesment.Api.Responses}/Services/AttachmentServiceProvider.cs (100%) rename DamageAssesmentApi/{DamageAssesment.Api.SurveyResponses => DamageAssesment.Api.Responses}/Services/EmployeeServiceProvider.cs (100%) rename DamageAssesmentApi/{DamageAssesment.Api.SurveyResponses => DamageAssesment.Api.Responses}/Services/HttpUtil.cs (100%) rename DamageAssesmentApi/{DamageAssesment.Api.SurveyResponses => DamageAssesment.Api.Responses}/Services/LocationServiceProvider.cs (100%) rename DamageAssesmentApi/{DamageAssesment.Api.SurveyResponses => DamageAssesment.Api.Responses}/Services/QuestionServiceProvider.cs (100%) rename DamageAssesmentApi/{DamageAssesment.Api.SurveyResponses => DamageAssesment.Api.Responses}/Services/RegionServiceProvider.cs (100%) rename DamageAssesmentApi/{DamageAssesment.Api.SurveyResponses => DamageAssesment.Api.Responses}/Services/ServiceProviderBase.cs (100%) rename DamageAssesmentApi/{DamageAssesment.Api.SurveyResponses => DamageAssesment.Api.Responses}/Services/SurveyServiceProvider.cs (100%) rename DamageAssesmentApi/{DamageAssesment.Api.SurveyResponses => DamageAssesment.Api.Responses}/appsettings.Development.json (100%) rename DamageAssesmentApi/{DamageAssesment.Api.SurveyResponses => DamageAssesment.Api.Responses}/appsettings.Production.json (100%) rename DamageAssesmentApi/{DamageAssesment.Api.SurveyResponses => DamageAssesment.Api.Responses}/appsettings.Test.json (100%) rename DamageAssesmentApi/{DamageAssesment.Api.SurveyResponses => DamageAssesment.Api.Responses}/appsettings.json (100%) rename DamageAssesmentApi/{DamageAssesment.SurveyResponses.Test => DamageAssesment.Responses.Test}/DamageAssesment.Api.Responses.Test.csproj (90%) rename DamageAssesmentApi/{DamageAssesment.SurveyResponses.Test => DamageAssesment.Responses.Test}/MockData.cs (100%) rename DamageAssesmentApi/{DamageAssesment.SurveyResponses.Test => DamageAssesment.Responses.Test}/ResponsesServiceTest.cs (100%) diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Controllers/ResponsesController.cs b/DamageAssesmentApi/DamageAssesment.Api.Responses/Controllers/ResponsesController.cs similarity index 100% rename from DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Controllers/ResponsesController.cs rename to DamageAssesmentApi/DamageAssesment.Api.Responses/Controllers/ResponsesController.cs diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/DamageAssesment.Api.Responses.csproj b/DamageAssesmentApi/DamageAssesment.Api.Responses/DamageAssesment.Api.Responses.csproj similarity index 100% rename from DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/DamageAssesment.Api.Responses.csproj rename to DamageAssesmentApi/DamageAssesment.Api.Responses/DamageAssesment.Api.Responses.csproj diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Db/SurveyResponse.cs b/DamageAssesmentApi/DamageAssesment.Api.Responses/Db/SurveyResponse.cs similarity index 100% rename from DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Db/SurveyResponse.cs rename to DamageAssesmentApi/DamageAssesment.Api.Responses/Db/SurveyResponse.cs diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Db/SurveyResponseDbContext.cs b/DamageAssesmentApi/DamageAssesment.Api.Responses/Db/SurveyResponseDbContext.cs similarity index 100% rename from DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Db/SurveyResponseDbContext.cs rename to DamageAssesmentApi/DamageAssesment.Api.Responses/Db/SurveyResponseDbContext.cs diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/IAnswerServiceProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.Responses/Interfaces/IAnswerServiceProvider.cs similarity index 100% rename from DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/IAnswerServiceProvider.cs rename to DamageAssesmentApi/DamageAssesment.Api.Responses/Interfaces/IAnswerServiceProvider.cs diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/IAttachmentServiceProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.Responses/Interfaces/IAttachmentServiceProvider.cs similarity index 100% rename from DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/IAttachmentServiceProvider.cs rename to DamageAssesmentApi/DamageAssesment.Api.Responses/Interfaces/IAttachmentServiceProvider.cs diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/IEmployeeServiceProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.Responses/Interfaces/IEmployeeServiceProvider.cs similarity index 100% rename from DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/IEmployeeServiceProvider.cs rename to DamageAssesmentApi/DamageAssesment.Api.Responses/Interfaces/IEmployeeServiceProvider.cs diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/IHttpUtil.cs b/DamageAssesmentApi/DamageAssesment.Api.Responses/Interfaces/IHttpUtil.cs similarity index 100% rename from DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/IHttpUtil.cs rename to DamageAssesmentApi/DamageAssesment.Api.Responses/Interfaces/IHttpUtil.cs diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/ILocationServiceProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.Responses/Interfaces/ILocationServiceProvider.cs similarity index 100% rename from DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/ILocationServiceProvider.cs rename to DamageAssesmentApi/DamageAssesment.Api.Responses/Interfaces/ILocationServiceProvider.cs diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/IQuestionServiceProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.Responses/Interfaces/IQuestionServiceProvider.cs similarity index 100% rename from DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/IQuestionServiceProvider.cs rename to DamageAssesmentApi/DamageAssesment.Api.Responses/Interfaces/IQuestionServiceProvider.cs diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/IRegionServiceProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.Responses/Interfaces/IRegionServiceProvider.cs similarity index 100% rename from DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/IRegionServiceProvider.cs rename to DamageAssesmentApi/DamageAssesment.Api.Responses/Interfaces/IRegionServiceProvider.cs diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/ISurveyServiceProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.Responses/Interfaces/ISurveyServiceProvider.cs similarity index 100% rename from DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/ISurveyServiceProvider.cs rename to DamageAssesmentApi/DamageAssesment.Api.Responses/Interfaces/ISurveyServiceProvider.cs diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/ISurveysResponse.cs b/DamageAssesmentApi/DamageAssesment.Api.Responses/Interfaces/ISurveysResponse.cs similarity index 100% rename from DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Interfaces/ISurveysResponse.cs rename to DamageAssesmentApi/DamageAssesment.Api.Responses/Interfaces/ISurveysResponse.cs diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/Answer.cs b/DamageAssesmentApi/DamageAssesment.Api.Responses/Models/Answer.cs similarity index 100% rename from DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/Answer.cs rename to DamageAssesmentApi/DamageAssesment.Api.Responses/Models/Answer.cs diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/AnswerRequest.cs b/DamageAssesmentApi/DamageAssesment.Api.Responses/Models/AnswerRequest.cs similarity index 100% rename from DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/AnswerRequest.cs rename to DamageAssesmentApi/DamageAssesment.Api.Responses/Models/AnswerRequest.cs diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/Attachment.cs b/DamageAssesmentApi/DamageAssesment.Api.Responses/Models/Attachment.cs similarity index 100% rename from DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/Attachment.cs rename to DamageAssesmentApi/DamageAssesment.Api.Responses/Models/Attachment.cs diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/AttachmentInfo.cs b/DamageAssesmentApi/DamageAssesment.Api.Responses/Models/AttachmentInfo.cs similarity index 100% rename from DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/AttachmentInfo.cs rename to DamageAssesmentApi/DamageAssesment.Api.Responses/Models/AttachmentInfo.cs diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/Employee.cs b/DamageAssesmentApi/DamageAssesment.Api.Responses/Models/Employee.cs similarity index 100% rename from DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/Employee.cs rename to DamageAssesmentApi/DamageAssesment.Api.Responses/Models/Employee.cs diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/Location.cs b/DamageAssesmentApi/DamageAssesment.Api.Responses/Models/Location.cs similarity index 100% rename from DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/Location.cs rename to DamageAssesmentApi/DamageAssesment.Api.Responses/Models/Location.cs diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/Question.cs b/DamageAssesmentApi/DamageAssesment.Api.Responses/Models/Question.cs similarity index 100% rename from DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/Question.cs rename to DamageAssesmentApi/DamageAssesment.Api.Responses/Models/Question.cs diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/Region.cs b/DamageAssesmentApi/DamageAssesment.Api.Responses/Models/Region.cs similarity index 100% rename from DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/Region.cs rename to DamageAssesmentApi/DamageAssesment.Api.Responses/Models/Region.cs diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/Request.cs b/DamageAssesmentApi/DamageAssesment.Api.Responses/Models/Request.cs similarity index 100% rename from DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/Request.cs rename to DamageAssesmentApi/DamageAssesment.Api.Responses/Models/Request.cs diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/Survey.cs b/DamageAssesmentApi/DamageAssesment.Api.Responses/Models/Survey.cs similarity index 100% rename from DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/Survey.cs rename to DamageAssesmentApi/DamageAssesment.Api.Responses/Models/Survey.cs diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/SurveyQuestion.cs b/DamageAssesmentApi/DamageAssesment.Api.Responses/Models/SurveyQuestion.cs similarity index 100% rename from DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/SurveyQuestion.cs rename to DamageAssesmentApi/DamageAssesment.Api.Responses/Models/SurveyQuestion.cs diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/SurveyResponse.cs b/DamageAssesmentApi/DamageAssesment.Api.Responses/Models/SurveyResponse.cs similarity index 100% rename from DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/SurveyResponse.cs rename to DamageAssesmentApi/DamageAssesment.Api.Responses/Models/SurveyResponse.cs diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/SurveyTranslation.cs b/DamageAssesmentApi/DamageAssesment.Api.Responses/Models/SurveyTranslation.cs similarity index 100% rename from DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Models/SurveyTranslation.cs rename to DamageAssesmentApi/DamageAssesment.Api.Responses/Models/SurveyTranslation.cs diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Profiles/SurveyResponsesProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.Responses/Profiles/SurveyResponsesProvider.cs similarity index 100% rename from DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Profiles/SurveyResponsesProvider.cs rename to DamageAssesmentApi/DamageAssesment.Api.Responses/Profiles/SurveyResponsesProvider.cs diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Program.cs b/DamageAssesmentApi/DamageAssesment.Api.Responses/Program.cs similarity index 100% rename from DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Program.cs rename to DamageAssesmentApi/DamageAssesment.Api.Responses/Program.cs diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Properties/launchSettings.json b/DamageAssesmentApi/DamageAssesment.Api.Responses/Properties/launchSettings.json similarity index 100% rename from DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Properties/launchSettings.json rename to DamageAssesmentApi/DamageAssesment.Api.Responses/Properties/launchSettings.json diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Providers/SurveyResponsesProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.Responses/Providers/SurveyResponsesProvider.cs similarity index 100% rename from DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Providers/SurveyResponsesProvider.cs rename to DamageAssesmentApi/DamageAssesment.Api.Responses/Providers/SurveyResponsesProvider.cs diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/AnswerServiceProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.Responses/Services/AnswerServiceProvider.cs similarity index 100% rename from DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/AnswerServiceProvider.cs rename to DamageAssesmentApi/DamageAssesment.Api.Responses/Services/AnswerServiceProvider.cs diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/AttachmentServiceProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.Responses/Services/AttachmentServiceProvider.cs similarity index 100% rename from DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/AttachmentServiceProvider.cs rename to DamageAssesmentApi/DamageAssesment.Api.Responses/Services/AttachmentServiceProvider.cs diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/EmployeeServiceProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.Responses/Services/EmployeeServiceProvider.cs similarity index 100% rename from DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/EmployeeServiceProvider.cs rename to DamageAssesmentApi/DamageAssesment.Api.Responses/Services/EmployeeServiceProvider.cs diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/HttpUtil.cs b/DamageAssesmentApi/DamageAssesment.Api.Responses/Services/HttpUtil.cs similarity index 100% rename from DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/HttpUtil.cs rename to DamageAssesmentApi/DamageAssesment.Api.Responses/Services/HttpUtil.cs diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/LocationServiceProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.Responses/Services/LocationServiceProvider.cs similarity index 100% rename from DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/LocationServiceProvider.cs rename to DamageAssesmentApi/DamageAssesment.Api.Responses/Services/LocationServiceProvider.cs diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/QuestionServiceProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.Responses/Services/QuestionServiceProvider.cs similarity index 100% rename from DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/QuestionServiceProvider.cs rename to DamageAssesmentApi/DamageAssesment.Api.Responses/Services/QuestionServiceProvider.cs diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/RegionServiceProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.Responses/Services/RegionServiceProvider.cs similarity index 100% rename from DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/RegionServiceProvider.cs rename to DamageAssesmentApi/DamageAssesment.Api.Responses/Services/RegionServiceProvider.cs diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/ServiceProviderBase.cs b/DamageAssesmentApi/DamageAssesment.Api.Responses/Services/ServiceProviderBase.cs similarity index 100% rename from DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/ServiceProviderBase.cs rename to DamageAssesmentApi/DamageAssesment.Api.Responses/Services/ServiceProviderBase.cs diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/SurveyServiceProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.Responses/Services/SurveyServiceProvider.cs similarity index 100% rename from DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Services/SurveyServiceProvider.cs rename to DamageAssesmentApi/DamageAssesment.Api.Responses/Services/SurveyServiceProvider.cs diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/appsettings.Development.json b/DamageAssesmentApi/DamageAssesment.Api.Responses/appsettings.Development.json similarity index 100% rename from DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/appsettings.Development.json rename to DamageAssesmentApi/DamageAssesment.Api.Responses/appsettings.Development.json diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/appsettings.Production.json b/DamageAssesmentApi/DamageAssesment.Api.Responses/appsettings.Production.json similarity index 100% rename from DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/appsettings.Production.json rename to DamageAssesmentApi/DamageAssesment.Api.Responses/appsettings.Production.json diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/appsettings.Test.json b/DamageAssesmentApi/DamageAssesment.Api.Responses/appsettings.Test.json similarity index 100% rename from DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/appsettings.Test.json rename to DamageAssesmentApi/DamageAssesment.Api.Responses/appsettings.Test.json diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/appsettings.json b/DamageAssesmentApi/DamageAssesment.Api.Responses/appsettings.json similarity index 100% rename from DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/appsettings.json rename to DamageAssesmentApi/DamageAssesment.Api.Responses/appsettings.json diff --git a/DamageAssesmentApi/DamageAssesment.SurveyResponses.Test/DamageAssesment.Api.Responses.Test.csproj b/DamageAssesmentApi/DamageAssesment.Responses.Test/DamageAssesment.Api.Responses.Test.csproj similarity index 90% rename from DamageAssesmentApi/DamageAssesment.SurveyResponses.Test/DamageAssesment.Api.Responses.Test.csproj rename to DamageAssesmentApi/DamageAssesment.Responses.Test/DamageAssesment.Api.Responses.Test.csproj index 03b9b5c..5190942 100644 --- a/DamageAssesmentApi/DamageAssesment.SurveyResponses.Test/DamageAssesment.Api.Responses.Test.csproj +++ b/DamageAssesmentApi/DamageAssesment.Responses.Test/DamageAssesment.Api.Responses.Test.csproj @@ -24,7 +24,7 @@ - + diff --git a/DamageAssesmentApi/DamageAssesment.SurveyResponses.Test/MockData.cs b/DamageAssesmentApi/DamageAssesment.Responses.Test/MockData.cs similarity index 100% rename from DamageAssesmentApi/DamageAssesment.SurveyResponses.Test/MockData.cs rename to DamageAssesmentApi/DamageAssesment.Responses.Test/MockData.cs diff --git a/DamageAssesmentApi/DamageAssesment.SurveyResponses.Test/ResponsesServiceTest.cs b/DamageAssesmentApi/DamageAssesment.Responses.Test/ResponsesServiceTest.cs similarity index 100% rename from DamageAssesmentApi/DamageAssesment.SurveyResponses.Test/ResponsesServiceTest.cs rename to DamageAssesmentApi/DamageAssesment.Responses.Test/ResponsesServiceTest.cs diff --git a/DamageAssesmentApi/DamageAssesment.sln b/DamageAssesmentApi/DamageAssesment.sln index e3f518b..e154ef7 100644 --- a/DamageAssesmentApi/DamageAssesment.sln +++ b/DamageAssesmentApi/DamageAssesment.sln @@ -17,13 +17,13 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DamageAssesment.Api.Locations", "DamageAssesment.Api.Locations\DamageAssesment.Api.Locations.csproj", "{746C67BF-9949-4361-B5D2-358C7607750E}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DamageAssesment.Api.Responses", "DamageAssesment.Api.SurveyResponses\DamageAssesment.Api.Responses.csproj", "{D11808FE-AD1C-4BA6-87FD-9D18B2DC81F2}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DamageAssesment.Api.Responses", "DamageAssesment.Api.Responses\DamageAssesment.Api.Responses.csproj", "{D11808FE-AD1C-4BA6-87FD-9D18B2DC81F2}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DamageAssesment.Api.Questions.Test", "DamageAssesment.Api.QuestionsTest\DamageAssesment.Api.Questions.Test.csproj", "{35CD9231-034D-4999-BCFC-1786DD007ED2}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DamageAssesment.Api.Surveys.Test", "DamageAssesment.Api.Surveys.Test\DamageAssesment.Api.Surveys.Test.csproj", "{ADFB79E3-83C9-454F-A070-49D167BD28CC}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DamageAssesment.Api.Responses.Test", "DamageAssesment.SurveyResponses.Test\DamageAssesment.Api.Responses.Test.csproj", "{6F4B9C9D-CE5D-421A-876F-57D0FEDF8049}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DamageAssesment.Api.Responses.Test", "DamageAssesment.Responses.Test\DamageAssesment.Api.Responses.Test.csproj", "{6F4B9C9D-CE5D-421A-876F-57D0FEDF8049}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DamageAssesment.Api.Attachments.Test", "DamageAssesment.Api.Attachments.Test\DamageAssesment.Api.Attachments.Test.csproj", "{730E5718-FCE1-42C0-AB76-EA020896A788}" EndProject From 4eb8f84d5ba9d01c4eec8d6ad550bc68d5ca5154 Mon Sep 17 00:00:00 2001 From: uppuv Date: Wed, 27 Sep 2023 17:18:48 -0400 Subject: [PATCH 6/7] Azure Migrations --- .../20230927172606_InitialAnswer.Designer.cs} | 31 ++++---- .../20230927172606_InitialAnswer.cs} | 4 +- ...0927173358_InitialAnswercreate.Designer.cs | 58 +++++++++++++++ .../20230927173358_InitialAnswercreate.cs | 22 ++++++ .../Providers/AnswerProvider.cs | 2 +- .../appsettings.json | 6 +- .../appsettings.json | 6 +- .../Providers/DoculinkProvider.cs | 2 +- .../appsettings.json | 6 +- ...20230817213656_InitialEmployee.Designer.cs | 64 ----------------- .../20230913164315_employeeupdate.cs | 48 ------------- ...30913170055_updatedemployee_id.Designer.cs | 72 ------------------- ...20230927210957_AzureEmployees.Designer.cs} | 4 +- ...ee.cs => 20230927210957_AzureEmployees.cs} | 6 +- .../appsettings.json | 6 +- ...20230927211146_AzureLocations.Designer.cs} | 30 +++++--- ...on.cs => 20230927211146_AzureLocations.cs} | 15 ++-- .../LocationDbContextModelSnapshot.cs | 26 ++++--- .../appsettings.json | 6 +- ...20230927211340_AzureQuestions.Designer.cs} | 36 +++++++--- ...on.cs => 20230927211340_AzureQuestions.cs} | 25 +++++-- .../QuestionDbContextModelSnapshot.cs | 32 +++++++-- .../Providers/QuestionsProvider.cs | 2 +- .../appsettings.json | 6 +- ...927211458_AzureSurveyResponses.Designer.cs | 70 ++++++++++++++++++ ...=> 20230927211458_AzureSurveyResponses.cs} | 16 +++-- .../SurveyResponseDbContextModelSnapshot.cs | 33 ++++++--- .../appsettings.json | 6 +- ...> 20230927211618_AzureSurveys.Designer.cs} | 43 ++++++++--- ...rvey.cs => 20230927211618_AzureSurveys.cs} | 28 ++++++-- .../SurveysDbContextModelSnapshot.cs | 39 +++++++--- .../appsettings.json | 6 +- 32 files changed, 460 insertions(+), 296 deletions(-) rename DamageAssesmentApi/{DamageAssesment.Api.SurveyResponses/Migrations/20230817221348_InitialSurveyResponse.Designer.cs => DamageAssesment.Api.Answers/Migrations/20230927172606_InitialAnswer.Designer.cs} (60%) rename DamageAssesmentApi/{DamageAssesment.Api.Employees/Migrations/20230913170055_updatedemployee_id.cs => DamageAssesment.Api.Answers/Migrations/20230927172606_InitialAnswer.cs} (76%) create mode 100644 DamageAssesmentApi/DamageAssesment.Api.Answers/Migrations/20230927173358_InitialAnswercreate.Designer.cs create mode 100644 DamageAssesmentApi/DamageAssesment.Api.Answers/Migrations/20230927173358_InitialAnswercreate.cs delete mode 100644 DamageAssesmentApi/DamageAssesment.Api.Employees/Migrations/20230817213656_InitialEmployee.Designer.cs delete mode 100644 DamageAssesmentApi/DamageAssesment.Api.Employees/Migrations/20230913164315_employeeupdate.cs delete mode 100644 DamageAssesmentApi/DamageAssesment.Api.Employees/Migrations/20230913170055_updatedemployee_id.Designer.cs rename DamageAssesmentApi/DamageAssesment.Api.Employees/Migrations/{20230913164315_employeeupdate.Designer.cs => 20230927210957_AzureEmployees.Designer.cs} (96%) rename DamageAssesmentApi/DamageAssesment.Api.Employees/Migrations/{20230817213656_InitialEmployee.cs => 20230927210957_AzureEmployees.cs} (81%) rename DamageAssesmentApi/DamageAssesment.Api.Locations/Migrations/{20230817214454_InitialLocation.Designer.cs => 20230927211146_AzureLocations.Designer.cs} (73%) rename DamageAssesmentApi/DamageAssesment.Api.Locations/Migrations/{20230817214454_InitialLocation.cs => 20230927211146_AzureLocations.cs} (71%) rename DamageAssesmentApi/DamageAssesment.Api.Questions/Migrations/{20230817215744_InitialQuestion.Designer.cs => 20230927211340_AzureQuestions.Designer.cs} (83%) rename DamageAssesmentApi/DamageAssesment.Api.Questions/Migrations/{20230817215744_InitialQuestion.cs => 20230927211340_AzureQuestions.cs} (79%) create mode 100644 DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Migrations/20230927211458_AzureSurveyResponses.Designer.cs rename DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Migrations/{20230817221348_InitialSurveyResponse.cs => 20230927211458_AzureSurveyResponses.cs} (51%) rename DamageAssesmentApi/DamageAssesment.Api.Surveys/Migrations/{20230817220614_InitialSurvey.Designer.cs => 20230927211618_AzureSurveys.Designer.cs} (57%) rename DamageAssesmentApi/DamageAssesment.Api.Surveys/Migrations/{20230817220614_InitialSurvey.cs => 20230927211618_AzureSurveys.cs} (53%) diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Migrations/20230817221348_InitialSurveyResponse.Designer.cs b/DamageAssesmentApi/DamageAssesment.Api.Answers/Migrations/20230927172606_InitialAnswer.Designer.cs similarity index 60% rename from DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Migrations/20230817221348_InitialSurveyResponse.Designer.cs rename to DamageAssesmentApi/DamageAssesment.Api.Answers/Migrations/20230927172606_InitialAnswer.Designer.cs index edec629..f66d69b 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Migrations/20230817221348_InitialSurveyResponse.Designer.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.Answers/Migrations/20230927172606_InitialAnswer.Designer.cs @@ -1,5 +1,6 @@ // -using DamageAssesment.Api.SurveyResponses.Db; +using System; +using DamageAssesment.Api.Answers.Db; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Metadata; @@ -8,11 +9,11 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion; #nullable disable -namespace DamageAssesment.Api.SurveyResponses.Migrations +namespace DamageAssesment.Api.Answers.Migrations { - [DbContext(typeof(SurveyResponseDbContext))] - [Migration("20230817221348_InitialSurveyResponse")] - partial class InitialSurveyResponse + [DbContext(typeof(AnswerDbContext))] + [Migration("20230927172606_InitialAnswer")] + partial class InitialAnswer { /// protected override void BuildTargetModel(ModelBuilder modelBuilder) @@ -24,7 +25,7 @@ namespace DamageAssesment.Api.SurveyResponses.Migrations SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); - modelBuilder.Entity("DamageAssesment.Api.SurveyResponses.Db.SurveyResponse", b => + modelBuilder.Entity("DamageAssesment.Api.Answers.Db.Answer", b => { b.Property("Id") .ValueGeneratedOnAdd() @@ -32,22 +33,24 @@ namespace DamageAssesment.Api.SurveyResponses.Migrations SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - b.Property("EmployeeId") + b.Property("AnswerText") .IsRequired() - .HasMaxLength(6) - .HasColumnType("nvarchar(6)"); + .HasMaxLength(250) + .HasColumnType("nvarchar(250)"); - b.Property("LocationId") + b.Property("Comment") .IsRequired() - .HasMaxLength(4) - .HasColumnType("nvarchar(4)"); + .HasColumnType("nvarchar(max)"); - b.Property("SurveyId") + b.Property("QuestionId") + .HasColumnType("int"); + + b.Property("SurveyResponseId") .HasColumnType("int"); b.HasKey("Id"); - b.ToTable("SurveyResponses"); + b.ToTable("Answers"); }); #pragma warning restore 612, 618 } diff --git a/DamageAssesmentApi/DamageAssesment.Api.Employees/Migrations/20230913170055_updatedemployee_id.cs b/DamageAssesmentApi/DamageAssesment.Api.Answers/Migrations/20230927172606_InitialAnswer.cs similarity index 76% rename from DamageAssesmentApi/DamageAssesment.Api.Employees/Migrations/20230913170055_updatedemployee_id.cs rename to DamageAssesmentApi/DamageAssesment.Api.Answers/Migrations/20230927172606_InitialAnswer.cs index 8b004ed..67c56f7 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Employees/Migrations/20230913170055_updatedemployee_id.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.Answers/Migrations/20230927172606_InitialAnswer.cs @@ -2,10 +2,10 @@ #nullable disable -namespace DamageAssesment.Api.Employees.Migrations +namespace DamageAssesment.Api.Answers.Migrations { /// - public partial class updatedemployee_id : Migration + public partial class InitialAnswer : Migration { /// protected override void Up(MigrationBuilder migrationBuilder) diff --git a/DamageAssesmentApi/DamageAssesment.Api.Answers/Migrations/20230927173358_InitialAnswercreate.Designer.cs b/DamageAssesmentApi/DamageAssesment.Api.Answers/Migrations/20230927173358_InitialAnswercreate.Designer.cs new file mode 100644 index 0000000..0a8c5ce --- /dev/null +++ b/DamageAssesmentApi/DamageAssesment.Api.Answers/Migrations/20230927173358_InitialAnswercreate.Designer.cs @@ -0,0 +1,58 @@ +// +using System; +using DamageAssesment.Api.Answers.Db; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace DamageAssesment.Api.Answers.Migrations +{ + [DbContext(typeof(AnswerDbContext))] + [Migration("20230927173358_InitialAnswercreate")] + partial class InitialAnswercreate + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "7.0.9") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("DamageAssesment.Api.Answers.Db.Answer", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("AnswerText") + .IsRequired() + .HasMaxLength(250) + .HasColumnType("nvarchar(250)"); + + b.Property("Comment") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("QuestionId") + .HasColumnType("int"); + + b.Property("SurveyResponseId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("Answers"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/DamageAssesmentApi/DamageAssesment.Api.Answers/Migrations/20230927173358_InitialAnswercreate.cs b/DamageAssesmentApi/DamageAssesment.Api.Answers/Migrations/20230927173358_InitialAnswercreate.cs new file mode 100644 index 0000000..3b42551 --- /dev/null +++ b/DamageAssesmentApi/DamageAssesment.Api.Answers/Migrations/20230927173358_InitialAnswercreate.cs @@ -0,0 +1,22 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace DamageAssesment.Api.Answers.Migrations +{ + /// + public partial class InitialAnswercreate : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + + } + } +} diff --git a/DamageAssesmentApi/DamageAssesment.Api.Answers/Providers/AnswerProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.Answers/Providers/AnswerProvider.cs index 812f66e..291726f 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Answers/Providers/AnswerProvider.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.Answers/Providers/AnswerProvider.cs @@ -18,7 +18,7 @@ namespace DamageAssesment.Api.Answers.Providers this.answerDbContext = answerDbContext; this.logger = logger; this.mapper = mapper; - //SeedData(); + SeedData(); } public async Task<(bool IsSuccess, IEnumerable Answers, string ErrorMessage)> GetAnswersAsync() diff --git a/DamageAssesmentApi/DamageAssesment.Api.Answers/appsettings.json b/DamageAssesmentApi/DamageAssesment.Api.Answers/appsettings.json index 1cd2bcb..23b0a8f 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Answers/appsettings.json +++ b/DamageAssesmentApi/DamageAssesment.Api.Answers/appsettings.json @@ -9,7 +9,11 @@ } }, "AllowedHosts": "*", + //"ConnectionStrings": { + // "AnswerConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;" + //}, "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;" + } } diff --git a/DamageAssesmentApi/DamageAssesment.Api.Attachments/appsettings.json b/DamageAssesmentApi/DamageAssesment.Api.Attachments/appsettings.json index 1b48365..29a4c79 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Attachments/appsettings.json +++ b/DamageAssesmentApi/DamageAssesment.Api.Attachments/appsettings.json @@ -13,7 +13,11 @@ "folderpath": "DMS_Attachments/Active", "Deletepath": "DMS_Attachments/Deleted" }, + //"ConnectionStrings": { + // "AttachmentConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;" + //} "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;" + } } diff --git a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Providers/DoculinkProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Providers/DoculinkProvider.cs index cf8bcfe..1a77ecf 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Providers/DoculinkProvider.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Providers/DoculinkProvider.cs @@ -27,7 +27,7 @@ namespace DamageAssesment.Api.DocuLinks.Providers this.logger = logger; this.mapper = mapper; this.uploadservice = uploadservice; - SeedData(); + //SeedData(); } diff --git a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/appsettings.json b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/appsettings.json index 0006765..46db839 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/appsettings.json +++ b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/appsettings.json @@ -6,8 +6,12 @@ } }, "AllowedHosts": "*", + //"ConnectionStrings": { + // "DoculinConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;" + //}, "ConnectionStrings": { - "DoculinConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;" + "DoculinConnection": "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", diff --git a/DamageAssesmentApi/DamageAssesment.Api.Employees/Migrations/20230817213656_InitialEmployee.Designer.cs b/DamageAssesmentApi/DamageAssesment.Api.Employees/Migrations/20230817213656_InitialEmployee.Designer.cs deleted file mode 100644 index d747ab1..0000000 --- a/DamageAssesmentApi/DamageAssesment.Api.Employees/Migrations/20230817213656_InitialEmployee.Designer.cs +++ /dev/null @@ -1,64 +0,0 @@ -// -using System; -using DamageAssesment.Api.Employees.Db; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace DamageAssesment.Api.Employees.Migrations -{ - [DbContext(typeof(EmployeeDbContext))] - [Migration("20230817213656_InitialEmployee")] - partial class InitialEmployee - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "7.0.9") - .HasAnnotation("Relational:MaxIdentifierLength", 128); - - SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); - - modelBuilder.Entity("DamageAssesment.Api.Employees.Db.Employee", b => - { - b.Property("Id") - .HasColumnType("nvarchar(450)"); - - b.Property("BirthDate") - .HasColumnType("datetime2"); - - b.Property("Email") - .IsRequired() - .HasMaxLength(50) - .HasColumnType("nvarchar(50)"); - - b.Property("IsActive") - .HasColumnType("bit"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(50) - .HasColumnType("nvarchar(50)"); - - b.Property("OfficePhoneNumber") - .IsRequired() - .HasMaxLength(50) - .HasColumnType("nvarchar(50)"); - - b.Property("PreferredLanguage") - .HasColumnType("nvarchar(max)"); - - b.HasKey("Id"); - - b.ToTable("Employees"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/DamageAssesmentApi/DamageAssesment.Api.Employees/Migrations/20230913164315_employeeupdate.cs b/DamageAssesmentApi/DamageAssesment.Api.Employees/Migrations/20230913164315_employeeupdate.cs deleted file mode 100644 index 8b5ff7f..0000000 --- a/DamageAssesmentApi/DamageAssesment.Api.Employees/Migrations/20230913164315_employeeupdate.cs +++ /dev/null @@ -1,48 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace DamageAssesment.Api.Employees.Migrations -{ - /// - public partial class employeeupdate : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AlterColumn( - name: "Id", - table: "Employees", - type: "int", - nullable: false, - oldClrType: typeof(string), - oldType: "nvarchar(450)") - .Annotation("SqlServer:Identity", "1, 1"); - - migrationBuilder.AddColumn( - name: "EmployeeCode", - table: "Employees", - type: "nvarchar(50)", - maxLength: 50, - nullable: false, - defaultValue: ""); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropColumn( - name: "EmployeeCode", - table: "Employees"); - - migrationBuilder.AlterColumn( - name: "Id", - table: "Employees", - type: "nvarchar(450)", - nullable: false, - oldClrType: typeof(int), - oldType: "int") - .OldAnnotation("SqlServer:Identity", "1, 1"); - } - } -} diff --git a/DamageAssesmentApi/DamageAssesment.Api.Employees/Migrations/20230913170055_updatedemployee_id.Designer.cs b/DamageAssesmentApi/DamageAssesment.Api.Employees/Migrations/20230913170055_updatedemployee_id.Designer.cs deleted file mode 100644 index 35e45ac..0000000 --- a/DamageAssesmentApi/DamageAssesment.Api.Employees/Migrations/20230913170055_updatedemployee_id.Designer.cs +++ /dev/null @@ -1,72 +0,0 @@ -// -using System; -using DamageAssesment.Api.Employees.Db; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace DamageAssesment.Api.Employees.Migrations -{ - [DbContext(typeof(EmployeeDbContext))] - [Migration("20230913170055_updatedemployee_id")] - partial class updatedemployee_id - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "7.0.9") - .HasAnnotation("Relational:MaxIdentifierLength", 128); - - SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); - - modelBuilder.Entity("DamageAssesment.Api.Employees.Db.Employee", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - - b.Property("BirthDate") - .HasColumnType("datetime2"); - - b.Property("Email") - .IsRequired() - .HasMaxLength(50) - .HasColumnType("nvarchar(50)"); - - b.Property("EmployeeCode") - .IsRequired() - .HasMaxLength(50) - .HasColumnType("nvarchar(50)"); - - b.Property("IsActive") - .HasColumnType("bit"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(50) - .HasColumnType("nvarchar(50)"); - - b.Property("OfficePhoneNumber") - .IsRequired() - .HasMaxLength(50) - .HasColumnType("nvarchar(50)"); - - b.Property("PreferredLanguage") - .HasColumnType("nvarchar(max)"); - - b.HasKey("Id"); - - b.ToTable("Employees"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/DamageAssesmentApi/DamageAssesment.Api.Employees/Migrations/20230913164315_employeeupdate.Designer.cs b/DamageAssesmentApi/DamageAssesment.Api.Employees/Migrations/20230927210957_AzureEmployees.Designer.cs similarity index 96% rename from DamageAssesmentApi/DamageAssesment.Api.Employees/Migrations/20230913164315_employeeupdate.Designer.cs rename to DamageAssesmentApi/DamageAssesment.Api.Employees/Migrations/20230927210957_AzureEmployees.Designer.cs index b4aebb2..7110b86 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Employees/Migrations/20230913164315_employeeupdate.Designer.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.Employees/Migrations/20230927210957_AzureEmployees.Designer.cs @@ -12,8 +12,8 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion; namespace DamageAssesment.Api.Employees.Migrations { [DbContext(typeof(EmployeeDbContext))] - [Migration("20230913164315_employeeupdate")] - partial class employeeupdate + [Migration("20230927210957_AzureEmployees")] + partial class AzureEmployees { /// protected override void BuildTargetModel(ModelBuilder modelBuilder) diff --git a/DamageAssesmentApi/DamageAssesment.Api.Employees/Migrations/20230817213656_InitialEmployee.cs b/DamageAssesmentApi/DamageAssesment.Api.Employees/Migrations/20230927210957_AzureEmployees.cs similarity index 81% rename from DamageAssesmentApi/DamageAssesment.Api.Employees/Migrations/20230817213656_InitialEmployee.cs rename to DamageAssesmentApi/DamageAssesment.Api.Employees/Migrations/20230927210957_AzureEmployees.cs index 607751e..1a544ab 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Employees/Migrations/20230817213656_InitialEmployee.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.Employees/Migrations/20230927210957_AzureEmployees.cs @@ -6,7 +6,7 @@ using Microsoft.EntityFrameworkCore.Migrations; namespace DamageAssesment.Api.Employees.Migrations { /// - public partial class InitialEmployee : Migration + public partial class AzureEmployees : Migration { /// protected override void Up(MigrationBuilder migrationBuilder) @@ -15,7 +15,9 @@ namespace DamageAssesment.Api.Employees.Migrations name: "Employees", columns: table => new { - Id = table.Column(type: "nvarchar(450)", nullable: false), + Id = table.Column(type: "int", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + EmployeeCode = table.Column(type: "nvarchar(50)", maxLength: 50, nullable: false), Name = table.Column(type: "nvarchar(50)", maxLength: 50, nullable: false), BirthDate = table.Column(type: "datetime2", nullable: false), OfficePhoneNumber = table.Column(type: "nvarchar(50)", maxLength: 50, nullable: false), diff --git a/DamageAssesmentApi/DamageAssesment.Api.Employees/appsettings.json b/DamageAssesmentApi/DamageAssesment.Api.Employees/appsettings.json index e4445e8..daf21ba 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Employees/appsettings.json +++ b/DamageAssesmentApi/DamageAssesment.Api.Employees/appsettings.json @@ -14,7 +14,11 @@ "endpoint2": "xxx", "endpoint3": "xxx" }, + //"ConnectionStrings": { + // "EmployeeConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;" + //}, "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;" + } } diff --git a/DamageAssesmentApi/DamageAssesment.Api.Locations/Migrations/20230817214454_InitialLocation.Designer.cs b/DamageAssesmentApi/DamageAssesment.Api.Locations/Migrations/20230927211146_AzureLocations.Designer.cs similarity index 73% rename from DamageAssesmentApi/DamageAssesment.Api.Locations/Migrations/20230817214454_InitialLocation.Designer.cs rename to DamageAssesmentApi/DamageAssesment.Api.Locations/Migrations/20230927211146_AzureLocations.Designer.cs index 3e27956..ceeb7c2 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Locations/Migrations/20230817214454_InitialLocation.Designer.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.Locations/Migrations/20230927211146_AzureLocations.Designer.cs @@ -11,8 +11,8 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion; namespace DamageAssesment.Api.Locations.Migrations { [DbContext(typeof(LocationDbContext))] - [Migration("20230817214454_InitialLocation")] - partial class InitialLocation + [Migration("20230927211146_AzureLocations")] + partial class AzureLocations { /// protected override void BuildTargetModel(ModelBuilder modelBuilder) @@ -26,23 +26,29 @@ namespace DamageAssesment.Api.Locations.Migrations modelBuilder.Entity("DamageAssesment.Api.Locations.Db.Location", b => { - b.Property("Id") + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("LocationCode") + .IsRequired() .HasMaxLength(4) .HasColumnType("nvarchar(4)"); b.Property("MaintenanceCenter") .IsRequired() - .HasMaxLength(1) - .HasColumnType("nvarchar(1)"); + .HasMaxLength(4) + .HasColumnType("nvarchar(4)"); b.Property("Name") .IsRequired() .HasMaxLength(50) .HasColumnType("nvarchar(50)"); - b.Property("RegionId") - .IsRequired() - .HasColumnType("nvarchar(max)"); + b.Property("RegionId") + .HasColumnType("int"); b.Property("SchoolType") .IsRequired() @@ -56,9 +62,11 @@ namespace DamageAssesment.Api.Locations.Migrations modelBuilder.Entity("DamageAssesment.Api.Locations.Db.Region", b => { - b.Property("Id") - .HasMaxLength(2) - .HasColumnType("nvarchar(2)"); + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); b.Property("Abbreviation") .IsRequired() diff --git a/DamageAssesmentApi/DamageAssesment.Api.Locations/Migrations/20230817214454_InitialLocation.cs b/DamageAssesmentApi/DamageAssesment.Api.Locations/Migrations/20230927211146_AzureLocations.cs similarity index 71% rename from DamageAssesmentApi/DamageAssesment.Api.Locations/Migrations/20230817214454_InitialLocation.cs rename to DamageAssesmentApi/DamageAssesment.Api.Locations/Migrations/20230927211146_AzureLocations.cs index 4143c63..a67c6b6 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Locations/Migrations/20230817214454_InitialLocation.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.Locations/Migrations/20230927211146_AzureLocations.cs @@ -5,7 +5,7 @@ namespace DamageAssesment.Api.Locations.Migrations { /// - public partial class InitialLocation : Migration + public partial class AzureLocations : Migration { /// protected override void Up(MigrationBuilder migrationBuilder) @@ -14,11 +14,13 @@ namespace DamageAssesment.Api.Locations.Migrations name: "Locations", columns: table => new { - Id = table.Column(type: "nvarchar(4)", maxLength: 4, nullable: false), + Id = table.Column(type: "int", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + RegionId = table.Column(type: "int", nullable: false), + LocationCode = table.Column(type: "nvarchar(4)", maxLength: 4, nullable: false), Name = table.Column(type: "nvarchar(50)", maxLength: 50, nullable: false), - MaintenanceCenter = table.Column(type: "nvarchar(1)", maxLength: 1, nullable: false), - SchoolType = table.Column(type: "nvarchar(2)", maxLength: 2, nullable: false), - RegionId = table.Column(type: "nvarchar(max)", nullable: false) + MaintenanceCenter = table.Column(type: "nvarchar(4)", maxLength: 4, nullable: false), + SchoolType = table.Column(type: "nvarchar(2)", maxLength: 2, nullable: false) }, constraints: table => { @@ -29,7 +31,8 @@ namespace DamageAssesment.Api.Locations.Migrations name: "Regions", columns: table => new { - Id = table.Column(type: "nvarchar(2)", maxLength: 2, nullable: false), + Id = table.Column(type: "int", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), Name = table.Column(type: "nvarchar(50)", maxLength: 50, nullable: false), Abbreviation = table.Column(type: "nvarchar(5)", maxLength: 5, nullable: false) }, diff --git a/DamageAssesmentApi/DamageAssesment.Api.Locations/Migrations/LocationDbContextModelSnapshot.cs b/DamageAssesmentApi/DamageAssesment.Api.Locations/Migrations/LocationDbContextModelSnapshot.cs index 0ae10ad..2d65126 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Locations/Migrations/LocationDbContextModelSnapshot.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.Locations/Migrations/LocationDbContextModelSnapshot.cs @@ -23,23 +23,29 @@ namespace DamageAssesment.Api.Locations.Migrations modelBuilder.Entity("DamageAssesment.Api.Locations.Db.Location", b => { - b.Property("Id") + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("LocationCode") + .IsRequired() .HasMaxLength(4) .HasColumnType("nvarchar(4)"); b.Property("MaintenanceCenter") .IsRequired() - .HasMaxLength(1) - .HasColumnType("nvarchar(1)"); + .HasMaxLength(4) + .HasColumnType("nvarchar(4)"); b.Property("Name") .IsRequired() .HasMaxLength(50) .HasColumnType("nvarchar(50)"); - b.Property("RegionId") - .IsRequired() - .HasColumnType("nvarchar(max)"); + b.Property("RegionId") + .HasColumnType("int"); b.Property("SchoolType") .IsRequired() @@ -53,9 +59,11 @@ namespace DamageAssesment.Api.Locations.Migrations modelBuilder.Entity("DamageAssesment.Api.Locations.Db.Region", b => { - b.Property("Id") - .HasMaxLength(2) - .HasColumnType("nvarchar(2)"); + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); b.Property("Abbreviation") .IsRequired() diff --git a/DamageAssesmentApi/DamageAssesment.Api.Locations/appsettings.json b/DamageAssesmentApi/DamageAssesment.Api.Locations/appsettings.json index 37d1aef..a7e3ff7 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Locations/appsettings.json +++ b/DamageAssesmentApi/DamageAssesment.Api.Locations/appsettings.json @@ -9,7 +9,11 @@ } }, "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;" + } } diff --git a/DamageAssesmentApi/DamageAssesment.Api.Questions/Migrations/20230817215744_InitialQuestion.Designer.cs b/DamageAssesmentApi/DamageAssesment.Api.Questions/Migrations/20230927211340_AzureQuestions.Designer.cs similarity index 83% rename from DamageAssesmentApi/DamageAssesment.Api.Questions/Migrations/20230817215744_InitialQuestion.Designer.cs rename to DamageAssesmentApi/DamageAssesment.Api.Questions/Migrations/20230927211340_AzureQuestions.Designer.cs index 4cbbf64..8f81c7f 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Questions/Migrations/20230817215744_InitialQuestion.Designer.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.Questions/Migrations/20230927211340_AzureQuestions.Designer.cs @@ -12,8 +12,8 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion; namespace DamageAssesment.Api.Questions.Migrations { [DbContext(typeof(QuestionDbContext))] - [Migration("20230817215744_InitialQuestion")] - partial class InitialQuestion + [Migration("20230927211340_AzureQuestions")] + partial class AzureQuestions { /// protected override void BuildTargetModel(ModelBuilder modelBuilder) @@ -25,6 +25,30 @@ namespace DamageAssesment.Api.Questions.Migrations SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + modelBuilder.Entity("DamageAssesment.Api.Questions.Db.CategoryTranslation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("CategoryId") + .HasColumnType("int"); + + b.Property("Language") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Title") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("CategoryTranslations"); + }); + modelBuilder.Entity("DamageAssesment.Api.Questions.Db.Question", b => { b.Property("Id") @@ -45,10 +69,6 @@ namespace DamageAssesment.Api.Questions.Migrations b.Property("Key") .HasColumnType("bit"); - b.Property("QuestionGroup") - .IsRequired() - .HasColumnType("nvarchar(max)"); - b.Property("QuestionNumber") .HasColumnType("int"); @@ -73,11 +93,11 @@ namespace DamageAssesment.Api.Questions.Migrations SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - b.Property("CategoryImage") + b.Property("IconLibrary") .IsRequired() .HasColumnType("nvarchar(max)"); - b.Property("CategoryName") + b.Property("IconName") .IsRequired() .HasColumnType("nvarchar(max)"); diff --git a/DamageAssesmentApi/DamageAssesment.Api.Questions/Migrations/20230817215744_InitialQuestion.cs b/DamageAssesmentApi/DamageAssesment.Api.Questions/Migrations/20230927211340_AzureQuestions.cs similarity index 79% rename from DamageAssesmentApi/DamageAssesment.Api.Questions/Migrations/20230817215744_InitialQuestion.cs rename to DamageAssesmentApi/DamageAssesment.Api.Questions/Migrations/20230927211340_AzureQuestions.cs index aaaf018..cd07b7c 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Questions/Migrations/20230817215744_InitialQuestion.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.Questions/Migrations/20230927211340_AzureQuestions.cs @@ -5,19 +5,34 @@ namespace DamageAssesment.Api.Questions.Migrations { /// - public partial class InitialQuestion : Migration + public partial class AzureQuestions : Migration { /// protected override void Up(MigrationBuilder migrationBuilder) { + migrationBuilder.CreateTable( + name: "CategoryTranslations", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + CategoryId = table.Column(type: "int", nullable: false), + Title = table.Column(type: "nvarchar(max)", nullable: false), + Language = table.Column(type: "nvarchar(max)", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_CategoryTranslations", x => x.Id); + }); + migrationBuilder.CreateTable( name: "QuestionCategories", columns: table => new { Id = table.Column(type: "int", nullable: false) .Annotation("SqlServer:Identity", "1, 1"), - CategoryName = table.Column(type: "nvarchar(max)", nullable: false), - CategoryImage = table.Column(type: "nvarchar(max)", nullable: false) + IconName = table.Column(type: "nvarchar(max)", nullable: false), + IconLibrary = table.Column(type: "nvarchar(max)", nullable: false) }, constraints: table => { @@ -64,7 +79,6 @@ namespace DamageAssesment.Api.Questions.Migrations Comment = table.Column(type: "bit", nullable: false), Key = table.Column(type: "bit", nullable: false), SurveyId = table.Column(type: "int", nullable: true), - QuestionGroup = table.Column(type: "nvarchar(max)", nullable: false), CategoryId = table.Column(type: "int", nullable: false) }, constraints: table => @@ -87,6 +101,9 @@ namespace DamageAssesment.Api.Questions.Migrations /// protected override void Down(MigrationBuilder migrationBuilder) { + migrationBuilder.DropTable( + name: "CategoryTranslations"); + migrationBuilder.DropTable( name: "QuestionCategories"); diff --git a/DamageAssesmentApi/DamageAssesment.Api.Questions/Migrations/QuestionDbContextModelSnapshot.cs b/DamageAssesmentApi/DamageAssesment.Api.Questions/Migrations/QuestionDbContextModelSnapshot.cs index 018f296..397c5d6 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Questions/Migrations/QuestionDbContextModelSnapshot.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.Questions/Migrations/QuestionDbContextModelSnapshot.cs @@ -22,6 +22,30 @@ namespace DamageAssesment.Api.Questions.Migrations SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + modelBuilder.Entity("DamageAssesment.Api.Questions.Db.CategoryTranslation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("CategoryId") + .HasColumnType("int"); + + b.Property("Language") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Title") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("CategoryTranslations"); + }); + modelBuilder.Entity("DamageAssesment.Api.Questions.Db.Question", b => { b.Property("Id") @@ -42,10 +66,6 @@ namespace DamageAssesment.Api.Questions.Migrations b.Property("Key") .HasColumnType("bit"); - b.Property("QuestionGroup") - .IsRequired() - .HasColumnType("nvarchar(max)"); - b.Property("QuestionNumber") .HasColumnType("int"); @@ -70,11 +90,11 @@ namespace DamageAssesment.Api.Questions.Migrations SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - b.Property("CategoryImage") + b.Property("IconLibrary") .IsRequired() .HasColumnType("nvarchar(max)"); - b.Property("CategoryName") + b.Property("IconName") .IsRequired() .HasColumnType("nvarchar(max)"); diff --git a/DamageAssesmentApi/DamageAssesment.Api.Questions/Providers/QuestionsProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.Questions/Providers/QuestionsProvider.cs index 13b12c5..bd2622d 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Questions/Providers/QuestionsProvider.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.Questions/Providers/QuestionsProvider.cs @@ -19,7 +19,7 @@ namespace DamageAssesment.Api.Questions.Providers this.questionDbContext = questionDbContext; this.logger = logger; this.mapper = mapper; - SeedData(); + //SeedData(); } public void SeedData() diff --git a/DamageAssesmentApi/DamageAssesment.Api.Questions/appsettings.json b/DamageAssesmentApi/DamageAssesment.Api.Questions/appsettings.json index 8c0132f..e63711e 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Questions/appsettings.json +++ b/DamageAssesmentApi/DamageAssesment.Api.Questions/appsettings.json @@ -9,7 +9,11 @@ } }, "AllowedHosts": "*", + //"ConnectionStrings": { + // "QuestionConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;" + //}, "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;" + } } diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Migrations/20230927211458_AzureSurveyResponses.Designer.cs b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Migrations/20230927211458_AzureSurveyResponses.Designer.cs new file mode 100644 index 0000000..60e0615 --- /dev/null +++ b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Migrations/20230927211458_AzureSurveyResponses.Designer.cs @@ -0,0 +1,70 @@ +// +using System; +using DamageAssesment.Api.SurveyResponses.Db; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace DamageAssesment.Api.Responses.Migrations +{ + [DbContext(typeof(SurveyResponseDbContext))] + [Migration("20230927211458_AzureSurveyResponses")] + partial class AzureSurveyResponses + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "7.0.9") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("DamageAssesment.Api.SurveyResponses.Db.SurveyResponse", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("ClientDevice") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("CreatedDate") + .HasColumnType("datetime2"); + + b.Property("EmployeeId") + .HasMaxLength(6) + .HasColumnType("int"); + + b.Property("KeyAnswerResult") + .HasMaxLength(250) + .HasColumnType("nvarchar(250)"); + + b.Property("Latitude") + .HasColumnType("float"); + + b.Property("LocationId") + .HasColumnType("int"); + + b.Property("Longitute") + .HasColumnType("float"); + + b.Property("SurveyId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("SurveyResponses"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Migrations/20230817221348_InitialSurveyResponse.cs b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Migrations/20230927211458_AzureSurveyResponses.cs similarity index 51% rename from DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Migrations/20230817221348_InitialSurveyResponse.cs rename to DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Migrations/20230927211458_AzureSurveyResponses.cs index e886ab1..f2915c4 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Migrations/20230817221348_InitialSurveyResponse.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Migrations/20230927211458_AzureSurveyResponses.cs @@ -1,11 +1,12 @@ -using Microsoft.EntityFrameworkCore.Migrations; +using System; +using Microsoft.EntityFrameworkCore.Migrations; #nullable disable -namespace DamageAssesment.Api.SurveyResponses.Migrations +namespace DamageAssesment.Api.Responses.Migrations { /// - public partial class InitialSurveyResponse : Migration + public partial class AzureSurveyResponses : Migration { /// protected override void Up(MigrationBuilder migrationBuilder) @@ -17,8 +18,13 @@ namespace DamageAssesment.Api.SurveyResponses.Migrations Id = table.Column(type: "int", nullable: false) .Annotation("SqlServer:Identity", "1, 1"), SurveyId = table.Column(type: "int", nullable: false), - LocationId = table.Column(type: "nvarchar(4)", maxLength: 4, nullable: false), - EmployeeId = table.Column(type: "nvarchar(6)", maxLength: 6, nullable: false) + LocationId = table.Column(type: "int", nullable: false), + EmployeeId = table.Column(type: "int", maxLength: 6, nullable: false), + CreatedDate = table.Column(type: "datetime2", nullable: true), + ClientDevice = table.Column(type: "nvarchar(50)", maxLength: 50, nullable: true), + KeyAnswerResult = table.Column(type: "nvarchar(250)", maxLength: 250, nullable: true), + Longitute = table.Column(type: "float", nullable: true), + Latitude = table.Column(type: "float", nullable: true) }, constraints: table => { diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Migrations/SurveyResponseDbContextModelSnapshot.cs b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Migrations/SurveyResponseDbContextModelSnapshot.cs index 1870d21..f90e67e 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Migrations/SurveyResponseDbContextModelSnapshot.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/Migrations/SurveyResponseDbContextModelSnapshot.cs @@ -1,4 +1,5 @@ // +using System; using DamageAssesment.Api.SurveyResponses.Db; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; @@ -7,7 +8,7 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion; #nullable disable -namespace DamageAssesment.Api.SurveyResponses.Migrations +namespace DamageAssesment.Api.Responses.Migrations { [DbContext(typeof(SurveyResponseDbContext))] partial class SurveyResponseDbContextModelSnapshot : ModelSnapshot @@ -29,15 +30,29 @@ namespace DamageAssesment.Api.SurveyResponses.Migrations SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - b.Property("EmployeeId") - .IsRequired() - .HasMaxLength(6) - .HasColumnType("nvarchar(6)"); + b.Property("ClientDevice") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); - b.Property("LocationId") - .IsRequired() - .HasMaxLength(4) - .HasColumnType("nvarchar(4)"); + b.Property("CreatedDate") + .HasColumnType("datetime2"); + + b.Property("EmployeeId") + .HasMaxLength(6) + .HasColumnType("int"); + + b.Property("KeyAnswerResult") + .HasMaxLength(250) + .HasColumnType("nvarchar(250)"); + + b.Property("Latitude") + .HasColumnType("float"); + + b.Property("LocationId") + .HasColumnType("int"); + + b.Property("Longitute") + .HasColumnType("float"); b.Property("SurveyId") .HasColumnType("int"); diff --git a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/appsettings.json b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/appsettings.json index 0042404..45a8ae8 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/appsettings.json +++ b/DamageAssesmentApi/DamageAssesment.Api.SurveyResponses/appsettings.json @@ -6,8 +6,12 @@ } }, "AllowedHosts": "*", + //"ConnectionStrings": { + // "SurveyResponseConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;" + //}, "ConnectionStrings": { - "SurveyResponseConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;" + "SurveyResponseConnection": "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;" + }, "EndPointSettings": { "AnswerUrlBase": "http://localhost:5200", diff --git a/DamageAssesmentApi/DamageAssesment.Api.Surveys/Migrations/20230817220614_InitialSurvey.Designer.cs b/DamageAssesmentApi/DamageAssesment.Api.Surveys/Migrations/20230927211618_AzureSurveys.Designer.cs similarity index 57% rename from DamageAssesmentApi/DamageAssesment.Api.Surveys/Migrations/20230817220614_InitialSurvey.Designer.cs rename to DamageAssesmentApi/DamageAssesment.Api.Surveys/Migrations/20230927211618_AzureSurveys.Designer.cs index c0f4172..975ccab 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Surveys/Migrations/20230817220614_InitialSurvey.Designer.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.Surveys/Migrations/20230927211618_AzureSurveys.Designer.cs @@ -9,11 +9,11 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion; #nullable disable -namespace DamageAssesment.Api.Survey.Migrations +namespace DamageAssesment.Api.Surveys.Migrations { [DbContext(typeof(SurveysDbContext))] - [Migration("20230817220614_InitialSurvey")] - partial class InitialSurvey + [Migration("20230927211618_AzureSurveys")] + partial class AzureSurveys { /// protected override void BuildTargetModel(ModelBuilder modelBuilder) @@ -33,24 +33,47 @@ namespace DamageAssesment.Api.Survey.Migrations SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - b.Property("EndDate") + b.Property("CreatedDate") + .HasColumnType("datetime2"); + + b.Property("EndDate") .HasColumnType("datetime2"); b.Property("IsEnabled") .HasColumnType("bit"); - b.Property("StartDate") + b.Property("StartDate") .HasColumnType("datetime2"); - b.Property("Title") - .IsRequired() - .HasMaxLength(100) - .HasColumnType("nvarchar(100)"); - b.HasKey("Id"); b.ToTable("Surveys"); }); + + modelBuilder.Entity("DamageAssesment.Api.Surveys.Db.SurveyTranslation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("Language") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("SurveyId") + .HasColumnType("int"); + + b.Property("Title") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.HasKey("Id"); + + b.ToTable("SurveysTranslation"); + }); #pragma warning restore 612, 618 } } diff --git a/DamageAssesmentApi/DamageAssesment.Api.Surveys/Migrations/20230817220614_InitialSurvey.cs b/DamageAssesmentApi/DamageAssesment.Api.Surveys/Migrations/20230927211618_AzureSurveys.cs similarity index 53% rename from DamageAssesmentApi/DamageAssesment.Api.Surveys/Migrations/20230817220614_InitialSurvey.cs rename to DamageAssesmentApi/DamageAssesment.Api.Surveys/Migrations/20230927211618_AzureSurveys.cs index 1d62693..c6d61be 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Surveys/Migrations/20230817220614_InitialSurvey.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.Surveys/Migrations/20230927211618_AzureSurveys.cs @@ -3,10 +3,10 @@ using Microsoft.EntityFrameworkCore.Migrations; #nullable disable -namespace DamageAssesment.Api.Survey.Migrations +namespace DamageAssesment.Api.Surveys.Migrations { /// - public partial class InitialSurvey : Migration + public partial class AzureSurveys : Migration { /// protected override void Up(MigrationBuilder migrationBuilder) @@ -17,15 +17,30 @@ namespace DamageAssesment.Api.Survey.Migrations { Id = table.Column(type: "int", nullable: false) .Annotation("SqlServer:Identity", "1, 1"), - Title = table.Column(type: "nvarchar(100)", maxLength: 100, nullable: false), IsEnabled = table.Column(type: "bit", nullable: false), - StartDate = table.Column(type: "datetime2", nullable: true), - EndDate = table.Column(type: "datetime2", nullable: true) + StartDate = table.Column(type: "datetime2", nullable: false), + EndDate = table.Column(type: "datetime2", nullable: false), + CreatedDate = table.Column(type: "datetime2", nullable: false) }, constraints: table => { table.PrimaryKey("PK_Surveys", x => x.Id); }); + + migrationBuilder.CreateTable( + name: "SurveysTranslation", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + SurveyId = table.Column(type: "int", nullable: false), + Title = table.Column(type: "nvarchar(200)", maxLength: 200, nullable: false), + Language = table.Column(type: "nvarchar(max)", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_SurveysTranslation", x => x.Id); + }); } /// @@ -33,6 +48,9 @@ namespace DamageAssesment.Api.Survey.Migrations { migrationBuilder.DropTable( name: "Surveys"); + + migrationBuilder.DropTable( + name: "SurveysTranslation"); } } } diff --git a/DamageAssesmentApi/DamageAssesment.Api.Surveys/Migrations/SurveysDbContextModelSnapshot.cs b/DamageAssesmentApi/DamageAssesment.Api.Surveys/Migrations/SurveysDbContextModelSnapshot.cs index 969a062..a5e3f68 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Surveys/Migrations/SurveysDbContextModelSnapshot.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.Surveys/Migrations/SurveysDbContextModelSnapshot.cs @@ -8,7 +8,7 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion; #nullable disable -namespace DamageAssesment.Api.Survey.Migrations +namespace DamageAssesment.Api.Surveys.Migrations { [DbContext(typeof(SurveysDbContext))] partial class SurveysDbContextModelSnapshot : ModelSnapshot @@ -30,24 +30,47 @@ namespace DamageAssesment.Api.Survey.Migrations SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - b.Property("EndDate") + b.Property("CreatedDate") + .HasColumnType("datetime2"); + + b.Property("EndDate") .HasColumnType("datetime2"); b.Property("IsEnabled") .HasColumnType("bit"); - b.Property("StartDate") + b.Property("StartDate") .HasColumnType("datetime2"); - b.Property("Title") - .IsRequired() - .HasMaxLength(100) - .HasColumnType("nvarchar(100)"); - b.HasKey("Id"); b.ToTable("Surveys"); }); + + modelBuilder.Entity("DamageAssesment.Api.Surveys.Db.SurveyTranslation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("Language") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("SurveyId") + .HasColumnType("int"); + + b.Property("Title") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.HasKey("Id"); + + b.ToTable("SurveysTranslation"); + }); #pragma warning restore 612, 618 } } diff --git a/DamageAssesmentApi/DamageAssesment.Api.Surveys/appsettings.json b/DamageAssesmentApi/DamageAssesment.Api.Surveys/appsettings.json index 0057832..0d6c40d 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Surveys/appsettings.json +++ b/DamageAssesmentApi/DamageAssesment.Api.Surveys/appsettings.json @@ -9,7 +9,11 @@ } }, "AllowedHosts": "*", + //"ConnectionStrings": { + // "SurveyConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;" + //}, "ConnectionStrings": { - "SurveyConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;" + "SurveyConnection": "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;" + } } From f79fd71feac4cf717b194e916f8303385d6c9c4e Mon Sep 17 00:00:00 2001 From: uppuv Date: Wed, 4 Oct 2023 13:37:44 -0400 Subject: [PATCH 7/7] add azure sql data integration --- .../AttachmentsServiceTest.cs | 20 +-- .../Controllers/AttachmentsController.cs | 11 +- .../Interfaces/IAzureBlobService.cs | 7 +- .../Providers/AzureBlobService.cs | 143 ++++++++++++++- .../appsettings.json | 4 +- .../DoculinkServiceTest.cs | 46 ++--- .../Controllers/DoculinkController.cs | 13 +- .../DamageAssesment.Api.DocuLinks.csproj | 2 +- .../Interfaces/IAzureBlobService.cs | 4 + .../Providers/AzureBlobService.cs | 163 +++++++++++++++++- .../Providers/DoculinkProvider.cs | 10 +- .../Providers/UploadService.cs | 5 +- .../appsettings.json | 4 +- 13 files changed, 365 insertions(+), 67 deletions(-) diff --git a/DamageAssesmentApi/DamageAssesment.Api.Attachments.Test/AttachmentsServiceTest.cs b/DamageAssesmentApi/DamageAssesment.Api.Attachments.Test/AttachmentsServiceTest.cs index 1b3ff31..1e67133 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Attachments.Test/AttachmentsServiceTest.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.Attachments.Test/AttachmentsServiceTest.cs @@ -20,7 +20,7 @@ namespace DamageAssesment.Api.Attachments.Test public async Task GetAttachmentsAsync_ShouldReturnStatusCode200() { var mockAttachmentService = new Mock(); - var mockUploadService = new Mock(); + var mockUploadService = new Mock(); 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(); - var mockUploadService = new Mock(); + var mockUploadService = new Mock(); 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(); - var mockUploadService = new Mock(); + var mockUploadService = new Mock(); 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(); - var mockUploadService = new Mock(); + var mockUploadService = new Mock(); 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(); - var mockUploadService = new Mock(); + var mockUploadService = new Mock(); 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(); - var mockUploadService = new Mock(); + var mockUploadService = new Mock(); 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(); - var mockUploadService = new Mock(); + var mockUploadService = new Mock(); 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(); - var mockUploadService = new Mock(); + var mockUploadService = new Mock(); 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(); - var mockUploadService = new Mock(); + var mockUploadService = new Mock(); 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(); - var mockUploadService = new Mock(); + var mockUploadService = new Mock(); var mockResponse = await MockData.getNotFoundResponse(); mockAttachmentService.Setup(service => service.DeleteAttachmentAsync(1)).ReturnsAsync(mockResponse); var AttachmentProvider = new AttachmentsController(mockAttachmentService.Object, mockUploadService.Object); diff --git a/DamageAssesmentApi/DamageAssesment.Api.Attachments/Controllers/AttachmentsController.cs b/DamageAssesmentApi/DamageAssesment.Api.Attachments/Controllers/AttachmentsController.cs index 4245281..8654602 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Attachments/Controllers/AttachmentsController.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.Attachments/Controllers/AttachmentsController.cs @@ -13,11 +13,12 @@ namespace DamageAssesment.Api.Attachments.Controllers { private IAttachmentsProvider AttachmentProvider; private IUploadService UploadService; + private IAzureBlobService azureBlobService; - public AttachmentsController(IAttachmentsProvider AttachmentsProvider, IUploadService uploadService) + public AttachmentsController(IAttachmentsProvider AttachmentsProvider, IAzureBlobService azureBlobService) { this.AttachmentProvider = AttachmentsProvider; - this.UploadService = uploadService; + this.azureBlobService = azureBlobService; } /// /// Get all attachments. @@ -91,7 +92,7 @@ namespace DamageAssesment.Api.Attachments.Controllers if (attachmentInfo.Answers.Count > 0) { var Attachments = await this.AttachmentProvider.GetAttachmentCounter(); - List attachments = UploadService.UploadAttachment(attachmentInfo.ResponseId, Attachments.counter, attachmentInfo.Answers); + List attachments = await azureBlobService.UploadAttachment(attachmentInfo.ResponseId, Attachments.counter, attachmentInfo.Answers); var result = await this.AttachmentProvider.PostAttachmentAsync(attachments); if (result.IsSuccess) { @@ -120,7 +121,7 @@ namespace DamageAssesment.Api.Attachments.Controllers var res = await this.AttachmentProvider.GetAttachmentInfo(attachmentInfo.Answers); if (res.IsSuccess) { - List attachments = UploadService.UpdateAttachments(attachmentInfo.ResponseId, attachmentInfo.Answers, res.Attachments); + List attachments = await azureBlobService.UpdateAttachments(attachmentInfo.ResponseId, attachmentInfo.Answers, res.Attachments); var result = await this.AttachmentProvider.PutAttachmentAsync(attachments); if (result.IsSuccess) { @@ -149,7 +150,7 @@ namespace DamageAssesment.Api.Attachments.Controllers if (result.IsSuccess) { // deleting file from folder - UploadService.Movefile(result.Attachment.URI); + azureBlobService.Movefile(result.Attachment.URI); return Ok(result.Attachment); } return NotFound(); diff --git a/DamageAssesmentApi/DamageAssesment.Api.Attachments/Interfaces/IAzureBlobService.cs b/DamageAssesmentApi/DamageAssesment.Api.Attachments/Interfaces/IAzureBlobService.cs index f15ed9e..39e892d 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Attachments/Interfaces/IAzureBlobService.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.Attachments/Interfaces/IAzureBlobService.cs @@ -1,10 +1,15 @@ using Azure.Storage.Blobs.Models; +using DamageAssesment.Api.Attachments.Models; namespace DamageAssesment.Api.Attachments.Interfaces { public interface IAzureBlobService { Task>> UploadFiles(List files); - void DeleteFile(string path); + Task> UploadAttachment(int responseId, int answerId, int counter, List postedFile); + Task> UploadAttachment(int responseId, int counter, List answers); + Task> UpdateAttachments(int responseId, List answers, IEnumerable attachments); + void Deletefile(string path); + void Movefile(string path); } } diff --git a/DamageAssesmentApi/DamageAssesment.Api.Attachments/Providers/AzureBlobService.cs b/DamageAssesmentApi/DamageAssesment.Api.Attachments/Providers/AzureBlobService.cs index 4e30b42..2cb4558 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Attachments/Providers/AzureBlobService.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.Attachments/Providers/AzureBlobService.cs @@ -3,6 +3,9 @@ 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 { @@ -10,11 +13,95 @@ namespace DamageAssesment.Api.Attachments.Providers { BlobServiceClient _blobClient; BlobContainerClient _containerClient; - string azureConnectionString = ""; - public AzureBlobService() + string azureConnectionString; + private string uploadpath = ""; + private string Deletepath = ""; + public AzureBlobService(IConfiguration configuration) { - _blobClient = new BlobServiceClient(azureConnectionString); - _containerClient = _blobClient.GetBlobContainerClient("apiimages"); + uploadpath = configuration.GetValue("Fileupload:folderpath"); + Deletepath = configuration.GetValue("Fileupload:Deletepath"); + _blobClient = new BlobServiceClient(configuration.GetValue("Fileupload:BlobConnectionString")); + _containerClient = _blobClient.GetBlobContainerClient(configuration.GetValue("Fileupload:BlobContainerName")); + } + public async Task> UploadAttachment(int responseId, int answerId, int counter, List postedFile) + { + var pathToSave = Path.Combine(uploadpath, "Response-" + responseId); + String fullDirectoryPath = Path.Combine(pathToSave, "Answer-" + answerId); + List attachments = new List(); + 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> UploadAttachment(int responseId, int counter, List answers) + { + List attachments = new List(); + 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(); + } + + + } + public async Task> UpdateAttachments(int responseId, List answers, IEnumerable attachments) + { + List Dbattachments = new List(); + foreach (Models.Attachment searchFile in attachments) + { + Movefile(searchFile.URI); + } + foreach (var item in answers) + { + int answerId = item.AnswerId; + var pathToSave = Path.Combine(uploadpath, "Response-" + responseId); + String fullDirectoryPath = Path.Combine(pathToSave, "Answer-" + answerId); + foreach (var file in item.postedFiles) + { + Models.Attachment attachment = attachments.Where(a => a.Id == file.AttachmentId).FirstOrDefault(); + var UserfileName = Path.GetFileName(file.FileName); + var fileName = String.Format("Attachment_{0}{1}", attachment?.Id, file.FileExtension); + byte[] byteArray = Convert.FromBase64String(file.FileContent); + MemoryStream stream = new MemoryStream(byteArray); + BlobClient client = _containerClient.GetBlobClient(fullDirectoryPath + "/" + fileName); + string dbPath = fullDirectoryPath + "/" + fileName; + var result = await client.UploadAsync(stream, true); + Dbattachments.Add(new Models.Attachment { Id = attachment.Id, AnswerId = answerId, ResponseId = responseId, IsDeleted = false, FileName = UserfileName, URI = dbPath }); + } + } + return Dbattachments; } public async Task>> UploadFiles(List files) @@ -35,10 +122,52 @@ namespace DamageAssesment.Api.Attachments.Providers return azureResponse; } - public void DeleteFile(string url) + public string getMovefilename(string movefilename) { - var blob = _containerClient.GetBlockBlobClient(url); - blob.DeleteIfExists(); + 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(); } } } \ No newline at end of file diff --git a/DamageAssesmentApi/DamageAssesment.Api.Attachments/appsettings.json b/DamageAssesmentApi/DamageAssesment.Api.Attachments/appsettings.json index 29a4c79..2c80ffc 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Attachments/appsettings.json +++ b/DamageAssesmentApi/DamageAssesment.Api.Attachments/appsettings.json @@ -11,7 +11,9 @@ "AllowedHosts": "*", "Fileupload": { "folderpath": "DMS_Attachments/Active", - "Deletepath": "DMS_Attachments/Deleted" + "Deletepath": "DMS_Attachments/Deleted", + "BlobConnectionString": "DefaultEndpointsProtocol=https;AccountName=damagedoculink;AccountKey=blynpwrAQtthEneXC5f4vFewJ3tPV+QZUt1AX3nefZScPPjkr5hMoC18B9ni6/ZYdhRiERPQw+hB+AStonf+iw==;EndpointSuffix=core.windows.net", + "BlobContainerName": "doculinks" }, //"ConnectionStrings": { // "AttachmentConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;" diff --git a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks.Test/DoculinkServiceTest.cs b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks.Test/DoculinkServiceTest.cs index b953eeb..c494328 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks.Test/DoculinkServiceTest.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks.Test/DoculinkServiceTest.cs @@ -15,7 +15,7 @@ namespace DamageAssesment.Api.DocuLinks.Test public async Task GetDocumentsLanguageAsync_ShouldReturnStatusCode204() { var mockDocumentService = new Mock(); - var mockUploadService = new Mock(); + var mockUploadService = new Mock(); var mockResponse = await MockData.getNoContentResponse(); mockDocumentService.Setup(service => service.GetdocumentsByLinkAsync("forms","en",null)).ReturnsAsync(mockResponse); @@ -29,7 +29,7 @@ namespace DamageAssesment.Api.DocuLinks.Test public async Task GetDocumentsLinkTypeAsync_ShouldReturnStatusCode204() { var mockDocumentService = new Mock(); - var mockUploadService = new Mock(); + var mockUploadService = new Mock(); var mockResponse = await MockData.getNoContentResponse(); mockDocumentService.Setup(service => service.GetdocumentsByLinkAsync("forms", "en", true)).ReturnsAsync(mockResponse); @@ -42,7 +42,7 @@ namespace DamageAssesment.Api.DocuLinks.Test public async Task GetDocumentsAsync_ShouldReturnStatusCode200() { var mockDocumentService = new Mock(); - var mockUploadService = new Mock(); + var mockUploadService = new Mock(); var mockResponse = await MockData.getOkResponse(); mockDocumentService.Setup(service => service.GetdocumentsByLinkAsync("forms","en", null)).ReturnsAsync(mockResponse); @@ -55,7 +55,7 @@ namespace DamageAssesment.Api.DocuLinks.Test public async Task GetActiveDocumentsAsync_ShouldReturnStatusCode200() { var mockDocumentService = new Mock(); - var mockUploadService = new Mock(); + var mockUploadService = new Mock(); var mockResponse = await MockData.getOkResponse(); mockDocumentService.Setup(service => service.GetdocumentsByLinkAsync("forms", "en", true)).ReturnsAsync(mockResponse); @@ -69,7 +69,7 @@ namespace DamageAssesment.Api.DocuLinks.Test public async Task GetDocumentAsync_ShouldReturnStatusCode200() { var mockDocumentService = new Mock(); - var mockUploadService = new Mock(); + var mockUploadService = new Mock(); var mockResponse = await MockData.getOkResponse(1); mockDocumentService.Setup(service => service.GetDocumentAsync(1,"forms","en")).ReturnsAsync(mockResponse); @@ -83,7 +83,7 @@ namespace DamageAssesment.Api.DocuLinks.Test public async Task GetDocumentAsync_ShouldReturnStatusCode404() { var mockDocumentService = new Mock(); - var mockUploadService = new Mock(); + var mockUploadService = new Mock(); var mockResponse = await MockData.getNotFoundResponse(); mockDocumentService.Setup(service => service.GetDocumentAsync(99, "forms", "en")).ReturnsAsync(mockResponse); var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object); @@ -94,7 +94,7 @@ namespace DamageAssesment.Api.DocuLinks.Test public async Task PostDocumentAsync_ShouldReturnStatusCode200() { var mockDocumentService = new Mock(); - var mockUploadService = new Mock(); + var mockUploadService = new Mock(); var mockResponse = await MockData.getOkResponse(1); var mockInputDocument = await MockData.getInputDocumentData(); var DocumentResponse = await MockData.GetDocuLinksInfo(0); @@ -109,7 +109,7 @@ namespace DamageAssesment.Api.DocuLinks.Test public async Task PostDocumentAsync_ShouldReturnStatusCode400() { var mockDocumentService = new Mock(); - var mockUploadService = new Mock(); + var mockUploadService = new Mock(); var mockInputDocument = await MockData.getInputDocumentData(); var mockResponse = await MockData.getBadRequestResponse(); ReqDoculink documentInfo = null; @@ -124,7 +124,7 @@ namespace DamageAssesment.Api.DocuLinks.Test public async Task PutDocumentAsync_ShouldReturnStatusCode200() { var mockDocumentService = new Mock(); - var mockUploadService = new Mock(); + var mockUploadService = new Mock(); var mockResponse = await MockData.getOkResponse(1); var mockInputDocument = await MockData.getInputDocumentData(); var DocumentResponse = await MockData.GetDocuLinksInfo(1); @@ -139,7 +139,7 @@ namespace DamageAssesment.Api.DocuLinks.Test public async Task PutDocumentAsync_ShouldReturnStatusCode400() { var mockDocumentService = new Mock(); - var mockUploadService = new Mock(); + var mockUploadService = new Mock(); var mockResponse = await MockData.getBadRequestResponse(); var mockInputDocument = await MockData.getInputDocumentData(); mockDocumentService.Setup(service => service.UpdateDocumentAsync(99,mockInputDocument)).ReturnsAsync(mockResponse); @@ -152,7 +152,7 @@ namespace DamageAssesment.Api.DocuLinks.Test public async Task DeleteDocumentAsync_ShouldReturnStatusCode200() { var mockDocumentService = new Mock(); - var mockUploadService = new Mock(); + var mockUploadService = new Mock(); var mockResponse = await MockData.getOkResponse(1); mockDocumentService.Setup(service => service.DeleteDocumentAsync(1)).ReturnsAsync(mockResponse); var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object); @@ -164,7 +164,7 @@ namespace DamageAssesment.Api.DocuLinks.Test public async Task DeleteDocumentAsync_ShouldReturnStatusCode404() { var mockDocumentService = new Mock(); - var mockUploadService = new Mock(); + var mockUploadService = new Mock(); var mockResponse = await MockData.getNotFoundResponse(); mockDocumentService.Setup(service => service.DeleteDocumentAsync(1)).ReturnsAsync(mockResponse); var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object); @@ -180,7 +180,7 @@ namespace DamageAssesment.Api.DocuLinks.Test public async Task GetDocumentCategoriesAsync_ShouldReturnStatusCode200() { var mockDocumentService = new Mock(); - var mockUploadService = new Mock(); + var mockUploadService = new Mock(); var mockResponse = await LinkTypeMockData.getOkResponse(); mockDocumentService.Setup(service => service.GetLinkTypesAsync("en")).ReturnsAsync(mockResponse); var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object); @@ -193,7 +193,7 @@ namespace DamageAssesment.Api.DocuLinks.Test public async Task GetDocumentCategoriesAsync_ShouldReturnStatusCode204() { var mockDocumentService = new Mock(); - var mockUploadService = new Mock(); + var mockUploadService = new Mock(); var mockResponse = await LinkTypeMockData.getNoContentResponse(); mockDocumentService.Setup(service => service.GetLinkTypesAsync("en")).ReturnsAsync(mockResponse); @@ -207,7 +207,7 @@ namespace DamageAssesment.Api.DocuLinks.Test public async Task GetDocumentcategoryAsync_ShouldReturnStatusCode200() { var mockDocumentService = new Mock(); - var mockUploadService = new Mock(); + var mockUploadService = new Mock(); var mockResponse = await LinkTypeMockData.getOkResponse(1); mockDocumentService.Setup(service => service.GetLinkTypeAsync(1,"en")).ReturnsAsync(mockResponse); var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object); @@ -220,7 +220,7 @@ namespace DamageAssesment.Api.DocuLinks.Test public async Task GetDocumentcategoryAsync_ShouldReturnStatusCode404() { var mockDocumentService = new Mock(); - var mockUploadService = new Mock(); + var mockUploadService = new Mock(); var mockResponse = await LinkTypeMockData.getNotFoundResponse(); mockDocumentService.Setup(service => service.GetLinkTypeAsync(99, "en")).ReturnsAsync(mockResponse); @@ -233,7 +233,7 @@ namespace DamageAssesment.Api.DocuLinks.Test public async Task PostDocumentcategoryAsync_ShouldReturnStatusCode200() { var mockDocumentService = new Mock(); - var mockUploadService = new Mock(); + var mockUploadService = new Mock(); var mockResponse = await LinkTypeMockData.getOkResponse(1); var mockInputDocument = await LinkTypeMockData.getInputLinkData(0); mockDocumentService.Setup(service => service.PostLinkTypeAsync(mockInputDocument)).ReturnsAsync(mockResponse); @@ -247,7 +247,7 @@ namespace DamageAssesment.Api.DocuLinks.Test public async Task PostDocumentcategoryAsync_ShouldReturnStatusCode400() { var mockDocumentService = new Mock(); - var mockUploadService = new Mock(); + var mockUploadService = new Mock(); var mockInputDocument = await LinkTypeMockData.getInputLinkData(99); var mockResponse = await LinkTypeMockData.getBadRequestResponse(); mockDocumentService.Setup(service => service.PostLinkTypeAsync(mockInputDocument)).ReturnsAsync(mockResponse); @@ -261,7 +261,7 @@ namespace DamageAssesment.Api.DocuLinks.Test public async Task PutDocumentcategoryAsync_ShouldReturnStatusCode200() { var mockDocumentService = new Mock(); - var mockUploadService = new Mock(); + var mockUploadService = new Mock(); var mockResponse = await LinkTypeMockData.getOkResponse(1); var mockInputDocument = await LinkTypeMockData.getInputLinkData(1); mockDocumentService.Setup(service => service.UpdateLinkTypeAsync(1,mockInputDocument)).ReturnsAsync(mockResponse); @@ -275,7 +275,7 @@ namespace DamageAssesment.Api.DocuLinks.Test public async Task PutDocumentcategoryAsync_ShouldReturnStatusCode404() { var mockDocumentService = new Mock(); - var mockUploadService = new Mock(); + var mockUploadService = new Mock(); var mockResponse = await LinkTypeMockData.getNotFoundResponse(); var mockInputDocument = await LinkTypeMockData.getInputLinkData(99); mockDocumentService.Setup(service => service.UpdateLinkTypeAsync(99,mockInputDocument)).ReturnsAsync(mockResponse); @@ -289,7 +289,7 @@ namespace DamageAssesment.Api.DocuLinks.Test public async Task PutDocumentcategoryAsync_ShouldReturnStatusCode400() { var mockDocumentService = new Mock(); - var mockUploadService = new Mock(); + var mockUploadService = new Mock(); var mockResponse = await LinkTypeMockData.getBadRequestResponse(); var mockInputDocument = await LinkTypeMockData.getInputLinkData(1); mockDocumentService.Setup(service => service.UpdateLinkTypeAsync(1,mockInputDocument)).ReturnsAsync(mockResponse); @@ -303,7 +303,7 @@ namespace DamageAssesment.Api.DocuLinks.Test public async Task DeleteDocumentcategoryAsync_ShouldReturnStatusCode200() { var mockDocumentService = new Mock(); - var mockUploadService = new Mock(); + var mockUploadService = new Mock(); var mockResponse = await LinkTypeMockData.getOkResponse(1); mockDocumentService.Setup(service => service.DeleteLinkTypeAsync(1)).ReturnsAsync(mockResponse); @@ -316,7 +316,7 @@ namespace DamageAssesment.Api.DocuLinks.Test public async Task DeleteDocumentcategoryAsync_ShouldReturnStatusCode404() { var mockDocumentService = new Mock(); - var mockUploadService = new Mock(); + var mockUploadService = new Mock(); var mockResponse = await LinkTypeMockData.getNotFoundResponse(); mockDocumentService.Setup(service => service.DeleteLinkTypeAsync(1)).ReturnsAsync(mockResponse); diff --git a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Controllers/DoculinkController.cs b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Controllers/DoculinkController.cs index b080635..c757c99 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Controllers/DoculinkController.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Controllers/DoculinkController.cs @@ -13,12 +13,13 @@ namespace DamageAssesment.Api.DocuLinks.Controllers { private readonly IDoculinkProvider documentsProvider; private readonly IUploadService uploadService; + private readonly IAzureBlobService azureBlobService; - public DoculinkController(IDoculinkProvider documentsProvider,IUploadService uploadService) + public DoculinkController(IDoculinkProvider documentsProvider, IAzureBlobService azureBlobService) { this.documentsProvider = documentsProvider; - this.uploadService = uploadService; + this.azureBlobService = azureBlobService; } /// @@ -190,7 +191,7 @@ namespace DamageAssesment.Api.DocuLinks.Controllers /// /// Create new doclink. /// - [Authorize(Roles = "admin")] + // [Authorize(Roles = "admin")] [HttpPost] [Route("doculinks")] public async Task CreateDocument(ReqDoculink documentInfo) @@ -199,8 +200,8 @@ namespace DamageAssesment.Api.DocuLinks.Controllers { if (documentInfo != null) { - var documents = await this.documentsProvider.GetDocumentCounter(); - Models.Doculink DocuLink= uploadService.UploadDocument(documents.counter, documentInfo); + //var documents = await this.documentsProvider.GetDocumentCounter(); + Models.Doculink DocuLink= await azureBlobService.UploadDocument(1, documentInfo); var result = await this.documentsProvider.PostDocumentAsync(DocuLink); if (result.IsSuccess) { @@ -230,7 +231,7 @@ namespace DamageAssesment.Api.DocuLinks.Controllers // deleting file from folder foreach (var item in result.Document.doclinksAttachments) { - uploadService.Movefile(item.Path); + azureBlobService.Movefile(item.Path); } return Ok(result.Document); } diff --git a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/DamageAssesment.Api.DocuLinks.csproj b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/DamageAssesment.Api.DocuLinks.csproj index a1d917b..cfdf183 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/DamageAssesment.Api.DocuLinks.csproj +++ b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/DamageAssesment.Api.DocuLinks.csproj @@ -9,7 +9,7 @@ - + diff --git a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Interfaces/IAzureBlobService.cs b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Interfaces/IAzureBlobService.cs index 844945e..043d8a1 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Interfaces/IAzureBlobService.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Interfaces/IAzureBlobService.cs @@ -1,10 +1,14 @@ using Azure.Storage.Blobs.Models; +using DamageAssesment.Api.DocuLinks.Models; namespace DamageAssesment.Api.DocuLinks.Interfaces { public interface IAzureBlobService { Task>> UploadFiles(List files); + Task UploadDocument(int counter, ReqDoculink documentInfo); + Task UpdateDocuments(int counter, Models.Doculink document, ReqDoculink documentInfo); void DeleteFile(string path); + void Movefile(string path); } } diff --git a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Providers/AzureBlobService.cs b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Providers/AzureBlobService.cs index bfa2ca4..9931de2 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Providers/AzureBlobService.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Providers/AzureBlobService.cs @@ -1,8 +1,17 @@  +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 { @@ -10,11 +19,111 @@ namespace DamageAssesment.Api.DocuLinks.Providers { BlobServiceClient _blobClient; BlobContainerClient _containerClient; - string azureConnectionString = ""; - public AzureBlobService() + string azureConnectionString; + private string uploadpath = ""; + private string Deletepath = ""; + public AzureBlobService(IConfiguration configuration) { - _blobClient = new BlobServiceClient(azureConnectionString); - _containerClient = _blobClient.GetBlobContainerClient("apiimages"); + uploadpath = configuration.GetValue("Fileupload:folderpath"); + Deletepath = configuration.GetValue("Fileupload:Deletepath"); + _blobClient = new BlobServiceClient(configuration.GetValue("Fileupload:BlobConnectionString")); + _containerClient = _blobClient.GetBlobContainerClient(configuration.GetValue("Fileupload:BlobContainerName")); + } + public async Task UploadDocument(int counter, ReqDoculink documentInfo) + { + Models.Doculink Documents = new Models.Doculink(); + List attachments = new List(); + try + { + string path = "", UserfileName = ""; + if (documentInfo.Files != null) + { + + int counter1 = 1; + foreach (var item in documentInfo.Files) + { + if (item.IsAttachments) + { + UserfileName = Path.GetFileName(item.FileName); + var fileName = String.Format("Document_{0}_{1}{2}", counter, counter1, item.FileExtension); + byte[] byteArray = Convert.FromBase64String(item.FileContent); + MemoryStream stream = new MemoryStream(byteArray); + BlobClient client = _containerClient.GetBlobClient(uploadpath + "/" + fileName); + var result = await client.UploadAsync(stream, true); + path = uploadpath + "/" + fileName; + counter1++; + } + else + path = item.url; + attachments.Add(new Models.DoculinkAttachments { docName = UserfileName, Path = path, IsAttachments = item.IsAttachments, CustomOrder = item.CustomOrder }); + } + } + Documents = new Models.Doculink() + { + linkTypeId = documentInfo.linkTypeId, + documentsTranslations = documentInfo.documentsTranslations, + doclinksAttachments = attachments, + IsDeleted = false, + CustomOrder = documentInfo.CustomOrder, + IsActive = true + }; + + return Documents; + } + catch (Exception ex) + { + return new Models.Doculink(); + } + + + } + + public async Task UpdateDocuments(int counter, Models.Doculink document, ReqDoculink documentInfo) + { + try + { + foreach (var item in document.doclinksAttachments) + { + Movefile(item.Path); + } + string path = "", UserfileName = ""; + List attachments = new List(); + int counter1 = 1; + foreach (var item in documentInfo.Files) + { + if (item.IsAttachments) + { + UserfileName = Path.GetFileName(item.FileName); + var fileName = String.Format("Document_{0}_{1}{2)", document.Id, counter1, item.FileExtension); + byte[] byteArray = Encoding.UTF8.GetBytes(item.FileContent); + MemoryStream stream = new MemoryStream(byteArray); + BlobClient client = _containerClient.GetBlobClient(uploadpath + "/" + fileName); + path = uploadpath + "/" + fileName; + var result = await client.UploadAsync(stream, true); + counter1++; + } + else + path = item.url; + attachments.Add(new Models.DoculinkAttachments { docName = UserfileName, Path = path, IsAttachments = item.IsAttachments, CustomOrder = item.CustomOrder }); + } + Models.Doculink Documents = new Models.Doculink() + { + Id = documentInfo.Id, + linkTypeId = documentInfo.linkTypeId, + documentsTranslations = documentInfo.documentsTranslations, + IsActive = true, + IsDeleted = false, + CustomOrder = documentInfo.CustomOrder, + doclinksAttachments = attachments + }; + + return Documents; + } + + catch (Exception ex) + { + return new Models.Doculink(); + } } public async Task>> UploadFiles(List files) @@ -35,10 +144,52 @@ 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) { - var blob = _containerClient.GetBlockBlobClient(url); - blob.DeleteIfExists(); + BlobClient sourceBlobClient = _containerClient.GetBlobClient(url); + sourceBlobClient.DeleteIfExists(); } } } \ No newline at end of file diff --git a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Providers/DoculinkProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Providers/DoculinkProvider.cs index 1a77ecf..a4d1fcc 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Providers/DoculinkProvider.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Providers/DoculinkProvider.cs @@ -19,20 +19,22 @@ namespace DamageAssesment.Api.DocuLinks.Providers private DoculinkDbContext DocumentDbContext; private ILogger logger; private IUploadService uploadservice; + private IAzureBlobService azureBlobService; private IMapper mapper; - public DoculinkProvider(DoculinkDbContext DocumentDbContext, ILogger logger, IMapper mapper, IUploadService uploadservice) + public DoculinkProvider(DoculinkDbContext DocumentDbContext, ILogger logger, IMapper mapper, IUploadService uploadservice, IAzureBlobService azureBlobService) { this.DocumentDbContext = DocumentDbContext; this.logger = logger; this.mapper = mapper; this.uploadservice = uploadservice; + this.azureBlobService = azureBlobService; //SeedData(); } - private void SeedData() + private async Task SeedDataAsync() { if (!DocumentDbContext.LinkTypes.Any()) { @@ -66,7 +68,7 @@ namespace DamageAssesment.Api.DocuLinks.Providers 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 } }; Db.DoculinkTranslation documents = new Db.DoculinkTranslation { DocumentId = i, title = "Test"+i, description = "ss"+i, Language = "en" }; - Models.Doculink document = uploadservice.UploadDocument(counter, documentInfo); + Models.Doculink document =await azureBlobService.UploadDocument(counter, documentInfo); DocumentDbContext.Documents.Add(mapper.Map(document)); DocumentDbContext.SaveChanges(); DocumentDbContext.DocumentsTranslations.AddRange(documents); @@ -373,7 +375,7 @@ namespace DamageAssesment.Api.DocuLinks.Providers { try { - int AttachmentId = DocumentDbContext.DoclinksAttachments.Max(a => a.Id); + int AttachmentId = DocumentDbContext.Documents.Max(a => a.Id); return (true, AttachmentId, ""); } catch (Exception ex) diff --git a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Providers/UploadService.cs b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Providers/UploadService.cs index 807a2e0..0e71850 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Providers/UploadService.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Providers/UploadService.cs @@ -80,15 +80,16 @@ namespace DamageAssesment.Api.DocuLinks.Providers string path = "", UserfileName = ""; List attachments = new List(); + 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}", counter, item.FileExtension); + var fileName = String.Format("Document_{0}_{1}{2}", document.Id, counter1, item.FileExtension); path = Path.Combine(fullDirectoryPath, fileName); File.WriteAllBytes(path, Convert.FromBase64String(item.FileContent)); + counter1++; } else path = item.url; diff --git a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/appsettings.json b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/appsettings.json index 81ce9ee..c22d2b9 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/appsettings.json +++ b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/appsettings.json @@ -18,6 +18,8 @@ }, "Fileupload": { "folderpath": "DASA_Documents/Active", - "Deletepath": "DASA_Documents/Deleted" + "Deletepath": "DASA_Documents/Deleted", + "BlobConnectionString": "DefaultEndpointsProtocol=https;AccountName=damagedoculink;AccountKey=blynpwrAQtthEneXC5f4vFewJ3tPV+QZUt1AX3nefZScPPjkr5hMoC18B9ni6/ZYdhRiERPQw+hB+AStonf+iw==;EndpointSuffix=core.windows.net", + "BlobContainerName": "doculinks" } }