Compare commits

..

101 Commits

Author SHA1 Message Date
Vijay Uppu
65b4ca6356 Group by issue in responses 2024-01-22 12:09:00 -05:00
Vijay Uppu
54bc663f95 fixed region issue 2024-01-18 11:40:57 -05:00
Vijay Uppu
a83bbb09b1 added active and in active survey endpoints 2023-12-19 13:17:44 -05:00
Vijay Uppu
e3f34e17c3 Modified logic to get latest response based on survetid, locationId, ane employee id 2023-12-16 12:45:36 -05:00
Vijay Uppu
db6fbf67a6 added survey start and end date validation 2023-12-13 16:56:50 -05:00
Vijay Uppu
432a011d00 adding multiple questions for survey id 2023-12-07 09:51:49 -05:00
Vijay Uppu
572b4dba66 changed download url format and added new endpoint for doculink isactive update 2023-12-04 14:28:13 -05:00
Vijay Uppu
df98a1e0f4 added IsActive flag in doculinks request 2023-12-04 09:27:58 -05:00
Vijay Uppu
4aea45914e attachment and doculinks url changes 2023-12-01 17:20:11 -05:00
Vijay Uppu
9f2655d596 added multi language support for doculink attachments 2023-11-30 18:51:14 -05:00
Vijay Uppu
a407bfdf7b Return Employee ID for POST 2023-11-28 12:00:12 -05:00
Vijay Uppu
1f3c0f0524 fixed multiple question saving issue 2023-11-15 09:07:17 -05:00
Vijay Uppu
b227d32f89 Added new endpoint for creating multiple questions 2023-11-14 15:13:23 -05:00
uppuv
7f276ed532 completed heatmap api changes for location and response api 2023-11-07 16:51:10 -05:00
uppuv
227795aeda fixed survey issue in response level, and added logic for start and end date as optional date 2023-11-05 14:19:37 -05:00
uppuv
c80749e292 ixed survey issue in response level, and added logic for start and end date as optional date. 2023-11-05 13:20:29 -05:00
uppuv
6f10e99627 added excel export and removed random number 2023-11-01 12:42:30 -04:00
uppuv
499ac9248b reverted doculinks grouping by linktype 2023-10-24 12:15:13 -04:00
uppuv
e8e649efd9 reverted doculinks chages for linktype grouping 2023-10-24 11:42:28 -04:00
uppuv
7b7e5c0ce8 added status field in survey micro service 2023-10-23 12:03:50 -04:00
uppuv
2182b9a6b3 added status field in survey micro service 2023-10-23 11:39:56 -04:00
Santhosh S
f9b7fad33b Updated with folder path 2023-10-17 23:04:28 -04:00
Santhosh S
d219faa147 Updated with folder path 2023-10-17 22:40:34 -04:00
Santhosh S
40ab868e82 Updated relative path 2023-10-17 22:18:56 -04:00
Santhosh S
aae073d456 modified push acr script 2023-10-17 22:10:31 -04:00
Santhosh S
39df8c017b modified push acr script 2023-10-17 22:07:15 -04:00
Santhosh S
0cc5be64ee modified push acr script 2023-10-17 15:27:44 -04:00
Santhosh S
fa68071d64 modified push acr script 2023-10-17 15:14:41 -04:00
Santhosh S
acb5067ce5 Merge branch 'docker-branch' of https://dev.azure.com/MDCSB-Telecommuters/Emergency%20Preparedness%20Disaster%20Recovery%20Project%20%28EPDRP%29/_git/Backend-API-Services into docker-branch 2023-10-17 12:53:26 -04:00
Santhosh S
f7141493ca Updated relative path 2023-10-17 12:51:51 -04:00
Santhosh Nair
e8cbe76166 Update azure-pipelines.yml for Azure Pipelines 2023-10-17 16:44:04 +00:00
Santhosh Nair
afb520463a Update azure-pipelines.yml for Azure Pipelines 2023-10-17 16:41:54 +00:00
Santhosh Nair
1f046e0c70 Update azure-pipelines.yml for Azure Pipelines 2023-10-17 16:37:23 +00:00
Santhosh S
7b821decbd Updated with folder path 2023-10-17 12:09:42 -04:00
Santhosh S
f321641870 folder for Common build support scripts 2023-10-17 11:36:35 -04:00
Santhosh Nair
8349e78f6e Update azure-pipelines.yml for Azure Pipelines 2023-10-16 23:30:50 +00:00
uppuv
8a803ad157 added logic to get active surveys from survey responses 2023-10-16 14:02:49 -04:00
Santhosh Nair
c89c6f60c3 Update azure-pipelines.yml for Azure Pipelines 2023-10-16 11:21:54 +00:00
Santhosh Nair
08f873e8e3 Update azure-pipelines.yml for Azure Pipelines 2023-10-16 03:47:09 +00:00
Santhosh Nair
dadbcf98b9 Update azure-pipelines.yml for Azure Pipelines 2023-10-16 03:44:19 +00:00
Santhosh Nair
7935302b2d Update azure-pipelines.yml for Azure Pipelines 2023-10-16 03:40:48 +00:00
Santhosh Nair
55e27059e5 Update azure-pipelines.yml for Azure Pipelines 2023-10-16 03:31:15 +00:00
Santhosh Nair
3ac36bf86f Update azure-pipelines.yml for Azure Pipelines 2023-10-15 16:48:47 +00:00
Santhosh Nair
7985428f8b Update azure-pipelines.yml for Azure Pipelines 2023-10-14 04:16:24 +00:00
Santhosh Nair
0dd6d3b1e3 Update azure-pipelines.yml for Azure Pipelines 2023-10-14 04:14:40 +00:00
Santhosh Nair
d3cf6a63e5 Update azure-pipelines.yml for Azure Pipelines 2023-10-14 04:13:24 +00:00
Santhosh Nair
45109881ad Update azure-pipelines.yml for Azure Pipelines 2023-10-14 04:12:30 +00:00
Santhosh S
f91b935374 Added Azure Pipeline to ACR 2023-10-13 18:28:15 -04:00
uppuv
6ad5bb1572 merged latest changes from docker to dev 2023-10-13 14:48:08 -04:00
uppuv
cb3c7f8f6a added muilti language return format for question categories for question by survey 2023-10-13 13:21:33 -04:00
uppuv
26e79432e2 table name changes 2023-10-12 16:01:24 -04:00
uppuv
885fdeb117 updated question category 2023-10-11 19:24:50 -04:00
uppuv
fa3e3bbd99 added seed data for questions and surveys for demo 2023-10-11 15:33:21 -04:00
uppuv
3911980842 doculink changes for grouping moving to docker branch 2023-10-09 20:39:37 -04:00
uppuv
71d4b524e7 doculinks changes for grouping 2023-10-09 13:29:01 -04:00
Santhosh S
9b91afd329 bug fix with seed data changes 2023-10-06 18:22:37 -04:00
uppuv
1510c3ab12 Seed changes for doculink microservice 2023-10-06 16:25:38 -04:00
uppuv
c7a2dc5910 seed changes for doculinks 2023-10-06 15:53:09 -04:00
Santhosh Nair
15b5fba35e Deleted appsettings.Test.json 2023-10-06 01:53:42 +00:00
Santhosh Nair
7d3968bb62 Deleted appsettings.Production.json 2023-10-06 01:53:24 +00:00
Santhosh Nair
cee61c9b87 Deleted appsettings.Development.json 2023-10-06 01:53:05 +00:00
uppuv
2aca01c8b4 seed data changes for answers and new survey 2023-10-05 15:42:41 -04:00
uppuv
bac2eef4fb added doculinks seed data for multi language titles and descriptions 2023-10-05 14:27:24 -04:00
Santhosh S
6ae57c9818 Fix for Namespace SurveyResponses 2023-10-04 18:45:51 -04:00
Santhosh S
d2ae8a30a6 Added Response sample data 2023-10-04 18:19:27 -04:00
Santhosh S
076a8004e2 Merge branch 'dev' of https://dev.azure.com/MDCSB-Telecommuters/Emergency%20Preparedness%20Disaster%20Recovery%20Project%20%28EPDRP%29/_git/Backend-API-Services into dev 2023-10-04 15:19:12 -04:00
uppuv
54d6fab64f enabled seed data and changed survey Response project name 2023-10-04 15:03:59 -04:00
Santhosh S
045a0995bb merge with latest change in endpoints 2023-10-04 12:34:03 -04:00
Santhosh S
dc1cb899d0 Merge branch 'dev' of https://dev.azure.com/MDCSB-Telecommuters/Emergency%20Preparedness%20Disaster%20Recovery%20Project%20%28EPDRP%29/_git/Backend-API-Services into dev 2023-10-04 12:23:55 -04:00
uppuv
044876b23b changed all end points to small case 2023-10-04 11:55:35 -04:00
Santhosh S
30751bc491 fix doculink test reference 2023-10-04 00:28:04 -04:00
Santhosh S
fa0ec795c1 Employee uri to employee 2023-10-04 00:07:33 -04:00
Santhosh S
8e31691044 change of port for testing socker-compose.asf.yml 2023-10-01 23:20:04 -04:00
Santhosh S
82c768a0d9 change of port for testing socker-compose.asf.yml 2023-10-01 21:15:42 -04:00
Santhosh S
f5c2b2da44 Proxy Port update for AzureFabricsService test reverted 2023-09-29 11:38:43 -04:00
Santhosh S
17b4177a26 Proxy Port update for AzureFabricsService 6006 changed to doculink 2023-09-29 11:08:11 -04:00
Santhosh S
c5f3473ccb port change for cluster 2023-09-29 10:11:53 -04:00
Santhosh S
8744761b00 Proxy Port update for AzureFabricsService test 2023-09-29 01:11:19 -04:00
Santhosh S
7f82b10bbc added docker-compose for service cluster 2023-09-27 22:02:07 -04:00
Santhosh S
31eeb2b63d Updated Doculink Docker 2023-09-25 23:38:20 -04:00
Santhosh S
49d809bbff Update docker for Responses 2023-09-25 23:34:52 -04:00
Santhosh S
cddbe63464 Merge branch 'docker-branch' of https://dev.azure.com/MDCSB-Telecommuters/Emergency%20Preparedness%20Disaster%20Recovery%20Project%20%28EPDRP%29/_git/Backend-API-Services into docker-branch 2023-09-25 23:27:56 -04:00
Santhosh S
7a59d300d4 Response project name conflict 2023-09-25 23:26:54 -04:00
Santhosh Nair
947efebdf3 Update docker-compose.yml for Azure Pipelines 2023-09-26 03:15:19 +00:00
Santhosh Nair
86f4eebe72 Update docker-compose.yml for Azure Pipelines 2023-09-26 03:11:36 +00:00
Santhosh S
fb5a69fa19 latest fixes sprint 4 2023-09-25 22:51:54 -04:00
Santhosh S
427fa3e559 port update 2023-09-25 22:30:20 -04:00
Santhosh S
eab826cf09 Resolved conflict with doculink port 2023-09-25 22:24:17 -04:00
uppuv
f2c1d47749 doculink changes 2023-09-22 11:56:09 -04:00
9dcd9d243e Created Groupings and added a few more
Tests should be grouped so that they can create, update, then eventually delete the data.
All the Gets are grouped together, but then later on you may need them to preform the CRUD operations.
2023-09-21 23:13:21 -05:00
8833fca734 Adding in tests for the endpoints after creation
Having tests on our code is essential, but it's equally crucial to ensure that all endpoints function correctly with each deployment. Once these validations are in place, we can integrate them into Jenkins during the build process to ensure that our releases are free of bugs.
2023-09-21 17:52:13 -05:00
Reginald Cherenfant Jasmin
a0033ca045 Add EmployeeId as filter in the endpoints, add endpoints to get all active and historical surveys for a particular employee 2023-09-21 00:58:29 -04:00
Santhosh S
3207b58b96 Dockerize with DocuLinks Inital version 2023-09-14 15:35:23 -04:00
Reginald CHERENFANT JASMIN
8d386af40a Changing Microservice name from Survey to Surveys 2023-09-14 11:57:23 -05:00
uppuv
0ad7bd5420 Merge branch 'DocumentsAPI' into dev 2023-09-13 16:50:56 -04:00
uppuv
3b91282419 document api link type changes 2023-09-13 16:49:59 -04:00
Reginald Cherenfant Jasmin
fedbb8a93e Merge branch 'dev' of https://dev.azure.com/MDCSB-Telecommuters/Emergency%20Preparedness%20Disaster%20Recovery%20Project%20%28EPDRP%29/_git/Backend-API-Services into localdev 2023-09-13 01:29:14 -04:00
Reginald Cherenfant Jasmin
9109d0d793 Update survey response, adding EmployeeId , Location Id as int, adjust end point for ansers submission in batch 2023-09-13 01:28:24 -04:00
uppuv
a6eed848f8 Merge branch 'DocumentsAPI' into dev 2023-09-11 13:42:40 -04:00
uppuv
b878cd706c 314: updated document multi language output format 2023-09-11 13:23:50 -04:00
uppuv
4cf7d9f891 Multi language dynamic object changes 2023-09-08 15:40:06 -04:00
242 changed files with 6668 additions and 4612 deletions

5
.gitignore vendored
View File

@ -1,5 +0,0 @@
################################################################################
# This .gitignore file was automatically created by Microsoft(R) Visual Studio.
################################################################################
/DamageAssesmentApi/nginx.conf

View File

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

View File

