diff --git a/DamageAssesmentApi/DamageAssesment.Api.Answers/Controllers/AnswersController.cs b/DamageAssesmentApi/DamageAssesment.Api.Answers/Controllers/AnswersController.cs
index fe225b6..8130de4 100644
--- a/DamageAssesmentApi/DamageAssesment.Api.Answers/Controllers/AnswersController.cs
+++ b/DamageAssesmentApi/DamageAssesment.Api.Answers/Controllers/AnswersController.cs
@@ -1,7 +1,6 @@
using DamageAssesment.Api.Answers.Interfaces;
+using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
-using Microsoft.EntityFrameworkCore;
-using Microsoft.OpenApi.Any;
namespace DamageAssesment.Api.Answers.Controllers
{
@@ -16,7 +15,7 @@ namespace DamageAssesment.Api.Answers.Controllers
///
/// Get all answers
///
-
+ [Authorize(Roles = "admin")]
[HttpGet("answers")]
public async Task GetAnswersAsync() {
@@ -32,7 +31,7 @@ namespace DamageAssesment.Api.Answers.Controllers
/// Get an answer based on answerId.
///
-
+ [Authorize(Roles = "admin")]
[HttpGet("answers/{id}")]
public async Task GetAnswerByIdAsync(int id)
{
@@ -48,6 +47,7 @@ namespace DamageAssesment.Api.Answers.Controllers
///
/// Get all answers based on responseId.
///
+ [Authorize(Roles = "admin")]
[HttpGet("answers/byresponse/{responseid}")]
public async Task GetAnswersByResponseId(int responseid)
{
@@ -61,7 +61,7 @@ namespace DamageAssesment.Api.Answers.Controllers
///
/// Get all answers based on questionId.
///
-
+ [Authorize(Roles = "admin")]
[HttpGet("answers/byquestion/{questionid}")]
public async Task AnswersByQuestionId(int questionid)
{
@@ -75,7 +75,7 @@ namespace DamageAssesment.Api.Answers.Controllers
///
/// Update an existing answer.
///
-
+ [Authorize(Roles = "admin")]
[HttpPut("answers")]
public async Task UpdateAnswer(Models.Answer answer)
{
@@ -96,7 +96,7 @@ namespace DamageAssesment.Api.Answers.Controllers
///
/// Save a new answer.
///
-
+ [Authorize(Roles = "admin")]
[HttpPost("answers")]
public async Task CreateAnswer(Models.Answer answer)
{
@@ -114,7 +114,7 @@ namespace DamageAssesment.Api.Answers.Controllers
///
/// Delete an existing answer.
///
-
+ [Authorize(Roles = "admin")]
[HttpDelete("answers/{id}")]
public async Task DeleteAnswer(int id)
{
diff --git a/DamageAssesmentApi/DamageAssesment.Api.Answers/Program.cs b/DamageAssesmentApi/DamageAssesment.Api.Answers/Program.cs
index 0a38399..77e7544 100644
--- a/DamageAssesmentApi/DamageAssesment.Api.Answers/Program.cs
+++ b/DamageAssesmentApi/DamageAssesment.Api.Answers/Program.cs
@@ -1,23 +1,73 @@
using DamageAssesment.Api.Answers.Db;
using DamageAssesment.Api.Answers.Interfaces;
using DamageAssesment.Api.Answers.Providers;
+using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.EntityFrameworkCore;
+using Microsoft.IdentityModel.Tokens;
+using Microsoft.OpenApi.Models;
using System.Reflection;
+using System.Text;
var builder = WebApplication.CreateBuilder(args);
-
+var authkey = builder.Configuration.GetValue("JwtSettings:securitykey");
+builder.Services.AddAuthentication(item =>
+{
+ item.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
+ item.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
+}).AddJwtBearer(item =>
+{
+ item.RequireHttpsMetadata = true;
+ item.SaveToken = true;
+ item.TokenValidationParameters = new TokenValidationParameters()
+ {
+ ValidateIssuerSigningKey = true,
+ IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(authkey)),
+ ValidateIssuer = false,
+ ValidateAudience = false,
+ ClockSkew = TimeSpan.Zero
+ };
+});
// Add services to the container.
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
//builder.Services.AddSwaggerGen();
-builder.Services.AddSwaggerGen(c =>
+builder.Services.AddSwaggerGen(options =>
{
// Include XML comments from your assembly
var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
- c.IncludeXmlComments(xmlPath);
+ options.IncludeXmlComments(xmlPath);
+
+ OpenApiSecurityScheme securityDefinition = new OpenApiSecurityScheme()
+ {
+ Name = "Bearer",
+ BearerFormat = "JWT",
+ Scheme = "bearer",
+ Description = "Specify the authorization token.",
+ In = ParameterLocation.Header,
+ Type = SecuritySchemeType.Http,
+ };
+
+ options.AddSecurityDefinition("jwt_auth", securityDefinition);
+
+ // Make sure swagger UI requires a Bearer token specified
+ OpenApiSecurityScheme securityScheme = new OpenApiSecurityScheme()
+ {
+ Reference = new OpenApiReference()
+ {
+ Id = "jwt_auth",
+ Type = ReferenceType.SecurityScheme
+ }
+ };
+
+ OpenApiSecurityRequirement securityRequirements = new OpenApiSecurityRequirement()
+ {
+ {securityScheme, new string[] { }},
+ };
+
+ options.AddSecurityRequirement(securityRequirements);
});
builder.Services.AddScoped();
builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies()); //4/30
@@ -35,7 +85,7 @@ if (app.Environment.IsDevelopment())
app.UseSwagger();
app.UseSwaggerUI();
}
-
+app.UseAuthentication();
app.UseAuthorization();
app.MapControllers();
diff --git a/DamageAssesmentApi/DamageAssesment.Api.Answers/appsettings.json b/DamageAssesmentApi/DamageAssesment.Api.Answers/appsettings.json
index fbe7ccb..cc56e87 100644
--- a/DamageAssesmentApi/DamageAssesment.Api.Answers/appsettings.json
+++ b/DamageAssesmentApi/DamageAssesment.Api.Answers/appsettings.json
@@ -11,8 +11,7 @@
"AllowedHosts": "*",
"ConnectionStrings": {
//"AnswerConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;"
- // "AnswerConnection": "Server=localhost,1433;Database=da_survey_dev;User Id=sa;Password=Password123;TrustServerCertificate=True;",
- "AnswerConnection": "Server=207.180.248.35;Database=da_survey_dev;User Id=sa;Password=YourStrongPassw0rd;TrustServerCertificate=True;"
+ "AnswerConnection": "Server=tcp:da-dev.database.windows.net,1433;Initial Catalog=da-dev-db;Encrypt=True;User ID=admin-dev;Password=b3tgRABw8LGE75k;TrustServerCertificate=False;Connection Timeout=30;"
}
}
diff --git a/DamageAssesmentApi/DamageAssesment.Api.Attachments.Test/AttachmentsServiceTest.cs b/DamageAssesmentApi/DamageAssesment.Api.Attachments.Test/AttachmentsServiceTest.cs
index 1b3ff31..1e67133 100644
--- a/DamageAssesmentApi/DamageAssesment.Api.Attachments.Test/AttachmentsServiceTest.cs
+++ b/DamageAssesmentApi/DamageAssesment.Api.Attachments.Test/AttachmentsServiceTest.cs
@@ -20,7 +20,7 @@ namespace DamageAssesment.Api.Attachments.Test
public async Task GetAttachmentsAsync_ShouldReturnStatusCode200()
{
var mockAttachmentService = new Mock();
- var mockUploadService = new Mock();
+ var mockUploadService = new Mock();
var mockResponse = await MockData.getOkResponse();
mockAttachmentService.Setup(service => service.GetAttachmentsAsync()).ReturnsAsync(mockResponse);
var AttachmentProvider = new AttachmentsController(mockAttachmentService.Object, mockUploadService.Object);
@@ -33,7 +33,7 @@ namespace DamageAssesment.Api.Attachments.Test
public async Task GetAttachmentsAsync_ShouldReturnStatusCode204()
{
var mockAttachmentService = new Mock();
- var mockUploadService = new Mock();
+ var mockUploadService = new Mock();
var mockResponse = await MockData.getNoContentResponse();
mockAttachmentService.Setup(service => service.GetAttachmentsAsync()).ReturnsAsync(mockResponse);
@@ -47,7 +47,7 @@ namespace DamageAssesment.Api.Attachments.Test
public async Task GetAttachmentAsync_ShouldReturnStatusCode200()
{
var mockAttachmentService = new Mock();
- var mockUploadService = new Mock();
+ var mockUploadService = new Mock();
var mockResponse = await MockData.getOkResponse(1);
mockAttachmentService.Setup(service => service.GetAttachmentByIdAsync(1)).ReturnsAsync(mockResponse);
@@ -61,7 +61,7 @@ namespace DamageAssesment.Api.Attachments.Test
public async Task GetAttachmentAsync_ShouldReturnStatusCode404()
{
var mockAttachmentService = new Mock();
- var mockUploadService = new Mock();
+ var mockUploadService = new Mock();
var mockResponse = await MockData.getNotFoundResponse();
mockAttachmentService.Setup(service => service.GetAttachmentByIdAsync(99)).ReturnsAsync(mockResponse);
var AttachmentProvider = new AttachmentsController(mockAttachmentService.Object, mockUploadService.Object);
@@ -73,7 +73,7 @@ namespace DamageAssesment.Api.Attachments.Test
public async Task PostAttachmentAsync_ShouldReturnStatusCode200()
{
var mockAttachmentService = new Mock();
- var mockUploadService = new Mock();
+ var mockUploadService = new Mock();
var mockResponse = await MockData.getOkResponse();
var AttachmentResponse = await MockData.GetAttachmentInfo(0);
var mockInputAttachment = await MockData.getInputAttachmentData();
@@ -89,7 +89,7 @@ namespace DamageAssesment.Api.Attachments.Test
public async Task PostAttachmentAsync_ShouldReturnStatusCode400()
{
var mockAttachmentService = new Mock();
- var mockUploadService = new Mock();
+ var mockUploadService = new Mock();
var mockInputAttachment = await MockData.getInputAttachmentData();
var mockResponse = await MockData.getBadRequestResponse();
mockAttachmentService.Setup(service => service.PostAttachmentAsync(mockInputAttachment)).ReturnsAsync(mockResponse);
@@ -105,7 +105,7 @@ namespace DamageAssesment.Api.Attachments.Test
public async Task PutAttachmentAsync_ShouldReturnStatusCode200()
{
var mockAttachmentService = new Mock();
- var mockUploadService = new Mock();
+ var mockUploadService = new Mock();
var mockResponse = await MockData.getOkResponse();
var AttachmentResponse = await MockData.GetAttachmentInfo(1);
var mockInputAttachment = await MockData.getInputAttachmentData();
@@ -121,7 +121,7 @@ namespace DamageAssesment.Api.Attachments.Test
public async Task PutAttachmentAsync_ShouldReturnStatusCode400()
{
var mockAttachmentService = new Mock();
- var mockUploadService = new Mock();
+ var mockUploadService = new Mock();
var mockInputAttachment = await MockData.getInputAttachmentData();
var mockResponse = await MockData.getBadRequestResponse();
mockAttachmentService.Setup(service => service.PostAttachmentAsync(mockInputAttachment)).ReturnsAsync(mockResponse);
@@ -136,7 +136,7 @@ namespace DamageAssesment.Api.Attachments.Test
public async Task DeleteAttachmentAsync_ShouldReturnStatusCode200()
{
var mockAttachmentService = new Mock();
- var mockUploadService = new Mock();
+ var mockUploadService = new Mock();
var mockResponse = await MockData.getOkResponse(1);
mockAttachmentService.Setup(service => service.DeleteAttachmentAsync(1)).ReturnsAsync(mockResponse);
mockUploadService.Setup(service => service.Deletefile(""));
@@ -150,7 +150,7 @@ namespace DamageAssesment.Api.Attachments.Test
public async Task DeleteAttachmentAsync_ShouldReturnStatusCode404()
{
var mockAttachmentService = new Mock();
- var mockUploadService = new Mock();
+ var mockUploadService = new Mock();
var mockResponse = await MockData.getNotFoundResponse();
mockAttachmentService.Setup(service => service.DeleteAttachmentAsync(1)).ReturnsAsync(mockResponse);
var AttachmentProvider = new AttachmentsController(mockAttachmentService.Object, mockUploadService.Object);
diff --git a/DamageAssesmentApi/DamageAssesment.Api.Attachments/Controllers/AttachmentsController.cs b/DamageAssesmentApi/DamageAssesment.Api.Attachments/Controllers/AttachmentsController.cs
index 16c223c..849d2a4 100644
--- a/DamageAssesmentApi/DamageAssesment.Api.Attachments/Controllers/AttachmentsController.cs
+++ b/DamageAssesmentApi/DamageAssesment.Api.Attachments/Controllers/AttachmentsController.cs
@@ -1,6 +1,7 @@
using Azure;
using DamageAssesment.Api.Attachments.Interfaces;
using DamageAssesment.Api.Attachments.Models;
+using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System.Net.Http.Headers;
@@ -12,16 +13,17 @@ namespace DamageAssesment.Api.Attachments.Controllers
{
private IAttachmentsProvider AttachmentProvider;
private IUploadService UploadService;
+ private IAzureBlobService azureBlobService;
- public AttachmentsController(IAttachmentsProvider AttachmentsProvider, IUploadService uploadService)
+ public AttachmentsController(IAttachmentsProvider AttachmentsProvider, IAzureBlobService azureBlobService)
{
this.AttachmentProvider = AttachmentsProvider;
- this.UploadService = uploadService;
+ this.azureBlobService = azureBlobService;
}
///
/// Get all attachments.
///
-
+ [Authorize(Roles = "admin")]
[HttpGet("attachments")]
public async Task GetAttachmentsAsync()
{
@@ -37,6 +39,7 @@ namespace DamageAssesment.Api.Attachments.Controllers
///
/// Get all attachments by attachmentId.
///
+ [Authorize(Roles = "admin")]
[HttpGet("attachments/{id}")]
public async Task GetAttachmentbyIdAsync(int id)
{
@@ -80,7 +83,7 @@ namespace DamageAssesment.Api.Attachments.Controllers
///
/// Save new Attachment(s)
///
-
+ [Authorize(Roles = "admin")]
[HttpPost("attachments"), DisableRequestSizeLimit]
public async Task UploadAttachmentAsync(AttachmentInfo attachmentInfo)
{
@@ -89,7 +92,7 @@ namespace DamageAssesment.Api.Attachments.Controllers
if (attachmentInfo.Answers.Count > 0)
{
var Attachments = await this.AttachmentProvider.GetAttachmentCounter();
- List attachments = UploadService.UploadAttachment(attachmentInfo.ResponseId, Attachments.counter, attachmentInfo.Answers);
+ List attachments = await azureBlobService.UploadAttachment(attachmentInfo.ResponseId, Attachments.counter, attachmentInfo.Answers);
var result = await this.AttachmentProvider.PostAttachmentAsync(attachments);
if (result.IsSuccess)
{
@@ -107,7 +110,7 @@ namespace DamageAssesment.Api.Attachments.Controllers
///
/// Modify an new attachment.
///
-
+ [Authorize(Roles = "admin")]
[HttpPut("attachments"), DisableRequestSizeLimit]
public async Task UpdateAttachmentAsync(AttachmentInfo attachmentInfo)
{
@@ -118,7 +121,7 @@ namespace DamageAssesment.Api.Attachments.Controllers
var res = await this.AttachmentProvider.GetAttachmentInfo(attachmentInfo.Answers);
if (res.IsSuccess)
{
- List attachments = UploadService.UpdateAttachments(attachmentInfo.ResponseId, attachmentInfo.Answers, res.Attachments);
+ List attachments = await azureBlobService.UpdateAttachments(attachmentInfo.ResponseId, attachmentInfo.Answers, res.Attachments);
var result = await this.AttachmentProvider.PutAttachmentAsync(attachments);
if (result.IsSuccess)
{
@@ -138,6 +141,7 @@ namespace DamageAssesment.Api.Attachments.Controllers
///
/// Delete an existing attachment.
///
+ [Authorize(Roles = "admin")]
[HttpDelete("attachments/{id}")]
public async Task DeleteAttachment(int id)
{
@@ -146,7 +150,7 @@ namespace DamageAssesment.Api.Attachments.Controllers
if (result.IsSuccess)
{
// deleting file from folder
- UploadService.Movefile(result.Attachment.URI);
+ azureBlobService.Movefile(result.Attachment.URI);
return Ok(result.Attachment);
}
return NotFound();
diff --git a/DamageAssesmentApi/DamageAssesment.Api.Attachments/Interfaces/IAzureBlobService.cs b/DamageAssesmentApi/DamageAssesment.Api.Attachments/Interfaces/IAzureBlobService.cs
index f15ed9e..39e892d 100644
--- a/DamageAssesmentApi/DamageAssesment.Api.Attachments/Interfaces/IAzureBlobService.cs
+++ b/DamageAssesmentApi/DamageAssesment.Api.Attachments/Interfaces/IAzureBlobService.cs
@@ -1,10 +1,15 @@
using Azure.Storage.Blobs.Models;
+using DamageAssesment.Api.Attachments.Models;
namespace DamageAssesment.Api.Attachments.Interfaces
{
public interface IAzureBlobService
{
Task>> UploadFiles(List files);
- void DeleteFile(string path);
+ Task> UploadAttachment(int responseId, int answerId, int counter, List postedFile);
+ Task> UploadAttachment(int responseId, int counter, List answers);
+ Task> UpdateAttachments(int responseId, List answers, IEnumerable attachments);
+ void Deletefile(string path);
+ void Movefile(string path);
}
}
diff --git a/DamageAssesmentApi/DamageAssesment.Api.Attachments/Program.cs b/DamageAssesmentApi/DamageAssesment.Api.Attachments/Program.cs
index 4fd2e59..62cf0cb 100644
--- a/DamageAssesmentApi/DamageAssesment.Api.Attachments/Program.cs
+++ b/DamageAssesmentApi/DamageAssesment.Api.Attachments/Program.cs
@@ -1,25 +1,75 @@
using DamageAssesment.Api.Attachments.Db;
using DamageAssesment.Api.Attachments.Interfaces;
using DamageAssesment.Api.Attachments.Providers;
+using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Http.Features;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.FileProviders;
+using Microsoft.IdentityModel.Tokens;
+using Microsoft.OpenApi.Models;
using System.Reflection;
+using System.Text;
var builder = WebApplication.CreateBuilder(args);
-
+var authkey = builder.Configuration.GetValue("JwtSettings:securitykey");
+builder.Services.AddAuthentication(item =>
+{
+ item.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
+ item.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
+}).AddJwtBearer(item =>
+{
+ item.RequireHttpsMetadata = true;
+ item.SaveToken = true;
+ item.TokenValidationParameters = new TokenValidationParameters()
+ {
+ ValidateIssuerSigningKey = true,
+ IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(authkey)),
+ ValidateIssuer = false,
+ ValidateAudience = false,
+ ClockSkew = TimeSpan.Zero
+ };
+});
// Add services to the container.
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
//builder.Services.AddSwaggerGen();
-builder.Services.AddSwaggerGen(c =>
+builder.Services.AddSwaggerGen(options =>
{
// Include XML comments from your assembly
var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
- c.IncludeXmlComments(xmlPath);
+ options.IncludeXmlComments(xmlPath);
+
+ OpenApiSecurityScheme securityDefinition = new OpenApiSecurityScheme()
+ {
+ Name = "Bearer",
+ BearerFormat = "JWT",
+ Scheme = "bearer",
+ Description = "Specify the authorization token.",
+ In = ParameterLocation.Header,
+ Type = SecuritySchemeType.Http,
+ };
+
+ options.AddSecurityDefinition("jwt_auth", securityDefinition);
+
+ // Make sure swagger UI requires a Bearer token specified
+ OpenApiSecurityScheme securityScheme = new OpenApiSecurityScheme()
+ {
+ Reference = new OpenApiReference()
+ {
+ Id = "jwt_auth",
+ Type = ReferenceType.SecurityScheme
+ }
+ };
+
+ OpenApiSecurityRequirement securityRequirements = new OpenApiSecurityRequirement()
+ {
+ {securityScheme, new string[] { }},
+ };
+
+ options.AddSecurityRequirement(securityRequirements);
});
builder.Services.AddScoped();
builder.Services.AddScoped();
@@ -45,6 +95,7 @@ if (app.Environment.IsDevelopment())
app.UseSwaggerUI();
}
+app.UseAuthentication();
app.UseAuthorization();
app.UseHttpsRedirection();
diff --git a/DamageAssesmentApi/DamageAssesment.Api.Attachments/Providers/AzureBlobService.cs b/DamageAssesmentApi/DamageAssesment.Api.Attachments/Providers/AzureBlobService.cs
index 4e30b42..2cb4558 100644
--- a/DamageAssesmentApi/DamageAssesment.Api.Attachments/Providers/AzureBlobService.cs
+++ b/DamageAssesmentApi/DamageAssesment.Api.Attachments/Providers/AzureBlobService.cs
@@ -3,6 +3,9 @@ using Azure.Storage.Blobs;
using Azure.Storage.Blobs.Models;
using Azure.Storage.Blobs.Specialized;
using DamageAssesment.Api.Attachments.Interfaces;
+using DamageAssesment.Api.Attachments.Models;
+using System.Diagnostics.Metrics;
+using System.Text;
namespace DamageAssesment.Api.Attachments.Providers
{
@@ -10,11 +13,95 @@ namespace DamageAssesment.Api.Attachments.Providers
{
BlobServiceClient _blobClient;
BlobContainerClient _containerClient;
- string azureConnectionString = "";
- public AzureBlobService()
+ string azureConnectionString;
+ private string uploadpath = "";
+ private string Deletepath = "";
+ public AzureBlobService(IConfiguration configuration)
{
- _blobClient = new BlobServiceClient(azureConnectionString);
- _containerClient = _blobClient.GetBlobContainerClient("apiimages");
+ uploadpath = configuration.GetValue("Fileupload:folderpath");
+ Deletepath = configuration.GetValue("Fileupload:Deletepath");
+ _blobClient = new BlobServiceClient(configuration.GetValue("Fileupload:BlobConnectionString"));
+ _containerClient = _blobClient.GetBlobContainerClient(configuration.GetValue("Fileupload:BlobContainerName"));
+ }
+ public async Task> UploadAttachment(int responseId, int answerId, int counter, List postedFile)
+ {
+ var pathToSave = Path.Combine(uploadpath, "Response-" + responseId);
+ String fullDirectoryPath = Path.Combine(pathToSave, "Answer-" + answerId);
+ List attachments = new List();
+ foreach (IFormFile item in postedFile)
+ {
+
+ counter++;
+ var UserfileName = Path.GetFileName(item.FileName);
+ var extension = System.IO.Path.GetExtension(UserfileName);
+ var fileName = String.Format("Attachment_{0}{1}", counter, extension);
+ var stream = item.OpenReadStream();
+ BlobClient client = _containerClient.GetBlobClient(fullDirectoryPath + "/" + fileName);
+ string dbPath = fullDirectoryPath + "/" + fileName;
+ var result = await client.UploadAsync(stream, true);
+ attachments.Add(new Models.Attachment { AnswerId = answerId, ResponseId = responseId, IsDeleted = false, FileName = UserfileName, URI = dbPath });
+ }
+ return attachments;
+ }
+ public async Task> UploadAttachment(int responseId, int counter, List answers)
+ {
+ List attachments = new List();
+ try
+ {
+ foreach (var item in answers)
+ {
+ int answerId = item.AnswerId;
+ var pathToSave = Path.Combine(uploadpath, "Response-" + responseId);
+ String fullDirectoryPath = Path.Combine(pathToSave, "Answer-" + answerId);
+ foreach (var file in item.postedFiles)
+ {
+ counter++;
+
+ var UserfileName = Path.GetFileName(file.FileName);
+ var fileName = String.Format("Attachment_{0}{1}", counter, file.FileExtension);
+ byte[] byteArray = Convert.FromBase64String(file.FileContent);
+ MemoryStream stream = new MemoryStream(byteArray);
+ BlobClient client = _containerClient.GetBlobClient(fullDirectoryPath + "/" + fileName);
+ string dbPath = fullDirectoryPath + "/" + fileName;
+ var result = await client.UploadAsync(stream, true);
+ attachments.Add(new Models.Attachment { AnswerId = answerId, ResponseId = responseId, IsDeleted = false, FileName = UserfileName, URI = dbPath });
+ }
+ }
+ return attachments;
+ }
+ catch (Exception ex)
+ {
+ return new List();
+ }
+
+
+ }
+ public async Task> UpdateAttachments(int responseId, List answers, IEnumerable attachments)
+ {
+ List Dbattachments = new List();
+ foreach (Models.Attachment searchFile in attachments)
+ {
+ Movefile(searchFile.URI);
+ }
+ foreach (var item in answers)
+ {
+ int answerId = item.AnswerId;
+ var pathToSave = Path.Combine(uploadpath, "Response-" + responseId);
+ String fullDirectoryPath = Path.Combine(pathToSave, "Answer-" + answerId);
+ foreach (var file in item.postedFiles)
+ {
+ Models.Attachment attachment = attachments.Where(a => a.Id == file.AttachmentId).FirstOrDefault();
+ var UserfileName = Path.GetFileName(file.FileName);
+ var fileName = String.Format("Attachment_{0}{1}", attachment?.Id, file.FileExtension);
+ byte[] byteArray = Convert.FromBase64String(file.FileContent);
+ MemoryStream stream = new MemoryStream(byteArray);
+ BlobClient client = _containerClient.GetBlobClient(fullDirectoryPath + "/" + fileName);
+ string dbPath = fullDirectoryPath + "/" + fileName;
+ var result = await client.UploadAsync(stream, true);
+ Dbattachments.Add(new Models.Attachment { Id = attachment.Id, AnswerId = answerId, ResponseId = responseId, IsDeleted = false, FileName = UserfileName, URI = dbPath });
+ }
+ }
+ return Dbattachments;
}
public async Task>> UploadFiles(List files)
@@ -35,10 +122,52 @@ namespace DamageAssesment.Api.Attachments.Providers
return azureResponse;
}
- public void DeleteFile(string url)
+ public string getMovefilename(string movefilename)
{
- var blob = _containerClient.GetBlockBlobClient(url);
- blob.DeleteIfExists();
+ var list = movefilename.Split('.');
+ if (list.Length > 0)
+ list[list.Length - 1] = DateTime.Now.ToShortDateString().Replace("/", "_") + "_" + DateTime.Now.ToShortTimeString().Replace("/", "_") + "." + list[list.Length - 1];
+ return string.Join("_", list);
+ }
+ public void Movefile(string path)
+ {
+ try
+ {
+ if (path != "")
+ {
+ string MovePath = getMovefilename(path.Replace(uploadpath, Deletepath));
+ // Get references to the source and destination blobs
+ BlobClient sourceBlobClient = _containerClient.GetBlobClient(path);
+ BlobClient destinationBlobClient = _containerClient.GetBlobClient(MovePath);
+ // Start the copy operation from the source to the destination
+ destinationBlobClient.StartCopyFromUri(sourceBlobClient.Uri);
+
+ // Check if the copy operation completed successfully
+ WaitForCopyToComplete(destinationBlobClient);
+
+ // Delete the source blob after a successful copy
+ sourceBlobClient.DeleteIfExists();
+ }
+ }
+ catch (Exception ex)
+ {
+
+ }
+ }
+ static void WaitForCopyToComplete(BlobClient blobClient)
+ {
+ BlobProperties properties = blobClient.GetProperties();
+
+ while (properties.CopyStatus == CopyStatus.Pending)
+ {
+ Task.Delay(TimeSpan.FromSeconds(1));
+ properties = blobClient.GetProperties();
+ }
+ }
+ public void Deletefile(string url)
+ {
+ BlobClient sourceBlobClient = _containerClient.GetBlobClient(url);
+ sourceBlobClient.DeleteIfExists();
}
}
}
\ No newline at end of file
diff --git a/DamageAssesmentApi/DamageAssesment.Api.Attachments/appsettings.json b/DamageAssesmentApi/DamageAssesment.Api.Attachments/appsettings.json
index c894752..1d6b39f 100644
--- a/DamageAssesmentApi/DamageAssesment.Api.Attachments/appsettings.json
+++ b/DamageAssesmentApi/DamageAssesment.Api.Attachments/appsettings.json
@@ -11,12 +11,14 @@
"AllowedHosts": "*",
"Fileupload": {
"folderpath": "DMS_Attachments/Active",
- "Deletepath": "DMS_Attachments/Deleted"
+ "Deletepath": "DMS_Attachments/Deleted",
+ "BlobConnectionString": "DefaultEndpointsProtocol=https;AccountName=damagedoculink;AccountKey=blynpwrAQtthEneXC5f4vFewJ3tPV+QZUt1AX3nefZScPPjkr5hMoC18B9ni6/ZYdhRiERPQw+hB+AStonf+iw==;EndpointSuffix=core.windows.net",
+ "BlobContainerName": "doculinks"
},
"ConnectionStrings": {
//"AttachmentConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;"
- // "AttachmentConnection": "Server=localhost,1433;Database=da_survey_dev;User Id=sa;Password=Password123;TrustServerCertificate=True;"
- "AttachmentConnection": "Server=207.180.248.35;Database=da_survey_dev;User Id=sa;Password=YourStrongPassw0rd;TrustServerCertificate=True;"
+ "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;"
+
}
}
\ No newline at end of file
diff --git a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks.Test/DoculinkServiceTest.cs b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks.Test/DoculinkServiceTest.cs
index 14ddaaa..299a162 100644
--- a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks.Test/DoculinkServiceTest.cs
+++ b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks.Test/DoculinkServiceTest.cs
@@ -15,9 +15,9 @@ namespace DamageAssesment.Api.DocuLinks.Test
public async Task GetDocumentsLanguageAsync_ShouldReturnStatusCode204()
{
var mockDocumentService = new Mock();
- var mockUploadService = new Mock();
+ var mockUploadService = new Mock();
var mockResponse = await MockData.getNoContentResponses();
- mockDocumentService.Setup(service => service.GetdocumentsByLinkAsync("forms","en",null)).ReturnsAsync(mockResponse);
+ mockDocumentService.Setup(service => service.GetdocumentsByLinkAsync("forms", "en", null)).ReturnsAsync(mockResponse);
var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object);
var result = (NoContentResult)await DocumentProvider.GetDocumentsAsync("", "", null);
@@ -29,7 +29,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
public async Task GetDocumentsLinkTypeAsync_ShouldReturnStatusCode204()
{
var mockDocumentService = new Mock();
- var mockUploadService = new Mock();
+ var mockUploadService = new Mock();
var mockResponse = await MockData.getNoContentResponses();
mockDocumentService.Setup(service => service.GetdocumentsByLinkAsync("forms", "en", true)).ReturnsAsync(mockResponse);
@@ -42,12 +42,12 @@ namespace DamageAssesment.Api.DocuLinks.Test
public async Task GetDocumentsAsync_ShouldReturnStatusCode200()
{
var mockDocumentService = new Mock();
- var mockUploadService = new Mock();
+ var mockUploadService = new Mock();
var mockResponse = await MockData.getOkResponses();
- mockDocumentService.Setup(service => service.GetdocumentsByLinkAsync("forms","en", null)).ReturnsAsync(mockResponse);
+ mockDocumentService.Setup(service => service.GetdocumentsByLinkAsync("forms", "en", null)).ReturnsAsync(mockResponse);
var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object);
- var result = (OkObjectResult)await DocumentProvider.GetDocumentsAsync("forms","en", null);
+ var result = (OkObjectResult)await DocumentProvider.GetDocumentsAsync("forms", "en", null);
Assert.Equal(200, result.StatusCode);
}
@@ -55,7 +55,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
public async Task GetActiveDocumentsAsync_ShouldReturnStatusCode200()
{
var mockDocumentService = new Mock();
- var mockUploadService = new Mock();
+ var mockUploadService = new Mock();
var mockResponse = await MockData.getOkResponses();
mockDocumentService.Setup(service => service.GetdocumentsByLinkAsync("forms", "en", true)).ReturnsAsync(mockResponse);
@@ -69,7 +69,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
public async Task GetActiveDocumentsLinkTypeIdAsync_ShouldReturnStatusCode200()
{
var mockDocumentService = new Mock();
- var mockUploadService = new Mock();
+ var mockUploadService = new Mock();
var mockResponse = await MockData.getOkResponses();
mockDocumentService.Setup(service => service.GetdocumentsByLinkTypeIdAsync(null, "en", true)).ReturnsAsync(mockResponse);
@@ -82,7 +82,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
public async Task GetDocumentsLinkTypeIdAsync_ShouldReturnStatusCode204()
{
var mockDocumentService = new Mock();
- var mockUploadService = new Mock();
+ var mockUploadService = new Mock();
var mockResponse = await MockData.getNoContentResponses();
mockDocumentService.Setup(service => service.GetdocumentsByLinkTypeIdAsync(null, "en", true)).ReturnsAsync(mockResponse);
@@ -95,9 +95,9 @@ namespace DamageAssesment.Api.DocuLinks.Test
public async Task GetDocumentAsync_ShouldReturnStatusCode200()
{
var mockDocumentService = new Mock();
- var mockUploadService = new Mock();
+ var mockUploadService = new Mock();
var mockResponse = await MockData.getOkResponse(1);
- mockDocumentService.Setup(service => service.GetDocumentAsync(1,"forms","en")).ReturnsAsync(mockResponse);
+ mockDocumentService.Setup(service => service.GetDocumentAsync(1, "forms", "en")).ReturnsAsync(mockResponse);
var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object);
var result = (OkObjectResult)await DocumentProvider.GetDocumentAsync(1, "forms", "en");
@@ -109,7 +109,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
public async Task GetDocumentAsync_ShouldReturnStatusCode404()
{
var mockDocumentService = new Mock();
- var mockUploadService = new Mock();
+ var mockUploadService = new Mock();
var mockResponse = await MockData.getNotFoundResponse();
mockDocumentService.Setup(service => service.GetDocumentAsync(99, "forms", "en")).ReturnsAsync(mockResponse);
var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object);
@@ -120,7 +120,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
public async Task PostDocumentAsync_ShouldReturnStatusCode200()
{
var mockDocumentService = new Mock();
- var mockUploadService = new Mock();
+ var mockUploadService = new Mock();
var mockResponse = await MockData.getOkResponse(1);
var mockInputDocument = await MockData.getInputDocumentData();
var DocumentResponse = await MockData.GetDocuLinksInfo(0);
@@ -135,7 +135,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
public async Task PostDocumentAsync_ShouldReturnStatusCode400()
{
var mockDocumentService = new Mock();
- var mockUploadService = new Mock();
+ var mockUploadService = new Mock();
var mockInputDocument = await MockData.getInputDocumentData();
var mockResponse = await MockData.getBadRequestResponse();
ReqDoculink documentInfo = null;
@@ -150,13 +150,13 @@ namespace DamageAssesment.Api.DocuLinks.Test
public async Task PutDocumentAsync_ShouldReturnStatusCode200()
{
var mockDocumentService = new Mock();
- var mockUploadService = new Mock();
+ var mockUploadService = new Mock();
var mockResponse = await MockData.getOkResponse(1);
var mockInputDocument = await MockData.getInputDocumentData();
var DocumentResponse = await MockData.GetDocuLinksInfo(1);
- mockDocumentService.Setup(service => service.UpdateDocumentAsync(1,mockInputDocument)).ReturnsAsync(mockResponse);
+ mockDocumentService.Setup(service => service.UpdateDocumentAsync(1, mockInputDocument)).ReturnsAsync(mockResponse);
var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object);
- var result = (NotFoundResult)await DocumentProvider.UpdateDocument(1,DocumentResponse);
+ var result = (NotFoundResult)await DocumentProvider.UpdateDocument(1, DocumentResponse);
Assert.Equal(404, result.StatusCode);
}
@@ -165,12 +165,12 @@ namespace DamageAssesment.Api.DocuLinks.Test
public async Task PutDocumentAsync_ShouldReturnStatusCode400()
{
var mockDocumentService = new Mock();
- var mockUploadService = new Mock();
+ var mockUploadService = new Mock();
var mockResponse = await MockData.getBadRequestResponse();
var mockInputDocument = await MockData.getInputDocumentData();
- mockDocumentService.Setup(service => service.UpdateDocumentAsync(99,mockInputDocument)).ReturnsAsync(mockResponse);
+ mockDocumentService.Setup(service => service.UpdateDocumentAsync(99, mockInputDocument)).ReturnsAsync(mockResponse);
var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object);
- var result = (BadRequestObjectResult)await DocumentProvider.UpdateDocument(99,null);
+ var result = (BadRequestObjectResult)await DocumentProvider.UpdateDocument(99, null);
Assert.Equal(400, result.StatusCode);
}
@@ -178,7 +178,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
public async Task DeleteDocumentAsync_ShouldReturnStatusCode200()
{
var mockDocumentService = new Mock();
- var mockUploadService = new Mock();
+ var mockUploadService = new Mock();
var mockResponse = await MockData.getOkResponse(1);
mockDocumentService.Setup(service => service.DeleteDocumentAsync(1)).ReturnsAsync(mockResponse);
var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object);
@@ -190,7 +190,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
public async Task DeleteDocumentAsync_ShouldReturnStatusCode404()
{
var mockDocumentService = new Mock();
- var mockUploadService = new Mock();
+ var mockUploadService = new Mock();
var mockResponse = await MockData.getNotFoundResponse();
mockDocumentService.Setup(service => service.DeleteDocumentAsync(1)).ReturnsAsync(mockResponse);
var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object);
@@ -206,7 +206,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
public async Task GetDocumentCategoriesAsync_ShouldReturnStatusCode200()
{
var mockDocumentService = new Mock();
- var mockUploadService = new Mock();
+ var mockUploadService = new Mock();
var mockResponse = await LinkTypeMockData.getOkResponse();
mockDocumentService.Setup(service => service.GetLinkTypesAsync("en")).ReturnsAsync(mockResponse);
var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object);
@@ -219,7 +219,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
public async Task GetDocumentCategoriesAsync_ShouldReturnStatusCode204()
{
var mockDocumentService = new Mock();
- var mockUploadService = new Mock();
+ var mockUploadService = new Mock();
var mockResponse = await LinkTypeMockData.getNoContentResponse();
mockDocumentService.Setup(service => service.GetLinkTypesAsync("en")).ReturnsAsync(mockResponse);
@@ -233,9 +233,9 @@ namespace DamageAssesment.Api.DocuLinks.Test
public async Task GetDocumentcategoryAsync_ShouldReturnStatusCode200()
{
var mockDocumentService = new Mock();
- var mockUploadService = new Mock();
+ var mockUploadService = new Mock();
var mockResponse = await LinkTypeMockData.getOkResponse(1);
- mockDocumentService.Setup(service => service.GetLinkTypeAsync(1,"en")).ReturnsAsync(mockResponse);
+ mockDocumentService.Setup(service => service.GetLinkTypeAsync(1, "en")).ReturnsAsync(mockResponse);
var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object);
var result = (OkObjectResult)await DocumentProvider.GetLinkTypeAsync(1, "en");
@@ -246,7 +246,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
public async Task GetDocumentcategoryAsync_ShouldReturnStatusCode404()
{
var mockDocumentService = new Mock();
- var mockUploadService = new Mock();
+ var mockUploadService = new Mock();
var mockResponse = await LinkTypeMockData.getNotFoundResponse();
mockDocumentService.Setup(service => service.GetLinkTypeAsync(99, "en")).ReturnsAsync(mockResponse);
@@ -259,7 +259,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
public async Task PostDocumentcategoryAsync_ShouldReturnStatusCode200()
{
var mockDocumentService = new Mock();
- var mockUploadService = new Mock();
+ var mockUploadService = new Mock();
var mockResponse = await LinkTypeMockData.getOkResponse(1);
var mockInputDocument = await LinkTypeMockData.getInputLinkData(0);
mockDocumentService.Setup(service => service.PostLinkTypeAsync(mockInputDocument)).ReturnsAsync(mockResponse);
@@ -273,7 +273,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
public async Task PostDocumentcategoryAsync_ShouldReturnStatusCode400()
{
var mockDocumentService = new Mock();
- var mockUploadService = new Mock();
+ var mockUploadService = new Mock();
var mockInputDocument = await LinkTypeMockData.getInputLinkData(99);
var mockResponse = await LinkTypeMockData.getBadRequestResponse();
mockDocumentService.Setup(service => service.PostLinkTypeAsync(mockInputDocument)).ReturnsAsync(mockResponse);
@@ -287,12 +287,12 @@ namespace DamageAssesment.Api.DocuLinks.Test
public async Task PutDocumentcategoryAsync_ShouldReturnStatusCode200()
{
var mockDocumentService = new Mock();
- var mockUploadService = new Mock();
+ var mockUploadService = new Mock();
var mockResponse = await LinkTypeMockData.getOkResponse(1);
var mockInputDocument = await LinkTypeMockData.getInputLinkData(1);
- mockDocumentService.Setup(service => service.UpdateLinkTypeAsync(1,mockInputDocument)).ReturnsAsync(mockResponse);
+ mockDocumentService.Setup(service => service.UpdateLinkTypeAsync(1, mockInputDocument)).ReturnsAsync(mockResponse);
var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object);
- var result = (OkObjectResult)await DocumentProvider.UpdateLinkType(1,mockInputDocument);
+ var result = (OkObjectResult)await DocumentProvider.UpdateLinkType(1, mockInputDocument);
Assert.Equal(200, result.StatusCode);
}
@@ -301,12 +301,12 @@ namespace DamageAssesment.Api.DocuLinks.Test
public async Task PutDocumentcategoryAsync_ShouldReturnStatusCode404()
{
var mockDocumentService = new Mock();
- var mockUploadService = new Mock();
+ var mockUploadService = new Mock();
var mockResponse = await LinkTypeMockData.getNotFoundResponse();
var mockInputDocument = await LinkTypeMockData.getInputLinkData(99);
- mockDocumentService.Setup(service => service.UpdateLinkTypeAsync(99,mockInputDocument)).ReturnsAsync(mockResponse);
+ mockDocumentService.Setup(service => service.UpdateLinkTypeAsync(99, mockInputDocument)).ReturnsAsync(mockResponse);
var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object);
- var result = (NotFoundObjectResult)await DocumentProvider.UpdateLinkType(99,mockInputDocument);
+ var result = (NotFoundObjectResult)await DocumentProvider.UpdateLinkType(99, mockInputDocument);
Assert.Equal(404, result.StatusCode);
}
@@ -315,10 +315,10 @@ namespace DamageAssesment.Api.DocuLinks.Test
public async Task PutDocumentcategoryAsync_ShouldReturnStatusCode400()
{
var mockDocumentService = new Mock();
- var mockUploadService = new Mock();
+ var mockUploadService = new Mock();
var mockResponse = await LinkTypeMockData.getBadRequestResponse();
var mockInputDocument = await LinkTypeMockData.getInputLinkData(1);
- mockDocumentService.Setup(service => service.UpdateLinkTypeAsync(1,mockInputDocument)).ReturnsAsync(mockResponse);
+ mockDocumentService.Setup(service => service.UpdateLinkTypeAsync(1, mockInputDocument)).ReturnsAsync(mockResponse);
var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object);
var result = (BadRequestObjectResult)await DocumentProvider.UpdateLinkType(1, mockInputDocument);
@@ -329,7 +329,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
public async Task DeleteDocumentcategoryAsync_ShouldReturnStatusCode200()
{
var mockDocumentService = new Mock();
- var mockUploadService = new Mock();
+ var mockUploadService = new Mock();
var mockResponse = await LinkTypeMockData.getOkResponse(1);
mockDocumentService.Setup(service => service.DeleteLinkTypeAsync(1)).ReturnsAsync(mockResponse);
@@ -342,7 +342,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
public async Task DeleteDocumentcategoryAsync_ShouldReturnStatusCode404()
{
var mockDocumentService = new Mock();
- var mockUploadService = new Mock();
+ var mockUploadService = new Mock();
var mockResponse = await LinkTypeMockData.getNotFoundResponse();
mockDocumentService.Setup(service => service.DeleteLinkTypeAsync(1)).ReturnsAsync(mockResponse);
diff --git a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks.Test/MockData.cs b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks.Test/MockData.cs
index 23ffae4..e5e2d67 100644
--- a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks.Test/MockData.cs
+++ b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks.Test/MockData.cs
@@ -14,25 +14,27 @@ namespace DamageAssesment.Api.DocuLinks.Test
public static async Task<(bool, List, string)> getOkResponses()
{
List list = new List();
-
+
for (int i = 1; i < 4; i++)
{
Dictionary dicttitle = new Dictionary();
- Dictionary dictdesc = new Dictionary();
+ Dictionary dictdesc = new Dictionary();
dicttitle.Add("en", "test"); dicttitle.Add("fr", "tester");
- dictdesc.Add("en", "test"); dictdesc.Add("fr", "tester");
+ dictdesc.Add("en", "test"); dictdesc.Add("fr", "tester");
List DocuLinksTranslations = new List();
DocuLinksTranslations.Add(new DoculinkTranslation()
{
Language = "en",
- title = "tel"+i,
- description = "Sample"+i
+ title = "tel" + i,
+ description = "Sample" + i
});
List doclinksAttachments = new List();
doclinksAttachments.Add(new DoculinkAttachments()
{
- docName = "",Path="www.google.com",
- IsAttachments=false,CustomOrder=1
+ docName = "",
+ Path = "www.google.com",
+ IsAttachments = false,
+ CustomOrder = 1
});
list.Add(new DocuLinks.Models.ResDoculink()
{
@@ -40,10 +42,10 @@ namespace DamageAssesment.Api.DocuLinks.Test
Id = i,
linkTypeId = i,
IsActive = true,
- titles= dicttitle,
- description=dictdesc,
- CustomOrder=i,
- doclinksAttachments= doclinksAttachments
+ titles = dicttitle,
+ description = dictdesc,
+ CustomOrder = i,
+ doclinksAttachments = doclinksAttachments
});
}
List doculinks = list.GroupBy(a => a.linkTypeId).Select(a => new ResDoculinks() { linkTypeId = a.Key, doculinks = a.ToList() }).ToList();
@@ -120,8 +122,8 @@ namespace DamageAssesment.Api.DocuLinks.Test
{
List fileModels = new List();
- fileModels.Add( new FileModel() { FileName = "Sample", FileContent = "c2FtcGxl", FileExtension = ".txt",IsAttachments=true,CustomOrder=1 });
- return new ReqDoculink() { Id=id, linkTypeId = 1, CustomOrder = 1, Files = fileModels };
+ fileModels.Add(new FileModel() { FileName = "Sample", FileContent = "c2FtcGxl", FileExtension = ".txt", IsAttachments = true, CustomOrder = 1 });
+ return new ReqDoculink() { Id = id, linkTypeId = 1, CustomOrder = 1, Files = fileModels };
}
public static async Task getInputDocumentData()
{
@@ -131,7 +133,7 @@ namespace DamageAssesment.Api.DocuLinks.Test
Language = "en",
title = "tel",
description = "Sample"
- });
+ });
List doclinksAttachments = new List();
doclinksAttachments.Add(new DoculinkAttachments()
{
@@ -145,9 +147,9 @@ namespace DamageAssesment.Api.DocuLinks.Test
Id = 1,
linkTypeId = 1,
IsActive = true,
- CustomOrder=1,
+ CustomOrder = 1,
documentsTranslations = DocuLinksTranslations,
- doclinksAttachments= doclinksAttachments
+ doclinksAttachments = doclinksAttachments
};
}
public static async Task> getInputDocuLinksData()
diff --git a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Controllers/DoculinkController.cs b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Controllers/DoculinkController.cs
index 99d00a8..6d07ddb 100644
--- a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Controllers/DoculinkController.cs
+++ b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Controllers/DoculinkController.cs
@@ -2,6 +2,7 @@
using DamageAssesment.Api.DocuLinks.Interfaces;
using DamageAssesment.Api.DocuLinks.Models;
using DamageAssesment.Api.DocuLinks.Providers;
+using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
@@ -12,18 +13,20 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
{
private readonly IDoculinkProvider documentsProvider;
private readonly IUploadService uploadService;
+ private readonly IAzureBlobService azureBlobService;
- public DoculinkController(IDoculinkProvider documentsProvider,IUploadService uploadService)
+ public DoculinkController(IDoculinkProvider documentsProvider, IAzureBlobService azureBlobService)
{
this.documentsProvider = documentsProvider;
- this.uploadService = uploadService;
+ this.azureBlobService = azureBlobService;
}
///
/// Get all Doculink type.
///
[HttpGet]
+ [Authorize(Roles = "admin")]
[Route("doculinks/types")]
[Route("doculinks/types/{language:alpha}")]
public async Task GetLinkTypesAsync(string? language)
@@ -38,6 +41,7 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
///
/// Get a Doculink type by id.
///
+ [Authorize(Roles = "admin")]
[HttpGet]
[Route("doculinks/types/{id}")]
[Route("doculinks/types/{id}/{language:alpha}")]
@@ -53,6 +57,7 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
///
/// Update a existing Doculink type.
///
+ [Authorize(Roles = "admin")]
[HttpPut]
[Route("doculinks/types/{id}")]
public async Task UpdateLinkType(int id,Models.LinkType linkType)
@@ -74,6 +79,7 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
///
/// Create a new Doculink type.
///
+ [Authorize(Roles = "admin")]
[HttpPost]
[Route("doculinks/types")]
public async Task CreateLinkType(Models.LinkType linkType)
@@ -92,6 +98,7 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
///
/// Delete a existing Doculink type by id.
///
+ [Authorize(Roles = "admin")]
[HttpDelete]
[Route("doculinks/types/{id}")]
public async Task DeleteLinkType(int id)
@@ -104,9 +111,10 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
return NotFound();
}
///
- /// Get all Doculink.
+ /// Get all documents.
///
- ///
+
+ [Authorize(Roles = "admin")]
[Route("doculinks")]
[Route("doculinks/{linktype:alpha}")]
[Route("doculinks/{linktype:alpha}/{language:alpha}")]
@@ -154,6 +162,7 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
///
/// Get a Doculink by id.
///
+ [Authorize(Roles = "admin")]
[HttpGet]
[Route("doculinks/{id}")]
[Route("doculinks/{id}/{linktype:alpha}")]
@@ -170,6 +179,7 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
///
/// update existing doclink.
///
+ [Authorize(Roles = "admin")]
[HttpPut]
[Route("doculinks/{id}")]
public async Task UpdateDocument(int id,ReqDoculink documentInfo)
@@ -180,7 +190,7 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
if (dbdoc.IsSuccess)
{
var documents = await this.documentsProvider.GetDocumentCounter();
- Models.Doculink DocuLink= uploadService.UpdateDocuments(documents.counter,dbdoc.Document, documentInfo);
+ Models.Doculink DocuLink= await azureBlobService.UpdateDocuments(documents.counter,dbdoc.Document, documentInfo);
var result = await this.documentsProvider.UpdateDocumentAsync(id, DocuLink);
if (result.IsSuccess)
{
@@ -195,6 +205,7 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
///
/// Create new doclink.
///
+ // [Authorize(Roles = "admin")]
[HttpPost]
[Route("doculinks")]
public async Task CreateDocument(ReqDoculink documentInfo)
@@ -203,8 +214,8 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
{
if (documentInfo != null)
{
- var documents = await this.documentsProvider.GetDocumentCounter();
- Models.Doculink DocuLink= uploadService.UploadDocument(documents.counter, documentInfo);
+ //var documents = await this.documentsProvider.GetDocumentCounter();
+ Models.Doculink DocuLink= await azureBlobService.UploadDocument(1, documentInfo);
var result = await this.documentsProvider.PostDocumentAsync(DocuLink);
if (result.IsSuccess)
{
@@ -222,6 +233,7 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
///
/// Delete Doculink by id.
///
+ [Authorize(Roles = "admin")]
[HttpDelete]
[Route("doculinks/{id}")]
public async Task DeleteDocument(int id)
@@ -233,7 +245,7 @@ namespace DamageAssesment.Api.DocuLinks.Controllers
// deleting file from folder
foreach (var item in result.Document.doclinksAttachments)
{
- uploadService.Movefile(item.Path);
+ azureBlobService.Movefile(item.Path);
}
return Ok(result.Document);
}
diff --git a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/DamageAssesment.Api.DocuLinks.csproj b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/DamageAssesment.Api.DocuLinks.csproj
index 45347ee..7058f27 100644
--- a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/DamageAssesment.Api.DocuLinks.csproj
+++ b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/DamageAssesment.Api.DocuLinks.csproj
@@ -11,7 +11,8 @@
-
+
+
diff --git a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Db/DoculinkDbContext.cs b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Db/DoculinkDbContext.cs
index f24303e..7eeec65 100644
--- a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Db/DoculinkDbContext.cs
+++ b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Db/DoculinkDbContext.cs
@@ -15,7 +15,7 @@ namespace DamageAssesment.Api.DocuLinks.Db
protected override void OnConfiguring(DbContextOptionsBuilder options)
{
// connect to sql server with connection string from app settings
- options.UseSqlServer(_Configuration.GetConnectionString("DoculinConnection"));
+ options.UseSqlServer(_Configuration.GetConnectionString("DoculinkConnection"));
}
public DbSet Documents { get; set; }
public DbSet LinkTypes { get; set; }
diff --git a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Interfaces/IAzureBlobService.cs b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Interfaces/IAzureBlobService.cs
index 844945e..043d8a1 100644
--- a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Interfaces/IAzureBlobService.cs
+++ b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Interfaces/IAzureBlobService.cs
@@ -1,10 +1,14 @@
using Azure.Storage.Blobs.Models;
+using DamageAssesment.Api.DocuLinks.Models;
namespace DamageAssesment.Api.DocuLinks.Interfaces
{
public interface IAzureBlobService
{
Task>> UploadFiles(List files);
+ Task UploadDocument(int counter, ReqDoculink documentInfo);
+ Task UpdateDocuments(int counter, Models.Doculink document, ReqDoculink documentInfo);
void DeleteFile(string path);
+ void Movefile(string path);
}
}
diff --git a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Program.cs b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Program.cs
index f28dd76..cdd5a72 100644
--- a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Program.cs
+++ b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Program.cs
@@ -2,19 +2,69 @@ using DamageAssesment.Api.DocuLinks.Db;
using DamageAssesment.Api.DocuLinks.Interfaces;
using DamageAssesment.Api.DocuLinks.Providers;
using Microsoft.EntityFrameworkCore;
+using Microsoft.AspNetCore.Authentication.JwtBearer;
+using Microsoft.IdentityModel.Tokens;
using System.Reflection;
+using System.Text;
+using Microsoft.OpenApi.Models;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
-
+var authkey = builder.Configuration.GetValue("JwtSettings:securitykey");
+builder.Services.AddAuthentication(item =>
+{
+ item.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
+ item.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
+}).AddJwtBearer(item =>
+{
+ item.RequireHttpsMetadata = true;
+ item.SaveToken = true;
+ item.TokenValidationParameters = new TokenValidationParameters()
+ {
+ ValidateIssuerSigningKey = true,
+ IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(authkey)),
+ ValidateIssuer = false,
+ ValidateAudience = false,
+ ClockSkew = TimeSpan.Zero
+ };
+});
builder.Services.AddControllers();
-builder.Services.AddSwaggerGen(c =>
+builder.Services.AddSwaggerGen(options =>
{
// Include XML comments from your assembly
var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
- c.IncludeXmlComments(xmlPath);
+ options.IncludeXmlComments(xmlPath);
+
+ OpenApiSecurityScheme securityDefinition = new OpenApiSecurityScheme()
+ {
+ Name = "Bearer",
+ BearerFormat = "JWT",
+ Scheme = "bearer",
+ Description = "Specify the authorization token.",
+ In = ParameterLocation.Header,
+ Type = SecuritySchemeType.Http,
+ };
+
+ options.AddSecurityDefinition("jwt_auth", securityDefinition);
+
+ // Make sure swagger UI requires a Bearer token specified
+ OpenApiSecurityScheme securityScheme = new OpenApiSecurityScheme()
+ {
+ Reference = new OpenApiReference()
+ {
+ Id = "jwt_auth",
+ Type = ReferenceType.SecurityScheme
+ }
+ };
+
+ OpenApiSecurityRequirement securityRequirements = new OpenApiSecurityRequirement()
+ {
+ {securityScheme, new string[] { }},
+ };
+
+ options.AddSecurityRequirement(securityRequirements);
});
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
@@ -25,7 +75,7 @@ builder.Services.AddScoped();
builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies()); //4/30
builder.Services.AddDbContext(option =>
{
- option.UseSqlServer("DoculinConnection");
+ option.UseSqlServer("DoculinkConnection");
});
var app = builder.Build();
@@ -36,6 +86,7 @@ if (app.Environment.IsDevelopment())
app.UseSwaggerUI();
}
+app.UseAuthentication();
app.UseAuthorization();
app.MapControllers();
diff --git a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Providers/AzureBlobService.cs b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Providers/AzureBlobService.cs
index bfa2ca4..9931de2 100644
--- a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Providers/AzureBlobService.cs
+++ b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Providers/AzureBlobService.cs
@@ -1,8 +1,17 @@
+using Azure;
using Azure.Storage.Blobs;
using Azure.Storage.Blobs.Models;
using Azure.Storage.Blobs.Specialized;
using DamageAssesment.Api.DocuLinks.Interfaces;
+using DamageAssesment.Api.DocuLinks.Models;
+using Microsoft.AspNetCore.Mvc.Filters;
+using Microsoft.Extensions.Configuration;
+using Microsoft.VisualBasic;
+using System.ComponentModel;
+using System.IO;
+using System.Text;
+using System.Threading.Tasks;
namespace DamageAssesment.Api.DocuLinks.Providers
{
@@ -10,11 +19,111 @@ namespace DamageAssesment.Api.DocuLinks.Providers
{
BlobServiceClient _blobClient;
BlobContainerClient _containerClient;
- string azureConnectionString = "";
- public AzureBlobService()
+ string azureConnectionString;
+ private string uploadpath = "";
+ private string Deletepath = "";
+ public AzureBlobService(IConfiguration configuration)
{
- _blobClient = new BlobServiceClient(azureConnectionString);
- _containerClient = _blobClient.GetBlobContainerClient("apiimages");
+ uploadpath = configuration.GetValue("Fileupload:folderpath");
+ Deletepath = configuration.GetValue("Fileupload:Deletepath");
+ _blobClient = new BlobServiceClient(configuration.GetValue("Fileupload:BlobConnectionString"));
+ _containerClient = _blobClient.GetBlobContainerClient(configuration.GetValue("Fileupload:BlobContainerName"));
+ }
+ public async Task UploadDocument(int counter, ReqDoculink documentInfo)
+ {
+ Models.Doculink Documents = new Models.Doculink();
+ List attachments = new List();
+ try
+ {
+ string path = "", UserfileName = "";
+ if (documentInfo.Files != null)
+ {
+
+ int counter1 = 1;
+ foreach (var item in documentInfo.Files)
+ {
+ if (item.IsAttachments)
+ {
+ UserfileName = Path.GetFileName(item.FileName);
+ var fileName = String.Format("Document_{0}_{1}{2}", counter, counter1, item.FileExtension);
+ byte[] byteArray = Convert.FromBase64String(item.FileContent);
+ MemoryStream stream = new MemoryStream(byteArray);
+ BlobClient client = _containerClient.GetBlobClient(uploadpath + "/" + fileName);
+ var result = await client.UploadAsync(stream, true);
+ path = uploadpath + "/" + fileName;
+ counter1++;
+ }
+ else
+ path = item.url;
+ attachments.Add(new Models.DoculinkAttachments { docName = UserfileName, Path = path, IsAttachments = item.IsAttachments, CustomOrder = item.CustomOrder });
+ }
+ }
+ Documents = new Models.Doculink()
+ {
+ linkTypeId = documentInfo.linkTypeId,
+ documentsTranslations = documentInfo.documentsTranslations,
+ doclinksAttachments = attachments,
+ IsDeleted = false,
+ CustomOrder = documentInfo.CustomOrder,
+ IsActive = true
+ };
+
+ return Documents;
+ }
+ catch (Exception ex)
+ {
+ return new Models.Doculink();
+ }
+
+
+ }
+
+ public async Task UpdateDocuments(int counter, Models.Doculink document, ReqDoculink documentInfo)
+ {
+ try
+ {
+ foreach (var item in document.doclinksAttachments)
+ {
+ Movefile(item.Path);
+ }
+ string path = "", UserfileName = "";
+ List attachments = new List();
+ int counter1 = 1;
+ foreach (var item in documentInfo.Files)
+ {
+ if (item.IsAttachments)
+ {
+ UserfileName = Path.GetFileName(item.FileName);
+ var fileName = String.Format("Document_{0}_{1}{2)", document.Id, counter1, item.FileExtension);
+ byte[] byteArray = Encoding.UTF8.GetBytes(item.FileContent);
+ MemoryStream stream = new MemoryStream(byteArray);
+ BlobClient client = _containerClient.GetBlobClient(uploadpath + "/" + fileName);
+ path = uploadpath + "/" + fileName;
+ var result = await client.UploadAsync(stream, true);
+ counter1++;
+ }
+ else
+ path = item.url;
+ attachments.Add(new Models.DoculinkAttachments { docName = UserfileName, Path = path, IsAttachments = item.IsAttachments, CustomOrder = item.CustomOrder });
+ }
+ Models.Doculink Documents = new Models.Doculink()
+ {
+ Id = documentInfo.Id,
+ linkTypeId = documentInfo.linkTypeId,
+ documentsTranslations = documentInfo.documentsTranslations,
+ IsActive = true,
+ IsDeleted = false,
+ CustomOrder = documentInfo.CustomOrder,
+ doclinksAttachments = attachments
+ };
+
+ return Documents;
+ }
+
+ catch (Exception ex)
+ {
+ return new Models.Doculink();
+ }
}
public async Task>> UploadFiles(List files)
@@ -35,10 +144,52 @@ namespace DamageAssesment.Api.DocuLinks.Providers
return azureResponse;
}
+ public string getMovefilename(string movefilename)
+ {
+ var list = movefilename.Split('.');
+ if (list.Length > 0)
+ list[list.Length - 1] = DateTime.Now.ToShortDateString().Replace("/", "_") +"_"+ DateTime.Now.ToShortTimeString().Replace("/", "_")+"." + list[list.Length - 1];
+ return string.Join("_", list);
+ }
+ public void Movefile(string path)
+ {
+ try
+ {
+ if (path != "")
+ {
+ string MovePath = getMovefilename(path.Replace(uploadpath, Deletepath));
+ // Get references to the source and destination blobs
+ BlobClient sourceBlobClient = _containerClient.GetBlobClient(path);
+ BlobClient destinationBlobClient = _containerClient.GetBlobClient(MovePath);
+ // Start the copy operation from the source to the destination
+ destinationBlobClient.StartCopyFromUri(sourceBlobClient.Uri);
+
+ // Check if the copy operation completed successfully
+ WaitForCopyToComplete(destinationBlobClient);
+
+ // Delete the source blob after a successful copy
+ sourceBlobClient.DeleteIfExists();
+ }
+ }
+ catch(Exception ex)
+ {
+
+ }
+ }
+ static void WaitForCopyToComplete(BlobClient blobClient)
+ {
+ BlobProperties properties = blobClient.GetProperties();
+
+ while (properties.CopyStatus == CopyStatus.Pending)
+ {
+ Task.Delay(TimeSpan.FromSeconds(1));
+ properties = blobClient.GetProperties();
+ }
+ }
public void DeleteFile(string url)
{
- var blob = _containerClient.GetBlockBlobClient(url);
- blob.DeleteIfExists();
+ BlobClient sourceBlobClient = _containerClient.GetBlobClient(url);
+ sourceBlobClient.DeleteIfExists();
}
}
}
\ No newline at end of file
diff --git a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Providers/DoculinkProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Providers/DoculinkProvider.cs
index 371b8b3..15eefa6 100644
--- a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Providers/DoculinkProvider.cs
+++ b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Providers/DoculinkProvider.cs
@@ -21,20 +21,22 @@ namespace DamageAssesment.Api.DocuLinks.Providers
private DoculinkDbContext DocumentDbContext;
private ILogger logger;
private IUploadService uploadservice;
+ private IAzureBlobService azureBlobService;
private IMapper mapper;
- public DoculinkProvider(DoculinkDbContext DocumentDbContext, ILogger logger, IMapper mapper, IUploadService uploadservice)
+ public DoculinkProvider(DoculinkDbContext DocumentDbContext, ILogger logger, IMapper mapper, IUploadService uploadservice, IAzureBlobService azureBlobService)
{
this.DocumentDbContext = DocumentDbContext;
this.logger = logger;
this.mapper = mapper;
this.uploadservice = uploadservice;
- SeedData();
+ this.azureBlobService = azureBlobService;
+ //SeedData();
}
- private void SeedData()
+ private async Task SeedDataAsync()
{
if (!DocumentDbContext.LinkTypes.Any())
{
@@ -76,7 +78,7 @@ namespace DamageAssesment.Api.DocuLinks.Providers
else
fileModel = new FileModel() { url = "www.google" + i + ".com", IsAttachments = false, CustomOrder = 1 };
ReqDoculink documentInfo = new ReqDoculink() { linkTypeId = i, CustomOrder = i, Files = new List() { fileModel } };
- Models.Doculink document = uploadservice.UploadDocument(counter, documentInfo);
+ Models.Doculink document = await azureBlobService.UploadDocument(counter, documentInfo);
DocumentDbContext.Documents.Add(mapper.Map(document));
DocumentDbContext.SaveChanges();
var dbattachments = mapper.Map, List>(document.doclinksAttachments);
diff --git a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Providers/UploadService.cs b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Providers/UploadService.cs
index 807a2e0..0e71850 100644
--- a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Providers/UploadService.cs
+++ b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Providers/UploadService.cs
@@ -80,15 +80,16 @@ namespace DamageAssesment.Api.DocuLinks.Providers
string path = "", UserfileName = "";
List attachments = new List();
+ int counter1 = 1;
foreach (var item in documentInfo.Files)
{
- counter++;
if (item.IsAttachments)
{
UserfileName = Path.GetFileName(item.FileName);
- var fileName = String.Format("Document_{0}{1}", counter, item.FileExtension);
+ var fileName = String.Format("Document_{0}_{1}{2}", document.Id, counter1, item.FileExtension);
path = Path.Combine(fullDirectoryPath, fileName);
File.WriteAllBytes(path, Convert.FromBase64String(item.FileContent));
+ counter1++;
}
else
path = item.url;
diff --git a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/appsettings.json b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/appsettings.json
index a513807..de1c01c 100644
--- a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/appsettings.json
+++ b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/appsettings.json
@@ -1,4 +1,7 @@
{
+ "JwtSettings": {
+ "securitykey": "bWlhbWkgZGFkZSBzY2hvb2xzIHNlY3JldCBrZXk="
+ },
"Logging": {
"LogLevel": {
"Default": "Information",
@@ -7,13 +10,14 @@
},
"AllowedHosts": "*",
"ConnectionStrings": {
- //"DoculinConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;",
- //"DoculinConnection": "Server=localhost,1433;Database=da_survey_dev;User Id=sa;Password=Password123;TrustServerCertificate=True;"
- "DoculinConnection": "Server=207.180.248.35;Database=da_survey_dev;User Id=sa;Password=YourStrongPassw0rd;TrustServerCertificate=True;"
+ //"DoculinkConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;"
+ "DoculinkConnection": "Server=tcp:da-dev.database.windows.net,1433;Initial Catalog=da-dev-db;Encrypt=True;User ID=admin-dev;Password=b3tgRABw8LGE75k;TrustServerCertificate=False;Connection Timeout=30;"
},
"Fileupload": {
"folderpath": "DASA_Documents/Active",
- "Deletepath": "DASA_Documents/Deleted"
+ "Deletepath": "DASA_Documents/Deleted",
+ "BlobConnectionString": "DefaultEndpointsProtocol=https;AccountName=damagedoculink;AccountKey=blynpwrAQtthEneXC5f4vFewJ3tPV+QZUt1AX3nefZScPPjkr5hMoC18B9ni6/ZYdhRiERPQw+hB+AStonf+iw==;EndpointSuffix=core.windows.net",
+ "BlobContainerName": "doculinks"
}
}
diff --git a/DamageAssesmentApi/DamageAssesment.Api.Employees/Controllers/EmployeesController.cs b/DamageAssesmentApi/DamageAssesment.Api.Employees/Controllers/EmployeesController.cs
index 05901c5..f247d17 100644
--- a/DamageAssesmentApi/DamageAssesment.Api.Employees/Controllers/EmployeesController.cs
+++ b/DamageAssesmentApi/DamageAssesment.Api.Employees/Controllers/EmployeesController.cs
@@ -1,4 +1,5 @@
using DamageAssesment.Api.Employees.Interfaces;
+using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
@@ -18,7 +19,7 @@ namespace DamageAssesment.Api.Employees.Controllers
///
/// GET request for retrieving employees.
///
-
+ [Authorize(Roles = "admin")]
[HttpGet("employees")]
public async Task GetEmployeesAsync()
{
@@ -35,7 +36,7 @@ namespace DamageAssesment.Api.Employees.Controllers
///
/// GET request for retrieving an employee by ID.
///
-
+ [Authorize(Roles = "admin")]
[HttpGet("employees/{id}")]
public async Task GetEmployeeByIdAsync(int id)
{
@@ -48,11 +49,12 @@ namespace DamageAssesment.Api.Employees.Controllers
return NotFound();
}
-
+
///
/// PUT request for updating an existing employee.
///
/// The updated employee object.
+ [Authorize(Roles = "admin")]
[HttpPut("employees/{id}")]
public async Task UpdateEmployee(int id, Models.Employee Employee)
{
@@ -75,6 +77,7 @@ namespace DamageAssesment.Api.Employees.Controllers
/// POST request for creating a new employee.
///
/// The employee information for creating a new employee.
+ [Authorize(Roles = "admin")]
[HttpPost("employees")]
public async Task CreateEmployee(Models.Employee Employee)
{
@@ -93,6 +96,7 @@ namespace DamageAssesment.Api.Employees.Controllers
/// DELETE request for deleting an existing employee.
///
/// The ID of the employee to be deleted.
+ [Authorize(Roles = "admin")]
[HttpDelete("employees/{id}")]
public async Task DeleteEmployee(int id)
{
diff --git a/DamageAssesmentApi/DamageAssesment.Api.Employees/Program.cs b/DamageAssesmentApi/DamageAssesment.Api.Employees/Program.cs
index 7d61871..0702b58 100644
--- a/DamageAssesmentApi/DamageAssesment.Api.Employees/Program.cs
+++ b/DamageAssesmentApi/DamageAssesment.Api.Employees/Program.cs
@@ -1,23 +1,74 @@
using DamageAssesment.Api.Employees.Db;
using DamageAssesment.Api.Employees.Interfaces;
using DamageAssesment.Api.Employees.Providers;
+using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.EntityFrameworkCore;
+using Microsoft.IdentityModel.Tokens;
+using Microsoft.OpenApi.Models;
using System.Reflection;
+using System.Text;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
+var authkey = builder.Configuration.GetValue("JwtSettings:securitykey");
+builder.Services.AddAuthentication(item =>
+{
+ item.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
+ item.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
+}).AddJwtBearer(item =>
+{
+ item.RequireHttpsMetadata = true;
+ item.SaveToken = true;
+ item.TokenValidationParameters = new TokenValidationParameters()
+ {
+ ValidateIssuerSigningKey = true,
+ IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(authkey)),
+ ValidateIssuer = false,
+ ValidateAudience = false,
+ ClockSkew = TimeSpan.Zero
+ };
+});
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
//builder.Services.AddSwaggerGen();
-builder.Services.AddSwaggerGen(c =>
+builder.Services.AddSwaggerGen(options =>
{
// Include XML comments from your assembly
var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
- c.IncludeXmlComments(xmlPath);
+ options.IncludeXmlComments(xmlPath);
+
+ OpenApiSecurityScheme securityDefinition = new OpenApiSecurityScheme()
+ {
+ Name = "Bearer",
+ BearerFormat = "JWT",
+ Scheme = "bearer",
+ Description = "Specify the authorization token.",
+ In = ParameterLocation.Header,
+ Type = SecuritySchemeType.Http,
+ };
+
+ options.AddSecurityDefinition("jwt_auth", securityDefinition);
+
+ // Make sure swagger UI requires a Bearer token specified
+ OpenApiSecurityScheme securityScheme = new OpenApiSecurityScheme()
+ {
+ Reference = new OpenApiReference()
+ {
+ Id = "jwt_auth",
+ Type = ReferenceType.SecurityScheme
+ }
+ };
+
+ OpenApiSecurityRequirement securityRequirements = new OpenApiSecurityRequirement()
+ {
+ {securityScheme, new string[] { }},
+ };
+
+ options.AddSecurityRequirement(securityRequirements);
});
builder.Services.AddScoped();
@@ -43,6 +94,7 @@ if (app.Environment.IsDevelopment())
}
}
+app.UseAuthentication();
app.UseAuthorization();
app.MapControllers();
diff --git a/DamageAssesmentApi/DamageAssesment.Api.Employees/appsettings.json b/DamageAssesmentApi/DamageAssesment.Api.Employees/appsettings.json
index b442e2b..377f7e4 100644
--- a/DamageAssesmentApi/DamageAssesment.Api.Employees/appsettings.json
+++ b/DamageAssesmentApi/DamageAssesment.Api.Employees/appsettings.json
@@ -9,15 +9,9 @@
}
},
"AllowedHosts": "*",
- "settings": {
- "endpoint1": "xxx",
- "endpoint2": "xxx",
- "endpoint3": "xxx"
- },
"ConnectionStrings": {
- //"EmployeeConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;",
- //"EmployeeConnection": "Server=localhost,1433;Database=da_survey_dev;User Id=sa;Password=Password123;TrustServerCertificate=True;"
- "EmployeeConnection": "Server=207.180.248.35;Database=da_survey_dev;User Id=sa;Password=YourStrongPassw0rd;TrustServerCertificate=True;"
+ //"EmployeeConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;"
+ "EmployeeConnection": "Server=tcp:da-dev.database.windows.net,1433;Initial Catalog=da-dev-db;Encrypt=True;User ID=admin-dev;Password=b3tgRABw8LGE75k;TrustServerCertificate=False;Connection Timeout=30;"
}
}
diff --git a/DamageAssesmentApi/DamageAssesment.Api.Locations/Controllers/LocationsController.cs b/DamageAssesmentApi/DamageAssesment.Api.Locations/Controllers/LocationsController.cs
index cea800d..8de7678 100644
--- a/DamageAssesmentApi/DamageAssesment.Api.Locations/Controllers/LocationsController.cs
+++ b/DamageAssesmentApi/DamageAssesment.Api.Locations/Controllers/LocationsController.cs
@@ -1,4 +1,5 @@
using DamageAssesment.Api.Locations.Interfaces;
+using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
@@ -15,7 +16,7 @@ namespace DamageAssesment.Api.Locations.Controllers
///
/// Get all locations.
///
-
+ [Authorize(Roles = "admin")]
[HttpGet("locations")]
public async Task GetLocationsAsync()
{
@@ -31,7 +32,7 @@ namespace DamageAssesment.Api.Locations.Controllers
///
/// Get all locations based on locationdId.
///
-
+ [Authorize(Roles = "admin")]
[HttpGet("locations/{id}")]
public async Task GetLocationByIdAsync(int id)
{
@@ -47,7 +48,7 @@ namespace DamageAssesment.Api.Locations.Controllers
///
/// Update a Location.
///
-
+ [Authorize(Roles = "admin")]
[HttpPut("locations/{id}")]
public async Task UpdateLocation(int id, Models.Location Location)
{
@@ -65,7 +66,7 @@ namespace DamageAssesment.Api.Locations.Controllers
///
/// Save a new location.
///
-
+ [Authorize(Roles = "admin")]
[HttpPost("locations")]
public async Task CreateLocation(Models.Location Location)
{
@@ -83,7 +84,7 @@ namespace DamageAssesment.Api.Locations.Controllers
///
/// Delete an existing location.
///
-
+ [Authorize(Roles = "admin")]
[HttpDelete("locations/{id}")]
public async Task DeleteLocation(int id)
{
diff --git a/DamageAssesmentApi/DamageAssesment.Api.Locations/Controllers/RegionsController.cs b/DamageAssesmentApi/DamageAssesment.Api.Locations/Controllers/RegionsController.cs
index 172043c..d7fe03c 100644
--- a/DamageAssesmentApi/DamageAssesment.Api.Locations/Controllers/RegionsController.cs
+++ b/DamageAssesmentApi/DamageAssesment.Api.Locations/Controllers/RegionsController.cs
@@ -1,4 +1,5 @@
using DamageAssesment.Api.Locations.Interfaces;
+using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace DamageAssesment.Api.Locations.Controllers
@@ -15,7 +16,7 @@ namespace DamageAssesment.Api.Locations.Controllers
///
/// Get all regions.2
///
-
+ [Authorize(Roles = "admin")]
[HttpGet("regions")]
public async Task GetRegionsAsync()
{
@@ -29,7 +30,7 @@ namespace DamageAssesment.Api.Locations.Controllers
///
/// GET request for retrieving a region by its ID.
///
-
+ [Authorize(Roles = "admin")]
[HttpGet("regions/{id}")]
public async Task GetRegionAsync(int id)
{
@@ -43,7 +44,7 @@ namespace DamageAssesment.Api.Locations.Controllers
///
/// POST request for creating a new region.
///
-
+ [Authorize(Roles = "admin")]
[HttpPost("regions")]
public async Task PostRegionAsync(Models.Region region)
{
@@ -57,7 +58,7 @@ namespace DamageAssesment.Api.Locations.Controllers
///
/// PUT request for updating an existing region.
///
-
+ [Authorize(Roles = "admin")]
[HttpPut("regions/{id}")]
public async Task PutRegionAsync(int id, Models.Region region)
{
@@ -75,7 +76,7 @@ namespace DamageAssesment.Api.Locations.Controllers
/// DELETE request for deleting a region based on ID.
///
-
+ [Authorize(Roles = "admin")]
[HttpDelete("regions/{id}")]
public async Task DeleteRegionAsync(int id)
{
diff --git a/DamageAssesmentApi/DamageAssesment.Api.Locations/Program.cs b/DamageAssesmentApi/DamageAssesment.Api.Locations/Program.cs
index f8136bd..cf4c0d2 100644
--- a/DamageAssesmentApi/DamageAssesment.Api.Locations/Program.cs
+++ b/DamageAssesmentApi/DamageAssesment.Api.Locations/Program.cs
@@ -1,23 +1,73 @@
using DamageAssesment.Api.Locations.Db;
using DamageAssesment.Api.Locations.Interfaces;
using DamageAssesment.Api.Locations.Providers;
+using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.EntityFrameworkCore;
+using Microsoft.IdentityModel.Tokens;
+using Microsoft.OpenApi.Models;
using System.Reflection;
+using System.Text;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
-
+var authkey = builder.Configuration.GetValue("JwtSettings:securitykey");
+builder.Services.AddAuthentication(item =>
+{
+ item.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
+ item.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
+}).AddJwtBearer(item =>
+{
+ item.RequireHttpsMetadata = true;
+ item.SaveToken = true;
+ item.TokenValidationParameters = new TokenValidationParameters()
+ {
+ ValidateIssuerSigningKey = true,
+ IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(authkey)),
+ ValidateIssuer = false,
+ ValidateAudience = false,
+ ClockSkew = TimeSpan.Zero
+ };
+});
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
//builder.Services.AddSwaggerGen();
-builder.Services.AddSwaggerGen(c =>
+builder.Services.AddSwaggerGen(options =>
{
// Include XML comments from your assembly
var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
- c.IncludeXmlComments(xmlPath);
+ options.IncludeXmlComments(xmlPath);
+
+ OpenApiSecurityScheme securityDefinition = new OpenApiSecurityScheme()
+ {
+ Name = "Bearer",
+ BearerFormat = "JWT",
+ Scheme = "bearer",
+ Description = "Specify the authorization token.",
+ In = ParameterLocation.Header,
+ Type = SecuritySchemeType.Http,
+ };
+
+ options.AddSecurityDefinition("jwt_auth", securityDefinition);
+
+ // Make sure swagger UI requires a Bearer token specified
+ OpenApiSecurityScheme securityScheme = new OpenApiSecurityScheme()
+ {
+ Reference = new OpenApiReference()
+ {
+ Id = "jwt_auth",
+ Type = ReferenceType.SecurityScheme
+ }
+ };
+
+ OpenApiSecurityRequirement securityRequirements = new OpenApiSecurityRequirement()
+ {
+ {securityScheme, new string[] { }},
+ };
+
+ options.AddSecurityRequirement(securityRequirements);
});
builder.Services.AddScoped();
builder.Services.AddScoped();
@@ -26,7 +76,10 @@ builder.Services.AddDbContext(option =>
{
option.UseSqlServer("LocationConnection");
});
+
+
var app = builder.Build();
+// Add services to the container.
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
@@ -44,6 +97,7 @@ if (app.Environment.IsDevelopment())
}
}
+app.UseAuthentication();
app.UseAuthorization();
app.MapControllers();
diff --git a/DamageAssesmentApi/DamageAssesment.Api.Locations/appsettings.json b/DamageAssesmentApi/DamageAssesment.Api.Locations/appsettings.json
index 22611e3..d11a4d3 100644
--- a/DamageAssesmentApi/DamageAssesment.Api.Locations/appsettings.json
+++ b/DamageAssesmentApi/DamageAssesment.Api.Locations/appsettings.json
@@ -9,10 +9,12 @@
}
},
"AllowedHosts": "*",
+ //"ConnectionStrings": {
+ // "LocationConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;"
+ //},
"ConnectionStrings": {
- //"LocationConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;",
- // "LocationConnection": "Server=localhost,1433;Database=da_survey_dev;User Id=sa;Password=Password123;TrustServerCertificate=True;"
- "LocationConnection": "Server=207.180.248.35;Database=da_survey_dev;User Id=sa;Password=YourStrongPassw0rd;TrustServerCertificate=True;"
+ //"LocationConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;"
+ "LocationConnection": "Server=tcp:da-dev.database.windows.net,1433;Initial Catalog=da-dev-db;Encrypt=True;User ID=admin-dev;Password=b3tgRABw8LGE75k;TrustServerCertificate=False;Connection Timeout=30;"
}
}
diff --git a/DamageAssesmentApi/DamageAssesment.Api.Questions/Controllers/QuestionsController.cs b/DamageAssesmentApi/DamageAssesment.Api.Questions/Controllers/QuestionsController.cs
index 7dec941..1171b0d 100644
--- a/DamageAssesmentApi/DamageAssesment.Api.Questions/Controllers/QuestionsController.cs
+++ b/DamageAssesmentApi/DamageAssesment.Api.Questions/Controllers/QuestionsController.cs
@@ -1,4 +1,5 @@
using DamageAssesment.Api.Questions.Interfaces;
+using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace DamageAssesment.Api.Questions.Controllers
@@ -10,16 +11,13 @@ namespace DamageAssesment.Api.Questions.Controllers
public QuestionsController(IQuestionsProvider questionsProvider)
{
-
this.questionsProvider = questionsProvider;
-
}
-
///
/// GET request for retrieving questions.
///
-
- // get all questions
+ //get all questions
+ [Authorize(Roles = "admin,survey,user,report")]
[Route("questions")]
[Route("questions/{language:alpha}")]
[HttpGet]
@@ -37,6 +35,7 @@ namespace DamageAssesment.Api.Questions.Controllers
///
/// GET request for retrieving a question by ID.
///
+ [Authorize(Roles = "admin,survey,user,report")]
[Route("questions/{id}/{language:alpha}")]
[Route("questions/{id:int}")]
[HttpGet]
@@ -55,6 +54,7 @@ namespace DamageAssesment.Api.Questions.Controllers
/// GET request for retrieving survey questions based on a survey ID.
/// Uri: {Optional language}/GetSurveyQuestions/{surveyId} :Default returns question in all languages
///
+ [Authorize(Roles = "admin,survey,user,report")]
[Route("questions/bysurvey/{surveyId:int}")]
[Route("questions/bysurvey/{surveyId:int}/{language:alpha}")]
[HttpGet]
@@ -71,6 +71,7 @@ namespace DamageAssesment.Api.Questions.Controllers
/// PUT request for updating a question (multilingual).
///
+ [Authorize(Roles = "admin")]
[HttpPut("questions")]
public async Task UpdateQuestion(Models.Question question)
{
@@ -92,6 +93,7 @@ namespace DamageAssesment.Api.Questions.Controllers
/// POST request for creating a new question (multilingual).
///
+ [Authorize(Roles = "admin")]
[HttpPost("questions")]
public async Task CreateQuestion(Models.Question question)
{
@@ -110,6 +112,7 @@ namespace DamageAssesment.Api.Questions.Controllers
/// DELETE request for deleting a question based on ID.
///
+ [Authorize(Roles = "admin")]
[HttpDelete("questions/{id}")]
public async Task DeleteQuestion(int id)
{
@@ -125,6 +128,7 @@ namespace DamageAssesment.Api.Questions.Controllers
/// GET request for retrieving question categories.
///
+ [Authorize(Roles = "admin,user,report")]
[HttpGet("questions/categories")]
[HttpGet("questions/categories/{language:alpha}")]
public async Task GetQuestionCategoriesAsync(string? language)
@@ -139,7 +143,7 @@ namespace DamageAssesment.Api.Questions.Controllers
///
/// GET request for retrieving a question category by ID.
///
-
+ [Authorize(Roles = "admin,report")]
[HttpGet("questions/categories/{id:int}")]
[HttpGet("questions/categories/{id:int}/{language:alpha}")]
public async Task GetQuestionCategoryAsync(int id,string? language)
@@ -156,7 +160,7 @@ namespace DamageAssesment.Api.Questions.Controllers
///
/// PUT request for updating a question category.
///
-
+ [Authorize(Roles = "admin,survey,report")]
[HttpPut("questions/categories")]
public async Task UpdateQuestionCategory(Models.QuestionCategory questionCategory)
{
@@ -178,6 +182,7 @@ namespace DamageAssesment.Api.Questions.Controllers
/// POST request for creating a new question category.
///
+ [Authorize(Roles = "admin")]
[HttpPost("questions/categories")]
public async Task CreateQuestionCategory(Models.QuestionCategory questionCategory)
{
@@ -196,6 +201,7 @@ namespace DamageAssesment.Api.Questions.Controllers
/// DELETE request for deleting a question category based on ID.
///
+ [Authorize(Roles = "admin")]
[HttpDelete("questions/categories/{id}")]
public async Task DeleteQuestionCategory(int id)
{
diff --git a/DamageAssesmentApi/DamageAssesment.Api.Questions/Models/Question.cs b/DamageAssesmentApi/DamageAssesment.Api.Questions/Models/Question.cs
index b6c1668..f7fe7fb 100644
--- a/DamageAssesmentApi/DamageAssesment.Api.Questions/Models/Question.cs
+++ b/DamageAssesmentApi/DamageAssesment.Api.Questions/Models/Question.cs
@@ -12,7 +12,7 @@
public bool IsRequired { get; set; }
public bool Comment { get; set; }
public bool Key { get; set; }
- public int? SurveyId { get; set; }
+ public int SurveyId { get; set; }
public int CategoryId { get; set; }
}
}
diff --git a/DamageAssesmentApi/DamageAssesment.Api.Questions/Program.cs b/DamageAssesmentApi/DamageAssesment.Api.Questions/Program.cs
index c47a38d..dfd6a07 100644
--- a/DamageAssesmentApi/DamageAssesment.Api.Questions/Program.cs
+++ b/DamageAssesmentApi/DamageAssesment.Api.Questions/Program.cs
@@ -1,11 +1,33 @@
using DamageAssesment.Api.Questions.Db;
using DamageAssesment.Api.Questions.Interfaces;
using DamageAssesment.Api.Questions.Providers;
+using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.EntityFrameworkCore;
+using Microsoft.IdentityModel.Tokens;
+using Microsoft.OpenApi.Models;
using System.Reflection;
+using System.Text;
var builder = WebApplication.CreateBuilder(args);
-
+// Add services to the container.
+var authkey = builder.Configuration.GetValue("JwtSettings:securitykey");
+builder.Services.AddAuthentication(item =>
+{
+ item.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
+ item.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
+}).AddJwtBearer(item =>
+{
+ item.RequireHttpsMetadata = true;
+ item.SaveToken = true;
+ item.TokenValidationParameters = new TokenValidationParameters()
+ {
+ ValidateIssuerSigningKey = true,
+ IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(authkey)),
+ ValidateIssuer = false,
+ ValidateAudience = false,
+ ClockSkew = TimeSpan.Zero
+ };
+});
// Add services to the container.
builder.Services.AddControllers();
@@ -17,13 +39,41 @@ builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());
builder.Services.AddEndpointsApiExplorer();
//builder.Services.AddSwaggerGen();
-builder.Services.AddSwaggerGen(c =>
+builder.Services.AddSwaggerGen(options =>
{
// Include XML comments from your assembly
var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
- c.IncludeXmlComments(xmlPath);
+ options.IncludeXmlComments(xmlPath);
+
+ OpenApiSecurityScheme securityDefinition = new OpenApiSecurityScheme()
+ {
+ Name = "Bearer",
+ BearerFormat = "JWT",
+ Scheme = "bearer",
+ Description = "Specify the authorization token.",
+ In = ParameterLocation.Header,
+ Type = SecuritySchemeType.Http,
+ };
+
+ options.AddSecurityDefinition("jwt_auth", securityDefinition);
+
+ // Make sure swagger UI requires a Bearer token specified
+ OpenApiSecurityScheme securityScheme = new OpenApiSecurityScheme()
+ {
+ Reference = new OpenApiReference()
+ {
+ Id = "jwt_auth",
+ Type = ReferenceType.SecurityScheme
+ }
+ };
+ OpenApiSecurityRequirement securityRequirements = new OpenApiSecurityRequirement()
+ {
+ {securityScheme, new string[] { }},
+ };
+ options.AddSecurityRequirement(securityRequirements);
});
+
builder.Services.AddDbContext(option =>
{
option.UseSqlServer("QuestionConnection");
@@ -43,7 +93,7 @@ if (app.Environment.IsDevelopment())
questionProvider.SeedData();
}
}
-
+app.UseAuthentication();
app.UseAuthorization();
app.MapControllers();
diff --git a/DamageAssesmentApi/DamageAssesment.Api.Questions/appsettings.json b/DamageAssesmentApi/DamageAssesment.Api.Questions/appsettings.json
index 3d3bbda..3aa83a2 100644
--- a/DamageAssesmentApi/DamageAssesment.Api.Questions/appsettings.json
+++ b/DamageAssesmentApi/DamageAssesment.Api.Questions/appsettings.json
@@ -11,8 +11,7 @@
"AllowedHosts": "*",
"ConnectionStrings": {
//"QuestionConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;"
- // "QuestionConnection": "Server=localhost,1433;Database=da_survey_dev;User Id=sa;Password=Password123;TrustServerCertificate=True;"
- "QuestionConnection": "Server=207.180.248.35;Database=da_survey_dev;User Id=sa;Password=YourStrongPassw0rd;TrustServerCertificate=True;"
+ "QuestionConnection": "Server=tcp:da-dev.database.windows.net,1433;Initial Catalog=da-dev-db;Encrypt=True;User ID=admin-dev;Password=b3tgRABw8LGE75k;TrustServerCertificate=False;Connection Timeout=30;"
}
}
diff --git a/DamageAssesmentApi/DamageAssesment.Api.Responses.Test/SurveyResponsesServiceTest.cs b/DamageAssesmentApi/DamageAssesment.Api.Responses.Test/SurveyResponsesServiceTest.cs
index 48cec58..59c764d 100644
--- a/DamageAssesmentApi/DamageAssesment.Api.Responses.Test/SurveyResponsesServiceTest.cs
+++ b/DamageAssesmentApi/DamageAssesment.Api.Responses.Test/SurveyResponsesServiceTest.cs
@@ -23,17 +23,16 @@ namespace DamageAssesment.SurveyResponses.Test
SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject();
var mockResponse = await MockData.getOkResponse(mockRequestObject);
mockSurveyResponseService.Setup(service => service.GetSurveyResponsesAsync(1)).ReturnsAsync(mockResponse);
- var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object);
+ var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object);
var result = (OkObjectResult)await surveyResponseProvider.GetSurveyResponsesAsync(1);
Assert.Equal(200, result.StatusCode);
}
-
[Fact(DisplayName = "Get Responses - BadRequest case")]
public async Task GetSurveyResponsesAsync_ShouldReturnStatusCode204()
{
var mockResponse = await MockData.getResponse();
mockSurveyResponseService.Setup(service => service.GetSurveyResponsesAsync(1)).ReturnsAsync(mockResponse);
- var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object);
+ var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object);
var result = (BadRequestObjectResult)await surveyResponseProvider.GetSurveyResponsesAsync(1);
Assert.Equal(400, result.StatusCode);
}
@@ -43,9 +42,9 @@ namespace DamageAssesment.SurveyResponses.Test
{
SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject();
var mockResponse = await MockData.getOkResponse();
- mockSurveyResponseService.Setup(service => service.GetSurveyResponsesBySurveyAsync(1,1)).ReturnsAsync(mockResponse);
- var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object);
- var result = (OkObjectResult)await surveyResponseProvider.GetSurveyResponsesAsync(1,1);
+ mockSurveyResponseService.Setup(service => service.GetSurveyResponsesBySurveyAsync(1, 1)).ReturnsAsync(mockResponse);
+ var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object);
+ var result = (OkObjectResult)await surveyResponseProvider.GetSurveyResponsesAsync(1, 1);
Assert.Equal(200, result.StatusCode);
}
@@ -53,9 +52,9 @@ namespace DamageAssesment.SurveyResponses.Test
public async Task GetSurveyResponsesBySurveyAsync_ShouldReturnStatusCode204()
{
var mockResponse = await MockData.getResponse();
- mockSurveyResponseService.Setup(service => service.GetSurveyResponsesBySurveyAsync(1,1)).ReturnsAsync(mockResponse);
- var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object);
- var result = (NoContentResult)await surveyResponseProvider.GetSurveyResponsesAsync(1,1);
+ mockSurveyResponseService.Setup(service => service.GetSurveyResponsesBySurveyAsync(1, 1)).ReturnsAsync(mockResponse);
+ var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object);
+ var result = (NoContentResult)await surveyResponseProvider.GetSurveyResponsesAsync(1, 1);
Assert.Equal(204, result.StatusCode);
}
@@ -67,9 +66,9 @@ namespace DamageAssesment.SurveyResponses.Test
{
SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject();
var mockResponse = await MockData.getOkResponse();
- mockSurveyResponseService.Setup(service => service.GetSurveyResponsesBySurveyAndLocationAsync(1, 1,1)).ReturnsAsync(mockResponse);
- var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object);
- var result = (OkObjectResult)await surveyResponseProvider.GetSurveyResponsesBySurveyAndLocationAsync(1, 1,1);
+ mockSurveyResponseService.Setup(service => service.GetSurveyResponsesBySurveyAndLocationAsync(1, 1, 1)).ReturnsAsync(mockResponse);
+ var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object);
+ var result = (OkObjectResult)await surveyResponseProvider.GetSurveyResponsesBySurveyAndLocationAsync(1, 1, 1);
Assert.Equal(200, result.StatusCode);
}
@@ -78,7 +77,7 @@ namespace DamageAssesment.SurveyResponses.Test
{
var mockResponse = await MockData.getResponse();
mockSurveyResponseService.Setup(service => service.GetSurveyResponsesBySurveyAndLocationAsync(1, 1, 1)).ReturnsAsync(mockResponse);
- var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object);
+ var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object);
var result = (NoContentResult)await surveyResponseProvider.GetSurveyResponsesBySurveyAndLocationAsync(1, 1, 1);
Assert.Equal(204, result.StatusCode);
}
@@ -88,9 +87,9 @@ namespace DamageAssesment.SurveyResponses.Test
{
SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject();
var mockResponse = await MockData.getOkResponse();
- mockSurveyResponseService.Setup(service => service.GetResponsesByAnswerAsync(1, 1, "Yes",1)).ReturnsAsync(mockResponse);
- var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object);
- var result = (OkObjectResult)await surveyResponseProvider.GetSurveyResponsesByAnswerAsyncAsync(1, 1, "Yes",1);
+ mockSurveyResponseService.Setup(service => service.GetResponsesByAnswerAsync(1, 1, "Yes", 1)).ReturnsAsync(mockResponse);
+ var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object);
+ var result = (OkObjectResult)await surveyResponseProvider.GetSurveyResponsesByAnswerAsyncAsync(1, 1, "Yes", 1);
Assert.Equal(200, result.StatusCode);
}
@@ -99,8 +98,8 @@ namespace DamageAssesment.SurveyResponses.Test
{
var mockResponse = await MockData.getResponse();
mockSurveyResponseService.Setup(service => service.GetResponsesByAnswerAsync(1, 1, "Yes", 1)).ReturnsAsync(mockResponse);
- var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object);
- var result = (NoContentResult)await surveyResponseProvider.GetSurveyResponsesByAnswerAsyncAsync(1, 1, "Yes",1);
+ var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object);
+ var result = (NoContentResult)await surveyResponseProvider.GetSurveyResponsesByAnswerAsyncAsync(1, 1, "Yes", 1);
Assert.Equal(204, result.StatusCode);
}
@@ -110,8 +109,8 @@ namespace DamageAssesment.SurveyResponses.Test
{
SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject();
var mockResponse = await MockData.getOkResponse();
- mockSurveyResponseService.Setup(service => service.GetAnswersByRegionAsync(1,1)).ReturnsAsync(mockResponse);
- var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object);
+ mockSurveyResponseService.Setup(service => service.GetAnswersByRegionAsync(1, 1)).ReturnsAsync(mockResponse);
+ var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object);
var result = (OkObjectResult)await surveyResponseProvider.GetAnswersByRegionAsync(1, 1);
Assert.Equal(200, result.StatusCode);
}
@@ -121,7 +120,7 @@ namespace DamageAssesment.SurveyResponses.Test
{
var mockResponse = await MockData.getResponse();
mockSurveyResponseService.Setup(service => service.GetAnswersByRegionAsync(1, 1)).ReturnsAsync(mockResponse);
- var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object);
+ var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object);
var result = (NoContentResult)await surveyResponseProvider.GetAnswersByRegionAsync(1, 1);
Assert.Equal(204, result.StatusCode);
}
@@ -132,7 +131,7 @@ namespace DamageAssesment.SurveyResponses.Test
SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject();
var mockResponse = await MockData.getOkResponse();
mockSurveyResponseService.Setup(service => service.GetSurveyResponsesByMaintenanceCenterAsync(1, 1)).ReturnsAsync(mockResponse);
- var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object);
+ var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object);
var result = (OkObjectResult)await surveyResponseProvider.GetAnswersByMaintenaceCentersync(1, 1);
Assert.Equal(200, result.StatusCode);
}
@@ -142,7 +141,7 @@ namespace DamageAssesment.SurveyResponses.Test
{
var mockResponse = await MockData.getResponse();
mockSurveyResponseService.Setup(service => service.GetSurveyResponsesByMaintenanceCenterAsync(1, 1)).ReturnsAsync(mockResponse);
- var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object);
+ var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object);
var result = (NoContentResult)await surveyResponseProvider.GetAnswersByMaintenaceCentersync(1, 1);
Assert.Equal(204, result.StatusCode);
}
@@ -153,7 +152,7 @@ namespace DamageAssesment.SurveyResponses.Test
SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject();
var mockResponse = await MockData.getOkResponse();
mockSurveyResponseService.Setup(service => service.GetSurveyResponseByIdAsync(1)).ReturnsAsync(mockResponse);
- var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object);
+ var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object);
var result = (OkObjectResult)await surveyResponseProvider.GetSurveyResponseByIdAsync(1);
Assert.Equal(200, result.StatusCode);
}
@@ -163,7 +162,7 @@ namespace DamageAssesment.SurveyResponses.Test
{
var mockResponse = await MockData.getResponse();
mockSurveyResponseService.Setup(service => service.GetSurveyResponseByIdAsync(1)).ReturnsAsync(mockResponse);
- var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object);
+ var surveyResponseProvider = new ResponsesController(mockSurveyResponseService.Object);
var result = (NoContentResult)await surveyResponseProvider.GetSurveyResponseByIdAsync(1);
Assert.Equal(204, result.StatusCode);
}
@@ -175,7 +174,7 @@ namespace DamageAssesment.SurveyResponses.Test
SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject();
var mockResponse = await MockData.getOkResponse(mockRequestObject);
mockSurveyResponseService.Setup(service => service.PostSurveyResponseAsync(mockRequestObject)).ReturnsAsync(mockResponse);
- var surveyResponseController = new SurveyResponsesController(mockSurveyResponseService.Object);
+ var surveyResponseController = new ResponsesController(mockSurveyResponseService.Object);
var result = (OkObjectResult)await surveyResponseController.PostSurveysAsync(mockRequestObject);
Assert.Equal(200, result.StatusCode);
}
@@ -186,7 +185,7 @@ namespace DamageAssesment.SurveyResponses.Test
SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject();
var mockResponse = await MockData.getResponse();
mockSurveyResponseService.Setup(service => service.PostSurveyResponseAsync(mockRequestObject)).ReturnsAsync(mockResponse);
- var surveyResponseController = new SurveyResponsesController(mockSurveyResponseService.Object);
+ var surveyResponseController = new ResponsesController(mockSurveyResponseService.Object);
var result = (BadRequestObjectResult)await surveyResponseController.PostSurveysAsync(mockRequestObject);
Assert.Equal(400, result.StatusCode);
}
@@ -197,7 +196,7 @@ namespace DamageAssesment.SurveyResponses.Test
SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject();
var mockResponse = await MockData.getOkResponse(mockRequestObject);
mockSurveyResponseService.Setup(service => service.PutSurveyResponseAsync(1, mockRequestObject)).ReturnsAsync(mockResponse);
- var surveyResponseController = new SurveyResponsesController(mockSurveyResponseService.Object);
+ var surveyResponseController = new ResponsesController(mockSurveyResponseService.Object);
var result = (OkObjectResult)await surveyResponseController.PutSurveyResponseAsync(1, mockRequestObject);
Assert.Equal(200, result.StatusCode);
}
@@ -208,7 +207,7 @@ namespace DamageAssesment.SurveyResponses.Test
SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject();
var mockResponse = await MockData.getResponse();
mockSurveyResponseService.Setup(service => service.PutSurveyResponseAsync(1, mockRequestObject)).ReturnsAsync(mockResponse); ;
- var surveyResponseController = new SurveyResponsesController(mockSurveyResponseService.Object);
+ var surveyResponseController = new ResponsesController(mockSurveyResponseService.Object);
var result = (BadRequestObjectResult)await surveyResponseController.PutSurveyResponseAsync(1, mockRequestObject);
Assert.Equal(400, result.StatusCode);
}
@@ -219,7 +218,7 @@ namespace DamageAssesment.SurveyResponses.Test
SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject();
var mockResponse = await MockData.getOkResponse(mockRequestObject);
mockSurveyResponseService.Setup(service => service.DeleteSurveyResponseAsync(1)).ReturnsAsync(mockResponse);
- var surveyResponseController = new SurveyResponsesController(mockSurveyResponseService.Object);
+ var surveyResponseController = new ResponsesController(mockSurveyResponseService.Object);
var result = (OkObjectResult)await surveyResponseController.DeleteSurveyResponseAsync(1);
Assert.Equal(200, result.StatusCode);
}
@@ -229,7 +228,7 @@ namespace DamageAssesment.SurveyResponses.Test
{
var mockResponse = await MockData.getResponse();
mockSurveyResponseService.Setup(service => service.DeleteSurveyResponseAsync(1)).ReturnsAsync(mockResponse); ;
- var surveyResponseController = new SurveyResponsesController(mockSurveyResponseService.Object);
+ var surveyResponseController = new ResponsesController(mockSurveyResponseService.Object);
var result = (NotFoundResult)await surveyResponseController.DeleteSurveyResponseAsync(1);
Assert.Equal(404, result.StatusCode);
}
diff --git a/DamageAssesmentApi/DamageAssesment.Api.Responses/Controllers/SurveyResponsesController.cs b/DamageAssesmentApi/DamageAssesment.Api.Responses/Controllers/ResponsesController.cs
similarity index 89%
rename from DamageAssesmentApi/DamageAssesment.Api.Responses/Controllers/SurveyResponsesController.cs
rename to DamageAssesmentApi/DamageAssesment.Api.Responses/Controllers/ResponsesController.cs
index d5f6192..0cfc94a 100644
--- a/DamageAssesmentApi/DamageAssesment.Api.Responses/Controllers/SurveyResponsesController.cs
+++ b/DamageAssesmentApi/DamageAssesment.Api.Responses/Controllers/ResponsesController.cs
@@ -1,15 +1,16 @@
using DamageAssesment.Api.Responses.Interfaces;
using DamageAssesment.Api.Responses.Models;
+using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace DamageAssesment.Api.Responses.Controllers
{
[ApiController]
- public class SurveyResponsesController : ControllerBase
+ public class ResponsesController : ControllerBase
{
private readonly ISurveysResponse surveyResponseProvider;
- public SurveyResponsesController(ISurveysResponse surveyResponseProvider)
+ public ResponsesController(ISurveysResponse surveyResponseProvider)
{
this.surveyResponseProvider = surveyResponseProvider;
}
@@ -17,6 +18,7 @@ namespace DamageAssesment.Api.Responses.Controllers
/// GET request for retrieving survey responses.
///
+ [Authorize(Roles = "admin,survey,user,report")]
[Route("responses/{employeeid:int}")]
[Route("responses")]
[HttpGet]
@@ -36,6 +38,7 @@ namespace DamageAssesment.Api.Responses.Controllers
///
/// GET request for retrieving survey responses by survey ID.
///
+ [Authorize(Roles = "admin,survey,user,report")]
[Route("responses/bysurvey/{surveyid:int}/{employeeid:int}")]
[Route("responses/bysurvey/{surveyid:int}")]
[HttpGet]
@@ -54,12 +57,13 @@ namespace DamageAssesment.Api.Responses.Controllers
/// The ID of the survey for which responses are to be retrieved.
/// The ID of the location for which responses are to be retrieved.
+ [Authorize(Roles = "admin,survey,user,report")]
[Route("responses/{surveyid:int}/{locationid:int}/{employeeid:int}")]
[Route("responses/{surveyid:int}/{locationid:int}")]
[HttpGet]
- public async Task GetSurveyResponsesBySurveyAndLocationAsync(int surveyid, int locationid,int? employeeid)
+ public async Task 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, employeeid ?? 0);
if (result.IsSuccess)
{
return Ok(result.SurveyResponses);
@@ -73,6 +77,7 @@ namespace DamageAssesment.Api.Responses.Controllers
/// The ID of the question for which responses are to be retrieved.
/// The answer for which responses are to be retrieved.
+ [Authorize(Roles = "admin,survey,user,report")]
[Route("responses/byanswer/{surveyid:int}/{questionid:int}/{answer:alpha}/{employeeid:int}")]
[Route("responses/byanswer/{surveyid:int}/{questionid:int}/{answer:alpha}")]
[HttpGet]
@@ -91,6 +96,7 @@ namespace DamageAssesment.Api.Responses.Controllers
///
/// The ID of the survey for which answers are to be retrieved.
+ [Authorize(Roles = "admin,survey,user,report")]
[Route("responses/byregion/{surveyid:int}")]
[Route("responses/byregion/{surveyid:int}/{employeeid}")]
[HttpGet]
@@ -107,6 +113,7 @@ namespace DamageAssesment.Api.Responses.Controllers
/// GET request for retrieving survey responses by survey ID and maintenance center.
///
/// The ID of the survey for which responses are to be retrieved.
+ [Authorize(Roles = "admin,survey,user,report")]
[Route("responses/bymaintenancecenter/{surveyid:int}/{employeeid:int}")]
[Route("responses/bymaintenancecenter/{surveyid:int}")]
[HttpGet]
@@ -124,6 +131,7 @@ namespace DamageAssesment.Api.Responses.Controllers
///
/// The ID of the survey response to be retrieved.
+ [Authorize(Roles = "admin,survey,user,report")]
[HttpGet("responses/{id}")]
public async Task GetSurveyResponseByIdAsync(int id)
{
@@ -140,6 +148,7 @@ namespace DamageAssesment.Api.Responses.Controllers
///
/// The survey response object to be created.
+ [Authorize(Roles = "admin,survey,user,report")]
[HttpPost("responses")]
public async Task PostSurveysAsync(Models.SurveyResponse surveyResponse)
{
@@ -156,6 +165,7 @@ namespace DamageAssesment.Api.Responses.Controllers
/// The ID of the survey response to be updated.
/// The updated survey response object.
+ [Authorize(Roles = "admin,survey,user,report")]
[HttpPut("responses/{id}")]
public async Task PutSurveyResponseAsync(int id, Models.SurveyResponse surveyResponse)
{
@@ -173,6 +183,7 @@ namespace DamageAssesment.Api.Responses.Controllers
/// DELETE request for deleting an existing survey response.
///
+ [Authorize(Roles = "admin,survey,user,report")]
[HttpDelete("responses/{id}")]
public async Task DeleteSurveyResponseAsync(int id)
{
@@ -188,6 +199,7 @@ namespace DamageAssesment.Api.Responses.Controllers
///
/// The answers to be submitted for the survey.
+ [Authorize(Roles = "admin,survey,user,report")]
[HttpPost("responses/answers")]
public async Task PostSurveyAnswersAsync(Request request)
{
@@ -199,6 +211,7 @@ namespace DamageAssesment.Api.Responses.Controllers
return BadRequest(result.ErrorMessage);
}
+ [Authorize(Roles = "admin,survey,user,report")]
[Route("responses/surveys/active/{employeeid:int}")]
[Route("responses/surveys/active/{employeeid:int}/{language:alpha}")]
[HttpGet]
@@ -212,6 +225,7 @@ namespace DamageAssesment.Api.Responses.Controllers
return NoContent();
}
+ [Authorize(Roles = "admin,survey,user,report")]
[Route("responses/surveys/historic/{employeeid:int}")]
[Route("responses/surveys/historic/{employeeid:int}/{language:alpha}")]
[HttpGet]
diff --git a/DamageAssesmentApi/DamageAssesment.Api.Responses/Interfaces/IAnswerServiceProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.Responses/Interfaces/IAnswerServiceProvider.cs
index 43ba9a1..7c23f55 100644
--- a/DamageAssesmentApi/DamageAssesment.Api.Responses/Interfaces/IAnswerServiceProvider.cs
+++ b/DamageAssesmentApi/DamageAssesment.Api.Responses/Interfaces/IAnswerServiceProvider.cs
@@ -4,9 +4,9 @@ namespace DamageAssesment.Api.Responses.Interfaces
{
public interface IAnswerServiceProvider
{
- Task