Compare commits

..

19 Commits

Author SHA1 Message Date
Vijay Uppu
fe5e3129b5 fixed region issue 2024-01-18 11:45:13 -05:00
Vijay Uppu
86dea1b942 added survey start and end date validation 2023-12-13 17:15:40 -05:00
Vijay Uppu
5507bd7999 multiple questions update for survey id 2023-12-12 13:42:37 -05:00
Vijay Uppu
d2627645b0 changed download url format and added new endpoint for doculink isactive update 2023-12-04 15:00:29 -05:00
Vijay Uppu
e93168f1df added IsActive flag in doculinks request 2023-12-04 14:58:38 -05:00
Vijay Uppu
1bf92fe95d attachment and doculinks url changes 2023-12-01 18:01:54 -05:00
Vijay Uppu
2604c6fd4a added multi language support for doculink attachments 2023-11-30 19:26:00 -05:00
Vijay Uppu
42295d68df Return Employee ID for POST 2023-11-28 12:07:34 -05:00
Vijay Uppu
b7ba8c499c fixed question translation issue 2023-11-15 12:35:45 -05:00
Vijay Uppu
f8912ce31a Added new endpoint for creating multiple questions 2023-11-14 15:28:59 -05:00
Vijay Uppu
eb0df19522 added new endpoint to generate dade school token 2023-11-13 15:42:45 -05:00
uppuv
126da500a1 fixed survey issue in response level, and added logic for start and end
date as optional date.
2023-11-05 13:39:56 -05:00
uppuv
b569f6d404 app settings changes 2023-10-22 10:52:43 -04:00
uppuv
94ea46c466 migrated user access module with latest docker branch changes for In memory 2023-10-20 12:40:03 -04:00
Reginald CHERENFANT JASMIN
15acd00959 Project Folder Name changed from SurveyResponses to Responses 2023-09-26 15:38:59 -05:00
Reginald CHERENFANT JASMIN
46520c7e62 Update test case project for UserAccess and SurveyResponse modules. Renaming of SurveyResponses to Responses. 2023-09-26 15:22:26 -05:00
Reginald Cherenfant Jasmin
f6387fc371 adding Test project for userAccess module 2023-09-26 01:13:19 -04:00
Reginald CHERENFANT JASMIN
4ebd40108d Dadeschools JWT based authentication integration 2023-09-20 09:47:27 -05:00
Reginald Cherenfant Jasmin
77816605d1 implementation of Authentication using JWT. Security applied on all microservices endpoints. 2023-09-20 00:32:30 -04:00
140 changed files with 3019 additions and 627 deletions

View File

@ -0,0 +1,25 @@
**/.classpath
**/.dockerignore
**/.env
**/.git
**/.gitignore
**/.project
**/.settings
**/.toolstarget
**/.vs
**/.vscode
**/*.*proj.user
**/*.dbmdl
**/*.jfm
**/azds.yaml
**/bin
**/charts
**/docker-compose*
**/Dockerfile*
**/node_modules
**/npm-debug.log
**/obj
**/secrets.dev.yaml
**/values.dev.yaml
LICENSE
README.md

View File