@ -5,7 +5,6 @@ using Microsoft.OpenApi.Any;
namespace DamageAssesment.Api.Answers.Controllers
{
//[Route("api")]
[ApiController]
public class AnswersController: ControllerBase
{
@ -18,7 +17,7 @@ namespace DamageAssesment.Api.Answers.Controllers
/// Get all answers
/// </summary>
[HttpGet("Answers")]
[HttpGet("answers")]
public async Task<ActionResult> GetAnswersAsync() {
var result = await answerProvider.GetAnswersAsync();
@ -34,11 +33,11 @@ namespace DamageAssesment.Api.Answers.Controllers
/// </summary>
[HttpGet("Answers/{Id}")]
public async Task<ActionResult> GetAnswerByIdAsync(int Id)
[HttpGet("answers/{id}")]
public async Task<ActionResult> GetAnswerByIdAsync(int id)
{
var result = await answerProvider.GetAnswerByIdAsync(Id);
var result = await answerProvider.GetAnswerByIdAsync(id);
if (result.IsSuccess)
{
return Ok(result.Answer);
@ -49,10 +48,10 @@ namespace DamageAssesment.Api.Answers.Controllers
/// <summary>
/// Get all answers based on responseId.
/// </summary>
[HttpGet("AnswersByResponse/{ResponseId}")]
public async Task<IActionResult> GetAnswersByResponseId(int ResponseId)
[HttpGet("answers/byresponse/{responseid}")]
public async Task<IActionResult> GetAnswersByResponseId(int responseid)
{
var result = await this.answerProvider.GetAnswersAsync(ResponseId);
var result = await this.answerProvider.GetAnswersAsync(responseid);
if(result.IsSuccess)
{
return Ok(result.Answers);
@ -63,10 +62,10 @@ namespace DamageAssesment.Api.Answers.Controllers
/// Get all answers based on questionId.
/// </summary>
[HttpGet("AnswersByQuestion/{QuestionId}")]
public async Task<IActionResult> AnswersByQuestionId(int QuestionId)
[HttpGet("answers/byquestion/{questionid}")]
public async Task<IActionResult> AnswersByQuestionId(int questionid)
{
var result = await this.answerProvider.GetAnswersByQuestionAsync(QuestionId);
var result = await this.answerProvider.GetAnswersByQuestionAsync(questionid);
if (result.IsSuccess)
{
return Ok(result.Answers);
@ -77,7 +76,7 @@ namespace DamageAssesment.Api.Answers.Controllers
/// Update an existing answer.
/// </summary>
[HttpPut("Answers")]
[HttpPut("answers")]
public async Task<IActionResult> UpdateAnswer(Models.Answer answer)
{
if (answer != null)
@ -98,7 +97,7 @@ namespace DamageAssesment.Api.Answers.Controllers
/// Save a new answer.
/// </summary>
[HttpPost("Answers")]
[HttpPost("answers")]
public async Task<IActionResult> CreateAnswer(Models.Answer answer)
{
if (answer != null)
@ -116,7 +115,7 @@ namespace DamageAssesment.Api.Answers.Controllers
/// Delete an existing answer.
/// </summary>
[HttpDelete("Answers/{id}")]
[HttpDelete("answers/{id}")]
public async Task<IActionResult> DeleteAnswer(int id)
{
var result = await this.answerProvider.DeleteAnswerAsync(id);

View File

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

View File

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

View File

@ -1,39 +0,0 @@
#See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging.
# Use the ASP.NET base image
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80
# Use the SDK image for building
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
# Copy the project file and restore dependencies
COPY ["DamageAssesment.Api.Answers/DamageAssesment.Api.Answers.csproj", "DamageAssesment.Api.Answers/"]
RUN dotnet restore "DamageAssesment.Api.Answers/DamageAssesment.Api.Answers.csproj"
# Copy the source code
COPY . .
WORKDIR "/src/DamageAssesment.Api.Answers"
# Build the application
RUN dotnet build "DamageAssesment.Api.Answers.csproj" -c Release -o /app/build
# Publish the application
FROM build AS publish
RUN dotnet publish "DamageAssesment.Api.Answers.csproj" -c Release -o /app/publish /p:UseAppHost=false
# Set up the final image
FROM base AS final
WORKDIR /app
# Copy the published files
COPY --from=publish /app/publish .
## Set up the volume and copy the XML comments
#VOLUME /xmlcomments
#COPY ["DamageAssesment.Api.Answers.xml", "/xmlcomments/DamageAssesment.Api.Answers.xml"]
#
# Specify the entry point for the container
ENTRYPOINT ["dotnet", "DamageAssesment.Api.Answers.dll"]

View File

@ -2,8 +2,6 @@ using DamageAssesment.Api.Answers.Db;
using DamageAssesment.Api.Answers.Interfaces;
using DamageAssesment.Api.Answers.Providers;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Options;
using Microsoft.OpenApi.Models;
using System.Reflection;
var builder = WebApplication.CreateBuilder(args);
@ -16,13 +14,10 @@ builder.Services.AddEndpointsApiExplorer();
//builder.Services.AddSwaggerGen();
builder.Services.AddSwaggerGen(c =>
{
// Include XML comments from your assembly
var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
c.IncludeXmlComments(xmlPath);
});
builder.Services.AddScoped<IAnswersProvider, AnswersProvider>();
builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies()); //4/30
@ -37,21 +32,8 @@ var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
//using (var serviceScope = app.Services.CreateScope())
//{
// var services = serviceScope.ServiceProvider;
// var answerProvider = services.GetRequiredService<IAnswersProvider>();
// answerProvider.SeedData();
//}
app.UseSwagger();
app.UseSwaggerUI(
options =>
{
//switch for local environment
//options.SwaggerEndpoint("/swagger/v1/swagger.json", "");
options.SwaggerEndpoint("/answers/swagger/v1/swagger.json","" );
} );
app.UseSwaggerUI();
}
app.UseAuthorization();

View File

@ -8,19 +8,20 @@ namespace DamageAssesment.Api.Answers.Providers
{
public class AnswersProvider : IAnswersProvider
{
private AnswerDbContext answerDbContext;
private ILogger<AnswersProvider> logger;
private IMapper mapper;
// Constructor with dependency injection and data seeding
public AnswersProvider(AnswerDbContext answerDbContext, ILogger<AnswersProvider> logger, IMapper mapper)
{
this.answerDbContext = answerDbContext;
this.logger = logger;
this.mapper = mapper;
//SeedData();
SeedData(); // Seed initial data if the table is empty
}
// Get all answers
public async Task<(bool IsSuccess, IEnumerable<Models.Answer> Answers, string ErrorMessage)> GetAnswersAsync()
{
try
@ -40,9 +41,9 @@ namespace DamageAssesment.Api.Answers.Providers
logger?.LogError(ex.ToString());
return (false, null, ex.Message);
}
}
// Get an answer by its ID
public async Task<(bool IsSuccess, Models.Answer Answer, string ErrorMessage)> GetAnswerByIdAsync(int Id)
{
try
@ -63,6 +64,8 @@ namespace DamageAssesment.Api.Answers.Providers
return (false, null, ex.Message);
}
}
// Get answers by survey response ID
public async Task<(bool IsSuccess, IEnumerable<Models.Answer> Answers, string ErrorMessage)> GetAnswersAsync(int surveyResponseId)
{
try
@ -74,17 +77,17 @@ namespace DamageAssesment.Api.Answers.Providers
{
var result = mapper.Map<IEnumerable<Db.Answer>, IEnumerable<Models.Answer>>(respAnswers);
return (true, result, null);
}
return (false, null, "Not Found");
}
catch (Exception ex)
{
logger?.LogError(ex.ToString());
return (false, null, ex.Message);
}
}
// Get answers by question ID
public async Task<(bool IsSuccess, IEnumerable<Models.Answer> Answers, string ErrorMessage)> GetAnswersByQuestionAsync(int questionId)
{
try
@ -96,17 +99,17 @@ namespace DamageAssesment.Api.Answers.Providers
{
var result = mapper.Map<IEnumerable<Db.Answer>, IEnumerable<Models.Answer>>(respAnswers);
return (true, result, null);
}
return (false, null, "Not Found");
}
catch (Exception ex)
{
logger?.LogError(ex.ToString());
return (false, null, ex.Message);
}
}
// Create a new answer
public async Task<(bool IsSuccess, Models.Answer Answer, string ErrorMessage)> PostAnswerAsync(Models.Answer Answer)
{
try
@ -120,7 +123,7 @@ namespace DamageAssesment.Api.Answers.Providers
var result = mapper.Map<Db.Answer, Models.Answer>(answer);
return (true, result, null);
}
return (false, null, "Answer is already exits");
return (false, null, "Answer is already exists");
}
catch (Exception ex)
{
@ -128,6 +131,8 @@ namespace DamageAssesment.Api.Answers.Providers
return (false, null, ex.Message);
}
}
// Update an existing answer
public async Task<(bool IsSuccess, Models.Answer Answer, string ErrorMessage)> UpdateAnswerAsync(Models.Answer Answer)
{
try
@ -156,14 +161,14 @@ namespace DamageAssesment.Api.Answers.Providers
}
catch (Exception ex)
{
logger?.LogError(ex.ToString());
return (false,null, ex.Message);
return (false, null, ex.Message);
}
}
// Delete an answer by its ID
public async Task<(bool IsSuccess, Models.Answer Answer, string ErrorMessage)> DeleteAnswerAsync(int Id)
{
try
{
Db.Answer answer = answerDbContext.Answers.AsNoTracking().Where(a => a.Id == Id).FirstOrDefault();
@ -173,30 +178,33 @@ namespace DamageAssesment.Api.Answers.Providers
}
answerDbContext.Answers.Remove(answer);
answerDbContext.SaveChanges();
return (true, mapper.Map<Db.Answer, Models.Answer>(answer), $"AnswerId {Id} deleted Successfuly");
return (true, mapper.Map<Db.Answer, Models.Answer>(answer), $"AnswerId {Id} deleted successfully");
}
catch (Exception ex)
{
logger?.LogError(ex.ToString());
return (false,null, ex.Message);
return (false, null, ex.Message);
}
}
// Check if an answer with a specific ID exists
private bool AnswerExists(int id)
{
return answerDbContext.Answers.AsNoTracking().Count(e => e.Id == id) > 0;
}
// Seed initial data if the table is empty
public void SeedData()
{
if (!answerDbContext.Answers.Any())
{
answerDbContext.Answers.Add(new Db.Answer() { Id = 1, AnswerText = "Yes", Comment = "", QuestionId = 1, SurveyResponseId = 1 });
answerDbContext.Answers.Add(new Db.Answer() { Id = 2, AnswerText = "Yes", Comment = "myComment", QuestionId = 2, SurveyResponseId = 1 });
answerDbContext.Answers.Add(new Db.Answer() { Id = 3, AnswerText = "No", Comment = "No Comment", QuestionId = 3, SurveyResponseId = 1 });
answerDbContext.Answers.Add(new Db.Answer() { Id = 4, AnswerText = "Yes", Comment = "No Comment", QuestionId = 1, SurveyResponseId = 2 });
answerDbContext.Answers.Add(new Db.Answer() { Id = 5, AnswerText = "No", Comment = "No Comment", QuestionId = 2, SurveyResponseId = 2 });
answerDbContext.Answers.Add(new Db.Answer() { Id = 6, AnswerText = "No", Comment = "No Comment", QuestionId = 3, SurveyResponseId = 2 });
answerDbContext.Answers.Add(new Db.Answer() { Id = 1, AnswerText = "Yes", Comment = "Comment test 4", QuestionId = 1, SurveyResponseId = 1 });
answerDbContext.Answers.Add(new Db.Answer() { Id = 2, AnswerText = "No", Comment = "Comment test 5", QuestionId = 2, SurveyResponseId = 1 });
// Uncomment the lines below to add more initial data if needed
//answerDbContext.Answers.Add(new Db.Answer() { Id = 3, AnswerText = "No", Comment = "No Comment", QuestionId = 3, SurveyResponseId = 1 });
//answerDbContext.Answers.Add(new Db.Answer() { Id = 4, AnswerText = "Yes", Comment = "No Comment", QuestionId = 1, SurveyResponseId = 2 });
//answerDbContext.Answers.Add(new Db.Answer() { Id = 5, AnswerText = "No", Comment = "No Comment", QuestionId = 2, SurveyResponseId = 2 });
//answerDbContext.Answers.Add(new Db.Answer() { Id = 6, AnswerText = "No", Comment = "No Comment", QuestionId = 3, SurveyResponseId = 2 });
answerDbContext.SaveChanges();
}
}

View File

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

View File

@ -7,7 +7,6 @@ using System.Net.Http.Headers;
namespace DamageAssesment.Api.Attachments.Controllers
{
//[Route("api")]
[ApiController]
public class AttachmentsController : ControllerBase
{
@ -23,7 +22,7 @@ namespace DamageAssesment.Api.Attachments.Controllers
/// Get all attachments.
/// </summary>
[HttpGet("Attachments")]
[HttpGet("attachments")]
public async Task<ActionResult> GetAttachmentsAsync()
{
@ -38,7 +37,7 @@ namespace DamageAssesment.Api.Attachments.Controllers
/// <summary>
/// Get all attachments by attachmentId.
/// </summary>
[HttpGet("Attachments/{id}")]
[HttpGet("attachments/{id}")]
public async Task<ActionResult> GetAttachmentbyIdAsync(int id)
{
@ -82,7 +81,7 @@ namespace DamageAssesment.Api.Attachments.Controllers
/// Save new Attachment(s)
/// </summary>
[HttpPost("Attachments"), DisableRequestSizeLimit]
[HttpPost("attachments"), DisableRequestSizeLimit]
public async Task<IActionResult> UploadAttachmentAsync(AttachmentInfo attachmentInfo)
{
try
@ -109,7 +108,7 @@ namespace DamageAssesment.Api.Attachments.Controllers
/// Modify an new attachment.
/// </summary>
[HttpPut("Attachments"), DisableRequestSizeLimit]
[HttpPut("attachments"), DisableRequestSizeLimit]
public async Task<IActionResult> UpdateAttachmentAsync(AttachmentInfo attachmentInfo)
{
try
@ -137,13 +136,87 @@ namespace DamageAssesment.Api.Attachments.Controllers
}
}
/// <summary>
/// download an existing attachment.
/// </summary>
[HttpGet("attachments/download/{id}")]
public async Task<IActionResult> downloadfile(int id)
{
try
{
var result = await this.AttachmentProvider.GetDownloadAttachmentAsync(id);
if (!result.IsSuccess)
return NotFound();
string path = await UploadService.GetFile(result.Attachment.URI);
if (path == null)
return NotFound();
var contentType = GetContentType(result.Attachment.FileName);
if (contentType == "application/octet-stream")
return PhysicalFile(path, contentType, result.Attachment.FileName);
return PhysicalFile(path, contentType, enableRangeProcessing: true);// result.Attachment.FileName);
}
catch (Exception ex)
{
// Handle the exception here or log it
return StatusCode(500, "An error occurred: " + ex.Message);
}
//try
//{
// var result = await this.AttachmentProvider.GetDownloadAttachmentAsync(id);
// if(!result.IsSuccess)
// return NotFound();
// byte[] fileContent = await UploadService.DownloadFile(result.Attachment.URI);
// if (fileContent == null || fileContent.Length == 0)
// return NotFound();
// var contentType = "application/octet-stream";
// return File(fileContent, contentType, result.Attachment.FileName);
//}
//catch (Exception ex)
//{
// // Handle the exception here or log it
// return StatusCode(500, "An error occurred: " + ex.Message);
//}
}
private string GetContentType(string fileName)
{
// You can add more content types based on the file extensions
switch (Path.GetExtension(fileName).ToLower())
{
//case ".txt":
// return "text/plain";
case ".jpg":
case ".jpeg":
return "image/jpeg";
case ".png":
return "image/png";
case ".gif":
return "image/gif";
case ".bmp":
return "image/bmp";
case ".webp":
return "image/webp";
case ".csv":
return "text/csv";
case ".pdf":
return "application/pdf";
case ".docx":
case ".doc":
return "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
case ".xlsx":
case ".xls":
return "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
// Add more cases as needed
default:
return "application/octet-stream";
}
}
/// <summary>
/// Delete an existing attachment.
/// </summary>
[HttpDelete("Delete")]
public async Task<IActionResult> DeleteAttachment(int Id)
[HttpDelete("attachments/{id}")]
public async Task<IActionResult> DeleteAttachment(int id)
{
// database soft delete
var result = await this.AttachmentProvider.DeleteAttachmentAsync(Id);
var result = await this.AttachmentProvider.DeleteAttachmentAsync(id);
if (result.IsSuccess)
{
// deleting file from folder

View File

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

View File

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

View File

@ -1,47 +0,0 @@
#See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging.
# Use the ASP.NET base image
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80
# Use the SDK image for building
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
# Copy the project file and restore dependencies
COPY ["DamageAssesment.Api.Attachments/DamageAssesment.Api.Attachments.csproj", "DamageAssesment.Api.Attachments/"]
RUN dotnet restore "DamageAssesment.Api.Attachments/DamageAssesment.Api.Attachments.csproj"
# Copy the source code
COPY . .
WORKDIR "/src/DamageAssesment.Api.Attachments"
# Build the application
RUN dotnet build "DamageAssesment.Api.Attachments.csproj" -c Release -o /app/build
# Publish the application
FROM build AS publish
RUN dotnet publish "DamageAssesment.Api.Attachments.csproj" -c Release -o /app/publish /p:UseAppHost=false
# Set up the final image
FROM base AS final
WORKDIR /app
# Copy the published files
COPY --from=publish /app/publish .
# Create directories for attachments and set permissions
RUN mkdir -p /app/DMS_Attachments/Active && \
mkdir -p /app/DMS_Attachments/Deleted && \
chown -R www-data:www-data /app/DMS_Attachments
# Update appsettings.json with the correct paths for attachments
RUN sed -i 's#"folderpath": "DMS_Attachments/Active"#"folderpath": "/app/DMS_Attachments/Active"#' appsettings.json && \
sed -i 's#"Deletepath": "DMS_Attachments/Deleted"#"Deletepath": "/app/DMS_Attachments/Deleted"#' appsettings.json
## Set up the volume and copy the XML comments
#VOLUME /xmlcomments
#COPY ["DamageAssesment.Api.Attachments/bin/Release/net6.0/DamageAssesment.Api.Attachments.xml", "/xmlcomments/"]
#
# Specify the entry point for the container
ENTRYPOINT ["dotnet", "DamageAssesment.Api.Attachments.dll"]

View File

@ -9,10 +9,10 @@ namespace DamageAssesment.Api.Attachments.Interfaces
Task<(bool IsSuccess, IEnumerable<Models.Attachment> Attachments, string ErrorMessage)> PostAttachmentAsync(List<Models.Attachment> Attachments);
Task<(bool IsSuccess, IEnumerable<Models.Attachment> Attachments, string ErrorMessage)> PutAttachmentAsync(List<Models.Attachment> Attachments);
Task<(bool IsSuccess, Models.Attachment Attachment, string Path)> DeleteAttachmentAsync(int Id);
Task<(bool IsSuccess, Models.Attachment Attachment, string Path)> GetDownloadAttachmentAsync(int Id);
Task<(bool IsSuccess, int counter, string Path)> DeleteAttachmentsAsync(int responseId, int answerId);
Task<(bool IsSuccess, int counter, string Path)> DeleteBulkAttachmentsAsync(int responseId, List<int> answerIds);
Task<(bool IsSuccess, int counter, string message)> GetAttachmentCounter();
Task<(bool IsSuccess, IEnumerable<Models.Attachment> Attachments, string ErrorMessage)> GetAttachmentInfo(List<AnswerInfo> answers);
}
}

View File

@ -7,6 +7,8 @@ namespace DamageAssesment.Api.Attachments.Interfaces
List<Models.Attachment> UploadAttachment(int responseId,int answerId, int counter, List<IFormFile> postedFile);
List<Models.Attachment> UploadAttachment(int responseId, int counter, List<AnswerInfo> answers);
public List<Models.Attachment> UpdateAttachments(int responseId, List<AnswerInfo> answers, IEnumerable<Models.Attachment> attachments);
Task<byte[]> DownloadFile(string path);
Task<string> GetFile(string path);
void Deletefile(string path);
void Movefile(string path);
}

View File

@ -21,6 +21,7 @@ builder.Services.AddSwaggerGen(c =>
var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
c.IncludeXmlComments(xmlPath);
});
builder.Services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
builder.Services.AddScoped<IAttachmentsProvider, AttachmentsProvider>();
builder.Services.AddScoped<IUploadService, UploadService>();
builder.Services.AddScoped<IAzureBlobService,AzureBlobService>();
@ -42,14 +43,7 @@ var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI(options => {
//switch for local environment
// options.SwaggerEndpoint("/swagger/v1/swagger.json", "");
options.SwaggerEndpoint("/attachments/swagger/v1/swagger.json", "");
});
app.UseSwaggerUI();
}
app.UseAuthorization();

View File

@ -13,25 +13,33 @@ namespace DamageAssesment.Api.Attachments.Providers
private AttachmentsDbContext AttachmentDbContext;
private ILogger<AttachmentsProvider> logger;
private IUploadService uploadservice;
private IMapper mapper;
public AttachmentsProvider(AttachmentsDbContext AttachmentDbContext, ILogger<AttachmentsProvider> logger, IMapper mapper,IUploadService uploadservice)
private IMapper mapper;
private readonly IHttpContextAccessor httpContextAccessor;
private string baseUrl;
public AttachmentsProvider(AttachmentsDbContext AttachmentDbContext, ILogger<AttachmentsProvider> logger, IMapper mapper,IUploadService uploadservice, IHttpContextAccessor httpContextAccessor)
{
this.AttachmentDbContext = AttachmentDbContext;
this.logger = logger;
this.mapper = mapper;
this.uploadservice = uploadservice;
// SeedData();
this.httpContextAccessor = httpContextAccessor;
baseUrl = $"{httpContextAccessor.HttpContext.Request.Scheme}://{httpContextAccessor.HttpContext.Request.Host}";
baseUrl = baseUrl + "/attachments/download";
SeedData();
}
public async Task<(bool IsSuccess, IEnumerable<Models.Attachment> Attachments, string ErrorMessage)> GetAttachmentsAsync()
{
try
{
logger?.LogInformation("Query Question");
var Attachment = await AttachmentDbContext.Attachments.AsNoTracking().Where(a => !a.IsDeleted).ToListAsync();
if (Attachment != null)
{
foreach (var attachment in Attachment)
{
attachment.URI = $"{baseUrl}/{attachment.Id}";
}
logger?.LogInformation($"{Attachment.Count} Attachments(s) found");
var result = mapper.Map<IEnumerable<Db.Attachment>, IEnumerable<Models.Attachment>>(Attachment);
return (true, result, null);
@ -54,6 +62,7 @@ namespace DamageAssesment.Api.Attachments.Providers
if (Attachment != null)
{
logger?.LogInformation($"{Attachment} customer(s) found");
Attachment.URI = $"{baseUrl}/{Attachment.Id}";
var result = mapper.Map<Db.Attachment, Models.Attachment>(Attachment);
return (true, result, null);
}
@ -73,6 +82,10 @@ namespace DamageAssesment.Api.Attachments.Providers
List<Db.Attachment> attachments = mapper.Map<List<Models.Attachment>, List<Db.Attachment>>(Attachments);
AttachmentDbContext.Attachments.AddRange(attachments);
await AttachmentDbContext.SaveChangesAsync();
foreach (var attachment in attachments)
{
attachment.URI = $"{baseUrl}/{attachment.Id}";
}
var result = mapper.Map<IEnumerable<Db.Attachment>, IEnumerable<Models.Attachment>>(attachments);
return (true, result, null);
}
@ -91,6 +104,10 @@ namespace DamageAssesment.Api.Attachments.Providers
List<Db.Attachment> attachments = mapper.Map<List<Models.Attachment>, List<Db.Attachment>>(Attachments);
AttachmentDbContext.Attachments.UpdateRange(attachments);
await AttachmentDbContext.SaveChangesAsync();
foreach (var attachment in attachments)
{
attachment.URI = $"{baseUrl}/{attachment.Id}";
}
var result = mapper.Map<IEnumerable<Db.Attachment>, IEnumerable<Models.Attachment>>(attachments);
return (true, result, null);
}
@ -197,6 +214,24 @@ namespace DamageAssesment.Api.Attachments.Providers
{
return AttachmentDbContext.Attachments.AsNoTracking().Count(e => e.Id == id && !e.IsDeleted) > 0;
}
public async Task<(bool IsSuccess, Models.Attachment Attachment, string Path)> GetDownloadAttachmentAsync(int Id)
{
try
{
Db.Attachment Attachment = AttachmentDbContext.Attachments.Where(a => a.Id == Id).AsNoTracking().FirstOrDefault();
if (Attachment == null)
{
return (false, null, "Not Found");
}
return (true, mapper.Map<Db.Attachment, Models.Attachment>(Attachment), $"Attachment {Id}");
}
catch (Exception ex)
{
logger?.LogError(ex.ToString());
return (false, null, ex.Message);
}
}
private void SeedData()
{

View File

@ -24,6 +24,41 @@ namespace DamageAssesment.Api.Attachments.Providers
uploadpath = configuration.GetValue<string>("Fileupload:folderpath");
Deletepath = configuration.GetValue<string>("Fileupload:Deletepath");
}
public async Task<string> GetFile(string path)
{
try
{
if (System.IO.File.Exists(path))
{
return path;
}
return null; // File not found
}
catch (Exception ex)
{
// Handle or log the exception as needed
throw;
}
}
public async Task<byte[]> DownloadFile(string path)
{
try
{
if (System.IO.File.Exists(path))
{
return await System.IO.File.ReadAllBytesAsync(path);
}
return null; // File not found
}
catch (Exception ex)
{
// Handle or log the exception as needed
throw;
}
}
public List<Models.Attachment> UploadAttachment(int responseId,int answerId,int counter, List<IFormFile> postedFile)
{
var pathToSave = Path.Combine(Directory.GetCurrentDirectory(), uploadpath);
@ -89,7 +124,7 @@ namespace DamageAssesment.Api.Attachments.Providers
{
counter++;
var UserfileName = Path.GetFileName(file.FileName);
var UserfileName = Path.GetFileName(file.FileName+ file.FileExtension);
var fileName = String.Format("Attachment_{0}{1}", counter, file.FileExtension);
var dbPath = Path.Combine(fullDirectoryPath, fileName);
File.WriteAllBytes(dbPath, Convert.FromBase64String(file.FileContent));
@ -126,7 +161,7 @@ namespace DamageAssesment.Api.Attachments.Providers
foreach (var file in item.postedFiles)
{
Models.Attachment attachment= attachments.Where(a=>a.Id == file.AttachmentId).FirstOrDefault();
var UserfileName = Path.GetFileName(file.FileName);
var UserfileName = Path.GetFileName(file.FileName + file.FileExtension);
var fileName = String.Format("Attachment_{0}{1}", attachment?.Id, file.FileExtension);
var dbPath = Path.Combine(fullDirectoryPath, fileName);
File.WriteAllBytes(dbPath, Convert.FromBase64String(file.FileContent));

View File

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

View File

@ -21,7 +21,7 @@
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\DamageAssesment.Api.Documents\DamageAssesment.Api.Documents.csproj" />
<ProjectReference Include="..\DamageAssesment.Api.DocuLinks\DamageAssesment.Api.DocuLinks.csproj" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,27 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<IsPackable>false</IsPackable>
<IsTestProject>true</IsTestProject>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.5.0" />
<PackageReference Include="Moq" Version="4.18.4" />
<PackageReference Include="coverlet.collector" Version="3.2.0" />
<PackageReference Include="xunit" Version="2.4.2" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.5">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\DamageAssesment.Api.DocuLinks\DamageAssesment.Api.DocuLinks.csproj" />
</ItemGroup>
</Project>

View File

@ -1,11 +1,11 @@
using DamageAssesment.Api.Documents.Controllers;
using DamageAssesment.Api.Documents.Interfaces;
using DamageAssesment.Api.Documents.Models;
using DamageAssesment.Api.DocuLinks.Controllers;
using DamageAssesment.Api.DocuLinks.Interfaces;
using DamageAssesment.Api.DocuLinks.Models;
using Microsoft.AspNetCore.Mvc;
using Moq;
using Xunit;
namespace DamageAssesment.Api.Documents.Test
namespace DamageAssesment.Api.DocuLinks.Test
{
public class DocumentServiceTest
@ -14,68 +14,93 @@ namespace DamageAssesment.Api.Documents.Test
[Fact(DisplayName = "Get Documents - NoContent Case")]
public async Task GetDocumentsLanguageAsync_ShouldReturnStatusCode204()
{
var mockDocumentService = new Mock<IDocumentsProvider>();
var mockDocumentService = new Mock<IDoculinkProvider>();
var mockUploadService = new Mock<IUploadService>();
var mockResponse = await MockData.getNoContentResponse();
mockDocumentService.Setup(service => service.GetDocumnetsAsync()).ReturnsAsync(mockResponse);
mockDocumentService.Setup(service => service.GetdocumentsByLinkAsync("forms","en",null)).ReturnsAsync(mockResponse);
var DocumentProvider = new DocumentsController(mockDocumentService.Object, mockUploadService.Object);
var result = (NoContentResult)await DocumentProvider.GetDocumentsbyFormsandLanguageAsync("", "");
var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object);
var result = (NoContentResult)await DocumentProvider.GetDocumentsAsync("", "", null);
Assert.Equal(204, result.StatusCode);
}
[Fact(DisplayName = "Get Documents - NoContent Case")]
[Fact(DisplayName = "Get active Documents - NoContent Case")]
public async Task GetDocumentsLinkTypeAsync_ShouldReturnStatusCode204()
{
var mockDocumentService = new Mock<IDocumentsProvider>();
var mockDocumentService = new Mock<IDoculinkProvider>();
var mockUploadService = new Mock<IUploadService>();
var mockResponse = await MockData.getNoContentResponse();
mockDocumentService.Setup(service => service.GetDocumnetsAsync()).ReturnsAsync(mockResponse);
mockDocumentService.Setup(service => service.GetdocumentsByLinkAsync("forms", "en", true)).ReturnsAsync(mockResponse);
var DocumentProvider = new DocumentsController(mockDocumentService.Object, mockUploadService.Object);
var result = (NoContentResult)await DocumentProvider.GetDocumentsbyFormsandLanguageAsync("", "");
var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object);
var result = (NoContentResult)await DocumentProvider.GetDocumentsByActiveAsync("", "");
Assert.Equal(204, result.StatusCode);
}
[Fact(DisplayName = "Get Documents - Ok case")]
public async Task GetDocumentsAsync_ShouldReturnStatusCode200()
{
var mockDocumentService = new Mock<IDocumentsProvider>();
var mockDocumentService = new Mock<IDoculinkProvider>();
var mockUploadService = new Mock<IUploadService>();
var mockResponse = await MockData.getOkResponse();
mockDocumentService.Setup(service => service.GetDocumnetsAsync()).ReturnsAsync(mockResponse);
var mockResponse = await MockData.getOkResponses();
mockDocumentService.Setup(service => service.GetdocumentsByLinkAsync("forms","en", null)).ReturnsAsync(mockResponse);
var DocumentProvider = new DocumentsController(mockDocumentService.Object, mockUploadService.Object);
var result = (OkObjectResult)await DocumentProvider.GetDocumentsAsync();
var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object);
var result = (OkObjectResult)await DocumentProvider.GetDocumentsAsync("forms","en", null);
Assert.Equal(200, result.StatusCode);
}
[Fact(DisplayName = "Get active Documents - Ok case")]
public async Task GetActiveDocumentsAsync_ShouldReturnStatusCode200()
{
var mockDocumentService = new Mock<IDoculinkProvider>();
var mockUploadService = new Mock<IUploadService>();
var mockResponse = await MockData.getOkResponses();
mockDocumentService.Setup(service => service.GetdocumentsByLinkAsync("forms", "en", true)).ReturnsAsync(mockResponse);
var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object);
var result = (OkObjectResult)await DocumentProvider.GetDocumentsByActiveAsync("forms", "en");
Assert.Equal(200, result.StatusCode);
}
[Fact(DisplayName = "Get Documents - NoContent Case")]
public async Task GetDocumentsAsync_ShouldReturnStatusCode204()
[Fact(DisplayName = "Get active Documents by linktypeid - Ok case")]
public async Task GetActiveDocumentsLinkTypeIdAsync_ShouldReturnStatusCode200()
{
var mockDocumentService = new Mock<IDocumentsProvider>();
var mockDocumentService = new Mock<IDoculinkProvider>();
var mockUploadService = new Mock<IUploadService>();
var mockResponse = await MockData.getOkResponses();
mockDocumentService.Setup(service => service.GetdocumentsByLinkTypeIdAsync(null, "en", true)).ReturnsAsync(mockResponse);
var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object);
var result = (OkObjectResult)await DocumentProvider.GetDocumentsByActiveLinkTypeIdAsync(null, "en");
Assert.Equal(200, result.StatusCode);
}
[Fact(DisplayName = "Get active Documents by linktypeid - NoContent Case")]
public async Task GetDocumentsLinkTypeIdAsync_ShouldReturnStatusCode204()
{
var mockDocumentService = new Mock<IDoculinkProvider>();
var mockUploadService = new Mock<IUploadService>();
var mockResponse = await MockData.getNoContentResponse();
mockDocumentService.Setup(service => service.GetDocumnetsAsync()).ReturnsAsync(mockResponse);
mockDocumentService.Setup(service => service.GetdocumentsByLinkTypeIdAsync(null, "en", true)).ReturnsAsync(mockResponse);
var DocumentProvider = new DocumentsController(mockDocumentService.Object, mockUploadService.Object);
var result = (NoContentResult)await DocumentProvider.GetDocumentsAsync();
var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object);
var result = (NoContentResult)await DocumentProvider.GetDocumentsByActiveLinkTypeIdAsync(null, "");
Assert.Equal(204, result.StatusCode);
}
[Fact(DisplayName = "Get Document by Id - Ok case")]
public async Task GetDocumentAsync_ShouldReturnStatusCode200()
{
var mockDocumentService = new Mock<IDocumentsProvider>();
var mockDocumentService = new Mock<IDoculinkProvider>();
var mockUploadService = new Mock<IUploadService>();
var mockResponse = await MockData.getOkResponse(1);
mockDocumentService.Setup(service => service.GetDocumentAsync(1)).ReturnsAsync(mockResponse);
mockDocumentService.Setup(service => service.GetDocumentAsync(1,"forms","en")).ReturnsAsync(mockResponse);
var DocumentProvider = new DocumentsController(mockDocumentService.Object, mockUploadService.Object);
var result = (OkObjectResult)await DocumentProvider.GetDocumentAsync(1);
var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object);
var result = (OkObjectResult)await DocumentProvider.GetDocumentAsync(1, "forms", "en");
Assert.Equal(200, result.StatusCode);
}
@ -83,24 +108,24 @@ namespace DamageAssesment.Api.Documents.Test
[Fact(DisplayName = "Get Document by Id - NotFound case")]
public async Task GetDocumentAsync_ShouldReturnStatusCode404()
{
var mockDocumentService = new Mock<IDocumentsProvider>();
var mockDocumentService = new Mock<IDoculinkProvider>();
var mockUploadService = new Mock<IUploadService>();
var mockResponse = await MockData.getNotFoundResponse();
mockDocumentService.Setup(service => service.GetDocumentAsync(99)).ReturnsAsync(mockResponse);
var DocumentProvider = new DocumentsController(mockDocumentService.Object, mockUploadService.Object);
var result = (NotFoundResult)await DocumentProvider.GetDocumentAsync(99);
mockDocumentService.Setup(service => service.GetDocumentAsync(99, "forms", "en")).ReturnsAsync(mockResponse);
var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object);
var result = (NotFoundResult)await DocumentProvider.GetDocumentAsync(99, "forms", "en");
Assert.Equal(404, result.StatusCode);
}
[Fact(DisplayName = "Post Document - Ok case")]
public async Task PostDocumentAsync_ShouldReturnStatusCode200()
{
var mockDocumentService = new Mock<IDocumentsProvider>();
var mockDocumentService = new Mock<IDoculinkProvider>();
var mockUploadService = new Mock<IUploadService>();
var mockResponse = await MockData.getOkResponse(1);
var mockInputDocument = await MockData.getInputDocumentData();
var DocumentResponse = await MockData.GetDocumentsInfo(0);
var DocumentResponse = await MockData.GetDocuLinksInfo(0);
mockDocumentService.Setup(service => service.PostDocumentAsync(mockInputDocument)).ReturnsAsync(mockResponse);
var DocumentProvider = new DocumentsController(mockDocumentService.Object, mockUploadService.Object);
var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object);
var result = (NoContentResult)await DocumentProvider.CreateDocument(DocumentResponse);
Assert.Equal(204, result.StatusCode);
@ -109,13 +134,13 @@ namespace DamageAssesment.Api.Documents.Test
[Fact(DisplayName = "Post Document - BadRequest case")]
public async Task PostDocumentAsync_ShouldReturnStatusCode400()
{
var mockDocumentService = new Mock<IDocumentsProvider>();
var mockDocumentService = new Mock<IDoculinkProvider>();
var mockUploadService = new Mock<IUploadService>();
var mockInputDocument = await MockData.getInputDocumentData();
var mockResponse = await MockData.getBadRequestResponse();
DocumentInfo documentInfo = null;
ReqDoculink documentInfo = null;
mockDocumentService.Setup(service => service.PostDocumentAsync(mockInputDocument)).ReturnsAsync(mockResponse);
var DocumentProvider = new DocumentsController(mockDocumentService.Object, mockUploadService.Object);
var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object);
var result = (BadRequestObjectResult)await DocumentProvider.CreateDocument(documentInfo);
Assert.Equal(400, result.StatusCode);
@ -124,39 +149,39 @@ namespace DamageAssesment.Api.Documents.Test
[Fact(DisplayName = "Put Document - Ok case")]
public async Task PutDocumentAsync_ShouldReturnStatusCode200()
{
var mockDocumentService = new Mock<IDocumentsProvider>();
var mockDocumentService = new Mock<IDoculinkProvider>();
var mockUploadService = new Mock<IUploadService>();
var mockResponse = await MockData.getOkResponse(1);
var mockInputDocument = await MockData.getInputDocumentData();
var DocumentResponse = await MockData.GetDocumentsInfo(1);
mockDocumentService.Setup(service => service.UpdateDocumentAsync(mockInputDocument)).ReturnsAsync(mockResponse);
var DocumentProvider = new DocumentsController(mockDocumentService.Object, mockUploadService.Object);
var result = (NoContentResult)await DocumentProvider.UpdateDocument(DocumentResponse);
var DocumentResponse = await MockData.GetDocuLinksInfo(1);
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);
Assert.Equal(204, result.StatusCode);
Assert.Equal(404, result.StatusCode);
}
[Fact(DisplayName = "Put Document - BadRequest case")]
public async Task PutDocumentAsync_ShouldReturnStatusCode400()
{
var mockDocumentService = new Mock<IDocumentsProvider>();
var mockDocumentService = new Mock<IDoculinkProvider>();
var mockUploadService = new Mock<IUploadService>();
var mockResponse = await MockData.getBadRequestResponse();
var mockInputDocument = await MockData.getInputDocumentData();
mockDocumentService.Setup(service => service.UpdateDocumentAsync(mockInputDocument)).ReturnsAsync(mockResponse);
var DocumentProvider = new DocumentsController(mockDocumentService.Object, mockUploadService.Object);
var result = (BadRequestObjectResult)await DocumentProvider.UpdateDocument(null);
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);
Assert.Equal(400, result.StatusCode);
}
[Fact(DisplayName = "Delete Document - Ok case")]
public async Task DeleteDocumentAsync_ShouldReturnStatusCode200()
{
var mockDocumentService = new Mock<IDocumentsProvider>();
var mockDocumentService = new Mock<IDoculinkProvider>();
var mockUploadService = new Mock<IUploadService>();
var mockResponse = await MockData.getOkResponse(1);
mockDocumentService.Setup(service => service.DeleteDocumentAsync(1)).ReturnsAsync(mockResponse);
var DocumentProvider = new DocumentsController(mockDocumentService.Object, mockUploadService.Object);
var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object);
var result = (OkObjectResult)await DocumentProvider.DeleteDocument(1);
Assert.Equal(200, result.StatusCode);
@ -164,15 +189,37 @@ namespace DamageAssesment.Api.Documents.Test
[Fact(DisplayName = "Delete Document - NotFound case")]
public async Task DeleteDocumentAsync_ShouldReturnStatusCode404()
{
var mockDocumentService = new Mock<IDocumentsProvider>();
var mockDocumentService = new Mock<IDoculinkProvider>();
var mockUploadService = new Mock<IUploadService>();
var mockResponse = await MockData.getNotFoundResponse();
mockDocumentService.Setup(service => service.DeleteDocumentAsync(1)).ReturnsAsync(mockResponse);
var DocumentProvider = new DocumentsController(mockDocumentService.Object, mockUploadService.Object);
var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object);
var result = (NotFoundResult)await DocumentProvider.DeleteDocument(1);
Assert.Equal(404, result.StatusCode);
}
[Fact(DisplayName = "Update Document IsActive- Ok case")]
public async Task UpdateDocumentAsync_ShouldReturnStatusCode200()
{
var mockDocumentService = new Mock<IDoculinkProvider>();
var mockUploadService = new Mock<IUploadService>();
var mockResponse = await MockData.getOkResponse(1);
mockDocumentService.Setup(service => service.UpdateDocumentAsync(1,true)).ReturnsAsync(mockResponse);
var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object);
var result = (OkObjectResult)await DocumentProvider.UpdateIsActiveDocument(1,true);
Assert.Equal(200, result.StatusCode);
}
[Fact(DisplayName = "Update Document IsActive - NotFound case")]
public async Task UpdateDocumentAsync_ShouldReturnStatusCode404()
{
var mockDocumentService = new Mock<IDoculinkProvider>();
var mockUploadService = new Mock<IUploadService>();
var mockResponse = await MockData.getNotFoundResponse();
mockDocumentService.Setup(service => service.UpdateDocumentAsync(1,true)).ReturnsAsync(mockResponse);
var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object);
var result = (NotFoundResult)await DocumentProvider.UpdateIsActiveDocument(1,true);
Assert.Equal(404, result.StatusCode);
}
// Link Type Test cases
@ -180,12 +227,12 @@ namespace DamageAssesment.Api.Documents.Test
[Fact(DisplayName = "Get Link types - Ok case")]
public async Task GetDocumentCategoriesAsync_ShouldReturnStatusCode200()
{
var mockDocumentService = new Mock<IDocumentsProvider>();
var mockDocumentService = new Mock<IDoculinkProvider>();
var mockUploadService = new Mock<IUploadService>();
var mockResponse = await LinkTypeMockData.getOkResponse();
mockDocumentService.Setup(service => service.GetLinkTypesAsync()).ReturnsAsync(mockResponse);
var DocumentProvider = new DocumentsController(mockDocumentService.Object, mockUploadService.Object);
var result = (OkObjectResult)await DocumentProvider.GetLinkTypesAsync();
mockDocumentService.Setup(service => service.GetLinkTypesAsync("en")).ReturnsAsync(mockResponse);
var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object);
var result = (OkObjectResult)await DocumentProvider.GetLinkTypesAsync("en");
Assert.Equal(200, result.StatusCode);
}
@ -193,13 +240,13 @@ namespace DamageAssesment.Api.Documents.Test
[Fact(DisplayName = "Get Link types - NoContent Case")]
public async Task GetDocumentCategoriesAsync_ShouldReturnStatusCode204()
{
var mockDocumentService = new Mock<IDocumentsProvider>();
var mockDocumentService = new Mock<IDoculinkProvider>();
var mockUploadService = new Mock<IUploadService>();
var mockResponse = await LinkTypeMockData.getNoContentResponse();
mockDocumentService.Setup(service => service.GetLinkTypesAsync()).ReturnsAsync(mockResponse);
mockDocumentService.Setup(service => service.GetLinkTypesAsync("en")).ReturnsAsync(mockResponse);
var DocumentProvider = new DocumentsController(mockDocumentService.Object, mockUploadService.Object);
var result = (NoContentResult)await DocumentProvider.GetLinkTypesAsync();
var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object);
var result = (NoContentResult)await DocumentProvider.GetLinkTypesAsync("en");
Assert.Equal(204, result.StatusCode);
}
@ -207,12 +254,12 @@ namespace DamageAssesment.Api.Documents.Test
[Fact(DisplayName = "Get Link Type by Id - Ok case")]
public async Task GetDocumentcategoryAsync_ShouldReturnStatusCode200()
{
var mockDocumentService = new Mock<IDocumentsProvider>();
var mockDocumentService = new Mock<IDoculinkProvider>();
var mockUploadService = new Mock<IUploadService>();
var mockResponse = await LinkTypeMockData.getOkResponse(1);
mockDocumentService.Setup(service => service.GetLinkTypeAsync(1)).ReturnsAsync(mockResponse);
var DocumentProvider = new DocumentsController(mockDocumentService.Object, mockUploadService.Object);
var result = (OkObjectResult)await DocumentProvider.GetLinkTypeAsync(1);
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");
Assert.Equal(200, result.StatusCode);
}
@ -220,25 +267,25 @@ namespace DamageAssesment.Api.Documents.Test
[Fact(DisplayName = "Get Link Type by Id - NotFound case")]
public async Task GetDocumentcategoryAsync_ShouldReturnStatusCode404()
{
var mockDocumentService = new Mock<IDocumentsProvider>();
var mockDocumentService = new Mock<IDoculinkProvider>();
var mockUploadService = new Mock<IUploadService>();
var mockResponse = await LinkTypeMockData.getNotFoundResponse();
mockDocumentService.Setup(service => service.GetLinkTypeAsync(99)).ReturnsAsync(mockResponse);
mockDocumentService.Setup(service => service.GetLinkTypeAsync(99, "en")).ReturnsAsync(mockResponse);
var DocumentProvider = new DocumentsController(mockDocumentService.Object, mockUploadService.Object);
var result = (NotFoundResult)await DocumentProvider.GetLinkTypeAsync(99);
var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object);
var result = (NotFoundResult)await DocumentProvider.GetLinkTypeAsync(99, "en");
Assert.Equal(404, result.StatusCode);
}
[Fact(DisplayName = "Post Link Type - Ok case")]
public async Task PostDocumentcategoryAsync_ShouldReturnStatusCode200()
{
var mockDocumentService = new Mock<IDocumentsProvider>();
var mockDocumentService = new Mock<IDoculinkProvider>();
var mockUploadService = new Mock<IUploadService>();
var mockResponse = await LinkTypeMockData.getOkResponse(1);
var mockInputDocument = await LinkTypeMockData.getInputLinkData(0);
mockDocumentService.Setup(service => service.PostLinkTypeAsync(mockInputDocument)).ReturnsAsync(mockResponse);
var DocumentProvider = new DocumentsController(mockDocumentService.Object, mockUploadService.Object);
var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object);
var result = (OkObjectResult)await DocumentProvider.CreateLinkType(mockInputDocument);
Assert.Equal(200, result.StatusCode);
@ -247,12 +294,12 @@ namespace DamageAssesment.Api.Documents.Test
[Fact(DisplayName = "Post Link Type - BadRequest case")]
public async Task PostDocumentcategoryAsync_ShouldReturnStatusCode400()
{
var mockDocumentService = new Mock<IDocumentsProvider>();
var mockDocumentService = new Mock<IDoculinkProvider>();
var mockUploadService = new Mock<IUploadService>();
var mockInputDocument = await LinkTypeMockData.getInputLinkData(99);
var mockResponse = await LinkTypeMockData.getBadRequestResponse();
mockDocumentService.Setup(service => service.PostLinkTypeAsync(mockInputDocument)).ReturnsAsync(mockResponse);
var DocumentProvider = new DocumentsController(mockDocumentService.Object, mockUploadService.Object);
var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object);
var result = (BadRequestObjectResult)await DocumentProvider.CreateLinkType(mockInputDocument);
Assert.Equal(400, result.StatusCode);
@ -261,13 +308,13 @@ namespace DamageAssesment.Api.Documents.Test
[Fact(DisplayName = "Put Document - Ok case")]
public async Task PutDocumentcategoryAsync_ShouldReturnStatusCode200()
{
var mockDocumentService = new Mock<IDocumentsProvider>();
var mockDocumentService = new Mock<IDoculinkProvider>();
var mockUploadService = new Mock<IUploadService>();
var mockResponse = await LinkTypeMockData.getOkResponse(1);
var mockInputDocument = await LinkTypeMockData.getInputLinkData(1);
mockDocumentService.Setup(service => service.UpdateLinkTypeAsync(mockInputDocument)).ReturnsAsync(mockResponse);
var DocumentProvider = new DocumentsController(mockDocumentService.Object, mockUploadService.Object);
var result = (OkObjectResult)await DocumentProvider.UpdateLinkType(mockInputDocument);
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);
Assert.Equal(200, result.StatusCode);
}
@ -275,13 +322,13 @@ namespace DamageAssesment.Api.Documents.Test
[Fact(DisplayName = "Put Document - NotFound case")]
public async Task PutDocumentcategoryAsync_ShouldReturnStatusCode404()
{
var mockDocumentService = new Mock<IDocumentsProvider>();
var mockDocumentService = new Mock<IDoculinkProvider>();
var mockUploadService = new Mock<IUploadService>();
var mockResponse = await LinkTypeMockData.getNotFoundResponse();
var mockInputDocument = await LinkTypeMockData.getInputLinkData(99);
mockDocumentService.Setup(service => service.UpdateLinkTypeAsync(mockInputDocument)).ReturnsAsync(mockResponse);
var DocumentProvider = new DocumentsController(mockDocumentService.Object, mockUploadService.Object);
var result = (NotFoundObjectResult)await DocumentProvider.UpdateLinkType(mockInputDocument);
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);
Assert.Equal(404, result.StatusCode);
}
@ -289,13 +336,13 @@ namespace DamageAssesment.Api.Documents.Test
[Fact(DisplayName = "Put Document - BadRequest case")]
public async Task PutDocumentcategoryAsync_ShouldReturnStatusCode400()
{
var mockDocumentService = new Mock<IDocumentsProvider>();
var mockDocumentService = new Mock<IDoculinkProvider>();
var mockUploadService = new Mock<IUploadService>();
var mockResponse = await LinkTypeMockData.getBadRequestResponse();
var mockInputDocument = await LinkTypeMockData.getInputLinkData(1);
mockDocumentService.Setup(service => service.UpdateLinkTypeAsync(mockInputDocument)).ReturnsAsync(mockResponse);
var DocumentProvider = new DocumentsController(mockDocumentService.Object, mockUploadService.Object);
var result = (BadRequestObjectResult)await DocumentProvider.UpdateLinkType(mockInputDocument);
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);
Assert.Equal(400, result.StatusCode);
}
@ -303,12 +350,12 @@ namespace DamageAssesment.Api.Documents.Test
[Fact(DisplayName = "Delete Document - Ok case")]
public async Task DeleteDocumentcategoryAsync_ShouldReturnStatusCode200()
{
var mockDocumentService = new Mock<IDocumentsProvider>();
var mockDocumentService = new Mock<IDoculinkProvider>();
var mockUploadService = new Mock<IUploadService>();
var mockResponse = await LinkTypeMockData.getOkResponse(1);
mockDocumentService.Setup(service => service.DeleteLinkTypeAsync(1)).ReturnsAsync(mockResponse);
var DocumentProvider = new DocumentsController(mockDocumentService.Object, mockUploadService.Object);
var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object);
var result = (OkObjectResult)await DocumentProvider.DeleteLinkType(1);
Assert.Equal(200, result.StatusCode);
@ -316,12 +363,12 @@ namespace DamageAssesment.Api.Documents.Test
[Fact(DisplayName = "Delete Document - NotFound case")]
public async Task DeleteDocumentcategoryAsync_ShouldReturnStatusCode404()
{
var mockDocumentService = new Mock<IDocumentsProvider>();
var mockDocumentService = new Mock<IDoculinkProvider>();
var mockUploadService = new Mock<IUploadService>();
var mockResponse = await LinkTypeMockData.getNotFoundResponse();
mockDocumentService.Setup(service => service.DeleteLinkTypeAsync(1)).ReturnsAsync(mockResponse);
var DocumentProvider = new DocumentsController(mockDocumentService.Object, mockUploadService.Object);
var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object);
var result = (NotFoundResult)await DocumentProvider.DeleteLinkType(99);
Assert.Equal(404, result.StatusCode);

