Compare commits

...

10 Commits

148 changed files with 3408 additions and 1009 deletions

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,5 +1,6 @@
// <auto-generated /> // <auto-generated />
using DamageAssesment.Api.SurveyResponses.Db; using System;
using DamageAssesment.Api.Answers.Db;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata; using Microsoft.EntityFrameworkCore.Metadata;
@ -8,11 +9,11 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
#nullable disable #nullable disable
namespace DamageAssesment.Api.SurveyResponses.Migrations namespace DamageAssesment.Api.Answers.Migrations
{ {
[DbContext(typeof(SurveyResponseDbContext))] [DbContext(typeof(AnswerDbContext))]
[Migration("20230817221348_InitialSurveyResponse")] [Migration("20230927172606_InitialAnswer")]
partial class InitialSurveyResponse partial class InitialAnswer
{ {
/// <inheritdoc /> /// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder) protected override void BuildTargetModel(ModelBuilder modelBuilder)
@ -24,7 +25,7 @@ namespace DamageAssesment.Api.SurveyResponses.Migrations
SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
modelBuilder.Entity("DamageAssesment.Api.SurveyResponses.Db.SurveyResponse", b => modelBuilder.Entity("DamageAssesment.Api.Answers.Db.Answer", b =>
{ {
b.Property<int>("Id") b.Property<int>("Id")
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
@ -32,22 +33,24 @@ namespace DamageAssesment.Api.SurveyResponses.Migrations
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id")); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<string>("EmployeeId") b.Property<string>("AnswerText")
.IsRequired() .IsRequired()
.HasMaxLength(6) .HasMaxLength(250)
.HasColumnType("nvarchar(6)"); .HasColumnType("nvarchar(250)");
b.Property<string>("LocationId") b.Property<string>("Comment")
.IsRequired() .IsRequired()
.HasMaxLength(4) .HasColumnType("nvarchar(max)");
.HasColumnType("nvarchar(4)");
b.Property<int>("SurveyId") b.Property<int>("QuestionId")
.HasColumnType("int");
b.Property<int?>("SurveyResponseId")
.HasColumnType("int"); .HasColumnType("int");
b.HasKey("Id"); b.HasKey("Id");
b.ToTable("SurveyResponses"); b.ToTable("Answers");
}); });
#pragma warning restore 612, 618 #pragma warning restore 612, 618
} }

View File

@ -2,10 +2,10 @@
#nullable disable #nullable disable
namespace DamageAssesment.Api.Employees.Migrations namespace DamageAssesment.Api.Answers.Migrations
{ {
/// <inheritdoc /> /// <inheritdoc />
public partial class updatedemployee_id : Migration public partial class InitialAnswer : Migration
{ {
/// <inheritdoc /> /// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder) protected override void Up(MigrationBuilder migrationBuilder)

View File

@ -0,0 +1,58 @@
// <auto-generated />
using System;
using DamageAssesment.Api.Answers.Db;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
#nullable disable
namespace DamageAssesment.Api.Answers.Migrations
{
[DbContext(typeof(AnswerDbContext))]
[Migration("20230927173358_InitialAnswercreate")]
partial class InitialAnswercreate
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "7.0.9")
.HasAnnotation("Relational:MaxIdentifierLength", 128);
SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
modelBuilder.Entity("DamageAssesment.Api.Answers.Db.Answer", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<string>("AnswerText")
.IsRequired()
.HasMaxLength(250)
.HasColumnType("nvarchar(250)");
b.Property<string>("Comment")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<int>("QuestionId")
.HasColumnType("int");
b.Property<int?>("SurveyResponseId")
.HasColumnType("int");
b.HasKey("Id");
b.ToTable("Answers");
});
#pragma warning restore 612, 618
}
}
}

View File

@ -0,0 +1,22 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace DamageAssesment.Api.Answers.Migrations
{
/// <inheritdoc />
public partial class InitialAnswercreate : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
}
}
}

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

@ -18,7 +18,7 @@ namespace DamageAssesment.Api.Answers.Providers
this.answerDbContext = answerDbContext; this.answerDbContext = answerDbContext;
this.logger = logger; this.logger = logger;
this.mapper = mapper; this.mapper = mapper;
//SeedData(); SeedData();
} }
public async Task<(bool IsSuccess, IEnumerable<Models.Answer> Answers, string ErrorMessage)> GetAnswersAsync() public async Task<(bool IsSuccess, IEnumerable<Models.Answer> Answers, string ErrorMessage)> GetAnswersAsync()

View File

@ -9,7 +9,11 @@
} }
}, },
"AllowedHosts": "*", "AllowedHosts": "*",
//"ConnectionStrings": {
// "AnswerConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;"
//},
"ConnectionStrings": { "ConnectionStrings": {
"AnswerConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;" "AnswerConnection": "Server=tcp:da-dev.database.windows.net,1433;Initial Catalog=da-dev-db;Encrypt=True;User ID=admin-dev;Password=b3tgRABw8LGE75k;TrustServerCertificate=False;Connection Timeout=30;"
} }
} }

View File