@ -1,7 +1,6 @@
using DamageAssesment.Api.Answers.Interfaces; using DamageAssesment.Api.Answers.Interfaces;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Microsoft.OpenApi.Any;
namespace DamageAssesment.Api.Answers.Controllers namespace DamageAssesment.Api.Answers.Controllers
{ {
@ -16,7 +15,7 @@ namespace DamageAssesment.Api.Answers.Controllers
/// <summary> /// <summary>
/// Get all answers /// Get all answers
/// </summary> /// </summary>
[Authorize(Roles = "admin")]
[HttpGet("answers")] [HttpGet("answers")]
public async Task<ActionResult> GetAnswersAsync() { public async Task<ActionResult> GetAnswersAsync() {
@ -32,7 +31,7 @@ namespace DamageAssesment.Api.Answers.Controllers
/// Get an answer based on answerId. /// Get an answer based on answerId.
/// </summary> /// </summary>
[Authorize(Roles = "admin")]
[HttpGet("answers/{id}")] [HttpGet("answers/{id}")]
public async Task<ActionResult> GetAnswerByIdAsync(int id) public async Task<ActionResult> GetAnswerByIdAsync(int id)
{ {
@ -48,6 +47,7 @@ namespace DamageAssesment.Api.Answers.Controllers
/// <summary> /// <summary>
/// Get all answers based on responseId. /// Get all answers based on responseId.
/// </summary> /// </summary>
[Authorize(Roles = "admin")]
[HttpGet("answers/byresponse/{responseid}")] [HttpGet("answers/byresponse/{responseid}")]
public async Task<IActionResult> GetAnswersByResponseId(int responseid) public async Task<IActionResult> GetAnswersByResponseId(int responseid)
{ {
@ -61,7 +61,7 @@ namespace DamageAssesment.Api.Answers.Controllers
/// <summary> /// <summary>
/// Get all answers based on questionId. /// Get all answers based on questionId.
/// </summary> /// </summary>
[Authorize(Roles = "admin")]
[HttpGet("answers/byquestion/{questionid}")] [HttpGet("answers/byquestion/{questionid}")]
public async Task<IActionResult> AnswersByQuestionId(int questionid) public async Task<IActionResult> AnswersByQuestionId(int questionid)
{ {
@ -75,7 +75,7 @@ namespace DamageAssesment.Api.Answers.Controllers
/// <summary> /// <summary>
/// Update an existing answer. /// Update an existing answer.
/// </summary> /// </summary>
[Authorize(Roles = "admin")]
[HttpPut("answers")] [HttpPut("answers")]
public async Task<IActionResult> UpdateAnswer(Models.Answer answer) public async Task<IActionResult> UpdateAnswer(Models.Answer answer)
{ {
@ -96,7 +96,7 @@ namespace DamageAssesment.Api.Answers.Controllers
/// <summary> /// <summary>
/// Save a new answer. /// Save a new answer.
/// </summary> /// </summary>
[Authorize(Roles = "admin")]
[HttpPost("answers")] [HttpPost("answers")]
public async Task<IActionResult> CreateAnswer(Models.Answer answer) public async Task<IActionResult> CreateAnswer(Models.Answer answer)
{ {
@ -114,7 +114,7 @@ namespace DamageAssesment.Api.Answers.Controllers
/// <summary> /// <summary>
/// Delete an existing answer. /// Delete an existing answer.
/// </summary> /// </summary>
[Authorize(Roles = "admin")]
[HttpDelete("answers/{id}")] [HttpDelete("answers/{id}")]
public async Task<IActionResult> DeleteAnswer(int id) public async Task<IActionResult> DeleteAnswer(int id)
{ {

View File

@ -1,10 +1,12 @@
<Project Sdk="Microsoft.NET.Sdk.Web"> <Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup> <PropertyGroup>
<TargetFramework>net6.0</TargetFramework> <TargetFramework>net6.0</TargetFramework>
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
<GenerateDocumentationFile>True</GenerateDocumentationFile> <GenerateDocumentationFile>True</GenerateDocumentationFile>
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
<DockerComposeProjectPath>..\docker-compose.dcproj</DockerComposeProjectPath>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
@ -12,6 +14,7 @@
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.21" /> <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.21" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.9" /> <PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.9" />
<PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="7.0.9" /> <PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="7.0.9" />
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.19.4" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" /> <PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" />
</ItemGroup> </ItemGroup>

View File

@ -3,7 +3,6 @@ using System.ComponentModel.DataAnnotations.Schema;
namespace DamageAssesment.Api.Answers.Db namespace DamageAssesment.Api.Answers.Db
{ {
[Table("Answers")]
public class Answer public class Answer
{ {
[Key] [Key]

View File

@ -0,0 +1,21 @@
#See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging.
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["DamageAssesment.Api.Answers/DamageAssesment.Api.Answers.csproj", "DamageAssesment.Api.Answers/"]
RUN dotnet restore "DamageAssesment.Api.Answers/DamageAssesment.Api.Answers.csproj"
COPY . .
WORKDIR "/src/DamageAssesment.Api.Answers"
RUN dotnet build "DamageAssesment.Api.Answers.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "DamageAssesment.Api.Answers.csproj" -c Release -o /app/publish /p:UseAppHost=false
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "DamageAssesment.Api.Answers.dll"]

View File

@ -1,23 +1,73 @@
using DamageAssesment.Api.Answers.Db; using DamageAssesment.Api.Answers.Db;
using DamageAssesment.Api.Answers.Interfaces; using DamageAssesment.Api.Answers.Interfaces;
using DamageAssesment.Api.Answers.Providers; using DamageAssesment.Api.Answers.Providers;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.IdentityModel.Tokens;
using Microsoft.OpenApi.Models;
using System.Reflection; using System.Reflection;
using System.Text;
var builder = WebApplication.CreateBuilder(args); var builder = WebApplication.CreateBuilder(args);
var authkey = builder.Configuration.GetValue<string>("JwtSettings:securitykey");
builder.Services.AddAuthentication(item =>
{
item.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
item.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(item =>
{
item.RequireHttpsMetadata = true;
item.SaveToken = true;
item.TokenValidationParameters = new TokenValidationParameters()
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(authkey)),
ValidateIssuer = false,
ValidateAudience = false,
ClockSkew = TimeSpan.Zero
};
});
// Add services to the container. // Add services to the container.
builder.Services.AddControllers(); builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer(); builder.Services.AddEndpointsApiExplorer();
//builder.Services.AddSwaggerGen(); //builder.Services.AddSwaggerGen();
builder.Services.AddSwaggerGen(c => builder.Services.AddSwaggerGen(options =>
{ {
// Include XML comments from your assembly // Include XML comments from your assembly
var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"; var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile); 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<IAnswersProvider, AnswersProvider>(); builder.Services.AddScoped<IAnswersProvider, AnswersProvider>();
builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies()); //4/30 builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies()); //4/30
@ -35,7 +85,7 @@ if (app.Environment.IsDevelopment())
app.UseSwagger(); app.UseSwagger();
app.UseSwaggerUI(); app.UseSwaggerUI();
} }
app.UseAuthentication();
app.UseAuthorization(); app.UseAuthorization();
app.MapControllers(); app.MapControllers();

View File

@ -1,23 +1,14 @@
{ {
"$schema": "https://json.schemastore.org/launchsettings.json",
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:18005",
"sslPort": 0
}
},
"profiles": { "profiles": {
"DamageAssesment.Api.Answers": { "DamageAssesment.Api.Answers": {
"commandName": "Project", "commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true, "launchBrowser": true,
"launchUrl": "swagger", "launchUrl": "swagger",
"applicationUrl": "http://localhost:5200",
"environmentVariables": { "environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development" "ASPNETCORE_ENVIRONMENT": "Development"
} },
"dotnetRunMessages": true,
"applicationUrl": "http://localhost:5200"
}, },
"IIS Express": { "IIS Express": {
"commandName": "IISExpress", "commandName": "IISExpress",
@ -26,6 +17,24 @@
"environmentVariables": { "environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development" "ASPNETCORE_ENVIRONMENT": "Development"
} }
},
"Docker": {
"commandName": "Docker",
"launchBrowser": true,
"launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}/swagger",
"environmentVariables": {
"ASPNETCORE_URLS": "http://+:80"
},
"publishAllPorts": true
}
},
"$schema": "https://json.schemastore.org/launchsettings.json",
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:18005",
"sslPort": 0
} }
} }
} }

View File

@ -0,0 +1,8 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
}
}

View File

@ -1,6 +1,7 @@
using Azure; using Azure;
using DamageAssesment.Api.Attachments.Interfaces; using DamageAssesment.Api.Attachments.Interfaces;
using DamageAssesment.Api.Attachments.Models; using DamageAssesment.Api.Attachments.Models;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using System.Net.Http.Headers; using System.Net.Http.Headers;
@ -21,7 +22,7 @@ namespace DamageAssesment.Api.Attachments.Controllers
/// <summary> /// <summary>
/// Get all attachments. /// Get all attachments.
/// </summary> /// </summary>
[Authorize(Roles = "admin")]
[HttpGet("attachments")] [HttpGet("attachments")]
public async Task<ActionResult> GetAttachmentsAsync() public async Task<ActionResult> GetAttachmentsAsync()
{ {
@ -37,6 +38,7 @@ namespace DamageAssesment.Api.Attachments.Controllers
/// <summary> /// <summary>
/// Get all attachments by attachmentId. /// Get all attachments by attachmentId.
/// </summary> /// </summary>
[Authorize(Roles = "admin")]
[HttpGet("attachments/{id}")] [HttpGet("attachments/{id}")]
public async Task<ActionResult> GetAttachmentbyIdAsync(int id) public async Task<ActionResult> GetAttachmentbyIdAsync(int id)
{ {
@ -80,7 +82,7 @@ namespace DamageAssesment.Api.Attachments.Controllers
/// <summary> /// <summary>
/// Save new Attachment(s) /// Save new Attachment(s)
/// </summary> /// </summary>
[Authorize(Roles = "admin")]
[HttpPost("attachments"), DisableRequestSizeLimit] [HttpPost("attachments"), DisableRequestSizeLimit]
public async Task<IActionResult> UploadAttachmentAsync(AttachmentInfo attachmentInfo) public async Task<IActionResult> UploadAttachmentAsync(AttachmentInfo attachmentInfo)
{ {
@ -107,7 +109,7 @@ namespace DamageAssesment.Api.Attachments.Controllers
/// <summary> /// <summary>
/// Modify an new attachment. /// Modify an new attachment.
/// </summary> /// </summary>
[Authorize(Roles = "admin")]
[HttpPut("attachments"), DisableRequestSizeLimit] [HttpPut("attachments"), DisableRequestSizeLimit]
public async Task<IActionResult> UpdateAttachmentAsync(AttachmentInfo attachmentInfo) public async Task<IActionResult> UpdateAttachmentAsync(AttachmentInfo attachmentInfo)
{ {
@ -138,6 +140,7 @@ namespace DamageAssesment.Api.Attachments.Controllers
/// <summary> /// <summary>
/// download an existing attachment. /// download an existing attachment.
/// </summary> /// </summary>
[Authorize(Roles = "admin")]
[HttpGet("attachments/download/{id}")] [HttpGet("attachments/download/{id}")]
public async Task<IActionResult> downloadfile(int id) public async Task<IActionResult> downloadfile(int id)
{ {
@ -212,6 +215,7 @@ namespace DamageAssesment.Api.Attachments.Controllers
/// <summary> /// <summary>
/// Delete an existing attachment. /// Delete an existing attachment.
/// </summary> /// </summary>
[Authorize(Roles = "admin")]
[HttpDelete("attachments/{id}")] [HttpDelete("attachments/{id}")]
public async Task<IActionResult> DeleteAttachment(int id) public async Task<IActionResult> DeleteAttachment(int id)
{ {

View File

@ -5,6 +5,8 @@
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
<GenerateDocumentationFile>True</GenerateDocumentationFile> <GenerateDocumentationFile>True</GenerateDocumentationFile>
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
<DockerComposeProjectPath>..\docker-compose.dcproj</DockerComposeProjectPath>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
@ -14,6 +16,7 @@
<PackageReference Include="Microsoft.AspNetCore.Hosting" Version="2.2.7" /> <PackageReference Include="Microsoft.AspNetCore.Hosting" Version="2.2.7" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.5" /> <PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.5" />
<PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="7.0.5" /> <PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="7.0.5" />
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.19.4" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" /> <PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" />
</ItemGroup> </ItemGroup>

View File

@ -3,7 +3,6 @@ using System.ComponentModel.DataAnnotations.Schema;
namespace DamageAssesment.Api.Attachments.Db namespace DamageAssesment.Api.Attachments.Db
{ {
[Table("AnswerAttachments")]
public class Attachment public class Attachment
{ {
[Key] [Key]

View File

@ -0,0 +1,29 @@
#See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging.
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["DamageAssesment.Api.Attachments/DamageAssesment.Api.Attachments.csproj", "DamageAssesment.Api.Attachments/"]
RUN dotnet restore "DamageAssesment.Api.Attachments/DamageAssesment.Api.Attachments.csproj"
COPY . .
WORKDIR "/src/DamageAssesment.Api.Attachments"
RUN dotnet build "DamageAssesment.Api.Attachments.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "DamageAssesment.Api.Attachments.csproj" -c Release -o /app/publish /p:UseAppHost=false
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
# Create directories for attachments and set permissions
RUN mkdir -p /app/DMS_Attachments/Active && \
mkdir -p /app/DMS_Attachments/Deleted && \
chown -R www-data:www-data /app/DMS_Attachments
# Update appsettings.json with the correct paths for attachments
RUN sed -i 's#"folderpath": "DMS_Attachments/Active"#"folderpath": "/app/DMS_Attachments/Active"#' appsettings.json && \
sed -i 's#"Deletepath": "DMS_Attachments/Deleted"#"Deletepath": "/app/DMS_Attachments/Deleted"#' appsettings.json
ENTRYPOINT ["dotnet", "DamageAssesment.Api.Attachments.dll"]

View File

@ -1,25 +1,75 @@
using DamageAssesment.Api.Attachments.Db; using DamageAssesment.Api.Attachments.Db;
using DamageAssesment.Api.Attachments.Interfaces; using DamageAssesment.Api.Attachments.Interfaces;
using DamageAssesment.Api.Attachments.Providers; using DamageAssesment.Api.Attachments.Providers;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Http.Features; using Microsoft.AspNetCore.Http.Features;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.FileProviders; using Microsoft.Extensions.FileProviders;
using Microsoft.IdentityModel.Tokens;
using Microsoft.OpenApi.Models;
using System.Reflection; using System.Reflection;
using System.Text;
var builder = WebApplication.CreateBuilder(args); var builder = WebApplication.CreateBuilder(args);
var authkey = builder.Configuration.GetValue<string>("JwtSettings:securitykey");
builder.Services.AddAuthentication(item =>
{
item.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
item.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(item =>
{
item.RequireHttpsMetadata = true;
item.SaveToken = true;
item.TokenValidationParameters = new TokenValidationParameters()
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(authkey)),
ValidateIssuer = false,
ValidateAudience = false,
ClockSkew = TimeSpan.Zero
};
});
// Add services to the container. // Add services to the container.
builder.Services.AddControllers(); builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer(); builder.Services.AddEndpointsApiExplorer();
//builder.Services.AddSwaggerGen(); //builder.Services.AddSwaggerGen();
builder.Services.AddSwaggerGen(c => builder.Services.AddSwaggerGen(options =>
{ {
// Include XML comments from your assembly // Include XML comments from your assembly
var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"; var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile); 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.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); builder.Services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
builder.Services.AddScoped<IAttachmentsProvider, AttachmentsProvider>(); builder.Services.AddScoped<IAttachmentsProvider, AttachmentsProvider>();
@ -46,6 +96,7 @@ if (app.Environment.IsDevelopment())
app.UseSwaggerUI(); app.UseSwaggerUI();
} }
app.UseAuthentication();
app.UseAuthorization(); app.UseAuthorization();
app.UseHttpsRedirection(); app.UseHttpsRedirection();

View File

@ -1,23 +1,14 @@
{ {
"$schema": "https://json.schemastore.org/launchsettings.json",
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:65305",
"sslPort": 0
}
},
"profiles": { "profiles": {
"DamageAssesment.Api.Attachments": { "DamageAssesment.Api.Attachments": {
"commandName": "Project", "commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true, "launchBrowser": true,
"launchUrl": "swagger", "launchUrl": "swagger",
"applicationUrl": "http://localhost:5243",
"environmentVariables": { "environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development" "ASPNETCORE_ENVIRONMENT": "Development"
} },
"dotnetRunMessages": true,
"applicationUrl": "http://localhost:5243"
}, },
"IIS Express": { "IIS Express": {
"commandName": "IISExpress", "commandName": "IISExpress",
@ -26,6 +17,24 @@
"environmentVariables": { "environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development" "ASPNETCORE_ENVIRONMENT": "Development"
} }
},
"Docker": {
"commandName": "Docker",
"launchBrowser": true,
"launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}/swagger",
"environmentVariables": {
"ASPNETCORE_URLS": "http://+:80"
},
"publishAllPorts": true
}
},
"$schema": "https://json.schemastore.org/launchsettings.json",
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:65305",
"sslPort": 0
} }
} }
} }

View File

@ -0,0 +1,8 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
}
}

View File

@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFramework>net6.0</TargetFramework> <TargetFramework>net6.0</TargetFramework>

View File

@ -2,8 +2,10 @@
using DamageAssesment.Api.DocuLinks.Interfaces; using DamageAssesment.Api.DocuLinks.Interfaces;
using DamageAssesment.Api.DocuLinks.Models; using DamageAssesment.Api.DocuLinks.Models;
using DamageAssesment.Api.DocuLinks.Providers; using DamageAssesment.Api.DocuLinks.Providers;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using System.Data;
namespace DamageAssesment.Api.DocuLinks.Controllers namespace DamageAssesment.Api.DocuLinks.Controllers
{ {
@ -24,6 +26,7 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
/// Get all Doculink type. /// Get all Doculink type.
/// </summary> /// </summary>
[HttpGet] [HttpGet]
[Authorize(Roles = "admin")]
[Route("doculinks/types")] [Route("doculinks/types")]
[Route("doculinks/types/{language:alpha}")] [Route("doculinks/types/{language:alpha}")]
public async Task<IActionResult> GetLinkTypesAsync(string? language) public async Task<IActionResult> GetLinkTypesAsync(string? language)
@ -38,10 +41,11 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
/// <summary> /// <summary>
/// Get a Doculink type by id. /// Get a Doculink type by id.
/// </summary> /// </summary>
[HttpGet] [Authorize(Roles = "admin")]
[Route("doculinks/types/{id}")] [Route("doculinks/types/{id}")]
[Route("doculinks/types/{id}/{language:alpha}")] [Route("doculinks/types/{id}/{language:alpha}")]
public async Task<IActionResult> GetLinkTypeAsync(int id, string? language) [HttpGet]
public async Task<IActionResult> GetLinkTypeAsync(int id,string? language)
{ {
var result = await this.documentsProvider.GetLinkTypeAsync(id, language); var result = await this.documentsProvider.GetLinkTypeAsync(id, language);
if (result.IsSuccess) if (result.IsSuccess)
@ -53,6 +57,7 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
/// <summary> /// <summary>
/// Update a existing Doculink type. /// Update a existing Doculink type.
/// </summary> /// </summary>
[Authorize(Roles = "admin")]
[HttpPut] [HttpPut]
[Route("doculinks/types/{id}")] [Route("doculinks/types/{id}")]
public async Task<IActionResult> UpdateLinkType(int id, Models.LinkType linkType) public async Task<IActionResult> UpdateLinkType(int id, Models.LinkType linkType)
@ -74,6 +79,7 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
/// <summary> /// <summary>
/// Create a new Doculink type. /// Create a new Doculink type.
/// </summary> /// </summary>
[Authorize(Roles = "admin")]
[HttpPost] [HttpPost]
[Route("doculinks/types")] [Route("doculinks/types")]
public async Task<IActionResult> CreateLinkType(Models.LinkType linkType) public async Task<IActionResult> CreateLinkType(Models.LinkType linkType)
@ -92,6 +98,7 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
/// <summary> /// <summary>
/// Delete a existing Doculink type by id. /// Delete a existing Doculink type by id.
/// </summary> /// </summary>
[Authorize(Roles = "admin")]
[HttpDelete] [HttpDelete]
[Route("doculinks/types/{id}")] [Route("doculinks/types/{id}")]
public async Task<IActionResult> DeleteLinkType(int id) public async Task<IActionResult> DeleteLinkType(int id)
@ -106,6 +113,7 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
/// <summary> /// <summary>
/// download an existing attachment. /// download an existing attachment.
/// </summary> /// </summary>
[Authorize(Roles = "admin")]
[HttpGet("doculinks/download/{id}")] [HttpGet("doculinks/download/{id}")]
public async Task<IActionResult> downloadfile(int id) public async Task<IActionResult> downloadfile(int id)
{ {
@ -180,7 +188,8 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
/// <summary> /// <summary>
/// Get all Doculink. /// Get all Doculink.
/// </summary> /// </summary>
///
[Authorize(Roles = "admin")]
[Route("doculinks")] [Route("doculinks")]
[Route("doculinks/{linktype:alpha}")] [Route("doculinks/{linktype:alpha}")]
[Route("doculinks/{linktype:alpha}/{language:alpha}")] [Route("doculinks/{linktype:alpha}/{language:alpha}")]
@ -197,6 +206,7 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
/// <summary> /// <summary>
/// Get all active Doculink. /// Get all active Doculink.
/// </summary> /// </summary>
[Authorize(Roles = "admin")]
[Route("doculinks/active")] [Route("doculinks/active")]
[Route("doculinks/active/{linktype:alpha}")] [Route("doculinks/active/{linktype:alpha}")]
[Route("doculinks/active/{linktype:alpha}/{language:alpha}")] [Route("doculinks/active/{linktype:alpha}/{language:alpha}")]
@ -213,6 +223,7 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
/// <summary> /// <summary>
/// Get all active Doculink. /// Get all active Doculink.
/// </summary> /// </summary>
[Authorize(Roles = "admin")]
[Route("doculinks/active/{linktypeid:int}")] [Route("doculinks/active/{linktypeid:int}")]
[Route("doculinks/active/{linktypeid:int}/{language:alpha}")] [Route("doculinks/active/{linktypeid:int}/{language:alpha}")]
[HttpGet] [HttpGet]
@ -228,6 +239,7 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
/// <summary> /// <summary>
/// Get a Doculink by id. /// Get a Doculink by id.
/// </summary> /// </summary>
[Authorize(Roles = "admin")]
[HttpGet] [HttpGet]
[Route("doculinks/{id}")] [Route("doculinks/{id}")]
[Route("doculinks/{id}/{linktype:alpha}")] [Route("doculinks/{id}/{linktype:alpha}")]
@ -242,8 +254,9 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
return NotFound(); return NotFound();
} }
/// <summary> /// <summary>
/// update existing doclink. /// Upload new document.
/// </summary> /// </summary>
[Authorize(Roles = "admin")]
[HttpPut] [HttpPut]
[Route("doculinks/{id}")] [Route("doculinks/{id}")]
public async Task<IActionResult> UpdateDocument(int id, ReqDoculink documentInfo) public async Task<IActionResult> UpdateDocument(int id, ReqDoculink documentInfo)
@ -283,6 +296,7 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
/// <summary> /// <summary>
/// Create new doclink. /// Create new doclink.
/// </summary> /// </summary>
[Authorize(Roles = "admin")]
[HttpPost] [HttpPost]
[Route("doculinks")] [Route("doculinks")]
public async Task<IActionResult> CreateDocument(ReqDoculink documentInfo) public async Task<IActionResult> CreateDocument(ReqDoculink documentInfo)
@ -308,8 +322,9 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
} }
} }
/// <summary> /// <summary>
/// Delete Doculink by id. /// Delete document by id.
/// </summary> /// </summary>
[Authorize(Roles = "admin")]
[HttpDelete] [HttpDelete]
[Route("doculinks/{id}")] [Route("doculinks/{id}")]
public async Task<IActionResult> DeleteDocument(int id) public async Task<IActionResult> DeleteDocument(int id)

View File

@ -1,15 +1,18 @@
<Project Sdk="Microsoft.NET.Sdk.Web"> <Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup> <PropertyGroup>
<TargetFramework>net6.0</TargetFramework> <TargetFramework>net6.0</TargetFramework>
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
<GenerateDocumentationFile>True</GenerateDocumentationFile> <GenerateDocumentationFile>True</GenerateDocumentationFile>
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
<DockerComposeProjectPath>..\docker-compose.dcproj</DockerComposeProjectPath>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="12.0.1" /> <PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="12.0.1" />
<PackageReference Include="Azure.Storage.Blobs" Version="12.16.0" /> <PackageReference Include="Azure.Storage.Blobs" Version="12.16.0" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.21" />
<PackageReference Include="Microsoft.AspNetCore.Hosting" Version="2.2.7" /> <PackageReference Include="Microsoft.AspNetCore.Hosting" Version="2.2.7" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.9" /> <PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.9" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="7.0.9"> <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="7.0.9">
@ -22,6 +25,7 @@
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference> </PackageReference>
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.19.4" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" /> <PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" />
</ItemGroup> </ItemGroup>

View File

@ -3,7 +3,6 @@ using System.ComponentModel.DataAnnotations.Schema;
namespace DamageAssesment.Api.DocuLinks.Db namespace DamageAssesment.Api.DocuLinks.Db
{ {
[Table("Doculinks")]
public class Doculink public class Doculink
{ {
[Key] [Key]

View File

@ -3,7 +3,6 @@ using System.ComponentModel.DataAnnotations;
namespace DamageAssesment.Api.DocuLinks.Db namespace DamageAssesment.Api.DocuLinks.Db
{ {
[Table("DoculinkAttachments")]
public class DoculinkAttachments public class DoculinkAttachments
{ {

View File

@ -3,7 +3,6 @@ using System.ComponentModel.DataAnnotations.Schema;
namespace DamageAssesment.Api.DocuLinks.Db namespace DamageAssesment.Api.DocuLinks.Db
{ {
[Table("DoculinkTrans")]
public class DoculinkTranslation public class DoculinkTranslation
{ {
[Key] [Key]

View File

@ -1,9 +1,7 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace DamageAssesment.Api.DocuLinks.Db namespace DamageAssesment.Api.DocuLinks.Db
{ {
[Table("DoculinkTypes")]
public class LinkType public class LinkType
{ {
[Key] [Key]

View File

@ -3,7 +3,6 @@ using System.ComponentModel.DataAnnotations;
namespace DamageAssesment.Api.DocuLinks.Db namespace DamageAssesment.Api.DocuLinks.Db
{ {
[Table("DoculinkTypeTrans")]
public class LinksTranslation public class LinksTranslation
{ {
[Key] [Key]

View File

@ -0,0 +1,30 @@
#See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging.
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["DamageAssesment.Api.DocuLinks/DamageAssesment.Api.DocuLinks.csproj", "DamageAssesment.Api.DocuLinks/"]
RUN dotnet restore "DamageAssesment.Api.DocuLinks/DamageAssesment.Api.DocuLinks.csproj"
COPY . .
WORKDIR "/src/DamageAssesment.Api.DocuLinks"
RUN dotnet build "DamageAssesment.Api.DocuLinks.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "DamageAssesment.Api.DocuLinks.csproj" -c Release -o /app/publish /p:UseAppHost=false
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
# Create directories for attachments and set permissions
RUN mkdir -p /app/DASA_Documents/Active && \
mkdir -p /app/DASA_Documents/Deleted && \
chown -R www-data:www-data /app/DASA_Documents
# Update appsettings.json with the correct paths for attachments
RUN sed -i 's#"folderpath": "DASA_Documents/Active"#"folderpath": "/app/DASA_Documents/Active"#' appsettings.json && \
sed -i 's#"Deletepath": "DASA_Documents/Deleted"#"Deletepath": "/app/DASA_Documents/Deleted"#' appsettings.json
ENTRYPOINT ["dotnet", "DamageAssesment.Api.DocuLinks.dll"]

View File

@ -2,19 +2,69 @@ using DamageAssesment.Api.DocuLinks.Db;
using DamageAssesment.Api.DocuLinks.Interfaces; using DamageAssesment.Api.DocuLinks.Interfaces;
using DamageAssesment.Api.DocuLinks.Providers; using DamageAssesment.Api.DocuLinks.Providers;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
using System.Reflection; using System.Reflection;
using System.Text;
using Microsoft.OpenApi.Models;
var builder = WebApplication.CreateBuilder(args); var builder = WebApplication.CreateBuilder(args);
// Add services to the container. // Add services to the container.
var authkey = builder.Configuration.GetValue<string>("JwtSettings:securitykey");
builder.Services.AddAuthentication(item =>
{
item.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
item.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(item =>
{
item.RequireHttpsMetadata = true;
item.SaveToken = true;
item.TokenValidationParameters = new TokenValidationParameters()
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(authkey)),
ValidateIssuer = false,
ValidateAudience = false,
ClockSkew = TimeSpan.Zero
};
});
builder.Services.AddControllers(); builder.Services.AddControllers();
builder.Services.AddSwaggerGen(c => builder.Services.AddSwaggerGen(options =>
{ {
// Include XML comments from your assembly // Include XML comments from your assembly
var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"; var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile); 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 // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer(); builder.Services.AddEndpointsApiExplorer();
@ -37,6 +87,7 @@ if (app.Environment.IsDevelopment())
app.UseSwaggerUI(); app.UseSwaggerUI();
} }
app.UseAuthentication();
app.UseAuthorization(); app.UseAuthorization();
app.MapControllers(); app.MapControllers();

View File

@ -1,23 +1,15 @@
{ {
"$schema": "https://json.schemastore.org/launchsettings.json",
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:60754",
"sslPort": 0
}
},
"profiles": { "profiles": {
"DamageAssesment.Api.Questions": { "DamageAssesment.Api.Doculinks": {
"commandName": "Project", "commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true, "launchBrowser": true,
"launchUrl": "swagger", "launchUrl": "swagger",
"applicationUrl": "http://localhost:5133", "applicationUrl": "http://localhost:5133",
"environmentVariables": { "environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development" "ASPNETCORE_ENVIRONMENT": "Development"
} },
"dotnetRunMessages": true,
"applicationUrl": "http://localhost:5136"
}, },
"IIS Express": { "IIS Express": {
"commandName": "IISExpress", "commandName": "IISExpress",
@ -26,6 +18,24 @@
"environmentVariables": { "environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development" "ASPNETCORE_ENVIRONMENT": "Development"
} }
},
"Docker": {
"commandName": "Docker",
"launchBrowser": true,
"launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}/swagger",
"environmentVariables": {
"ASPNETCORE_URLS": "http://+:80"
},
"publishAllPorts": true
}
},
"$schema": "https://json.schemastore.org/launchsettings.json",
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:14425",
"sslPort": 0
} }
} }
} }

View File

@ -0,0 +1,8 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
}
}

View File

@ -6,8 +6,12 @@
} }
}, },
"AllowedHosts": "*", "AllowedHosts": "*",
"JwtSettings": {
"securitykey": "bWlhbWkgZGFkZSBzY2hvb2xzIHNlY3JldCBrZXk="
},
"Fileupload": { "Fileupload": {
"folderpath": "DASA_Documents/Active", "folderpath": "DASA_Documents/Active",
"Deletepath": "DASA_Documents/Deleted" "Deletepath": "DASA_Documents/Deleted"
} }
} }

View File

@ -1,4 +1,5 @@
using DamageAssesment.Api.Employees.Interfaces; using DamageAssesment.Api.Employees.Interfaces;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
@ -18,7 +19,7 @@ namespace DamageAssesment.Api.Employees.Controllers
/// <summary> /// <summary>
/// GET request for retrieving employees. /// GET request for retrieving employees.
/// </summary> /// </summary>
[Authorize(Roles = "admin")]
[HttpGet("employees")] [HttpGet("employees")]
public async Task<ActionResult> GetEmployeesAsync() public async Task<ActionResult> GetEmployeesAsync()
{ {
@ -35,7 +36,7 @@ namespace DamageAssesment.Api.Employees.Controllers
/// <summary> /// <summary>
/// GET request for retrieving an employee by ID. /// GET request for retrieving an employee by ID.
/// </summary> /// </summary>
[Authorize(Roles = "admin")]
[HttpGet("employees/{id}")] [HttpGet("employees/{id}")]
public async Task<ActionResult> GetEmployeeByIdAsync(int id) public async Task<ActionResult> GetEmployeeByIdAsync(int id)
{ {
@ -53,6 +54,7 @@ namespace DamageAssesment.Api.Employees.Controllers
/// PUT request for updating an existing employee. /// PUT request for updating an existing employee.
/// </summary> /// </summary>
/// <param name="Employee">The updated employee object.</param> /// <param name="Employee">The updated employee object.</param>
[Authorize(Roles = "admin")]
[HttpPut("employees/{id}")] [HttpPut("employees/{id}")]
public async Task<IActionResult> UpdateEmployee(int id, Models.Employee Employee) public async Task<IActionResult> UpdateEmployee(int id, Models.Employee Employee)
{ {
@ -75,6 +77,7 @@ namespace DamageAssesment.Api.Employees.Controllers
/// POST request for creating a new employee. /// POST request for creating a new employee.
/// </summary> /// </summary>
/// <param name="Employee">The employee information for creating a new employee.</param> /// <param name="Employee">The employee information for creating a new employee.</param>
[Authorize(Roles = "admin")]
[HttpPost("employees")] [HttpPost("employees")]
public async Task<IActionResult> CreateEmployee(Models.Employee Employee) public async Task<IActionResult> CreateEmployee(Models.Employee Employee)
{ {
@ -93,6 +96,7 @@ namespace DamageAssesment.Api.Employees.Controllers
/// DELETE request for deleting an existing employee. /// DELETE request for deleting an existing employee.
/// </summary> /// </summary>
/// <param name="id">The ID of the employee to be deleted.</param> /// <param name="id">The ID of the employee to be deleted.</param>
[Authorize(Roles = "admin")]
[HttpDelete("employees/{id}")] [HttpDelete("employees/{id}")]
public async Task<IActionResult> DeleteEmployee(int id) public async Task<IActionResult> DeleteEmployee(int id)
{ {

View File

@ -5,6 +5,8 @@
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
<GenerateDocumentationFile>True</GenerateDocumentationFile> <GenerateDocumentationFile>True</GenerateDocumentationFile>
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
<DockerComposeProjectPath>..\docker-compose.dcproj</DockerComposeProjectPath>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
@ -12,6 +14,7 @@
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.21" /> <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.21" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.5" /> <PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.5" />
<PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="7.0.5" /> <PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="7.0.5" />
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.19.4" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" /> <PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" />
</ItemGroup> </ItemGroup>

View File

@ -1,9 +1,7 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace DamageAssesment.Api.Employees.Db namespace DamageAssesment.Api.Employees.Db
{ {
[Table("Employees")]
public class Employee public class Employee
{ {
[Key] [Key]

View File

@ -0,0 +1,21 @@
#See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging.
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["DamageAssesment.Api.Employees/DamageAssesment.Api.Employees.csproj", "DamageAssesment.Api.Employees/"]
RUN dotnet restore "DamageAssesment.Api.Employees/DamageAssesment.Api.Employees.csproj"
COPY . .
WORKDIR "/src/DamageAssesment.Api.Employees"
RUN dotnet build "DamageAssesment.Api.Employees.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "DamageAssesment.Api.Employees.csproj" -c Release -o /app/publish /p:UseAppHost=false
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "DamageAssesment.Api.Employees.dll"]

View File

@ -1,23 +1,74 @@
using DamageAssesment.Api.Employees.Db; using DamageAssesment.Api.Employees.Db;
using DamageAssesment.Api.Employees.Interfaces; using DamageAssesment.Api.Employees.Interfaces;
using DamageAssesment.Api.Employees.Providers; using DamageAssesment.Api.Employees.Providers;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.IdentityModel.Tokens;
using Microsoft.OpenApi.Models;
using System.Reflection; using System.Reflection;
using System.Text;
var builder = WebApplication.CreateBuilder(args); var builder = WebApplication.CreateBuilder(args);
// Add services to the container. // Add services to the container.
var authkey = builder.Configuration.GetValue<string>("JwtSettings:securitykey");
builder.Services.AddAuthentication(item =>
{
item.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
item.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(item =>
{
item.RequireHttpsMetadata = true;
item.SaveToken = true;
item.TokenValidationParameters = new TokenValidationParameters()
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(authkey)),
ValidateIssuer = false,
ValidateAudience = false,
ClockSkew = TimeSpan.Zero
};
});
builder.Services.AddControllers(); builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer(); builder.Services.AddEndpointsApiExplorer();
//builder.Services.AddSwaggerGen(); //builder.Services.AddSwaggerGen();
builder.Services.AddSwaggerGen(c => builder.Services.AddSwaggerGen(options =>
{ {
// Include XML comments from your assembly // Include XML comments from your assembly
var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"; var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile); 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<IEmployeesProvider, EmployeesProvider>(); builder.Services.AddScoped<IEmployeesProvider, EmployeesProvider>();
@ -43,6 +94,7 @@ if (app.Environment.IsDevelopment())
} }
} }
app.UseAuthentication();
app.UseAuthorization(); app.UseAuthorization();
app.MapControllers(); app.MapControllers();

View File

@ -1,23 +1,14 @@
{ {
"$schema": "https://json.schemastore.org/launchsettings.json",
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:14425",
"sslPort": 0
}
},
"profiles": { "profiles": {
"DamageAssesment.Api.Employees": { "DamageAssesment.Api.Employees": {
"commandName": "Project", "commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true, "launchBrowser": true,
"launchUrl": "swagger", "launchUrl": "swagger",
"applicationUrl": "http://localhost:5135",
"environmentVariables": { "environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development" "ASPNETCORE_ENVIRONMENT": "Development"
} },
"dotnetRunMessages": true,
"applicationUrl": "http://localhost:5135"
}, },
"IIS Express": { "IIS Express": {
"commandName": "IISExpress", "commandName": "IISExpress",
@ -26,6 +17,24 @@
"environmentVariables": { "environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development" "ASPNETCORE_ENVIRONMENT": "Development"
} }
},
"Docker": {
"commandName": "Docker",
"launchBrowser": true,
"launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}/swagger",
"environmentVariables": {
"ASPNETCORE_URLS": "http://+:80"
},
"publishAllPorts": true
}
},
"$schema": "https://json.schemastore.org/launchsettings.json",
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:14425",
"sslPort": 0
} }
} }
} }

View File

@ -0,0 +1,8 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
}
}

View File

@ -8,10 +8,5 @@
"Microsoft.AspNetCore": "Warning" "Microsoft.AspNetCore": "Warning"
} }
}, },
"AllowedHosts": "*", "AllowedHosts": "*"
"settings": {
"endpoint1": "xxx",
"endpoint2": "xxx",
"endpoint3": "xxx"
}
} }

View File

@ -1,4 +1,5 @@
using DamageAssesment.Api.Locations.Interfaces; using DamageAssesment.Api.Locations.Interfaces;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
@ -15,7 +16,7 @@ namespace DamageAssesment.Api.Locations.Controllers
/// <summary> /// <summary>
/// Get all locations. /// Get all locations.
/// </summary> /// </summary>
[Authorize(Roles = "admin")]
[HttpGet("locations")] [HttpGet("locations")]
public async Task<ActionResult> GetLocationsAsync() public async Task<ActionResult> GetLocationsAsync()
{ {
@ -31,7 +32,7 @@ namespace DamageAssesment.Api.Locations.Controllers
/// <summary> /// <summary>
/// Get all locations based on locationdId. /// Get all locations based on locationdId.
/// </summary> /// </summary>
[Authorize(Roles = "admin")]
[HttpGet("locations/{id}")] [HttpGet("locations/{id}")]
public async Task<ActionResult> GetLocationByIdAsync(int id) public async Task<ActionResult> GetLocationByIdAsync(int id)
{ {
@ -47,7 +48,7 @@ namespace DamageAssesment.Api.Locations.Controllers
/// <summary> /// <summary>
/// Update a Location. /// Update a Location.
/// </summary> /// </summary>
[Authorize(Roles = "admin")]
[HttpPut("locations/{id}")] [HttpPut("locations/{id}")]
public async Task<IActionResult> UpdateLocation(int id, Models.Location Location) public async Task<IActionResult> UpdateLocation(int id, Models.Location Location)
{ {
@ -65,7 +66,7 @@ namespace DamageAssesment.Api.Locations.Controllers
/// <summary> /// <summary>
/// Save a new location. /// Save a new location.
/// </summary> /// </summary>
[Authorize(Roles = "admin")]
[HttpPost("locations")] [HttpPost("locations")]
public async Task<IActionResult> CreateLocation(Models.Location Location) public async Task<IActionResult> CreateLocation(Models.Location Location)
{ {
@ -83,7 +84,7 @@ namespace DamageAssesment.Api.Locations.Controllers
/// <summary> /// <summary>
/// Delete an existing location. /// Delete an existing location.
/// </summary> /// </summary>
[Authorize(Roles = "admin")]
[HttpDelete("locations/{id}")] [HttpDelete("locations/{id}")]
public async Task<IActionResult> DeleteLocation(int id) public async Task<IActionResult> DeleteLocation(int id)
{ {

View File

@ -1,4 +1,5 @@
using DamageAssesment.Api.Locations.Interfaces; using DamageAssesment.Api.Locations.Interfaces;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
namespace DamageAssesment.Api.Locations.Controllers namespace DamageAssesment.Api.Locations.Controllers
@ -15,7 +16,7 @@ namespace DamageAssesment.Api.Locations.Controllers
/// <summary> /// <summary>
/// Get all regions.2 /// Get all regions.2
/// </summary> /// </summary>
[Authorize(Roles = "admin")]
[HttpGet("regions")] [HttpGet("regions")]
public async Task<ActionResult> GetRegionsAsync() public async Task<ActionResult> GetRegionsAsync()
{ {
@ -29,7 +30,7 @@ namespace DamageAssesment.Api.Locations.Controllers
/// <summary> /// <summary>
/// GET request for retrieving a region by its ID. /// GET request for retrieving a region by its ID.
/// </summary> /// </summary>
[Authorize(Roles = "admin")]
[HttpGet("regions/{id}")] [HttpGet("regions/{id}")]
public async Task<ActionResult> GetRegionAsync(int id) public async Task<ActionResult> GetRegionAsync(int id)
{ {
@ -43,7 +44,7 @@ namespace DamageAssesment.Api.Locations.Controllers
/// <summary> /// <summary>
/// POST request for creating a new region. /// POST request for creating a new region.
/// </summary> /// </summary>
[Authorize(Roles = "admin")]
[HttpPost("regions")] [HttpPost("regions")]
public async Task<ActionResult> PostRegionAsync(Models.Region region) public async Task<ActionResult> PostRegionAsync(Models.Region region)
{ {
@ -57,7 +58,7 @@ namespace DamageAssesment.Api.Locations.Controllers
/// <summary> /// <summary>
/// PUT request for updating an existing region. /// PUT request for updating an existing region.
/// </summary> /// </summary>
[Authorize(Roles = "admin")]
[HttpPut("regions/{id}")] [HttpPut("regions/{id}")]
public async Task<ActionResult> PutRegionAsync(int id, Models.Region region) public async Task<ActionResult> PutRegionAsync(int id, Models.Region region)
{ {
@ -75,7 +76,7 @@ namespace DamageAssesment.Api.Locations.Controllers
/// DELETE request for deleting a region based on ID. /// DELETE request for deleting a region based on ID.
/// </summary> /// </summary>
[Authorize(Roles = "admin")]
[HttpDelete("regions/{id}")] [HttpDelete("regions/{id}")]
public async Task<ActionResult> DeleteRegionAsync(int id) public async Task<ActionResult> DeleteRegionAsync(int id)
{ {

View File

@ -5,6 +5,8 @@
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
<GenerateDocumentationFile>True</GenerateDocumentationFile> <GenerateDocumentationFile>True</GenerateDocumentationFile>
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
<DockerComposeProjectPath>..\docker-compose.dcproj</DockerComposeProjectPath>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
@ -12,6 +14,7 @@
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.21" /> <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.21" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.5" /> <PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.5" />
<PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="7.0.5" /> <PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="7.0.5" />
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.19.4" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" /> <PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" />
</ItemGroup> </ItemGroup>

View File

@ -3,7 +3,6 @@ using System.ComponentModel.DataAnnotations.Schema;
namespace DamageAssesment.Api.Locations.Db namespace DamageAssesment.Api.Locations.Db
{ {
[Table("Locations")]
public class Location public class Location
{ {
[Key] [Key]
@ -21,10 +20,6 @@ namespace DamageAssesment.Api.Locations.Db
[StringLength(2)] [StringLength(2)]
public string SchoolType { get; set; } public string SchoolType { get; set; }
public int? DataValue { get; set; }
public int? Enrollment { get; set; }
public double? Longitute { get; set; }
public double? Latitude { get; set; }
} }
} }

View File

@ -1,9 +1,7 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace DamageAssesment.Api.Locations.Db namespace DamageAssesment.Api.Locations.Db
{ {
[Table("Regions")]
public class Region public class Region
{ {
[Key] [Key]

View File

@ -0,0 +1,21 @@
#See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging.
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["DamageAssesment.Api.Locations/DamageAssesment.Api.Locations.csproj", "DamageAssesment.Api.Locations/"]
RUN dotnet restore "DamageAssesment.Api.Locations/DamageAssesment.Api.Locations.csproj"
COPY . .
WORKDIR "/src/DamageAssesment.Api.Locations"
RUN dotnet build "DamageAssesment.Api.Locations.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "DamageAssesment.Api.Locations.csproj" -c Release -o /app/publish /p:UseAppHost=false
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "DamageAssesment.Api.Locations.dll"]

View File

@ -11,9 +11,5 @@ namespace DamageAssesment.Api.Locations.Models
public string Name { get; set; } public string Name { get; set; }
public string MaintenanceCenter { get; set; } public string MaintenanceCenter { get; set; }
public string SchoolType { get; set; } public string SchoolType { get; set; }
public int? DataValue { get; set; }
public int? Enrollment { get; set; }
public double? Longitute { get; set; }
public double? Latitude { get; set; }
} }
} }

View File

@ -1,23 +1,73 @@
using DamageAssesment.Api.Locations.Db; using DamageAssesment.Api.Locations.Db;
using DamageAssesment.Api.Locations.Interfaces; using DamageAssesment.Api.Locations.Interfaces;
using DamageAssesment.Api.Locations.Providers; using DamageAssesment.Api.Locations.Providers;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.IdentityModel.Tokens;
using Microsoft.OpenApi.Models;
using System.Reflection; using System.Reflection;
using System.Text;
var builder = WebApplication.CreateBuilder(args); var builder = WebApplication.CreateBuilder(args);
// Add services to the container. // Add services to the container.
var authkey = builder.Configuration.GetValue<string>("JwtSettings:securitykey");
builder.Services.AddAuthentication(item =>
{
item.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
item.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(item =>
{
item.RequireHttpsMetadata = true;
item.SaveToken = true;
item.TokenValidationParameters = new TokenValidationParameters()
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(authkey)),
ValidateIssuer = false,
ValidateAudience = false,
ClockSkew = TimeSpan.Zero
};
});
builder.Services.AddControllers(); builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer(); builder.Services.AddEndpointsApiExplorer();
//builder.Services.AddSwaggerGen(); //builder.Services.AddSwaggerGen();
builder.Services.AddSwaggerGen(c => builder.Services.AddSwaggerGen(options =>
{ {
// Include XML comments from your assembly // Include XML comments from your assembly
var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"; var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile); 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<ILocationsProvider, LocationsProvider>(); builder.Services.AddScoped<ILocationsProvider, LocationsProvider>();
builder.Services.AddScoped<IRegionsProvider, RegionsProvider>(); builder.Services.AddScoped<IRegionsProvider, RegionsProvider>();
@ -26,7 +76,10 @@ builder.Services.AddDbContext<LocationDbContext>(option =>
{ {
option.UseInMemoryDatabase("Locations"); option.UseInMemoryDatabase("Locations");
}); });
var app = builder.Build(); var app = builder.Build();
// Add services to the container.
// Configure the HTTP request pipeline. // Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment()) if (app.Environment.IsDevelopment())
@ -44,6 +97,7 @@ if (app.Environment.IsDevelopment())
} }
} }
app.UseAuthentication();
app.UseAuthorization(); app.UseAuthorization();
app.MapControllers(); app.MapControllers();

View File

@ -1,23 +1,14 @@
{ {
"$schema": "https://json.schemastore.org/launchsettings.json",
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:20458",
"sslPort": 0
}
},
"profiles": { "profiles": {
"DamageAssesment.Api.Locations": { "DamageAssesment.Api.Locations": {
"commandName": "Project", "commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true, "launchBrowser": true,
"launchUrl": "swagger", "launchUrl": "swagger",
"applicationUrl": "http://localhost:5213",
"environmentVariables": { "environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development" "ASPNETCORE_ENVIRONMENT": "Development"
} },
"dotnetRunMessages": true,
"applicationUrl": "http://localhost:5213"
}, },
"IIS Express": { "IIS Express": {
"commandName": "IISExpress", "commandName": "IISExpress",
@ -26,6 +17,24 @@
"environmentVariables": { "environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development" "ASPNETCORE_ENVIRONMENT": "Development"
} }
},
"Docker": {
"commandName": "Docker",
"launchBrowser": true,
"launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}/swagger",
"environmentVariables": {
"ASPNETCORE_URLS": "http://+:80"
},
"publishAllPorts": true
}
},
"$schema": "https://json.schemastore.org/launchsettings.json",
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:20458",
"sslPort": 0
} }
} }
} }

View File

@ -28,8 +28,6 @@ namespace DamageAssesment.Api.Locations.Providers
var locations = await locationDbContext.Locations.AsNoTracking().ToListAsync(); var locations = await locationDbContext.Locations.AsNoTracking().ToListAsync();
if (locations != null) if (locations != null)
{ {
int maxenrollment = (int)locations.Max(a => a.Enrollment);
foreach (Db.Location item in locations) { item.DataValue = GetHeatmapdata(item.Enrollment, maxenrollment); }
logger?.LogInformation($"{locations.Count} Locations(s) found"); logger?.LogInformation($"{locations.Count} Locations(s) found");
var result = mapper.Map<IEnumerable<Db.Location>, IEnumerable<Models.Location>>(locations); var result = mapper.Map<IEnumerable<Db.Location>, IEnumerable<Models.Location>>(locations);
return (true, result, null); return (true, result, null);
@ -48,12 +46,9 @@ namespace DamageAssesment.Api.Locations.Providers
try try
{ {
logger?.LogInformation("Query Location"); logger?.LogInformation("Query Location");
int maxenrollment = (int)await locationDbContext.Locations.AsNoTracking().MaxAsync(a => a.Enrollment);
var location = await locationDbContext.Locations.AsNoTracking().FirstOrDefaultAsync(q => q.Id == Id); var location = await locationDbContext.Locations.AsNoTracking().FirstOrDefaultAsync(q => q.Id == Id);
if (location != null) if (location != null)
{if(maxenrollment>0) {
location.DataValue = GetHeatmapdata(location.Enrollment, maxenrollment);
logger?.LogInformation($"{location} found"); logger?.LogInformation($"{location} found");
var result = mapper.Map<Db.Location, Models.Location>(location); var result = mapper.Map<Db.Location, Models.Location>(location);
return (true, result, null); return (true, result, null);
@ -66,10 +61,6 @@ namespace DamageAssesment.Api.Locations.Providers
return (false, null, ex.Message); return (false, null, ex.Message);
} }
} }
private int GetHeatmapdata(int? enrollment,int maxenrollment)
{
return (enrollment != null ? enrollment.Value : 0) * 100 / maxenrollment;
}
public async Task<(bool IsSuccess, Models.Location Location, string ErrorMessage)> PostLocationAsync(Models.Location location) public async Task<(bool IsSuccess, Models.Location Location, string ErrorMessage)> PostLocationAsync(Models.Location location)
{ {
try try
@ -148,9 +139,9 @@ namespace DamageAssesment.Api.Locations.Providers
{ {
if (!locationDbContext.Locations.Any()) if (!locationDbContext.Locations.Any())
{ {
locationDbContext.Locations.Add(new Db.Location() { LocationCode = "0091", RegionId = 5, Name = "BOB GRAHAM EDUCATION CENTER", MaintenanceCenter = "1", SchoolType = "K8", DataValue = 25,Enrollment=780,Latitude= 25.83604,Longitute= -80.21618 }); locationDbContext.Locations.Add(new Db.Location() { LocationCode = "0091", RegionId = 5, Name = "BOB GRAHAM EDUCATION CENTER", MaintenanceCenter = "1", SchoolType = "K8" });
locationDbContext.Locations.Add(new Db.Location() { LocationCode = "0092", RegionId = 1, Name = "NORMAN S. EDELCUP/SUNNY ISLES BEACH K-8", MaintenanceCenter = "1", SchoolType = "K8", DataValue = 46, Enrollment = 650, Latitude = 20.83604, Longitute = -40.21618 }); locationDbContext.Locations.Add(new Db.Location() { LocationCode = "0092", RegionId = 1, Name = "NORMAN S. EDELCUP/SUNNY ISLES BEACH K-8", MaintenanceCenter = "1", SchoolType = "K8" });
locationDbContext.Locations.Add(new Db.Location() { LocationCode = "7511", RegionId = 4, Name = "MIAMI SPRINGS SHS", MaintenanceCenter = "2", SchoolType = "S", DataValue = 12, Enrollment = 500, Latitude = 53.83604, Longitute = -60.21618 }); locationDbContext.Locations.Add(new Db.Location() { LocationCode = "7511", RegionId = 4, Name = "MIAMI SPRINGS SHS", MaintenanceCenter = "2", SchoolType = "S" });
//locationDbContext.Locations.Add(new Db.Location() { Id = 3, LocationCode = "Loc3", RegionId = 3, Name = "BOB GRAHAM EDUCATION CENTER 3", MaintenanceCenter = "1", SchoolType = "US" }); //locationDbContext.Locations.Add(new Db.Location() { Id = 3, LocationCode = "Loc3", RegionId = 3, Name = "BOB GRAHAM EDUCATION CENTER 3", MaintenanceCenter = "1", SchoolType = "US" });
//locationDbContext.Locations.Add(new Db.Location() { Id = 4, LocationCode = "Loc4", RegionId = 1, Name = "BOB GRAHAM EDUCATION CENTER 4", MaintenanceCenter = "1", SchoolType = "US" }); //locationDbContext.Locations.Add(new Db.Location() { Id = 4, LocationCode = "Loc4", RegionId = 1, Name = "BOB GRAHAM EDUCATION CENTER 4", MaintenanceCenter = "1", SchoolType = "US" });
//locationDbContext.Locations.Add(new Db.Location() { Id = 5, LocationCode = "Loc5", RegionId = 2, Name = "BOB GRAHAM EDUCATION CENTER 5", MaintenanceCenter = "1", SchoolType = "US" }); //locationDbContext.Locations.Add(new Db.Location() { Id = 5, LocationCode = "Loc5", RegionId = 2, Name = "BOB GRAHAM EDUCATION CENTER 5", MaintenanceCenter = "1", SchoolType = "US" });

View File

@ -0,0 +1,8 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
}
}

View File

@ -1,5 +1,6 @@
using DamageAssesment.Api.Questions.Interfaces; using DamageAssesment.Api.Questions.Interfaces;
using DamageAssesment.Api.Questions.Models; using DamageAssesment.Api.Questions.Models;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
namespace DamageAssesment.Api.Questions.Controllers namespace DamageAssesment.Api.Questions.Controllers
@ -11,16 +12,13 @@ namespace DamageAssesment.Api.Questions.Controllers
public QuestionsController(IQuestionsProvider questionsProvider) public QuestionsController(IQuestionsProvider questionsProvider)
{ {
this.questionsProvider = questionsProvider; this.questionsProvider = questionsProvider;
} }
/// <summary> /// <summary>
/// GET request for retrieving questions. /// GET request for retrieving questions.
/// </summary> /// </summary>
//get all questions
// get all questions [Authorize(Roles = "admin,survey,user,report")]
[Route("questions")] [Route("questions")]
[Route("questions/{language:alpha}")] [Route("questions/{language:alpha}")]
[HttpGet] [HttpGet]
@ -38,6 +36,7 @@ namespace DamageAssesment.Api.Questions.Controllers
/// <summary> /// <summary>
/// GET request for retrieving a question by ID. /// GET request for retrieving a question by ID.
/// </summary> /// </summary>
[Authorize(Roles = "admin,survey,user,report")]
[Route("questions/{id}/{language:alpha}")] [Route("questions/{id}/{language:alpha}")]
[Route("questions/{id:int}")] [Route("questions/{id:int}")]
[HttpGet] [HttpGet]
@ -56,6 +55,7 @@ namespace DamageAssesment.Api.Questions.Controllers
/// GET request for retrieving survey questions based on a survey ID. /// GET request for retrieving survey questions based on a survey ID.
/// Uri: {Optional language}/GetSurveyQuestions/{surveyId} :Default returns question in all languages /// Uri: {Optional language}/GetSurveyQuestions/{surveyId} :Default returns question in all languages
/// </summary> /// </summary>
[Authorize(Roles = "admin,survey,user,report")]
[Route("questions/bysurvey/{surveyId:int}")] [Route("questions/bysurvey/{surveyId:int}")]
[Route("questions/bysurvey/{surveyId:int}/{language:alpha}")] [Route("questions/bysurvey/{surveyId:int}/{language:alpha}")]
[HttpGet] [HttpGet]
@ -72,6 +72,7 @@ namespace DamageAssesment.Api.Questions.Controllers
/// PUT request for updating a question (multilingual). /// PUT request for updating a question (multilingual).
/// </summary> /// </summary>
[Authorize(Roles = "admin")]
[HttpPut("questions")] [HttpPut("questions")]
public async Task<IActionResult> UpdateQuestion(Models.Question question) public async Task<IActionResult> UpdateQuestion(Models.Question question)
{ {
@ -92,6 +93,7 @@ namespace DamageAssesment.Api.Questions.Controllers
/// <summary> /// <summary>
/// POST request for creating a multiple question (multilingual). /// POST request for creating a multiple question (multilingual).
/// </summary> /// </summary>
[Authorize(Roles = "admin")]
[HttpPost("questions/multiple")] [HttpPost("questions/multiple")]
public async Task<IActionResult> CreateQuestions(List<Models.Question> questions) public async Task<IActionResult> CreateQuestions(List<Models.Question> questions)
{ {
@ -133,6 +135,7 @@ namespace DamageAssesment.Api.Questions.Controllers
/// POST request for creating a new question (multilingual). /// POST request for creating a new question (multilingual).
/// </summary> /// </summary>
[Authorize(Roles = "admin")]
[HttpPost("questions")] [HttpPost("questions")]
public async Task<IActionResult> CreateQuestion(Models.Question question) public async Task<IActionResult> CreateQuestion(Models.Question question)
{ {
@ -151,6 +154,7 @@ namespace DamageAssesment.Api.Questions.Controllers
/// DELETE request for deleting a question based on ID. /// DELETE request for deleting a question based on ID.
/// </summary> /// </summary>
[Authorize(Roles = "admin")]
[HttpDelete("questions/{id}")] [HttpDelete("questions/{id}")]
public async Task<IActionResult> DeleteQuestion(int id) public async Task<IActionResult> DeleteQuestion(int id)
{ {
@ -166,6 +170,7 @@ namespace DamageAssesment.Api.Questions.Controllers
/// GET request for retrieving question categories. /// GET request for retrieving question categories.
/// </summary> /// </summary>
[Authorize(Roles = "admin,user,report")]
[HttpGet("questions/categories")] [HttpGet("questions/categories")]
[HttpGet("questions/categories/{language:alpha}")] [HttpGet("questions/categories/{language:alpha}")]
public async Task<IActionResult> GetQuestionCategoriesAsync(string? language) public async Task<IActionResult> GetQuestionCategoriesAsync(string? language)
@ -180,7 +185,7 @@ namespace DamageAssesment.Api.Questions.Controllers
/// <summary> /// <summary>
/// GET request for retrieving a question category by ID. /// GET request for retrieving a question category by ID.
/// </summary> /// </summary>
[Authorize(Roles = "admin,report")]
[HttpGet("questions/categories/{id:int}")] [HttpGet("questions/categories/{id:int}")]
[HttpGet("questions/categories/{id:int}/{language:alpha}")] [HttpGet("questions/categories/{id:int}/{language:alpha}")]
public async Task<IActionResult> GetQuestionCategoryAsync(int id,string? language) public async Task<IActionResult> GetQuestionCategoryAsync(int id,string? language)
@ -197,7 +202,7 @@ namespace DamageAssesment.Api.Questions.Controllers
/// <summary> /// <summary>
/// PUT request for updating a question category. /// PUT request for updating a question category.
/// </summary> /// </summary>
[Authorize(Roles = "admin,survey,report")]
[HttpPut("questions/categories")] [HttpPut("questions/categories")]
public async Task<IActionResult> UpdateQuestionCategory(Models.QuestionCategory questionCategory) public async Task<IActionResult> UpdateQuestionCategory(Models.QuestionCategory questionCategory)
{ {
@ -219,6 +224,7 @@ namespace DamageAssesment.Api.Questions.Controllers
/// POST request for creating a new question category. /// POST request for creating a new question category.
/// </summary> /// </summary>
[Authorize(Roles = "admin")]
[HttpPost("questions/categories")] [HttpPost("questions/categories")]
public async Task<IActionResult> CreateQuestionCategory(Models.QuestionCategory questionCategory) public async Task<IActionResult> CreateQuestionCategory(Models.QuestionCategory questionCategory)
{ {
@ -237,6 +243,7 @@ namespace DamageAssesment.Api.Questions.Controllers
/// DELETE request for deleting a question category based on ID. /// DELETE request for deleting a question category based on ID.
/// </summary> /// </summary>
[Authorize(Roles = "admin")]
[HttpDelete("questions/categories/{id}")] [HttpDelete("questions/categories/{id}")]
public async Task<IActionResult> DeleteQuestionCategory(int id) public async Task<IActionResult> DeleteQuestionCategory(int id)
{ {

View File

@ -5,6 +5,8 @@
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
<GenerateDocumentationFile>True</GenerateDocumentationFile> <GenerateDocumentationFile>True</GenerateDocumentationFile>
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
<DockerComposeProjectPath>..\docker-compose.dcproj</DockerComposeProjectPath>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
@ -12,6 +14,7 @@
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.21" /> <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.21" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.5" /> <PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.5" />
<PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="7.0.5" /> <PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="7.0.5" />
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.19.4" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" /> <PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" />
</ItemGroup> </ItemGroup>

View File

@ -3,7 +3,6 @@ using System.ComponentModel.DataAnnotations;
namespace DamageAssesment.Api.Questions.Db namespace DamageAssesment.Api.Questions.Db
{ {
[Table("QuestionCategoryTrans")]
public class CategoryTranslation public class CategoryTranslation
{ {
[Key] [Key]

View File

@ -3,7 +3,6 @@ using System.ComponentModel.DataAnnotations.Schema;
namespace DamageAssesment.Api.Questions.Db namespace DamageAssesment.Api.Questions.Db
{ {
[Table("Questions")]
public class Question public class Question
{ {
[Key] [Key]

View File

@ -1,10 +1,8 @@
using System.Buffers.Text; using System.Buffers.Text;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace DamageAssesment.Api.Questions.Db namespace DamageAssesment.Api.Questions.Db
{ {
[Table("QuestionCategories")]
public class QuestionCategory public class QuestionCategory
{ {
[Key] [Key]

View File

@ -1,9 +1,7 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace DamageAssesment.Api.Questions.Db namespace DamageAssesment.Api.Questions.Db
{ {
[Table("QuestionTypes")]
public class QuestionType public class QuestionType
{ {
[Key] [Key]

View File

@ -3,7 +3,6 @@ using System.ComponentModel.DataAnnotations.Schema;
namespace DamageAssesment.Api.Questions.Db namespace DamageAssesment.Api.Questions.Db
{ {
[Table("QuestionTrans")]
public class QuestionsTranslation public class QuestionsTranslation
{ {
[Key] [Key]

View File

@ -0,0 +1,21 @@
#See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging.
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["DamageAssesment.Api.Questions/DamageAssesment.Api.Questions.csproj", "DamageAssesment.Api.Questions/"]
RUN dotnet restore "DamageAssesment.Api.Questions/DamageAssesment.Api.Questions.csproj"
COPY . .
WORKDIR "/src/DamageAssesment.Api.Questions"
RUN dotnet build "DamageAssesment.Api.Questions.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "DamageAssesment.Api.Questions.csproj" -c Release -o /app/publish /p:UseAppHost=false
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "DamageAssesment.Api.Questions.dll"]

View File

@ -12,7 +12,7 @@
public bool IsRequired { get; set; } public bool IsRequired { get; set; }
public bool Comment { get; set; } public bool Comment { get; set; }
public bool Key { get; set; } public bool Key { get; set; }
public int? SurveyId { get; set; } public int SurveyId { get; set; }
public int CategoryId { get; set; } public int CategoryId { get; set; }
} }
} }

View File

@ -1,11 +1,33 @@
using DamageAssesment.Api.Questions.Db; using DamageAssesment.Api.Questions.Db;
using DamageAssesment.Api.Questions.Interfaces; using DamageAssesment.Api.Questions.Interfaces;
using DamageAssesment.Api.Questions.Providers; using DamageAssesment.Api.Questions.Providers;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.IdentityModel.Tokens;
using Microsoft.OpenApi.Models;
using System.Reflection; using System.Reflection;
using System.Text;
var builder = WebApplication.CreateBuilder(args); var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
var authkey = builder.Configuration.GetValue<string>("JwtSettings:securitykey");
builder.Services.AddAuthentication(item =>
{
item.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
item.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(item =>
{
item.RequireHttpsMetadata = true;
item.SaveToken = true;
item.TokenValidationParameters = new TokenValidationParameters()
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(authkey)),
ValidateIssuer = false,
ValidateAudience = false,
ClockSkew = TimeSpan.Zero
};
});
// Add services to the container. // Add services to the container.
builder.Services.AddControllers(); builder.Services.AddControllers();
@ -17,13 +39,41 @@ builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());
builder.Services.AddEndpointsApiExplorer(); builder.Services.AddEndpointsApiExplorer();
//builder.Services.AddSwaggerGen(); //builder.Services.AddSwaggerGen();
builder.Services.AddSwaggerGen(c => builder.Services.AddSwaggerGen(options =>
{ {
// Include XML comments from your assembly // Include XML comments from your assembly
var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"; var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile); 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<QuestionDbContext>(option => builder.Services.AddDbContext<QuestionDbContext>(option =>
{ {
option.UseInMemoryDatabase("Questions"); option.UseInMemoryDatabase("Questions");
@ -43,7 +93,7 @@ if (app.Environment.IsDevelopment())
questionProvider.SeedData(); questionProvider.SeedData();
} }
} }
app.UseAuthentication();
app.UseAuthorization(); app.UseAuthorization();
app.MapControllers(); app.MapControllers();

View File

@ -1,23 +1,14 @@
{ {
"$schema": "https://json.schemastore.org/launchsettings.json",
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:60754",
"sslPort": 0
}
},
"profiles": { "profiles": {
"DamageAssesment.Api.Questions": { "DamageAssesment.Api.Questions": {
"commandName": "Project", "commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true, "launchBrowser": true,
"launchUrl": "swagger", "launchUrl": "swagger",
"applicationUrl": "http://localhost:5133",
"environmentVariables": { "environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development" "ASPNETCORE_ENVIRONMENT": "Development"
} },
"dotnetRunMessages": true,
"applicationUrl": "http://localhost:5133"
}, },
"IIS Express": { "IIS Express": {
"commandName": "IISExpress", "commandName": "IISExpress",
@ -26,6 +17,24 @@
"environmentVariables": { "environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development" "ASPNETCORE_ENVIRONMENT": "Development"
} }
},
"Docker": {
"commandName": "Docker",
"launchBrowser": true,
"launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}/swagger",
"environmentVariables": {
"ASPNETCORE_URLS": "http://+:80"
},
"publishAllPorts": true
}
},
"$schema": "https://json.schemastore.org/launchsettings.json",
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:60754",
"sslPort": 0
} }
} }
} }

View File

@ -31,8 +31,7 @@ namespace DamageAssesment.Api.Questions.Providers
questionDbContext.QuestionTypes.Add(new Db.QuestionType() { TypeText = "TextBox" }); questionDbContext.QuestionTypes.Add(new Db.QuestionType() { TypeText = "TextBox" });
questionDbContext.SaveChanges(); questionDbContext.SaveChanges();
} }
if (!questionDbContext.QuestionsTranslations.Any())
if (!questionDbContext.QuestionCategories.Any())
{ {
questionDbContext.QuestionCategories.Add(new Db.QuestionCategory() { IconName = "Flooding", IconLibrary = "https://example.com/images/img1.png" }); questionDbContext.QuestionCategories.Add(new Db.QuestionCategory() { IconName = "Flooding", IconLibrary = "https://example.com/images/img1.png" });
questionDbContext.QuestionCategories.Add(new Db.QuestionCategory() { IconName = "Electrical", IconLibrary = "https://example.com/images/img2.png" }); questionDbContext.QuestionCategories.Add(new Db.QuestionCategory() { IconName = "Electrical", IconLibrary = "https://example.com/images/img2.png" });
@ -70,7 +69,7 @@ namespace DamageAssesment.Api.Questions.Providers
var question4 = new Db.Question() { QuestionTypeId = 1, SurveyId = 2, QuestionNumber = 2, IsRequired = false, Comment = true, Key = false, CategoryId = 2 }; var question4 = new Db.Question() { QuestionTypeId = 1, SurveyId = 2, QuestionNumber = 2, IsRequired = false, Comment = true, Key = false, CategoryId = 2 };
var question5 = new Db.Question() { QuestionTypeId = 1, SurveyId = 3, QuestionNumber = 1, IsRequired = true, Comment = false, Key = true, CategoryId = 1 }; var question5 = new Db.Question() { QuestionTypeId = 1, SurveyId = 3, QuestionNumber = 1, IsRequired = true, Comment = false, Key = true, CategoryId = 1 };
var question6 = new Db.Question() { QuestionTypeId = 1, SurveyId = 3, QuestionNumber = 2, IsRequired = false, Comment = true, Key = false, CategoryId = 2 }; var question6 = new Db.Question() { QuestionTypeId = 1, SurveyId = 3, QuestionNumber = 2, IsRequired = false, Comment = true, Key = false, CategoryId = 2 };
var question7 = new Db.Question() { QuestionTypeId = 1, SurveyId = 3, QuestionNumber = 1, IsRequired = true, Comment = false, Key = true, CategoryId = 3}; var question7 = new Db.Question() { QuestionTypeId = 1, SurveyId = 3, QuestionNumber = 1, IsRequired = true, Comment = false, Key = true, CategoryId = 3 };
var question8 = new Db.Question() { QuestionTypeId = 1, SurveyId = 3, QuestionNumber = 2, IsRequired = false, Comment = true, Key = false, CategoryId = 4 }; var question8 = new Db.Question() { QuestionTypeId = 1, SurveyId = 3, QuestionNumber = 2, IsRequired = false, Comment = true, Key = false, CategoryId = 4 };
var question9 = new Db.Question() { QuestionTypeId = 1, SurveyId = 3, QuestionNumber = 1, IsRequired = true, Comment = true, Key = true, CategoryId = 5 }; var question9 = new Db.Question() { QuestionTypeId = 1, SurveyId = 3, QuestionNumber = 1, IsRequired = true, Comment = true, Key = true, CategoryId = 5 };
var question10 = new Db.Question() { QuestionTypeId = 1, SurveyId = 3, QuestionNumber = 2, IsRequired = false, Comment = false, Key = true, CategoryId = 1 }; var question10 = new Db.Question() { QuestionTypeId = 1, SurveyId = 3, QuestionNumber = 2, IsRequired = false, Comment = false, Key = true, CategoryId = 1 };
@ -314,7 +313,7 @@ namespace DamageAssesment.Api.Questions.Providers
CategoryId = item.Id, CategoryId = item.Id,
IconLibrary = item.IconLibrary, IconLibrary = item.IconLibrary,
IconName = item.IconName, IconName = item.IconName,
CategoryNames= CreateCategoryMultiLanguageObject(GetCategoryTranslations(item.Id, language)), CategoryNames = CreateCategoryMultiLanguageObject(GetCategoryTranslations(item.Id, language)),
QuestionsText = GetSurveyQuestion(mapper.Map<List<Db.Question>, List<Models.MultiLanguage>>(questions.Where(a => a.CategoryId == item.Id).ToList()), language) QuestionsText = GetSurveyQuestion(mapper.Map<List<Db.Question>, List<Models.MultiLanguage>>(questions.Where(a => a.CategoryId == item.Id).ToList()), language)
}); });
} }

View File

@ -0,0 +1,8 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
}
}

View File

@ -25,17 +25,16 @@ namespace DamageAssesment.SurveyResponses.Test
SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject(); SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject();
var mockResponse = await MockData.getOkResponse(mockRequestObject); var mockResponse = await MockData.getOkResponse(mockRequestObject);
mockSurveyResponseService.Setup(service => service.GetSurveyResponsesAsync(1)).ReturnsAsync(mockResponse); mockSurveyResponseService.Setup(service => service.GetSurveyResponsesAsync(1)).ReturnsAsync(mockResponse);
var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object); var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var result = (OkObjectResult)await surveyResponseProvider.GetSurveyResponsesAsync(1); var result = (OkObjectResult)await surveyResponseProvider.GetSurveyResponsesAsync(1);
Assert.Equal(200, result.StatusCode); Assert.Equal(200, result.StatusCode);
} }
[Fact(DisplayName = "Get Responses - BadRequest case")] [Fact(DisplayName = "Get Responses - BadRequest case")]
public async Task GetSurveyResponsesAsync_ShouldReturnStatusCode204() public async Task GetSurveyResponsesAsync_ShouldReturnStatusCode204()
{ {
var mockResponse = await MockData.getResponse(); var mockResponse = await MockData.getResponse();
mockSurveyResponseService.Setup(service => service.GetSurveyResponsesAsync(1)).ReturnsAsync(mockResponse); mockSurveyResponseService.Setup(service => service.GetSurveyResponsesAsync(1)).ReturnsAsync(mockResponse);
var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object); var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var result = (BadRequestObjectResult)await surveyResponseProvider.GetSurveyResponsesAsync(1); var result = (BadRequestObjectResult)await surveyResponseProvider.GetSurveyResponsesAsync(1);
Assert.Equal(400, result.StatusCode); Assert.Equal(400, result.StatusCode);
} }
@ -46,7 +45,7 @@ namespace DamageAssesment.SurveyResponses.Test
SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject(); SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject();
var mockResponse = await MockData.getOkResponse(); var mockResponse = await MockData.getOkResponse();
mockSurveyResponseService.Setup(service => service.GetSurveyResponsesBySurveyAsync(1, 1)).ReturnsAsync(mockResponse); mockSurveyResponseService.Setup(service => service.GetSurveyResponsesBySurveyAsync(1, 1)).ReturnsAsync(mockResponse);
var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object); var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var result = (OkObjectResult)await surveyResponseProvider.GetSurveyResponsesAsync(1, 1); var result = (OkObjectResult)await surveyResponseProvider.GetSurveyResponsesAsync(1, 1);
Assert.Equal(200, result.StatusCode); Assert.Equal(200, result.StatusCode);
} }
@ -56,7 +55,7 @@ namespace DamageAssesment.SurveyResponses.Test
{ {
var mockResponse = await MockData.getResponse(); var mockResponse = await MockData.getResponse();
mockSurveyResponseService.Setup(service => service.GetSurveyResponsesBySurveyAsync(1, 1)).ReturnsAsync(mockResponse); mockSurveyResponseService.Setup(service => service.GetSurveyResponsesBySurveyAsync(1, 1)).ReturnsAsync(mockResponse);
var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object); var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var result = (NoContentResult)await surveyResponseProvider.GetSurveyResponsesAsync(1, 1); var result = (NoContentResult)await surveyResponseProvider.GetSurveyResponsesAsync(1, 1);
Assert.Equal(204, result.StatusCode); Assert.Equal(204, result.StatusCode);
} }
@ -70,7 +69,7 @@ namespace DamageAssesment.SurveyResponses.Test
SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject(); SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject();
var mockResponse = await MockData.getOkResponse(); var mockResponse = await MockData.getOkResponse();
mockSurveyResponseService.Setup(service => service.GetSurveyResponsesBySurveyAndLocationAsync(1, 1, 1)).ReturnsAsync(mockResponse); mockSurveyResponseService.Setup(service => service.GetSurveyResponsesBySurveyAndLocationAsync(1, 1, 1)).ReturnsAsync(mockResponse);
var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object); var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var result = (OkObjectResult)await surveyResponseProvider.GetSurveyResponsesBySurveyAndLocationAsync(1, 1, 1); var result = (OkObjectResult)await surveyResponseProvider.GetSurveyResponsesBySurveyAndLocationAsync(1, 1, 1);
Assert.Equal(200, result.StatusCode); Assert.Equal(200, result.StatusCode);
} }
@ -80,7 +79,7 @@ namespace DamageAssesment.SurveyResponses.Test
{ {
var mockResponse = await MockData.getResponse(); var mockResponse = await MockData.getResponse();
mockSurveyResponseService.Setup(service => service.GetSurveyResponsesBySurveyAndLocationAsync(1, 1, 1)).ReturnsAsync(mockResponse); mockSurveyResponseService.Setup(service => service.GetSurveyResponsesBySurveyAndLocationAsync(1, 1, 1)).ReturnsAsync(mockResponse);
var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object); var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var result = (NoContentResult)await surveyResponseProvider.GetSurveyResponsesBySurveyAndLocationAsync(1, 1, 1); var result = (NoContentResult)await surveyResponseProvider.GetSurveyResponsesBySurveyAndLocationAsync(1, 1, 1);
Assert.Equal(204, result.StatusCode); Assert.Equal(204, result.StatusCode);
} }
@ -91,7 +90,7 @@ namespace DamageAssesment.SurveyResponses.Test
SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject(); SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject();
var mockResponse = await MockData.getOkResponse(); var mockResponse = await MockData.getOkResponse();
mockSurveyResponseService.Setup(service => service.GetResponsesByAnswerAsync(1, 1, "Yes", 1)).ReturnsAsync(mockResponse); mockSurveyResponseService.Setup(service => service.GetResponsesByAnswerAsync(1, 1, "Yes", 1)).ReturnsAsync(mockResponse);
var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object); var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var result = (OkObjectResult)await surveyResponseProvider.GetSurveyResponsesByAnswerAsyncAsync(1, 1, "Yes", 1); var result = (OkObjectResult)await surveyResponseProvider.GetSurveyResponsesByAnswerAsyncAsync(1, 1, "Yes", 1);
Assert.Equal(200, result.StatusCode); Assert.Equal(200, result.StatusCode);
} }
@ -101,7 +100,7 @@ namespace DamageAssesment.SurveyResponses.Test
{ {
var mockResponse = await MockData.getResponse(); var mockResponse = await MockData.getResponse();
mockSurveyResponseService.Setup(service => service.GetResponsesByAnswerAsync(1, 1, "Yes", 1)).ReturnsAsync(mockResponse); mockSurveyResponseService.Setup(service => service.GetResponsesByAnswerAsync(1, 1, "Yes", 1)).ReturnsAsync(mockResponse);
var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object); var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var result = (NoContentResult)await surveyResponseProvider.GetSurveyResponsesByAnswerAsyncAsync(1, 1, "Yes", 1); var result = (NoContentResult)await surveyResponseProvider.GetSurveyResponsesByAnswerAsyncAsync(1, 1, "Yes", 1);
Assert.Equal(204, result.StatusCode); Assert.Equal(204, result.StatusCode);
} }
@ -113,7 +112,7 @@ namespace DamageAssesment.SurveyResponses.Test
SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject(); SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject();
var mockResponse = await MockData.getOkResponse(); var mockResponse = await MockData.getOkResponse();
mockSurveyResponseService.Setup(service => service.GetAnswersByRegionAsync(1, 1)).ReturnsAsync(mockResponse); mockSurveyResponseService.Setup(service => service.GetAnswersByRegionAsync(1, 1)).ReturnsAsync(mockResponse);
var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object); var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var result = (OkObjectResult)await surveyResponseProvider.GetAnswersByRegionAsync(1, 1); var result = (OkObjectResult)await surveyResponseProvider.GetAnswersByRegionAsync(1, 1);
Assert.Equal(200, result.StatusCode); Assert.Equal(200, result.StatusCode);
} }
@ -123,7 +122,7 @@ namespace DamageAssesment.SurveyResponses.Test
{ {
var mockResponse = await MockData.getResponse(); var mockResponse = await MockData.getResponse();
mockSurveyResponseService.Setup(service => service.GetAnswersByRegionAsync(1, 1)).ReturnsAsync(mockResponse); mockSurveyResponseService.Setup(service => service.GetAnswersByRegionAsync(1, 1)).ReturnsAsync(mockResponse);
var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object); var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var result = (NoContentResult)await surveyResponseProvider.GetAnswersByRegionAsync(1, 1); var result = (NoContentResult)await surveyResponseProvider.GetAnswersByRegionAsync(1, 1);
Assert.Equal(204, result.StatusCode); Assert.Equal(204, result.StatusCode);
} }
@ -134,7 +133,7 @@ namespace DamageAssesment.SurveyResponses.Test
SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject(); SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject();
var mockResponse = await MockData.getOkResponse(); var mockResponse = await MockData.getOkResponse();
mockSurveyResponseService.Setup(service => service.GetSurveyResponsesByMaintenanceCenterAsync(1, 1)).ReturnsAsync(mockResponse); mockSurveyResponseService.Setup(service => service.GetSurveyResponsesByMaintenanceCenterAsync(1, 1)).ReturnsAsync(mockResponse);
var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object); var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var result = (OkObjectResult)await surveyResponseProvider.GetAnswersByMaintenaceCentersync(1, 1); var result = (OkObjectResult)await surveyResponseProvider.GetAnswersByMaintenaceCentersync(1, 1);
Assert.Equal(200, result.StatusCode); Assert.Equal(200, result.StatusCode);
} }
@ -144,7 +143,7 @@ namespace DamageAssesment.SurveyResponses.Test
{ {
var mockResponse = await MockData.getResponse(); var mockResponse = await MockData.getResponse();
mockSurveyResponseService.Setup(service => service.GetSurveyResponsesByMaintenanceCenterAsync(1, 1)).ReturnsAsync(mockResponse); mockSurveyResponseService.Setup(service => service.GetSurveyResponsesByMaintenanceCenterAsync(1, 1)).ReturnsAsync(mockResponse);
var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object); var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var result = (NoContentResult)await surveyResponseProvider.GetAnswersByMaintenaceCentersync(1, 1); var result = (NoContentResult)await surveyResponseProvider.GetAnswersByMaintenaceCentersync(1, 1);
Assert.Equal(204, result.StatusCode); Assert.Equal(204, result.StatusCode);
} }
@ -155,7 +154,7 @@ namespace DamageAssesment.SurveyResponses.Test
SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject(); SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject();
var mockResponse = await MockData.getOkResponse(); var mockResponse = await MockData.getOkResponse();
mockSurveyResponseService.Setup(service => service.GetSurveyResponseByIdAsync(1)).ReturnsAsync(mockResponse); mockSurveyResponseService.Setup(service => service.GetSurveyResponseByIdAsync(1)).ReturnsAsync(mockResponse);
var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object); var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var result = (OkObjectResult)await surveyResponseProvider.GetSurveyResponseByIdAsync(1); var result = (OkObjectResult)await surveyResponseProvider.GetSurveyResponseByIdAsync(1);
Assert.Equal(200, result.StatusCode); Assert.Equal(200, result.StatusCode);
} }
@ -165,7 +164,7 @@ namespace DamageAssesment.SurveyResponses.Test
{ {
var mockResponse = await MockData.getResponse(); var mockResponse = await MockData.getResponse();
mockSurveyResponseService.Setup(service => service.GetSurveyResponseByIdAsync(1)).ReturnsAsync(mockResponse); mockSurveyResponseService.Setup(service => service.GetSurveyResponseByIdAsync(1)).ReturnsAsync(mockResponse);
var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object); var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var result = (NoContentResult)await surveyResponseProvider.GetSurveyResponseByIdAsync(1); var result = (NoContentResult)await surveyResponseProvider.GetSurveyResponseByIdAsync(1);
Assert.Equal(204, result.StatusCode); Assert.Equal(204, result.StatusCode);
} }
@ -177,7 +176,7 @@ namespace DamageAssesment.SurveyResponses.Test
SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject(); SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject();
var mockResponse = await MockData.getOkResponse(mockRequestObject); var mockResponse = await MockData.getOkResponse(mockRequestObject);
mockSurveyResponseService.Setup(service => service.PostSurveyResponseAsync(mockRequestObject)).ReturnsAsync(mockResponse); mockSurveyResponseService.Setup(service => service.PostSurveyResponseAsync(mockRequestObject)).ReturnsAsync(mockResponse);
var surveyResponseController = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object); var surveyResponseController = new ResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var result = (OkObjectResult)await surveyResponseController.PostSurveysAsync(mockRequestObject); var result = (OkObjectResult)await surveyResponseController.PostSurveysAsync(mockRequestObject);
Assert.Equal(200, result.StatusCode); Assert.Equal(200, result.StatusCode);
} }
@ -188,7 +187,7 @@ namespace DamageAssesment.SurveyResponses.Test
SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject(); SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject();
var mockResponse = await MockData.getResponse(); var mockResponse = await MockData.getResponse();
mockSurveyResponseService.Setup(service => service.PostSurveyResponseAsync(mockRequestObject)).ReturnsAsync(mockResponse); mockSurveyResponseService.Setup(service => service.PostSurveyResponseAsync(mockRequestObject)).ReturnsAsync(mockResponse);
var surveyResponseController = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object); var surveyResponseController = new ResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var result = (BadRequestObjectResult)await surveyResponseController.PostSurveysAsync(mockRequestObject); var result = (BadRequestObjectResult)await surveyResponseController.PostSurveysAsync(mockRequestObject);
Assert.Equal(400, result.StatusCode); Assert.Equal(400, result.StatusCode);
} }
@ -199,7 +198,7 @@ namespace DamageAssesment.SurveyResponses.Test
SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject(); SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject();
var mockResponse = await MockData.getOkResponse(mockRequestObject); var mockResponse = await MockData.getOkResponse(mockRequestObject);
mockSurveyResponseService.Setup(service => service.PutSurveyResponseAsync(1, mockRequestObject)).ReturnsAsync(mockResponse); mockSurveyResponseService.Setup(service => service.PutSurveyResponseAsync(1, mockRequestObject)).ReturnsAsync(mockResponse);
var surveyResponseController = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object); var surveyResponseController = new ResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var result = (OkObjectResult)await surveyResponseController.PutSurveyResponseAsync(1, mockRequestObject); var result = (OkObjectResult)await surveyResponseController.PutSurveyResponseAsync(1, mockRequestObject);
Assert.Equal(200, result.StatusCode); Assert.Equal(200, result.StatusCode);
} }
@ -210,7 +209,7 @@ namespace DamageAssesment.SurveyResponses.Test
SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject(); SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject();
var mockResponse = await MockData.getResponse(); var mockResponse = await MockData.getResponse();
mockSurveyResponseService.Setup(service => service.PutSurveyResponseAsync(1, mockRequestObject)).ReturnsAsync(mockResponse); ; mockSurveyResponseService.Setup(service => service.PutSurveyResponseAsync(1, mockRequestObject)).ReturnsAsync(mockResponse); ;
var surveyResponseController = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object); var surveyResponseController = new ResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var result = (BadRequestObjectResult)await surveyResponseController.PutSurveyResponseAsync(1, mockRequestObject); var result = (BadRequestObjectResult)await surveyResponseController.PutSurveyResponseAsync(1, mockRequestObject);
Assert.Equal(400, result.StatusCode); Assert.Equal(400, result.StatusCode);
} }
@ -221,7 +220,7 @@ namespace DamageAssesment.SurveyResponses.Test
SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject(); SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject();
var mockResponse = await MockData.getOkResponse(mockRequestObject); var mockResponse = await MockData.getOkResponse(mockRequestObject);
mockSurveyResponseService.Setup(service => service.DeleteSurveyResponseAsync(1)).ReturnsAsync(mockResponse); mockSurveyResponseService.Setup(service => service.DeleteSurveyResponseAsync(1)).ReturnsAsync(mockResponse);
var surveyResponseController = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object); var surveyResponseController = new ResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var result = (OkObjectResult)await surveyResponseController.DeleteSurveyResponseAsync(1); var result = (OkObjectResult)await surveyResponseController.DeleteSurveyResponseAsync(1);
Assert.Equal(200, result.StatusCode); Assert.Equal(200, result.StatusCode);
} }
@ -231,7 +230,7 @@ namespace DamageAssesment.SurveyResponses.Test
{ {
var mockResponse = await MockData.getResponse(); var mockResponse = await MockData.getResponse();
mockSurveyResponseService.Setup(service => service.DeleteSurveyResponseAsync(1)).ReturnsAsync(mockResponse); ; mockSurveyResponseService.Setup(service => service.DeleteSurveyResponseAsync(1)).ReturnsAsync(mockResponse); ;
var surveyResponseController = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object); var surveyResponseController = new ResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object);
var result = (NotFoundResult)await surveyResponseController.DeleteSurveyResponseAsync(1); var result = (NotFoundResult)await surveyResponseController.DeleteSurveyResponseAsync(1);
Assert.Equal(404, result.StatusCode); Assert.Equal(404, result.StatusCode);
} }

View File

@ -1,16 +1,17 @@
using DamageAssesment.Api.Responses.Interfaces; using DamageAssesment.Api.Responses.Interfaces;
using DamageAssesment.Api.Responses.Models; using DamageAssesment.Api.Responses.Models;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
namespace DamageAssesment.Api.Responses.Controllers namespace DamageAssesment.Api.Responses.Controllers
{ {
[ApiController] [ApiController]
public class SurveyResponsesController : ControllerBase public class ResponsesController : ControllerBase
{ {
private readonly ISurveysResponse surveyResponseProvider; private readonly ISurveysResponse surveyResponseProvider;
private readonly IExcelExportService excelExportService; private readonly IExcelExportService excelExportService;
public SurveyResponsesController(ISurveysResponse surveyResponseProvider, IExcelExportService excelExportService) public ResponsesController(ISurveysResponse surveyResponseProvider, IExcelExportService excelExportService)
{ {
this.surveyResponseProvider = surveyResponseProvider; this.surveyResponseProvider = surveyResponseProvider;
this.excelExportService = excelExportService; this.excelExportService = excelExportService;
@ -19,6 +20,7 @@ namespace DamageAssesment.Api.Responses.Controllers
/// GET request for retrieving survey responses. /// GET request for retrieving survey responses.
/// </summary> /// </summary>
[Authorize(Roles = "admin,survey,user,report")]
[Route("responses/{employeeid:int}")] [Route("responses/{employeeid:int}")]
[Route("responses")] [Route("responses")]
[HttpGet] [HttpGet]
@ -38,6 +40,7 @@ namespace DamageAssesment.Api.Responses.Controllers
/// <summary> /// <summary>
/// GET request for retrieving survey responses by survey ID. /// GET request for retrieving survey responses by survey ID.
/// </summary> /// </summary>
[Authorize(Roles = "admin,survey,user,report")]
[Route("responses/bysurvey/{surveyid:int}/{employeeid:int}")] [Route("responses/bysurvey/{surveyid:int}/{employeeid:int}")]
[Route("responses/bysurvey/{surveyid:int}")] [Route("responses/bysurvey/{surveyid:int}")]
[HttpGet] [HttpGet]
@ -56,6 +59,7 @@ namespace DamageAssesment.Api.Responses.Controllers
/// <param name="surveyid">The ID of the survey for which responses are to be retrieved.</param> /// <param name="surveyid">The ID of the survey for which responses are to be retrieved.</param>
/// <param name="locationid">The ID of the location for which responses are to be retrieved.</param> /// <param name="locationid">The ID of the location for which responses are to be retrieved.</param>
[Authorize(Roles = "admin,survey,user,report")]
[Route("responses/{surveyid:int}/{locationid:int}/{employeeid:int}")] [Route("responses/{surveyid:int}/{locationid:int}/{employeeid:int}")]
[Route("responses/{surveyid:int}/{locationid:int}")] [Route("responses/{surveyid:int}/{locationid:int}")]
[HttpGet] [HttpGet]
@ -75,6 +79,7 @@ namespace DamageAssesment.Api.Responses.Controllers
/// <param name="questionId">The ID of the question for which responses are to be retrieved.</param> /// <param name="questionId">The ID of the question for which responses are to be retrieved.</param>
/// <param name="answer">The answer for which responses are to be retrieved.</param> /// <param name="answer">The answer for which responses are to be retrieved.</param>
[Authorize(Roles = "admin,survey,user,report")]
[Route("responses/byanswer/{surveyid:int}/{questionid:int}/{answer:alpha}/{employeeid:int}")] [Route("responses/byanswer/{surveyid:int}/{questionid:int}/{answer:alpha}/{employeeid:int}")]
[Route("responses/byanswer/{surveyid:int}/{questionid:int}/{answer:alpha}")] [Route("responses/byanswer/{surveyid:int}/{questionid:int}/{answer:alpha}")]
[HttpGet] [HttpGet]
@ -93,6 +98,7 @@ namespace DamageAssesment.Api.Responses.Controllers
/// </summary> /// </summary>
/// <param name="surveyId">The ID of the survey for which answers are to be retrieved.</param> /// <param name="surveyId">The ID of the survey for which answers are to be retrieved.</param>
[Authorize(Roles = "admin,survey,user,report")]
[Route("responses/byregion/{surveyid:int}")] [Route("responses/byregion/{surveyid:int}")]
[Route("responses/byregion/{surveyid:int}/{employeeid}")] [Route("responses/byregion/{surveyid:int}/{employeeid}")]
[HttpGet] [HttpGet]
@ -109,6 +115,7 @@ namespace DamageAssesment.Api.Responses.Controllers
/// GET request for retrieving survey responses by survey ID and maintenance center. /// GET request for retrieving survey responses by survey ID and maintenance center.
/// </summary> /// </summary>
/// <param name="surveyId">The ID of the survey for which responses are to be retrieved.</param> /// <param name="surveyId">The ID of the survey for which responses are to be retrieved.</param>
[Authorize(Roles = "admin,survey,user,report")]
[Route("responses/bymaintenancecenter/{surveyid:int}/{employeeid:int}")] [Route("responses/bymaintenancecenter/{surveyid:int}/{employeeid:int}")]
[Route("responses/bymaintenancecenter/{surveyid:int}")] [Route("responses/bymaintenancecenter/{surveyid:int}")]
[HttpGet] [HttpGet]
@ -126,6 +133,7 @@ namespace DamageAssesment.Api.Responses.Controllers
/// </summary> /// </summary>
/// <param name="responseId">The ID of the survey response to be retrieved.</param> /// <param name="responseId">The ID of the survey response to be retrieved.</param>
[Authorize(Roles = "admin,survey,user,report")]
[HttpGet("responses/{id}")] [HttpGet("responses/{id}")]
public async Task<ActionResult> GetSurveyResponseByIdAsync(int id) public async Task<ActionResult> GetSurveyResponseByIdAsync(int id)
{ {
@ -142,6 +150,7 @@ namespace DamageAssesment.Api.Responses.Controllers
/// </summary> /// </summary>
/// <param name="surveyResponse">The survey response object to be created.</param> /// <param name="surveyResponse">The survey response object to be created.</param>
[Authorize(Roles = "admin,survey,user,report")]
[HttpPost("responses")] [HttpPost("responses")]
public async Task<ActionResult> PostSurveysAsync(Models.SurveyResponse surveyResponse) public async Task<ActionResult> PostSurveysAsync(Models.SurveyResponse surveyResponse)
{ {
@ -158,6 +167,7 @@ namespace DamageAssesment.Api.Responses.Controllers
/// <param name="Id">The ID of the survey response to be updated.</param> /// <param name="Id">The ID of the survey response to be updated.</param>
/// <param name="surveyResponse">The updated survey response object.</param> /// <param name="surveyResponse">The updated survey response object.</param>
[Authorize(Roles = "admin,survey,user,report")]
[HttpPut("responses/{id}")] [HttpPut("responses/{id}")]
public async Task<ActionResult> PutSurveyResponseAsync(int id, Models.SurveyResponse surveyResponse) public async Task<ActionResult> PutSurveyResponseAsync(int id, Models.SurveyResponse surveyResponse)
{ {
@ -175,6 +185,7 @@ namespace DamageAssesment.Api.Responses.Controllers
/// DELETE request for deleting an existing survey response. /// DELETE request for deleting an existing survey response.
/// </summary> /// </summary>
[Authorize(Roles = "admin,survey,user,report")]
[HttpDelete("responses/{id}")] [HttpDelete("responses/{id}")]
public async Task<ActionResult> DeleteSurveyResponseAsync(int id) public async Task<ActionResult> DeleteSurveyResponseAsync(int id)
{ {
@ -190,6 +201,7 @@ namespace DamageAssesment.Api.Responses.Controllers
/// </summary> /// </summary>
/// <param name="request">The answers to be submitted for the survey.</param> /// <param name="request">The answers to be submitted for the survey.</param>
[Authorize(Roles = "admin,survey,user,report")]
[HttpPost("responses/answers")] [HttpPost("responses/answers")]
public async Task<ActionResult> PostSurveyAnswersAsync(Request request) public async Task<ActionResult> PostSurveyAnswersAsync(Request request)
{ {
@ -203,6 +215,8 @@ namespace DamageAssesment.Api.Responses.Controllers
/// <summary> /// <summary>
/// Get All active surveys . /// Get All active surveys .
/// </summary> /// </summary>
[Authorize(Roles = "admin,survey,user,report")]
[Route("responses/surveys/active")] [Route("responses/surveys/active")]
[Route("responses/surveys/active/{language:alpha}")] [Route("responses/surveys/active/{language:alpha}")]
[Route("responses/surveys/active/{employeeid:int}")] [Route("responses/surveys/active/{employeeid:int}")]
@ -220,6 +234,7 @@ namespace DamageAssesment.Api.Responses.Controllers
/// <summary> /// <summary>
/// Export all survey response data based on survey id. /// Export all survey response data based on survey id.
/// </summary> /// </summary>
[Authorize(Roles = "admin,survey,user,report")]
[HttpGet] [HttpGet]
[Route("responses/surveys/export/{surveyid}")] [Route("responses/surveys/export/{surveyid}")]
public async Task<ActionResult> GetExcelSurveysAsync(int surveyid, string language, bool IsAdmin = false) public async Task<ActionResult> GetExcelSurveysAsync(int surveyid, string language, bool IsAdmin = false)
@ -250,6 +265,7 @@ namespace DamageAssesment.Api.Responses.Controllers
/// <summary> /// <summary>
/// Get all historical surveys . /// Get all historical surveys .
/// </summary> /// </summary>
[Authorize(Roles = "admin,survey,user,report")]
[Route("responses/surveys/historic")] [Route("responses/surveys/historic")]
[Route("responses/surveys/historic/{language:alpha}")] [Route("responses/surveys/historic/{language:alpha}")]
[Route("responses/surveys/historic/{employeeid:int}")] [Route("responses/surveys/historic/{employeeid:int}")]

View File

@ -5,6 +5,8 @@
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
<GenerateDocumentationFile>True</GenerateDocumentationFile> <GenerateDocumentationFile>True</GenerateDocumentationFile>
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
<DockerComposeProjectPath>..\docker-compose.dcproj</DockerComposeProjectPath>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
@ -14,6 +16,7 @@
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.5" /> <PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.5" />
<PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="7.0.5" /> <PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="7.0.5" />
<PackageReference Include="Microsoft.Extensions.Http.Polly" Version="7.0.5" /> <PackageReference Include="Microsoft.Extensions.Http.Polly" Version="7.0.5" />
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.19.4" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" /> <PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" /> <PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" />
</ItemGroup> </ItemGroup>

View File

@ -3,7 +3,6 @@ using System.ComponentModel.DataAnnotations.Schema;
namespace DamageAssesment.Api.Responses.Db namespace DamageAssesment.Api.Responses.Db
{ {
[Table("SurveyResponses")]
public class SurveyResponse public class SurveyResponse
{ {
[Key] [Key]

View File

@ -0,0 +1,21 @@
#See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging.
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["DamageAssesment.Api.Responses/DamageAssesment.Api.Responses.csproj", "DamageAssesment.Api.Responses/"]
RUN dotnet restore "DamageAssesment.Api.Responses/DamageAssesment.Api.Responses.csproj"
COPY . .
WORKDIR "/src/DamageAssesment.Api.Responses"
RUN dotnet build "DamageAssesment.Api.Responses.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "DamageAssesment.Api.Responses.csproj" -c Release -o /app/publish /p:UseAppHost=false
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "DamageAssesment.Api.Responses.dll"]

View File

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

View File

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

View File

@ -1,10 +1,10 @@
using DamageAssesment.Api.Responses.Models; using DamageAssesment.Api.Responses.Models;
namespace DamageAssesment.Api.Responses.Interfaces namespace DamageAssesment.Api.Responses.Interfaces
{ {
public interface IEmployeeServiceProvider public interface IEmployeeServiceProvider
{ {
Task<List<Employee>> getEmployeesAsync(); Task<List<Employee>> getEmployeesAsync(string token);
Task<Employee> getEmployeeAsync(int employeeId); Task<Employee> getEmployeeAsync(int employeeId, string token);
} }
} }

View File

@ -1,9 +1,9 @@
using DamageAssesment.Api.Responses.Models; using DamageAssesment.Api.Responses.Models;
namespace DamageAssesment.Api.Responses.Interfaces namespace DamageAssesment.Api.Responses.Interfaces
{ {
public interface IHttpUtil public interface IHttpUtil
{ {
Task<string> SendAsync(HttpMethod method, string url, string JsonInput); Task<string> SendAsync(HttpMethod method, string url, string JsonInput, string token);
} }
} }

View File

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

View File

@ -4,9 +4,9 @@ namespace DamageAssesment.Api.Responses.Interfaces
{ {
public interface IQuestionServiceProvider public interface IQuestionServiceProvider
{ {
Task<List<Question>> getQuestionsAsync(string language); Task<List<Question>> getQuestionsAsync(string language,string token);
Task<List<SurveyQuestions>> getSurveyQuestionsAsync(int surveyId); Task<List<SurveyQuestions>> getSurveyQuestionsAsync(int surveyId, string token);
Task<Question> getQuestionsAsync(int questionId); Task<Question> getQuestionsAsync(int questionId, string token);
Task<List<QuestionCategory>> GetQuestionCategoriesAsync(string? language); Task<List<QuestionCategory>> GetQuestionCategoriesAsync(string? language, string token);
} }
} }

View File

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

View File

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

View File

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

View File

@ -8,9 +8,5 @@
public string Name { get; set; } public string Name { get; set; }
public string MaintenanceCenter { get; set; } public string MaintenanceCenter { get; set; }
public string SchoolType { get; set; } public string SchoolType { get; set; }
public int? DataValue { get; set; }
public int? Enrollment { get; set; }
public double? Longitute { get; set; }
public double? Latitude { get; set; }
} }
} }

View File

@ -5,7 +5,6 @@
public int CategoryId { get; set; } public int CategoryId { get; set; }
public string CategoryName { get; set; } public string CategoryName { get; set; }
public string CategoryImage { get; set; } public string CategoryImage { get; set; }
public object CategoryNames { get; set; }
public List<Question> Questions { get; set; } public List<Question> Questions { get; set; }
} }
} }

View File

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

View File

@ -1,23 +1,14 @@
{ {
"$schema": "https://json.schemastore.org/launchsettings.json",
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:58856",
"sslPort": 0
}
},
"profiles": { "profiles": {
"DamageAssesment.Api.SurveyResponses": { "DamageAssesment.Api.Responses": {
"commandName": "Project", "commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true, "launchBrowser": true,
"launchUrl": "swagger", "launchUrl": "swagger",
"applicationUrl": "http://localhost:5104",
"environmentVariables": { "environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development" "ASPNETCORE_ENVIRONMENT": "Development"
} },
"dotnetRunMessages": true,
"applicationUrl": "http://localhost:5104"
}, },
"IIS Express": { "IIS Express": {
"commandName": "IISExpress", "commandName": "IISExpress",
@ -26,6 +17,24 @@
"environmentVariables": { "environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development" "ASPNETCORE_ENVIRONMENT": "Development"
} }
},
"Docker": {
"commandName": "Docker",
"launchBrowser": true,
"launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}/swagger",
"environmentVariables": {
"ASPNETCORE_URLS": "http://+:80"
},
"publishAllPorts": true
}
},
"$schema": "https://json.schemastore.org/launchsettings.json",
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:58856",
"sslPort": 0
} }
} }
} }

View File

@ -2,6 +2,7 @@
using DamageAssesment.Api.Responses.Db; using DamageAssesment.Api.Responses.Db;
using DamageAssesment.Api.Responses.Interfaces; using DamageAssesment.Api.Responses.Interfaces;
using DamageAssesment.Api.Responses.Models; using DamageAssesment.Api.Responses.Models;
using DamageAssesment.Api.Responses.Services;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Internal; using Microsoft.EntityFrameworkCore.Metadata.Internal;
using System.Reflection; using System.Reflection;
@ -21,8 +22,10 @@ namespace DamageAssesment.Api.Responses.Providers
private readonly IQuestionServiceProvider questionServiceProvider; private readonly IQuestionServiceProvider questionServiceProvider;
private readonly ISurveyServiceProvider surveyServiceProvider; private readonly ISurveyServiceProvider surveyServiceProvider;
private readonly IMapper mapper; private readonly IMapper mapper;
private readonly IHttpContextAccessor httpContextAccessor;
private string token;
public SurveyResponsesProvider(SurveyResponseDbContext surveyResponseDbContext, ILogger<SurveyResponsesProvider> logger, IAnswerServiceProvider answerServiceProvider, IRegionServiceProvider regionServiceProvider, ILocationServiceProvider locationServiceProvider, IEmployeeServiceProvider employeeServiceProvider, IAttachmentServiceProvider attachmentServiceProvider, IQuestionServiceProvider questionServiceProvider, ISurveyServiceProvider surveyServiceProvider, IMapper mapper) public SurveyResponsesProvider(SurveyResponseDbContext surveyResponseDbContext, ILogger<SurveyResponsesProvider> logger, IAnswerServiceProvider answerServiceProvider, IRegionServiceProvider regionServiceProvider, ILocationServiceProvider locationServiceProvider, IEmployeeServiceProvider employeeServiceProvider, IAttachmentServiceProvider attachmentServiceProvider, IQuestionServiceProvider questionServiceProvider, ISurveyServiceProvider surveyServiceProvider, IMapper mapper, IHttpContextAccessor httpContextAccessor)
{ {
this.surveyResponseDbContext = surveyResponseDbContext; this.surveyResponseDbContext = surveyResponseDbContext;
this.logger = logger; this.logger = logger;
@ -33,8 +36,20 @@ namespace DamageAssesment.Api.Responses.Providers
this.attachmentServiceProvider = attachmentServiceProvider; this.attachmentServiceProvider = attachmentServiceProvider;
this.questionServiceProvider = questionServiceProvider; this.questionServiceProvider = questionServiceProvider;
this.surveyServiceProvider = surveyServiceProvider; this.surveyServiceProvider = surveyServiceProvider;
this.httpContextAccessor = httpContextAccessor;
this.mapper = mapper; this.mapper = mapper;
SeedData(); SeedData();
token = httpContextAccessor.HttpContext.Request.Headers.Authorization;
if (token != null)
{
token = token.Replace("Bearer ", string.Empty);
}
else
{
token = "";
}
// seedData();
} }
public void SeedData() public void SeedData()
@ -67,7 +82,7 @@ namespace DamageAssesment.Api.Responses.Providers
} }
listSurveyResponse = listSurveyResponse listSurveyResponse = listSurveyResponse
.OrderByDescending(obj => obj.Id) .OrderByDescending(obj => obj.Id)
.GroupBy(obj => new { obj.SurveyId, obj.LocationId })//obj.EmployeeId, .GroupBy(obj => new { obj.SurveyId, obj.EmployeeId, obj.LocationId })
.Select(group => group.FirstOrDefault()) // or .FirstOrDefault() if you want to handle empty groups .Select(group => group.FirstOrDefault()) // or .FirstOrDefault() if you want to handle empty groups
.ToList(); .ToList();
if (listSurveyResponse.Any()) if (listSurveyResponse.Any())
@ -124,7 +139,7 @@ namespace DamageAssesment.Api.Responses.Providers
{ {
logger?.LogInformation("Querying to get SurveyResponse object from DB"); logger?.LogInformation("Querying to get SurveyResponse object from DB");
//get all the survey that already taken by the employee //get all the survey that already taken by the employee
var surveys = await surveyServiceProvider.getSurveysAsync(language); var surveys = await surveyServiceProvider.getSurveysAsync(language,token);
surveys = surveys.Where(s => s.IsEnabled == true && s.Status == SurveyStatus.ACTIVE.ToString()).ToList(); surveys = surveys.Where(s => s.IsEnabled == true && s.Status == SurveyStatus.ACTIVE.ToString()).ToList();
if (employeeid == null || employeeid == 0) if (employeeid == null || employeeid == 0)
return (true, surveys, null); return (true, surveys, null);
@ -145,7 +160,7 @@ namespace DamageAssesment.Api.Responses.Providers
{ {
logger?.LogInformation("Querying to get SurveyResponse object from DB"); logger?.LogInformation("Querying to get SurveyResponse object from DB");
var surveys = await surveyServiceProvider.getSurveysAsync(language); var surveys = await surveyServiceProvider.getSurveysAsync(language, token);
// returning only historic data: end date is less than current date. // returning only historic data: end date is less than current date.
surveys = surveys.Where(s => s.Status == SurveyStatus.INACTIVE.ToString()).ToList(); surveys = surveys.Where(s => s.Status == SurveyStatus.INACTIVE.ToString()).ToList();
if (employeeid == null || employeeid == 0) if (employeeid == null || employeeid == 0)
@ -170,7 +185,7 @@ namespace DamageAssesment.Api.Responses.Providers
try try
{ {
logger?.LogInformation("Querying to get Survey object from microservice"); 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) if (survey != null)
{ {
@ -201,7 +216,7 @@ namespace DamageAssesment.Api.Responses.Providers
try try
{ {
logger?.LogInformation("Querying to get Survey object from microservice"); 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) if (survey != null)
{ {
@ -232,7 +247,7 @@ namespace DamageAssesment.Api.Responses.Providers
try try
{ {
logger?.LogInformation("Querying to get Survey object from microservice"); 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) if (survey != null)
{ {
@ -263,8 +278,8 @@ namespace DamageAssesment.Api.Responses.Providers
try try
{ {
logger?.LogInformation("Querying to get Survey object from microservice"); logger?.LogInformation("Querying to get Survey object from microservice");
var survey = await surveyServiceProvider.getSurveyAsync(surveyId); var survey = await surveyServiceProvider.getSurveyAsync(surveyId, token);
var question = await questionServiceProvider.getQuestionsAsync(questionId); var question = await questionServiceProvider.getQuestionsAsync(questionId, token);
bool IsCorrectAnswer = answer.ToLower().Equals("yes") || answer.ToLower().Equals("no") ? true : false; bool IsCorrectAnswer = answer.ToLower().Equals("yes") || answer.ToLower().Equals("no") ? true : false;
@ -425,9 +440,10 @@ namespace DamageAssesment.Api.Responses.Providers
{ {
try try
{ {
var answersList = await answerServiceProvider.getAnswersAsync(); var answersList = await answerServiceProvider.getAnswersAsync(token);
if (answersList == null || !answersList.Any()) if (answersList == null || !answersList.Any())
return null; return null;
//get all the answers for the particular survey //get all the answers for the particular survey
var surveyAnswers = answersList.Join( var surveyAnswers = answersList.Join(
surveyResponses, surveyResponses,
@ -447,8 +463,8 @@ namespace DamageAssesment.Api.Responses.Providers
if (surveyAnswers == null || !surveyAnswers.Any()) if (surveyAnswers == null || !surveyAnswers.Any())
return null; return null;
var regions = await regionServiceProvider.getRegionsAsync(); var regions = await regionServiceProvider.getRegionsAsync(token);
var locations = await locationServiceProvider.getLocationsAsync(); var locations = await locationServiceProvider.getLocationsAsync(token);
if (regions == null || !regions.Any() || locations == null || !locations.Any()) if (regions == null || !regions.Any() || locations == null || !locations.Any())
return null; return null;
@ -510,24 +526,22 @@ namespace DamageAssesment.Api.Responses.Providers
{ {
try try
{ {
var employee = await employeeServiceProvider.getEmployeeAsync(surveyResponse.EmployeeId); var employee = await employeeServiceProvider.getEmployeeAsync(surveyResponse.EmployeeId, token);
var answers = await answerServiceProvider.GetAnswersByResponseIdAsync(surveyResponse.Id); var answers = await answerServiceProvider.GetAnswersByResponseIdAsync(surveyResponse.Id, token);
var allQuestions = await questionServiceProvider.getQuestionsAsync(null); var allQuestions = await questionServiceProvider.getQuestionsAsync(null,token);
var questions = allQuestions.Where(s => s.SurveyId == surveyResponse.SurveyId); var questions = allQuestions.Where(s => s.SurveyId == surveyResponse.SurveyId);
var attachments = await attachmentServiceProvider.getAttachmentsAsync(); var attachments = await attachmentServiceProvider.getAttachmentsAsync(token);
var Locations = await locationServiceProvider.getLocationsAsync();
var location = Locations.Where(a => a.Id == surveyResponse.LocationId).FirstOrDefault(); var result = new
var result = new{ {
surveyResponse.Id, surveyResponse.Id,
surveyResponse.SurveyId, surveyResponse.SurveyId,
surveyResponse.LocationId, surveyResponse.LocationId,
surveyResponse.EmployeeId, surveyResponse.EmployeeId,
surveyResponse.ClientDevice, surveyResponse.ClientDevice,
surveyResponse.KeyAnswerResult, surveyResponse.KeyAnswerResult,
DataValue=(location!=null?location.DataValue:0), surveyResponse.Longitute,
Enrollment= (location != null ? location.Enrollment : 0), surveyResponse.Latitude,
Longitute = (location != null ? location.Longitute : surveyResponse.Longitute),
Latitude=(location != null ? location.Latitude : surveyResponse.Latitude),
Employee = employee, Employee = employee,
answers = from ans in answers answers = from ans in answers
select new select new
@ -561,31 +575,22 @@ namespace DamageAssesment.Api.Responses.Providers
if (employeeid == 0) if (employeeid == 0)
{ {
surveyResonses = await surveyResponseDbContext.SurveyResponses.Where(x => x.SurveyId == surveyId).ToListAsync(); surveyResonses = await surveyResponseDbContext.SurveyResponses.Where(x => x.SurveyId == surveyId).ToListAsync();
employees = await employeeServiceProvider.getEmployeesAsync(); employees = await employeeServiceProvider.getEmployeesAsync(token);
} }
else else
{ {
surveyResonses = await surveyResponseDbContext.SurveyResponses.Where(x => x.SurveyId == surveyId && x.EmployeeId == employeeid).ToListAsync(); surveyResonses = await surveyResponseDbContext.SurveyResponses.Where(x => x.SurveyId == surveyId && x.EmployeeId == employeeid).ToListAsync();
employee = await employeeServiceProvider.getEmployeeAsync(employeeid); employee = await employeeServiceProvider.getEmployeeAsync(employeeid, token);
} }
surveyResonses = surveyResonses
.OrderByDescending(obj => obj.Id) var answers = await answerServiceProvider.getAnswersAsync(token);
.GroupBy(obj => new { obj.SurveyId, obj.LocationId })//obj.EmployeeId, var questions = await questionServiceProvider.getQuestionsAsync(null, token);
.Select(group => group.FirstOrDefault()) // or .FirstOrDefault() if you want to handle empty groups
.ToList();
var answers = await answerServiceProvider.getAnswersAsync();
var questions = await questionServiceProvider.getQuestionsAsync(null);
var Locations = await locationServiceProvider.getLocationsAsync();
var surveyQuestions = from q in questions where q.SurveyId == surveyId select q; var surveyQuestions = from q in questions where q.SurveyId == surveyId select q;
//var surveyQuestions = await questionServiceProvider.getSurveyQuestionsAsync(surveyId); //var surveyQuestions = await questionServiceProvider.getSurveyQuestionsAsync(surveyId);
var attachments = await attachmentServiceProvider.getAttachmentsAsync(); var attachments = await attachmentServiceProvider.getAttachmentsAsync(token);
if (employeeid == 0)
{
var result = from r in surveyResonses var result = from r in surveyResonses
join loc in Locations on r.LocationId equals loc.Id
select new select new
{ {
r.Id, r.Id,
@ -593,18 +598,16 @@ namespace DamageAssesment.Api.Responses.Providers
r.LocationId, r.LocationId,
r.EmployeeId, r.EmployeeId,
r.ClientDevice, r.ClientDevice,
// r.KeyAnswerResult, r.KeyAnswerResult,
loc.DataValue, r.Longitute,
loc.Enrollment, r.Latitude,
loc.Longitute, Employee = (from e in employees where e.Id == r.EmployeeId select new { e.Id, e.Name, e.BirthDate, e.Email, e.OfficePhoneNumber }).SingleOrDefault(),
loc.Latitude,
// Employee = (from e in employees where e.Id == r.EmployeeId select new { e.Id, e.Name, e.BirthDate, e.Email, e.OfficePhoneNumber }).SingleOrDefault(),
answers = from ans in answers answers = from ans in answers
where ans.SurveyResponseId == r.Id where ans.SurveyResponseId == r.Id
select new select new
{ {
ans.Id, ans.Id,
// ans.QuestionId, ans.QuestionId,
ans.AnswerText, ans.AnswerText,
ans.Comment, ans.Comment,
Questions = (from q in surveyQuestions where q.Id == ans.QuestionId select new { q.Id, q.QuestionNumber, q.CategoryId, q.Text }).SingleOrDefault(), Questions = (from q in surveyQuestions where q.Id == ans.QuestionId select new { q.Id, q.QuestionNumber, q.CategoryId, q.Text }).SingleOrDefault(),
@ -614,44 +617,6 @@ namespace DamageAssesment.Api.Responses.Providers
}; };
return result; return result;
} }
else
{
object _employee = new { };
if (employee != null)
{
_employee = new { employee.Id, employee.Name, employee.BirthDate, employee.Email, employee.OfficePhoneNumber };
}
var result = from r in surveyResonses
join loc in Locations on r.LocationId equals loc.Id
select new
{
r.Id,
r.SurveyId,
r.LocationId,
r.EmployeeId,
r.ClientDevice,
// r.KeyAnswerResult,
loc.DataValue,
loc.Enrollment,
loc.Longitute,
loc.Latitude,
// Employee = _employee,
answers = from ans in answers
where ans.SurveyResponseId == r.Id
select new
{
ans.Id,
// ans.QuestionId,
ans.AnswerText,
ans.Comment,
Questions = (from q in questions where q.Id == ans.QuestionId select new { q.Id, q.QuestionNumber, q.CategoryId, q.Text }).SingleOrDefault(),
Attachments = from att in attachments where att.AnswerId == ans.Id select new { att.Id, att.URI }
}
};
return result;
}
}
catch (Exception ex) catch (Exception ex)
{ {
logger?.LogError($"Exception Found : {ex.Message} - Ref: SurveyResponsesProvider.getSurveyResponseBySurveyIdAsync()"); logger?.LogError($"Exception Found : {ex.Message} - Ref: SurveyResponsesProvider.getSurveyResponseBySurveyIdAsync()");
@ -672,12 +637,12 @@ namespace DamageAssesment.Api.Responses.Providers
if (employeeid == 0) if (employeeid == 0)
{ {
surveyResonses = await surveyResponseDbContext.SurveyResponses.ToListAsync(); surveyResonses = await surveyResponseDbContext.SurveyResponses.ToListAsync();
employees = await employeeServiceProvider.getEmployeesAsync(); employees = await employeeServiceProvider.getEmployeesAsync(token);
} }
else else
{ {
surveyResonses = await surveyResponseDbContext.SurveyResponses.Where(x => x.EmployeeId == employeeid).ToListAsync(); surveyResonses = await surveyResponseDbContext.SurveyResponses.Where(x => x.EmployeeId == employeeid).ToListAsync();
employee = await employeeServiceProvider.getEmployeeAsync(employeeid); employee = await employeeServiceProvider.getEmployeeAsync(employeeid, token);
if (employee != null) if (employee != null)
{ {
@ -686,13 +651,11 @@ namespace DamageAssesment.Api.Responses.Providers
} }
var answers = await answerServiceProvider.getAnswersAsync(); var answers = await answerServiceProvider.getAnswersAsync(token);
var questions = await questionServiceProvider.getQuestionsAsync(null); var questions = await questionServiceProvider.getQuestionsAsync(null,token);
var attachments = await attachmentServiceProvider.getAttachmentsAsync(); var attachments = await attachmentServiceProvider.getAttachmentsAsync(token);
var Locations = await locationServiceProvider.getLocationsAsync();
var result = from r in surveyResonses var result = from r in surveyResonses
join loc in Locations on r.LocationId equals loc.Id
select new select new
{ {
r.Id, r.Id,
@ -700,18 +663,16 @@ namespace DamageAssesment.Api.Responses.Providers
r.LocationId, r.LocationId,
r.EmployeeId, r.EmployeeId,
r.ClientDevice, r.ClientDevice,
// r.KeyAnswerResult, r.KeyAnswerResult,
loc.DataValue, r.Longitute,
loc.Enrollment, r.Latitude,
loc.Longitute, Employee = employeeid != 0 ? _employee : (from e in employees where r.EmployeeId == e.Id select new { e.Id, e.Name, e.BirthDate, e.Email, e.OfficePhoneNumber }).SingleOrDefault(),
loc.Latitude,
// Employee = employeeid != 0 ? _employee : (from e in employees where r.EmployeeId == e.Id select new { e.Id, e.Name, e.BirthDate, e.Email, e.OfficePhoneNumber }).SingleOrDefault(),
answers = from ans in answers answers = from ans in answers
where ans.SurveyResponseId == r.Id where ans.SurveyResponseId == r.Id
select new select new
{ {
ans.Id, ans.Id,
// ans.QuestionId, ans.QuestionId,
ans.AnswerText, ans.AnswerText,
ans.Comment, ans.Comment,
Questions = (from q in questions where q.Id == ans.QuestionId select new { q.Id, q.QuestionNumber, q.CategoryId, q.Text }).SingleOrDefault(), Questions = (from q in questions where q.Id == ans.QuestionId select new { q.Id, q.QuestionNumber, q.CategoryId, q.Text }).SingleOrDefault(),
@ -719,8 +680,6 @@ namespace DamageAssesment.Api.Responses.Providers
} }
}; };
return result; return result;
} }
catch (Exception ex) catch (Exception ex)
{ {
@ -736,12 +695,12 @@ namespace DamageAssesment.Api.Responses.Providers
if (string.IsNullOrEmpty(language)) language = "en"; if (string.IsNullOrEmpty(language)) language = "en";
List<Db.SurveyResponse> surveyResonses; List<Db.SurveyResponse> surveyResonses;
surveyResonses = await surveyResponseDbContext.SurveyResponses.Where(a => a.SurveyId == surveyId).ToListAsync(); surveyResonses = await surveyResponseDbContext.SurveyResponses.Where(a => a.SurveyId == surveyId).ToListAsync();
var answers = await answerServiceProvider.getAnswersAsync(); var answers = await answerServiceProvider.getAnswersAsync(token);
var Locations = await locationServiceProvider.getLocationsAsync(); var Locations = await locationServiceProvider.getLocationsAsync(token);
var regions = await regionServiceProvider.getRegionsAsync(); var regions = await regionServiceProvider.getRegionsAsync(token);
var questions = await questionServiceProvider.getQuestionsAsync(language); var questions = await questionServiceProvider.getQuestionsAsync(language, token);
var categories = await questionServiceProvider.GetQuestionCategoriesAsync(language); var categories = await questionServiceProvider.GetQuestionCategoriesAsync(language, token);
var attachments = await attachmentServiceProvider.getAttachmentsAsync(); var attachments = await attachmentServiceProvider.getAttachmentsAsync(token);
List<object> questionLists = new List<object>(); List<object> questionLists = new List<object>();
var allques = from res in surveyResonses var allques = from res in surveyResonses
join loc in Locations on res.LocationId equals loc.Id join loc in Locations on res.LocationId equals loc.Id
@ -873,8 +832,8 @@ namespace DamageAssesment.Api.Responses.Providers
{ {
surveyResponses = await surveyResponseDbContext.SurveyResponses.Where(x => x.SurveyId == surveyId && x.EmployeeId == employeeid).ToListAsync(); surveyResponses = await surveyResponseDbContext.SurveyResponses.Where(x => x.SurveyId == surveyId && x.EmployeeId == employeeid).ToListAsync();
} }
var answers = await answerServiceProvider.getAnswersAsync(); var answers = await answerServiceProvider.getAnswersAsync(token);
var locations = await locationServiceProvider.getLocationsAsync(); var locations = await locationServiceProvider.getLocationsAsync(token);
var maintenanceCenters = locations.DistinctBy(m => m.MaintenanceCenter); var maintenanceCenters = locations.DistinctBy(m => m.MaintenanceCenter);
//get all the answers for the particular survey //get all the answers for the particular survey
@ -940,31 +899,25 @@ namespace DamageAssesment.Api.Responses.Providers
if (employeeid == 0) if (employeeid == 0)
{ {
surveyResonses = await surveyResponseDbContext.SurveyResponses.Where(x => x.SurveyId == surveyId && x.LocationId == locationId).ToListAsync(); surveyResonses = await surveyResponseDbContext.SurveyResponses.Where(x => x.SurveyId == surveyId && x.LocationId == locationId).ToListAsync();
employees = await employeeServiceProvider.getEmployeesAsync(); employees = await employeeServiceProvider.getEmployeesAsync(token);
} }
else else
{ {
surveyResonses = await surveyResponseDbContext.SurveyResponses.Where(x => x.SurveyId == surveyId && x.EmployeeId == employeeid && x.LocationId == locationId).ToListAsync(); surveyResonses = await surveyResponseDbContext.SurveyResponses.Where(x => x.SurveyId == surveyId && x.EmployeeId == employeeid && x.LocationId == locationId).ToListAsync();
employee = await employeeServiceProvider.getEmployeeAsync(employeeid); employee = await employeeServiceProvider.getEmployeeAsync(employeeid, token);
if (employee != null) if (employee != null)
{ {
_employee = new { employee.Id, employee.Name, employee.BirthDate, employee.Email, employee.OfficePhoneNumber }; _employee = new { employee.Id, employee.Name, employee.BirthDate, employee.Email, employee.OfficePhoneNumber };
} }
} }
surveyResonses = surveyResonses
.OrderByDescending(obj => obj.Id)
.GroupBy(obj => new { obj.SurveyId, obj.LocationId }) //obj.EmployeeId,
.Select(group => group.FirstOrDefault()) // or .FirstOrDefault() if you want to handle empty groups
.ToList();
var answers = await answerServiceProvider.getAnswersAsync();
var questions = await questionServiceProvider.getQuestionsAsync(null);
var surveyQuestions = from q in questions where q.SurveyId == surveyId select q;
var attachments = await attachmentServiceProvider.getAttachmentsAsync();
var Locations = await locationServiceProvider.getLocationsAsync(); var answers = await answerServiceProvider.getAnswersAsync(token);
var questions = await questionServiceProvider.getQuestionsAsync(null,token);
var surveyQuestions = from q in questions where q.SurveyId == surveyId select q;
var attachments = await attachmentServiceProvider.getAttachmentsAsync(token);
var result = from r in surveyResonses var result = from r in surveyResonses
join loc in Locations on r.LocationId equals loc.Id
select new select new
{ {
r.Id, r.Id,
@ -972,18 +925,16 @@ namespace DamageAssesment.Api.Responses.Providers
r.LocationId, r.LocationId,
r.EmployeeId, r.EmployeeId,
r.ClientDevice, r.ClientDevice,
// r.KeyAnswerResult, r.KeyAnswerResult,
loc.DataValue, r.Longitute,
loc.Enrollment, r.Latitude,
loc.Longitute, Employee = (from e in employees where r.EmployeeId == e.Id select new { e.Id, e.Name, e.BirthDate, e.Email, e.OfficePhoneNumber }).SingleOrDefault(),
loc.Latitude,
// Employee = employeeid != 0 ? _employee : (from e in employees where r.EmployeeId == e.Id select new { e.Id, e.Name, e.BirthDate, e.Email, e.OfficePhoneNumber }).SingleOrDefault(),
answers = from ans in answers answers = from ans in answers
where ans.SurveyResponseId == r.Id where ans.SurveyResponseId == r.Id
select new select new
{ {
// ans.QuestionId, ans.QuestionId,
ans.Id, ans.Id,
ans.AnswerText, ans.AnswerText,
ans.Comment, ans.Comment,
@ -992,7 +943,6 @@ namespace DamageAssesment.Api.Responses.Providers
} }
}; };
return result; return result;
} }
catch (Exception ex) catch (Exception ex)
{ {
@ -1015,30 +965,25 @@ namespace DamageAssesment.Api.Responses.Providers
if (employeeid == 0) if (employeeid == 0)
{ {
surveyResponses = await surveyResponseDbContext.SurveyResponses.Where(x => x.SurveyId == survey.Id).ToListAsync(); surveyResponses = await surveyResponseDbContext.SurveyResponses.Where(x => x.SurveyId == survey.Id).ToListAsync();
employees = await employeeServiceProvider.getEmployeesAsync(); employees = await employeeServiceProvider.getEmployeesAsync(token);
} }
else else
{ {
surveyResponses = await surveyResponseDbContext.SurveyResponses.Where(x => x.SurveyId == survey.Id && x.EmployeeId == employeeid).ToListAsync(); surveyResponses = await surveyResponseDbContext.SurveyResponses.Where(x => x.SurveyId == survey.Id && x.EmployeeId == employeeid).ToListAsync();
employee = await employeeServiceProvider.getEmployeeAsync(employeeid); employee = await employeeServiceProvider.getEmployeeAsync(employeeid, token);
if (employee != null) if (employee != null)
{ {
_employee = new { employee.Id, employee.Name, employee.BirthDate, employee.Email, employee.OfficePhoneNumber }; _employee = new { employee.Id, employee.Name, employee.BirthDate, employee.Email, employee.OfficePhoneNumber };
} }
} }
surveyResponses = surveyResponses
.OrderByDescending(obj => obj.Id)
.GroupBy(obj => new { obj.SurveyId, obj.LocationId })//, obj.EmployeeId
.Select(group => group.FirstOrDefault()) // or .FirstOrDefault() if you want to handle empty groups
.ToList();
//var surveyResponses = await surveyResponseDbContext.Responses.Where(x => x.SurveyId == survey.Id).ToListAsync(); //var surveyResponses = await surveyResponseDbContext.Responses.Where(x => x.SurveyId == survey.Id).ToListAsync();
// var employees = await employeeServiceProvider.getEmployeesAsync(); // var employees = await employeeServiceProvider.getEmployeesAsync();
var answers = await answerServiceProvider.getAnswersAsync(); var answers = await answerServiceProvider.getAnswersAsync(token);
var attachments = await attachmentServiceProvider.getAttachmentsAsync(); var attachments = await attachmentServiceProvider.getAttachmentsAsync(token);
var Locations = await locationServiceProvider.getLocationsAsync();
var result = from r in surveyResponses var result = from r in surveyResponses
join loc in Locations on r.LocationId equals loc.Id
select new select new
{ {
r.Id, r.Id,
@ -1046,12 +991,10 @@ namespace DamageAssesment.Api.Responses.Providers
r.LocationId, r.LocationId,
r.EmployeeId, r.EmployeeId,
r.ClientDevice, r.ClientDevice,
// r.KeyAnswerResult, r.KeyAnswerResult,
loc.DataValue, r.Longitute,
loc.Enrollment, r.Latitude,
loc.Longitute, Employee = (from e in employees where r.EmployeeId == e.Id select new { e.Id, e.Name, e.BirthDate, e.Email, e.OfficePhoneNumber }).SingleOrDefault(),
loc.Latitude,
// Employee = employeeid != 0 ? _employee : (from e in employees where r.EmployeeId == e.Id select new { e.Id, e.Name, e.BirthDate, e.Email, e.OfficePhoneNumber }).SingleOrDefault(),
answers = from ans in answers answers = from ans in answers
where ans.SurveyResponseId == r.Id where ans.SurveyResponseId == r.Id
&& ans.QuestionId == question.Id && ans.QuestionId == question.Id
@ -1059,7 +1002,7 @@ namespace DamageAssesment.Api.Responses.Providers
select new select new
{ {
// ans.QuestionId, ans.QuestionId,
AnswerId = ans.Id, AnswerId = ans.Id,
ans.AnswerText, ans.AnswerText,
ans.Comment, ans.Comment,
@ -1081,12 +1024,12 @@ namespace DamageAssesment.Api.Responses.Providers
{ {
if (answerRequest != null) 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) if (answer != null)
{ {
List<AnswerInfo> listAnswerInfo = new List<AnswerInfo>(); List<AnswerInfo> listAnswerInfo = new List<AnswerInfo>();
listAnswerInfo.Add(new AnswerInfo { AnswerId = answer.Id, postedFiles = answerRequest.PostedFiles }); 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"; string message = $"Answer for question {answerRequest.QuestionId} saved to the database";
logger?.LogInformation(message); logger?.LogInformation(message);
@ -1107,7 +1050,6 @@ namespace DamageAssesment.Api.Responses.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)
{ {
try try

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,6 +1,7 @@
using DamageAssesment.Api.Responses.Interfaces; using DamageAssesment.Api.Responses.Interfaces;
using DamageAssesment.Api.Responses.Models; using DamageAssesment.Api.Responses.Models;
using Newtonsoft.Json; using Newtonsoft.Json;
using OfficeOpenXml.FormulaParsing.LexicalAnalysis;
namespace DamageAssesment.Api.Responses.Services namespace DamageAssesment.Api.Responses.Services
{ {
@ -10,13 +11,13 @@ namespace DamageAssesment.Api.Responses.Services
{ {
} }
public async Task<List<Question>> getQuestionsAsync(string language) public async Task<List<Question>> getQuestionsAsync(string language,string token)
{ {
try try
{ {
if (!string.IsNullOrEmpty(language)) if (!string.IsNullOrEmpty(language))
url = url + "/" + language; url = url + "/" + language;
var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null); var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null,token);
var questions = JsonConvert.DeserializeObject<List<Question>>(responseJsonString); var questions = JsonConvert.DeserializeObject<List<Question>>(responseJsonString);
if (questions == null || !questions.Any()) if (questions == null || !questions.Any())
@ -29,7 +30,7 @@ namespace DamageAssesment.Api.Responses.Services
return new List<Question>(); return new List<Question>();
} }
} }
public async Task<List<QuestionCategory>> GetQuestionCategoriesAsync(string? language) public async Task<List<QuestionCategory>> GetQuestionCategoriesAsync(string? language,string token)
{ {
try try
{ {
@ -37,7 +38,7 @@ namespace DamageAssesment.Api.Responses.Services
if (!string.IsNullOrEmpty(language)) if (!string.IsNullOrEmpty(language))
url = url + "/" + language; url = url + "/" + language;
var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null); var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null, token);
var questions = JsonConvert.DeserializeObject<List<QuestionCategory>>(responseJsonString); var questions = JsonConvert.DeserializeObject<List<QuestionCategory>>(responseJsonString);
if (questions == null || !questions.Any()) if (questions == null || !questions.Any())
@ -50,13 +51,12 @@ namespace DamageAssesment.Api.Responses.Services
return new List<QuestionCategory>(); return new List<QuestionCategory>();
} }
} }
public async Task<List<SurveyQuestions>> getSurveyQuestionsAsync(int surveyId, string token)
public async Task<List<SurveyQuestions>> getSurveyQuestionsAsync(int surveyId)
{ {
try try
{ {
url = urlBase + string.Format(configuration.GetValue<string>("RessourceSettings:SurveyQuestion"), surveyId); url = urlBase + string.Format(configuration.GetValue<string>("RessourceSettings:SurveyQuestion"), surveyId);
var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null); var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null, token);
var questions = JsonConvert.DeserializeObject<List<SurveyQuestions>>(responseJsonString); var questions = JsonConvert.DeserializeObject<List<SurveyQuestions>>(responseJsonString);
if (questions == null || !questions.Any()) if (questions == null || !questions.Any())
@ -71,12 +71,12 @@ namespace DamageAssesment.Api.Responses.Services
} }
public async Task<Question> getQuestionsAsync(int questionId) public async Task<Question> getQuestionsAsync(int questionId, string token)
{ {
try try
{ {
url = urlBase + string.Format(configuration.GetValue<string>("RessourceSettings:QuestionById"), questionId); url = urlBase + string.Format(configuration.GetValue<string>("RessourceSettings:QuestionById"), questionId);
var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null); var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null, token);
var question = JsonConvert.DeserializeObject<Question>(responseJsonString); var question = JsonConvert.DeserializeObject<Question>(responseJsonString);
if (question == null) if (question == null)

View File

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

View File

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

View File

@ -6,14 +6,26 @@
} }
}, },
"AllowedHosts": "*", "AllowedHosts": "*",
"JwtSettings": {
"securitykey": "bWlhbWkgZGFkZSBzY2hvb2xzIHNlY3JldCBrZXk="
},
//"EndPointSettings": {
// "AnswerUrlBase": "http://localhost:5200",
// "LocationUrlBase": "http://localhost:5213",
// "RegionUrlBase": "http://localhost:5211",
// "QuestionUrlBase": "http://localhost:5133",
// "EmployeeUrlBase": "http://localhost:5135",
// "AttachmentUrlBase": "http://localhost:5243",
// "SurveyUrlBase": "http://localhost:5009"
//},
//Endpoints for docker-container
"EndPointSettings": { "EndPointSettings": {
"AnswerUrlBase": "http://localhost:5200", "AnswerUrlBase": "http://damageassesment.api.answers:80",
"LocationUrlBase": "http://localhost:5213", "LocationUrlBase": "http://damageassesment.api.locations:80",
"RegionUrlBase": "http://localhost:5211", "QuestionUrlBase": "http://damageassesment.api.questions:80",
"QuestionUrlBase": "http://localhost:5133", "EmployeeUrlBase": "http://damageassesment.api.employees:80",
"EmployeeUrlBase": "http://localhost:5135", "AttachmentUrlBase": "http://damageassesment.api.attachments:80",
"AttachmentUrlBase": "http://localhost:5243", "SurveyUrlBase": "http://damageassesment.api.surveys:80"
"SurveyUrlBase": "http://localhost:5009"
}, },
"RessourceSettings": { "RessourceSettings": {
"Employee": "/employees", "Employee": "/employees",

View File

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

View File

@ -1,4 +1,5 @@
using DamageAssesment.Api.Surveys.Interfaces; using DamageAssesment.Api.Surveys.Interfaces;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
namespace DamageAssesment.Api.Surveys.Controllers namespace DamageAssesment.Api.Surveys.Controllers
@ -15,6 +16,7 @@ namespace DamageAssesment.Api.Surveys.Controllers
/// <summary> /// <summary>
/// GET request for retrieving surveys. /// GET request for retrieving surveys.
/// </summary> /// </summary>
[Authorize(Roles ="admin,survey,user,report")]
[Route("surveys")] [Route("surveys")]
[Route("surveys/{language:alpha}")] [Route("surveys/{language:alpha}")]
[HttpGet] [HttpGet]
@ -27,39 +29,11 @@ namespace DamageAssesment.Api.Surveys.Controllers
} }
return NoContent(); return NoContent();
} }
/// <summary>
/// GET request for retrieving all active surveys.
/// </summary>
[Route("surveys/active")]
[Route("surveys/active/{language:alpha}")]
[HttpGet]
public async Task<ActionResult> GetActiveSurveysAsync(string? language)
{
var result = await this.surveyProvider.GetActiveSurveysAsync(true,language);
if (result.IsSuccess)
{
return Ok(result.Surveys);
}
return NoContent();
}
/// <summary>
/// GET request for retrieving all inactive surveys.
/// </summary>
[Route("surveys/inactive")]
[Route("surveys/inactive/{language:alpha}")]
[HttpGet]
public async Task<ActionResult> GetInActiveSurveysAsync(string? language)
{
var result = await this.surveyProvider.GetActiveSurveysAsync(false, language);
if (result.IsSuccess)
{
return Ok(result.Surveys);
}
return NoContent();
}
/// <summary> /// <summary>
/// GET request for retrieving surveys by ID. /// GET request for retrieving surveys by ID.
/// </summary> /// </summary>
[Authorize(Roles = "admin,survey,user,report")]
[Route("surveys/{id:int}")] [Route("surveys/{id:int}")]
[Route("surveys/{id:int}/{language:alpha}")] [Route("surveys/{id:int}/{language:alpha}")]
[HttpGet] [HttpGet]
@ -75,6 +49,7 @@ namespace DamageAssesment.Api.Surveys.Controllers
/// <summary> /// <summary>
/// POST request for creating a new survey. /// POST request for creating a new survey.
/// </summary> /// </summary>
[Authorize(Roles = "admin,survey,user,report")]
[HttpPost("surveys")] [HttpPost("surveys")]
public async Task<ActionResult> PostSurveysAsync(Models.Survey survey) public async Task<ActionResult> PostSurveysAsync(Models.Survey survey)
{ {
@ -88,6 +63,8 @@ namespace DamageAssesment.Api.Surveys.Controllers
/// <summary> /// <summary>
/// PUT request for updating an existing survey (surveyId,Updated Survey data). /// PUT request for updating an existing survey (surveyId,Updated Survey data).
/// </summary> /// </summary>
[Authorize(Roles = "admin,survey")]
[HttpPut("surveys/{id}")] [HttpPut("surveys/{id}")]
public async Task<ActionResult> PutSurveysAsync(int id, Models.Survey survey) public async Task<ActionResult> PutSurveysAsync(int id, Models.Survey survey)
{ {
@ -105,6 +82,7 @@ namespace DamageAssesment.Api.Surveys.Controllers
/// <summary> /// <summary>
/// DELETE request for deleting a survey by ID. /// DELETE request for deleting a survey by ID.
/// </summary> /// </summary>
[Authorize(Roles = "admin,survey")]
[HttpDelete("surveys/{id}")] [HttpDelete("surveys/{id}")]
public async Task<ActionResult> DeleteSurveysAsync(int id) public async Task<ActionResult> DeleteSurveysAsync(int id)
{ {

View File

@ -5,6 +5,8 @@
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
<GenerateDocumentationFile>True</GenerateDocumentationFile> <GenerateDocumentationFile>True</GenerateDocumentationFile>
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
<DockerComposeProjectPath>..\docker-compose.dcproj</DockerComposeProjectPath>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
@ -12,6 +14,7 @@
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.21" /> <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.21" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.5" /> <PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.5" />
<PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="7.0.5" /> <PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="7.0.5" />
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.19.4" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" /> <PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" />
</ItemGroup> </ItemGroup>

View File

@ -3,7 +3,6 @@ using System.ComponentModel.DataAnnotations;
namespace DamageAssesment.Api.Surveys.Db namespace DamageAssesment.Api.Surveys.Db
{ {
[Table("SurveyTrans")]
public class SurveyTranslation public class SurveyTranslation
{ {
[Key] [Key]

View File

@ -0,0 +1,21 @@
#See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging.
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["DamageAssesment.Api.Surveys/DamageAssesment.Api.Surveys.csproj", "DamageAssesment.Api.Surveys/"]
RUN dotnet restore "DamageAssesment.Api.Surveys/DamageAssesment.Api.Surveys.csproj"
COPY . .
WORKDIR "/src/DamageAssesment.Api.Surveys"
RUN dotnet build "DamageAssesment.Api.Surveys.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "DamageAssesment.Api.Surveys.csproj" -c Release -o /app/publish /p:UseAppHost=false
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "DamageAssesment.Api.Surveys.dll"]

View File

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

View File

@ -6,6 +6,7 @@ using Microsoft.EntityFrameworkCore;
using Microsoft.IdentityModel.Tokens; using Microsoft.IdentityModel.Tokens;
using System.Text; using System.Text;
using System.Reflection; using System.Reflection;
using Microsoft.OpenApi.Models;
var builder = WebApplication.CreateBuilder(args); var builder = WebApplication.CreateBuilder(args);
@ -34,14 +35,44 @@ builder.Services.AddControllers();
builder.Services.AddScoped<ISurveyProvider, SurveysProvider>(); builder.Services.AddScoped<ISurveyProvider, SurveysProvider>();
builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies()); builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());
builder.Services.AddEndpointsApiExplorer(); builder.Services.AddEndpointsApiExplorer();
//builder.Services.AddSwaggerGen();
builder.Services.AddSwaggerGen(c => builder.Services.AddSwaggerGen(options =>
{ {
// Include XML comments from your assembly // Include XML comments from your assembly
var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"; var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile); 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<SurveysDbContext>(option => builder.Services.AddDbContext<SurveysDbContext>(option =>
{ {
option.UseInMemoryDatabase("Surveys"); option.UseInMemoryDatabase("Surveys");

View File

@ -1,23 +1,14 @@
{ {
"$schema": "https://json.schemastore.org/launchsettings.json",
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:51498",
"sslPort": 0
}
},
"profiles": { "profiles": {
"DamageAssesment.Api.Surveys": { "DamageAssesment.Api.Surveys": {
"commandName": "Project", "commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true, "launchBrowser": true,
"launchUrl": "swagger", "launchUrl": "swagger",
"applicationUrl": "http://localhost:5009",
"environmentVariables": { "environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development" "ASPNETCORE_ENVIRONMENT": "Development"
} },
"dotnetRunMessages": true,
"applicationUrl": "http://localhost:5009"
}, },
"IIS Express": { "IIS Express": {
"commandName": "IISExpress", "commandName": "IISExpress",
@ -26,6 +17,24 @@
"environmentVariables": { "environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development" "ASPNETCORE_ENVIRONMENT": "Development"
} }
},
"Docker": {
"commandName": "Docker",
"launchBrowser": true,
"launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}/swagger",
"environmentVariables": {
"ASPNETCORE_URLS": "http://+:80"
},
"publishAllPorts": true
}
},
"$schema": "https://json.schemastore.org/launchsettings.json",
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:51498",
"sslPort": 0
} }
} }
} }

View File

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

View File

@ -0,0 +1,8 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
}
}

Some files were not shown because too many files have changed in this diff Show More