View File

@ -0,0 +1,71 @@
using DamageAssesment.Api.DocuLinks.Db;
using DamageAssesment.Api.DocuLinks.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Mail;
using System.Text;
using System.Threading.Tasks;
namespace DamageAssesment.Api.DocuLinks.Test
{
public class LinkTypeMockData
{
public static async Task<(bool, List<DocuLinks.Models.ResLinkType>, string)> getOkResponse()
{
List<DocuLinks.Models.ResLinkType> list = new List<DocuLinks.Models.ResLinkType>();
Dictionary<string, string> dictdesc = new Dictionary<string, string>();
dictdesc.Add("en", "test"); dictdesc.Add("fr", "tester");
for (int i = 1; i < 4; i++)
{
list.Add(new DocuLinks.Models.ResLinkType()
{
Id = i,
titles= dictdesc,
CustomOrder=i,
IsActive = true
});
}
return (true, list, null);
}
public static async Task<(bool, DocuLinks.Models.ResLinkType, string)> getOkResponse(int Id)
{
var DocuLinks = await getOkResponse();
var Document = DocuLinks.Item2.FirstOrDefault(s => s.Id == Id);
return (true, Document, null);
}
public static async Task<(bool, DocuLinks.Models.ResLinkType, string)> getBadRequestResponse()
{
return (false, null, "Bad Request");
}
public static async Task<(bool, DocuLinks.Models.ResLinkType, string)> getNotFoundResponse()
{
return (false, null, "Not Found");
}
public static async Task<(bool, IEnumerable<DocuLinks.Models.ResLinkType>, string)> getNoContentResponse()
{
IEnumerable<DocuLinks.Models.ResLinkType> list = new List<DocuLinks.Models.ResLinkType>();
return (false, list, null);
}
public static async Task<DocuLinks.Models.LinkType> getInputLinkData(int id)
{
List<Models.LinksTranslation> DocuLinksTranslations = new List<Models.LinksTranslation>();
DocuLinksTranslations.Add(new Models.LinksTranslation()
{
Language = "en",
TypeText = "tel"
});
return new Models.LinkType
{
Id = id,
linksTranslations = DocuLinksTranslations,
CustomOrder=1,
IsActive = true
};
}
}
}

View File

@ -0,0 +1,188 @@
using DamageAssesment.Api.DocuLinks.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Mail;
using System.Text;
using System.Threading.Tasks;
namespace DamageAssesment.Api.DocuLinks.Test
{
public class MockData
{
public static async Task<(bool, List<DocuLinks.Models.ResDoculink>, string)> getOkResponses()
{
List<DocuLinks.Models.ResDoculink> list = new List<DocuLinks.Models.ResDoculink>();
for (int i = 1; i < 4; i++)
{
Dictionary<string, string> dicttitle = new Dictionary<string, string>();
Dictionary<string, string> dictdesc = new Dictionary<string, string>();
dicttitle.Add("en", "test"); dicttitle.Add("fr", "tester");
dictdesc.Add("en", "test"); dictdesc.Add("fr", "tester");
List<DoculinkTranslation> DocuLinksTranslations = new List<DoculinkTranslation>();
DocuLinksTranslations.Add(new DoculinkTranslation()
{
Language = "en",
title = "tel"+i,
description = "Sample"+i
});
List<DoculinkAttachments> doclinksAttachments = new List<DoculinkAttachments>();
doclinksAttachments.Add(new DoculinkAttachments()
{
docName = "",Path="www.google.com",
Language = "en",
IsAttachments =false,CustomOrder=1
});
list.Add(new DocuLinks.Models.ResDoculink()
{
Id = i,
linkTypeId = i,
IsActive = true,
titles= dicttitle,
description=dictdesc,
CustomOrder=i,
doclinksAttachments= doclinksAttachments
});
}
// List<ResDoculinks> doculinks = list.GroupBy(a => a.linkTypeId).Select(a => new ResDoculinks() { linkTypeId = a.Key, doculinks = a.ToList() }).ToList();
return (true, list, null);
}
public static async Task<(bool, List<DocuLinks.Models.ResDoculink>, string)> getOkResponse()
{
List<DocuLinks.Models.ResDoculink> list = new List<DocuLinks.Models.ResDoculink>();
for (int i = 1; i < 4; i++)
{
Dictionary<string, string> dicttitle = new Dictionary<string, string>();
Dictionary<string, string> dictdesc = new Dictionary<string, string>();
dicttitle.Add("en", "test"); dicttitle.Add("fr", "tester");
dictdesc.Add("en", "test"); dictdesc.Add("fr", "tester");
List<DoculinkTranslation> DocuLinksTranslations = new List<DoculinkTranslation>();
DocuLinksTranslations.Add(new DoculinkTranslation()
{
Language = "en",
title = "tel" + i,
description = "Sample" + i
});
List<DoculinkAttachments> doclinksAttachments = new List<DoculinkAttachments>();
doclinksAttachments.Add(new DoculinkAttachments()
{
docName = "",
Path = "www.google.com",
IsAttachments = false,
Language = "en",
CustomOrder = 1
});
list.Add(new DocuLinks.Models.ResDoculink()
{
Id = i,
linkTypeId = i,
IsActive = true,
titles = dicttitle,
description = dictdesc,
CustomOrder = i,
doclinksAttachments = doclinksAttachments
});
}
return (true, list, null);
}
public static async Task<(bool, DocuLinks.Models.ResDoculink, string)> getOkResponse(int Id)
{
var DocuLinks = await getOkResponse();
var Document = DocuLinks.Item2.FirstOrDefault(s => s.Id == Id);
return (true, Document, null);
}
public static async Task<(bool, DocuLinks.Models.ResDoculink, string)> getBadRequestResponse()
{
return (false, null, "Bad Request");
}
public static async Task<(bool, DocuLinks.Models.ResDoculink, string)> getNotFoundResponse()
{
return (false, null, "Not Found");
}
public static async Task<(bool, IEnumerable<DocuLinks.Models.ResDoculinks>, string)> getNoContentResponses()
{
IEnumerable<DocuLinks.Models.ResDoculinks> list = new List<DocuLinks.Models.ResDoculinks>();
return (false, list, null);
}
public static async Task<(bool, IEnumerable<DocuLinks.Models.ResDoculink>, string)> getNoContentResponse()
{
IEnumerable<DocuLinks.Models.ResDoculink> list = new List<DocuLinks.Models.ResDoculink>();
return (false, list, null);
}
public static async Task<DocuLinks.Models.ReqDoculink> GetDocuLinksInfo(int id)
{
List<FileModel> fileModels = new List<FileModel>();
fileModels.Add( new FileModel() { FileName = "Sample", FileContent = "c2FtcGxl", FileExtension = ".txt",IsAttachments=true,CustomOrder=1 });
return new ReqDoculink() { Id=id, linkTypeId = 1, CustomOrder = 1, Files = fileModels };
}
public static async Task<DocuLinks.Models.Doculink> getInputDocumentData()
{
List<DoculinkTranslation> DocuLinksTranslations = new List<DoculinkTranslation>();
DocuLinksTranslations.Add(new DoculinkTranslation()
{
Language = "en",
title = "tel",
description = "Sample"
});
List<DoculinkAttachments> doclinksAttachments = new List<DoculinkAttachments>();
doclinksAttachments.Add(new DoculinkAttachments()
{
docName = "",
Path = "www.google.com",
IsAttachments = false,
Language = "en",
CustomOrder = 1
});
return new Models.Doculink
{
Id = 1,
linkTypeId = 1,
IsActive = true,
CustomOrder=1,
documentsTranslations = DocuLinksTranslations,
doclinksAttachments= doclinksAttachments
};
}
public static async Task<List<DocuLinks.Models.Doculink>> getInputDocuLinksData()
{
List<DoculinkTranslation> DocuLinksTranslations = new List<DoculinkTranslation>();
DocuLinksTranslations.Add(new DoculinkTranslation()
{
Language = "en",
title = "tel",
description = "Sample"
});
List<DoculinkAttachments> doclinksAttachments = new List<DoculinkAttachments>();
doclinksAttachments.Add(new DoculinkAttachments()
{
docName = "",
Path = "www.google.com",
IsAttachments = false,
Language = "en",
CustomOrder = 1
});
List<DocuLinks.Models.Doculink> DocuLinks = new List<Models.Doculink>();
DocuLinks.Add(new Models.Doculink
{
Id = 1,
linkTypeId = 1,
IsActive = true,
CustomOrder = 1,
documentsTranslations = DocuLinksTranslations,
doclinksAttachments = doclinksAttachments
});
return DocuLinks;
}
}
}

View File

@ -0,0 +1,332 @@
using DamageAssesment.Api.DocuLinks.Db;
using DamageAssesment.Api.DocuLinks.Interfaces;
using DamageAssesment.Api.DocuLinks.Models;
using DamageAssesment.Api.DocuLinks.Providers;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
namespace DamageAssesment.Api.DocuLinks.Controllers
{
[ApiController]
public class DoculinkController : ControllerBase
{
private readonly IDoculinkProvider documentsProvider;
private readonly IUploadService uploadService;
public DoculinkController(IDoculinkProvider documentsProvider, IUploadService uploadService)
{
this.documentsProvider = documentsProvider;
this.uploadService = uploadService;
}
/// <summary>
/// Get all Doculink type.
/// </summary>
[HttpGet]
[Route("doculinks/types")]
[Route("doculinks/types/{language:alpha}")]
public async Task<IActionResult> GetLinkTypesAsync(string? language)
{
var result = await this.documentsProvider.GetLinkTypesAsync(language);
if (result.IsSuccess)
{
return Ok(result.LinkTypes);
}
return NoContent();
}
/// <summary>
/// Get a Doculink type by id.
/// </summary>
[HttpGet]
[Route("doculinks/types/{id}")]
[Route("doculinks/types/{id}/{language:alpha}")]
public async Task<IActionResult> GetLinkTypeAsync(int id, string? language)
{
var result = await this.documentsProvider.GetLinkTypeAsync(id, language);
if (result.IsSuccess)
{
return Ok(result.LinkType);
}
return NotFound();
}
/// <summary>
/// Update a existing Doculink type.
/// </summary>
[HttpPut]
[Route("doculinks/types/{id}")]
public async Task<IActionResult> UpdateLinkType(int id, Models.LinkType linkType)
{
if (linkType != null)
{
var result = await this.documentsProvider.UpdateLinkTypeAsync(id, linkType);
if (result.IsSuccess)
{
return Ok(result.LinkType);
}
if (result.ErrorMessage == "Not Found")
return NotFound(result.ErrorMessage);
return BadRequest(result.ErrorMessage);
}
return CreatedAtRoute("DefaultApi", new { id = linkType.Id }, linkType);
}
/// <summary>
/// Create a new Doculink type.
/// </summary>
[HttpPost]
[Route("doculinks/types")]
public async Task<IActionResult> CreateLinkType(Models.LinkType linkType)
{
if (linkType != null)
{
var result = await this.documentsProvider.PostLinkTypeAsync(linkType);
if (result.IsSuccess)
{
return Ok(result.LinkType);
}
return BadRequest(result.ErrorMessage);
}
return CreatedAtRoute("DefaultApi", new { id = linkType.Id }, linkType);
}
/// <summary>
/// Delete a existing Doculink type by id.
/// </summary>
[HttpDelete]
[Route("doculinks/types/{id}")]
public async Task<IActionResult> DeleteLinkType(int id)
{
var result = await this.documentsProvider.DeleteLinkTypeAsync(id);
if (result.IsSuccess)
{
return Ok(result.LinkType);
}
return NotFound();
}
/// <summary>
/// download an existing attachment.
/// </summary>
[HttpGet("doculinks/download/{id}")]
public async Task<IActionResult> downloadfile(int id)
{
try
{
var result = await this.documentsProvider.GetDownloadAttachmentAsync(id);
if (!result.IsSuccess)
return NotFound();
string path = await uploadService.GetFile(result.DoculinkAttachments.Path);
if (path == null)
return NotFound();
var contentType = GetContentType(result.DoculinkAttachments.docName);
if (contentType == "application/octet-stream")
return PhysicalFile(path, contentType, result.DoculinkAttachments.docName);
return PhysicalFile(path, contentType, enableRangeProcessing: true);
}
catch (Exception ex)
{
// Handle the exception here or log it
return StatusCode(500, "An error occurred: " + ex.Message);
}
//try
//{
// var result = await this.documentsProvider.GetDownloadAttachmentAsync(id);
// if (!result.IsSuccess)
// return NotFound();
// byte[] fileContent = await uploadService.DownloadFile(result.DoculinkAttachments.Path);
// if (fileContent == null || fileContent.Length == 0)
// return NotFound();
// var contentType = "application/octet-stream";
// return File(fileContent, contentType, result.DoculinkAttachments.docName);
//}
//catch (Exception ex)
//{
// // Handle the exception here or log it
// return StatusCode(500, "An error occurred: " + ex.Message);
//}
}
private string GetContentType(string fileName)
{
// You can add more content types based on the file extensions
switch (Path.GetExtension(fileName).ToLower())
{
//case ".txt":
// return "text/plain";
case ".jpg":
case ".jpeg":
return "image/jpeg";
case ".png":
return "image/png";
case ".gif":
return "image/gif";
case ".bmp":
return "image/bmp";
case ".webp":
return "image/webp";
case ".csv":
return "text/csv";
case ".pdf":
return "application/pdf";
case ".docx":
case ".doc":
return "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
case ".xlsx":
case ".xls":
return "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
// Add more cases as needed
default:
return "application/octet-stream";
}
}
/// <summary>
/// Get all Doculink.
/// </summary>
///
[Route("doculinks")]
[Route("doculinks/{linktype:alpha}")]
[Route("doculinks/{linktype:alpha}/{language:alpha}")]
[HttpGet]
public async Task<IActionResult> GetDocumentsAsync(string? linktype, string? language, bool? isactive)
{
var result = await this.documentsProvider.GetdocumentsByLinkAsync(linktype, language, isactive);
if (result.IsSuccess)
{
return Ok(result.documents);
}
return NoContent();
}
/// <summary>
/// Get all active Doculink.
/// </summary>
[Route("doculinks/active")]
[Route("doculinks/active/{linktype:alpha}")]
[Route("doculinks/active/{linktype:alpha}/{language:alpha}")]
[HttpGet]
public async Task<IActionResult> GetDocumentsByActiveAsync(string? linktype, string? language)
{
var result = await this.documentsProvider.GetdocumentsByLinkAsync(linktype, language, true);
if (result.IsSuccess)
{
return Ok(result.documents);
}
return NoContent();
}
/// <summary>
/// Get all active Doculink.
/// </summary>
[Route("doculinks/active/{linktypeid:int}")]
[Route("doculinks/active/{linktypeid:int}/{language:alpha}")]
[HttpGet]
public async Task<IActionResult> GetDocumentsByActiveLinkTypeIdAsync(int? linktypeid, string? language)
{
var result = await this.documentsProvider.GetdocumentsByLinkTypeIdAsync(linktypeid, language, true);
if (result.IsSuccess)
{
return Ok(result.documents);
}
return NoContent();
}
/// <summary>
/// Get a Doculink by id.
/// </summary>
[HttpGet]
[Route("doculinks/{id}")]
[Route("doculinks/{id}/{linktype:alpha}")]
[Route("doculinks/{id}/{linktype:alpha}/{language:alpha}")]
public async Task<IActionResult> GetDocumentAsync(int id, string? linktype, string? language)
{
var result = await this.documentsProvider.GetDocumentAsync(id, linktype, language);
if (result.IsSuccess)
{
return Ok(result.Document);
}
return NotFound();
}
/// <summary>
/// update existing doclink.
/// </summary>
[HttpPut]
[Route("doculinks/{id}")]
public async Task<IActionResult> UpdateDocument(int id, ReqDoculink documentInfo)
{
if (documentInfo != null)
{
var dbdoc = await this.documentsProvider.GetDocumentByidAsync(id);
if (dbdoc.IsSuccess)
{
var documents = await this.documentsProvider.GetDocumentCounter();
Models.Doculink DocuLink = uploadService.UpdateDocuments(documents.counter, dbdoc.Document, documentInfo);
var result = await this.documentsProvider.UpdateDocumentAsync(id, DocuLink);
if (result.IsSuccess)
{
return Ok(result.Document);
}
return NoContent();
}
return NotFound();
}
return BadRequest(documentInfo);
}
/// <summary>
/// update existing doclink isactive field.
/// </summary>
[HttpPut]
[Route("doculinks/{id}/{isactive}")]
public async Task<IActionResult> UpdateIsActiveDocument(int id, bool isactive)
{
var result = await this.documentsProvider.UpdateDocumentAsync(id, isactive);
if (result.IsSuccess)
{
return Ok(result.Document);
}
return NotFound();
}
/// <summary>
/// Create new doclink.
/// </summary>
[HttpPost]
[Route("doculinks")]
public async Task<IActionResult> CreateDocument(ReqDoculink documentInfo)
{
try
{
if (documentInfo != null)
{
var documents = await this.documentsProvider.GetDocumentCounter();
Models.Doculink DocuLink = uploadService.UploadDocument(documents.counter, documentInfo);
var result = await this.documentsProvider.PostDocumentAsync(DocuLink);
if (result.IsSuccess)
{
return Ok(result.Document);
}
return NoContent();
}
return BadRequest(documentInfo);
}
catch (Exception ex)
{
return BadRequest($"Internal server error: {ex}");
}
}
/// <summary>
/// Delete Doculink by id.
/// </summary>
[HttpDelete]
[Route("doculinks/{id}")]
public async Task<IActionResult> DeleteDocument(int id)
{
// database soft delete
var result = await this.documentsProvider.DeleteDocumentAsync(id);
if (result.IsSuccess)
{
// deleting file from folder
foreach (var item in result.Document.doclinksAttachments)
{
uploadService.Movefile(item.Path);
}
return Ok(result.Document);
}
return NotFound();
}
}
}