@ -20,7 +20,7 @@ namespace DamageAssesment.Api.Attachments.Test
public async Task GetAttachmentsAsync_ShouldReturnStatusCode200() public async Task GetAttachmentsAsync_ShouldReturnStatusCode200()
{ {
var mockAttachmentService = new Mock<IAttachmentsProvider>(); var mockAttachmentService = new Mock<IAttachmentsProvider>();
var mockUploadService = new Mock<IUploadService>(); var mockUploadService = new Mock<IAzureBlobService>();
var mockResponse = await MockData.getOkResponse(); var mockResponse = await MockData.getOkResponse();
mockAttachmentService.Setup(service => service.GetAttachmentsAsync()).ReturnsAsync(mockResponse); mockAttachmentService.Setup(service => service.GetAttachmentsAsync()).ReturnsAsync(mockResponse);
var AttachmentProvider = new AttachmentsController(mockAttachmentService.Object, mockUploadService.Object); var AttachmentProvider = new AttachmentsController(mockAttachmentService.Object, mockUploadService.Object);
@ -33,7 +33,7 @@ namespace DamageAssesment.Api.Attachments.Test
public async Task GetAttachmentsAsync_ShouldReturnStatusCode204() public async Task GetAttachmentsAsync_ShouldReturnStatusCode204()
{ {
var mockAttachmentService = new Mock<IAttachmentsProvider>(); var mockAttachmentService = new Mock<IAttachmentsProvider>();
var mockUploadService = new Mock<IUploadService>(); var mockUploadService = new Mock<IAzureBlobService>();
var mockResponse = await MockData.getNoContentResponse(); var mockResponse = await MockData.getNoContentResponse();
mockAttachmentService.Setup(service => service.GetAttachmentsAsync()).ReturnsAsync(mockResponse); mockAttachmentService.Setup(service => service.GetAttachmentsAsync()).ReturnsAsync(mockResponse);
@ -47,7 +47,7 @@ namespace DamageAssesment.Api.Attachments.Test
public async Task GetAttachmentAsync_ShouldReturnStatusCode200() public async Task GetAttachmentAsync_ShouldReturnStatusCode200()
{ {
var mockAttachmentService = new Mock<IAttachmentsProvider>(); var mockAttachmentService = new Mock<IAttachmentsProvider>();
var mockUploadService = new Mock<IUploadService>(); var mockUploadService = new Mock<IAzureBlobService>();
var mockResponse = await MockData.getOkResponse(1); var mockResponse = await MockData.getOkResponse(1);
mockAttachmentService.Setup(service => service.GetAttachmentByIdAsync(1)).ReturnsAsync(mockResponse); mockAttachmentService.Setup(service => service.GetAttachmentByIdAsync(1)).ReturnsAsync(mockResponse);
@ -61,7 +61,7 @@ namespace DamageAssesment.Api.Attachments.Test
public async Task GetAttachmentAsync_ShouldReturnStatusCode404() public async Task GetAttachmentAsync_ShouldReturnStatusCode404()
{ {
var mockAttachmentService = new Mock<IAttachmentsProvider>(); var mockAttachmentService = new Mock<IAttachmentsProvider>();
var mockUploadService = new Mock<IUploadService>(); var mockUploadService = new Mock<IAzureBlobService>();
var mockResponse = await MockData.getNotFoundResponse(); var mockResponse = await MockData.getNotFoundResponse();
mockAttachmentService.Setup(service => service.GetAttachmentByIdAsync(99)).ReturnsAsync(mockResponse); mockAttachmentService.Setup(service => service.GetAttachmentByIdAsync(99)).ReturnsAsync(mockResponse);
var AttachmentProvider = new AttachmentsController(mockAttachmentService.Object, mockUploadService.Object); var AttachmentProvider = new AttachmentsController(mockAttachmentService.Object, mockUploadService.Object);
@ -73,7 +73,7 @@ namespace DamageAssesment.Api.Attachments.Test
public async Task PostAttachmentAsync_ShouldReturnStatusCode200() public async Task PostAttachmentAsync_ShouldReturnStatusCode200()
{ {
var mockAttachmentService = new Mock<IAttachmentsProvider>(); var mockAttachmentService = new Mock<IAttachmentsProvider>();
var mockUploadService = new Mock<IUploadService>(); var mockUploadService = new Mock<IAzureBlobService>();
var mockResponse = await MockData.getOkResponse(); var mockResponse = await MockData.getOkResponse();
var AttachmentResponse = await MockData.GetAttachmentInfo(0); var AttachmentResponse = await MockData.GetAttachmentInfo(0);
var mockInputAttachment = await MockData.getInputAttachmentData(); var mockInputAttachment = await MockData.getInputAttachmentData();
@ -89,7 +89,7 @@ namespace DamageAssesment.Api.Attachments.Test
public async Task PostAttachmentAsync_ShouldReturnStatusCode400() public async Task PostAttachmentAsync_ShouldReturnStatusCode400()
{ {
var mockAttachmentService = new Mock<IAttachmentsProvider>(); var mockAttachmentService = new Mock<IAttachmentsProvider>();
var mockUploadService = new Mock<IUploadService>(); var mockUploadService = new Mock<IAzureBlobService>();
var mockInputAttachment = await MockData.getInputAttachmentData(); var mockInputAttachment = await MockData.getInputAttachmentData();
var mockResponse = await MockData.getBadRequestResponse(); var mockResponse = await MockData.getBadRequestResponse();
mockAttachmentService.Setup(service => service.PostAttachmentAsync(mockInputAttachment)).ReturnsAsync(mockResponse); mockAttachmentService.Setup(service => service.PostAttachmentAsync(mockInputAttachment)).ReturnsAsync(mockResponse);
@ -105,7 +105,7 @@ namespace DamageAssesment.Api.Attachments.Test
public async Task PutAttachmentAsync_ShouldReturnStatusCode200() public async Task PutAttachmentAsync_ShouldReturnStatusCode200()
{ {
var mockAttachmentService = new Mock<IAttachmentsProvider>(); var mockAttachmentService = new Mock<IAttachmentsProvider>();
var mockUploadService = new Mock<IUploadService>(); var mockUploadService = new Mock<IAzureBlobService>();
var mockResponse = await MockData.getOkResponse(); var mockResponse = await MockData.getOkResponse();
var AttachmentResponse = await MockData.GetAttachmentInfo(1); var AttachmentResponse = await MockData.GetAttachmentInfo(1);
var mockInputAttachment = await MockData.getInputAttachmentData(); var mockInputAttachment = await MockData.getInputAttachmentData();
@ -121,7 +121,7 @@ namespace DamageAssesment.Api.Attachments.Test
public async Task PutAttachmentAsync_ShouldReturnStatusCode400() public async Task PutAttachmentAsync_ShouldReturnStatusCode400()
{ {
var mockAttachmentService = new Mock<IAttachmentsProvider>(); var mockAttachmentService = new Mock<IAttachmentsProvider>();
var mockUploadService = new Mock<IUploadService>(); var mockUploadService = new Mock<IAzureBlobService>();
var mockInputAttachment = await MockData.getInputAttachmentData(); var mockInputAttachment = await MockData.getInputAttachmentData();
var mockResponse = await MockData.getBadRequestResponse(); var mockResponse = await MockData.getBadRequestResponse();
mockAttachmentService.Setup(service => service.PostAttachmentAsync(mockInputAttachment)).ReturnsAsync(mockResponse); mockAttachmentService.Setup(service => service.PostAttachmentAsync(mockInputAttachment)).ReturnsAsync(mockResponse);
@ -136,7 +136,7 @@ namespace DamageAssesment.Api.Attachments.Test
public async Task DeleteAttachmentAsync_ShouldReturnStatusCode200() public async Task DeleteAttachmentAsync_ShouldReturnStatusCode200()
{ {
var mockAttachmentService = new Mock<IAttachmentsProvider>(); var mockAttachmentService = new Mock<IAttachmentsProvider>();
var mockUploadService = new Mock<IUploadService>(); var mockUploadService = new Mock<IAzureBlobService>();
var mockResponse = await MockData.getOkResponse(1); var mockResponse = await MockData.getOkResponse(1);
mockAttachmentService.Setup(service => service.DeleteAttachmentAsync(1)).ReturnsAsync(mockResponse); mockAttachmentService.Setup(service => service.DeleteAttachmentAsync(1)).ReturnsAsync(mockResponse);
mockUploadService.Setup(service => service.Deletefile("")); mockUploadService.Setup(service => service.Deletefile(""));
@ -150,7 +150,7 @@ namespace DamageAssesment.Api.Attachments.Test
public async Task DeleteAttachmentAsync_ShouldReturnStatusCode404() public async Task DeleteAttachmentAsync_ShouldReturnStatusCode404()
{ {
var mockAttachmentService = new Mock<IAttachmentsProvider>(); var mockAttachmentService = new Mock<IAttachmentsProvider>();
var mockUploadService = new Mock<IUploadService>(); var mockUploadService = new Mock<IAzureBlobService>();
var mockResponse = await MockData.getNotFoundResponse(); var mockResponse = await MockData.getNotFoundResponse();
mockAttachmentService.Setup(service => service.DeleteAttachmentAsync(1)).ReturnsAsync(mockResponse); mockAttachmentService.Setup(service => service.DeleteAttachmentAsync(1)).ReturnsAsync(mockResponse);
var AttachmentProvider = new AttachmentsController(mockAttachmentService.Object, mockUploadService.Object); var AttachmentProvider = new AttachmentsController(mockAttachmentService.Object, mockUploadService.Object);

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;
@ -12,16 +13,17 @@ namespace DamageAssesment.Api.Attachments.Controllers
{ {
private IAttachmentsProvider AttachmentProvider; private IAttachmentsProvider AttachmentProvider;
private IUploadService UploadService; private IUploadService UploadService;
private IAzureBlobService azureBlobService;
public AttachmentsController(IAttachmentsProvider AttachmentsProvider, IUploadService uploadService) public AttachmentsController(IAttachmentsProvider AttachmentsProvider, IAzureBlobService azureBlobService)
{ {
this.AttachmentProvider = AttachmentsProvider; this.AttachmentProvider = AttachmentsProvider;
this.UploadService = uploadService; this.azureBlobService = azureBlobService;
} }
/// <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 +39,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 +83,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)
{ {
@ -89,7 +92,7 @@ namespace DamageAssesment.Api.Attachments.Controllers
if (attachmentInfo.Answers.Count > 0) if (attachmentInfo.Answers.Count > 0)
{ {
var Attachments = await this.AttachmentProvider.GetAttachmentCounter(); var Attachments = await this.AttachmentProvider.GetAttachmentCounter();
List<Models.Attachment> attachments = UploadService.UploadAttachment(attachmentInfo.ResponseId, Attachments.counter, attachmentInfo.Answers); List<Models.Attachment> attachments = await azureBlobService.UploadAttachment(attachmentInfo.ResponseId, Attachments.counter, attachmentInfo.Answers);
var result = await this.AttachmentProvider.PostAttachmentAsync(attachments); var result = await this.AttachmentProvider.PostAttachmentAsync(attachments);
if (result.IsSuccess) if (result.IsSuccess)
{ {
@ -107,7 +110,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)
{ {
@ -118,7 +121,7 @@ namespace DamageAssesment.Api.Attachments.Controllers
var res = await this.AttachmentProvider.GetAttachmentInfo(attachmentInfo.Answers); var res = await this.AttachmentProvider.GetAttachmentInfo(attachmentInfo.Answers);
if (res.IsSuccess) if (res.IsSuccess)
{ {
List<Models.Attachment> attachments = UploadService.UpdateAttachments(attachmentInfo.ResponseId, attachmentInfo.Answers, res.Attachments); List<Models.Attachment> attachments = await azureBlobService.UpdateAttachments(attachmentInfo.ResponseId, attachmentInfo.Answers, res.Attachments);
var result = await this.AttachmentProvider.PutAttachmentAsync(attachments); var result = await this.AttachmentProvider.PutAttachmentAsync(attachments);
if (result.IsSuccess) if (result.IsSuccess)
{ {
@ -138,6 +141,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)
{ {
@ -146,7 +150,7 @@ namespace DamageAssesment.Api.Attachments.Controllers
if (result.IsSuccess) if (result.IsSuccess)
{ {
// deleting file from folder // deleting file from folder
UploadService.Movefile(result.Attachment.URI); azureBlobService.Movefile(result.Attachment.URI);
return Ok(result.Attachment); return Ok(result.Attachment);
} }
return NotFound(); return NotFound();

View File

@ -1,10 +1,15 @@
using Azure.Storage.Blobs.Models; using Azure.Storage.Blobs.Models;
using DamageAssesment.Api.Attachments.Models;
namespace DamageAssesment.Api.Attachments.Interfaces namespace DamageAssesment.Api.Attachments.Interfaces
{ {
public interface IAzureBlobService public interface IAzureBlobService
{ {
Task<List<Azure.Response<BlobContentInfo>>> UploadFiles(List<IFormFile> files); Task<List<Azure.Response<BlobContentInfo>>> UploadFiles(List<IFormFile> files);
void DeleteFile(string path); Task<List<Attachment>> UploadAttachment(int responseId, int answerId, int counter, List<IFormFile> postedFile);
Task<List<Attachment>> UploadAttachment(int responseId, int counter, List<AnswerInfo> answers);
Task<List<Attachment>> UpdateAttachments(int responseId, List<AnswerInfo> answers, IEnumerable<Models.Attachment> attachments);
void Deletefile(string path);
void Movefile(string path);
} }
} }

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.AddScoped<IAttachmentsProvider, AttachmentsProvider>(); builder.Services.AddScoped<IAttachmentsProvider, AttachmentsProvider>();
builder.Services.AddScoped<IUploadService, UploadService>(); builder.Services.AddScoped<IUploadService, UploadService>();
@ -45,6 +95,7 @@ if (app.Environment.IsDevelopment())
app.UseSwaggerUI(); app.UseSwaggerUI();
} }
app.UseAuthentication();
app.UseAuthorization(); app.UseAuthorization();
app.UseHttpsRedirection(); app.UseHttpsRedirection();

View File

@ -3,6 +3,9 @@ using Azure.Storage.Blobs;
using Azure.Storage.Blobs.Models; using Azure.Storage.Blobs.Models;
using Azure.Storage.Blobs.Specialized; using Azure.Storage.Blobs.Specialized;
using DamageAssesment.Api.Attachments.Interfaces; using DamageAssesment.Api.Attachments.Interfaces;
using DamageAssesment.Api.Attachments.Models;
using System.Diagnostics.Metrics;
using System.Text;
namespace DamageAssesment.Api.Attachments.Providers namespace DamageAssesment.Api.Attachments.Providers
{ {
@ -10,11 +13,95 @@ namespace DamageAssesment.Api.Attachments.Providers
{ {
BlobServiceClient _blobClient; BlobServiceClient _blobClient;
BlobContainerClient _containerClient; BlobContainerClient _containerClient;
string azureConnectionString = "<Primary Connection String>"; string azureConnectionString;
public AzureBlobService() private string uploadpath = "";
private string Deletepath = "";
public AzureBlobService(IConfiguration configuration)
{ {
_blobClient = new BlobServiceClient(azureConnectionString); uploadpath = configuration.GetValue<string>("Fileupload:folderpath");
_containerClient = _blobClient.GetBlobContainerClient("apiimages"); Deletepath = configuration.GetValue<string>("Fileupload:Deletepath");
_blobClient = new BlobServiceClient(configuration.GetValue<string>("Fileupload:BlobConnectionString"));
_containerClient = _blobClient.GetBlobContainerClient(configuration.GetValue<string>("Fileupload:BlobContainerName"));
}
public async Task<List<Attachment>> UploadAttachment(int responseId, int answerId, int counter, List<IFormFile> postedFile)
{
var pathToSave = Path.Combine(uploadpath, "Response-" + responseId);
String fullDirectoryPath = Path.Combine(pathToSave, "Answer-" + answerId);
List<Models.Attachment> attachments = new List<Models.Attachment>();
foreach (IFormFile item in postedFile)
{
counter++;
var UserfileName = Path.GetFileName(item.FileName);
var extension = System.IO.Path.GetExtension(UserfileName);
var fileName = String.Format("Attachment_{0}{1}", counter, extension);
var stream = item.OpenReadStream();
BlobClient client = _containerClient.GetBlobClient(fullDirectoryPath + "/" + fileName);
string dbPath = fullDirectoryPath + "/" + fileName;
var result = await client.UploadAsync(stream, true);
attachments.Add(new Models.Attachment { AnswerId = answerId, ResponseId = responseId, IsDeleted = false, FileName = UserfileName, URI = dbPath });
}
return attachments;
}
public async Task<List<Attachment>> UploadAttachment(int responseId, int counter, List<AnswerInfo> answers)
{
List<Models.Attachment> attachments = new List<Models.Attachment>();
try
{
foreach (var item in answers)
{
int answerId = item.AnswerId;
var pathToSave = Path.Combine(uploadpath, "Response-" + responseId);
String fullDirectoryPath = Path.Combine(pathToSave, "Answer-" + answerId);
foreach (var file in item.postedFiles)
{
counter++;
var UserfileName = Path.GetFileName(file.FileName);
var fileName = String.Format("Attachment_{0}{1}", counter, file.FileExtension);
byte[] byteArray = Convert.FromBase64String(file.FileContent);
MemoryStream stream = new MemoryStream(byteArray);
BlobClient client = _containerClient.GetBlobClient(fullDirectoryPath + "/" + fileName);
string dbPath = fullDirectoryPath + "/" + fileName;
var result = await client.UploadAsync(stream, true);
attachments.Add(new Models.Attachment { AnswerId = answerId, ResponseId = responseId, IsDeleted = false, FileName = UserfileName, URI = dbPath });
}
}
return attachments;
}
catch (Exception ex)
{
return new List<Models.Attachment>();
}
}
public async Task<List<Attachment>> UpdateAttachments(int responseId, List<AnswerInfo> answers, IEnumerable<Models.Attachment> attachments)
{
List<Models.Attachment> Dbattachments = new List<Models.Attachment>();
foreach (Models.Attachment searchFile in attachments)
{
Movefile(searchFile.URI);
}
foreach (var item in answers)
{
int answerId = item.AnswerId;
var pathToSave = Path.Combine(uploadpath, "Response-" + responseId);
String fullDirectoryPath = Path.Combine(pathToSave, "Answer-" + answerId);
foreach (var file in item.postedFiles)
{
Models.Attachment attachment = attachments.Where(a => a.Id == file.AttachmentId).FirstOrDefault();
var UserfileName = Path.GetFileName(file.FileName);
var fileName = String.Format("Attachment_{0}{1}", attachment?.Id, file.FileExtension);
byte[] byteArray = Convert.FromBase64String(file.FileContent);
MemoryStream stream = new MemoryStream(byteArray);
BlobClient client = _containerClient.GetBlobClient(fullDirectoryPath + "/" + fileName);
string dbPath = fullDirectoryPath + "/" + fileName;
var result = await client.UploadAsync(stream, true);
Dbattachments.Add(new Models.Attachment { Id = attachment.Id, AnswerId = answerId, ResponseId = responseId, IsDeleted = false, FileName = UserfileName, URI = dbPath });
}
}
return Dbattachments;
} }
public async Task<List<Azure.Response<BlobContentInfo>>> UploadFiles(List<IFormFile> files) public async Task<List<Azure.Response<BlobContentInfo>>> UploadFiles(List<IFormFile> files)
@ -35,10 +122,52 @@ namespace DamageAssesment.Api.Attachments.Providers
return azureResponse; return azureResponse;
} }
public void DeleteFile(string url) public string getMovefilename(string movefilename)
{ {
var blob = _containerClient.GetBlockBlobClient(url); var list = movefilename.Split('.');
blob.DeleteIfExists(); if (list.Length > 0)
list[list.Length - 1] = DateTime.Now.ToShortDateString().Replace("/", "_") + "_" + DateTime.Now.ToShortTimeString().Replace("/", "_") + "." + list[list.Length - 1];
return string.Join("_", list);
}
public void Movefile(string path)
{
try
{
if (path != "")
{
string MovePath = getMovefilename(path.Replace(uploadpath, Deletepath));
// Get references to the source and destination blobs
BlobClient sourceBlobClient = _containerClient.GetBlobClient(path);
BlobClient destinationBlobClient = _containerClient.GetBlobClient(MovePath);
// Start the copy operation from the source to the destination
destinationBlobClient.StartCopyFromUri(sourceBlobClient.Uri);
// Check if the copy operation completed successfully
WaitForCopyToComplete(destinationBlobClient);
// Delete the source blob after a successful copy
sourceBlobClient.DeleteIfExists();
}
}
catch (Exception ex)
{
}
}
static void WaitForCopyToComplete(BlobClient blobClient)
{
BlobProperties properties = blobClient.GetProperties();
while (properties.CopyStatus == CopyStatus.Pending)
{
Task.Delay(TimeSpan.FromSeconds(1));
properties = blobClient.GetProperties();
}
}
public void Deletefile(string url)
{
BlobClient sourceBlobClient = _containerClient.GetBlobClient(url);
sourceBlobClient.DeleteIfExists();
} }
} }
} }

View File

@ -11,9 +11,15 @@
"AllowedHosts": "*", "AllowedHosts": "*",
"Fileupload": { "Fileupload": {
"folderpath": "DMS_Attachments/Active", "folderpath": "DMS_Attachments/Active",
"Deletepath": "DMS_Attachments/Deleted" "Deletepath": "DMS_Attachments/Deleted",
"BlobConnectionString": "DefaultEndpointsProtocol=https;AccountName=damagedoculink;AccountKey=blynpwrAQtthEneXC5f4vFewJ3tPV+QZUt1AX3nefZScPPjkr5hMoC18B9ni6/ZYdhRiERPQw+hB+AStonf+iw==;EndpointSuffix=core.windows.net",
"BlobContainerName": "doculinks"
}, },
//"ConnectionStrings": {
// "AttachmentConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;"
//}
"ConnectionStrings": { "ConnectionStrings": {
"AttachmentConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;" "AttachmentConnection": "Server=tcp:da-dev.database.windows.net,1433;Initial Catalog=da-dev-db;Encrypt=True;User ID=admin-dev;Password=b3tgRABw8LGE75k;TrustServerCertificate=False;Connection Timeout=30;"
} }
} }

View File

@ -15,7 +15,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
public async Task GetDocumentsLanguageAsync_ShouldReturnStatusCode204() public async Task GetDocumentsLanguageAsync_ShouldReturnStatusCode204()
{ {
var mockDocumentService = new Mock<IDoculinkProvider>(); var mockDocumentService = new Mock<IDoculinkProvider>();
var mockUploadService = new Mock<IUploadService>(); var mockUploadService = new Mock<IAzureBlobService>();
var mockResponse = await MockData.getNoContentResponse(); var mockResponse = await MockData.getNoContentResponse();
mockDocumentService.Setup(service => service.GetdocumentsByLinkAsync("forms","en",null)).ReturnsAsync(mockResponse); mockDocumentService.Setup(service => service.GetdocumentsByLinkAsync("forms","en",null)).ReturnsAsync(mockResponse);
@ -29,7 +29,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
public async Task GetDocumentsLinkTypeAsync_ShouldReturnStatusCode204() public async Task GetDocumentsLinkTypeAsync_ShouldReturnStatusCode204()
{ {
var mockDocumentService = new Mock<IDoculinkProvider>(); var mockDocumentService = new Mock<IDoculinkProvider>();
var mockUploadService = new Mock<IUploadService>(); var mockUploadService = new Mock<IAzureBlobService>();
var mockResponse = await MockData.getNoContentResponse(); var mockResponse = await MockData.getNoContentResponse();
mockDocumentService.Setup(service => service.GetdocumentsByLinkAsync("forms", "en", true)).ReturnsAsync(mockResponse); mockDocumentService.Setup(service => service.GetdocumentsByLinkAsync("forms", "en", true)).ReturnsAsync(mockResponse);
@ -42,7 +42,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
public async Task GetDocumentsAsync_ShouldReturnStatusCode200() public async Task GetDocumentsAsync_ShouldReturnStatusCode200()
{ {
var mockDocumentService = new Mock<IDoculinkProvider>(); var mockDocumentService = new Mock<IDoculinkProvider>();
var mockUploadService = new Mock<IUploadService>(); var mockUploadService = new Mock<IAzureBlobService>();
var mockResponse = await MockData.getOkResponse(); var mockResponse = await MockData.getOkResponse();
mockDocumentService.Setup(service => service.GetdocumentsByLinkAsync("forms","en", null)).ReturnsAsync(mockResponse); mockDocumentService.Setup(service => service.GetdocumentsByLinkAsync("forms","en", null)).ReturnsAsync(mockResponse);
@ -55,7 +55,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
public async Task GetActiveDocumentsAsync_ShouldReturnStatusCode200() public async Task GetActiveDocumentsAsync_ShouldReturnStatusCode200()
{ {
var mockDocumentService = new Mock<IDoculinkProvider>(); var mockDocumentService = new Mock<IDoculinkProvider>();
var mockUploadService = new Mock<IUploadService>(); var mockUploadService = new Mock<IAzureBlobService>();
var mockResponse = await MockData.getOkResponse(); var mockResponse = await MockData.getOkResponse();
mockDocumentService.Setup(service => service.GetdocumentsByLinkAsync("forms", "en", true)).ReturnsAsync(mockResponse); mockDocumentService.Setup(service => service.GetdocumentsByLinkAsync("forms", "en", true)).ReturnsAsync(mockResponse);
@ -69,7 +69,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
public async Task GetDocumentAsync_ShouldReturnStatusCode200() public async Task GetDocumentAsync_ShouldReturnStatusCode200()
{ {
var mockDocumentService = new Mock<IDoculinkProvider>(); var mockDocumentService = new Mock<IDoculinkProvider>();
var mockUploadService = new Mock<IUploadService>(); var mockUploadService = new Mock<IAzureBlobService>();
var mockResponse = await MockData.getOkResponse(1); var mockResponse = await MockData.getOkResponse(1);
mockDocumentService.Setup(service => service.GetDocumentAsync(1,"forms","en")).ReturnsAsync(mockResponse); mockDocumentService.Setup(service => service.GetDocumentAsync(1,"forms","en")).ReturnsAsync(mockResponse);
@ -83,7 +83,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
public async Task GetDocumentAsync_ShouldReturnStatusCode404() public async Task GetDocumentAsync_ShouldReturnStatusCode404()
{ {
var mockDocumentService = new Mock<IDoculinkProvider>(); var mockDocumentService = new Mock<IDoculinkProvider>();
var mockUploadService = new Mock<IUploadService>(); var mockUploadService = new Mock<IAzureBlobService>();
var mockResponse = await MockData.getNotFoundResponse(); var mockResponse = await MockData.getNotFoundResponse();
mockDocumentService.Setup(service => service.GetDocumentAsync(99, "forms", "en")).ReturnsAsync(mockResponse); mockDocumentService.Setup(service => service.GetDocumentAsync(99, "forms", "en")).ReturnsAsync(mockResponse);
var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object); var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object);
@ -94,7 +94,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
public async Task PostDocumentAsync_ShouldReturnStatusCode200() public async Task PostDocumentAsync_ShouldReturnStatusCode200()
{ {
var mockDocumentService = new Mock<IDoculinkProvider>(); var mockDocumentService = new Mock<IDoculinkProvider>();
var mockUploadService = new Mock<IUploadService>(); var mockUploadService = new Mock<IAzureBlobService>();
var mockResponse = await MockData.getOkResponse(1); var mockResponse = await MockData.getOkResponse(1);
var mockInputDocument = await MockData.getInputDocumentData(); var mockInputDocument = await MockData.getInputDocumentData();
var DocumentResponse = await MockData.GetDocuLinksInfo(0); var DocumentResponse = await MockData.GetDocuLinksInfo(0);
@ -109,7 +109,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
public async Task PostDocumentAsync_ShouldReturnStatusCode400() public async Task PostDocumentAsync_ShouldReturnStatusCode400()
{ {
var mockDocumentService = new Mock<IDoculinkProvider>(); var mockDocumentService = new Mock<IDoculinkProvider>();
var mockUploadService = new Mock<IUploadService>(); var mockUploadService = new Mock<IAzureBlobService>();
var mockInputDocument = await MockData.getInputDocumentData(); var mockInputDocument = await MockData.getInputDocumentData();
var mockResponse = await MockData.getBadRequestResponse(); var mockResponse = await MockData.getBadRequestResponse();
ReqDoculink documentInfo = null; ReqDoculink documentInfo = null;
@ -124,7 +124,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
public async Task PutDocumentAsync_ShouldReturnStatusCode200() public async Task PutDocumentAsync_ShouldReturnStatusCode200()
{ {
var mockDocumentService = new Mock<IDoculinkProvider>(); var mockDocumentService = new Mock<IDoculinkProvider>();
var mockUploadService = new Mock<IUploadService>(); var mockUploadService = new Mock<IAzureBlobService>();
var mockResponse = await MockData.getOkResponse(1); var mockResponse = await MockData.getOkResponse(1);
var mockInputDocument = await MockData.getInputDocumentData(); var mockInputDocument = await MockData.getInputDocumentData();
var DocumentResponse = await MockData.GetDocuLinksInfo(1); var DocumentResponse = await MockData.GetDocuLinksInfo(1);
@ -139,7 +139,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
public async Task PutDocumentAsync_ShouldReturnStatusCode400() public async Task PutDocumentAsync_ShouldReturnStatusCode400()
{ {
var mockDocumentService = new Mock<IDoculinkProvider>(); var mockDocumentService = new Mock<IDoculinkProvider>();
var mockUploadService = new Mock<IUploadService>(); var mockUploadService = new Mock<IAzureBlobService>();
var mockResponse = await MockData.getBadRequestResponse(); var mockResponse = await MockData.getBadRequestResponse();
var mockInputDocument = await MockData.getInputDocumentData(); var mockInputDocument = await MockData.getInputDocumentData();
mockDocumentService.Setup(service => service.UpdateDocumentAsync(99,mockInputDocument)).ReturnsAsync(mockResponse); mockDocumentService.Setup(service => service.UpdateDocumentAsync(99,mockInputDocument)).ReturnsAsync(mockResponse);
@ -152,7 +152,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
public async Task DeleteDocumentAsync_ShouldReturnStatusCode200() public async Task DeleteDocumentAsync_ShouldReturnStatusCode200()
{ {
var mockDocumentService = new Mock<IDoculinkProvider>(); var mockDocumentService = new Mock<IDoculinkProvider>();
var mockUploadService = new Mock<IUploadService>(); var mockUploadService = new Mock<IAzureBlobService>();
var mockResponse = await MockData.getOkResponse(1); var mockResponse = await MockData.getOkResponse(1);
mockDocumentService.Setup(service => service.DeleteDocumentAsync(1)).ReturnsAsync(mockResponse); mockDocumentService.Setup(service => service.DeleteDocumentAsync(1)).ReturnsAsync(mockResponse);
var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object); var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object);
@ -164,7 +164,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
public async Task DeleteDocumentAsync_ShouldReturnStatusCode404() public async Task DeleteDocumentAsync_ShouldReturnStatusCode404()
{ {
var mockDocumentService = new Mock<IDoculinkProvider>(); var mockDocumentService = new Mock<IDoculinkProvider>();
var mockUploadService = new Mock<IUploadService>(); var mockUploadService = new Mock<IAzureBlobService>();
var mockResponse = await MockData.getNotFoundResponse(); var mockResponse = await MockData.getNotFoundResponse();
mockDocumentService.Setup(service => service.DeleteDocumentAsync(1)).ReturnsAsync(mockResponse); mockDocumentService.Setup(service => service.DeleteDocumentAsync(1)).ReturnsAsync(mockResponse);
var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object); var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object);
@ -180,7 +180,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
public async Task GetDocumentCategoriesAsync_ShouldReturnStatusCode200() public async Task GetDocumentCategoriesAsync_ShouldReturnStatusCode200()
{ {
var mockDocumentService = new Mock<IDoculinkProvider>(); var mockDocumentService = new Mock<IDoculinkProvider>();
var mockUploadService = new Mock<IUploadService>(); var mockUploadService = new Mock<IAzureBlobService>();
var mockResponse = await LinkTypeMockData.getOkResponse(); var mockResponse = await LinkTypeMockData.getOkResponse();
mockDocumentService.Setup(service => service.GetLinkTypesAsync("en")).ReturnsAsync(mockResponse); mockDocumentService.Setup(service => service.GetLinkTypesAsync("en")).ReturnsAsync(mockResponse);
var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object); var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object);
@ -193,7 +193,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
public async Task GetDocumentCategoriesAsync_ShouldReturnStatusCode204() public async Task GetDocumentCategoriesAsync_ShouldReturnStatusCode204()
{ {
var mockDocumentService = new Mock<IDoculinkProvider>(); var mockDocumentService = new Mock<IDoculinkProvider>();
var mockUploadService = new Mock<IUploadService>(); var mockUploadService = new Mock<IAzureBlobService>();
var mockResponse = await LinkTypeMockData.getNoContentResponse(); var mockResponse = await LinkTypeMockData.getNoContentResponse();
mockDocumentService.Setup(service => service.GetLinkTypesAsync("en")).ReturnsAsync(mockResponse); mockDocumentService.Setup(service => service.GetLinkTypesAsync("en")).ReturnsAsync(mockResponse);
@ -207,7 +207,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
public async Task GetDocumentcategoryAsync_ShouldReturnStatusCode200() public async Task GetDocumentcategoryAsync_ShouldReturnStatusCode200()
{ {
var mockDocumentService = new Mock<IDoculinkProvider>(); var mockDocumentService = new Mock<IDoculinkProvider>();
var mockUploadService = new Mock<IUploadService>(); var mockUploadService = new Mock<IAzureBlobService>();
var mockResponse = await LinkTypeMockData.getOkResponse(1); var mockResponse = await LinkTypeMockData.getOkResponse(1);
mockDocumentService.Setup(service => service.GetLinkTypeAsync(1,"en")).ReturnsAsync(mockResponse); mockDocumentService.Setup(service => service.GetLinkTypeAsync(1,"en")).ReturnsAsync(mockResponse);
var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object); var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object);
@ -220,7 +220,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
public async Task GetDocumentcategoryAsync_ShouldReturnStatusCode404() public async Task GetDocumentcategoryAsync_ShouldReturnStatusCode404()
{ {
var mockDocumentService = new Mock<IDoculinkProvider>(); var mockDocumentService = new Mock<IDoculinkProvider>();
var mockUploadService = new Mock<IUploadService>(); var mockUploadService = new Mock<IAzureBlobService>();
var mockResponse = await LinkTypeMockData.getNotFoundResponse(); var mockResponse = await LinkTypeMockData.getNotFoundResponse();
mockDocumentService.Setup(service => service.GetLinkTypeAsync(99, "en")).ReturnsAsync(mockResponse); mockDocumentService.Setup(service => service.GetLinkTypeAsync(99, "en")).ReturnsAsync(mockResponse);
@ -233,7 +233,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
public async Task PostDocumentcategoryAsync_ShouldReturnStatusCode200() public async Task PostDocumentcategoryAsync_ShouldReturnStatusCode200()
{ {
var mockDocumentService = new Mock<IDoculinkProvider>(); var mockDocumentService = new Mock<IDoculinkProvider>();
var mockUploadService = new Mock<IUploadService>(); var mockUploadService = new Mock<IAzureBlobService>();
var mockResponse = await LinkTypeMockData.getOkResponse(1); var mockResponse = await LinkTypeMockData.getOkResponse(1);
var mockInputDocument = await LinkTypeMockData.getInputLinkData(0); var mockInputDocument = await LinkTypeMockData.getInputLinkData(0);
mockDocumentService.Setup(service => service.PostLinkTypeAsync(mockInputDocument)).ReturnsAsync(mockResponse); mockDocumentService.Setup(service => service.PostLinkTypeAsync(mockInputDocument)).ReturnsAsync(mockResponse);
@ -247,7 +247,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
public async Task PostDocumentcategoryAsync_ShouldReturnStatusCode400() public async Task PostDocumentcategoryAsync_ShouldReturnStatusCode400()
{ {
var mockDocumentService = new Mock<IDoculinkProvider>(); var mockDocumentService = new Mock<IDoculinkProvider>();
var mockUploadService = new Mock<IUploadService>(); var mockUploadService = new Mock<IAzureBlobService>();
var mockInputDocument = await LinkTypeMockData.getInputLinkData(99); var mockInputDocument = await LinkTypeMockData.getInputLinkData(99);
var mockResponse = await LinkTypeMockData.getBadRequestResponse(); var mockResponse = await LinkTypeMockData.getBadRequestResponse();
mockDocumentService.Setup(service => service.PostLinkTypeAsync(mockInputDocument)).ReturnsAsync(mockResponse); mockDocumentService.Setup(service => service.PostLinkTypeAsync(mockInputDocument)).ReturnsAsync(mockResponse);
@ -261,7 +261,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
public async Task PutDocumentcategoryAsync_ShouldReturnStatusCode200() public async Task PutDocumentcategoryAsync_ShouldReturnStatusCode200()
{ {
var mockDocumentService = new Mock<IDoculinkProvider>(); var mockDocumentService = new Mock<IDoculinkProvider>();
var mockUploadService = new Mock<IUploadService>(); var mockUploadService = new Mock<IAzureBlobService>();
var mockResponse = await LinkTypeMockData.getOkResponse(1); var mockResponse = await LinkTypeMockData.getOkResponse(1);
var mockInputDocument = await LinkTypeMockData.getInputLinkData(1); var mockInputDocument = await LinkTypeMockData.getInputLinkData(1);
mockDocumentService.Setup(service => service.UpdateLinkTypeAsync(1,mockInputDocument)).ReturnsAsync(mockResponse); mockDocumentService.Setup(service => service.UpdateLinkTypeAsync(1,mockInputDocument)).ReturnsAsync(mockResponse);
@ -275,7 +275,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
public async Task PutDocumentcategoryAsync_ShouldReturnStatusCode404() public async Task PutDocumentcategoryAsync_ShouldReturnStatusCode404()
{ {
var mockDocumentService = new Mock<IDoculinkProvider>(); var mockDocumentService = new Mock<IDoculinkProvider>();
var mockUploadService = new Mock<IUploadService>(); var mockUploadService = new Mock<IAzureBlobService>();
var mockResponse = await LinkTypeMockData.getNotFoundResponse(); var mockResponse = await LinkTypeMockData.getNotFoundResponse();
var mockInputDocument = await LinkTypeMockData.getInputLinkData(99); var mockInputDocument = await LinkTypeMockData.getInputLinkData(99);
mockDocumentService.Setup(service => service.UpdateLinkTypeAsync(99,mockInputDocument)).ReturnsAsync(mockResponse); mockDocumentService.Setup(service => service.UpdateLinkTypeAsync(99,mockInputDocument)).ReturnsAsync(mockResponse);
@ -289,7 +289,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
public async Task PutDocumentcategoryAsync_ShouldReturnStatusCode400() public async Task PutDocumentcategoryAsync_ShouldReturnStatusCode400()
{ {
var mockDocumentService = new Mock<IDoculinkProvider>(); var mockDocumentService = new Mock<IDoculinkProvider>();
var mockUploadService = new Mock<IUploadService>(); var mockUploadService = new Mock<IAzureBlobService>();
var mockResponse = await LinkTypeMockData.getBadRequestResponse(); var mockResponse = await LinkTypeMockData.getBadRequestResponse();
var mockInputDocument = await LinkTypeMockData.getInputLinkData(1); var mockInputDocument = await LinkTypeMockData.getInputLinkData(1);
mockDocumentService.Setup(service => service.UpdateLinkTypeAsync(1,mockInputDocument)).ReturnsAsync(mockResponse); mockDocumentService.Setup(service => service.UpdateLinkTypeAsync(1,mockInputDocument)).ReturnsAsync(mockResponse);
@ -303,7 +303,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
public async Task DeleteDocumentcategoryAsync_ShouldReturnStatusCode200() public async Task DeleteDocumentcategoryAsync_ShouldReturnStatusCode200()
{ {
var mockDocumentService = new Mock<IDoculinkProvider>(); var mockDocumentService = new Mock<IDoculinkProvider>();
var mockUploadService = new Mock<IUploadService>(); var mockUploadService = new Mock<IAzureBlobService>();
var mockResponse = await LinkTypeMockData.getOkResponse(1); var mockResponse = await LinkTypeMockData.getOkResponse(1);
mockDocumentService.Setup(service => service.DeleteLinkTypeAsync(1)).ReturnsAsync(mockResponse); mockDocumentService.Setup(service => service.DeleteLinkTypeAsync(1)).ReturnsAsync(mockResponse);
@ -316,7 +316,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
public async Task DeleteDocumentcategoryAsync_ShouldReturnStatusCode404() public async Task DeleteDocumentcategoryAsync_ShouldReturnStatusCode404()
{ {
var mockDocumentService = new Mock<IDoculinkProvider>(); var mockDocumentService = new Mock<IDoculinkProvider>();
var mockUploadService = new Mock<IUploadService>(); var mockUploadService = new Mock<IAzureBlobService>();
var mockResponse = await LinkTypeMockData.getNotFoundResponse(); var mockResponse = await LinkTypeMockData.getNotFoundResponse();
mockDocumentService.Setup(service => service.DeleteLinkTypeAsync(1)).ReturnsAsync(mockResponse); mockDocumentService.Setup(service => service.DeleteLinkTypeAsync(1)).ReturnsAsync(mockResponse);

View File

@ -32,7 +32,8 @@ namespace DamageAssesment.Api.DocuLinks.Test
doclinksAttachments.Add(new DoculinkAttachments() doclinksAttachments.Add(new DoculinkAttachments()
{ {
docName = "",Path="www.google.com", docName = "",Path="www.google.com",
IsAttachments=false,CustomOrder=1 Language = "en",
IsAttachments =false,CustomOrder=1
}); });
list.Add(new DocuLinks.Models.ResDoculink() list.Add(new DocuLinks.Models.ResDoculink()
{ {
@ -91,6 +92,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
docName = "", docName = "",
Path = "www.google.com", Path = "www.google.com",
IsAttachments = false, IsAttachments = false,
Language = "en",
CustomOrder = 1 CustomOrder = 1
}); });
return new Models.Doculink return new Models.Doculink
@ -118,6 +120,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
docName = "", docName = "",
Path = "www.google.com", Path = "www.google.com",
IsAttachments = false, IsAttachments = false,
Language = "en",
CustomOrder = 1 CustomOrder = 1
}); });
List<DocuLinks.Models.Doculink> DocuLinks = new List<Models.Doculink>(); List<DocuLinks.Models.Doculink> DocuLinks = new List<Models.Doculink>();

View File

@ -2,6 +2,7 @@
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;
@ -12,18 +13,20 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
{ {
private readonly IDoculinkProvider documentsProvider; private readonly IDoculinkProvider documentsProvider;
private readonly IUploadService uploadService; private readonly IUploadService uploadService;
private readonly IAzureBlobService azureBlobService;
public DoculinkController(IDoculinkProvider documentsProvider,IUploadService uploadService) public DoculinkController(IDoculinkProvider documentsProvider, IAzureBlobService azureBlobService)
{ {
this.documentsProvider = documentsProvider; this.documentsProvider = documentsProvider;
this.uploadService = uploadService; this.azureBlobService = azureBlobService;
} }
/// <summary> /// <summary>
/// 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,6 +41,7 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
/// <summary> /// <summary>
/// Get a Doculink type by id. /// Get a Doculink type by id.
/// </summary> /// </summary>
[Authorize(Roles = "admin")]
[HttpGet] [HttpGet]
[Route("doculinks/types/{id}")] [Route("doculinks/types/{id}")]
[Route("doculinks/types/{id}/{language:alpha}")] [Route("doculinks/types/{id}/{language:alpha}")]
@ -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)
@ -104,9 +111,10 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
return NotFound(); return NotFound();
} }
/// <summary> /// <summary>
/// Get all Doculink. /// Get all documents.
/// </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}")]
@ -140,6 +148,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}")]
@ -156,6 +165,7 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
/// <summary> /// <summary>
/// update existing doclink. /// update existing doclink.
/// </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)
@ -181,6 +191,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)
@ -189,8 +200,8 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
{ {
if (documentInfo != null) if (documentInfo != null)
{ {
var documents = await this.documentsProvider.GetDocumentCounter(); //var documents = await this.documentsProvider.GetDocumentCounter();
Models.Doculink DocuLink= uploadService.UploadDocument(documents.counter, documentInfo); Models.Doculink DocuLink= await azureBlobService.UploadDocument(1, documentInfo);
var result = await this.documentsProvider.PostDocumentAsync(DocuLink); var result = await this.documentsProvider.PostDocumentAsync(DocuLink);
if (result.IsSuccess) if (result.IsSuccess)
{ {
@ -208,6 +219,7 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
/// <summary> /// <summary>
/// Delete Doculink by id. /// Delete Doculink 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)
@ -219,7 +231,7 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
// deleting file from folder // deleting file from folder
foreach (var item in result.Document.doclinksAttachments) foreach (var item in result.Document.doclinksAttachments)
{ {
uploadService.Movefile(item.Path); azureBlobService.Movefile(item.Path);
} }
return Ok(result.Document); return Ok(result.Document);
} }

View File

@ -9,7 +9,8 @@
<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.18.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">

View File

@ -14,5 +14,6 @@ namespace DamageAssesment.Api.DocuLinks.Db
public string Path { get; set; } public string Path { get; set; }
public bool IsAttachments { get; set; } public bool IsAttachments { get; set; }
public int CustomOrder { get; set; } public int CustomOrder { get; set; }
public string Language { get; set; }
} }
} }

View File

@ -1,10 +1,14 @@
using Azure.Storage.Blobs.Models; using Azure.Storage.Blobs.Models;
using DamageAssesment.Api.DocuLinks.Models;
namespace DamageAssesment.Api.DocuLinks.Interfaces namespace DamageAssesment.Api.DocuLinks.Interfaces
{ {
public interface IAzureBlobService public interface IAzureBlobService
{ {
Task<List<Azure.Response<BlobContentInfo>>> UploadFiles(List<IFormFile> files); Task<List<Azure.Response<BlobContentInfo>>> UploadFiles(List<IFormFile> files);
Task<Models.Doculink> UploadDocument(int counter, ReqDoculink documentInfo);
Task<Models.Doculink> UpdateDocuments(int counter, Models.Doculink document, ReqDoculink documentInfo);
void DeleteFile(string path); void DeleteFile(string path);
void Movefile(string path);
} }
} }

View File

@ -8,6 +8,7 @@ namespace DamageAssesment.Api.DocuLinks.Models
public string docName { get; set; } public string docName { get; set; }
public string Path { get; set; } public string Path { get; set; }
public bool IsAttachments { get; set; } public bool IsAttachments { get; set; }
public string Language { get; set; }
public int CustomOrder { get; set; } public int CustomOrder { get; set; }
} }
} }

View File

@ -18,5 +18,6 @@ namespace DamageAssesment.Api.DocuLinks.Models
public int CustomOrder { get; set; } public int CustomOrder { get; set; }
public string url { get;set; } public string url { get;set; }
public bool IsAttachments { get; set; } public bool IsAttachments { get; set; }
public string Language { get; set; }
} }
} }

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();
@ -36,6 +86,7 @@ if (app.Environment.IsDevelopment())
app.UseSwaggerUI(); app.UseSwaggerUI();
} }
app.UseAuthentication();
app.UseAuthorization(); app.UseAuthorization();
app.MapControllers(); app.MapControllers();

View File

@ -14,7 +14,7 @@
"dotnetRunMessages": true, "dotnetRunMessages": true,
"launchBrowser": true, "launchBrowser": true,
"launchUrl": "swagger", "launchUrl": "swagger",
"applicationUrl": "http://localhost:5133", "applicationUrl": "http://localhost:5136",
"environmentVariables": { "environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development" "ASPNETCORE_ENVIRONMENT": "Development"
} }

View File

@ -1,8 +1,17 @@
 
using Azure;
using Azure.Storage.Blobs; using Azure.Storage.Blobs;
using Azure.Storage.Blobs.Models; using Azure.Storage.Blobs.Models;
using Azure.Storage.Blobs.Specialized; using Azure.Storage.Blobs.Specialized;
using DamageAssesment.Api.DocuLinks.Interfaces; using DamageAssesment.Api.DocuLinks.Interfaces;
using DamageAssesment.Api.DocuLinks.Models;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.Extensions.Configuration;
using Microsoft.VisualBasic;
using System.ComponentModel;
using System.IO;
using System.Text;
using System.Threading.Tasks;
namespace DamageAssesment.Api.DocuLinks.Providers namespace DamageAssesment.Api.DocuLinks.Providers
{ {
@ -10,11 +19,111 @@ namespace DamageAssesment.Api.DocuLinks.Providers
{ {
BlobServiceClient _blobClient; BlobServiceClient _blobClient;
BlobContainerClient _containerClient; BlobContainerClient _containerClient;
string azureConnectionString = "<Primary Connection String>"; string azureConnectionString;
public AzureBlobService() private string uploadpath = "";
private string Deletepath = "";
public AzureBlobService(IConfiguration configuration)
{ {
_blobClient = new BlobServiceClient(azureConnectionString); uploadpath = configuration.GetValue<string>("Fileupload:folderpath");
_containerClient = _blobClient.GetBlobContainerClient("apiimages"); Deletepath = configuration.GetValue<string>("Fileupload:Deletepath");
_blobClient = new BlobServiceClient(configuration.GetValue<string>("Fileupload:BlobConnectionString"));
_containerClient = _blobClient.GetBlobContainerClient(configuration.GetValue<string>("Fileupload:BlobContainerName"));
}
public async Task<Models.Doculink> UploadDocument(int counter, ReqDoculink documentInfo)
{
Models.Doculink Documents = new Models.Doculink();
List <Models.DoculinkAttachments> attachments = new List<Models.DoculinkAttachments>();
try
{
string path = "", UserfileName = "";
if (documentInfo.Files != null)
{
int counter1 = 1;
foreach (var item in documentInfo.Files)
{
if (item.IsAttachments)
{
UserfileName = Path.GetFileName(item.FileName);
var fileName = String.Format("Document_{0}_{1}{2}", counter, counter1, item.FileExtension);
byte[] byteArray = Convert.FromBase64String(item.FileContent);
MemoryStream stream = new MemoryStream(byteArray);
BlobClient client = _containerClient.GetBlobClient(uploadpath + "/" + fileName);
var result = await client.UploadAsync(stream, true);
path = uploadpath + "/" + fileName;
counter1++;
}
else
path = item.url;
attachments.Add(new Models.DoculinkAttachments { docName = UserfileName, Path = path, IsAttachments = item.IsAttachments, CustomOrder = item.CustomOrder,Language=item.Language });
}
}
Documents = new Models.Doculink()
{
linkTypeId = documentInfo.linkTypeId,
documentsTranslations = documentInfo.documentsTranslations,
doclinksAttachments = attachments,
IsDeleted = false,
CustomOrder = documentInfo.CustomOrder,
IsActive = true
};
return Documents;
}
catch (Exception ex)
{
return new Models.Doculink();
}
}
public async Task<Models.Doculink> UpdateDocuments(int counter, Models.Doculink document, ReqDoculink documentInfo)
{
try
{
foreach (var item in document.doclinksAttachments)
{
Movefile(item.Path);
}
string path = "", UserfileName = "";
List<Models.DoculinkAttachments> attachments = new List<Models.DoculinkAttachments>();
int counter1 = 1;
foreach (var item in documentInfo.Files)
{
if (item.IsAttachments)
{
UserfileName = Path.GetFileName(item.FileName);
var fileName = String.Format("Document_{0}_{1}{2)", document.Id, counter1, item.FileExtension);
byte[] byteArray = Encoding.UTF8.GetBytes(item.FileContent);
MemoryStream stream = new MemoryStream(byteArray);
BlobClient client = _containerClient.GetBlobClient(uploadpath + "/" + fileName);
path = uploadpath + "/" + fileName;
var result = await client.UploadAsync(stream, true);
counter1++;
}
else
path = item.url;
attachments.Add(new Models.DoculinkAttachments { docName = UserfileName, Path = path, IsAttachments = item.IsAttachments, CustomOrder = item.CustomOrder,Language=item.Language });
}
Models.Doculink Documents = new Models.Doculink()
{
Id = documentInfo.Id,
linkTypeId = documentInfo.linkTypeId,
documentsTranslations = documentInfo.documentsTranslations,
IsActive = true,
IsDeleted = false,
CustomOrder = documentInfo.CustomOrder,
doclinksAttachments = attachments
};
return Documents;
}
catch (Exception ex)
{
return new Models.Doculink();
}
} }
public async Task<List<Azure.Response<BlobContentInfo>>> UploadFiles(List<IFormFile> files) public async Task<List<Azure.Response<BlobContentInfo>>> UploadFiles(List<IFormFile> files)
@ -35,10 +144,52 @@ namespace DamageAssesment.Api.DocuLinks.Providers
return azureResponse; return azureResponse;
} }
public string getMovefilename(string movefilename)
{
var list = movefilename.Split('.');
if (list.Length > 0)
list[list.Length - 1] = DateTime.Now.ToShortDateString().Replace("/", "_") +"_"+ DateTime.Now.ToShortTimeString().Replace("/", "_")+"." + list[list.Length - 1];
return string.Join("_", list);
}
public void Movefile(string path)
{
try
{
if (path != "")
{
string MovePath = getMovefilename(path.Replace(uploadpath, Deletepath));
// Get references to the source and destination blobs
BlobClient sourceBlobClient = _containerClient.GetBlobClient(path);
BlobClient destinationBlobClient = _containerClient.GetBlobClient(MovePath);
// Start the copy operation from the source to the destination
destinationBlobClient.StartCopyFromUri(sourceBlobClient.Uri);
// Check if the copy operation completed successfully
WaitForCopyToComplete(destinationBlobClient);
// Delete the source blob after a successful copy
sourceBlobClient.DeleteIfExists();
}
}
catch(Exception ex)
{
}
}
static void WaitForCopyToComplete(BlobClient blobClient)
{
BlobProperties properties = blobClient.GetProperties();
while (properties.CopyStatus == CopyStatus.Pending)
{
Task.Delay(TimeSpan.FromSeconds(1));
properties = blobClient.GetProperties();
}
}
public void DeleteFile(string url) public void DeleteFile(string url)
{ {
var blob = _containerClient.GetBlockBlobClient(url); BlobClient sourceBlobClient = _containerClient.GetBlobClient(url);
blob.DeleteIfExists(); sourceBlobClient.DeleteIfExists();
} }
} }
} }

View File

@ -19,20 +19,22 @@ namespace DamageAssesment.Api.DocuLinks.Providers
private DoculinkDbContext DocumentDbContext; private DoculinkDbContext DocumentDbContext;
private ILogger<DoculinkProvider> logger; private ILogger<DoculinkProvider> logger;
private IUploadService uploadservice; private IUploadService uploadservice;
private IAzureBlobService azureBlobService;
private IMapper mapper; private IMapper mapper;
public DoculinkProvider(DoculinkDbContext DocumentDbContext, ILogger<DoculinkProvider> logger, IMapper mapper, IUploadService uploadservice) public DoculinkProvider(DoculinkDbContext DocumentDbContext, ILogger<DoculinkProvider> logger, IMapper mapper, IUploadService uploadservice, IAzureBlobService azureBlobService)
{ {
this.DocumentDbContext = DocumentDbContext; this.DocumentDbContext = DocumentDbContext;
this.logger = logger; this.logger = logger;
this.mapper = mapper; this.mapper = mapper;
this.uploadservice = uploadservice; this.uploadservice = uploadservice;
SeedData(); this.azureBlobService = azureBlobService;
//SeedData();
} }
private void SeedData() private async Task SeedDataAsync()
{ {
if (!DocumentDbContext.LinkTypes.Any()) if (!DocumentDbContext.LinkTypes.Any())
{ {
@ -66,7 +68,7 @@ namespace DamageAssesment.Api.DocuLinks.Providers
FileModel fileModel = new FileModel() { url = "www.google"+i+".com", IsAttachments = false, CustomOrder = 1 }; FileModel fileModel = new FileModel() { url = "www.google"+i+".com", IsAttachments = false, CustomOrder = 1 };
ReqDoculink documentInfo = new ReqDoculink() { linkTypeId = i,CustomOrder=i, Files = new List<FileModel>() { fileModel } }; ReqDoculink documentInfo = new ReqDoculink() { linkTypeId = i,CustomOrder=i, Files = new List<FileModel>() { fileModel } };
Db.DoculinkTranslation documents = new Db.DoculinkTranslation { DocumentId = i, title = "Test"+i, description = "ss"+i, Language = "en" }; Db.DoculinkTranslation documents = new Db.DoculinkTranslation { DocumentId = i, title = "Test"+i, description = "ss"+i, Language = "en" };
Models.Doculink document = uploadservice.UploadDocument(counter, documentInfo); Models.Doculink document =await azureBlobService.UploadDocument(counter, documentInfo);
DocumentDbContext.Documents.Add(mapper.Map<Models.Doculink, Db.Doculink>(document)); DocumentDbContext.Documents.Add(mapper.Map<Models.Doculink, Db.Doculink>(document));
DocumentDbContext.SaveChanges(); DocumentDbContext.SaveChanges();
DocumentDbContext.DocumentsTranslations.AddRange(documents); DocumentDbContext.DocumentsTranslations.AddRange(documents);
@ -133,6 +135,54 @@ namespace DamageAssesment.Api.DocuLinks.Providers
MultiLanguage = dicttitle; MultiLanguage = dicttitle;
return MultiLanguage; return MultiLanguage;
} }
private List<Models.DoculinkAttachments> GetDocumentAttachment(int id,string? language)
{
if (string.IsNullOrEmpty(language))
{
return mapper.Map<List<Db.DoculinkAttachments>, List<Models.DoculinkAttachments>>(
DocumentDbContext.DoclinksAttachments.AsNoTracking().Where(a => a.DocumentId == id).ToList());
}
else
{
return mapper.Map<List<Db.DoculinkAttachments>, List<Models.DoculinkAttachments>>(
DocumentDbContext.DoclinksAttachments.AsNoTracking().Where(a => a.DocumentId == id && a.Language == language).ToList());
}
}
public async Task<(bool IsSuccess, IEnumerable<Models.ResDoculink> documents, string ErrorMessage)> GetdocumentsByLinkTypeIdAsync(int? linkTypeId, string? language, bool? isactive)
{
try
{
logger?.LogInformation("Query Question");
var documents = new List<Db.Doculink>();
if (linkTypeId==null)
documents = await DocumentDbContext.Documents.AsNoTracking().Where(q => (isactive == null || q.IsActive == isactive.Value)).ToListAsync();
else
documents = await DocumentDbContext.Documents.AsNoTracking().Where(q => (isactive == null || q.IsActive == isactive.Value) &&
q.linkTypeId == linkTypeId.Value).ToListAsync();
if (documents != null)
{
var result = mapper.Map<List<Db.Doculink>, List<Models.ResDoculink>>(documents);
foreach (var item in result)
{
var multilan = CreateMultiLanguageObject(GetDocumentTranslations(item.Id, language));
item.titles = multilan.titles;
item.description = multilan.description;
item.linktypes = CreateMultiLanguageLinkTypeObject(GetLinkTypeTranslations(item.linkTypeId, language));
item.doclinksAttachments = GetDocumentAttachment(item.Id,language);
}
// List<ResDoculinks> doculinks = result.GroupBy(a => a.linkTypeId).Select(a => new ResDoculinks() { linkTypeId = a.Key, doculinks = a.ToList() }).ToList();
return (true, result, null);
}
return (false, null, "Not found");
}
catch (Exception ex)
{
logger?.LogError(ex.ToString());
return (false, null, ex.Message);
}
}
public async Task<(bool IsSuccess, IEnumerable<Models.ResDoculink> documents, string ErrorMessage)> GetdocumentsByLinkAsync(string? linkType, string? language, bool? isactive) public async Task<(bool IsSuccess, IEnumerable<Models.ResDoculink> documents, string ErrorMessage)> GetdocumentsByLinkAsync(string? linkType, string? language, bool? isactive)
{ {
@ -154,8 +204,7 @@ namespace DamageAssesment.Api.DocuLinks.Providers
item.titles = multilan.titles; item.titles = multilan.titles;
item.description = multilan.description; item.description = multilan.description;
item.linktypes = CreateMultiLanguageLinkTypeObject(GetLinkTypeTranslations(item.linkTypeId, language)); item.linktypes = CreateMultiLanguageLinkTypeObject(GetLinkTypeTranslations(item.linkTypeId, language));
item.doclinksAttachments = mapper.Map<List<Db.DoculinkAttachments>, List<Models.DoculinkAttachments>>( item.doclinksAttachments = GetDocumentAttachment(item.Id, language);
DocumentDbContext.DoclinksAttachments.AsNoTracking().Where(a => a.DocumentId == item.Id).ToList());
} }
return (true, result, null); return (true, result, null);
} }
@ -209,8 +258,7 @@ namespace DamageAssesment.Api.DocuLinks.Providers
result.documentsTranslations = mapper.Map<List<Db.DoculinkTranslation>, List<Models.DoculinkTranslation>>( result.documentsTranslations = mapper.Map<List<Db.DoculinkTranslation>, List<Models.DoculinkTranslation>>(
DocumentDbContext.DocumentsTranslations.Where(a => a.DocumentId == result.Id).ToList()); DocumentDbContext.DocumentsTranslations.Where(a => a.DocumentId == result.Id).ToList());
result.doclinksAttachments = mapper.Map<List<Db.DoculinkAttachments>, List<Models.DoculinkAttachments>>( result.doclinksAttachments = GetDocumentAttachment(id, "");
DocumentDbContext.DoclinksAttachments.AsNoTracking().Where(a => a.DocumentId == id).ToList());
return (true, result, null); return (true, result, null);
} }
return (false, null, "Not found"); return (false, null, "Not found");
@ -242,8 +290,7 @@ namespace DamageAssesment.Api.DocuLinks.Providers
result.linktypes = CreateMultiLanguageLinkTypeObject(GetLinkTypeTranslations(result.linkTypeId, language)); result.linktypes = CreateMultiLanguageLinkTypeObject(GetLinkTypeTranslations(result.linkTypeId, language));
result.titles = multilan.titles; result.titles = multilan.titles;
result.description = multilan.description; result.description = multilan.description;
result.doclinksAttachments = mapper.Map<List<Db.DoculinkAttachments>, List<Models.DoculinkAttachments>>( result.doclinksAttachments = GetDocumentAttachment(id, language);
DocumentDbContext.DoclinksAttachments.AsNoTracking().Where(a => a.DocumentId == id).ToList());
return (true, result, null); return (true, result, null);
} }
return (false, null, "Not found"); return (false, null, "Not found");
@ -354,8 +401,7 @@ namespace DamageAssesment.Api.DocuLinks.Providers
result.titles = multilan.titles; result.titles = multilan.titles;
result.description = multilan.description; result.description = multilan.description;
result.linktypes = CreateMultiLanguageLinkTypeObject(GetLinkTypeTranslations(result.linkTypeId, "")); result.linktypes = CreateMultiLanguageLinkTypeObject(GetLinkTypeTranslations(result.linkTypeId, ""));
result.doclinksAttachments = mapper.Map<List<Db.DoculinkAttachments>, List<Models.DoculinkAttachments>>( result.doclinksAttachments = GetDocumentAttachment(id, "");
DocumentDbContext.DoclinksAttachments.AsNoTracking().Where(a => a.DocumentId == id).ToList());
Document.IsActive = false; Document.IsActive = false;
DocumentDbContext.Documents.Update(Document); DocumentDbContext.Documents.Update(Document);
DocumentDbContext.SaveChanges(); DocumentDbContext.SaveChanges();
@ -373,7 +419,7 @@ namespace DamageAssesment.Api.DocuLinks.Providers
{ {
try try
{ {
int AttachmentId = DocumentDbContext.DoclinksAttachments.Max(a => a.Id); int AttachmentId = DocumentDbContext.Documents.Max(a => a.Id);
return (true, AttachmentId, ""); return (true, AttachmentId, "");
} }
catch (Exception ex) catch (Exception ex)

View File

@ -51,7 +51,7 @@ namespace DamageAssesment.Api.DocuLinks.Providers
} }
else else
path = item.url; path = item.url;
attachments.Add(new Models.DoculinkAttachments { docName=UserfileName,Path=path,IsAttachments=item.IsAttachments,CustomOrder=item.CustomOrder }); attachments.Add(new Models.DoculinkAttachments { docName=UserfileName,Path=path,IsAttachments=item.IsAttachments,CustomOrder=item.CustomOrder,Language=item.Language });
} }
} }
Documents=new Models.Doculink (){ linkTypeId = documentInfo.linkTypeId, Documents=new Models.Doculink (){ linkTypeId = documentInfo.linkTypeId,
@ -80,19 +80,20 @@ namespace DamageAssesment.Api.DocuLinks.Providers
string path = "", UserfileName = ""; string path = "", UserfileName = "";
List<Models.DoculinkAttachments> attachments = new List<Models.DoculinkAttachments>(); List<Models.DoculinkAttachments> attachments = new List<Models.DoculinkAttachments>();
int counter1 = 1;
foreach (var item in documentInfo.Files) foreach (var item in documentInfo.Files)
{ {
counter++;
if (item.IsAttachments) if (item.IsAttachments)
{ {
UserfileName = Path.GetFileName(item.FileName); UserfileName = Path.GetFileName(item.FileName);
var fileName = String.Format("Document_{0}{1}", counter, item.FileExtension); var fileName = String.Format("Document_{0}_{1}{2}", document.Id, counter1, item.FileExtension);
path = Path.Combine(fullDirectoryPath, fileName); path = Path.Combine(fullDirectoryPath, fileName);
File.WriteAllBytes(path, Convert.FromBase64String(item.FileContent)); File.WriteAllBytes(path, Convert.FromBase64String(item.FileContent));
counter1++;
} }
else else
path = item.url; path = item.url;
attachments.Add(new Models.DoculinkAttachments { docName = UserfileName, Path = path,IsAttachments=item.IsAttachments,CustomOrder=item.CustomOrder }); attachments.Add(new Models.DoculinkAttachments { docName = UserfileName, Path = path,IsAttachments=item.IsAttachments,CustomOrder=item.CustomOrder,Language=item.Language });
} }
Models.Doculink Documents = new Models.Doculink() Models.Doculink Documents = new Models.Doculink()
{ {

View File

@ -1,4 +1,7 @@
{ {
"JwtSettings": {
"securitykey": "bWlhbWkgZGFkZSBzY2hvb2xzIHNlY3JldCBrZXk="
},
"Logging": { "Logging": {
"LogLevel": { "LogLevel": {
"Default": "Information", "Default": "Information",
@ -6,11 +9,17 @@
} }
}, },
"AllowedHosts": "*", "AllowedHosts": "*",
//"ConnectionStrings": {
// "DoculinConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;"
//},
"ConnectionStrings": { "ConnectionStrings": {
"DoculinConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;" "DoculinConnection": "Server=tcp:da-dev.database.windows.net,1433;Initial Catalog=da-dev-db;Encrypt=True;User ID=admin-dev;Password=b3tgRABw8LGE75k;TrustServerCertificate=False;Connection Timeout=30;"
}, },
"Fileupload": { "Fileupload": {
"folderpath": "DASA_Documents/Active", "folderpath": "DASA_Documents/Active",
"Deletepath": "DASA_Documents/Deleted" "Deletepath": "DASA_Documents/Deleted",
"BlobConnectionString": "DefaultEndpointsProtocol=https;AccountName=damagedoculink;AccountKey=blynpwrAQtthEneXC5f4vFewJ3tPV+QZUt1AX3nefZScPPjkr5hMoC18B9ni6/ZYdhRiERPQw+hB+AStonf+iw==;EndpointSuffix=core.windows.net",
"BlobContainerName": "doculinks"
} }
} }

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)
{ {
@ -48,11 +49,12 @@ namespace DamageAssesment.Api.Employees.Controllers
return NotFound(); return NotFound();
} }
/// <summary> /// <summary>
/// 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

@ -1,64 +0,0 @@
// <auto-generated />
using System;
using DamageAssesment.Api.Employees.Db;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
#nullable disable
namespace DamageAssesment.Api.Employees.Migrations
{
[DbContext(typeof(EmployeeDbContext))]
[Migration("20230817213656_InitialEmployee")]
partial class InitialEmployee
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "7.0.9")
.HasAnnotation("Relational:MaxIdentifierLength", 128);
SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
modelBuilder.Entity("DamageAssesment.Api.Employees.Db.Employee", b =>
{
b.Property<string>("Id")
.HasColumnType("nvarchar(450)");
b.Property<DateTime>("BirthDate")
.HasColumnType("datetime2");
b.Property<string>("Email")
.IsRequired()
.HasMaxLength(50)
.HasColumnType("nvarchar(50)");
b.Property<bool>("IsActive")
.HasColumnType("bit");
b.Property<string>("Name")
.IsRequired()
.HasMaxLength(50)
.HasColumnType("nvarchar(50)");
b.Property<string>("OfficePhoneNumber")
.IsRequired()
.HasMaxLength(50)
.HasColumnType("nvarchar(50)");
b.Property<string>("PreferredLanguage")
.HasColumnType("nvarchar(max)");
b.HasKey("Id");
b.ToTable("Employees");
});
#pragma warning restore 612, 618
}
}
}

View File

@ -1,48 +0,0 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace DamageAssesment.Api.Employees.Migrations
{
/// <inheritdoc />
public partial class employeeupdate : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AlterColumn<int>(
name: "Id",
table: "Employees",
type: "int",
nullable: false,
oldClrType: typeof(string),
oldType: "nvarchar(450)")
.Annotation("SqlServer:Identity", "1, 1");
migrationBuilder.AddColumn<string>(
name: "EmployeeCode",
table: "Employees",
type: "nvarchar(50)",
maxLength: 50,
nullable: false,
defaultValue: "");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "EmployeeCode",
table: "Employees");
migrationBuilder.AlterColumn<string>(
name: "Id",
table: "Employees",
type: "nvarchar(450)",
nullable: false,
oldClrType: typeof(int),
oldType: "int")
.OldAnnotation("SqlServer:Identity", "1, 1");
}
}
}

View File

@ -1,72 +0,0 @@
// <auto-generated />
using System;
using DamageAssesment.Api.Employees.Db;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
#nullable disable
namespace DamageAssesment.Api.Employees.Migrations
{
[DbContext(typeof(EmployeeDbContext))]
[Migration("20230913170055_updatedemployee_id")]
partial class updatedemployee_id
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "7.0.9")
.HasAnnotation("Relational:MaxIdentifierLength", 128);
SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
modelBuilder.Entity("DamageAssesment.Api.Employees.Db.Employee", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<DateTime>("BirthDate")
.HasColumnType("datetime2");
b.Property<string>("Email")
.IsRequired()
.HasMaxLength(50)
.HasColumnType("nvarchar(50)");
b.Property<string>("EmployeeCode")
.IsRequired()
.HasMaxLength(50)
.HasColumnType("nvarchar(50)");
b.Property<bool>("IsActive")
.HasColumnType("bit");
b.Property<string>("Name")
.IsRequired()
.HasMaxLength(50)
.HasColumnType("nvarchar(50)");
b.Property<string>("OfficePhoneNumber")
.IsRequired()
.HasMaxLength(50)
.HasColumnType("nvarchar(50)");
b.Property<string>("PreferredLanguage")
.HasColumnType("nvarchar(max)");
b.HasKey("Id");
b.ToTable("Employees");
});
#pragma warning restore 612, 618
}
}
}

View File

@ -12,8 +12,8 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
namespace DamageAssesment.Api.Employees.Migrations namespace DamageAssesment.Api.Employees.Migrations
{ {
[DbContext(typeof(EmployeeDbContext))] [DbContext(typeof(EmployeeDbContext))]
[Migration("20230913164315_employeeupdate")] [Migration("20230927210957_AzureEmployees")]
partial class employeeupdate partial class AzureEmployees
{ {
/// <inheritdoc /> /// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder) protected override void BuildTargetModel(ModelBuilder modelBuilder)

View File

@ -6,7 +6,7 @@ using Microsoft.EntityFrameworkCore.Migrations;
namespace DamageAssesment.Api.Employees.Migrations namespace DamageAssesment.Api.Employees.Migrations
{ {
/// <inheritdoc /> /// <inheritdoc />
public partial class InitialEmployee : Migration public partial class AzureEmployees : Migration
{ {
/// <inheritdoc /> /// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder) protected override void Up(MigrationBuilder migrationBuilder)
@ -15,7 +15,9 @@ namespace DamageAssesment.Api.Employees.Migrations
name: "Employees", name: "Employees",
columns: table => new columns: table => new
{ {
Id = table.Column<string>(type: "nvarchar(450)", nullable: false), Id = table.Column<int>(type: "int", nullable: false)
.Annotation("SqlServer:Identity", "1, 1"),
EmployeeCode = table.Column<string>(type: "nvarchar(50)", maxLength: 50, nullable: false),
Name = table.Column<string>(type: "nvarchar(50)", maxLength: 50, nullable: false), Name = table.Column<string>(type: "nvarchar(50)", maxLength: 50, nullable: false),
BirthDate = table.Column<DateTime>(type: "datetime2", nullable: false), BirthDate = table.Column<DateTime>(type: "datetime2", nullable: false),
OfficePhoneNumber = table.Column<string>(type: "nvarchar(50)", maxLength: 50, nullable: false), OfficePhoneNumber = table.Column<string>(type: "nvarchar(50)", maxLength: 50, nullable: false),

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

@ -77,7 +77,8 @@ namespace DamageAssesment.Api.Employees.Providers
EmployeeDbContext.Employees.Add(_employee); EmployeeDbContext.Employees.Add(_employee);
Employee.Id = _employee.Id; Employee.Id = _employee.Id;
EmployeeDbContext.SaveChanges(); EmployeeDbContext.SaveChanges();
return (true, Employee, null); //return (true, Employee, null);
return (true, mapper.Map<Db.Employee, Models.Employee>(_employee), null);
} }
return (false, null, "Employee code is already exits"); return (false, null, "Employee code is already exits");
} }

View File

@ -9,12 +9,8 @@
} }
}, },
"AllowedHosts": "*", "AllowedHosts": "*",
"settings": {
"endpoint1": "xxx",
"endpoint2": "xxx",
"endpoint3": "xxx"
},
"ConnectionStrings": { "ConnectionStrings": {
"EmployeeConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;" "EmployeeConnection": "Server=tcp:da-dev.database.windows.net,1433;Initial Catalog=da-dev-db;Encrypt=True;User ID=admin-dev;Password=b3tgRABw8LGE75k;TrustServerCertificate=False;Connection Timeout=30;"
} }
} }

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

@ -11,8 +11,8 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
namespace DamageAssesment.Api.Locations.Migrations namespace DamageAssesment.Api.Locations.Migrations
{ {
[DbContext(typeof(LocationDbContext))] [DbContext(typeof(LocationDbContext))]
[Migration("20230817214454_InitialLocation")] [Migration("20230927211146_AzureLocations")]
partial class InitialLocation partial class AzureLocations
{ {
/// <inheritdoc /> /// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder) protected override void BuildTargetModel(ModelBuilder modelBuilder)
@ -26,23 +26,29 @@ namespace DamageAssesment.Api.Locations.Migrations
modelBuilder.Entity("DamageAssesment.Api.Locations.Db.Location", b => modelBuilder.Entity("DamageAssesment.Api.Locations.Db.Location", b =>
{ {
b.Property<string>("Id") b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<string>("LocationCode")
.IsRequired()
.HasMaxLength(4) .HasMaxLength(4)
.HasColumnType("nvarchar(4)"); .HasColumnType("nvarchar(4)");
b.Property<string>("MaintenanceCenter") b.Property<string>("MaintenanceCenter")
.IsRequired() .IsRequired()
.HasMaxLength(1) .HasMaxLength(4)
.HasColumnType("nvarchar(1)"); .HasColumnType("nvarchar(4)");
b.Property<string>("Name") b.Property<string>("Name")
.IsRequired() .IsRequired()
.HasMaxLength(50) .HasMaxLength(50)
.HasColumnType("nvarchar(50)"); .HasColumnType("nvarchar(50)");
b.Property<string>("RegionId") b.Property<int>("RegionId")
.IsRequired() .HasColumnType("int");
.HasColumnType("nvarchar(max)");
b.Property<string>("SchoolType") b.Property<string>("SchoolType")
.IsRequired() .IsRequired()
@ -56,9 +62,11 @@ namespace DamageAssesment.Api.Locations.Migrations
modelBuilder.Entity("DamageAssesment.Api.Locations.Db.Region", b => modelBuilder.Entity("DamageAssesment.Api.Locations.Db.Region", b =>
{ {
b.Property<string>("Id") b.Property<int>("Id")
.HasMaxLength(2) .ValueGeneratedOnAdd()
.HasColumnType("nvarchar(2)"); .HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<string>("Abbreviation") b.Property<string>("Abbreviation")
.IsRequired() .IsRequired()

View File

@ -5,7 +5,7 @@
namespace DamageAssesment.Api.Locations.Migrations namespace DamageAssesment.Api.Locations.Migrations
{ {
/// <inheritdoc /> /// <inheritdoc />
public partial class InitialLocation : Migration public partial class AzureLocations : Migration
{ {
/// <inheritdoc /> /// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder) protected override void Up(MigrationBuilder migrationBuilder)
@ -14,11 +14,13 @@ namespace DamageAssesment.Api.Locations.Migrations
name: "Locations", name: "Locations",
columns: table => new columns: table => new
{ {
Id = table.Column<string>(type: "nvarchar(4)", maxLength: 4, nullable: false), Id = table.Column<int>(type: "int", nullable: false)
.Annotation("SqlServer:Identity", "1, 1"),
RegionId = table.Column<int>(type: "int", nullable: false),
LocationCode = table.Column<string>(type: "nvarchar(4)", maxLength: 4, nullable: false),
Name = table.Column<string>(type: "nvarchar(50)", maxLength: 50, nullable: false), Name = table.Column<string>(type: "nvarchar(50)", maxLength: 50, nullable: false),
MaintenanceCenter = table.Column<string>(type: "nvarchar(1)", maxLength: 1, nullable: false), MaintenanceCenter = table.Column<string>(type: "nvarchar(4)", maxLength: 4, nullable: false),
SchoolType = table.Column<string>(type: "nvarchar(2)", maxLength: 2, nullable: false), SchoolType = table.Column<string>(type: "nvarchar(2)", maxLength: 2, nullable: false)
RegionId = table.Column<string>(type: "nvarchar(max)", nullable: false)
}, },
constraints: table => constraints: table =>
{ {
@ -29,7 +31,8 @@ namespace DamageAssesment.Api.Locations.Migrations
name: "Regions", name: "Regions",
columns: table => new columns: table => new
{ {
Id = table.Column<string>(type: "nvarchar(2)", maxLength: 2, nullable: false), Id = table.Column<int>(type: "int", nullable: false)
.Annotation("SqlServer:Identity", "1, 1"),
Name = table.Column<string>(type: "nvarchar(50)", maxLength: 50, nullable: false), Name = table.Column<string>(type: "nvarchar(50)", maxLength: 50, nullable: false),
Abbreviation = table.Column<string>(type: "nvarchar(5)", maxLength: 5, nullable: false) Abbreviation = table.Column<string>(type: "nvarchar(5)", maxLength: 5, nullable: false)
}, },

View File

@ -23,23 +23,29 @@ namespace DamageAssesment.Api.Locations.Migrations
modelBuilder.Entity("DamageAssesment.Api.Locations.Db.Location", b => modelBuilder.Entity("DamageAssesment.Api.Locations.Db.Location", b =>
{ {
b.Property<string>("Id") b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<string>("LocationCode")
.IsRequired()
.HasMaxLength(4) .HasMaxLength(4)
.HasColumnType("nvarchar(4)"); .HasColumnType("nvarchar(4)");
b.Property<string>("MaintenanceCenter") b.Property<string>("MaintenanceCenter")
.IsRequired() .IsRequired()
.HasMaxLength(1) .HasMaxLength(4)
.HasColumnType("nvarchar(1)"); .HasColumnType("nvarchar(4)");
b.Property<string>("Name") b.Property<string>("Name")
.IsRequired() .IsRequired()
.HasMaxLength(50) .HasMaxLength(50)
.HasColumnType("nvarchar(50)"); .HasColumnType("nvarchar(50)");
b.Property<string>("RegionId") b.Property<int>("RegionId")
.IsRequired() .HasColumnType("int");
.HasColumnType("nvarchar(max)");
b.Property<string>("SchoolType") b.Property<string>("SchoolType")
.IsRequired() .IsRequired()
@ -53,9 +59,11 @@ namespace DamageAssesment.Api.Locations.Migrations
modelBuilder.Entity("DamageAssesment.Api.Locations.Db.Region", b => modelBuilder.Entity("DamageAssesment.Api.Locations.Db.Region", b =>
{ {
b.Property<string>("Id") b.Property<int>("Id")
.HasMaxLength(2) .ValueGeneratedOnAdd()
.HasColumnType("nvarchar(2)"); .HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<string>("Abbreviation") b.Property<string>("Abbreviation")
.IsRequired() .IsRequired()

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.UseSqlServer("LocationConnection"); option.UseSqlServer("LocationConnection");
}); });
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

@ -9,7 +9,11 @@
} }
}, },
"AllowedHosts": "*", "AllowedHosts": "*",
//"ConnectionStrings": {
// "LocationConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;"
//},
"ConnectionStrings": { "ConnectionStrings": {
"LocationConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;" "LocationConnection": "Server=tcp:da-dev.database.windows.net,1433;Initial Catalog=da-dev-db;Encrypt=True;User ID=admin-dev;Password=b3tgRABw8LGE75k;TrustServerCertificate=False;Connection Timeout=30;"
} }
} }

View File

@ -1,4 +1,5 @@
using DamageAssesment.Api.Questions.Interfaces; using DamageAssesment.Api.Questions.Interfaces;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
namespace DamageAssesment.Api.Questions.Controllers namespace DamageAssesment.Api.Questions.Controllers
@ -10,16 +11,14 @@ 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]
@ -37,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]
@ -55,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]
@ -71,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 +94,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)
{ {
@ -110,6 +113,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)
{ {
@ -125,6 +129,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)
@ -139,7 +144,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)
@ -156,7 +161,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)
{ {
@ -178,6 +183,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)
{ {
@ -196,6 +202,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

@ -12,8 +12,8 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
namespace DamageAssesment.Api.Questions.Migrations namespace DamageAssesment.Api.Questions.Migrations
{ {
[DbContext(typeof(QuestionDbContext))] [DbContext(typeof(QuestionDbContext))]
[Migration("20230817215744_InitialQuestion")] [Migration("20230927211340_AzureQuestions")]
partial class InitialQuestion partial class AzureQuestions
{ {
/// <inheritdoc /> /// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder) protected override void BuildTargetModel(ModelBuilder modelBuilder)
@ -25,6 +25,30 @@ namespace DamageAssesment.Api.Questions.Migrations
SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
modelBuilder.Entity("DamageAssesment.Api.Questions.Db.CategoryTranslation", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<int>("CategoryId")
.HasColumnType("int");
b.Property<string>("Language")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<string>("Title")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.HasKey("Id");
b.ToTable("CategoryTranslations");
});
modelBuilder.Entity("DamageAssesment.Api.Questions.Db.Question", b => modelBuilder.Entity("DamageAssesment.Api.Questions.Db.Question", b =>
{ {
b.Property<int>("Id") b.Property<int>("Id")
@ -45,10 +69,6 @@ namespace DamageAssesment.Api.Questions.Migrations
b.Property<bool>("Key") b.Property<bool>("Key")
.HasColumnType("bit"); .HasColumnType("bit");
b.Property<string>("QuestionGroup")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<int>("QuestionNumber") b.Property<int>("QuestionNumber")
.HasColumnType("int"); .HasColumnType("int");
@ -73,11 +93,11 @@ namespace DamageAssesment.Api.Questions.Migrations
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id")); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<string>("CategoryImage") b.Property<string>("IconLibrary")
.IsRequired() .IsRequired()
.HasColumnType("nvarchar(max)"); .HasColumnType("nvarchar(max)");
b.Property<string>("CategoryName") b.Property<string>("IconName")
.IsRequired() .IsRequired()
.HasColumnType("nvarchar(max)"); .HasColumnType("nvarchar(max)");

View File

@ -5,19 +5,34 @@
namespace DamageAssesment.Api.Questions.Migrations namespace DamageAssesment.Api.Questions.Migrations
{ {
/// <inheritdoc /> /// <inheritdoc />
public partial class InitialQuestion : Migration public partial class AzureQuestions : Migration
{ {
/// <inheritdoc /> /// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder) protected override void Up(MigrationBuilder migrationBuilder)
{ {
migrationBuilder.CreateTable(
name: "CategoryTranslations",
columns: table => new
{
Id = table.Column<int>(type: "int", nullable: false)
.Annotation("SqlServer:Identity", "1, 1"),
CategoryId = table.Column<int>(type: "int", nullable: false),
Title = table.Column<string>(type: "nvarchar(max)", nullable: false),
Language = table.Column<string>(type: "nvarchar(max)", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_CategoryTranslations", x => x.Id);
});
migrationBuilder.CreateTable( migrationBuilder.CreateTable(
name: "QuestionCategories", name: "QuestionCategories",
columns: table => new columns: table => new
{ {
Id = table.Column<int>(type: "int", nullable: false) Id = table.Column<int>(type: "int", nullable: false)
.Annotation("SqlServer:Identity", "1, 1"), .Annotation("SqlServer:Identity", "1, 1"),
CategoryName = table.Column<string>(type: "nvarchar(max)", nullable: false), IconName = table.Column<string>(type: "nvarchar(max)", nullable: false),
CategoryImage = table.Column<string>(type: "nvarchar(max)", nullable: false) IconLibrary = table.Column<string>(type: "nvarchar(max)", nullable: false)
}, },
constraints: table => constraints: table =>
{ {
@ -64,7 +79,6 @@ namespace DamageAssesment.Api.Questions.Migrations
Comment = table.Column<bool>(type: "bit", nullable: false), Comment = table.Column<bool>(type: "bit", nullable: false),
Key = table.Column<bool>(type: "bit", nullable: false), Key = table.Column<bool>(type: "bit", nullable: false),
SurveyId = table.Column<int>(type: "int", nullable: true), SurveyId = table.Column<int>(type: "int", nullable: true),
QuestionGroup = table.Column<string>(type: "nvarchar(max)", nullable: false),
CategoryId = table.Column<int>(type: "int", nullable: false) CategoryId = table.Column<int>(type: "int", nullable: false)
}, },
constraints: table => constraints: table =>
@ -87,6 +101,9 @@ namespace DamageAssesment.Api.Questions.Migrations
/// <inheritdoc /> /// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder) protected override void Down(MigrationBuilder migrationBuilder)
{ {
migrationBuilder.DropTable(
name: "CategoryTranslations");
migrationBuilder.DropTable( migrationBuilder.DropTable(
name: "QuestionCategories"); name: "QuestionCategories");

View File

@ -22,6 +22,30 @@ namespace DamageAssesment.Api.Questions.Migrations
SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
modelBuilder.Entity("DamageAssesment.Api.Questions.Db.CategoryTranslation", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<int>("CategoryId")
.HasColumnType("int");
b.Property<string>("Language")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<string>("Title")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.HasKey("Id");
b.ToTable("CategoryTranslations");
});
modelBuilder.Entity("DamageAssesment.Api.Questions.Db.Question", b => modelBuilder.Entity("DamageAssesment.Api.Questions.Db.Question", b =>
{ {
b.Property<int>("Id") b.Property<int>("Id")
@ -42,10 +66,6 @@ namespace DamageAssesment.Api.Questions.Migrations
b.Property<bool>("Key") b.Property<bool>("Key")
.HasColumnType("bit"); .HasColumnType("bit");
b.Property<string>("QuestionGroup")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<int>("QuestionNumber") b.Property<int>("QuestionNumber")
.HasColumnType("int"); .HasColumnType("int");
@ -70,11 +90,11 @@ namespace DamageAssesment.Api.Questions.Migrations
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id")); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<string>("CategoryImage") b.Property<string>("IconLibrary")
.IsRequired() .IsRequired()
.HasColumnType("nvarchar(max)"); .HasColumnType("nvarchar(max)");
b.Property<string>("CategoryName") b.Property<string>("IconName")
.IsRequired() .IsRequired()
.HasColumnType("nvarchar(max)"); .HasColumnType("nvarchar(max)");

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.UseSqlServer("QuestionConnection"); option.UseSqlServer("QuestionConnection");
@ -43,7 +93,7 @@ if (app.Environment.IsDevelopment())
questionProvider.SeedData(); questionProvider.SeedData();
} }
} }
app.UseAuthentication();
app.UseAuthorization(); app.UseAuthorization();
app.MapControllers(); app.MapControllers();

View File

@ -19,7 +19,7 @@ namespace DamageAssesment.Api.Questions.Providers
this.questionDbContext = questionDbContext; this.questionDbContext = questionDbContext;
this.logger = logger; this.logger = logger;
this.mapper = mapper; this.mapper = mapper;
SeedData(); //SeedData();
} }
public void SeedData() public void SeedData()

View File

@ -9,7 +9,11 @@
} }
}, },
"AllowedHosts": "*", "AllowedHosts": "*",
//"ConnectionStrings": {
// "QuestionConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;"
//},
"ConnectionStrings": { "ConnectionStrings": {
"QuestionConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;" "QuestionConnection": "Server=tcp:da-dev.database.windows.net,1433;Initial Catalog=da-dev-db;Encrypt=True;User ID=admin-dev;Password=b3tgRABw8LGE75k;TrustServerCertificate=False;Connection Timeout=30;"
} }
} }

View File

@ -1,28 +1,26 @@
using DamageAssesment.Api.SurveyResponses.Interfaces; using DamageAssesment.Api.Responses.Interfaces;
using DamageAssesment.Api.SurveyResponses.Models; using DamageAssesment.Api.Responses.Models;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
namespace DamageAssesment.Api.SurveyResponses.Controllers namespace DamageAssesment.Api.Responses.Controllers
{ {
[ApiController] [ApiController]
public class SurveyResponsesController : ControllerBase public class ResponsesController : ControllerBase
{ {
private readonly ISurveysResponse surveyResponseProvider; private readonly ISurveysResponse surveyResponseProvider;
public ResponsesController(ISurveysResponse surveyResponseProvider)
public SurveyResponsesController(ISurveysResponse surveyResponseProvider)
{ {
this.surveyResponseProvider = surveyResponseProvider; this.surveyResponseProvider = surveyResponseProvider;
} }
/// <summary> /// <summary>
/// GET request for retrieving survey responses. /// GET request for retrieving survey responses.
/// </summary> /// </summary>
[Authorize(Roles = "admin,survey,user,report")]
[Route("Responses/{employeeid:int}")] [HttpGet("Responses")]
[Route("Responses")] public async Task<ActionResult> GetSurveyResponsesAsync()
[HttpGet]
public async Task<ActionResult> GetSurveyResponsesAsync(int? employeeid)
{ {
var result = await this.surveyResponseProvider.GetSurveyResponsesAsync(employeeid ?? 0); var result = await this.surveyResponseProvider.GetSurveyResponsesAsync();
if (result.IsSuccess) if (result.IsSuccess)
{ {
return Ok(result.surveyResponses); return Ok(result.surveyResponses);
@ -36,12 +34,11 @@ namespace DamageAssesment.Api.SurveyResponses.Controllers
/// <summary> /// <summary>
/// GET request for retrieving survey responses by survey ID. /// GET request for retrieving survey responses by survey ID.
/// </summary> /// </summary>
[Route("Responses/BySurvey/{surveyid:int}/{employeeid:int}")] [Authorize(Roles = "admin,survey,user,report")]
[Route("Responses/BySurvey/{surveyid:int}")] [HttpGet("Responses/BySurvey/{surveyid}")]
[HttpGet] public async Task<ActionResult> GetSurveyResponsesAsync(int surveyid)
public async Task<ActionResult> GetSurveyResponsesAsync(int surveyid, int? employeeid)
{ {
var result = await this.surveyResponseProvider.GetSurveyResponsesBySurveyAsync(surveyid, employeeid ?? 0); var result = await this.surveyResponseProvider.GetSurveyResponsesBySurveyAsync(surveyid);
if (result.IsSuccess) if (result.IsSuccess)
{ {
return Ok(result.SurveyResponses); return Ok(result.SurveyResponses);
@ -53,17 +50,16 @@ namespace DamageAssesment.Api.SurveyResponses.Controllers
/// </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>
/// <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}")] [HttpGet("Responses/{surveyid}/{locationid}")]
[Route("Responses/{surveyid:int}/{locationid:int}")] public async Task<ActionResult> GetSurveyResponsesBySurveyAndLocationAsync(int surveyid, int locationid)
[HttpGet]
public async Task<ActionResult> GetSurveyResponsesBySurveyAndLocationAsync(int surveyid, int locationid,int? employeeid)
{ {
var result = await this.surveyResponseProvider.GetSurveyResponsesBySurveyAndLocationAsync(surveyid, locationid,employeeid ?? 0); var result = await this.surveyResponseProvider.GetSurveyResponsesBySurveyAndLocationAsync(surveyid, locationid);
if (result.IsSuccess) if (result.IsSuccess)
{ {
return Ok(result.SurveyResponses); return Ok(result.SurveyResponses);
} }
return NoContent(); return NoContent();
} }
/// <summary> /// <summary>
@ -72,13 +68,11 @@ namespace DamageAssesment.Api.SurveyResponses.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="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}")] [HttpGet("Responses/ByAnswer/{surveyid}/{questionid}/{answer}")]
[Route("Responses/ByAnswer/{surveyid:int}/{questionid:int}/{answer:alpha}")] public async Task<ActionResult> GetSurveyResponsesByAnswerAsyncAsync(int surveyid, int questionid, string answer)
[HttpGet]
public async Task<ActionResult> GetSurveyResponsesByAnswerAsyncAsync(int surveyid, int questionid, string answer, int? employeeid)
{ {
var result = await surveyResponseProvider.GetResponsesByAnswerAsync(surveyid, questionid, answer, employeeid ?? 0); var result = await surveyResponseProvider.GetResponsesByAnswerAsync(surveyid, questionid, answer);
if (result.IsSuccess) if (result.IsSuccess)
{ {
return Ok(result.SurveyResponses); return Ok(result.SurveyResponses);
@ -90,13 +84,11 @@ namespace DamageAssesment.Api.SurveyResponses.Controllers
/// GET request for retrieving answers from survey responses by survey ID and region. /// GET request for retrieving answers from survey responses by survey ID and region.
/// </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}")] [HttpGet("Responses/ByRegion/{surveyid}")]
[Route("Responses/ByRegion/{surveyid:int}/{employeeid}")] public async Task<ActionResult> GetAnswersByRegionAsync(int surveyid)
[HttpGet]
public async Task<ActionResult> GetAnswersByRegionAsync(int surveyid, int? employeeid)
{ {
var result = await this.surveyResponseProvider.GetAnswersByRegionAsync(surveyid, employeeid ?? 0); var result = await this.surveyResponseProvider.GetAnswersByRegionAsync(surveyid);
if (result.IsSuccess) if (result.IsSuccess)
{ {
return Ok(result.Answers); return Ok(result.Answers);
@ -107,12 +99,11 @@ namespace DamageAssesment.Api.SurveyResponses.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>
[Route("Responses/ByMaintenanceCenter/{surveyid:int}/{employeeid:int}")] [Authorize(Roles = "admin,survey,user,report")]
[Route("Responses/ByMaintenanceCenter/{surveyid:int}")] [HttpGet("Responses/ByMaintenanceCenter/{surveyid}")]
[HttpGet] public async Task<ActionResult> GetAnswersByMaintenaceCentersync(int surveyid)
public async Task<ActionResult> GetAnswersByMaintenaceCentersync(int surveyid, int? employeeid)
{ {
var result = await this.surveyResponseProvider.GetSurveyResponsesByMaintenanceCenterAsync(surveyid, employeeid ?? 0); var result = await this.surveyResponseProvider.GetSurveyResponsesByMaintenanceCenterAsync(surveyid);
if (result.IsSuccess) if (result.IsSuccess)
{ {
return Ok(result.SurveyResponses); return Ok(result.SurveyResponses);
@ -123,7 +114,7 @@ namespace DamageAssesment.Api.SurveyResponses.Controllers
/// GET request for retrieving a survey response by response ID. /// GET request for retrieving a survey response by response ID.
/// </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)
{ {
@ -139,7 +130,7 @@ namespace DamageAssesment.Api.SurveyResponses.Controllers
/// POST request for creating a new survey response. /// POST request for creating a new survey response.
/// </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)
{ {
@ -155,7 +146,7 @@ namespace DamageAssesment.Api.SurveyResponses.Controllers
/// </summary> /// </summary>
/// <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)
{ {
@ -172,7 +163,7 @@ namespace DamageAssesment.Api.SurveyResponses.Controllers
/// <summary> /// <summary>
/// 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)
{ {
@ -187,7 +178,7 @@ namespace DamageAssesment.Api.SurveyResponses.Controllers
/// POST request for submitting survey with multiple answers. /// POST request for submitting survey with multiple answers.
/// </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)
{ {
@ -198,31 +189,5 @@ namespace DamageAssesment.Api.SurveyResponses.Controllers
else else
return BadRequest(result.ErrorMessage); return BadRequest(result.ErrorMessage);
} }
[Route("Responses/Surveys/active/{employeeid:int}")]
[Route("Responses/Surveys/active/{employeeid:int}/{language:alpha}")]
[HttpGet]
public async Task<ActionResult> GetActiveSurveysAsync(int employeeid, string? language)
{
var result = await this.surveyResponseProvider.GetActiveSurveysAsync(employeeid, language);
if (result.IsSuccess)
{
return Ok(result.Surveys);
}
return NoContent();
}
[Route("Responses/Surveys/historic/{employeeid:int}")]
[Route("Responses/Surveys/historic/{employeeid:int}/{language:alpha}")]
[HttpGet]
public async Task<ActionResult> GetHistoricSurveysAsync(int employeeid, string? language)
{
var result = await this.surveyResponseProvider.GetHistoricSurveysAsync(employeeid, language);
if (result.IsSuccess)
{
return Ok(result.Surveys);
}
return NoContent();
}
} }
} }

View File

@ -1,7 +1,7 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
namespace DamageAssesment.Api.SurveyResponses.Db namespace DamageAssesment.Api.Responses.Db
{ {
public class SurveyResponse public class SurveyResponse
{ {

View File

@ -1,6 +1,6 @@
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
namespace DamageAssesment.Api.SurveyResponses.Db namespace DamageAssesment.Api.Responses.Db
{ {
public class SurveyResponseDbContext:DbContext public class SurveyResponseDbContext:DbContext
{ {

View File

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

View File

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

View File

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

View File

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

View File

@ -0,0 +1,9 @@
using DamageAssesment.Api.Responses.Models;
namespace DamageAssesment.Api.Responses.Interfaces
{
public interface ILocationServiceProvider
{
Task<List<Location>> getLocationsAsync(string token);
}
}

View File

@ -0,0 +1,11 @@
using DamageAssesment.Api.Responses.Models;
namespace DamageAssesment.Api.Responses.Interfaces
{
public interface IQuestionServiceProvider
{
Task<List<Question>> getQuestionsAsync(string token);
Task<List<SurveyQuestions>> getSurveyQuestionsAsync(int surveyId, string token);
Task<Question> getQuestionsAsync(int questionId, string token);
}
}

View File

@ -0,0 +1,9 @@
using DamageAssesment.Api.Responses.Models;
namespace DamageAssesment.Api.Responses.Interfaces
{
public interface IRegionServiceProvider
{
Task<List<Region>> getRegionsAsync(string token);
}
}

View File

@ -0,0 +1,10 @@
using DamageAssesment.Api.Responses.Models;
namespace DamageAssesment.Api.Responses.Interfaces
{
public interface ISurveyServiceProvider
{
Task<List<Survey>> getSurveysAsync(string token);
Task<Survey> getSurveyAsync(int surveyId,string token);
}
}

View File

@ -1,23 +1,21 @@
using DamageAssesment.Api.SurveyResponses.Models; using DamageAssesment.Api.Responses.Models;
using Microsoft.AspNetCore.Mvc;
namespace DamageAssesment.Api.SurveyResponses.Interfaces namespace DamageAssesment.Api.Responses.Interfaces
{ {
public interface ISurveysResponse public interface ISurveysResponse
{ {
Task<(bool IsSuccess, dynamic Answers, string ErrorMessage)> GetAnswersByRegionAsync(int surveyId, int employeeid); Task<(bool IsSuccess, dynamic Answers, string ErrorMessage)> GetAnswersByRegionAsync(int surveyId);
Task<(bool IsSuccess, Models.SurveyResponse SurveyResponse, string ErrorMessage)> PostSurveyResponseAsync(Models.SurveyResponse surveyResponse); Task<(bool IsSuccess, Models.SurveyResponse SurveyResponse, string ErrorMessage)> PostSurveyResponseAsync(Models.SurveyResponse surveyResponse);
// Task<(bool IsSuccess,dynamic surveyResponses, string ErrorMessage)> GetSurveyResponseAsync(int responseId); // Task<(bool IsSuccess,dynamic surveyResponses, string ErrorMessage)> GetSurveyResponseAsync(int responseId);
Task<(bool IsSuccess, dynamic surveyResponses, string ErrorMessage)> GetSurveyResponsesAsync(int employeeid); Task<(bool IsSuccess, dynamic surveyResponses, string ErrorMessage)> GetSurveyResponsesAsync();
Task<(bool IsSuccess, dynamic Surveys, string ErrorMessage)> GetActiveSurveysAsync(int employeeid, string language);
Task<(bool IsSuccess, dynamic Surveys, string ErrorMessage)> GetHistoricSurveysAsync(int employeeid, string language);
Task<(bool IsSuccess, Models.SurveyResponse SurveyResponse, string ErrorMessage)> PutSurveyResponseAsync(int Id, Models.SurveyResponse surveyResponse); Task<(bool IsSuccess, Models.SurveyResponse SurveyResponse, string ErrorMessage)> PutSurveyResponseAsync(int Id, Models.SurveyResponse surveyResponse);
Task<(bool IsSuccess, Models.SurveyResponse SurveyResponse, string ErrorMessage)> DeleteSurveyResponseAsync(int Id); Task<(bool IsSuccess, Models.SurveyResponse SurveyResponse, string ErrorMessage)> DeleteSurveyResponseAsync(int Id);
Task<(bool IsSuccess, dynamic SurveyResponse, string ErrorMessage)> GetSurveyResponseByIdAsync(int responseId); Task<(bool IsSuccess, dynamic SurveyResponse, string ErrorMessage)> GetSurveyResponseByIdAsync(int responseId);
Task<(bool IsSuccess, dynamic SurveyResponses, string ErrorMessage)> GetSurveyResponsesBySurveyAsync(int surveyId, int employeeid); Task<(bool IsSuccess, dynamic SurveyResponses, string ErrorMessage)> GetSurveyResponsesBySurveyAsync(int surveyId);
Task<(bool IsSuccess, dynamic SurveyResponses, string ErrorMessage)> GetSurveyResponsesBySurveyAndLocationAsync(int surveyId, int locationId, int employeeid); Task<(bool IsSuccess, dynamic SurveyResponses, string ErrorMessage)> GetSurveyResponsesBySurveyAndLocationAsync(int surveyId, int locationId);
Task<(bool IsSuccess, dynamic SurveyResponses, string ErrorMessage)> GetSurveyResponsesByMaintenanceCenterAsync(int surveyId, int employeeid); Task<(bool IsSuccess, dynamic SurveyResponses, string ErrorMessage)> GetSurveyResponsesByMaintenanceCenterAsync(int surveyId);
Task<(bool IsSuccess, dynamic SurveyResponses, string ErrorMessage)> GetResponsesByAnswerAsync(int surveyId, int questionId, string answer, int employeeid); Task<(bool IsSuccess, dynamic SurveyResponses, string ErrorMessage)> GetResponsesByAnswerAsync(int surveyId, int questionId, string answer);
Task<(bool IsSuccess, Models.SurveyResponse SurveyResponse, string ErrorMessage)> PostSurveyAnswersAsync(Request request); Task<(bool IsSuccess, Models.SurveyResponse SurveyResponse, string ErrorMessage)> PostSurveyAnswersAsync(Request request);
} }

View File

@ -0,0 +1,70 @@
// <auto-generated />
using System;
using DamageAssesment.Api.Responses.Db;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
#nullable disable
namespace DamageAssesment.Api.Responses.Migrations
{
[DbContext(typeof(SurveyResponseDbContext))]
[Migration("20230927211458_AzureSurveyResponses")]
partial class AzureSurveyResponses
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "7.0.9")
.HasAnnotation("Relational:MaxIdentifierLength", 128);
SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
modelBuilder.Entity("DamageAssesment.Api.SurveyResponses.Db.SurveyResponse", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<string>("ClientDevice")
.HasMaxLength(50)
.HasColumnType("nvarchar(50)");
b.Property<DateTime?>("CreatedDate")
.HasColumnType("datetime2");
b.Property<int>("EmployeeId")
.HasMaxLength(6)
.HasColumnType("int");
b.Property<string>("KeyAnswerResult")
.HasMaxLength(250)
.HasColumnType("nvarchar(250)");
b.Property<double?>("Latitude")
.HasColumnType("float");
b.Property<int>("LocationId")
.HasColumnType("int");
b.Property<double?>("Longitute")
.HasColumnType("float");
b.Property<int>("SurveyId")
.HasColumnType("int");
b.HasKey("Id");
b.ToTable("SurveyResponses");
});
#pragma warning restore 612, 618
}
}
}

View File

@ -1,11 +1,12 @@
using Microsoft.EntityFrameworkCore.Migrations; using System;
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable #nullable disable
namespace DamageAssesment.Api.SurveyResponses.Migrations namespace DamageAssesment.Api.Responses.Migrations
{ {
/// <inheritdoc /> /// <inheritdoc />
public partial class InitialSurveyResponse : Migration public partial class AzureSurveyResponses : Migration
{ {
/// <inheritdoc /> /// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder) protected override void Up(MigrationBuilder migrationBuilder)
@ -17,8 +18,13 @@ namespace DamageAssesment.Api.SurveyResponses.Migrations
Id = table.Column<int>(type: "int", nullable: false) Id = table.Column<int>(type: "int", nullable: false)
.Annotation("SqlServer:Identity", "1, 1"), .Annotation("SqlServer:Identity", "1, 1"),
SurveyId = table.Column<int>(type: "int", nullable: false), SurveyId = table.Column<int>(type: "int", nullable: false),
LocationId = table.Column<string>(type: "nvarchar(4)", maxLength: 4, nullable: false), LocationId = table.Column<int>(type: "int", nullable: false),
EmployeeId = table.Column<string>(type: "nvarchar(6)", maxLength: 6, nullable: false) EmployeeId = table.Column<int>(type: "int", maxLength: 6, nullable: false),
CreatedDate = table.Column<DateTime>(type: "datetime2", nullable: true),
ClientDevice = table.Column<string>(type: "nvarchar(50)", maxLength: 50, nullable: true),
KeyAnswerResult = table.Column<string>(type: "nvarchar(250)", maxLength: 250, nullable: true),
Longitute = table.Column<double>(type: "float", nullable: true),
Latitude = table.Column<double>(type: "float", nullable: true)
}, },
constraints: table => constraints: table =>
{ {

View File

@ -1,5 +1,6 @@
// <auto-generated /> // <auto-generated />
using DamageAssesment.Api.SurveyResponses.Db; using System;
using DamageAssesment.Api.Responses.Db;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata; using Microsoft.EntityFrameworkCore.Metadata;
@ -7,7 +8,7 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
#nullable disable #nullable disable
namespace DamageAssesment.Api.SurveyResponses.Migrations namespace DamageAssesment.Api.Responses.Migrations
{ {
[DbContext(typeof(SurveyResponseDbContext))] [DbContext(typeof(SurveyResponseDbContext))]
partial class SurveyResponseDbContextModelSnapshot : ModelSnapshot partial class SurveyResponseDbContextModelSnapshot : ModelSnapshot
@ -29,15 +30,29 @@ namespace DamageAssesment.Api.SurveyResponses.Migrations
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id")); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<string>("EmployeeId") b.Property<string>("ClientDevice")
.IsRequired() .HasMaxLength(50)
.HasMaxLength(6) .HasColumnType("nvarchar(50)");
.HasColumnType("nvarchar(6)");
b.Property<string>("LocationId") b.Property<DateTime?>("CreatedDate")
.IsRequired() .HasColumnType("datetime2");
.HasMaxLength(4)
.HasColumnType("nvarchar(4)"); b.Property<int>("EmployeeId")
.HasMaxLength(6)
.HasColumnType("int");
b.Property<string>("KeyAnswerResult")
.HasMaxLength(250)
.HasColumnType("nvarchar(250)");
b.Property<double?>("Latitude")
.HasColumnType("float");
b.Property<int>("LocationId")
.HasColumnType("int");
b.Property<double?>("Longitute")
.HasColumnType("float");
b.Property<int>("SurveyId") b.Property<int>("SurveyId")
.HasColumnType("int"); .HasColumnType("int");

View File

@ -1,6 +1,6 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
namespace DamageAssesment.Api.SurveyResponses.Models namespace DamageAssesment.Api.Responses.Models
{ {
public class Answer public class Answer
{ {

View File

@ -1,4 +1,4 @@
namespace DamageAssesment.Api.SurveyResponses.Models namespace DamageAssesment.Api.Responses.Models
{ {
public class AnswerRequest public class AnswerRequest
{ {

View File

@ -1,6 +1,6 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
namespace DamageAssesment.Api.SurveyResponses.Models namespace DamageAssesment.Api.Responses.Models
{ {
public class Attachment public class Attachment
{ {

View File

@ -1,4 +1,4 @@
namespace DamageAssesment.Api.SurveyResponses.Models namespace DamageAssesment.Api.Responses.Models
{ {
public class AttachmentInfo public class AttachmentInfo
{ {

View File

@ -1,6 +1,6 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
namespace DamageAssesment.Api.SurveyResponses.Models namespace DamageAssesment.Api.Responses.Models
{ {
public class Employee public class Employee
{ {
@ -11,6 +11,6 @@ namespace DamageAssesment.Api.SurveyResponses.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

@ -1,4 +1,4 @@
namespace DamageAssesment.Api.SurveyResponses.Models namespace DamageAssesment.Api.Responses.Models
{ {
public class Location public class Location
{ {

View File

@ -1,6 +1,6 @@
using System.Collections.Generic; using System.Collections.Generic;
namespace DamageAssesment.Api.SurveyResponses.Models namespace DamageAssesment.Api.Responses.Models
{ {
public class Question public class Question
{ {

View File

@ -1,6 +1,6 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
namespace DamageAssesment.Api.SurveyResponses.Models namespace DamageAssesment.Api.Responses.Models
{ {
public class Region public class Region
{ {

View File

@ -1,4 +1,4 @@
namespace DamageAssesment.Api.SurveyResponses.Models namespace DamageAssesment.Api.Responses.Models
{ {
public class Request public class Request
{ {

View File

@ -1,6 +1,6 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
namespace DamageAssesment.Api.SurveyResponses.Models namespace DamageAssesment.Api.Responses.Models
{ {
public class Survey public class Survey
{ {

View File

@ -1,4 +1,4 @@
namespace DamageAssesment.Api.SurveyResponses.Models namespace DamageAssesment.Api.Responses.Models
{ {
public class SurveyQuestions public class SurveyQuestions
{ {

View File

@ -1,7 +1,7 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
namespace DamageAssesment.Api.SurveyResponses.Models namespace DamageAssesment.Api.Responses.Models
{ {
public class SurveyResponse public class SurveyResponse
{ {

View File

@ -1,4 +1,4 @@
namespace DamageAssesment.Api.SurveyResponses.Models namespace DamageAssesment.Api.Responses.Models
{ {
public class SurveyTranslation public class SurveyTranslation
{ {

View File

@ -1,4 +1,4 @@
namespace DamageAssesment.Api.SurveyResponses.Profiles namespace DamageAssesment.Api.Responses.Profiles
{ {
public class SurveyResponsesProvider : AutoMapper.Profile public class SurveyResponsesProvider : AutoMapper.Profile
{ {

View File

@ -1,10 +1,14 @@
using DamageAssesment.Api.SurveyResponses.Db; using DamageAssesment.Api.Responses.Db;
using DamageAssesment.Api.SurveyResponses.Interfaces; using DamageAssesment.Api.Responses.Interfaces;
using DamageAssesment.Api.SurveyResponses.Services; using DamageAssesment.Api.Responses.Services;
using DamageAssesment.Api.SurveyResponses.Providers; 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.AddHttpClient<IHttpUtil, HttpUtil>(). builder.Services.AddHttpClient<IHttpUtil, HttpUtil>().
AddTransientHttpErrorPolicy(policy => policy.WaitAndRetryAsync(maxApiCallRetries, _ => TimeSpan.FromSeconds(intervalToRetry))). AddTransientHttpErrorPolicy(policy => policy.WaitAndRetryAsync(maxApiCallRetries, _ => TimeSpan.FromSeconds(intervalToRetry))).
@ -35,12 +58,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 =>
{ {
@ -55,6 +106,7 @@ if (app.Environment.IsDevelopment())
app.UseSwaggerUI(); app.UseSwaggerUI();
} }
app.UseAuthentication();
app.UseAuthorization(); app.UseAuthorization();
app.MapControllers(); app.MapControllers();

View File

@ -9,7 +9,7 @@
} }
}, },
"profiles": { "profiles": {
"DamageAssesment.Api.SurveyResponses": { "DamageAssesment.Api.Responses": {
"commandName": "Project", "commandName": "Project",
"dotnetRunMessages": true, "dotnetRunMessages": true,
"launchBrowser": true, "launchBrowser": true,

View File

@ -1,10 +1,10 @@
using AutoMapper; using AutoMapper;
using DamageAssesment.Api.SurveyResponses.Db; using DamageAssesment.Api.Responses.Db;
using DamageAssesment.Api.SurveyResponses.Interfaces; using DamageAssesment.Api.Responses.Interfaces;
using DamageAssesment.Api.SurveyResponses.Models; using DamageAssesment.Api.Responses.Models;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
namespace DamageAssesment.Api.SurveyResponses.Providers namespace DamageAssesment.Api.Responses.Providers
{ {
public class SurveyResponsesProvider : ISurveysResponse public class SurveyResponsesProvider : ISurveysResponse
{ {
@ -18,8 +18,10 @@ namespace DamageAssesment.Api.SurveyResponses.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;
@ -30,7 +32,18 @@ namespace DamageAssesment.Api.SurveyResponses.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;
token = httpContextAccessor.HttpContext.Request.Headers.Authorization;
if (token != null)
{
token = token.Replace("Bearer ", string.Empty);
}
else
{
token = "";
}
// seedData(); // seedData();
} }
@ -38,31 +51,22 @@ namespace DamageAssesment.Api.SurveyResponses.Providers
{ {
if (!surveyResponseDbContext.SurveyResponses.Any()) if (!surveyResponseDbContext.SurveyResponses.Any())
{ {
surveyResponseDbContext.SurveyResponses.Add(new Db.SurveyResponse { SurveyId = 1, EmployeeId = 1, LocationId = 1 }); surveyResponseDbContext.SurveyResponses.Add(new Db.SurveyResponse { Id = 1, SurveyId = 1, EmployeeId = 1, LocationId = 1, ClientDevice = "Mobile", Latitude = 98.8767, Longitute = -129.9897, KeyAnswerResult = "true", CreatedDate = DateTime.Now });
surveyResponseDbContext.SurveyResponses.Add(new Db.SurveyResponse { SurveyId = 1, EmployeeId = 2, LocationId = 1 }); surveyResponseDbContext.SurveyResponses.Add(new Db.SurveyResponse { Id = 2, SurveyId = 1, EmployeeId = 2, LocationId = 2, ClientDevice = "Desktop", Latitude = 98.8767, Longitute = -129.9897, KeyAnswerResult = "true", CreatedDate = DateTime.Now });
surveyResponseDbContext.SurveyResponses.Add(new Db.SurveyResponse { SurveyId = 3, EmployeeId = 3, LocationId = 2 }); surveyResponseDbContext.SurveyResponses.Add(new Db.SurveyResponse { Id = 3, SurveyId = 3, EmployeeId = 4, LocationId = 1, ClientDevice = "Mobile", Latitude = 98.8767, Longitute = -129.9897, KeyAnswerResult = "true", CreatedDate = DateTime.Now });
surveyResponseDbContext.SurveyResponses.Add(new Db.SurveyResponse { SurveyId = 4, EmployeeId = 4, LocationId = 2 }); surveyResponseDbContext.SurveyResponses.Add(new Db.SurveyResponse { Id = 4, SurveyId = 4, EmployeeId = 1, LocationId = 2, ClientDevice = "Desktop", Latitude = 98.8767, Longitute = -129.9897, KeyAnswerResult = "false", CreatedDate = DateTime.Now });
surveyResponseDbContext.SurveyResponses.Add(new Db.SurveyResponse { SurveyId = 1, EmployeeId = 5, LocationId = 3}); surveyResponseDbContext.SurveyResponses.Add(new Db.SurveyResponse { Id = 5, SurveyId = 1, EmployeeId = 4, LocationId = 2, ClientDevice = "Desktop", Latitude = 98.8767, Longitute = -129.9897, KeyAnswerResult = "true", CreatedDate = DateTime.Now });
surveyResponseDbContext.SurveyResponses.Add(new Db.SurveyResponse { SurveyId = 1, EmployeeId = 4, LocationId = 2 }); surveyResponseDbContext.SurveyResponses.Add(new Db.SurveyResponse { Id = 6, SurveyId = 1, EmployeeId = 4, LocationId = 3, ClientDevice = "Desktop", Latitude = 98.8767, Longitute = -129.9897, KeyAnswerResult = "false", CreatedDate = DateTime.Now });
surveyResponseDbContext.SurveyResponses.Add(new Db.SurveyResponse { SurveyId = 1, EmployeeId = 3, LocationId = 1 });
surveyResponseDbContext.SaveChanges(); surveyResponseDbContext.SaveChanges();
} }
} }
public async Task<(bool IsSuccess, dynamic Answers, string ErrorMessage)> GetAnswersByRegionAsync(int surveyId, int employeeid) public async Task<(bool IsSuccess, dynamic Answers, string ErrorMessage)> GetAnswersByRegionAsync(int surveyId)
{ {
try try
{ {
logger?.LogInformation("Querying to get SurveyResponse object from DB"); logger?.LogInformation("Querying to get SurveyResponse object from DB");
IQueryable<Db.SurveyResponse> listSurveyResponse = null; var listSurveyResponse = surveyResponseDbContext.SurveyResponses.Where(s => s.SurveyId == surveyId);
if (employeeid == 0)
{
listSurveyResponse = surveyResponseDbContext.SurveyResponses.Where(s => s.SurveyId == surveyId);
}
else
{
listSurveyResponse = surveyResponseDbContext.SurveyResponses.Where(s => s.SurveyId == surveyId && s.EmployeeId == employeeid);
}
if (listSurveyResponse.Any()) if (listSurveyResponse.Any())
{ {
@ -111,67 +115,19 @@ namespace DamageAssesment.Api.SurveyResponses.Providers
return (false, null, ex.Message); return (false, null, ex.Message);
} }
} }
public async Task<(bool IsSuccess, dynamic Surveys, string ErrorMessage)> GetActiveSurveysAsync(int employeeid, string language)
{
try
{
logger?.LogInformation("Querying to get SurveyResponse object from DB");
//get all the survey that already taken by the employee
var listOfsurveysId = await surveyResponseDbContext.SurveyResponses.Where(x => x.EmployeeId == employeeid).Select(y => y.SurveyId).ToListAsync();
var surveys = await surveyServiceProvider.getSurveysAsync(language);
if (surveys != null)
{
surveys = surveys.Where(s => s.IsEnabled == true && s.StartDate <= DateTime.Now && s.EndDate >= DateTime.Now).ToList();
}
if (listOfsurveysId==null || listOfsurveysId.Count == 0)
return (true, surveys, null);
var activeSurveys = surveys.Where(s => s.IsEnabled == true && s.StartDate <= DateTime.Now && s.EndDate >= DateTime.Now && !listOfsurveysId.Contains(s.Id)); public async Task<(bool IsSuccess, dynamic SurveyResponses, string ErrorMessage)> GetSurveyResponsesBySurveyAsync(int surveyId)
return (true, activeSurveys, null);
}
catch (Exception ex)
{
logger?.LogError(ex.ToString());
return (false, null, ex.Message);
}
}
public async Task<(bool IsSuccess, dynamic Surveys, string ErrorMessage)> GetHistoricSurveysAsync(int employeeid, string language)
{
try
{
logger?.LogInformation("Querying to get SurveyResponse object from DB");
//get all the survey that already taken by the employee
var surveyResponses = await surveyResponseDbContext.SurveyResponses.Where(x => x.EmployeeId == employeeid).ToListAsync();
var surveys = await surveyServiceProvider.getSurveysAsync(language);
var historicSurveys = from s in surveys
from r in surveyResponses
where s.Id == r.SurveyId
select s;
return (true, historicSurveys, null);
}
catch (Exception ex)
{
logger?.LogError(ex.ToString());
return (false, null, ex.Message);
}
}
public async Task<(bool IsSuccess, dynamic SurveyResponses, string ErrorMessage)> GetSurveyResponsesBySurveyAsync(int surveyId, int employeeid)
{ {
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)
{ {
var answers = await getSurveyResponsesBySurveyIdAsync(surveyId, employeeid); var answers = await getSurveyResponsesBySurveyIdAsync(surveyId);
if (answers != null) if (answers != null)
return (true, answers, "Request Successful."); return (true, answers, "Request Successful.");
@ -193,16 +149,16 @@ namespace DamageAssesment.Api.SurveyResponses.Providers
} }
} }
public async Task<(bool IsSuccess, dynamic SurveyResponses, string ErrorMessage)> GetSurveyResponsesBySurveyAndLocationAsync(int surveyId, int locationId, int employeeid) public async Task<(bool IsSuccess, dynamic SurveyResponses, string ErrorMessage)> GetSurveyResponsesBySurveyAndLocationAsync(int surveyId, int locationId)
{ {
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)
{ {
var answers = await getSurveyResponsesBySurveyIdLocationIdAsync(surveyId, locationId, employeeid); var answers = await getSurveyResponsesBySurveyIdLocationIdAsync(surveyId, locationId);
if (answers != null) if (answers != null)
return (true, answers, "Request Successful."); return (true, answers, "Request Successful.");
@ -224,16 +180,16 @@ namespace DamageAssesment.Api.SurveyResponses.Providers
} }
} }
public async Task<(bool IsSuccess, dynamic SurveyResponses, string ErrorMessage)> GetSurveyResponsesByMaintenanceCenterAsync(int surveyId, int employeeid) public async Task<(bool IsSuccess, dynamic SurveyResponses, string ErrorMessage)> GetSurveyResponsesByMaintenanceCenterAsync(int surveyId)
{ {
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)
{ {
var answers = await getResultsByMaintenanceCenterAsync(surveyId, employeeid); var answers = await getResultsByMaintenanceCenterAsync(surveyId);
if (answers != null) if (answers != null)
return (true, answers, "Request Successful."); return (true, answers, "Request Successful.");
@ -255,19 +211,19 @@ namespace DamageAssesment.Api.SurveyResponses.Providers
} }
} }
public async Task<(bool IsSuccess, dynamic SurveyResponses, string ErrorMessage)> GetResponsesByAnswerAsync(int surveyId, int questionId, string answer, int employeeid) public async Task<(bool IsSuccess, dynamic SurveyResponses, string ErrorMessage)> GetResponsesByAnswerAsync(int surveyId, int questionId, string answer)
{ {
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;
if (survey != null && question != null && IsCorrectAnswer) if (survey != null && question != null && IsCorrectAnswer)
{ {
var answers = await getSurveyResponsesByAnswerAsync(survey, question, answer, employeeid); var answers = await getSurveyResponsesByAnswerAsync(survey, question, answer);
if (answers != null) if (answers != null)
return (true, answers, "Request Successful."); return (true, answers, "Request Successful.");
@ -290,18 +246,18 @@ namespace DamageAssesment.Api.SurveyResponses.Providers
} }
public async Task<(bool IsSuccess, dynamic surveyResponses, string ErrorMessage)> GetSurveyResponsesAsync(int employeeid) public async Task<(bool IsSuccess, dynamic surveyResponses, string ErrorMessage)> GetSurveyResponsesAsync()
{ {
try try
{ {
var responses = await getAllSurveyResponsesAsync(employeeid); var answers = await getAllSurveyResponsesAsync();
if (responses != null) if (answers != null)
return (true, responses, "Request Successful."); return (true, answers, "Request Successful.");
else else
{ {
responses = new List<Models.SurveyResponse>(); answers = new List<Models.SurveyResponse>();
return (true, responses, "Empty object returned"); return (true, answers, "Empty object returned");
} }
} }
catch (Exception ex) catch (Exception ex)
@ -402,7 +358,7 @@ namespace DamageAssesment.Api.SurveyResponses.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;
@ -412,7 +368,7 @@ namespace DamageAssesment.Api.SurveyResponses.Providers
answer => answer.SurveyResponseId, answer => answer.SurveyResponseId,
surveyResponse => surveyResponse.Id, surveyResponse => surveyResponse.Id,
(answer, surveyResponse) => new (answer, surveyResponse) => new
{ {
answer.Id, answer.Id,
answer.QuestionId, answer.QuestionId,
@ -425,8 +381,8 @@ namespace DamageAssesment.Api.SurveyResponses.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;
@ -436,18 +392,18 @@ namespace DamageAssesment.Api.SurveyResponses.Providers
var result = from answer in surveyAnswers var result = from answer in surveyAnswers
from location in locations from location in locations
where answer.LocationId.Equals(location.Id) where answer.LocationId.Equals(location.Id)
select new select new
{ {
answer.Id, answer.Id,
answer.QuestionId, answer.QuestionId,
answer.AnswerText, answer.AnswerText,
answer.Comment, answer.Comment,
location.RegionId, location.RegionId,
LocationId = location.Id, LocationId = location.Id,
answer.SurveyResponseId answer.SurveyResponseId
}; };
//group records by answer and region //group records by answer and region
var q = from e in result var q = from e in result
@ -455,13 +411,13 @@ namespace DamageAssesment.Api.SurveyResponses.Providers
select new select new
{ {
g.Key.RegionId, g.Key.RegionId,
Answers = new Answers = new
{ {
g.Key.AnswerText, g.Key.AnswerText,
Counter = g.Count() Counter = g.Count()
} }
}; };
//build the result //build the result
List<dynamic> resultList = new List<dynamic>(); List<dynamic> resultList = new List<dynamic>();
@ -469,9 +425,9 @@ namespace DamageAssesment.Api.SurveyResponses.Providers
{ {
var answers = from u in q.ToList() var answers = from u in q.ToList()
where u.RegionId.Equals(region.Id) where u.RegionId.Equals(region.Id)
select u.Answers; select u.Answers;
resultList.Add(new { RegionId = region.Id, region.Name, region.Abbreviation, Answers = answers }); resultList.Add(new { RegionId = region.Id, region.Name, region.Abbreviation, Answers = answers});
} }
//return the object result //return the object result
return new { Regions = resultList }; return new { Regions = resultList };
@ -488,11 +444,11 @@ namespace DamageAssesment.Api.SurveyResponses.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(); var allQuestions = await questionServiceProvider.getQuestionsAsync(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 result = new var result = new
{ {
@ -527,95 +483,45 @@ namespace DamageAssesment.Api.SurveyResponses.Providers
//Method to get Survey Responses by surveyId //Method to get Survey Responses by surveyId
private async Task<dynamic> getSurveyResponsesBySurveyIdAsync(int surveyId, int employeeid) private async Task<dynamic> getSurveyResponsesBySurveyIdAsync(int surveyId)
{ {
try try
{ {
List<Db.SurveyResponse> surveyResonses = null; var surveyResonses = await surveyResponseDbContext.SurveyResponses.Where(x => x.SurveyId == surveyId).ToListAsync();
Employee employee = null; var employees = await employeeServiceProvider.getEmployeesAsync(token);
List<Employee> employees = null; var answers = await answerServiceProvider.getAnswersAsync(token);
if (employeeid == 0) var questions = await questionServiceProvider.getQuestionsAsync(token);
{
surveyResonses = await surveyResponseDbContext.SurveyResponses.Where(x => x.SurveyId == surveyId).ToListAsync();
employees = await employeeServiceProvider.getEmployeesAsync();
}
else
{
surveyResonses = await surveyResponseDbContext.SurveyResponses.Where(x => x.SurveyId == surveyId && x.EmployeeId == employeeid).ToListAsync();
employee = await employeeServiceProvider.getEmployeeAsync(employeeid);
}
var answers = await answerServiceProvider.getAnswersAsync();
var questions = await questionServiceProvider.getQuestionsAsync();
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);
var result = from r in surveyResonses
select new
{
r.Id,
r.SurveyId,
r.LocationId,
r.EmployeeId,
r.ClientDevice,
r.KeyAnswerResult,
r.Longitute,
r.Latitude,
Employee = (from e in employees where e.Id == r.EmployeeId select new { e.Id, e.Name, e.BirthDate, e.Email, e.OfficePhoneNumber }).SingleOrDefault(),
answers = from ans in answers
where ans.SurveyResponseId == r.Id
select new
{
ans.Id,
ans.QuestionId,
ans.AnswerText,
ans.Comment,
Questions = (from q in surveyQuestions where q.Id == ans.QuestionId select new { q.Id, q.QuestionNumber, q.CategoryId, q.Text }).SingleOrDefault(),
Attachments = from att in attachments where att.AnswerId == ans.Id select new { att.Id, att.URI }
if (employeeid == 0) }
{ };
var result = from r in surveyResonses return result;
select new
{
r.Id,
r.SurveyId,
r.LocationId,
r.EmployeeId,
r.ClientDevice,
r.KeyAnswerResult,
r.Longitute,
r.Latitude,
Employee = (from e in employees where e.Id == r.EmployeeId select new { e.Id, e.Name, e.BirthDate, e.Email, e.OfficePhoneNumber }).SingleOrDefault(),
answers = from ans in answers
where ans.SurveyResponseId == r.Id
select new
{
ans.Id,
ans.QuestionId,
ans.AnswerText,
ans.Comment,
Questions = (from q in surveyQuestions where q.Id == ans.QuestionId select new { q.Id, q.QuestionNumber, q.CategoryId, q.Text }).SingleOrDefault(),
Attachments = from att in attachments where att.AnswerId == ans.Id select new { att.Id, att.URI }
}
};
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
select new
{
r.Id,
r.SurveyId,
r.LocationId,
r.EmployeeId,
r.ClientDevice,
r.KeyAnswerResult,
r.Longitute,
r.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)
{ {
@ -626,34 +532,15 @@ namespace DamageAssesment.Api.SurveyResponses.Providers
//Method to get All Survey Responses //Method to get All Survey Responses
private async Task<dynamic> getAllSurveyResponsesAsync(int employeeid) private async Task<dynamic> getAllSurveyResponsesAsync()
{ {
try try
{ {
List<Db.SurveyResponse> surveyResonses = null; var surveyResonses = await surveyResponseDbContext.SurveyResponses.ToListAsync();
Employee employee = null; var employees = await employeeServiceProvider.getEmployeesAsync(token);
List<Employee> employees = null; var answers = await answerServiceProvider.getAnswersAsync(token);
object _employee = new { }; var questions = await questionServiceProvider.getQuestionsAsync(token);
if (employeeid == 0) var attachments = await attachmentServiceProvider.getAttachmentsAsync(token);
{
surveyResonses = await surveyResponseDbContext.SurveyResponses.ToListAsync();
employees = await employeeServiceProvider.getEmployeesAsync();
}
else
{
surveyResonses = await surveyResponseDbContext.SurveyResponses.Where(x => x.EmployeeId == employeeid).ToListAsync();
employee = await employeeServiceProvider.getEmployeeAsync(employeeid);
if (employee != null)
{
_employee = new { employee.Id, employee.Name, employee.BirthDate, employee.Email, employee.OfficePhoneNumber };
}
}
var answers = await answerServiceProvider.getAnswersAsync();
var questions = await questionServiceProvider.getQuestionsAsync();
var attachments = await attachmentServiceProvider.getAttachmentsAsync();
var result = from r in surveyResonses var result = from r in surveyResonses
select new select new
@ -666,7 +553,7 @@ namespace DamageAssesment.Api.SurveyResponses.Providers
r.KeyAnswerResult, r.KeyAnswerResult,
r.Longitute, r.Longitute,
r.Latitude, r.Latitude,
Employee = employeeid != 0 ? _employee : (from e in employees where r.EmployeeId == e.Id select new { e.Id, e.Name, e.BirthDate, e.Email, e.OfficePhoneNumber }).SingleOrDefault(), Employee = (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
@ -680,8 +567,6 @@ namespace DamageAssesment.Api.SurveyResponses.Providers
} }
}; };
return result; return result;
} }
catch (Exception ex) catch (Exception ex)
{ {
@ -692,21 +577,13 @@ namespace DamageAssesment.Api.SurveyResponses.Providers
//Method to get Answers By Maintenance Center by surveyId //Method to get Answers By Maintenance Center by surveyId
private async Task<dynamic> getResultsByMaintenanceCenterAsync(int surveyId, int employeeid) private async Task<dynamic> getResultsByMaintenanceCenterAsync(int surveyId)
{ {
try try
{ {
List<Db.SurveyResponse> surveyResponses = null; var surveyResponses = await surveyResponseDbContext.SurveyResponses.Where(x => x.SurveyId == surveyId).ToListAsync();
if (employeeid == 0) var answers = await answerServiceProvider.getAnswersAsync(token);
{ var locations = await locationServiceProvider.getLocationsAsync(token);
surveyResponses = await surveyResponseDbContext.SurveyResponses.Where(x => x.SurveyId == surveyId).ToListAsync();
}
else
{
surveyResponses = await surveyResponseDbContext.SurveyResponses.Where(x => x.SurveyId == surveyId && x.EmployeeId == employeeid).ToListAsync();
}
var answers = await answerServiceProvider.getAnswersAsync();
var locations = await locationServiceProvider.getLocationsAsync();
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
@ -735,7 +612,7 @@ namespace DamageAssesment.Api.SurveyResponses.Providers
select new select new
{ {
g.Key.MaintenanceCenter, g.Key.MaintenanceCenter,
Answers = new Answers = new
{ {
g.Key.AnswerText, g.Key.AnswerText,
Counter = g.Count() Counter = g.Count()
@ -760,35 +637,16 @@ namespace DamageAssesment.Api.SurveyResponses.Providers
} }
//Method to get Survey Responses by surveyId and LocationId //Method to get Survey Responses by surveyId and LocationId
private async Task<dynamic> getSurveyResponsesBySurveyIdLocationIdAsync(int surveyId, int locationId, int employeeid) private async Task<dynamic> getSurveyResponsesBySurveyIdLocationIdAsync(int surveyId, int locationId)
{ {
try try
{ {
List<Db.SurveyResponse> surveyResonses = null; var surveyResonses = await surveyResponseDbContext.SurveyResponses.Where(x => x.SurveyId == surveyId && x.LocationId.Equals(locationId)).ToListAsync();
Employee employee = null; var employees = await employeeServiceProvider.getEmployeesAsync(token);
List<Employee> employees = null; var answers = await answerServiceProvider.getAnswersAsync(token);
object _employee = new { }; var questions = await questionServiceProvider.getQuestionsAsync(token);
if (employeeid == 0)
{
surveyResonses = await surveyResponseDbContext.SurveyResponses.Where(x => x.SurveyId == surveyId && x.LocationId == locationId).ToListAsync();
employees = await employeeServiceProvider.getEmployeesAsync();
}
else
{
surveyResonses = await surveyResponseDbContext.SurveyResponses.Where(x => x.SurveyId == surveyId && x.EmployeeId == employeeid && x.LocationId == locationId).ToListAsync();
employee = await employeeServiceProvider.getEmployeeAsync(employeeid);
if (employee != null)
{
_employee = new { employee.Id, employee.Name, employee.BirthDate, employee.Email, employee.OfficePhoneNumber };
}
}
var answers = await answerServiceProvider.getAnswersAsync();
var questions = await questionServiceProvider.getQuestionsAsync();
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 attachments = await attachmentServiceProvider.getAttachmentsAsync(); var attachments = await attachmentServiceProvider.getAttachmentsAsync(token);
var result = from r in surveyResonses var result = from r in surveyResonses
select new select new
@ -801,7 +659,7 @@ namespace DamageAssesment.Api.SurveyResponses.Providers
r.KeyAnswerResult, r.KeyAnswerResult,
r.Longitute, r.Longitute,
r.Latitude, r.Latitude,
Employee = employeeid != 0 ? _employee : (from e in employees where r.EmployeeId == e.Id select new { e.Id, e.Name, e.BirthDate, e.Email, e.OfficePhoneNumber }).SingleOrDefault(), Employee = (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
@ -816,7 +674,6 @@ namespace DamageAssesment.Api.SurveyResponses.Providers
} }
}; };
return result; return result;
} }
catch (Exception ex) catch (Exception ex)
{ {
@ -827,35 +684,14 @@ namespace DamageAssesment.Api.SurveyResponses.Providers
//Method to get Survey Responses by surveyId questionId and answer //Method to get Survey Responses by surveyId questionId and answer
private async Task<dynamic> getSurveyResponsesByAnswerAsync(Survey survey, Question question, string answer, int employeeid) private async Task<dynamic> getSurveyResponsesByAnswerAsync(Survey survey, Question question, string answer)
{ {
try try
{ {
List<Db.SurveyResponse> surveyResponses = null; var surveyResponses = await surveyResponseDbContext.SurveyResponses.Where(x => x.SurveyId == survey.Id).ToListAsync();
Employee employee = null; var answers = await answerServiceProvider.getAnswersAsync(token);
List<Employee> employees = null; var employees = await employeeServiceProvider.getEmployeesAsync(token);
object _employee = new { }; var attachments = await attachmentServiceProvider.getAttachmentsAsync(token);
if (employeeid == 0)
{
surveyResponses = await surveyResponseDbContext.SurveyResponses.Where(x => x.SurveyId == survey.Id).ToListAsync();
employees = await employeeServiceProvider.getEmployeesAsync();
}
else
{
surveyResponses = await surveyResponseDbContext.SurveyResponses.Where(x => x.SurveyId == survey.Id && x.EmployeeId == employeeid).ToListAsync();
employee = await employeeServiceProvider.getEmployeeAsync(employeeid);
if (employee != null)
{
_employee = new { employee.Id, employee.Name, employee.BirthDate, employee.Email, employee.OfficePhoneNumber };
}
}
//var surveyResponses = await surveyResponseDbContext.SurveyResponses.Where(x => x.SurveyId == survey.Id).ToListAsync();
// var employees = await employeeServiceProvider.getEmployeesAsync();
var answers = await answerServiceProvider.getAnswersAsync();
var attachments = await attachmentServiceProvider.getAttachmentsAsync();
var result = from r in surveyResponses var result = from r in surveyResponses
select new select new
@ -868,7 +704,7 @@ namespace DamageAssesment.Api.SurveyResponses.Providers
r.KeyAnswerResult, r.KeyAnswerResult,
r.Longitute, r.Longitute,
r.Latitude, r.Latitude,
Employee = employeeid != 0 ? _employee : (from e in employees where r.EmployeeId == e.Id select new { e.Id, e.Name, e.BirthDate, e.Email, e.OfficePhoneNumber }).SingleOrDefault(), Employee = (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
@ -898,12 +734,12 @@ namespace DamageAssesment.Api.SurveyResponses.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);
@ -924,14 +760,13 @@ namespace DamageAssesment.Api.SurveyResponses.Providers
} }
} }
public async Task<(bool IsSuccess, Models.SurveyResponse SurveyResponse, string ErrorMessage)> PostSurveyAnswersAsync(Models.Request request) public async Task<(bool IsSuccess, Models.SurveyResponse SurveyResponse, string ErrorMessage)> PostSurveyAnswersAsync(Models.Request request)
{ {
try try
{ {
if (request != null) if (request != null)
{ {
var response = await PostSurveyResponseAsync(new Models.SurveyResponse { SurveyId = request.SurveyId, EmployeeId = request.EmployeeId, LocationId = request.LocationId, ClientDevice = request.ClientDevice, KeyAnswerResult = request.KeyAnswerResult, Latitude = Convert.ToDouble(request.Latitude), Longitute = Convert.ToDouble(request.Longitute), CreatedDate = DateTime.Now }); var response = await PostSurveyResponseAsync(new Models.SurveyResponse { SurveyId = request.SurveyId, EmployeeId = request.EmployeeId, LocationId = request.LocationId, ClientDevice = request.ClientDevice, KeyAnswerResult = request.KeyAnswerResult, Latitude = Convert.ToDouble(request.Latitude), Longitute = Convert.ToDouble(request.Longitute), CreatedDate=DateTime.Now });
if (response.IsSuccess) if (response.IsSuccess)
{ {
var surveyResponse = response.SurveyResponse; var surveyResponse = response.SurveyResponse;

View File

@ -1,20 +1,21 @@
using DamageAssesment.Api.SurveyResponses.Interfaces; using DamageAssesment.Api.Responses.Interfaces;
using DamageAssesment.Api.SurveyResponses.Models; using DamageAssesment.Api.Responses.Models;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json; using Newtonsoft.Json;
namespace DamageAssesment.Api.SurveyResponses.Services namespace DamageAssesment.Api.Responses.Services
{ {
public class AnswerServiceProvider : ServiceProviderBase, IAnswerServiceProvider public class AnswerServiceProvider : ServiceProviderBase, IAnswerServiceProvider
{ {
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.SurveyResponses.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.SurveyResponses.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

@ -1,8 +1,8 @@
using DamageAssesment.Api.SurveyResponses.Interfaces; using DamageAssesment.Api.Responses.Interfaces;
using DamageAssesment.Api.SurveyResponses.Models; using DamageAssesment.Api.Responses.Models;
using Newtonsoft.Json; using Newtonsoft.Json;
namespace DamageAssesment.Api.SurveyResponses.Services namespace DamageAssesment.Api.Responses.Services
{ {
public class AttachmentServiceProvider : ServiceProviderBase, IAttachmentServiceProvider public class AttachmentServiceProvider : ServiceProviderBase, IAttachmentServiceProvider
{ {
@ -10,11 +10,11 @@ namespace DamageAssesment.Api.SurveyResponses.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.SurveyResponses.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

@ -0,0 +1,51 @@
using DamageAssesment.Api.Responses.Interfaces;
using DamageAssesment.Api.Responses.Models;
using Microsoft.AspNetCore.Mvc.Routing;
using Newtonsoft.Json;
namespace DamageAssesment.Api.Responses.Services
{
public class EmployeeServiceProvider : ServiceProviderBase, IEmployeeServiceProvider
{
public EmployeeServiceProvider(IConfiguration configuration, IHttpUtil httpUtil, ILogger<EmployeeServiceProvider> logger) : base(configuration, httpUtil, logger, configuration.GetValue<string>("RessourceSettings:Employee"), configuration.GetValue<string>("EndPointSettings:EmployeeUrlBase"))
{
}
public async Task<List<Employee>> getEmployeesAsync(string token)
{
try
{
var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null,token);
var employees = JsonConvert.DeserializeObject<List<Employee>>(responseJsonString);
if (employees == null || !employees.Any())
return new List<Employee>();
else return employees;
}
catch (Exception ex)
{
logger?.LogError($"Exception Found : {ex.Message} - Ref: EmployeeServiceProvider.getEmployeesAsync()");
return new List<Employee>();
}
}
public async Task<Employee> getEmployeeAsync(int employeeId, string token)
{
try
{
url = urlBase + string.Format(configuration.GetValue<string>("RessourceSettings:EmployeeById"), employeeId);
var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null, token);
var employee = JsonConvert.DeserializeObject<Employee>(responseJsonString);
if (employee == null)
return null;
else return employee;
}
catch (Exception ex)
{
logger?.LogError($"Exception Found : {ex.Message} - Ref: EmployeeServiceProvider.getEmployeeAsync()");
return null;
}
}
}
}

View File

@ -0,0 +1,42 @@
using DamageAssesment.Api.Responses.Interfaces;
using DamageAssesment.Api.Responses.Models;
using System.Net.Http.Headers;
using System.Text;
namespace DamageAssesment.Api.Responses.Services
{
public class HttpUtil : IHttpUtil
{
private readonly HttpClient httpClient;
private readonly ILogger<HttpUtil> logger;
public HttpUtil(HttpClient httpClient, ILogger<HttpUtil> logger)
{
this.httpClient = httpClient;
this.logger = logger;
}
public async Task<string> SendAsync(HttpMethod method, string url, string JsonInput, string token)
{
try
{
var request = new HttpRequestMessage(method, url);
request.Headers.Accept.Clear();
request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
if (method == HttpMethod.Post)
{
request.Content = new StringContent(JsonInput, Encoding.UTF8, "application/json");
}
var response = await httpClient.SendAsync(request, CancellationToken.None);
response.EnsureSuccessStatusCode();
var responseString = await response.Content.ReadAsStringAsync();
return responseString;
}
catch (Exception ex)
{
logger?.LogError($"Exception Message : {ex.Message} - Ref: HttpUtil.SendAsync()");
return null;
}
}
}
}

View File

@ -1,8 +1,8 @@
using DamageAssesment.Api.SurveyResponses.Interfaces; using DamageAssesment.Api.Responses.Interfaces;
using DamageAssesment.Api.SurveyResponses.Models; using DamageAssesment.Api.Responses.Models;
using Newtonsoft.Json; using Newtonsoft.Json;
namespace DamageAssesment.Api.SurveyResponses.Services namespace DamageAssesment.Api.Responses.Services
{ {
public class LocationServiceProvider :ServiceProviderBase, ILocationServiceProvider public class LocationServiceProvider :ServiceProviderBase, ILocationServiceProvider
{ {
@ -10,11 +10,11 @@ namespace DamageAssesment.Api.SurveyResponses.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,8 +1,8 @@
using DamageAssesment.Api.SurveyResponses.Interfaces; using DamageAssesment.Api.Responses.Interfaces;
using DamageAssesment.Api.SurveyResponses.Models; using DamageAssesment.Api.Responses.Models;
using Newtonsoft.Json; using Newtonsoft.Json;
namespace DamageAssesment.Api.SurveyResponses.Services namespace DamageAssesment.Api.Responses.Services
{ {
public class QuestionServiceProvider : ServiceProviderBase, IQuestionServiceProvider public class QuestionServiceProvider : ServiceProviderBase, IQuestionServiceProvider
{ {
@ -10,11 +10,11 @@ namespace DamageAssesment.Api.SurveyResponses.Services
{ {
} }
public async Task<List<Question>> getQuestionsAsync() public async Task<List<Question>> getQuestionsAsync(string token)
{ {
try try
{ {
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())
@ -28,12 +28,12 @@ namespace DamageAssesment.Api.SurveyResponses.Services
} }
} }
public async Task<List<SurveyQuestions>> getSurveyQuestionsAsync(int surveyId) public async Task<List<SurveyQuestions>> getSurveyQuestionsAsync(int surveyId, string token)
{ {
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())
@ -48,12 +48,12 @@ namespace DamageAssesment.Api.SurveyResponses.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

@ -1,19 +1,19 @@
using DamageAssesment.Api.SurveyResponses.Interfaces; using DamageAssesment.Api.Responses.Interfaces;
using DamageAssesment.Api.SurveyResponses.Models; using DamageAssesment.Api.Responses.Models;
using Newtonsoft.Json; using Newtonsoft.Json;
namespace DamageAssesment.Api.SurveyResponses.Services namespace DamageAssesment.Api.Responses.Services
{ {
public class RegionServiceProvider : ServiceProviderBase, IRegionServiceProvider public class RegionServiceProvider : ServiceProviderBase, IRegionServiceProvider
{ {
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

@ -1,6 +1,6 @@
using DamageAssesment.Api.SurveyResponses.Interfaces; using DamageAssesment.Api.Responses.Interfaces;
namespace DamageAssesment.Api.SurveyResponses.Services namespace DamageAssesment.Api.Responses.Services
{ {
public class ServiceProviderBase public class ServiceProviderBase
{ {

View File

@ -1,22 +1,20 @@
using DamageAssesment.Api.SurveyResponses.Interfaces; using DamageAssesment.Api.Responses.Interfaces;
using DamageAssesment.Api.SurveyResponses.Models; using DamageAssesment.Api.Responses.Models;
using Newtonsoft.Json; using Newtonsoft.Json;
namespace DamageAssesment.Api.SurveyResponses.Services namespace DamageAssesment.Api.Responses.Services
{ {
public class SurveyServiceProvider : ServiceProviderBase, ISurveyServiceProvider public class SurveyServiceProvider :ServiceProviderBase, ISurveyServiceProvider
{ {
public SurveyServiceProvider(IConfiguration configuration, IHttpUtil httpUtil, ILogger<EmployeeServiceProvider> logger) : base(configuration, httpUtil, logger, configuration.GetValue<string>("RessourceSettings:Survey"), configuration.GetValue<string>("EndPointSettings:SurveyUrlBase")) public SurveyServiceProvider(IConfiguration configuration, IHttpUtil httpUtil, ILogger<EmployeeServiceProvider> logger) : base(configuration, httpUtil, logger, configuration.GetValue<string>("RessourceSettings:Survey"), configuration.GetValue<string>("EndPointSettings:SurveyUrlBase"))
{ {
} }
public async Task<List<Survey>> getSurveysAsync(string language) public async Task<List<Survey>> getSurveysAsync(string token)
{ {
try try
{ {
if (!string.IsNullOrEmpty(language)) var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null, token);
url = url + "/" + language;
var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null);
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,15 +28,15 @@ namespace DamageAssesment.Api.SurveyResponses.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 )
return null; return null;
else return survey; else return survey;
} }

View File

@ -6,8 +6,15 @@
} }
}, },
"AllowedHosts": "*", "AllowedHosts": "*",
"JwtSettings": {
"securitykey": "bWlhbWkgZGFkZSBzY2hvb2xzIHNlY3JldCBrZXk="
},
//"ConnectionStrings": {
// "SurveyResponseConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;"
//},
"ConnectionStrings": { "ConnectionStrings": {
"SurveyResponseConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;" "SurveyResponseConnection": "Server=tcp:da-dev.database.windows.net,1433;Initial Catalog=da-dev-db;Encrypt=True;User ID=admin-dev;Password=b3tgRABw8LGE75k;TrustServerCertificate=False;Connection Timeout=30;"
}, },
"EndPointSettings": { "EndPointSettings": {
"AnswerUrlBase": "http://localhost:5200", "AnswerUrlBase": "http://localhost:5200",

View File

@ -1,12 +0,0 @@
using DamageAssesment.Api.SurveyResponses.Models;
namespace DamageAssesment.Api.SurveyResponses.Interfaces
{
public interface IAnswerServiceProvider
{
Task<List<Answer>> getAnswersAsync();
Task<List<Models.Answer>> GetAnswersByResponseIdAsync(int responseId);
Task<Models.Answer> PostAnswersAsync(Models.Answer answer);
}
}

View File

@ -1,10 +0,0 @@
using DamageAssesment.Api.SurveyResponses.Models;
namespace DamageAssesment.Api.SurveyResponses.Interfaces
{
public interface IAttachmentServiceProvider
{
Task<List<Attachment>> getAttachmentsAsync();
Task<IEnumerable<Attachment>> PostAttachmentsAsync(Models.AttachmentInfo attachmentInfo);
}
}

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