View File

@ -4,6 +4,7 @@
<TargetFramework>net6.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<GenerateDocumentationFile>True</GenerateDocumentationFile>
</PropertyGroup>
<ItemGroup>
@ -24,8 +25,4 @@
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" />
</ItemGroup>
<ItemGroup>
<Folder Include="DASA_Documents\" />
</ItemGroup>
</Project>

View File

@ -1,22 +1,22 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace DamageAssesment.Api.Documents.Db
namespace DamageAssesment.Api.DocuLinks.Db
{
public class Document
[Table("Doculinks")]
public class Doculink
{
[Key]
public int Id { get; set; }
[ForeignKey("LinkType")]
public int linkTypeId { get; set; }
public string docName { get; set; }
public string url { get; set; }
public string Path { get; set; }
public bool IsActive { get; set; }
public bool IsDeleted { get; set; }
public int CustomOrder { get; set; }
//public bool IsAttachments { get; set; }
//public bool IsUrl { get; set; }
public DateTime dateCreated { get; set; }
public DateTime dateUpdated { get; set; }
}
}

View File

@ -0,0 +1,20 @@
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;
namespace DamageAssesment.Api.DocuLinks.Db
{
[Table("DoculinkAttachments")]
public class DoculinkAttachments
{
[Key]
public int Id { get; set; }
[ForeignKey("Document")]
public int DocumentId { get; set; }
public string docName { get; set; }
public string Path { get; set; }
public bool IsAttachments { get; set; }
public int CustomOrder { get; set; }
public string Language { get; set; }
}
}

View File

@ -0,0 +1,38 @@
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using System.ComponentModel.DataAnnotations;
namespace DamageAssesment.Api.DocuLinks.Db
{
public class DoculinkDbContext : DbContext
{
public DoculinkDbContext(DbContextOptions options) : base(options)
{
}
public DbSet<Db.Doculink> Documents { get; set; }
public DbSet<Db.LinkType> LinkTypes { get; set; }
public DbSet<Db.DoculinkTranslation> DocumentsTranslations { get; set; }
public DbSet<Db.LinksTranslation> LinksTranslations { get; set; }
public DbSet<Db.DoculinkAttachments> DoclinksAttachments { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Doculink>()
.Property(item => item.Id)
.ValueGeneratedOnAdd();
modelBuilder.Entity<LinkType>()
.Property(item => item.Id)
.ValueGeneratedOnAdd();
modelBuilder.Entity<DoculinkTranslation>()
.Property(item => item.Id)
.ValueGeneratedOnAdd();
modelBuilder.Entity<LinksTranslation>()
.Property(item => item.Id)
.ValueGeneratedOnAdd();
modelBuilder.Entity<DoculinkAttachments>()
.Property(item => item.Id)
.ValueGeneratedOnAdd();
}
}
}

View File

@ -1,9 +1,10 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace DamageAssesment.Api.Documents.Db
namespace DamageAssesment.Api.DocuLinks.Db
{
public class DocumentsTranslation
[Table("DoculinkTrans")]
public class DoculinkTranslation
{
[Key]
public int Id { get; set; }

View File

@ -1,13 +1,14 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace DamageAssesment.Api.Documents.Db
namespace DamageAssesment.Api.DocuLinks.Db
{
[Table("DoculinkTypes")]
public class LinkType
{
[Key]
public int Id { get; set; }
public string TypeText { get; set; }
public bool IsActive { get; set; }
public bool IsAttachment { get; set; }
public int CustomOrder { get; set; }
}
}

View File

@ -0,0 +1,16 @@
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;
namespace DamageAssesment.Api.DocuLinks.Db
{
[Table("DoculinkTypeTrans")]
public class LinksTranslation
{
[Key]
public int Id { get; set; }
[ForeignKey("LinkType")]
public int LinkTypeId { get; set; }
public string TypeText { get; set; }
public string Language { get; set; }
}
}

View File

@ -1,6 +1,6 @@
using Azure.Storage.Blobs.Models;
namespace DamageAssesment.Api.Documents.Interfaces
namespace DamageAssesment.Api.DocuLinks.Interfaces
{
public interface IAzureBlobService
{

View File

@ -0,0 +1,21 @@
using DamageAssesment.Api.DocuLinks.Models;
namespace DamageAssesment.Api.DocuLinks.Interfaces
{
public interface IDoculinkProvider : ILinkTypesProvider
{
Task<(bool IsSuccess, Models.ResDoculink Document, string ErrorMessage)> GetDocumentAsync(int id, string? linktype, string? language);
Task<(bool IsSuccess, Models.Doculink Document, string ErrorMessage)> GetDocumentByidAsync(int id);
// Task<(bool IsSuccess, IEnumerable<Models.ResDoculink> documents, string ErrorMessage)> GetDocumnetsAsync(string? language);
Task<(bool IsSuccess, IEnumerable<Models.ResDoculink> documents, string ErrorMessage)> GetdocumentsByLinkAsync(string? linkType, string? language, bool? isactive);
Task<(bool IsSuccess, IEnumerable<Models.ResDoculink> documents, string ErrorMessage)> GetdocumentsByLinkTypeIdAsync(int? linkTypeId, string? language, bool? isactive);
Task<(bool IsSuccess, Models.ResDoculink Document, string ErrorMessage)> PostDocumentAsync(Models.Doculink Document);
Task<(bool IsSuccess, Models.ResDoculink Document, string ErrorMessage)> UpdateDocumentAsync(int id, Models.Doculink Document);
Task<(bool IsSuccess, Models.ResDoculink Document, string ErrorMessage)> UpdateDocumentAsync(int id, bool isactive);
Task<(bool IsSuccess, Models.ResDoculink Document, string ErrorMessage)> DeleteDocumentAsync(int id);
Task<(bool IsSuccess, Models.DoculinkAttachments DoculinkAttachments, string Path)> GetDownloadAttachmentAsync(int id);
Task<(bool IsSuccess, int counter, string message)> GetDocumentCounter();
}
}

View File

@ -0,0 +1,11 @@
namespace DamageAssesment.Api.DocuLinks.Interfaces
{
public interface ILinkTypesProvider
{
Task<(bool IsSuccess, Models.ResLinkType LinkType, string ErrorMessage)> GetLinkTypeAsync(int id,string? language);
Task<(bool IsSuccess, IEnumerable<Models.ResLinkType> LinkTypes, string ErrorMessage)> GetLinkTypesAsync(string? language);
Task<(bool IsSuccess, Models.ResLinkType LinkType, string ErrorMessage)> PostLinkTypeAsync(Models.LinkType LinkType);
Task<(bool IsSuccess, Models.ResLinkType LinkType, string ErrorMessage)> UpdateLinkTypeAsync(int id,Models.LinkType LinkType);
Task<(bool IsSuccess, Models.ResLinkType LinkType, string ErrorMessage)> DeleteLinkTypeAsync(int id);
}
}

View File

@ -0,0 +1,14 @@
using DamageAssesment.Api.DocuLinks.Models;
namespace DamageAssesment.Api.DocuLinks.Interfaces
{
public interface IUploadService
{
Models.Doculink UploadDocument( int counter, ReqDoculink documentInfo);
public Models.Doculink UpdateDocuments(int counter, Models.Doculink document, ReqDoculink documentInfo);
void Deletefile(string path);
Task<byte[]> DownloadFile(string path);
Task<string> GetFile(string path);
void Movefile(string path);
}
}

View File

@ -0,0 +1,30 @@
using DamageAssesment.Api.DocuLinks.Models;
using System.ComponentModel.DataAnnotations;
namespace DamageAssesment.Api.DocuLinks.Models
{
public class Doculink : BaseDoculink
{
public List<DoculinkTranslation> documentsTranslations { get; set; }
}
public class ResDoculinks
{
public int linkTypeId { get; set; }
public List<ResDoculink> doculinks { get; set; }
}
public class ResDoculink:BaseDoculink
{
public object titles { get; set; }
public object description { get; set; }
public object linktypes { get; set; }
}
public class BaseDoculink
{
public int Id { get; set; }
public int linkTypeId { get; set; }
public bool IsActive { get; set; }
public bool IsDeleted { get; set; }
public List<DoculinkAttachments> doclinksAttachments { get; set; }
public int CustomOrder { get; set; }
}
}

View File

@ -0,0 +1,14 @@
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;
namespace DamageAssesment.Api.DocuLinks.Models
{
public class DoculinkAttachments
{
public string docName { get; set; }
public string Path { get; set; }
public bool IsAttachments { get; set; }
public string Language { get; set; }
public int CustomOrder { get; set; }
}
}

View File

@ -1,9 +1,9 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace DamageAssesment.Api.Documents.Models
namespace DamageAssesment.Api.DocuLinks.Models
{
public class DocumentsTranslation
public class DoculinkTranslation
{
public string title { get; set; }
public string description { get; set; }

View File

@ -0,0 +1,20 @@
using System.ComponentModel.DataAnnotations;
namespace DamageAssesment.Api.DocuLinks.Models
{
public class LinkType : BaseLinkType
{
public List<LinksTranslation> linksTranslations { get; set; }
}
public class BaseLinkType
{
public int Id { get; set; }
public bool IsActive { get; set; }
public int CustomOrder { get; set; }
}
public class ResLinkType : BaseLinkType
{
public object titles { get; set; }
}
}

View File

@ -0,0 +1,11 @@
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;
namespace DamageAssesment.Api.DocuLinks.Models
{
public class LinksTranslation
{
public string TypeText { get; set; }
public string Language { get; set; }
}
}

View File

@ -0,0 +1,24 @@
using System.ComponentModel.DataAnnotations.Schema;
namespace DamageAssesment.Api.DocuLinks.Models
{
public class ReqDoculink
{
public int Id { get; set; }
public int linkTypeId { get; set; }
public List<DoculinkTranslation> documentsTranslations { get; set; }
public bool IsActive { get; set; }
public int CustomOrder { get; set; }
public List<FileModel>? Files { get; set; }
}
public class FileModel
{
public string? FileName { get; set; }
public string? FileContent { get; set; }
public string? FileExtension { get; set; }
public int CustomOrder { get; set; }
public string url { get;set; }
public bool IsAttachments { get; set; }
public string Language { get; set; }
}
}

View File

@ -0,0 +1,22 @@
using AutoMapper;
namespace DamageAssesment.Api.DocuLinks.Profiles
{
public class DoculinkProfile : AutoMapper.Profile
{
public DoculinkProfile()
{
CreateMap<Db.Doculink, Models.ResDoculink>() ;
CreateMap<Db.Doculink, Models.Doculink>();
CreateMap<Models.Doculink, Db.Doculink>();
CreateMap<Db.LinkType, Models.ResLinkType>();
CreateMap<Models.LinkType, Db.LinkType>();
CreateMap<Db.DoculinkTranslation, Models.DoculinkTranslation>();
CreateMap<Models.DoculinkTranslation, Db.DoculinkTranslation>();
CreateMap<Db.LinksTranslation, Models.LinksTranslation>();
CreateMap<Models.LinksTranslation, Db.LinksTranslation>();
CreateMap<Db.DoculinkAttachments, Models.DoculinkAttachments>();
CreateMap<Models.DoculinkAttachments, Db.DoculinkAttachments>();
}
}
}

View File

@ -1,21 +1,30 @@
using DamageAssesment.Api.Documents.Db;
using DamageAssesment.Api.Documents.Interfaces;
using DamageAssesment.Api.Documents.Providers;
using DamageAssesment.Api.DocuLinks.Db;
using DamageAssesment.Api.DocuLinks.Interfaces;
using DamageAssesment.Api.DocuLinks.Providers;
using Microsoft.EntityFrameworkCore;
using System.Reflection;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers();
builder.Services.AddSwaggerGen(c =>
{
// Include XML comments from your assembly
var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
c.IncludeXmlComments(xmlPath);
});
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
builder.Services.AddScoped<IDocumentsProvider, documentsProvider>();
builder.Services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
builder.Services.AddScoped<IDoculinkProvider, DoculinkProvider>();
builder.Services.AddScoped<IUploadService, UploadService>();
builder.Services.AddScoped<IAzureBlobService, AzureBlobService>();
builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies()); //4/30
builder.Services.AddDbContext<DocumentDbContext>(option =>
builder.Services.AddDbContext<DoculinkDbContext>(option =>
{
option.UseInMemoryDatabase("DocumentConnection");
});

View File

@ -2,9 +2,9 @@
using Azure.Storage.Blobs;
using Azure.Storage.Blobs.Models;
using Azure.Storage.Blobs.Specialized;
using DamageAssesment.Api.Documents.Interfaces;
using DamageAssesment.Api.DocuLinks.Interfaces;
namespace DamageAssesment.Api.Documents.Providers
namespace DamageAssesment.Api.DocuLinks.Providers
{
public class AzureBlobService: IAzureBlobService
{

View File

@ -0,0 +1,674 @@
using AutoMapper;
using DamageAssesment.Api.DocuLinks.Db;
using DamageAssesment.Api.DocuLinks.Interfaces;
using DamageAssesment.Api.DocuLinks.Models;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Internal;
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Diagnostics.Eventing.Reader;
using System.Reflection.Metadata;
using System.Runtime.CompilerServices;
using System.Xml;
using System.Xml.Linq;
namespace DamageAssesment.Api.DocuLinks.Providers
{
public class DoculinkProvider : IDoculinkProvider
{
private DoculinkDbContext DocumentDbContext;
private ILogger<DoculinkProvider> logger;
private IUploadService uploadservice;
private IMapper mapper;
private readonly IHttpContextAccessor httpContextAccessor;
private string baseUrl;
public DoculinkProvider(DoculinkDbContext DocumentDbContext, ILogger<DoculinkProvider> logger, IMapper mapper, IUploadService uploadservice, IHttpContextAccessor httpContextAccessor)
{
this.DocumentDbContext = DocumentDbContext;
this.logger = logger;
this.mapper = mapper;
this.uploadservice = uploadservice;
this.httpContextAccessor = httpContextAccessor;
baseUrl = $"{httpContextAccessor.HttpContext.Request.Scheme}://{httpContextAccessor.HttpContext.Request.Host}";
baseUrl = baseUrl + "/doculinks/download";
SeedData();
}
private void SeedData()
{
if (!DocumentDbContext.LinkTypes.Any())
{
DocumentDbContext.LinkTypes.Add(new Db.LinkType() { IsActive = true, CustomOrder = 1 });
DocumentDbContext.LinkTypes.Add(new Db.LinkType() { IsActive = true, CustomOrder = 2 });
DocumentDbContext.LinkTypes.Add(new Db.LinkType() { IsActive = true, CustomOrder = 3 });
DocumentDbContext.LinkTypes.Add(new Db.LinkType() { IsActive = true, CustomOrder = 4 });
DocumentDbContext.SaveChanges();
}
if (!DocumentDbContext.LinksTranslations.Any())
{
DocumentDbContext.LinksTranslations.Add(new Db.LinksTranslation() { TypeText = "Forms", Language = "en", LinkTypeId = 1 });
DocumentDbContext.LinksTranslations.Add(new Db.LinksTranslation() { TypeText = "Communiques", Language = "en", LinkTypeId = 2 });
DocumentDbContext.LinksTranslations.Add(new Db.LinksTranslation() { TypeText = "Memos", Language = "en", LinkTypeId = 3 });
DocumentDbContext.LinksTranslations.Add(new Db.LinksTranslation() { TypeText = "Trainings", Language = "en", LinkTypeId = 4 });
DocumentDbContext.LinksTranslations.Add(new Db.LinksTranslation() { TypeText = "Formularios", Language = "es", LinkTypeId = 1 });
DocumentDbContext.LinksTranslations.Add(new Db.LinksTranslation() { TypeText = "Comunicados", Language = "es", LinkTypeId = 2 });
DocumentDbContext.LinksTranslations.Add(new Db.LinksTranslation() { TypeText = "notas", Language = "es", LinkTypeId = 3 });
DocumentDbContext.LinksTranslations.Add(new Db.LinksTranslation() { TypeText = "Entrenamientos", Language = "es", LinkTypeId = 4 });
DocumentDbContext.LinksTranslations.Add(new Db.LinksTranslation() { TypeText = "Formes", Language = "fr", LinkTypeId = 1 });
DocumentDbContext.LinksTranslations.Add(new Db.LinksTranslation() { TypeText = "Communiqués", Language = "fr", LinkTypeId = 2 });
DocumentDbContext.LinksTranslations.Add(new Db.LinksTranslation() { TypeText = "Mémos", Language = "fr", LinkTypeId = 3 });
DocumentDbContext.LinksTranslations.Add(new Db.LinksTranslation() { TypeText = "Formations", Language = "fr", LinkTypeId = 4 });
DocumentDbContext.SaveChanges();
}
if (!DocumentDbContext.Documents.Any())
{
int counter = 0;
for (int i = 1; i <= 4; i++)
{
int linkTypeId = 2;
FileModel fileModel = new FileModel();
if (i < 3)
{
linkTypeId = 1;
fileModel = new FileModel() { FileName = "Sample" + i, FileExtension = ".txt", FileContent = "c2FtcGxl", IsAttachments = true, CustomOrder = 1, Language = "en" };
}
else
fileModel = new FileModel() { url = "www.google" + i + ".com", IsAttachments = false, CustomOrder = 1,Language="en" };
ReqDoculink documentInfo = new ReqDoculink() { linkTypeId = i, CustomOrder = i, Files = new List<FileModel>() { fileModel } };
Models.Doculink document = uploadservice.UploadDocument(counter, documentInfo);
DocumentDbContext.Documents.Add(mapper.Map<Models.Doculink, Db.Doculink>(document));
DocumentDbContext.SaveChanges();
var dbattachments = mapper.Map<List<Models.DoculinkAttachments>, List<Db.DoculinkAttachments>>(document.doclinksAttachments);
dbattachments.ForEach(a => a.DocumentId = i);
DocumentDbContext.DoclinksAttachments.AddRange(dbattachments);
DocumentDbContext.SaveChanges();
counter++;
}
}
if (!DocumentDbContext.DocumentsTranslations.Any())
{
string[] titles = {
"Mobile App Damage Assessment Instructions",
"PC Damage Assessment Instructions",
"Emergency Evacuation centers",
"Mobile App Damage Assessment Instructions" };
string[] esTranslations = {
"Instrucciones de Evaluación de Daños de la Aplicación Móvil",
"Instrucciones de Evaluación de Daños del PC",
"Centros de Evacuación de Emergencia",
"Instrucciones de Evaluación de Daños de la Aplicación Móvil" };
string[] frTranslations = {
"Instructions d'Évaluation des Dommages de l'Application Mobile",
"Instructions d'Évaluation des Dommages du PC",
"Centres d'Évacuation d'Urgence",
"Instructions d'Évaluation des Dommages de l'Application Mobile" };
List<Db.DoculinkTranslation> documents = new List<Db.DoculinkTranslation>();
for (int i = 0; i < 4; i++)
{
documents.Add(new Db.DoculinkTranslation { DocumentId = i + 1, title = titles[i], description = titles[i], Language = "en" });
documents.Add(new Db.DoculinkTranslation { DocumentId = i + 1, title = esTranslations[i], description = esTranslations[i], Language = "es" });
documents.Add(new Db.DoculinkTranslation { DocumentId = i + 1, title = frTranslations[i], description = frTranslations[i], Language = "fr" });
}
DocumentDbContext.DocumentsTranslations.AddRange(documents);
DocumentDbContext.SaveChanges();
}
}
public List<Models.DoculinkTranslation> GetDocumentTranslations(int id, string? language)
{
List<Models.DoculinkTranslation> QuestionTranslations;
if (string.IsNullOrEmpty(language))
{
QuestionTranslations = mapper.Map<List<Db.DoculinkTranslation>, List<Models.DoculinkTranslation>>(
DocumentDbContext.DocumentsTranslations.AsNoTracking().Where(a => a.DocumentId == id).ToList());
}
else
{
QuestionTranslations = mapper.Map<List<Db.DoculinkTranslation>, List<Models.DoculinkTranslation>>(
DocumentDbContext.DocumentsTranslations.AsNoTracking().Where(a => a.DocumentId == id && a.Language == language).ToList());
}
return QuestionTranslations;
}
public ResDoculink CreateMultiLanguageObject(List<Models.DoculinkTranslation> questions)
{
ResDoculink MultiLanguage = new ResDoculink();
Dictionary<string, string> dicttitle = new Dictionary<string, string>();
Dictionary<string, string> dictdesc = new Dictionary<string, string>();
foreach (Models.DoculinkTranslation item in questions)
{
dicttitle.Add(item.Language, item.title);
dictdesc.Add(item.Language, item.description);
}
MultiLanguage.titles = dicttitle;
MultiLanguage.description = dictdesc;
return MultiLanguage;
}
public List<Models.LinksTranslation> GetLinkTypeTranslations(int id, string? language)
{
List<Models.LinksTranslation> linksTranslations;
if (string.IsNullOrEmpty(language))
{
linksTranslations = mapper.Map<List<Db.LinksTranslation>, List<Models.LinksTranslation>>(
DocumentDbContext.LinksTranslations.AsNoTracking().Where(a => a.LinkTypeId == id).ToList());
}
else
{
linksTranslations = mapper.Map<List<Db.LinksTranslation>, List<Models.LinksTranslation>>(
DocumentDbContext.LinksTranslations.AsNoTracking().Where(a => a.LinkTypeId == id && a.Language == language).ToList());
}
return linksTranslations;
}
public object CreateMultiLanguageLinkTypeObject(List<Models.LinksTranslation> links)
{
object MultiLanguage = new object();
Dictionary<string, string> dicttitle = new Dictionary<string, string>();
foreach (Models.LinksTranslation item in links)
{
dicttitle.Add(item.Language, item.TypeText);
}
MultiLanguage = dicttitle;
return MultiLanguage;
}
private List<Models.DoculinkAttachments> GetDocumentAttachment(int id,string? language)
{
List<Db.DoculinkAttachments> doculinkAttachments = null;
if (string.IsNullOrEmpty(language))
{
doculinkAttachments = DocumentDbContext.DoclinksAttachments.AsNoTracking().Where(a => a.DocumentId == id).ToList();
}
else
{
doculinkAttachments = DocumentDbContext.DoclinksAttachments.AsNoTracking().Where(a => a.DocumentId == id && a.Language == language).ToList();
}
foreach (var attachment in doculinkAttachments)
{
if (attachment.IsAttachments)
attachment.Path = $"{baseUrl}/{attachment.Id}";
}
return mapper.Map<List<Db.DoculinkAttachments>, List<Models.DoculinkAttachments>>(doculinkAttachments);
}
public async Task<(bool IsSuccess, Models.DoculinkAttachments DoculinkAttachments, string Path)> GetDownloadAttachmentAsync(int id)
{
try
{
Db.DoculinkAttachments Attachment = DocumentDbContext.DoclinksAttachments.AsNoTracking().Where(a => a.Id == id).AsNoTracking().FirstOrDefault();
if (Attachment == null)
{
return (false, null, "Not Found");
}
return (true, mapper.Map<Db.DoculinkAttachments, Models.DoculinkAttachments>(Attachment), $"Attachment {id}");
}
catch (Exception ex)
{
logger?.LogError(ex.ToString());
return (false, null, ex.Message);
}
}
public async Task<(bool IsSuccess, IEnumerable<Models.ResDoculink> documents, string ErrorMessage)> GetdocumentsByLinkTypeIdAsync(int? linkTypeId, string? language, bool? isactive)
{
try
{
logger?.LogInformation("Query Question");
var documents = new List<Db.Doculink>();
if (linkTypeId==null)
documents = await DocumentDbContext.Documents.AsNoTracking().Where(q => (isactive == null || q.IsActive == isactive.Value)).ToListAsync();
else
documents = await DocumentDbContext.Documents.AsNoTracking().Where(q => (isactive == null || q.IsActive == isactive.Value) &&
q.linkTypeId == linkTypeId.Value).ToListAsync();
if (documents != null)
{
var result = mapper.Map<List<Db.Doculink>, List<Models.ResDoculink>>(documents);
foreach (var item in result)
{
var multilan = CreateMultiLanguageObject(GetDocumentTranslations(item.Id, language));
item.titles = multilan.titles;
item.description = multilan.description;
item.linktypes = CreateMultiLanguageLinkTypeObject(GetLinkTypeTranslations(item.linkTypeId, language));
item.doclinksAttachments = GetDocumentAttachment(item.Id,language);
}
// List<ResDoculinks> doculinks = result.GroupBy(a => a.linkTypeId).Select(a => new ResDoculinks() { linkTypeId = a.Key, doculinks = a.ToList() }).ToList();
return (true, result, null);
}
return (false, null, "Not found");
}
catch (Exception ex)
{
logger?.LogError(ex.ToString());
return (false, null, ex.Message);
}
}
public async Task<(bool IsSuccess, IEnumerable<Models.ResDoculink> documents, string ErrorMessage)> GetdocumentsByLinkAsync(string? linkType, string? language, bool? isactive)
{
try
{
logger?.LogInformation("Query Question");
var documents = new List<Db.Doculink>();
if (String.IsNullOrEmpty(linkType))
documents = await DocumentDbContext.Documents.AsNoTracking().Where(q => (isactive == null || q.IsActive == isactive.Value)).ToListAsync();
else
documents = await DocumentDbContext.Documents.AsNoTracking().Where(q => (isactive == null || q.IsActive == isactive.Value) &&
q.linkTypeId == (DocumentDbContext.LinksTranslations.AsNoTracking().Where(a => a.TypeText.ToLower() == linkType.ToLower()).Select(a => a.Id).FirstOrDefault())).ToListAsync();
if (documents != null)
{
var result = mapper.Map<List<Db.Doculink>, List<Models.ResDoculink>>(documents);
foreach (var item in result)
{
var multilan = CreateMultiLanguageObject(GetDocumentTranslations(item.Id, language));
item.titles = multilan.titles;
item.description = multilan.description;
item.linktypes = CreateMultiLanguageLinkTypeObject(GetLinkTypeTranslations(item.linkTypeId, language));
item.doclinksAttachments = GetDocumentAttachment(item.Id, language);
}
//List<ResDoculinks> doculinks = result.GroupBy(a => a.linkTypeId).Select(a => new ResDoculinks() { linkTypeId = a.Key, doculinks = a.ToList() }).ToList();
return (true, result, null);
}
return (false, null, "Not found");
}
catch (Exception ex)
{
logger?.LogError(ex.ToString());
return (false, null, ex.Message);
}
}
//public async Task<(bool IsSuccess, IEnumerable<Models.ResDoculink> documents, string ErrorMessage)> GetDocumnetsAsync(string? language)
//{
// try
// {
// logger?.LogInformation("Query Question");
// var documents = await DocumentDbContext.Documents.Include(a => a.LinkType).AsNoTracking().Where(q => q.IsActive).ToListAsync();
// if (documents != null)
// {
// logger?.LogInformation($"{documents.Count} Document(s) found");
// var result = mapper.Map<List<Db.Document>, List<Models.ResDoculink>>(documents);
// foreach (var item in result)
// {
// var multilan = CreateMultiLanguageObject(GetDocumentTranslations(item.Id, language));
// item.titles = multilan.titles;
// item.description = multilan.description;
// }
// return (true, result, null);
// }
// return (false, null, "Not found");
// }
// catch (Exception ex)
// {
// logger?.LogError(ex.ToString());
// return (false, null, ex.Message);
// }
//}
public async Task<(bool IsSuccess, Models.Doculink Document, string ErrorMessage)> GetDocumentByidAsync(int id)
{
try
{
logger?.LogInformation("Query LinkType");
var Document = await DocumentDbContext.Documents.AsNoTracking().FirstOrDefaultAsync(q => q.Id == id && q.IsActive);
if (Document != null)
{
logger?.LogInformation($"{Document} customer(s) found");
var result = mapper.Map<Db.Doculink, Models.Doculink>(Document);
result.documentsTranslations = mapper.Map<List<Db.DoculinkTranslation>, List<Models.DoculinkTranslation>>(
DocumentDbContext.DocumentsTranslations.Where(a => a.DocumentId == result.Id).ToList());
result.doclinksAttachments = GetDocumentAttachment(id, "");
return (true, result, null);
}
return (false, null, "Not found");
}
catch (Exception ex)
{
logger?.LogError(ex.ToString());
return (false, null, ex.Message);
}
}
//added linktype filter
public async Task<(bool IsSuccess, Models.ResDoculink Document, string ErrorMessage)> GetDocumentAsync(int id, string? linkType, string? language)
{
try
{
logger?.LogInformation("Query LinkType");
//var Document = await DocumentDbContext.Documents.Include(a => a.LinkType).AsNoTracking().FirstOrDefaultAsync(q => q.Id == id && q.IsActive);
var Document = new Db.Doculink();
if (String.IsNullOrEmpty(linkType))
Document = await DocumentDbContext.Documents.AsNoTracking().Where(q => q.IsActive && q.Id == id).FirstOrDefaultAsync();
else
Document = await DocumentDbContext.Documents.AsNoTracking().Where(q => q.IsActive && q.Id == id &&
q.linkTypeId == (DocumentDbContext.LinksTranslations.AsNoTracking().Where(a => a.TypeText.ToLower() == linkType.ToLower()).Select(a => a.Id).FirstOrDefault())).FirstOrDefaultAsync();
if (Document != null)
{
logger?.LogInformation($"{Document} customer(s) found");
var result = mapper.Map<Db.Doculink, Models.ResDoculink>(Document);
var multilan = CreateMultiLanguageObject(GetDocumentTranslations(result.Id, language));
result.linktypes = CreateMultiLanguageLinkTypeObject(GetLinkTypeTranslations(result.linkTypeId, language));
result.titles = multilan.titles;
result.description = multilan.description;
result.doclinksAttachments = GetDocumentAttachment(id, language);
return (true, result, null);
}
return (false, null, "Not found");
}
catch (Exception ex)
{
logger?.LogError(ex.ToString());
return (false, null, ex.Message);
}
}
public async Task<(bool IsSuccess, Models.ResDoculink Document, string ErrorMessage)> PostDocumentAsync(Models.Doculink Document)
{
try
{
var document = mapper.Map<Models.Doculink, Db.Doculink>(Document);
document.dateCreated = DateTime.Now; document.dateUpdated = DateTime.Now;
DocumentDbContext.Documents.Add(document);
DocumentDbContext.SaveChanges();
var dbtranslation = mapper.Map<List<Models.DoculinkTranslation>, List<Db.DoculinkTranslation>>(Document.documentsTranslations);
dbtranslation.ForEach(i => i.DocumentId = document.Id);
DocumentDbContext.DocumentsTranslations.AddRange(dbtranslation);
var dbattachments = mapper.Map<List<Models.DoculinkAttachments>, List<Db.DoculinkAttachments>>(Document.doclinksAttachments);
dbattachments.ForEach(i => i.DocumentId = document.Id);
DocumentDbContext.DoclinksAttachments.AddRange(dbattachments);
DocumentDbContext.SaveChanges();
var result = mapper.Map<Db.Doculink, Models.ResDoculink>(document);
var multilan = CreateMultiLanguageObject(GetDocumentTranslations(document.Id, ""));
result.linktypes = CreateMultiLanguageLinkTypeObject(GetLinkTypeTranslations(Document.linkTypeId, ""));
result.titles = multilan.titles;
result.description = multilan.description;
result.doclinksAttachments = GetDocumentAttachment(document.Id,"");
return (true, result, null);
}
catch (Exception ex)
{
logger?.LogError(ex.ToString());
return (false, null, ex.Message);
}
}
public async Task<(bool IsSuccess, Models.ResDoculink Document, string ErrorMessage)> UpdateDocumentAsync(int id, Models.Doculink Document)
{
try
{
if (Document != null)
{
var existing = DocumentDbContext.Documents.AsNoTracking().FirstOrDefault(x => x.Id == id);
if (existing != null)
{
Document.Id = existing.Id;
var document = mapper.Map<Models.Doculink, Db.Doculink>(Document);
document.dateUpdated = DateTime.Now;
DocumentDbContext.Documents.Update(document);
DocumentDbContext.SaveChanges();
var oldtranslations = DocumentDbContext.DocumentsTranslations.Where(a => a.DocumentId == id).ToList();
if (oldtranslations != null)
DocumentDbContext.DocumentsTranslations.RemoveRange(oldtranslations);
var oldattachments = DocumentDbContext.DoclinksAttachments.Where(a => a.DocumentId == id).ToList();
if (oldattachments != null)
DocumentDbContext.DoclinksAttachments.RemoveRange(oldattachments);
var dbtranslation = mapper.Map<List<Models.DoculinkTranslation>, List<Db.DoculinkTranslation>>(Document.documentsTranslations);
dbtranslation.ForEach(i => i.DocumentId = Document.Id);
DocumentDbContext.DocumentsTranslations.AddRange(dbtranslation);
var dbattachments = mapper.Map<List<Models.DoculinkAttachments>, List<Db.DoculinkAttachments>>(Document.doclinksAttachments);
dbattachments.ForEach(i => i.DocumentId = document.Id);
DocumentDbContext.DoclinksAttachments.AddRange(dbattachments);
DocumentDbContext.SaveChanges();
var result = mapper.Map<Db.Doculink, Models.ResDoculink>(document);
var multilan = CreateMultiLanguageObject(GetDocumentTranslations(document.Id, ""));
result.linktypes = CreateMultiLanguageLinkTypeObject(GetLinkTypeTranslations(document.linkTypeId, ""));
result.titles = multilan.titles;
result.description = multilan.description;
result.doclinksAttachments = GetDocumentAttachment(document.Id, "");
return (true, result, "Successful");
}
else
{
logger?.LogInformation($"{Document} Not found");
return (false, null, "Not Found");
}
}
else
{
logger?.LogInformation($"{Document} Bad Request");
return (false, null, "Bad request");
}
}
catch (Exception ex)
{
logger?.LogError(ex.ToString());
return (false, null, ex.Message);
}
}
public async Task<(bool IsSuccess, Models.ResDoculink Document, string ErrorMessage)> UpdateDocumentAsync(int id,bool isactive)
{
try
{
Db.Doculink Document = DocumentDbContext.Documents.AsNoTracking().Where(a => a.Id == id).FirstOrDefault();
if (Document == null)
{
return (false, null, "Not Found");
}
Document.IsActive = isactive;
DocumentDbContext.Documents.Update(Document);
DocumentDbContext.SaveChanges();
var result = mapper.Map<Db.Doculink, Models.ResDoculink>(Document);
var multilan = CreateMultiLanguageObject(GetDocumentTranslations(Document.Id, ""));
result.titles = multilan.titles;
result.description = multilan.description;
result.linktypes = CreateMultiLanguageLinkTypeObject(GetLinkTypeTranslations(result.linkTypeId, ""));
result.doclinksAttachments = mapper.Map<List<Db.DoculinkAttachments>, List<Models.DoculinkAttachments>>(
DocumentDbContext.DoclinksAttachments.AsNoTracking().Where(a => a.DocumentId == id).ToList());
return (true, result, $"DocumentId {id} deleted Successfuly");
}
catch (Exception ex)
{
logger?.LogError(ex.ToString());
return (false, null, ex.Message);
}
}
public async Task<(bool IsSuccess, Models.ResDoculink Document, string ErrorMessage)> DeleteDocumentAsync(int id)
{
try
{
Db.Doculink Document = DocumentDbContext.Documents.AsNoTracking().Where(a => a.Id == id).FirstOrDefault();
if (Document == null)
{
return (false, null, "Not Found");
}
var result = mapper.Map<Db.Doculink, Models.ResDoculink>(Document);
var multilan = CreateMultiLanguageObject(GetDocumentTranslations(Document.Id, ""));
result.titles = multilan.titles;
result.description = multilan.description;
result.linktypes = CreateMultiLanguageLinkTypeObject(GetLinkTypeTranslations(result.linkTypeId, ""));
result.doclinksAttachments = mapper.Map<List<Db.DoculinkAttachments>, List<Models.DoculinkAttachments>>(
DocumentDbContext.DoclinksAttachments.AsNoTracking().Where(a => a.DocumentId == id).ToList());
Document.IsActive = false;
DocumentDbContext.Documents.Update(Document);
DocumentDbContext.SaveChanges();
return (true, result, $"DocumentId {id} deleted Successfuly");
}
catch (Exception ex)
{
logger?.LogError(ex.ToString());
return (false, null, ex.Message);
}
}
public async Task<(bool IsSuccess, int counter, string message)> GetDocumentCounter()
{
try
{
int AttachmentId = DocumentDbContext.DoclinksAttachments.Max(a => a.Id);
return (true, AttachmentId, "");
}
catch (Exception ex)
{
return (false, 0, ex.Message);
}
}
//Link Type methods
public async Task<(bool IsSuccess, IEnumerable<Models.ResLinkType> LinkTypes, string ErrorMessage)> GetLinkTypesAsync(string? language)
{
try
{
logger?.LogInformation("Query Question");
var LinkType = await DocumentDbContext.LinkTypes.AsNoTracking().Where(q => q.IsActive).ToListAsync();
if (LinkType != null)
{
logger?.LogInformation($"{LinkType.Count} LinkTypes(s) found");
var result = mapper.Map<IEnumerable<Db.LinkType>, IEnumerable<Models.ResLinkType>>(LinkType);
foreach (var item in result)
{
item.titles = CreateMultiLanguageLinkTypeObject(GetLinkTypeTranslations(item.Id, language));
}
return (true, result, null);
}
return (false, null, "Not found");
}
catch (Exception ex)
{
logger?.LogError(ex.ToString());
return (false, null, ex.Message);
}
}
public async Task<(bool IsSuccess, Models.ResLinkType LinkType, string ErrorMessage)> GetLinkTypeAsync(int Id, string? language)
{
try
{
logger?.LogInformation("Query LinkType");
var LinkType = await DocumentDbContext.LinkTypes.AsNoTracking().FirstOrDefaultAsync(q => q.Id == Id && q.IsActive);
if (LinkType != null)
{
logger?.LogInformation($"{LinkType} customer(s) found");
var result = mapper.Map<Db.LinkType, Models.ResLinkType>(LinkType);
result.titles = CreateMultiLanguageLinkTypeObject(GetLinkTypeTranslations(result.Id, language));
return (true, result, null);
}
return (false, null, "Not found");
}
catch (Exception ex)
{
logger?.LogError(ex.ToString());
return (false, null, ex.Message);
}
}
public async Task<(bool IsSuccess, Models.ResLinkType LinkType, string ErrorMessage)> PostLinkTypeAsync(Models.LinkType LinkType)
{
try
{
logger?.LogInformation("Query LinkType");
if (!LinkTypeExists(LinkType.Id))
{
var dbLink = mapper.Map<Models.LinkType, Db.LinkType>(LinkType);
DocumentDbContext.LinkTypes.Add(dbLink);
DocumentDbContext.SaveChanges();
var dbtranslation = mapper.Map<List<Models.LinksTranslation>, List<Db.LinksTranslation>>(LinkType.linksTranslations);
dbtranslation.ForEach(i => i.LinkTypeId = dbLink.Id);
DocumentDbContext.LinksTranslations.AddRange(dbtranslation);
DocumentDbContext.SaveChanges();
var result = mapper.Map<Db.LinkType, Models.ResLinkType>(dbLink);
result.titles = CreateMultiLanguageLinkTypeObject(GetLinkTypeTranslations(result.Id, ""));
return (true, result, null);
}
return (false, null, "LinkType is already exits");
}
catch (Exception ex)
{
logger?.LogError(ex.ToString());
return (false, null, ex.Message);
}
}
public async Task<(bool IsSuccess, Models.ResLinkType LinkType, string ErrorMessage)> UpdateLinkTypeAsync(int id, Models.LinkType LinkType)
{
try
{
if (LinkType != null)
{
var existing = DocumentDbContext.LinkTypes.AsNoTracking().FirstOrDefault(x => x.Id == id);
if (existing != null)
{
var dbLink = mapper.Map<Models.LinkType, Db.LinkType>(LinkType);
DocumentDbContext.LinkTypes.Update(dbLink);
DocumentDbContext.SaveChanges();
var oldtranslations = DocumentDbContext.LinksTranslations.Where(a => a.LinkTypeId == id).ToList();
if (oldtranslations != null)
DocumentDbContext.LinksTranslations.RemoveRange(oldtranslations);
var dbtranslation = mapper.Map<List<Models.LinksTranslation>, List<Db.LinksTranslation>>(LinkType.linksTranslations);
dbtranslation.ForEach(i => i.LinkTypeId = dbLink.Id);
DocumentDbContext.LinksTranslations.AddRange(dbtranslation);
DocumentDbContext.SaveChanges();
var result = mapper.Map<Db.LinkType, Models.ResLinkType>(dbLink);
result.titles = CreateMultiLanguageLinkTypeObject(GetLinkTypeTranslations(result.Id, ""));
return (true, result, "Successful");
}
else
{
logger?.LogInformation($"{LinkType} Not found");
return (false, null, "Not Found");
}
}
else
{
logger?.LogInformation($"{LinkType} Bad Request");
return (false, null, "Bad request");
}
}
catch (Exception ex)
{
logger?.LogError(ex.ToString());
return (false, null, ex.Message);
}
}
public async Task<(bool IsSuccess, Models.ResLinkType LinkType, string ErrorMessage)> DeleteLinkTypeAsync(int id)
{
try
{
Db.LinkType LinkType = DocumentDbContext.LinkTypes.AsNoTracking().Where(a => a.Id == id).FirstOrDefault();
if (LinkType == null)
{
return (false, null, "Not Found");
}
LinkType.IsActive = false;
var result = mapper.Map<Db.LinkType, Models.ResLinkType>(LinkType);
result.titles = CreateMultiLanguageLinkTypeObject(GetLinkTypeTranslations(result.Id, ""));
DocumentDbContext.LinkTypes.Update(LinkType);
DocumentDbContext.SaveChanges();
return (true, result, $"LinkTypeId {id} deleted Successfuly");
}
catch (Exception ex)
{
logger?.LogError(ex.ToString());
return (false, null, ex.Message);
}
}
private bool LinkTypeExists(int id)
{
return DocumentDbContext.LinkTypes.AsNoTracking().Count(e => e.Id == id) > 0;
}
}
}

View File

@ -0,0 +1,178 @@
using AutoMapper;
using Azure;
using DamageAssesment.Api.DocuLinks.Db;
using DamageAssesment.Api.DocuLinks.Interfaces;
using DamageAssesment.Api.DocuLinks.Models;
using Microsoft.AspNetCore.Http;
using Microsoft.EntityFrameworkCore.Metadata.Internal;
using System.Diagnostics.Metrics;
using System.Net.Http;
using System.Security.AccessControl;
using System.Security.Principal;
namespace DamageAssesment.Api.DocuLinks.Providers
{
public class UploadService : IUploadService
{
private ILogger<UploadService> logger;
private IMapper mapper;
private string uploadpath = "";
private string Deletepath = "";
public UploadService(IConfiguration configuration, ILogger<UploadService> logger, IMapper mapper)
{
this.logger = logger;
this.mapper = mapper;
uploadpath = configuration.GetValue<string>("Fileupload:folderpath");
Deletepath = configuration.GetValue<string>("Fileupload:Deletepath");
}
public async Task<string> GetFile(string path)
{
try
{
if (System.IO.File.Exists(path))
{
return path;
}
return null; // File not found
}
catch (Exception ex)
{
// Handle or log the exception as needed
throw;
}
}
public async Task<byte[]> DownloadFile(string path)
{
try
{
if (System.IO.File.Exists(path))
{
return await System.IO.File.ReadAllBytesAsync(path);
}
return null; // File not found
}
catch (Exception ex)
{
// Handle or log the exception as needed
throw;
}
}
public Models.Doculink UploadDocument(int counter, ReqDoculink documentInfo)
{
Models.Doculink Documents = new Models.Doculink();
List<Models.DoculinkAttachments> attachments = new List<Models.DoculinkAttachments>();
try
{
string path = "", UserfileName="";
var fullDirectoryPath = Path.Combine(Directory.GetCurrentDirectory(), uploadpath);
if (!Directory.Exists(fullDirectoryPath)) //Create deirectory if does not exist
Directory.CreateDirectory(fullDirectoryPath);
if (documentInfo.Files != null)
{
foreach (var item in documentInfo.Files)
{
counter++;
if (item.IsAttachments)
{
UserfileName = Path.GetFileName(item.FileName + item.FileExtension);
var fileName = String.Format("Document_{0}{1}", counter, item.FileExtension);
path = Path.Combine(fullDirectoryPath, fileName);
File.WriteAllBytes(path, Convert.FromBase64String(item.FileContent));
}
else
path = item.url;
attachments.Add(new Models.DoculinkAttachments { docName=UserfileName,Path=path,IsAttachments=item.IsAttachments,CustomOrder=item.CustomOrder,Language=item.Language });
}
}
Documents=new Models.Doculink (){ linkTypeId = documentInfo.linkTypeId,
documentsTranslations = documentInfo.documentsTranslations,doclinksAttachments=attachments,
IsDeleted=false,CustomOrder=documentInfo.CustomOrder, IsActive =documentInfo.IsActive
};
return Documents;
}
catch (Exception ex) {
return new Models.Doculink();
}
}
public Models.Doculink UpdateDocuments(int counter, Models.Doculink document, ReqDoculink documentInfo)
{
try
{
foreach (var item in document.doclinksAttachments)
{
Movefile(item.Path);
}
var fullDirectoryPath = Path.Combine(Directory.GetCurrentDirectory(), uploadpath);
if (!Directory.Exists(fullDirectoryPath)) //Create deirectory if does not exist
Directory.CreateDirectory(fullDirectoryPath);
string path = "", UserfileName = "";
List<Models.DoculinkAttachments> attachments = new List<Models.DoculinkAttachments>();
foreach (var item in documentInfo.Files)
{
counter++;
if (item.IsAttachments)
{
UserfileName = Path.GetFileName(item.FileName+item.FileExtension);
var fileName = String.Format("Document_{0}{1}", counter, item.FileExtension);
path = Path.Combine(fullDirectoryPath, fileName);
File.WriteAllBytes(path, Convert.FromBase64String(item.FileContent));
}
else
path = item.url;
attachments.Add(new Models.DoculinkAttachments { docName = UserfileName, Path = path,IsAttachments=item.IsAttachments,CustomOrder=item.CustomOrder,Language=item.Language });
}
Models.Doculink Documents = new Models.Doculink()
{
Id = documentInfo.Id,
linkTypeId = documentInfo.linkTypeId,
documentsTranslations=documentInfo.documentsTranslations,
IsActive = documentInfo.IsActive,
IsDeleted=false,
CustomOrder = documentInfo.CustomOrder,
doclinksAttachments = attachments
};
return Documents;
}
catch (Exception ex) {
return new Models.Doculink();
}
}
public void Deletefile(string path)
{
if (path != "")
{
FileInfo file = new FileInfo(path);
if (file?.Exists??false)//check file exsit or not
{
file.Delete();
}
}
}
public void Movefile(string path)
{
if (path != "")
{
var pathToSave = Path.Combine(Directory.GetCurrentDirectory(), Deletepath);
if (!Directory.Exists(pathToSave)) //Create deirectory if does not exist
Directory.CreateDirectory(pathToSave);
FileInfo file = new FileInfo(path);
if (file?.Exists ?? false)//check file exsit or not
{
string filename = file.Name.Replace(file.Extension, " ") + DateTime.Now.ToShortDateString().Replace("/","_") + file.Extension;
file.MoveTo(pathToSave+"\\"+ filename);
}
}
}
}
}

View File

@ -1,61 +0,0 @@
using DamageAssesment.Api.Documents.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Mail;
using System.Text;
using System.Threading.Tasks;
namespace DamageAssesment.Api.Documents.Test
{
public class LinkTypeMockData
{
public static async Task<(bool, List<Documents.Models.LinkType>, string)> getOkResponse()
{
List<Documents.Models.LinkType> list = new List<Documents.Models.LinkType>();
for (int i = 1; i < 4; i++)
{
list.Add(new Documents.Models.LinkType()
{
Id = i,
TypeText = "sample"+i,
IsActive = true
});
}
return (true, list, null);
}
public static async Task<(bool, Documents.Models.LinkType, string)> getOkResponse(int Id)
{
var Documents = await getOkResponse();
var Document = Documents.Item2.FirstOrDefault(s => s.Id == Id);
return (true, Document, null);
}
public static async Task<(bool, Documents.Models.LinkType, string)> getBadRequestResponse()
{
return (false, null, "Bad Request");
}
public static async Task<(bool, Documents.Models.LinkType, string)> getNotFoundResponse()
{
return (false, null, "Not Found");
}
public static async Task<(bool, IEnumerable<Documents.Models.LinkType>, string)> getNoContentResponse()
{
IEnumerable<Documents.Models.LinkType> list = new List<Documents.Models.LinkType>();
return (false, list, null);
}
public static async Task<Documents.Models.LinkType> getInputLinkData(int id)
{
return new Models.LinkType
{
Id = id,
TypeText = "sample",
IsActive = true
};
}
}
}

View File

@ -1,117 +0,0 @@
using DamageAssesment.Api.Documents.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Mail;
using System.Text;
using System.Threading.Tasks;
namespace DamageAssesment.Api.Documents.Test
{
public class MockData
{
public static async Task<(bool, List<Documents.Models.Document>, string)> getOkResponse()
{
List<Documents.Models.Document> list = new List<Documents.Models.Document>();
for (int i = 1; i < 4; i++)
{
List<Documents.Models.DocumentsTranslation> documentsTranslations = new List<DocumentsTranslation>();
documentsTranslations.Add(new DocumentsTranslation()
{
Language = "en",
title = "tel"+i,
description = "Sample"+i
});
list.Add(new Documents.Models.Document()
{
Id = i,
linkTypeId = i,
docName = "sample"+i,
url = "testurl" + i,
Path = "testpath" + i,
IsActive = true,
documentsTranslations= documentsTranslations,
dateCreated = DateTime.Now,
dateUpdated = DateTime.Now
});
}
return (true, list, null);
}
public static async Task<(bool, Documents.Models.Document, string)> getOkResponse(int Id)
{
var Documents = await getOkResponse();
var Document = Documents.Item2.FirstOrDefault(s => s.Id == Id);
return (true, Document, null);
}
public static async Task<(bool, Documents.Models.Document, string)> getBadRequestResponse()
{
return (false, null, "Bad Request");
}
public static async Task<(bool, Documents.Models.Document, string)> getNotFoundResponse()
{
return (false, null, "Not Found");
}
public static async Task<(bool, IEnumerable<Documents.Models.Document>, string)> getNoContentResponse()
{
IEnumerable<Documents.Models.Document> list = new List<Documents.Models.Document>();
return (false, list, null);
}
public static async Task<Documents.Models.DocumentInfo> GetDocumentsInfo(int id)
{
FileModel fileModel = new FileModel() { FileName = "Sample", FileContent = "c2FtcGxl", FileExtension = ".txt" };
return new DocumentInfo() { Id=id, linkTypeId = 1, url = "Sample", File = fileModel };
}
public static async Task<Documents.Models.Document> getInputDocumentData()
{
List<Documents.Models.DocumentsTranslation> documentsTranslations = new List<DocumentsTranslation>();
documentsTranslations.Add(new DocumentsTranslation()
{
Language = "en",
title = "tel",
description = "Sample"
});
return new Models.Document
{
Id = 1,
linkTypeId = 1,
docName = "sample",
url = "testurl",
Path = "testpath",
IsActive = true,
documentsTranslations= documentsTranslations,
dateCreated = DateTime.Now,
dateUpdated = DateTime.Now
};
}
public static async Task<List<Documents.Models.Document>> getInputDocumentsData()
{
List<Documents.Models.DocumentsTranslation> documentsTranslations = new List<DocumentsTranslation>();
documentsTranslations.Add(new DocumentsTranslation()
{
Language = "en",
title = "tel",
description="Sample"
});
List<Documents.Models.Document> Documents = new List<Models.Document>();
Documents.Add(new Models.Document
{
Id = 1,
linkTypeId = 1,
docName = "sample",
url = "testurl",
Path = "testpath",
IsActive = true,
documentsTranslations= documentsTranslations,
dateCreated = DateTime.Now,
dateUpdated = DateTime.Now
});
return Documents;
}
}
}

View File

@ -1,222 +0,0 @@
using DamageAssesment.Api.Documents.Db;
using DamageAssesment.Api.Documents.Interfaces;
using DamageAssesment.Api.Documents.Models;
using DamageAssesment.Api.Documents.Providers;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
namespace DamageAssesment.Api.Documents.Controllers
{
[Route("api")]
[ApiController]
public class DocumentsController : ControllerBase
{
private readonly IDocumentsProvider documentsProvider;
private readonly IUploadService uploadService;
public DocumentsController(IDocumentsProvider documentsProvider,IUploadService uploadService)
{
this.documentsProvider = documentsProvider;
this.uploadService = uploadService;
}
/// <summary>
/// Get all documnets.
/// </summary>
[HttpGet("{language}/{LinkType}/documents")]
public async Task<IActionResult> GetDocumentsbyFormsandLanguageAsync(string language,string LinkType)
{
var result = await this.documentsProvider.GetDocumnetsByLinkAsync(language, LinkType);
if (result.IsSuccess)
{
return Ok(result.documents);
}
return NoContent();
}
/// <summary>
/// Get all documnets.
/// </summary>
[HttpGet("{LinkType}/documents")]
public async Task<IActionResult> GetDocumentsbyFormAsync(string LinkType)
{
var result = await this.documentsProvider.GetDocumnetsByLinkAsync(null, LinkType);
if (result.IsSuccess)
{
return Ok(result.documents);
}
return NoContent();
}
/// <summary>
/// Get all documnets.
/// </summary>
[HttpGet("documents")]
public async Task<IActionResult> GetDocumentsAsync()
{
var result = await this.documentsProvider.GetDocumnetsAsync();
if (result.IsSuccess)
{
return Ok(result.documents);
}
return NoContent();
}
/// <summary>
/// Get a documnet by id.
/// </summary>
[HttpGet("documents/{id}")]
public async Task<IActionResult> GetDocumentAsync(int id)
{
var result = await this.documentsProvider.GetDocumentAsync(id);
if (result.IsSuccess)
{
return Ok(result.Document);
}
return NotFound();
}
/// <summary>
/// Upload new document.
/// </summary>
[HttpPut("documents")]
public async Task<IActionResult> UpdateDocument(DocumentInfo documentInfo)
{
if (documentInfo != null)
{
var dbdoc = await this.documentsProvider.GetDocumentAsync(documentInfo.Id);
if (dbdoc.IsSuccess)
{
Models.Document document = uploadService.UpdateDocuments(dbdoc.Document, documentInfo);
var result = await this.documentsProvider.UpdateDocumentAsync(document);
if (result.IsSuccess)
{
return Ok(result.Document);
}
return NoContent();
}
return NoContent();
}
return BadRequest(documentInfo);
}
/// <summary>
/// update existing document.
/// </summary>
[HttpPost("documents")]
public async Task<IActionResult> CreateDocument(DocumentInfo documentInfo)
{
try
{
if (documentInfo != null)
{
var documents = await this.documentsProvider.GetDocumentCounter();
Models.Document document = uploadService.UploadDocument(documents.counter, documentInfo);
var result = await this.documentsProvider.PostDocumentAsync(document);
if (result.IsSuccess)
{
return Ok(result.Document);
}
return NoContent();
}
return BadRequest(documentInfo);
}
catch (Exception ex)
{
return BadRequest($"Internal server error: {ex}");
}
}
/// <summary>
/// Delete documnet by id.
/// </summary>
[HttpDelete("documents/{id}")]
public async Task<IActionResult> DeleteDocument(int id)
{
// database soft delete
var result = await this.documentsProvider.DeleteDocumentAsync(id);
if (result.IsSuccess)
{
// deleting file from folder
uploadService.Movefile(result.Document.Path);
return Ok(result.Document);
}
return NotFound();
}
/// <summary>
/// Get all document link type.
/// </summary>
[HttpGet("LinkTypes")]
public async Task<IActionResult> GetLinkTypesAsync()
{
var result = await this.documentsProvider.GetLinkTypesAsync();
if (result.IsSuccess)
{
return Ok(result.LinkTypes);
}
return NoContent();
}
/// <summary>
/// Get a document link type by id.
/// </summary>
[HttpGet("LinkTypes/{id}")]
public async Task<IActionResult> GetLinkTypeAsync(int id)
{
var result = await this.documentsProvider.GetLinkTypeAsync(id);
if (result.IsSuccess)
{
return Ok(result.LinkType);
}
return NotFound();
}
/// <summary>
/// Update a existing document link type.
/// </summary>
[HttpPut("LinkTypes")]
public async Task<IActionResult> UpdateLinkType(Models.LinkType linkType)
{
if (linkType != null)
{
var result = await this.documentsProvider.UpdateLinkTypeAsync(linkType);
if (result.IsSuccess)
{
return Ok(result.LinkType);
}
if (result.ErrorMessage == "Not Found")
return NotFound(result.ErrorMessage);
return BadRequest(result.ErrorMessage);
}
return CreatedAtRoute("DefaultApi", new { id = linkType.Id }, linkType);
}
/// <summary>
/// Create a new document link type.
/// </summary>
[HttpPost("LinkTypes")]
public async Task<IActionResult> CreateLinkType(Models.LinkType linkType)
{
if (linkType != null)
{
var result = await this.documentsProvider.PostLinkTypeAsync(linkType);
if (result.IsSuccess)
{
return Ok(result.LinkType);
}
return BadRequest(result.ErrorMessage);
}
return CreatedAtRoute("DefaultApi", new { id = linkType.Id }, linkType);
}
/// <summary>
/// Delete a existing document link type by id.
/// </summary>
[HttpDelete("LinkTypes/{id}")]
public async Task<IActionResult> DeleteLinkType(int id)
{
var result = await this.documentsProvider.DeleteLinkTypeAsync(id);
if (result.IsSuccess)
{
return Ok(result.LinkType);
}
return NotFound();
}
}
}

View File

@ -1,30 +0,0 @@
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using System.ComponentModel.DataAnnotations;
namespace DamageAssesment.Api.Documents.Db
{
public class DocumentDbContext : DbContext
{
public DocumentDbContext(DbContextOptions options) : base(options)
{
}
public DbSet<Db.Document> Documents { get; set; }
public DbSet<Db.LinkType> LinkTypes { get; set; }
public DbSet<Db.DocumentsTranslation> DocumentsTranslations { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Document>()
.Property(item => item.Id)
.ValueGeneratedOnAdd();
modelBuilder.Entity<LinkType>()
.Property(item => item.Id)
.ValueGeneratedOnAdd();
modelBuilder.Entity<DocumentsTranslation>()
.Property(item => item.Id)
.ValueGeneratedOnAdd();
}
}
}

View File

@ -1,11 +0,0 @@
namespace DamageAssesment.Api.Documents.Interfaces
{
public interface ILinkTypesProvider
{
Task<(bool IsSuccess, Models.LinkType LinkType, string ErrorMessage)> GetLinkTypeAsync(int Id);
Task<(bool IsSuccess, IEnumerable<Models.LinkType> LinkTypes, string ErrorMessage)> GetLinkTypesAsync();
Task<(bool IsSuccess, Models.LinkType LinkType, string ErrorMessage)> PostLinkTypeAsync(Models.LinkType LinkType);
Task<(bool IsSuccess, Models.LinkType LinkType, string ErrorMessage)> UpdateLinkTypeAsync(Models.LinkType LinkType);
Task<(bool IsSuccess, Models.LinkType LinkType, string ErrorMessage)> DeleteLinkTypeAsync(int Id);
}
}

View File

@ -1,17 +0,0 @@
using DamageAssesment.Api.Documents.Models;
namespace DamageAssesment.Api.Documents.Interfaces
{
public interface IDocumentsProvider : ILinkTypesProvider
{
Task<(bool IsSuccess, Models.Document Document, string ErrorMessage)> GetDocumentAsync(int Id);
Task<(bool IsSuccess, IEnumerable<Models.Document> documents, string ErrorMessage)> GetDocumnetsAsync();
Task<(bool IsSuccess, IEnumerable<Models.Document> documents, string ErrorMessage)> GetDocumnetsByLinkAsync(string Language,string LinkType);
Task<(bool IsSuccess, Models.Document Document, string ErrorMessage)> PostDocumentAsync(Models.Document Document);
Task<(bool IsSuccess, Models.Document Document, string ErrorMessage)> UpdateDocumentAsync(Models.Document Document);
Task<(bool IsSuccess, Models.Document Document, string ErrorMessage)> DeleteDocumentAsync(int Id);
Task<(bool IsSuccess, int counter, string message)> GetDocumentCounter();
}
}

View File

@ -1,12 +0,0 @@
using DamageAssesment.Api.Documents.Models;
namespace DamageAssesment.Api.Documents.Interfaces
{
public interface IUploadService
{
Models.Document UploadDocument( int counter, DocumentInfo documentInfo);
public Models.Document UpdateDocuments( Models.Document document, DocumentInfo documentInfo);
void Deletefile(string path);
void Movefile(string path);
}
}

View File

@ -1,95 +0,0 @@
// <auto-generated />
using System;
using DamageAssesment.Api.Documents.Db;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
#nullable disable
namespace DamageAssesment.Api.Documents.Migrations
{
[DbContext(typeof(DocumentDbContext))]
[Migration("20230828165655_InitialDocumentCreate")]
partial class InitialDocumentCreate
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "7.0.9")
.HasAnnotation("Relational:MaxIdentifierLength", 128);
SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
modelBuilder.Entity("DamageAssesment.Api.Documents.Db.Document", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<bool>("IsActive")
.HasColumnType("bit");
b.Property<string>("Path")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<DateTime>("dateCreated")
.HasColumnType("datetime2");
b.Property<DateTime>("dateUpdated")
.HasColumnType("datetime2");
b.Property<string>("description")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<string>("docName")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<int>("linkTypeId")
.HasColumnType("int");
b.Property<string>("title")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<string>("url")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.HasKey("Id");
b.ToTable("Documents");
});
modelBuilder.Entity("DamageAssesment.Api.Documents.Db.LinkType", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<bool>("IsActive")
.HasColumnType("bit");
b.Property<string>("TypeText")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.HasKey("Id");
b.ToTable("LinkTypes");
});
#pragma warning restore 612, 618
}
}
}

View File

@ -1,60 +0,0 @@
using System;
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace DamageAssesment.Api.Documents.Migrations
{
/// <inheritdoc />
public partial class InitialDocumentCreate : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "Documents",
columns: table => new
{
Id = table.Column<int>(type: "int", nullable: false)
.Annotation("SqlServer:Identity", "1, 1"),
title = table.Column<string>(type: "nvarchar(max)", nullable: false),
linkTypeId = table.Column<int>(type: "int", nullable: false),
description = table.Column<string>(type: "nvarchar(max)", nullable: false),
docName = table.Column<string>(type: "nvarchar(max)", nullable: false),
url = table.Column<string>(type: "nvarchar(max)", nullable: false),
Path = table.Column<string>(type: "nvarchar(max)", nullable: false),
IsActive = table.Column<bool>(type: "bit", nullable: false),
dateCreated = table.Column<DateTime>(type: "datetime2", nullable: false),
dateUpdated = table.Column<DateTime>(type: "datetime2", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_Documents", x => x.Id);
});
migrationBuilder.CreateTable(
name: "LinkTypes",
columns: table => new
{
Id = table.Column<int>(type: "int", nullable: false)
.Annotation("SqlServer:Identity", "1, 1"),
TypeText = table.Column<string>(type: "nvarchar(max)", nullable: false),
IsActive = table.Column<bool>(type: "bit", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_LinkTypes", x => x.Id);
});
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "Documents");
migrationBuilder.DropTable(
name: "LinkTypes");
}
}
}

View File

@ -1,118 +0,0 @@
// <auto-generated />
using System;
using DamageAssesment.Api.Documents.Db;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
#nullable disable
namespace DamageAssesment.Api.Documents.Migrations
{
[DbContext(typeof(DocumentDbContext))]
[Migration("20230830200432_DocumentTranslation")]
partial class DocumentTranslation
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "7.0.9")
.HasAnnotation("Relational:MaxIdentifierLength", 128);
SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
modelBuilder.Entity("DamageAssesment.Api.Documents.Db.Document", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<bool>("IsActive")
.HasColumnType("bit");
b.Property<string>("Path")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<DateTime>("dateCreated")
.HasColumnType("datetime2");
b.Property<DateTime>("dateUpdated")
.HasColumnType("datetime2");
b.Property<string>("docName")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<int>("linkTypeId")
.HasColumnType("int");
b.Property<string>("url")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.HasKey("Id");
b.ToTable("Documents");
});
modelBuilder.Entity("DamageAssesment.Api.Documents.Db.DocumentsTranslation", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<int>("DocumentId")
.HasColumnType("int");
b.Property<string>("Language")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<string>("description")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<string>("title")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.HasKey("Id");
b.ToTable("DocumentsTranslations");
});
modelBuilder.Entity("DamageAssesment.Api.Documents.Db.LinkType", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<bool>("IsActive")
.HasColumnType("bit");
b.Property<bool>("IsAttachment")
.HasColumnType("bit");
b.Property<string>("TypeText")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.HasKey("Id");
b.ToTable("LinkTypes");
});
#pragma warning restore 612, 618
}
}
}

View File

@ -1,70 +0,0 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace DamageAssesment.Api.Documents.Migrations
{
/// <inheritdoc />
public partial class DocumentTranslation : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "description",
table: "Documents");
migrationBuilder.DropColumn(
name: "title",
table: "Documents");
migrationBuilder.AddColumn<bool>(
name: "IsAttachment",
table: "LinkTypes",
type: "bit",
nullable: false,
defaultValue: false);
migrationBuilder.CreateTable(
name: "DocumentsTranslations",
columns: table => new
{
Id = table.Column<int>(type: "int", nullable: false)
.Annotation("SqlServer:Identity", "1, 1"),
DocumentId = table.Column<int>(type: "int", nullable: false),
title = table.Column<string>(type: "nvarchar(max)", nullable: false),
description = table.Column<string>(type: "nvarchar(max)", nullable: false),
Language = table.Column<string>(type: "nvarchar(max)", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_DocumentsTranslations", x => x.Id);
});
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "DocumentsTranslations");
migrationBuilder.DropColumn(
name: "IsAttachment",
table: "LinkTypes");
migrationBuilder.AddColumn<string>(
name: "description",
table: "Documents",
type: "nvarchar(max)",
nullable: false,
defaultValue: "");
migrationBuilder.AddColumn<string>(
name: "title",
table: "Documents",
type: "nvarchar(max)",
nullable: false,
defaultValue: "");
}
}
}

View File

@ -1,115 +0,0 @@
// <auto-generated />
using System;
using DamageAssesment.Api.Documents.Db;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
#nullable disable
namespace DamageAssesment.Api.Documents.Migrations
{
[DbContext(typeof(DocumentDbContext))]
partial class DocumentDbContextModelSnapshot : ModelSnapshot
{
protected override void BuildModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "7.0.9")
.HasAnnotation("Relational:MaxIdentifierLength", 128);
SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
modelBuilder.Entity("DamageAssesment.Api.Documents.Db.Document", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<bool>("IsActive")
.HasColumnType("bit");
b.Property<string>("Path")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<DateTime>("dateCreated")
.HasColumnType("datetime2");
b.Property<DateTime>("dateUpdated")
.HasColumnType("datetime2");
b.Property<string>("docName")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<int>("linkTypeId")
.HasColumnType("int");
b.Property<string>("url")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.HasKey("Id");
b.ToTable("Documents");
});
modelBuilder.Entity("DamageAssesment.Api.Documents.Db.DocumentsTranslation", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<int>("DocumentId")
.HasColumnType("int");
b.Property<string>("Language")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<string>("description")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<string>("title")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.HasKey("Id");
b.ToTable("DocumentsTranslations");
});
modelBuilder.Entity("DamageAssesment.Api.Documents.Db.LinkType", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<bool>("IsActive")
.HasColumnType("bit");
b.Property<bool>("IsAttachment")
.HasColumnType("bit");
b.Property<string>("TypeText")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.HasKey("Id");
b.ToTable("LinkTypes");
});
#pragma warning restore 612, 618
}
}
}

View File

@ -1,19 +0,0 @@
using System.ComponentModel.DataAnnotations;
namespace DamageAssesment.Api.Documents.Models
{
public class Document
{
public int Id { get; set; }
public int linkTypeId { get; set; }
public string docName { get; set; }
public string url { get; set; }
public string Path { get; set; }
public bool IsActive { get; set; }
public DateTime dateCreated { get; set; }
public DateTime dateUpdated { get; set; }
public List<DocumentsTranslation> documentsTranslations { get; set; }
}
}

View File

@ -1,19 +0,0 @@
using System.ComponentModel.DataAnnotations.Schema;
namespace DamageAssesment.Api.Documents.Models
{
public class DocumentInfo
{
public int Id { get; set; }
public int linkTypeId { get; set; }
public string url { get; set; }
public List<DocumentsTranslation> documentsTranslations { get; set; }
public FileModel? File { get; set; }
}
public class FileModel
{
public string? FileName { get; set; }
public string? FileContent { get; set; }
public string? FileExtension { get; set; }
}
}

View File

@ -1,12 +0,0 @@
using System.ComponentModel.DataAnnotations;
namespace DamageAssesment.Api.Documents.Models
{
public class LinkType
{
public int Id { get; set; }
public string TypeText { get; set; }
public bool IsActive { get; set; }
public bool IsAttachment { get; set; }
}
}

View File

@ -1,17 +0,0 @@
using AutoMapper;
namespace DamageAssesment.Api.Documents.Profiles
{
public class DocumentProfile : AutoMapper.Profile
{
public DocumentProfile()
{
CreateMap<Db.Document, Models.Document>();
CreateMap<Models.Document, Db.Document>();
CreateMap<Db.LinkType, Models.LinkType>();
CreateMap<Models.LinkType, Db.LinkType>();
CreateMap<Db.DocumentsTranslation, Models.DocumentsTranslation>();
CreateMap<Models.DocumentsTranslation, Db.DocumentsTranslation>();
}
}
}

View File

@ -1,363 +0,0 @@
using AutoMapper;
using DamageAssesment.Api.Documents.Db;
using DamageAssesment.Api.Documents.Interfaces;
using DamageAssesment.Api.Documents.Models;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Internal;
using System;
using System.Diagnostics.Eventing.Reader;
namespace DamageAssesment.Api.Documents.Providers
{
public class documentsProvider : IDocumentsProvider
{
private DocumentDbContext DocumentDbContext;
private ILogger<documentsProvider> logger;
private IUploadService uploadservice;
private IMapper mapper;
public documentsProvider(DocumentDbContext DocumentDbContext, ILogger<documentsProvider> logger, IMapper mapper, IUploadService uploadservice)
{
this.DocumentDbContext = DocumentDbContext;
this.logger = logger;
this.mapper = mapper;
this.uploadservice = uploadservice;
SeedData();
}
private void SeedData()
{
if (!DocumentDbContext.LinkTypes.Any())
{
DocumentDbContext.LinkTypes.Add(new Db.LinkType() {TypeText = "Forms",IsActive=true, IsAttachment=true });
DocumentDbContext.LinkTypes.Add(new Db.LinkType() {TypeText = "Communiques",IsActive = true,IsAttachment=false });
DocumentDbContext.LinkTypes.Add(new Db.LinkType() {TypeText = "Memos",IsActive = true,IsAttachment=true });
DocumentDbContext.SaveChanges();
}
if (!DocumentDbContext.Documents.Any())
{
FileModel fileModel = new FileModel() { FileName = "Sample", FileContent = "c2FtcGxl", FileExtension = ".txt" };
DocumentInfo documentInfo = new DocumentInfo() { linkTypeId = 1, url = "Sample", File = fileModel };
Models.Document document = uploadservice.UploadDocument(0, documentInfo);
DocumentDbContext.Documents.Add(mapper.Map<Models.Document, Db.Document>(document));
DocumentDbContext.SaveChanges();
}
if (!DocumentDbContext.DocumentsTranslations.Any())
{
Db.DocumentsTranslation documents = new Db.DocumentsTranslation { DocumentId = 1, title = "Test", description = "ss", Language = "en" };
DocumentDbContext.DocumentsTranslations.Add(documents);
DocumentDbContext.SaveChanges();
}
}
public async Task<(bool IsSuccess, IEnumerable<Models.Document> documents, string ErrorMessage)> GetDocumnetsByLinkAsync(string Language, string LinkType)
{
try
{
logger?.LogInformation("Query Question");
var documents=new List<Db.Document>();
if(String.IsNullOrEmpty(LinkType))
documents = await DocumentDbContext.Documents.AsNoTracking().Where(q => q.IsActive).ToListAsync();
else
documents = await DocumentDbContext.Documents.AsNoTracking().Where(q => q.IsActive &&
q.linkTypeId == (DocumentDbContext.LinkTypes.AsNoTracking().Where(a => a.TypeText.ToLower() == LinkType.ToLower()).Select(a => a.Id).FirstOrDefault())).ToListAsync();
if (documents != null)
{
var result = mapper.Map<IEnumerable<Db.Document>, IEnumerable<Models.Document>>(documents);
foreach (var item in result)
{
if(!String.IsNullOrEmpty(Language))
item.documentsTranslations = mapper.Map<List<Db.DocumentsTranslation>, List<Models.DocumentsTranslation>>(
DocumentDbContext.DocumentsTranslations.Where(a => a.DocumentId == item.Id && (a.Language.ToLower() == Language.ToLower())).ToList());
else
item.documentsTranslations = mapper.Map<List<Db.DocumentsTranslation>, List<Models.DocumentsTranslation>>(
DocumentDbContext.DocumentsTranslations.Where(a => a.DocumentId == item.Id).ToList());
}
return (true, result, null);
}
return (false, null, "Not found");
}
catch (Exception ex)
{
logger?.LogError(ex.ToString());
return (false, null, ex.Message);
}
}
public async Task<(bool IsSuccess, IEnumerable<Models.Document> documents, string ErrorMessage)> GetDocumnetsAsync()
{
try
{
logger?.LogInformation("Query Question");
var documents = await DocumentDbContext.Documents.AsNoTracking().Where(q => q.IsActive).ToListAsync();
if (documents != null)
{
logger?.LogInformation($"{documents.Count} Document(s) found");
var result = mapper.Map<IEnumerable<Db.Document>, IEnumerable<Models.Document>>(documents);
foreach (var item in result)
{
item.documentsTranslations = mapper.Map<List<Db.DocumentsTranslation>, List<Models.DocumentsTranslation>>(
DocumentDbContext.DocumentsTranslations.Where(a => a.DocumentId == item.Id).ToList());
}
return (true, result, null);
}
return (false, null, "Not found");
}
catch (Exception ex)
{
logger?.LogError(ex.ToString());
return (false, null, ex.Message);
}
}
public async Task<(bool IsSuccess, Models.Document Document, string ErrorMessage)> GetDocumentAsync(int Id)
{
try
{
logger?.LogInformation("Query LinkType");
var Document = await DocumentDbContext.Documents.AsNoTracking().FirstOrDefaultAsync(q => q.Id == Id && q.IsActive);
if (Document != null)
{
logger?.LogInformation($"{Document} customer(s) found");
var result = mapper.Map<Db.Document, Models.Document>(Document);
result.documentsTranslations = mapper.Map<List<Db.DocumentsTranslation>, List<Models.DocumentsTranslation>>(
DocumentDbContext.DocumentsTranslations.Where(a => a.DocumentId == result.Id).ToList());
return (true, result, null);
}
return (false, null, "Not found");
}
catch (Exception ex)
{
logger?.LogError(ex.ToString());
return (false, null, ex.Message);
}
}
public async Task<(bool IsSuccess, Models.Document Document, string ErrorMessage)> PostDocumentAsync(Models.Document Document)
{
try
{
var document = mapper.Map<Models.Document, Db.Document>(Document);
DocumentDbContext.Documents.Add(document);
DocumentDbContext.SaveChanges();
var dbtranslation = mapper.Map<List<Models.DocumentsTranslation>, List<Db.DocumentsTranslation>>(Document.documentsTranslations);
dbtranslation.ForEach(i => i.DocumentId = document.Id);
DocumentDbContext.DocumentsTranslations.AddRange(dbtranslation);
DocumentDbContext.SaveChanges();
Document.Id = document.Id;
return (true, Document, null);
}
catch (Exception ex)
{
logger?.LogError(ex.ToString());
return (false, null, ex.Message);
}
}
public async Task<(bool IsSuccess, Models.Document Document, string ErrorMessage)> UpdateDocumentAsync(Models.Document Document)
{
try
{
if (Document != null)
{
var existing = DocumentDbContext.Documents.AsNoTracking().FirstOrDefault(x => x.Id == Document.Id);
if (existing != null)
{
var document = mapper.Map<Models.Document, Db.Document>(Document);
DocumentDbContext.Documents.Update(document);
DocumentDbContext.SaveChanges();
var oldtranslations = DocumentDbContext.DocumentsTranslations.Where(a => a.DocumentId == Document.Id).ToList();
if (oldtranslations != null)
DocumentDbContext.DocumentsTranslations.RemoveRange(oldtranslations);
var dbtranslation = mapper.Map<List<Models.DocumentsTranslation>, List<Db.DocumentsTranslation>>(Document.documentsTranslations);
dbtranslation.ForEach(i => i.DocumentId = Document.Id);
return (true, Document, "Successful");
}
else
{
logger?.LogInformation($"{Document} Not found");
return (false, null, "Not Found");
}
}
else
{
logger?.LogInformation($"{Document} Bad Request");
return (false, null, "Bad request");
}
}
catch (Exception ex)
{
logger?.LogError(ex.ToString());
return (false, null, ex.Message);
}
}
public async Task<(bool IsSuccess, Models.Document Document, string ErrorMessage)> DeleteDocumentAsync(int Id)
{
try
{
Db.Document Document = DocumentDbContext.Documents.AsNoTracking().Where(a => a.Id == Id).FirstOrDefault();
if (Document == null)
{
return (false, null, "Not Found");
}
Document.IsActive = false;
DocumentDbContext.Documents.Update(Document);
DocumentDbContext.SaveChanges();
return (true, mapper.Map<Db.Document, Models.Document>(Document), $"DocumentId {Id} deleted Successfuly");
}
catch (Exception ex)
{
logger?.LogError(ex.ToString());
return (false, null, ex.Message);
}
}
public async Task<(bool IsSuccess, int counter, string message)> GetDocumentCounter()
{
try
{
int AttachmentId = DocumentDbContext.Documents.Max(a => a.Id);
return (true, AttachmentId, "");
}
catch (Exception ex)
{
return (false, 0, ex.Message);
}
}
//Link Type methods
public async Task<(bool IsSuccess, IEnumerable<Models.LinkType> LinkTypes, string ErrorMessage)> GetLinkTypesAsync()
{
try
{
logger?.LogInformation("Query Question");
var LinkType = await DocumentDbContext.LinkTypes.AsNoTracking().Where(q=>q.IsActive).ToListAsync();
if (LinkType != null)
{
logger?.LogInformation($"{LinkType.Count} LinkTypes(s) found");
var result = mapper.Map<IEnumerable<Db.LinkType>, IEnumerable<Models.LinkType>>(LinkType);
return (true, result, null);
}
return (false, null, "Not found");
}
catch (Exception ex)
{
logger?.LogError(ex.ToString());
return (false, null, ex.Message);
}
}
public async Task<(bool IsSuccess, Models.LinkType LinkType, string ErrorMessage)> GetLinkTypeAsync(int Id)
{
try
{
logger?.LogInformation("Query LinkType");
var LinkType = await DocumentDbContext.LinkTypes.AsNoTracking().FirstOrDefaultAsync(q => q.Id == Id&&q.IsActive);
if (LinkType != null)
{
logger?.LogInformation($"{LinkType} customer(s) found");
var result = mapper.Map<Db.LinkType, Models.LinkType>(LinkType);
return (true, result, null);
}
return (false, null, "Not found");
}
catch (Exception ex)
{
logger?.LogError(ex.ToString());
return (false, null, ex.Message);
}
}
public async Task<(bool IsSuccess, Models.LinkType LinkType, string ErrorMessage)> PostLinkTypeAsync(Models.LinkType LinkType)
{
try
{
logger?.LogInformation("Query LinkType");
if (!LinkTypeExists(LinkType.Id))
{
var dbLink = mapper.Map<Models.LinkType, Db.LinkType>(LinkType);
DocumentDbContext.LinkTypes.Add(dbLink);
DocumentDbContext.SaveChanges();
var result = mapper.Map<Db.LinkType, Models.LinkType>(dbLink);
return (true, result, null);
}
return (false, null, "LinkType is already exits");
}
catch (Exception ex)
{
logger?.LogError(ex.ToString());
return (false, null, ex.Message);
}
}
public async Task<(bool IsSuccess, Models.LinkType LinkType, string ErrorMessage)> UpdateLinkTypeAsync(Models.LinkType LinkType)
{
try
{
if (LinkType != null)
{
var existing = DocumentDbContext.LinkTypes.AsNoTracking().FirstOrDefault(x => x.Id == LinkType.Id);
if (existing != null)
{
var dbLink = mapper.Map<Models.LinkType, Db.LinkType>(LinkType);
DocumentDbContext.LinkTypes.Update(dbLink);
DocumentDbContext.SaveChanges();
return (true, mapper.Map<Db.LinkType, Models.LinkType>(dbLink), "Successful");
}
else
{
logger?.LogInformation($"{LinkType} Not found");
return (false, null, "Not Found");
}
}
else
{
logger?.LogInformation($"{LinkType} Bad Request");
return (false, null, "Bad request");
}
}
catch (Exception ex)
{
logger?.LogError(ex.ToString());
return (false, null, ex.Message);
}
}
public async Task<(bool IsSuccess, Models.LinkType LinkType, string ErrorMessage)> DeleteLinkTypeAsync(int Id)
{
try
{
Db.LinkType LinkType = DocumentDbContext.LinkTypes.AsNoTracking().Where(a => a.Id == Id).FirstOrDefault();
if (LinkType == null)
{
return (false, null, "Not Found");
}
LinkType.IsActive = false;
DocumentDbContext.LinkTypes.Update(LinkType);
DocumentDbContext.SaveChanges();
return (true, mapper.Map<Db.LinkType, Models.LinkType>(LinkType), $"LinkTypeId {Id} deleted Successfuly");
}
catch (Exception ex)
{
logger?.LogError(ex.ToString());
return (false, null, ex.Message);
}
}
private bool LinkTypeExists(int id)
{
return DocumentDbContext.LinkTypes.AsNoTracking().Count(e => e.Id == id) > 0;
}
}
}

View File

@ -1,123 +0,0 @@
using AutoMapper;
using Azure;
using DamageAssesment.Api.Documents.Db;
using DamageAssesment.Api.Documents.Interfaces;
using DamageAssesment.Api.Documents.Models;
using Microsoft.AspNetCore.Http;
using Microsoft.EntityFrameworkCore.Metadata.Internal;
using System.Diagnostics.Metrics;
using System.Net.Http;
using System.Security.AccessControl;
using System.Security.Principal;
namespace DamageAssesment.Api.Documents.Providers
{
public class UploadService : IUploadService
{
private ILogger<UploadService> logger;
private IMapper mapper;
private string uploadpath = "";
private string Deletepath = "";
public UploadService(IConfiguration configuration, ILogger<UploadService> logger, IMapper mapper)
{
this.logger = logger;
this.mapper = mapper;
uploadpath = configuration.GetValue<string>("Fileupload:folderpath");
Deletepath = configuration.GetValue<string>("Fileupload:Deletepath");
}
public Models.Document UploadDocument(int counter, DocumentInfo documentInfo)
{
Models.Document Documents = new Models.Document();
try
{
string path = "", UserfileName="";
if (documentInfo.File != null)
{
counter++;
var fullDirectoryPath = Path.Combine(Directory.GetCurrentDirectory(), uploadpath);
if (!Directory.Exists(fullDirectoryPath)) //Create deirectory if does not exist
Directory.CreateDirectory(fullDirectoryPath);
UserfileName = Path.GetFileName(documentInfo.File.FileName);
var fileName = String.Format("Document_{0}{1}", counter, documentInfo.File.FileExtension);
path = Path.Combine(fullDirectoryPath, fileName);
File.WriteAllBytes(path, Convert.FromBase64String(documentInfo.File.FileContent));
}
Documents=new Models.Document (){ linkTypeId = documentInfo.linkTypeId,
documentsTranslations = documentInfo.documentsTranslations,
docName = UserfileName,
url = documentInfo.url, Path = path,IsActive =true,dateCreated=DateTime.Now,dateUpdated=DateTime.Now};
return Documents;
}
catch (Exception ex) {
return new Models.Document();
}
}
public Models.Document UpdateDocuments(Models.Document document, DocumentInfo documentInfo)
{
try
{
Deletefile(document.Path);
var fullDirectoryPath = Path.Combine(Directory.GetCurrentDirectory(), uploadpath);
if (!Directory.Exists(fullDirectoryPath)) //Create deirectory if does not exist
Directory.CreateDirectory(fullDirectoryPath);
string path = "", UserfileName = "";
if (documentInfo.File != null)
{
UserfileName = Path.GetFileName(documentInfo.File.FileName);
var fileName = String.Format("Document_{0}{1}", documentInfo.Id, documentInfo.File.FileExtension);
path = Path.Combine(fullDirectoryPath, fileName);
File.WriteAllBytes(path, Convert.FromBase64String(documentInfo.File.FileContent));
}
Models.Document Documents = new Models.Document()
{
Id = documentInfo.Id,
linkTypeId = documentInfo.linkTypeId,
documentsTranslations=documentInfo.documentsTranslations,
docName = UserfileName,
url = documentInfo.url,
Path = path,
IsActive = true,
dateCreated = document.dateCreated,
dateUpdated = DateTime.Now
};
return Documents;
}
catch (Exception ex) {
return new Models.Document();
}
}
public void Deletefile(string path)
{
if (path != "")
{
FileInfo file = new FileInfo(path);
if (file?.Exists??false)//check file exsit or not
{
file.Delete();
}
}
}
public void Movefile(string path)
{
if (path != "")
{
var pathToSave = Path.Combine(Directory.GetCurrentDirectory(), Deletepath);
if (!Directory.Exists(pathToSave)) //Create deirectory if does not exist
Directory.CreateDirectory(pathToSave);
FileInfo file = new FileInfo(path);
if (file?.Exists ?? false)//check file exsit or not
{
string filename = file.Name.Replace(file.Extension, " ") + DateTime.Now.ToShortDateString().Replace("/","_") + file.Extension;
file.MoveTo(pathToSave+"\\"+ filename);
}
}
}
}
}

View File

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

View File

@ -43,11 +43,11 @@ namespace DamageAssesment.Api.Employees.Test
public async Task GetEmployeeAsync_ShouldReturnStatusCode200()
{
var mockEmployeeService = new Mock<IEmployeesProvider>();
var mockResponse = await MockData.getOkResponse("Emp1");
mockEmployeeService.Setup(service => service.GetEmployeeByIdAsync("Emp1")).ReturnsAsync(mockResponse);
var mockResponse = await MockData.getOkResponse(1);
mockEmployeeService.Setup(service => service.GetEmployeeByIdAsync(1)).ReturnsAsync(mockResponse);
var EmployeeProvider = new EmployeesController(mockEmployeeService.Object);
var result = (OkObjectResult)await EmployeeProvider.GetEmployeeByIdAsync("Emp1");
var result = (OkObjectResult)await EmployeeProvider.GetEmployeeByIdAsync(1);
Assert.Equal(200, result.StatusCode);
}
@ -57,10 +57,10 @@ namespace DamageAssesment.Api.Employees.Test
{
var mockEmployeeService = new Mock<IEmployeesProvider>();
var mockResponse = await MockData.getNotFoundResponse();
mockEmployeeService.Setup(service => service.GetEmployeeByIdAsync("Emp99")).ReturnsAsync(mockResponse);
mockEmployeeService.Setup(service => service.GetEmployeeByIdAsync(99999)).ReturnsAsync(mockResponse);
var EmployeeProvider = new EmployeesController(mockEmployeeService.Object);
var result = (NotFoundResult)await EmployeeProvider.GetEmployeeByIdAsync("Emp99");
var result = (NotFoundResult)await EmployeeProvider.GetEmployeeByIdAsync(99999);
Assert.Equal(404, result.StatusCode);
}
@ -68,7 +68,7 @@ namespace DamageAssesment.Api.Employees.Test
public async Task PostEmployeeAsync_ShouldReturnStatusCode200()
{
var mockEmployeeService = new Mock<IEmployeesProvider>();
var mockResponse = await MockData.getOkResponse("Emp1");
var mockResponse = await MockData.getOkResponse(1);
var mockInputEmployee = await MockData.getInputEmployeeData();
mockEmployeeService.Setup(service => service.PostEmployeeAsync(mockInputEmployee)).ReturnsAsync(mockResponse);
@ -96,12 +96,12 @@ namespace DamageAssesment.Api.Employees.Test
public async Task PutEmployeeAsync_ShouldReturnStatusCode200()
{
var mockEmployeeService = new Mock<IEmployeesProvider>();
var mockResponse = await MockData.getOkResponse("Emp1");
var mockResponse = await MockData.getOkResponse(1);
var mockInputEmployee = await MockData.getInputEmployeeData();
mockEmployeeService.Setup(service => service.UpdateEmployeeAsync("Emp1",mockInputEmployee)).ReturnsAsync(mockResponse);
mockEmployeeService.Setup(service => service.UpdateEmployeeAsync(1,mockInputEmployee)).ReturnsAsync(mockResponse);
var EmployeeProvider = new EmployeesController(mockEmployeeService.Object);
var result = (OkObjectResult)await EmployeeProvider.UpdateEmployee("Emp1",mockInputEmployee);
var result = (OkObjectResult)await EmployeeProvider.UpdateEmployee(1,mockInputEmployee);
Assert.Equal(200, result.StatusCode);
}
@ -112,10 +112,10 @@ namespace DamageAssesment.Api.Employees.Test
var mockEmployeeService = new Mock<IEmployeesProvider>();
var mockResponse = await MockData.getNotFoundResponse();
var mockInputEmployee = await MockData.getInputEmployeeData();
mockEmployeeService.Setup(service => service.UpdateEmployeeAsync("Emp1", mockInputEmployee)).ReturnsAsync(mockResponse);
mockEmployeeService.Setup(service => service.UpdateEmployeeAsync(1, mockInputEmployee)).ReturnsAsync(mockResponse);
var EmployeeProvider = new EmployeesController(mockEmployeeService.Object);
var result = (NotFoundObjectResult)await EmployeeProvider.UpdateEmployee("Emp1", mockInputEmployee);
var result = (NotFoundObjectResult)await EmployeeProvider.UpdateEmployee(1, mockInputEmployee);
Assert.Equal(404, result.StatusCode);
}
@ -126,10 +126,10 @@ namespace DamageAssesment.Api.Employees.Test
var mockEmployeeService = new Mock<IEmployeesProvider>();
var mockResponse = await MockData.getBadRequestResponse();
var mockInputEmployee = await MockData.getInputEmployeeData();
mockEmployeeService.Setup(service => service.UpdateEmployeeAsync("Emp1", mockInputEmployee)).ReturnsAsync(mockResponse);
mockEmployeeService.Setup(service => service.UpdateEmployeeAsync(1, mockInputEmployee)).ReturnsAsync(mockResponse);
var EmployeeProvider = new EmployeesController(mockEmployeeService.Object);
var result = (BadRequestObjectResult)await EmployeeProvider.UpdateEmployee("Emp1", mockInputEmployee);
var result = (BadRequestObjectResult)await EmployeeProvider.UpdateEmployee(1, mockInputEmployee);
Assert.Equal(400, result.StatusCode);
}
@ -138,12 +138,12 @@ namespace DamageAssesment.Api.Employees.Test
public async Task DeleteEmployeeAsync_ShouldReturnStatusCode200()
{
var mockEmployeeService = new Mock<IEmployeesProvider>();
var mockResponse = await MockData.getOkResponse("Emp1");
var mockResponse = await MockData.getOkResponse(1);
mockEmployeeService.Setup(service => service.DeleteEmployeeAsync("Emp1")).ReturnsAsync(mockResponse);
mockEmployeeService.Setup(service => service.DeleteEmployeeAsync(1)).ReturnsAsync(mockResponse);
var EmployeeProvider = new EmployeesController(mockEmployeeService.Object);
var result = (OkObjectResult)await EmployeeProvider.DeleteEmployee("Emp1");
var result = (OkObjectResult)await EmployeeProvider.DeleteEmployee(1);
Assert.Equal(200, result.StatusCode);
}
@ -153,10 +153,10 @@ namespace DamageAssesment.Api.Employees.Test
{
var mockEmployeeService = new Mock<IEmployeesProvider>();
var mockResponse = await MockData.getNotFoundResponse();
mockEmployeeService.Setup(service => service.DeleteEmployeeAsync("Emp1")).ReturnsAsync(mockResponse);
mockEmployeeService.Setup(service => service.DeleteEmployeeAsync(1)).ReturnsAsync(mockResponse);
var EmployeeProvider = new EmployeesController(mockEmployeeService.Object);
var result = (NotFoundResult)await EmployeeProvider.DeleteEmployee("Emp1");
var result = (NotFoundResult)await EmployeeProvider.DeleteEmployee(1);
Assert.Equal(404, result.StatusCode);
}

View File

@ -1,8 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Text;
namespace DamageAssesment.Api.Employees.Test
{
@ -15,13 +11,13 @@ namespace DamageAssesment.Api.Employees.Test
for (int i = 0; i < 10; i++)
{
list.Append(new Employees.Models.Employee { Id = "Emp"+i, Name = "Emoployee"+i, Email = "abc"+i+"@gmail.com", OfficePhoneNumber = "12345678", BirthDate = DateTime.Now.AddYears(-18-i), IsActive = true, PreferredLanguage = "en" });
list.Append(new Employees.Models.Employee { Id = i, Name = "Emoployee"+i, Email = "abc"+i+"@gmail.com", OfficePhoneNumber = "12345678", BirthDate = DateTime.Now.AddYears(-18-i), IsActive = true, PreferredLanguage = "en" });
}
return (true, list, null);
}
public static async Task<(bool, Employees.Models.Employee, string)> getOkResponse(string Id)
public static async Task<(bool, Employees.Models.Employee, string)> getOkResponse(int Id)
{
var Employees = await getOkResponse();
var Employee = Employees.Item2.FirstOrDefault(s => s.Id == Id);
@ -45,7 +41,7 @@ namespace DamageAssesment.Api.Employees.Test
public static async Task<Models.Employee> getInputEmployeeData()
{
return new Models.Employee { Id = "Emp1", Name = "ABC1", Email = "abc1@gmail.com", OfficePhoneNumber = "12345678", BirthDate = DateTime.Now.AddYears(-18), IsActive = true, PreferredLanguage = "en" };
return new Models.Employee { Id = 1, Name = "ABC1", Email = "abc1@gmail.com", OfficePhoneNumber = "12345678", BirthDate = DateTime.Now.AddYears(-18), IsActive = true, PreferredLanguage = "en" };
}

View File

@ -4,7 +4,6 @@ using Microsoft.AspNetCore.Mvc;
namespace DamageAssesment.Api.Employees.Controllers
{
//[Route("api")]
[ApiController]
public class EmployeesController : ControllerBase
{
@ -20,7 +19,7 @@ namespace DamageAssesment.Api.Employees.Controllers
/// GET request for retrieving employees.
/// </summary>
[HttpGet("Employees")]
[HttpGet("employees")]
public async Task<ActionResult> GetEmployeesAsync()
{
@ -37,11 +36,11 @@ namespace DamageAssesment.Api.Employees.Controllers
/// GET request for retrieving an employee by ID.
/// </summary>
[HttpGet("Employees/{Id}")]
public async Task<ActionResult> GetEmployeeByIdAsync(string Id)
[HttpGet("employees/{id}")]
public async Task<ActionResult> GetEmployeeByIdAsync(int id)
{
var result = await EmployeeProvider.GetEmployeeByIdAsync(Id);
var result = await EmployeeProvider.GetEmployeeByIdAsync(id);
if (result.IsSuccess)
{
return Ok(result.Employee);
@ -54,12 +53,12 @@ namespace DamageAssesment.Api.Employees.Controllers
/// PUT request for updating an existing employee.
/// </summary>
/// <param name="Employee">The updated employee object.</param>
[HttpPut("Employees")]
public async Task<IActionResult> UpdateEmployee(string Id, Models.Employee Employee)
[HttpPut("employees/{id}")]
public async Task<IActionResult> UpdateEmployee(int id, Models.Employee Employee)
{
if (Employee != null)
{
var result = await this.EmployeeProvider.UpdateEmployeeAsync(Id,Employee);
var result = await this.EmployeeProvider.UpdateEmployeeAsync(id,Employee);
if (result.IsSuccess)
{
return Ok(result.Employee);
@ -76,7 +75,7 @@ namespace DamageAssesment.Api.Employees.Controllers
/// POST request for creating a new employee.
/// </summary>
/// <param name="Employee">The employee information for creating a new employee.</param>
[HttpPost("Employees")]
[HttpPost("employees")]
public async Task<IActionResult> CreateEmployee(Models.Employee Employee)
{
if (Employee != null)
@ -88,14 +87,14 @@ namespace DamageAssesment.Api.Employees.Controllers
}
return BadRequest(result.ErrorMessage);
}
return CreatedAtRoute("DefaultApi", new { id = Employee.Id }, Employee);
return CreatedAtRoute("DefaultApi", new { Id = Employee.Id }, Employee);
}
/// <summary>
/// DELETE request for deleting an existing employee.
/// </summary>
/// <param name="id">The ID of the employee to be deleted.</param>
[HttpDelete("Employees/{id}")]
public async Task<IActionResult> DeleteEmployee(string id)
[HttpDelete("employees/{id}")]
public async Task<IActionResult> DeleteEmployee(int id)
{
var result = await this.EmployeeProvider.DeleteEmployeeAsync(id);
if (result.IsSuccess)

View File

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

View File

@ -1,11 +1,15 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace DamageAssesment.Api.Employees.Db
{
[Table("Employees")]
public class Employee
{
[Key]
public string Id { get; set; }
public int Id { get; set; }
[StringLength(50)]
public string EmployeeCode { get; set; }
[StringLength(50)]
public string Name { get; set; }
@ -17,7 +21,7 @@ namespace DamageAssesment.Api.Employees.Db
[StringLength(50)]
public string Email { get; set; }
public bool IsActive {get;set;}
public bool IsActive { get; set; }
public string? PreferredLanguage { get; set; } = "en";
}
}

View File

@ -8,5 +8,14 @@ namespace DamageAssesment.Api.Employees.Db
public EmployeeDbContext(DbContextOptions options) : base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Employee>()
.Property(item => item.Id)
.ValueGeneratedOnAdd();
}
}
}

View File

@ -1,39 +0,0 @@
#See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging.
# Use the ASP.NET base image
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80
# Use the SDK image for building
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
# Copy the project file and restore dependencies
COPY ["DamageAssesment.Api.Employees/DamageAssesment.Api.Employees.csproj", "DamageAssesment.Api.Employees/"]
RUN dotnet restore "DamageAssesment.Api.Employees/DamageAssesment.Api.Employees.csproj"
# Copy the source code
COPY . .
WORKDIR "/src/DamageAssesment.Api.Employees"
# Build the application
RUN dotnet build "DamageAssesment.Api.Employees.csproj" -c Release -o /app/build
# Publish the application
FROM build AS publish
RUN dotnet publish "DamageAssesment.Api.Employees.csproj" -c Release -o /app/publish /p:UseAppHost=false
# Set up the final image
FROM base AS final
WORKDIR /app
# Copy the published files
COPY --from=publish /app/publish .
## Set up the volume and copy the XML comments
#VOLUME /xmlcomments
#COPY ["DamageAssesment.Api.Employees.xml", "/xmlcomments/DamageAssesment.Api.Employees.xml"]
# Specify the entry point for the container
ENTRYPOINT ["dotnet", "DamageAssesment.Api.Employees.dll"]

View File

@ -3,10 +3,10 @@
public interface IEmployeesProvider
{
Task<(bool IsSuccess, IEnumerable<Models.Employee> Employees, string ErrorMessage)> GetEmployeesAsync();
Task<(bool IsSuccess, Models.Employee Employee, string ErrorMessage)> GetEmployeeByIdAsync(string Id);
Task<(bool IsSuccess, Models.Employee Employee, string ErrorMessage)> GetEmployeeByIdAsync(int Id);
Task<(bool IsSuccess, Models.Employee Employee, string ErrorMessage)> PostEmployeeAsync(Models.Employee Employee);
Task<(bool IsSuccess, Models.Employee Employee, string ErrorMessage)> UpdateEmployeeAsync(string Id, Models.Employee Employee);
Task<(bool IsSuccess, Models.Employee Employee, string ErrorMessage)> DeleteEmployeeAsync(string Id);
Task<(bool IsSuccess, Models.Employee Employee, string ErrorMessage)> UpdateEmployeeAsync(int Id, Models.Employee Employee);
Task<(bool IsSuccess, Models.Employee Employee, string ErrorMessage)> DeleteEmployeeAsync(int Id);
void SeedData();
}
}

View File

@ -4,7 +4,8 @@ namespace DamageAssesment.Api.Employees.Models
{
public class Employee
{
public string Id { get; set; }
public int Id { get; set; }
public string EmployeeCode { get; set; }
public string Name { get; set; }
public DateTime BirthDate { get; set; }
public string OfficePhoneNumber { get; set; }

View File

@ -7,6 +7,7 @@ namespace DamageAssesment.Api.Employees.Profiles
public EmployeesProfile()
{
CreateMap<Db.Employee, Models.Employee>();
CreateMap<Models.Employee, Db.Employee>();
}
}
}

View File

@ -32,21 +32,15 @@ var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
using (var serviceScope = app.Services.CreateScope())
{
var services = serviceScope.ServiceProvider;
var employeeProvider = services.GetRequiredService<IEmployeesProvider>();
employeeProvider.SeedData();
var employeesProvider = services.GetRequiredService<IEmployeesProvider>();
employeesProvider.SeedData();
}
app.UseSwagger();
app.UseSwaggerUI(options =>
{
//switch for local environment
// options.SwaggerEndpoint("/swagger/v1/swagger.json", "");
options.SwaggerEndpoint("/employees/swagger/v1/swagger.json", "");
});
}
app.UseAuthorization();

View File

@ -1,30 +1,4 @@
{
"profiles": {
"DamageAssesment.Api.Employees": {
"commandName": "Project",
"launchBrowser": true,
"launchUrl": "swagger",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"dotnetRunMessages": true,
"applicationUrl": "http://localhost:5135"
},
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"launchUrl": "swagger",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"Docker": {
"commandName": "Docker",
"launchBrowser": true,
"launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}/swagger",
"publishAllPorts": true
}
},
{
"$schema": "https://json.schemastore.org/launchsettings.json",
"iisSettings": {
"windowsAuthentication": false,
@ -33,5 +7,25 @@
"applicationUrl": "http://localhost:14425",
"sslPort": 0
}
},
"profiles": {
"DamageAssesment.Api.Employees": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"launchUrl": "swagger",
"applicationUrl": "http://localhost:5135",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"launchUrl": "swagger",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}
}

View File

@ -45,12 +45,12 @@ namespace DamageAssesment.Api.Employees.Providers
}
public async Task<(bool IsSuccess, Models.Employee Employee, string ErrorMessage)> GetEmployeeByIdAsync(string Id)
public async Task<(bool IsSuccess, Models.Employee Employee, string ErrorMessage)> GetEmployeeByIdAsync(int Id)
{
try
{
logger?.LogInformation("Query Employee");
var Employee = await EmployeeDbContext.Employees.AsNoTracking().FirstOrDefaultAsync(q => q.Id.ToLower() == Id.ToLower());
var Employee = await EmployeeDbContext.Employees.AsNoTracking().FirstOrDefaultAsync(q => q.Id == Id);
if (Employee != null)
{
logger?.LogInformation($"{Employee} customer(s) found");
@ -72,13 +72,15 @@ namespace DamageAssesment.Api.Employees.Providers
Db.Employee _employee = mapper.Map<Models.Employee, Db.Employee>(Employee);
logger?.LogInformation("Query Employee");
if (!EmployeeExists(Employee.Id))
if (!EmployeeCodeExists(Employee.EmployeeCode))
{
EmployeeDbContext.Employees.Add(_employee);
Employee.Id = _employee.Id;
EmployeeDbContext.SaveChanges();
return (true, Employee, null);
//return (true, Employee, null);
return (true, mapper.Map<Db.Employee, Models.Employee>(_employee), null);
}
return (false, null, "Employee is already exits");
return (false, null, "Employee code is already exits");
}
catch (Exception ex)
{
@ -86,19 +88,20 @@ namespace DamageAssesment.Api.Employees.Providers
return (false, null, ex.Message);
}
}
public async Task<(bool IsSuccess, Models.Employee Employee, string ErrorMessage)> UpdateEmployeeAsync(string Id , Models.Employee Employee)
public async Task<(bool IsSuccess, Models.Employee Employee, string ErrorMessage)> UpdateEmployeeAsync(int Id, Models.Employee Employee)
{
try
{
if (Employee != null)
{
var _employee = await EmployeeDbContext.Employees.AsNoTracking().Where(s => s.Id.ToLower() == Id.ToLower()).FirstOrDefaultAsync();
var _employee = await EmployeeDbContext.Employees.AsNoTracking().Where(s => s.Id == Id).FirstOrDefaultAsync();
if (_employee != null)
{
Db.Employee vEmployee = mapper.Map<Models.Employee, Db.Employee>(Employee);
EmployeeDbContext.Employees.Update(vEmployee);
EmployeeDbContext.SaveChanges();
Employee.Id = Id;
return (true, Employee, "Successful");
}
else
@ -120,11 +123,11 @@ namespace DamageAssesment.Api.Employees.Providers
return (false, null, ex.Message);
}
}
public async Task<(bool IsSuccess, Models.Employee Employee, string ErrorMessage)> DeleteEmployeeAsync(string Id)
public async Task<(bool IsSuccess, Models.Employee Employee, string ErrorMessage)> DeleteEmployeeAsync(int Id)
{
try
{
Db.Employee Employee = EmployeeDbContext.Employees.AsNoTracking().Where(a => a.Id.ToLower() == Id.ToLower()).FirstOrDefault();
Db.Employee Employee = EmployeeDbContext.Employees.AsNoTracking().Where(a => a.Id == Id).FirstOrDefault();
if (Employee == null)
{
return (false, null, "Not Found");
@ -137,24 +140,29 @@ namespace DamageAssesment.Api.Employees.Providers
{
logger?.LogError(ex.ToString());
return (false,null, ex.Message);
return (false, null, ex.Message);
}
}
private bool EmployeeExists(string id)
private bool EmployeeExists(int id)
{
return EmployeeDbContext.Employees.AsNoTracking().Count(e => e.Id.ToLower() == id.ToLower()) > 0;
return EmployeeDbContext.Employees.AsNoTracking().Count(e => e.Id == id) > 0;
}
private bool EmployeeCodeExists(string employeeCode)
{
return EmployeeDbContext.Employees.AsNoTracking().Count(e => e.EmployeeCode.ToLower() == employeeCode.ToLower()) > 0;
}
public void SeedData()
{
if (!EmployeeDbContext.Employees.Any())
{
EmployeeDbContext.Employees.Add(new Db.Employee() { Id = "Emp1", Name = "ABC1", Email = "abc1@gmail.com", OfficePhoneNumber = "12345678",BirthDate=DateTime.Now.AddYears(-18), IsActive = true,PreferredLanguage="en" });
EmployeeDbContext.Employees.Add(new Db.Employee() { Id = "Emp2", Name = "ABC2", Email = "abc2@gmail.com", OfficePhoneNumber = "12345678", BirthDate = DateTime.Now.AddYears(-22), IsActive = true, PreferredLanguage = "fr" });
EmployeeDbContext.Employees.Add(new Db.Employee() { Id = "Emp3", Name = "ABC3", Email = "abc3@gmail.com", OfficePhoneNumber = "12345678", BirthDate = DateTime.Now.AddYears(-30) ,IsActive = true, PreferredLanguage = "fr" });
EmployeeDbContext.Employees.Add(new Db.Employee() { Id = "Emp4", Name = "ABC4", Email = "abc4@gmail.com", OfficePhoneNumber = "12345678", BirthDate = DateTime.Now.AddYears(-20) ,IsActive = true, PreferredLanguage = "en" });
EmployeeDbContext.Employees.Add(new Db.Employee() { Id = "Emp5", Name = "ABC5", Email = "abc5@gmail.com", OfficePhoneNumber = "12345678", BirthDate = DateTime.Now.AddYears(-23) ,IsActive = true, PreferredLanguage = "es" });
EmployeeDbContext.Employees.Add(new Db.Employee() { Id = "Emp6", Name = "ABC6", Email = "abc6@gmail.com", OfficePhoneNumber = "12345678", BirthDate = DateTime.Now.AddYears(-32) ,IsActive = true, PreferredLanguage = "es" });
EmployeeDbContext.Employees.Add(new Db.Employee() { EmployeeCode = "10101", Name = "David", Email = "david@gmail.com", OfficePhoneNumber = "12345678", BirthDate = DateTime.Now.AddYears(-18), IsActive = true, PreferredLanguage = "en" });
EmployeeDbContext.Employees.Add(new Db.Employee() { EmployeeCode = "20202", Name = "Smith", Email = "smith@gmail.com", OfficePhoneNumber = "12345678", BirthDate = DateTime.Now.AddYears(-22), IsActive = true, PreferredLanguage = "fr" });
//EmployeeDbContext.Employees.Add(new Db.Employee() { Id = 3, EmployeeCode = "Emp3", Name = "ABC3", Email = "abc3@gmail.com", OfficePhoneNumber = "12345678", BirthDate = DateTime.Now.AddYears(-30), IsActive = true, PreferredLanguage = "fr" });
//EmployeeDbContext.Employees.Add(new Db.Employee() { Id = 4, EmployeeCode = "Emp4", Name = "ABC4", Email = "abc4@gmail.com", OfficePhoneNumber = "12345678", BirthDate = DateTime.Now.AddYears(-20), IsActive = true, PreferredLanguage = "en" });
//EmployeeDbContext.Employees.Add(new Db.Employee() { Id = 5, EmployeeCode = "Emp5", Name = "ABC5", Email = "abc5@gmail.com", OfficePhoneNumber = "12345678", BirthDate = DateTime.Now.AddYears(-23), IsActive = true, PreferredLanguage = "es" });
//EmployeeDbContext.Employees.Add(new Db.Employee() { Id = 6, EmployeeCode = "Emp6", Name = "ABC6", Email = "abc6@gmail.com", OfficePhoneNumber = "12345678", BirthDate = DateTime.Now.AddYears(-32), IsActive = true, PreferredLanguage = "es" });
EmployeeDbContext.SaveChanges();
}

View File

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

View File

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

View File

@ -40,11 +40,11 @@ namespace DamageAssesment.Api.Locations.Test
public async Task GetLocationsByIdAsync_ShouldReturnStatusCode200()
{
var mockLocationService = new Mock<ILocationsProvider>();
var mockResponse = await MockData.getOkResponseLocation("Loc1");
mockLocationService.Setup(service => service.GetLocationByIdAsync("Loc1")).ReturnsAsync(mockResponse);
var mockResponse = await MockData.getOkResponseLocation(1);
mockLocationService.Setup(service => service.GetLocationByIdAsync(1)).ReturnsAsync(mockResponse);
var locationProvider = new LocationsController(mockLocationService.Object);
var result = (OkObjectResult)await locationProvider.GetLocationByIdAsync("Loc1");
var result = (OkObjectResult)await locationProvider.GetLocationByIdAsync(1);
Assert.Equal(200, result.StatusCode);
}
@ -55,10 +55,10 @@ namespace DamageAssesment.Api.Locations.Test
{
var mockLocationService = new Mock<ILocationsProvider>();
var mockResponse = await MockData.getLocationNotFoundResponse();
mockLocationService.Setup(service => service.GetLocationByIdAsync("Loc1")).ReturnsAsync(mockResponse);
mockLocationService.Setup(service => service.GetLocationByIdAsync(1)).ReturnsAsync(mockResponse);
var locationProvider = new LocationsController(mockLocationService.Object);
var result = (NotFoundResult)await locationProvider.GetLocationByIdAsync("Loc1");
var result = (NotFoundResult)await locationProvider.GetLocationByIdAsync(1);
Assert.Equal(404, result.StatusCode);
}
@ -68,8 +68,8 @@ namespace DamageAssesment.Api.Locations.Test
public async Task PostLocationAsync_ShouldReturnStatusCode200()
{
var mockLocationService = new Mock<ILocationsProvider>();
var mockResponse = await MockData.getOkResponseLocation("Loc1");
var mockInputLocation = new Models.Location { Id = "Loc1", RegionId = "R1", Name = "Location 1", SchoolType = "US", MaintenanceCenter = "1" };
var mockResponse = await MockData.getOkResponseLocation(1);
var mockInputLocation = new Models.Location { Id = 1, RegionId = 1, Name = "Location 1", SchoolType = "US", MaintenanceCenter = "1" };
mockLocationService.Setup(service => service.PostLocationAsync(mockInputLocation)).ReturnsAsync(mockResponse);
var locationProvider = new LocationsController(mockLocationService.Object);
@ -83,11 +83,11 @@ namespace DamageAssesment.Api.Locations.Test
{
var mockLocationService = new Mock<ILocationsProvider>();
var mockResponse = await MockData.getLocationNotFoundResponse();
var mockInputLocation = new Models.Location { Id = "Loc1", RegionId = "R1", Name = "Location 1", SchoolType = "US", MaintenanceCenter = "1" };
var mockInputLocation = new Models.Location { Id = 1, RegionId = 1, Name = "Location 1", SchoolType = "US", MaintenanceCenter = "1" };
mockLocationService.Setup(service => service.PostLocationAsync(mockInputLocation)).ReturnsAsync(mockResponse);
var locationProvider = new LocationsController(mockLocationService.Object);
var result = (BadRequestResult)await locationProvider.CreateLocation(mockInputLocation);
var result = (BadRequestObjectResult)await locationProvider.CreateLocation(mockInputLocation);
Assert.Equal(400, result.StatusCode);
}
@ -98,11 +98,11 @@ namespace DamageAssesment.Api.Locations.Test
{
var mockLocationService = new Mock<ILocationsProvider>();
var mockResponse = await MockData.getLocation(true, "update success");
var mockInputLocation = new Models.Location { Id = "Loc1", RegionId = "R1", Name = "Location 1", SchoolType = "US", MaintenanceCenter = "1" };
mockLocationService.Setup(service => service.UpdateLocationAsync(mockInputLocation)).ReturnsAsync(mockResponse);
var mockInputLocation = new Models.Location { Id = 1, LocationCode ="Loc1", RegionId = 1, Name = "Location 1", SchoolType = "US", MaintenanceCenter = "1" };
mockLocationService.Setup(service => service.UpdateLocationAsync(1,mockInputLocation)).ReturnsAsync(mockResponse);
var locationProvider = new LocationsController(mockLocationService.Object);
var result = (OkObjectResult)await locationProvider.UpdateLocation(mockInputLocation);
var result = (OkObjectResult)await locationProvider.UpdateLocation(1,mockInputLocation);
Assert.Equal(200, result.StatusCode);
}
@ -112,11 +112,11 @@ namespace DamageAssesment.Api.Locations.Test
{
var mockLocationService = new Mock<ILocationsProvider>();
var mockResponse = await MockData.getLocation(false, null);
var mockInputLocation = new Models.Location { Id = "Loc1", RegionId = "R1", Name = "Location 1", SchoolType = "US", MaintenanceCenter = "1" };
mockLocationService.Setup(service => service.UpdateLocationAsync(mockInputLocation)).ReturnsAsync(mockResponse);
var mockInputLocation = new Models.Location { Id = 1, RegionId = 1, Name = "Location 1", SchoolType = "US", MaintenanceCenter = "1" };
mockLocationService.Setup(service => service.UpdateLocationAsync(1,mockInputLocation)).ReturnsAsync(mockResponse);
var locationProvider = new LocationsController(mockLocationService.Object);
var result = (NotFoundResult)await locationProvider.UpdateLocation(mockInputLocation);
var result = (NotFoundResult)await locationProvider.UpdateLocation(1,mockInputLocation);
Assert.Equal(404, result.StatusCode);
}
@ -127,10 +127,10 @@ namespace DamageAssesment.Api.Locations.Test
{
var mockLocationService = new Mock<ILocationsProvider>();
var mockResponse = await MockData.getLocation(true, "delete success");
mockLocationService.Setup(service => service.DeleteLocationAsync("Loc1")).ReturnsAsync(mockResponse);
mockLocationService.Setup(service => service.DeleteLocationAsync(1)).ReturnsAsync(mockResponse);
var locationProvider = new LocationsController(mockLocationService.Object);
var result = (OkObjectResult)await locationProvider.DeleteLocation("Loc1");
var result = (OkObjectResult)await locationProvider.DeleteLocation(1);
Assert.Equal(200, result.StatusCode);
}
@ -140,10 +140,10 @@ namespace DamageAssesment.Api.Locations.Test
{
var mockLocationService = new Mock<ILocationsProvider>();
var mockResponse = await MockData.getLocation(false, null);
mockLocationService.Setup(service => service.DeleteLocationAsync("Loc1")).ReturnsAsync(mockResponse);
mockLocationService.Setup(service => service.DeleteLocationAsync(1)).ReturnsAsync(mockResponse);
var locationProvider = new LocationsController(mockLocationService.Object);
var result = (NotFoundResult)await locationProvider.DeleteLocation("Loc1");
var result = (NotFoundResult)await locationProvider.DeleteLocation(1);
Assert.Equal(404, result.StatusCode);
}
@ -180,11 +180,11 @@ namespace DamageAssesment.Api.Locations.Test
public async Task GetRegionAsync_ShouldReturnStatusCode200()
{
var mockRegionService = new Mock<IRegionsProvider>();
var mockResponse = await MockData.getOkResponse("1");
mockRegionService.Setup(service => service.GetRegionByIdAsync("1")).ReturnsAsync(mockResponse);
var mockResponse = await MockData.getOkResponse(1);
mockRegionService.Setup(service => service.GetRegionByIdAsync(1)).ReturnsAsync(mockResponse);
var regionProvider = new RegionsController(mockRegionService.Object);
var result = (OkObjectResult)await regionProvider.GetRegionAsync("1");
var result = (OkObjectResult)await regionProvider.GetRegionAsync(1);
Assert.Equal(200, result.StatusCode);
}
@ -194,10 +194,10 @@ namespace DamageAssesment.Api.Locations.Test
{
var mockRegionService = new Mock<IRegionsProvider>();
var mockResponse = await MockData.getNotFoundResponse();
mockRegionService.Setup(service => service.GetRegionByIdAsync("99")).ReturnsAsync(mockResponse);
mockRegionService.Setup(service => service.GetRegionByIdAsync(99999)).ReturnsAsync(mockResponse);
var regionProvider = new RegionsController(mockRegionService.Object);
var result = (NotFoundResult)await regionProvider.GetRegionAsync("99");
var result = (NotFoundResult)await regionProvider.GetRegionAsync(99);
Assert.Equal(404, result.StatusCode);
}
@ -205,7 +205,7 @@ namespace DamageAssesment.Api.Locations.Test
public async Task PostRegionAsync_ShouldReturnStatusCode200()
{
var mockRegionService = new Mock<IRegionsProvider>();
var mockResponse = await MockData.getOkResponse("1");
var mockResponse = await MockData.getOkResponse(1);
var mockInputRegion = await MockData.getInputRegionData();
mockRegionService.Setup(service => service.PostRegionAsync(mockInputRegion)).ReturnsAsync(mockResponse);
@ -233,12 +233,12 @@ namespace DamageAssesment.Api.Locations.Test
public async Task PutRegionAsync_ShouldReturnStatusCode200()
{
var mockRegionService = new Mock<IRegionsProvider>();
var mockResponse = await MockData.getOkResponse("1");
var mockResponse = await MockData.getOkResponse(1);
var mockInputRegion = await MockData.getInputRegionData();
mockRegionService.Setup(service => service.PutRegionAsync(mockInputRegion)).ReturnsAsync(mockResponse);
mockRegionService.Setup(service => service.PutRegionAsync(1,mockInputRegion)).ReturnsAsync(mockResponse);
var regionProvider = new RegionsController(mockRegionService.Object);
var result = (OkObjectResult)await regionProvider.PutRegionAsync(mockInputRegion);
var result = (OkObjectResult)await regionProvider.PutRegionAsync(1,mockInputRegion);
Assert.Equal(200, result.StatusCode);
}
@ -249,10 +249,10 @@ namespace DamageAssesment.Api.Locations.Test
var mockRegionService = new Mock<IRegionsProvider>();
var mockResponse = await MockData.getNotFoundResponse();
var mockInputRegion = await MockData.getInputRegionData();
mockRegionService.Setup(service => service.PutRegionAsync(mockInputRegion)).ReturnsAsync(mockResponse);
mockRegionService.Setup(service => service.PutRegionAsync(1, mockInputRegion)).ReturnsAsync(mockResponse);
var regionProvider = new RegionsController(mockRegionService.Object);
var result = (NotFoundObjectResult)await regionProvider.PutRegionAsync(mockInputRegion);
var result = (NotFoundObjectResult)await regionProvider.PutRegionAsync(1,mockInputRegion);
Assert.Equal(404, result.StatusCode);
}
@ -263,10 +263,10 @@ namespace DamageAssesment.Api.Locations.Test
var mockRegionService = new Mock<IRegionsProvider>();
var mockResponse = await MockData.getBadRequestResponse();
var mockInputRegion = await MockData.getInputRegionData();
mockRegionService.Setup(service => service.PutRegionAsync(mockInputRegion)).ReturnsAsync(mockResponse);
mockRegionService.Setup(service => service.PutRegionAsync(1, mockInputRegion)).ReturnsAsync(mockResponse);
var regionProvider = new RegionsController(mockRegionService.Object);
var result = (BadRequestObjectResult)await regionProvider.PutRegionAsync(mockInputRegion);
var result = (BadRequestObjectResult)await regionProvider.PutRegionAsync(1, mockInputRegion);
Assert.Equal(400, result.StatusCode);
}
@ -275,12 +275,12 @@ namespace DamageAssesment.Api.Locations.Test
public async Task DeleteRegionAsync_ShouldReturnStatusCode200()
{
var mockRegionService = new Mock<IRegionsProvider>();
var mockResponse = await MockData.getOkResponse("1");
var mockResponse = await MockData.getOkResponse(1);
mockRegionService.Setup(service => service.DeleteRegionAsync("1")).ReturnsAsync(mockResponse);
mockRegionService.Setup(service => service.DeleteRegionAsync(1)).ReturnsAsync(mockResponse);
var regionProvider = new RegionsController(mockRegionService.Object);
var result = (OkObjectResult)await regionProvider.DeleteRegionAsync("1");
var result = (OkObjectResult)await regionProvider.DeleteRegionAsync(1);
Assert.Equal(200, result.StatusCode);
}
@ -291,10 +291,10 @@ namespace DamageAssesment.Api.Locations.Test
var mockRegionService = new Mock<IRegionsProvider>();
var mockResponse = await MockData.getNotFoundResponse();
mockRegionService.Setup(service => service.DeleteRegionAsync("1")).ReturnsAsync(mockResponse);
mockRegionService.Setup(service => service.DeleteRegionAsync(1)).ReturnsAsync(mockResponse);
var regionProvider = new RegionsController(mockRegionService.Object);
var result = (NotFoundResult)await regionProvider.DeleteRegionAsync("1");
var result = (NotFoundResult)await regionProvider.DeleteRegionAsync(1);
Assert.Equal(404, result.StatusCode);
}

View File

@ -9,13 +9,13 @@ namespace DamageAssesment.Api.Locations.Test
for (int i = 0; i < 10; i++)
{
list.Append(new Locations.Models.Region { Id = "R" + i, Abbreviation = "AB" + i, Name = "Region " + i });
list.Append(new Locations.Models.Region { Id = i, Abbreviation = "AB" + i, Name = "Region " + i });
}
return (true, list, null);
}
public static async Task<(bool, Locations.Models.Region, string)> getOkResponse(string Id)
public static async Task<(bool, Locations.Models.Region, string)> getOkResponse(int Id)
{
var regions = await getOkResponse();
var region = regions.Item2.FirstOrDefault(s => s.Id == Id);
@ -29,7 +29,7 @@ namespace DamageAssesment.Api.Locations.Test
for (int i = 0; i < 10; i++)
{
list.Append(new Locations.Models.Location { Id = "Loc"+ i, RegionId = "R"+i, Name ="Location"});
list.Append(new Locations.Models.Location { Id = i, RegionId = i, Name = "Location" });
}
return (true, list, null);
}
@ -39,16 +39,17 @@ namespace DamageAssesment.Api.Locations.Test
return (false, null, null);
}
public static async Task<(bool, Models.Location, string)> getOkResponseLocation(string Id)
public static async Task<(bool, Models.Location, string)> getOkResponseLocation(int Id)
{
var locations = await getOkResponseLocation();
var location = locations.Item2.FirstOrDefault(s => s.Id == Id);
return (true, location, null);
}
public static async Task<(bool, string)> getLocation(bool value,string message)
public static async Task<(bool, Models.Location, string)> getLocation(bool value, string message)
{
return (value,message);
var location = new Models.Location { Id = 1, LocationCode = "Loc1", RegionId = 1, Name = "Location 1", SchoolType = "US", MaintenanceCenter = "1" };
return (value, location, message);
}
public static async Task<(bool, Locations.Models.Location, string)> getLocationNotFoundResponse()
@ -73,7 +74,7 @@ namespace DamageAssesment.Api.Locations.Test
public static async Task<Locations.Models.Region> getInputRegionData()
{
return new Locations.Models.Region { Id = "R99", Name = "Region 99", Abbreviation = "A99" };
return new Locations.Models.Region { Id = 99999, Name = "Region 99", Abbreviation = "A99" };
}
}
}

View File

@ -4,13 +4,10 @@ using Microsoft.AspNetCore.Mvc;
namespace DamageAssesment.Api.Locations.Controllers
{
[Route("Locations")]
//[Route("[controller]")]
[ApiController]
public class LocationsController : ControllerBase
{
private ILocationsProvider LocationProvider;
public LocationsController(ILocationsProvider LocationsProvider)
{
this.LocationProvider = LocationsProvider;
@ -19,25 +16,24 @@ namespace DamageAssesment.Api.Locations.Controllers
/// Get all locations.
/// </summary>
//[HttpGet("locations")]
[HttpGet]
[HttpGet("locations")]
public async Task<ActionResult> GetLocationsAsync()
{
var result = await LocationProvider.GetLocationsAsync();
if (result.IsSuccess)
{
return Ok(result.locations);
return Ok(result.Locations);
}
return NotFound();
return NoContent();
}
/// <summary>
/// Get all locations based on locationdId.
/// </summary>
[HttpGet("{id}")]
public async Task<ActionResult> GetLocationByIdAsync(string id)
[HttpGet("locations/{id}")]
public async Task<ActionResult> GetLocationByIdAsync(int id)
{
var result = await LocationProvider.GetLocationByIdAsync(id);
@ -52,15 +48,15 @@ namespace DamageAssesment.Api.Locations.Controllers
/// Update a Location.
/// </summary>
[HttpPut("{locations}")]
public async Task<IActionResult> UpdateLocation(Models.Location location)
[HttpPut("locations/{id}")]
public async Task<IActionResult> UpdateLocation(int id, Models.Location Location)
{
if (location != null)
if (Location != null)
{
var result = await this.LocationProvider.UpdateLocationAsync(location);
var result = await this.LocationProvider.UpdateLocationAsync(id, Location);
if (result.IsSuccess)
{
return Ok(result.ErrorMessage);
return Ok(result.Location);
}
return NotFound();
}
@ -70,7 +66,7 @@ namespace DamageAssesment.Api.Locations.Controllers
/// Save a new location.
/// </summary>
[HttpPost("{locations}")]
[HttpPost("locations")]
public async Task<IActionResult> CreateLocation(Models.Location Location)
{
if (Location != null)
@ -78,23 +74,23 @@ namespace DamageAssesment.Api.Locations.Controllers
var result = await this.LocationProvider.PostLocationAsync(Location);
if (result.IsSuccess)
{
return Ok(result.Question);
return Ok(result.Location);
}
return NotFound();
return BadRequest(result.ErrorMessage);
}
return CreatedAtRoute("DefaultApi", new { id = Location.Id }, Location);
return BadRequest();
}
/// <summary>
/// Delete an existing location.
/// </summary>
[HttpDelete("{id}")]
public async Task<IActionResult> DeleteLocation(string id)
[HttpDelete("locations/{id}")]
public async Task<IActionResult> DeleteLocation(int id)
{
var result = await this.LocationProvider.DeleteLocationAsync(id);
if (result.IsSuccess)
{
return Ok(result.ErrorMessage);
return Ok(result.Location);
}
return NotFound();
}

View File

@ -3,8 +3,6 @@ using Microsoft.AspNetCore.Mvc;
namespace DamageAssesment.Api.Locations.Controllers
{
//[Route("api/[controller]")]
[Route("[controller]")]
[ApiController]
public class RegionsController : ControllerBase
{
@ -18,13 +16,13 @@ namespace DamageAssesment.Api.Locations.Controllers
/// Get all regions.2
/// </summary>
[HttpGet]
[HttpGet("regions")]
public async Task<ActionResult> GetRegionsAsync()
{
var result = await regionProvider.GetRegionsAsync();
if (result.IsSuccess)
{
return Ok(result.regions);
return Ok(result.Regions);
}
return NoContent();
}
@ -32,10 +30,10 @@ namespace DamageAssesment.Api.Locations.Controllers
/// GET request for retrieving a region by its ID.
/// </summary>
[HttpGet("{Id}")]
public async Task<ActionResult> GetRegionAsync(string Id)
[HttpGet("regions/{id}")]
public async Task<ActionResult> GetRegionAsync(int id)
{
var result = await this.regionProvider.GetRegionByIdAsync(Id);
var result = await this.regionProvider.GetRegionByIdAsync(id);
if (result.IsSuccess)
{
return Ok(result.Region);
@ -46,7 +44,7 @@ namespace DamageAssesment.Api.Locations.Controllers
/// POST request for creating a new region.
/// </summary>
[HttpPost("{region}")]
[HttpPost("regions")]
public async Task<ActionResult> PostRegionAsync(Models.Region region)
{
var result = await this.regionProvider.PostRegionAsync(region);
@ -60,10 +58,10 @@ namespace DamageAssesment.Api.Locations.Controllers
/// PUT request for updating an existing region.
/// </summary>
[HttpPut("{region}")]
public async Task<ActionResult> PutRegionAsync(Models.Region region)
[HttpPut("regions/{id}")]
public async Task<ActionResult> PutRegionAsync(int id, Models.Region region)
{
var result = await this.regionProvider.PutRegionAsync(region);
var result = await this.regionProvider.PutRegionAsync(id,region);
if (result.IsSuccess)
{
return Ok(result.Region);
@ -78,10 +76,10 @@ namespace DamageAssesment.Api.Locations.Controllers
/// </summary>
[HttpDelete("{Id}")]
public async Task<ActionResult> DeleteRegionAsync(string Id)
[HttpDelete("regions/{id}")]
public async Task<ActionResult> DeleteRegionAsync(int id)
{
var result = await this.regionProvider.DeleteRegionAsync(Id);
var result = await this.regionProvider.DeleteRegionAsync(id);
if (result.IsSuccess)
{
return Ok(result.Region);

View File

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

View File

@ -3,21 +3,28 @@ using System.ComponentModel.DataAnnotations.Schema;
namespace DamageAssesment.Api.Locations.Db
{
[Table("Locations")]
public class Location
{
[Key]
public int Id { get; set; }
[ForeignKey("Region")]
public int RegionId { get; set; }
[StringLength(4)]
public string Id { get; set; }
public string LocationCode { get; set; }
[StringLength(50)]
public string Name { get; set; }
[StringLength(1)]
[StringLength(4)]
public string MaintenanceCenter { get; set; }
[StringLength(2)]
public string SchoolType { get; set; }
[ForeignKey("Region")]
public string RegionId { get; set; }
public int? DataValue { get; set; }
public int? Enrollment { get; set; }
public double? Longitute { get; set; }
public double? Latitude { get; set; }
}
}

View File

@ -2,7 +2,7 @@
namespace DamageAssesment.Api.Locations.Db
{
public class LocationDbContext:DbContext
public class LocationDbContext : DbContext
{
public DbSet<Db.Location> Locations { get; set; }
public DbSet<Db.Region> Regions { get; set; }
@ -10,5 +10,17 @@ namespace DamageAssesment.Api.Locations.Db
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Location>()
.Property(item => item.Id)
.ValueGeneratedOnAdd();
modelBuilder.Entity<Region>()
.Property(item => item.Id)
.ValueGeneratedOnAdd();
}
}
}

View File

@ -1,19 +1,18 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace DamageAssesment.Api.Locations.Db
{
[Table("Regions")]
public class Region
{
[Key]
[StringLength(2)]
public string Id { get; set; }
public int Id { get; set; }
[StringLength(50)]
public string Name { get; set; }
[StringLength(5)]
public string Abbreviation { get; set; }
// public ICollection<Location> Locations { get; set; }
}
}

View File

@ -1,39 +0,0 @@
#See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging.
# Use the ASP.NET base image
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80
# Use the SDK image for building
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
# Copy the project file and restore dependencies
COPY ["DamageAssesment.Api.Locations/DamageAssesment.Api.Locations.csproj", "DamageAssesment.Api.Locations/"]
RUN dotnet restore "DamageAssesment.Api.Locations/DamageAssesment.Api.Locations.csproj"
# Copy the source code
COPY . .
WORKDIR "/src/DamageAssesment.Api.Locations"
# Build the application
RUN dotnet build "DamageAssesment.Api.Locations.csproj" -c Release -o /app/build
# Publish the application
FROM build AS publish
RUN dotnet publish "DamageAssesment.Api.Locations.csproj" -c Release -o /app/publish /p:UseAppHost=false
# Set up the final image
FROM base AS final
WORKDIR /app
# Copy the published files
COPY --from=publish /app/publish .
## Set up the volume and copy the XML comments
#VOLUME /xmlcomments
#COPY ["DamageAssesment.Api.Locations.xml", "/xmlcomments/DamageAssesment.Api.Locations.xml"]
# Specify the entry point for the container
ENTRYPOINT ["dotnet", "DamageAssesment.Api.Locations.dll"]

View File

@ -4,11 +4,11 @@ namespace DamageAssesment.Api.Locations.Interfaces
{
public interface ILocationsProvider
{
Task<(bool IsSuccess, IEnumerable<Models.Location> locations, string ErrorMessage)> GetLocationsAsync();
Task<(bool IsSuccess, Models.Location Location, string ErrorMessage)> GetLocationByIdAsync(string Id);
Task<(bool IsSuccess, Models.Location Question, string ErrorMessage)> PostLocationAsync(Models.Location Location);
Task<(bool IsSuccess, string ErrorMessage)> UpdateLocationAsync(Models.Location Location);
Task<(bool IsSuccess, string ErrorMessage)> DeleteLocationAsync(string Id);
Task<(bool IsSuccess, IEnumerable<Models.Location> Locations, string ErrorMessage)> GetLocationsAsync();
Task<(bool IsSuccess, Models.Location Location, string ErrorMessage)> GetLocationByIdAsync(int Id);
Task<(bool IsSuccess, Models.Location Location, string ErrorMessage)> PostLocationAsync(Models.Location Location);
Task<(bool IsSuccess, Models.Location Location, string ErrorMessage)> UpdateLocationAsync(int Id, Models.Location Location);
Task<(bool IsSuccess, Models.Location Location, string ErrorMessage)> DeleteLocationAsync(int Id);
void SeedData();
}
}

View File

@ -2,11 +2,11 @@
{
public interface IRegionsProvider
{
Task<(bool IsSuccess, IEnumerable<Models.Region> regions, string ErrorMessage)> GetRegionsAsync();
Task<(bool IsSuccess, Models.Region Region, string ErrorMessage)> GetRegionByIdAsync(string Id);
Task<(bool IsSuccess, IEnumerable<Models.Region> Regions, string ErrorMessage)> GetRegionsAsync();
Task<(bool IsSuccess, Models.Region Region, string ErrorMessage)> GetRegionByIdAsync(int Id);
Task<(bool IsSuccess, Models.Region Region, string ErrorMessage)> PostRegionAsync(Models.Region region);
Task<(bool IsSuccess, Models.Region Region, string ErrorMessage)> PutRegionAsync(Models.Region region);
Task<(bool IsSuccess, Models.Region Region, string ErrorMessage)> DeleteRegionAsync(string Id);
Task<(bool IsSuccess, Models.Region Region, string ErrorMessage)> PutRegionAsync(int Id, Models.Region region);
Task<(bool IsSuccess, Models.Region Region, string ErrorMessage)> DeleteRegionAsync(int Id);
void SeedData();
}
}

View File

@ -4,19 +4,16 @@ namespace DamageAssesment.Api.Locations.Models
{
public class Location
{
[StringLength(4)]
public string Id { get; set; }
[StringLength(1)]
public string RegionId { get; set; }
[StringLength(50)]
[Key]
public int Id { get; set; }
public int RegionId { get; set; }
public string LocationCode { get; set; }
public string Name { get; set; }
[StringLength(1)]
public string MaintenanceCenter { get; set; }
[StringLength(2)]
public string SchoolType { get; set; }
public int? DataValue { get; set; }
public int? Enrollment { get; set; }
public double? Longitute { get; set; }
public double? Latitude { get; set; }
}
}

View File

@ -4,14 +4,8 @@ namespace DamageAssesment.Api.Locations.Models
{
public class Region
{
[StringLength(1)]
public string Id { get; set; }
[StringLength(50)]
public int Id { get; set; }
public string Name { get; set; }
[StringLength(5)]
public string Abbreviation { get; set; }
}
}

View File

@ -5,6 +5,7 @@
public LocationProfile()
{
CreateMap<Db.Location, Models.Location>();
CreateMap<Models.Location, Db.Location>();
}
}
}

View File

@ -31,6 +31,9 @@ var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
using (var serviceScope = app.Services.CreateScope())
{
var services = serviceScope.ServiceProvider;
@ -39,17 +42,6 @@ if (app.Environment.IsDevelopment())
locationProvider.SeedData();
regionProvider.SeedData();
}
app.UseSwagger();
app.UseSwaggerUI(options =>
{
//switch for local environment
// options.SwaggerEndpoint("/swagger/v1/swagger.json","");
options.SwaggerEndpoint("locations/swagger/v1/swagger.json", "");
});
}
app.UseAuthorization();

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