forked from MDCPS/DamageAssessment_Backend
		
	Compare commits
	
		
			74 Commits
		
	
	
		
			dev
			...
			docker-sql
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 6e305d0db3 | |||
| e82bae41c7 | |||
| 70e3e24875 | |||
| a3a4a85bc1 | |||
| 94e340d941 | |||
| 8b05f61f44 | |||
| 1c26852670 | |||
| 9188ded00e | |||
| 4b9ab46901 | |||
| f967e38c81 | |||
| 5ad4478670 | |||
| d7005479c5 | |||
| 3de53c1198 | |||
| 5cc331202b | |||
| 9ec9b8b96f | |||
| e58782243c | |||
| 795c7c021d | |||
| b209c2619e | |||
| b131994274 | |||
| fcc0205175 | |||
| 0c90a6caaa | |||
| 0ed7641a8b | |||
| 92666d6efa | |||
| 9aa3f230c5 | |||
| 99a7802cf6 | |||
| db5e14bde4 | |||
| 1df15e9a6d | |||
| 66215d1fce | |||
| 281a789deb | |||
| 8ccb37f45b | |||
| fc154274a0 | |||
| 1fba3e81f1 | |||
| f00c7dd99c | |||
| b7e5e7d7fe | |||
| 43eb29c2e8 | |||
| 45c61ee729 | |||
| 17df019d55 | |||
| d0650c36f3 | |||
| 19fac4d810 | |||
| 17cd993a56 | |||
| 8285588db9 | |||
| 6fbe21979f | |||
| fc166e65c9 | |||
| ae6b306290 | |||
| d3a751a6ad | |||
| 2182b9a6b3 | |||
| 8624eeeb97 | |||
| 16d45d6632 | |||
| c77e0452c4 | |||
| 6ad5bb1572 | |||
| 8e0a7df68b | |||
| cb3c7f8f6a | |||
| 01ccd97528 | |||
| 26b360e0a9 | |||
| 360a58c026 | |||
| 26e79432e2 | |||
| 11c6fc0dc9 | |||
| 99633d8dda | |||
| 8e3f6674c6 | |||
| 885fdeb117 | |||
| 14956057cd | |||
| fa3e3bbd99 | |||
| 340ba6fa6d | |||
| 46794057c4 | |||
| 71d4b524e7 | |||
| c7a2dc5910 | |||
| 643bc0c76a | |||
| d0023114a3 | |||
| 465bf4b081 | |||
| e04bccfffd | |||
| 0544c7397d | |||
| 9c536a1c52 | |||
| 48be1a74c9 | |||
| eb07c31ff6 | 
							
								
								
									
										
											BIN
										
									
								
								.vs/Backend-API-Services/v17/.wsuo
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								.vs/Backend-API-Services/v17/.wsuo
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										7
									
								
								.vs/VSWorkspaceState.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								.vs/VSWorkspaceState.json
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,7 @@ | |||||||
|  | { | ||||||
|  |   "ExpandedNodes": [ | ||||||
|  |     "" | ||||||
|  |   ], | ||||||
|  |   "SelectedNode": "\\DamageAssesment.sln", | ||||||
|  |   "PreviewInSolutionExplorer": false | ||||||
|  | } | ||||||
							
								
								
									
										1
									
								
								DamageAssesmentApi/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								DamageAssesmentApi/.gitignore
									
									
									
									
										vendored
									
									
								
							| @ -396,3 +396,4 @@ FodyWeavers.xsd | |||||||
|  |  | ||||||
| # JetBrains Rider | # JetBrains Rider | ||||||
| *.sln.iml | *.sln.iml | ||||||
|  | **/migrations/ | ||||||
| @ -13,7 +13,12 @@ | |||||||
|     <PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="12.0.1" /> |     <PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="12.0.1" /> | ||||||
|     <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.21" /> |     <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.21" /> | ||||||
|     <PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.9" /> |     <PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.9" /> | ||||||
|  |     <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="7.0.9"> | ||||||
|  |       <PrivateAssets>all</PrivateAssets> | ||||||
|  |       <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> | ||||||
|  |     </PackageReference> | ||||||
|     <PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="7.0.9" /> |     <PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="7.0.9" /> | ||||||
|  |     <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="7.0.9" /> | ||||||
|     <PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.19.4" /> |     <PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.19.4" /> | ||||||
|     <PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" /> |     <PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" /> | ||||||
|   </ItemGroup> |   </ItemGroup> | ||||||
|  | |||||||
| @ -3,6 +3,7 @@ using System.ComponentModel.DataAnnotations.Schema; | |||||||
|  |  | ||||||
| namespace DamageAssesment.Api.Answers.Db | namespace DamageAssesment.Api.Answers.Db | ||||||
| { | { | ||||||
|  |     [Table("Answers")] | ||||||
|     public class Answer |     public class Answer | ||||||
|     { |     { | ||||||
|         [Key] |         [Key] | ||||||
|  | |||||||
| @ -1,13 +1,19 @@ | |||||||
| using Microsoft.EntityFrameworkCore; | using Microsoft.EntityFrameworkCore; | ||||||
|  | using Microsoft.Extensions.Configuration; | ||||||
|  |  | ||||||
| namespace DamageAssesment.Api.Answers.Db | namespace DamageAssesment.Api.Answers.Db | ||||||
| { | { | ||||||
|     public class AnswerDbContext:DbContext |     public class AnswerDbContext:DbContext | ||||||
|     { |     { | ||||||
|  |         private IConfiguration _Configuration { get; set; } | ||||||
|         public AnswerDbContext(DbContextOptions options):base(options)  |         public AnswerDbContext(DbContextOptions options,IConfiguration configuration):base(options)  | ||||||
|         { |         { | ||||||
|              |             _Configuration= configuration; | ||||||
|  |         } | ||||||
|  |         protected override void OnConfiguring(DbContextOptionsBuilder options) | ||||||
|  |         { | ||||||
|  |             // connect to sql server with connection string from app settings | ||||||
|  |             options.UseSqlServer(_Configuration.GetConnectionString("AnswerConnection")); | ||||||
|         } |         } | ||||||
|         public DbSet<Db.Answer> Answers { get; set; } |         public DbSet<Db.Answer> Answers { get; set; } | ||||||
|         protected override void OnModelCreating(ModelBuilder modelBuilder) |         protected override void OnModelCreating(ModelBuilder modelBuilder) | ||||||
|  | |||||||
| @ -8,10 +8,16 @@ var builder = WebApplication.CreateBuilder(args); | |||||||
|  |  | ||||||
| // Add services to the container. | // Add services to the container. | ||||||
|  |  | ||||||
|  | // CORS setup to allow requests from any origin. | ||||||
|  | builder.Services.AddCors(p => p.AddPolicy("DamageAppCorsPolicy", build => { | ||||||
|  |     build.WithOrigins("*").AllowAnyMethod().AllowAnyHeader().AllowAnyOrigin(); | ||||||
|  | })); | ||||||
|  |  | ||||||
| builder.Services.AddControllers(); | builder.Services.AddControllers(); | ||||||
| // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle | // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle | ||||||
| builder.Services.AddEndpointsApiExplorer(); | builder.Services.AddEndpointsApiExplorer(); | ||||||
| //builder.Services.AddSwaggerGen(); | //builder.Services.AddSwaggerGen(); | ||||||
|  | // Add Swagger/OpenAPI documentation support. | ||||||
| builder.Services.AddSwaggerGen(c => | builder.Services.AddSwaggerGen(c => | ||||||
| { | { | ||||||
|     // Include XML comments from your assembly |     // Include XML comments from your assembly | ||||||
| @ -23,11 +29,14 @@ builder.Services.AddScoped<IAnswersProvider, AnswersProvider>(); | |||||||
| builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies()); //4/30 | builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies()); //4/30 | ||||||
| builder.Services.AddDbContext<AnswerDbContext>(option => | builder.Services.AddDbContext<AnswerDbContext>(option => | ||||||
| { | { | ||||||
|     option.UseInMemoryDatabase("Answers"); |     option.UseSqlServer("AnswerConnection"); | ||||||
| }); | }); | ||||||
|  |  | ||||||
| var app = builder.Build(); | builder.Services.AddCors(p => p.AddPolicy("DamageAppCorsPolicy", build => { | ||||||
|  |     build.WithOrigins("*").AllowAnyMethod().AllowAnyHeader().AllowAnyOrigin(); | ||||||
|  | })); | ||||||
|  |  | ||||||
|  | var app = builder.Build(); | ||||||
|  |  | ||||||
| // Configure the HTTP request pipeline. | // Configure the HTTP request pipeline. | ||||||
| if (app.Environment.IsDevelopment()) | if (app.Environment.IsDevelopment()) | ||||||
| @ -35,9 +44,13 @@ if (app.Environment.IsDevelopment()) | |||||||
|     app.UseSwagger(); |     app.UseSwagger(); | ||||||
|     app.UseSwaggerUI(); |     app.UseSwaggerUI(); | ||||||
| } | } | ||||||
|  | app.UseCors("DamageAppCorsPolicy"); | ||||||
| app.UseAuthorization(); | app.UseAuthorization(); | ||||||
|  |  | ||||||
|  | // Enable CORS, authentication, and authorization middleware. | ||||||
|  | app.UseCors("DamageAppCorsPolicy"); | ||||||
|  | app.UseAuthorization(); | ||||||
|  | // Map controllers to their respective routes. | ||||||
| app.MapControllers(); | app.MapControllers(); | ||||||
|  |  | ||||||
| app.Run(); | app.Run(); | ||||||
|  | |||||||
| @ -198,13 +198,12 @@ namespace DamageAssesment.Api.Answers.Providers | |||||||
|         { |         { | ||||||
|             if (!answerDbContext.Answers.Any()) |             if (!answerDbContext.Answers.Any()) | ||||||
|             { |             { | ||||||
|                 answerDbContext.Answers.Add(new Db.Answer() { Id = 1, AnswerText = "Yes", Comment = "Comment test 4", QuestionId = 1, SurveyResponseId = 1 }); |                 answerDbContext.Answers.Add(new Db.Answer() {  AnswerText = "Yes", Comment = "", QuestionId = 1, SurveyResponseId = 1 }); | ||||||
|                 answerDbContext.Answers.Add(new Db.Answer() { Id = 2, AnswerText = "No", Comment = "Comment test 5", QuestionId = 2, SurveyResponseId = 1 }); |                 answerDbContext.Answers.Add(new Db.Answer() {  AnswerText = "No", Comment = "myComment", QuestionId = 2, SurveyResponseId = 1 }); | ||||||
|                 // Uncomment the lines below to add more initial data if needed |                 //answerDbContext.Answers.Add(new Db.Answer() {  AnswerText = "No", Comment = "No Comment", QuestionId = 3, 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() {  AnswerText = "Yes", Comment = "No Comment", QuestionId = 1, SurveyResponseId = 2 }); | ||||||
|                 //answerDbContext.Answers.Add(new Db.Answer() { Id = 4, AnswerText = "Yes", Comment = "No Comment", QuestionId = 1, SurveyResponseId = 2 }); |                 //answerDbContext.Answers.Add(new Db.Answer() {  AnswerText = "No", Comment = "No Comment", QuestionId = 2, 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() {  AnswerText = "No", Comment = "No Comment", QuestionId = 3, SurveyResponseId = 2 }); | ||||||
|                 //answerDbContext.Answers.Add(new Db.Answer() { Id = 6, AnswerText = "No", Comment = "No Comment", QuestionId = 3, SurveyResponseId = 2 }); |  | ||||||
|                 answerDbContext.SaveChanges(); |                 answerDbContext.SaveChanges(); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  | |||||||
| @ -1,8 +0,0 @@ | |||||||
| { |  | ||||||
|   "Logging": { |  | ||||||
|     "LogLevel": { |  | ||||||
|       "Default": "Information", |  | ||||||
|       "Microsoft.AspNetCore": "Warning" |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
| } |  | ||||||
| @ -8,5 +8,11 @@ | |||||||
|       "Microsoft.AspNetCore": "Warning" |       "Microsoft.AspNetCore": "Warning" | ||||||
|     } |     } | ||||||
|   }, |   }, | ||||||
|   "AllowedHosts": "*" |   "AllowedHosts": "*", | ||||||
|  |   "ConnectionStrings": { | ||||||
|  |     //"AnswerConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;" | ||||||
|  |     // "AnswerConnection": "Server=localhost,1433;Database=da_survey_dev;User Id=sa;Password=Password123;TrustServerCertificate=True;", | ||||||
|  |     "AnswerConnection": "Server=207.180.248.35;Database=da_survey_dev;User Id=sa;Password=YourStrongPassw0rd;TrustServerCertificate=True;" | ||||||
|  |  | ||||||
|  |   } | ||||||
| } | } | ||||||
|  | |||||||
| @ -136,6 +136,80 @@ namespace DamageAssesment.Api.Attachments.Controllers | |||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         /// <summary> |         /// <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. |         /// Delete an existing attachment. | ||||||
|         /// </summary> |         /// </summary> | ||||||
|         [HttpDelete("attachments/{id}")] |         [HttpDelete("attachments/{id}")] | ||||||
|  | |||||||
| @ -1 +0,0 @@ | |||||||
| sample |  | ||||||
| @ -14,8 +14,19 @@ | |||||||
|     <PackageReference Include="Azure.Storage.Blobs" Version="12.16.0" /> |     <PackageReference Include="Azure.Storage.Blobs" Version="12.16.0" /> | ||||||
|     <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.21" /> |     <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.21" /> | ||||||
|     <PackageReference Include="Microsoft.AspNetCore.Hosting" Version="2.2.7" /> |     <PackageReference Include="Microsoft.AspNetCore.Hosting" Version="2.2.7" /> | ||||||
|     <PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.5" /> |     <PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.9" /> | ||||||
|     <PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="7.0.5" /> |     <PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="7.0.5" /> | ||||||
|  |     <PackageReference Include="Microsoft.AspNetCore.Hosting" Version="2.1.1" /> | ||||||
|  |     <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="7.0.9"> | ||||||
|  |       <PrivateAssets>all</PrivateAssets> | ||||||
|  |       <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> | ||||||
|  |     </PackageReference> | ||||||
|  |     <PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="7.0.9" /> | ||||||
|  |     <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="7.0.9" /> | ||||||
|  |     <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="7.0.9"> | ||||||
|  |       <PrivateAssets>all</PrivateAssets> | ||||||
|  |       <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> | ||||||
|  |     </PackageReference> | ||||||
|     <PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.19.4" /> |     <PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.19.4" /> | ||||||
|     <PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" /> |     <PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" /> | ||||||
|   </ItemGroup> |   </ItemGroup> | ||||||
|  | |||||||
| @ -3,6 +3,7 @@ using System.ComponentModel.DataAnnotations.Schema; | |||||||
|  |  | ||||||
| namespace DamageAssesment.Api.Attachments.Db | namespace DamageAssesment.Api.Attachments.Db | ||||||
| { | { | ||||||
|  |     [Table("AnswerAttachments")] | ||||||
|     public class Attachment |     public class Attachment | ||||||
|     { |     { | ||||||
|         [Key] |         [Key] | ||||||
|  | |||||||
| @ -1,11 +1,19 @@ | |||||||
| using Microsoft.EntityFrameworkCore; | using Microsoft.EntityFrameworkCore; | ||||||
|  | using Microsoft.Extensions.Configuration; | ||||||
|  |  | ||||||
| namespace DamageAssesment.Api.Attachments.Db | namespace DamageAssesment.Api.Attachments.Db | ||||||
| { | { | ||||||
|     public class AttachmentsDbContext:DbContext |     public class AttachmentsDbContext:DbContext | ||||||
|     { |     { | ||||||
|         public AttachmentsDbContext(DbContextOptions options) : base(options) |         private IConfiguration _Configuration { get; set; } | ||||||
|  |         public AttachmentsDbContext(DbContextOptions options, IConfiguration configuration) : base(options) | ||||||
|         { |         { | ||||||
|  |             _Configuration = configuration; | ||||||
|  |         } | ||||||
|  |         protected override void OnConfiguring(DbContextOptionsBuilder options) | ||||||
|  |         { | ||||||
|  |             // connect to sql server with connection string from app settings | ||||||
|  |             options.UseSqlServer(_Configuration.GetConnectionString("AttachmentConnection")); | ||||||
|         } |         } | ||||||
|         public DbSet<Db.Attachment> Attachments { get; set; } |         public DbSet<Db.Attachment> Attachments { get; set; } | ||||||
|         protected override void OnModelCreating(ModelBuilder modelBuilder) |         protected override void OnModelCreating(ModelBuilder modelBuilder) | ||||||
|  | |||||||
| @ -9,6 +9,7 @@ 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)> PostAttachmentAsync(List<Models.Attachment> Attachments); | ||||||
|         Task<(bool IsSuccess, IEnumerable<Models.Attachment> Attachments, string ErrorMessage)> PutAttachmentAsync(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)> 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)> DeleteAttachmentsAsync(int responseId, int answerId); | ||||||
|         Task<(bool IsSuccess, int counter, string Path)> DeleteBulkAttachmentsAsync(int responseId, List<int> answerIds); |         Task<(bool IsSuccess, int counter, string Path)> DeleteBulkAttachmentsAsync(int responseId, List<int> answerIds); | ||||||
|         Task<(bool IsSuccess, int counter, string message)> GetAttachmentCounter(); |         Task<(bool IsSuccess, int counter, string message)> GetAttachmentCounter(); | ||||||
|  | |||||||
| @ -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 answerId, int counter, List<IFormFile> postedFile); | ||||||
|         List<Models.Attachment> UploadAttachment(int responseId, int counter, List<AnswerInfo> answers); |         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); |         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 Deletefile(string path); | ||||||
|         void Movefile(string path); |         void Movefile(string path); | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -8,12 +8,18 @@ using System.Reflection; | |||||||
|  |  | ||||||
| var builder = WebApplication.CreateBuilder(args); | var builder = WebApplication.CreateBuilder(args); | ||||||
|  |  | ||||||
|  | // CORS setup to allow requests from any origin. | ||||||
|  | builder.Services.AddCors(p => p.AddPolicy("DamageAppCorsPolicy", build => { | ||||||
|  |     build.WithOrigins("*").AllowAnyMethod().AllowAnyHeader().AllowAnyOrigin(); | ||||||
|  | })); | ||||||
|  |  | ||||||
| // Add services to the container. | // Add services to the container. | ||||||
|  |  | ||||||
| builder.Services.AddControllers(); | builder.Services.AddControllers(); | ||||||
| // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle | // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle | ||||||
| builder.Services.AddEndpointsApiExplorer(); | builder.Services.AddEndpointsApiExplorer(); | ||||||
| //builder.Services.AddSwaggerGen(); | //builder.Services.AddSwaggerGen(); | ||||||
|  | // Add Swagger/OpenAPI documentation support. | ||||||
| builder.Services.AddSwaggerGen(c => | builder.Services.AddSwaggerGen(c => | ||||||
| { | { | ||||||
|     // Include XML comments from your assembly |     // Include XML comments from your assembly | ||||||
| @ -21,13 +27,14 @@ builder.Services.AddSwaggerGen(c => | |||||||
|     var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile); |     var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile); | ||||||
|     c.IncludeXmlComments(xmlPath); |     c.IncludeXmlComments(xmlPath); | ||||||
| }); | }); | ||||||
|  | builder.Services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); | ||||||
| builder.Services.AddScoped<IAttachmentsProvider, AttachmentsProvider>(); | builder.Services.AddScoped<IAttachmentsProvider, AttachmentsProvider>(); | ||||||
| builder.Services.AddScoped<IUploadService, UploadService>(); | builder.Services.AddScoped<IUploadService, UploadService>(); | ||||||
| builder.Services.AddScoped<IAzureBlobService,AzureBlobService>(); | builder.Services.AddScoped<IAzureBlobService,AzureBlobService>(); | ||||||
| builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies()); //4/30 | builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies()); //4/30 | ||||||
| builder.Services.AddDbContext<AttachmentsDbContext>(option => | builder.Services.AddDbContext<AttachmentsDbContext>(option => | ||||||
| { | { | ||||||
|     option.UseInMemoryDatabase("Attachments"); |     option.UseSqlServer("AttachmentConnection"); | ||||||
| }); | }); | ||||||
| builder.Services.Configure<FormOptions>(o => | builder.Services.Configure<FormOptions>(o => | ||||||
| { | { | ||||||
| @ -35,6 +42,9 @@ builder.Services.Configure<FormOptions>(o => | |||||||
|     o.MultipartBodyLengthLimit = int.MaxValue; |     o.MultipartBodyLengthLimit = int.MaxValue; | ||||||
|     o.MemoryBufferThreshold = int.MaxValue; |     o.MemoryBufferThreshold = int.MaxValue; | ||||||
| }); | }); | ||||||
|  | builder.Services.AddCors(p => p.AddPolicy("DamageAppCorsPolicy", build => { | ||||||
|  |     build.WithOrigins("*").AllowAnyMethod().AllowAnyHeader().AllowAnyOrigin(); | ||||||
|  | })); | ||||||
|  |  | ||||||
| var app = builder.Build(); | var app = builder.Build(); | ||||||
|  |  | ||||||
| @ -45,9 +55,11 @@ if (app.Environment.IsDevelopment()) | |||||||
|     app.UseSwaggerUI(); |     app.UseSwaggerUI(); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // Enable CORS, authentication, and authorization middleware. | ||||||
|  |  | ||||||
|  | app.UseCors("DamageAppCorsPolicy"); | ||||||
| app.UseAuthorization(); | app.UseAuthorization(); | ||||||
| app.UseHttpsRedirection(); | app.UseHttpsRedirection(); | ||||||
|  |  | ||||||
| app.MapControllers(); | app.MapControllers(); | ||||||
| app.UseStaticFiles(); | app.UseStaticFiles(); | ||||||
| app.Run(); | app.Run(); | ||||||
|  | |||||||
| @ -14,14 +14,18 @@ namespace DamageAssesment.Api.Attachments.Providers | |||||||
|         private ILogger<AttachmentsProvider> logger; |         private ILogger<AttachmentsProvider> logger; | ||||||
|         private IUploadService uploadservice; |         private IUploadService uploadservice; | ||||||
|         private IMapper mapper;  |         private IMapper mapper;  | ||||||
|  |         private readonly IHttpContextAccessor httpContextAccessor; | ||||||
|         public AttachmentsProvider(AttachmentsDbContext AttachmentDbContext, ILogger<AttachmentsProvider> logger, IMapper mapper,IUploadService uploadservice) |         private string baseUrl; | ||||||
|  |         public AttachmentsProvider(AttachmentsDbContext AttachmentDbContext, ILogger<AttachmentsProvider> logger, IMapper mapper,IUploadService uploadservice, IHttpContextAccessor httpContextAccessor) | ||||||
|         { |         { | ||||||
|             this.AttachmentDbContext = AttachmentDbContext; |             this.AttachmentDbContext = AttachmentDbContext; | ||||||
|             this.logger = logger; |             this.logger = logger; | ||||||
|             this.mapper = mapper; |             this.mapper = mapper; | ||||||
|             this.uploadservice = uploadservice; |             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() |         public async Task<(bool IsSuccess, IEnumerable<Models.Attachment> Attachments, string ErrorMessage)> GetAttachmentsAsync() | ||||||
|         { |         { | ||||||
| @ -32,6 +36,10 @@ namespace DamageAssesment.Api.Attachments.Providers | |||||||
|                 var Attachment = await AttachmentDbContext.Attachments.AsNoTracking().Where(a => !a.IsDeleted).ToListAsync(); |                 var Attachment = await AttachmentDbContext.Attachments.AsNoTracking().Where(a => !a.IsDeleted).ToListAsync(); | ||||||
|                 if (Attachment != null) |                 if (Attachment != null) | ||||||
|                 { |                 { | ||||||
|  |                     foreach (var attachment in Attachment) | ||||||
|  |                     { | ||||||
|  |                         attachment.URI = $"{baseUrl}/{attachment.Id}"; | ||||||
|  |                     } | ||||||
|                     logger?.LogInformation($"{Attachment.Count} Attachments(s) found"); |                     logger?.LogInformation($"{Attachment.Count} Attachments(s) found"); | ||||||
|                     var result = mapper.Map<IEnumerable<Db.Attachment>, IEnumerable<Models.Attachment>>(Attachment); |                     var result = mapper.Map<IEnumerable<Db.Attachment>, IEnumerable<Models.Attachment>>(Attachment); | ||||||
|                     return (true, result, null); |                     return (true, result, null); | ||||||
| @ -54,6 +62,7 @@ namespace DamageAssesment.Api.Attachments.Providers | |||||||
|                 if (Attachment != null) |                 if (Attachment != null) | ||||||
|                 { |                 { | ||||||
|                     logger?.LogInformation($"{Attachment} customer(s) found"); |                     logger?.LogInformation($"{Attachment} customer(s) found"); | ||||||
|  |                     Attachment.URI = $"{baseUrl}/{Attachment.Id}"; | ||||||
|                     var result = mapper.Map<Db.Attachment, Models.Attachment>(Attachment); |                     var result = mapper.Map<Db.Attachment, Models.Attachment>(Attachment); | ||||||
|                     return (true, result, null); |                     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); |                 List<Db.Attachment> attachments = mapper.Map<List<Models.Attachment>, List<Db.Attachment>>(Attachments); | ||||||
|                 AttachmentDbContext.Attachments.AddRange(attachments); |                 AttachmentDbContext.Attachments.AddRange(attachments); | ||||||
|                 await AttachmentDbContext.SaveChangesAsync(); |                 await AttachmentDbContext.SaveChangesAsync(); | ||||||
|  |                 foreach (var attachment in attachments) | ||||||
|  |                 { | ||||||
|  |                     attachment.URI = $"{baseUrl}/{attachment.Id}"; | ||||||
|  |                 } | ||||||
|                 var result = mapper.Map<IEnumerable<Db.Attachment>, IEnumerable<Models.Attachment>>(attachments); |                 var result = mapper.Map<IEnumerable<Db.Attachment>, IEnumerable<Models.Attachment>>(attachments); | ||||||
|                 return (true, result, null); |                 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); |                 List<Db.Attachment> attachments = mapper.Map<List<Models.Attachment>, List<Db.Attachment>>(Attachments); | ||||||
|                 AttachmentDbContext.Attachments.UpdateRange(attachments); |                 AttachmentDbContext.Attachments.UpdateRange(attachments); | ||||||
|                 await AttachmentDbContext.SaveChangesAsync(); |                 await AttachmentDbContext.SaveChangesAsync(); | ||||||
|  |                 foreach (var attachment in attachments) | ||||||
|  |                 { | ||||||
|  |                     attachment.URI = $"{baseUrl}/{attachment.Id}"; | ||||||
|  |                 } | ||||||
|                 var result = mapper.Map<IEnumerable<Db.Attachment>, IEnumerable<Models.Attachment>>(attachments); |                 var result = mapper.Map<IEnumerable<Db.Attachment>, IEnumerable<Models.Attachment>>(attachments); | ||||||
|                 return (true, result, null); |                 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; |             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() |         private void SeedData() | ||||||
|         { |         { | ||||||
|  | |||||||
| @ -24,6 +24,41 @@ namespace DamageAssesment.Api.Attachments.Providers | |||||||
|             uploadpath = configuration.GetValue<string>("Fileupload:folderpath"); |             uploadpath = configuration.GetValue<string>("Fileupload:folderpath"); | ||||||
|             Deletepath = configuration.GetValue<string>("Fileupload:Deletepath"); |             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) |         public List<Models.Attachment> UploadAttachment(int responseId,int answerId,int counter, List<IFormFile> postedFile) | ||||||
|         { |         { | ||||||
|             var pathToSave = Path.Combine(Directory.GetCurrentDirectory(), uploadpath); |             var pathToSave = Path.Combine(Directory.GetCurrentDirectory(), uploadpath); | ||||||
| @ -89,7 +124,7 @@ namespace DamageAssesment.Api.Attachments.Providers | |||||||
|                     { |                     { | ||||||
|                         counter++; |                         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 fileName = String.Format("Attachment_{0}{1}", counter, file.FileExtension); | ||||||
|                         var dbPath = Path.Combine(fullDirectoryPath, fileName); |                         var dbPath = Path.Combine(fullDirectoryPath, fileName); | ||||||
|                         File.WriteAllBytes(dbPath, Convert.FromBase64String(file.FileContent)); |                         File.WriteAllBytes(dbPath, Convert.FromBase64String(file.FileContent)); | ||||||
| @ -126,7 +161,7 @@ namespace DamageAssesment.Api.Attachments.Providers | |||||||
|                 foreach (var file in item.postedFiles) |                 foreach (var file in item.postedFiles) | ||||||
|                 { |                 { | ||||||
|                     Models.Attachment attachment= attachments.Where(a=>a.Id == file.AttachmentId).FirstOrDefault(); |                     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 fileName = String.Format("Attachment_{0}{1}", attachment?.Id, file.FileExtension); | ||||||
|                     var dbPath = Path.Combine(fullDirectoryPath, fileName); |                     var dbPath = Path.Combine(fullDirectoryPath, fileName); | ||||||
|                     File.WriteAllBytes(dbPath, Convert.FromBase64String(file.FileContent)); |                     File.WriteAllBytes(dbPath, Convert.FromBase64String(file.FileContent)); | ||||||
|  | |||||||
| @ -1,8 +0,0 @@ | |||||||
| { |  | ||||||
|   "Logging": { |  | ||||||
|     "LogLevel": { |  | ||||||
|       "Default": "Information", |  | ||||||
|       "Microsoft.AspNetCore": "Warning" |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
| } |  | ||||||
| @ -12,5 +12,11 @@ | |||||||
|   "Fileupload": { |   "Fileupload": { | ||||||
|     "folderpath": "DMS_Attachments/Active", |     "folderpath": "DMS_Attachments/Active", | ||||||
|     "Deletepath": "DMS_Attachments/Deleted" |     "Deletepath": "DMS_Attachments/Deleted" | ||||||
|  |   }, | ||||||
|  |   "ConnectionStrings": { | ||||||
|  |     //"AttachmentConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;" | ||||||
|  |     // "AttachmentConnection": "Server=localhost,1433;Database=da_survey_dev;User Id=sa;Password=Password123;TrustServerCertificate=True;" | ||||||
|  |     "AttachmentConnection": "Server=207.180.248.35;Database=da_survey_dev;User Id=sa;Password=YourStrongPassw0rd;TrustServerCertificate=True;" | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  |    | ||||||
| @ -197,7 +197,29 @@ namespace DamageAssesment.Api.DocuLinks.Test | |||||||
|             var result = (NotFoundResult)await DocumentProvider.DeleteDocument(1); |             var result = (NotFoundResult)await DocumentProvider.DeleteDocument(1); | ||||||
|             Assert.Equal(404, result.StatusCode); |             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 |         // Link Type Test cases | ||||||
|  |  | ||||||
|  | |||||||
| @ -32,6 +32,7 @@ namespace DamageAssesment.Api.DocuLinks.Test | |||||||
|                 doclinksAttachments.Add(new DoculinkAttachments() |                 doclinksAttachments.Add(new DoculinkAttachments() | ||||||
|                 { |                 { | ||||||
|                     docName = "",Path="www.google.com", |                     docName = "",Path="www.google.com", | ||||||
|  |                     Language = "en", | ||||||
|                     IsAttachments =false,CustomOrder=1 |                     IsAttachments =false,CustomOrder=1 | ||||||
|                 }); |                 }); | ||||||
|                 list.Add(new DocuLinks.Models.ResDoculink() |                 list.Add(new DocuLinks.Models.ResDoculink() | ||||||
| @ -74,6 +75,7 @@ namespace DamageAssesment.Api.DocuLinks.Test | |||||||
|                     docName = "", |                     docName = "", | ||||||
|                     Path = "www.google.com", |                     Path = "www.google.com", | ||||||
|                     IsAttachments = false, |                     IsAttachments = false, | ||||||
|  |                     Language = "en", | ||||||
|                     CustomOrder = 1 |                     CustomOrder = 1 | ||||||
|                 }); |                 }); | ||||||
|                 list.Add(new DocuLinks.Models.ResDoculink() |                 list.Add(new DocuLinks.Models.ResDoculink() | ||||||
| @ -138,6 +140,7 @@ namespace DamageAssesment.Api.DocuLinks.Test | |||||||
|                 docName = "", |                 docName = "", | ||||||
|                 Path = "www.google.com", |                 Path = "www.google.com", | ||||||
|                 IsAttachments = false, |                 IsAttachments = false, | ||||||
|  |                 Language = "en", | ||||||
|                 CustomOrder = 1 |                 CustomOrder = 1 | ||||||
|             }); |             }); | ||||||
|             return new Models.Doculink |             return new Models.Doculink | ||||||
| @ -165,6 +168,7 @@ namespace DamageAssesment.Api.DocuLinks.Test | |||||||
|                 docName = "", |                 docName = "", | ||||||
|                 Path = "www.google.com", |                 Path = "www.google.com", | ||||||
|                 IsAttachments = false, |                 IsAttachments = false, | ||||||
|  |                 Language = "en", | ||||||
|                 CustomOrder = 1 |                 CustomOrder = 1 | ||||||
|             }); |             }); | ||||||
|             List<DocuLinks.Models.Doculink> DocuLinks = new List<Models.Doculink>(); |             List<DocuLinks.Models.Doculink> DocuLinks = new List<Models.Doculink>(); | ||||||
|  | |||||||
| @ -104,6 +104,80 @@ namespace DamageAssesment.Api.DocuLinks.Controllers | |||||||
|             return NotFound(); |             return NotFound(); | ||||||
|         } |         } | ||||||
|         /// <summary> |         /// <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. |         /// Get all Doculink. | ||||||
|         /// </summary> |         /// </summary> | ||||||
|         ///  |         ///  | ||||||
| @ -193,6 +267,20 @@ namespace DamageAssesment.Api.DocuLinks.Controllers | |||||||
|             return BadRequest(documentInfo); |             return BadRequest(documentInfo); | ||||||
|         } |         } | ||||||
|         /// <summary> |         /// <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. |         /// Create new doclink. | ||||||
|         /// </summary> |         /// </summary> | ||||||
|         [HttpPost] |         [HttpPost] | ||||||
|  | |||||||
| @ -1 +0,0 @@ | |||||||
| sample |  | ||||||
| @ -1 +0,0 @@ | |||||||
| sample |  | ||||||
| @ -3,6 +3,7 @@ using System.ComponentModel.DataAnnotations.Schema; | |||||||
|  |  | ||||||
| namespace DamageAssesment.Api.DocuLinks.Db | namespace DamageAssesment.Api.DocuLinks.Db | ||||||
| { | { | ||||||
|  |     [Table("Doculinks")] | ||||||
|     public class Doculink |     public class Doculink | ||||||
|     { |     { | ||||||
|         [Key] |         [Key] | ||||||
|  | |||||||
| @ -3,6 +3,7 @@ using System.ComponentModel.DataAnnotations; | |||||||
|  |  | ||||||
| namespace DamageAssesment.Api.DocuLinks.Db | namespace DamageAssesment.Api.DocuLinks.Db | ||||||
| { | { | ||||||
|  |     [Table("DoculinkAttachments")] | ||||||
|     public class DoculinkAttachments |     public class DoculinkAttachments | ||||||
|     { |     { | ||||||
|  |  | ||||||
| @ -14,5 +15,6 @@ namespace DamageAssesment.Api.DocuLinks.Db | |||||||
|         public string Path { get; set; } |         public string Path { get; set; } | ||||||
|         public bool IsAttachments { get; set; } |         public bool IsAttachments { get; set; } | ||||||
|         public int CustomOrder { get; set; } |         public int CustomOrder { get; set; } | ||||||
|  |         public string Language { get; set; } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -7,8 +7,15 @@ namespace DamageAssesment.Api.DocuLinks.Db | |||||||
| { | { | ||||||
|     public class DoculinkDbContext : DbContext |     public class DoculinkDbContext : DbContext | ||||||
|     { |     { | ||||||
|         public DoculinkDbContext(DbContextOptions options) : base(options) |         private IConfiguration _Configuration { get; set; } | ||||||
|  |         public DoculinkDbContext(DbContextOptions options, IConfiguration configuration) : base(options) | ||||||
|         { |         { | ||||||
|  |             _Configuration = configuration; | ||||||
|  |         } | ||||||
|  |         protected override void OnConfiguring(DbContextOptionsBuilder options) | ||||||
|  |         { | ||||||
|  |             // connect to sql server with connection string from app settings | ||||||
|  |             options.UseSqlServer(_Configuration.GetConnectionString("DoculinConnection")); | ||||||
|         } |         } | ||||||
|         public DbSet<Db.Doculink> Documents { get; set; } |         public DbSet<Db.Doculink> Documents { get; set; } | ||||||
|         public DbSet<Db.LinkType> LinkTypes { get; set; } |         public DbSet<Db.LinkType> LinkTypes { get; set; } | ||||||
|  | |||||||
| @ -3,6 +3,7 @@ using System.ComponentModel.DataAnnotations.Schema; | |||||||
|  |  | ||||||
| namespace DamageAssesment.Api.DocuLinks.Db | namespace DamageAssesment.Api.DocuLinks.Db | ||||||
| { | { | ||||||
|  |     [Table("DoculinkTrans")] | ||||||
|     public class DoculinkTranslation |     public class DoculinkTranslation | ||||||
|     { |     { | ||||||
|         [Key] |         [Key] | ||||||
|  | |||||||
| @ -1,7 +1,9 @@ | |||||||
| using System.ComponentModel.DataAnnotations; | using System.ComponentModel.DataAnnotations; | ||||||
|  | using System.ComponentModel.DataAnnotations.Schema; | ||||||
|  |  | ||||||
| namespace DamageAssesment.Api.DocuLinks.Db | namespace DamageAssesment.Api.DocuLinks.Db | ||||||
| { | { | ||||||
|  |     [Table("DoculinkTypes")] | ||||||
|     public class LinkType |     public class LinkType | ||||||
|     { |     { | ||||||
|         [Key] |         [Key] | ||||||
|  | |||||||
| @ -3,6 +3,7 @@ using System.ComponentModel.DataAnnotations; | |||||||
|  |  | ||||||
| namespace DamageAssesment.Api.DocuLinks.Db | namespace DamageAssesment.Api.DocuLinks.Db | ||||||
| { | { | ||||||
|  |     [Table("DoculinkTypeTrans")] | ||||||
|     public class LinksTranslation |     public class LinksTranslation | ||||||
|     { |     { | ||||||
|         [Key] |         [Key] | ||||||
|  | |||||||
| @ -11,7 +11,9 @@ namespace DamageAssesment.Api.DocuLinks.Interfaces | |||||||
|         Task<(bool IsSuccess, IEnumerable<Models.ResDoculink> documents, string ErrorMessage)> GetdocumentsByLinkTypeIdAsync(int? linkTypeId, 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)> 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, 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.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(); |         Task<(bool IsSuccess, int counter, string message)> GetDocumentCounter(); | ||||||
|  |  | ||||||
|  |  | ||||||
|  | |||||||
| @ -7,6 +7,8 @@ namespace DamageAssesment.Api.DocuLinks.Interfaces | |||||||
|         Models.Doculink UploadDocument( int counter, ReqDoculink documentInfo); |         Models.Doculink UploadDocument( int counter, ReqDoculink documentInfo); | ||||||
|         public Models.Doculink UpdateDocuments(int counter, Models.Doculink document, ReqDoculink documentInfo); |         public Models.Doculink UpdateDocuments(int counter, Models.Doculink document, ReqDoculink documentInfo); | ||||||
|         void Deletefile(string path); |         void Deletefile(string path); | ||||||
|  |         Task<byte[]> DownloadFile(string path); | ||||||
|  |         Task<string> GetFile(string path); | ||||||
|         void Movefile(string path); |         void Movefile(string path); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -8,6 +8,7 @@ namespace DamageAssesment.Api.DocuLinks.Models | |||||||
|         public string docName { get; set; } |         public string docName { get; set; } | ||||||
|         public string Path { get; set; } |         public string Path { get; set; } | ||||||
|         public bool IsAttachments { get; set; } |         public bool IsAttachments { get; set; } | ||||||
|  |         public string Language { get; set; } | ||||||
|         public int CustomOrder { get; set; } |         public int CustomOrder { get; set; } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -7,6 +7,7 @@ namespace DamageAssesment.Api.DocuLinks.Models | |||||||
|         public int Id { get; set; } |         public int Id { get; set; } | ||||||
|         public int linkTypeId { get; set; } |         public int linkTypeId { get; set; } | ||||||
|         public List<DoculinkTranslation> documentsTranslations { get; set; } |         public List<DoculinkTranslation> documentsTranslations { get; set; } | ||||||
|  |         public bool IsActive { get; set; } | ||||||
|         public int CustomOrder { get; set; } |         public int CustomOrder { get; set; } | ||||||
|         public List<FileModel>? Files { get; set; } |         public List<FileModel>? Files { get; set; } | ||||||
|     } |     } | ||||||
| @ -18,5 +19,6 @@ namespace DamageAssesment.Api.DocuLinks.Models | |||||||
|         public int CustomOrder { get; set; } |         public int CustomOrder { get; set; } | ||||||
|         public string url { get;set; } |         public string url { get;set; } | ||||||
|         public bool IsAttachments { get; set; } |         public bool IsAttachments { get; set; } | ||||||
|  |         public string Language { get; set; } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -6,6 +6,11 @@ using System.Reflection; | |||||||
|  |  | ||||||
| var builder = WebApplication.CreateBuilder(args); | var builder = WebApplication.CreateBuilder(args); | ||||||
|  |  | ||||||
|  | // CORS setup to allow requests from any origin. | ||||||
|  | builder.Services.AddCors(p => p.AddPolicy("DamageAppCorsPolicy", build => { | ||||||
|  |     build.WithOrigins("*").AllowAnyMethod().AllowAnyHeader().AllowAnyOrigin(); | ||||||
|  | })); | ||||||
|  |  | ||||||
| // Add services to the container. | // Add services to the container. | ||||||
|  |  | ||||||
| builder.Services.AddControllers(); | builder.Services.AddControllers(); | ||||||
| @ -19,14 +24,18 @@ builder.Services.AddSwaggerGen(c => | |||||||
| // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle | // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle | ||||||
| builder.Services.AddEndpointsApiExplorer(); | builder.Services.AddEndpointsApiExplorer(); | ||||||
| builder.Services.AddSwaggerGen(); | builder.Services.AddSwaggerGen(); | ||||||
|  | builder.Services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); | ||||||
| builder.Services.AddScoped<IDoculinkProvider, DoculinkProvider>(); | builder.Services.AddScoped<IDoculinkProvider, DoculinkProvider>(); | ||||||
| builder.Services.AddScoped<IUploadService, UploadService>(); | builder.Services.AddScoped<IUploadService, UploadService>(); | ||||||
| builder.Services.AddScoped<IAzureBlobService, AzureBlobService>(); | builder.Services.AddScoped<IAzureBlobService, AzureBlobService>(); | ||||||
| builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies()); //4/30 | builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies()); //4/30 | ||||||
| builder.Services.AddDbContext<DoculinkDbContext>(option => | builder.Services.AddDbContext<DoculinkDbContext>(option => | ||||||
| { | { | ||||||
|     option.UseInMemoryDatabase("DocumentConnection"); |     option.UseSqlServer("DoculinConnection"); | ||||||
| }); | }); | ||||||
|  | builder.Services.AddCors(p => p.AddPolicy("DamageAppCorsPolicy", build => { | ||||||
|  |     build.WithOrigins("*").AllowAnyMethod().AllowAnyHeader().AllowAnyOrigin(); | ||||||
|  | })); | ||||||
| var app = builder.Build(); | var app = builder.Build(); | ||||||
|  |  | ||||||
| // Configure the HTTP request pipeline. | // Configure the HTTP request pipeline. | ||||||
| @ -36,6 +45,10 @@ if (app.Environment.IsDevelopment()) | |||||||
|     app.UseSwaggerUI(); |     app.UseSwaggerUI(); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | // Enable CORS, authentication, and authorization middleware. | ||||||
|  |  | ||||||
|  | app.UseCors("DamageAppCorsPolicy"); | ||||||
| app.UseAuthorization(); | app.UseAuthorization(); | ||||||
|  |  | ||||||
| app.MapControllers(); | app.MapControllers(); | ||||||
|  | |||||||
| @ -2,13 +2,16 @@ | |||||||
| using DamageAssesment.Api.DocuLinks.Db; | using DamageAssesment.Api.DocuLinks.Db; | ||||||
| using DamageAssesment.Api.DocuLinks.Interfaces; | using DamageAssesment.Api.DocuLinks.Interfaces; | ||||||
| using DamageAssesment.Api.DocuLinks.Models; | using DamageAssesment.Api.DocuLinks.Models; | ||||||
|  | using Microsoft.AspNetCore.Http; | ||||||
| using Microsoft.AspNetCore.Mvc; | using Microsoft.AspNetCore.Mvc; | ||||||
| using Microsoft.EntityFrameworkCore; | using Microsoft.EntityFrameworkCore; | ||||||
| using Microsoft.EntityFrameworkCore.Metadata.Internal; | using Microsoft.EntityFrameworkCore.Metadata.Internal; | ||||||
| using System; | using System; | ||||||
|  | using System.Collections.Generic; | ||||||
| using System.Collections.Immutable; | using System.Collections.Immutable; | ||||||
| using System.Diagnostics.Eventing.Reader; | using System.Diagnostics.Eventing.Reader; | ||||||
| using System.Reflection.Metadata; | using System.Reflection.Metadata; | ||||||
|  | using System.Runtime.CompilerServices; | ||||||
| using System.Xml; | using System.Xml; | ||||||
| using System.Xml.Linq; | using System.Xml.Linq; | ||||||
|  |  | ||||||
| @ -22,13 +25,18 @@ namespace DamageAssesment.Api.DocuLinks.Providers | |||||||
|         private ILogger<DoculinkProvider> logger; |         private ILogger<DoculinkProvider> logger; | ||||||
|         private IUploadService uploadservice; |         private IUploadService uploadservice; | ||||||
|         private IMapper mapper; |         private IMapper mapper; | ||||||
|  |         private readonly IHttpContextAccessor httpContextAccessor; | ||||||
|  |         private string baseUrl; | ||||||
|  |  | ||||||
|         public DoculinkProvider(DoculinkDbContext DocumentDbContext, ILogger<DoculinkProvider> logger, IMapper mapper, IUploadService uploadservice) |         public DoculinkProvider(DoculinkDbContext DocumentDbContext, ILogger<DoculinkProvider> logger, IMapper mapper, IUploadService uploadservice, IHttpContextAccessor httpContextAccessor) | ||||||
|         { |         { | ||||||
|             this.DocumentDbContext = DocumentDbContext; |             this.DocumentDbContext = DocumentDbContext; | ||||||
|             this.logger = logger; |             this.logger = logger; | ||||||
|             this.mapper = mapper; |             this.mapper = mapper; | ||||||
|             this.uploadservice = uploadservice; |             this.uploadservice = uploadservice; | ||||||
|  |             this.httpContextAccessor = httpContextAccessor; | ||||||
|  |             baseUrl = $"{httpContextAccessor.HttpContext.Request.Scheme}://{httpContextAccessor.HttpContext.Request.Host}"; | ||||||
|  |             baseUrl = baseUrl + "/doculinks/download"; | ||||||
|             SeedData(); |             SeedData(); | ||||||
|         } |         } | ||||||
|  |  | ||||||
| @ -71,11 +79,11 @@ namespace DamageAssesment.Api.DocuLinks.Providers | |||||||
|                     { |                     { | ||||||
|                         linkTypeId = 1; |                         linkTypeId = 1; | ||||||
|  |  | ||||||
|                         fileModel = new FileModel() { FileName = "Sample" + i, FileExtension = ".txt", FileContent = "c2FtcGxl", IsAttachments = true, CustomOrder = 1 }; |                         fileModel = new FileModel() { FileName = "Sample" + i, FileExtension = ".txt", FileContent = "c2FtcGxl", IsAttachments = true, CustomOrder = 1, Language = "en"  }; | ||||||
|                     } |                     } | ||||||
|                     else |                     else | ||||||
|                         fileModel = new FileModel() { url = "www.google" + i + ".com", IsAttachments = false, CustomOrder = 1 }; |                         fileModel = new FileModel() { url = "www.google" + i + ".com", IsAttachments = false, CustomOrder = 1,Language="en" }; | ||||||
|                     ReqDoculink documentInfo = new ReqDoculink() { linkTypeId = linkTypeId, CustomOrder = i, Files = new List<FileModel>() { fileModel } }; |                     ReqDoculink documentInfo = new ReqDoculink() { linkTypeId = i, CustomOrder = i, Files = new List<FileModel>() { fileModel } }; | ||||||
|                     Models.Doculink document = uploadservice.UploadDocument(counter, documentInfo); |                     Models.Doculink document = uploadservice.UploadDocument(counter, documentInfo); | ||||||
|                     DocumentDbContext.Documents.Add(mapper.Map<Models.Doculink, Db.Doculink>(document)); |                     DocumentDbContext.Documents.Add(mapper.Map<Models.Doculink, Db.Doculink>(document)); | ||||||
|                     DocumentDbContext.SaveChanges(); |                     DocumentDbContext.SaveChanges(); | ||||||
| @ -170,7 +178,42 @@ namespace DamageAssesment.Api.DocuLinks.Providers | |||||||
|             MultiLanguage = dicttitle; |             MultiLanguage = dicttitle; | ||||||
|             return MultiLanguage; |             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) |         public async Task<(bool IsSuccess, IEnumerable<Models.ResDoculink> documents, string ErrorMessage)> GetdocumentsByLinkTypeIdAsync(int? linkTypeId, string? language, bool? isactive) | ||||||
|         { |         { | ||||||
|  |  | ||||||
| @ -192,8 +235,7 @@ namespace DamageAssesment.Api.DocuLinks.Providers | |||||||
|                         item.titles = multilan.titles; |                         item.titles = multilan.titles; | ||||||
|                         item.description = multilan.description; |                         item.description = multilan.description; | ||||||
|                         item.linktypes = CreateMultiLanguageLinkTypeObject(GetLinkTypeTranslations(item.linkTypeId, language)); |                         item.linktypes = CreateMultiLanguageLinkTypeObject(GetLinkTypeTranslations(item.linkTypeId, language)); | ||||||
|                         item.doclinksAttachments = mapper.Map<List<Db.DoculinkAttachments>, List<Models.DoculinkAttachments>>( |                         item.doclinksAttachments = GetDocumentAttachment(item.Id,language); | ||||||
|                             DocumentDbContext.DoclinksAttachments.AsNoTracking().Where(a => a.DocumentId == item.Id).ToList()); |  | ||||||
|                     } |                     } | ||||||
|                    // List<ResDoculinks> doculinks = result.GroupBy(a => a.linkTypeId).Select(a => new ResDoculinks() { linkTypeId = a.Key, doculinks = a.ToList() }).ToList(); |                    // List<ResDoculinks> doculinks = result.GroupBy(a => a.linkTypeId).Select(a => new ResDoculinks() { linkTypeId = a.Key, doculinks = a.ToList() }).ToList(); | ||||||
|                     return (true, result, null); |                     return (true, result, null); | ||||||
| @ -228,8 +270,7 @@ namespace DamageAssesment.Api.DocuLinks.Providers | |||||||
|                         item.titles = multilan.titles; |                         item.titles = multilan.titles; | ||||||
|                         item.description = multilan.description; |                         item.description = multilan.description; | ||||||
|                         item.linktypes = CreateMultiLanguageLinkTypeObject(GetLinkTypeTranslations(item.linkTypeId, language)); |                         item.linktypes = CreateMultiLanguageLinkTypeObject(GetLinkTypeTranslations(item.linkTypeId, language)); | ||||||
|                         item.doclinksAttachments = mapper.Map<List<Db.DoculinkAttachments>, List<Models.DoculinkAttachments>>( |                         item.doclinksAttachments = GetDocumentAttachment(item.Id, language); | ||||||
|                             DocumentDbContext.DoclinksAttachments.AsNoTracking().Where(a => a.DocumentId == item.Id).ToList()); |  | ||||||
|                     } |                     } | ||||||
|                     //List<ResDoculinks> doculinks =  result.GroupBy(a => a.linkTypeId).Select(a => new ResDoculinks() { linkTypeId = a.Key, doculinks = a.ToList() }).ToList(); |                     //List<ResDoculinks> doculinks =  result.GroupBy(a => a.linkTypeId).Select(a => new ResDoculinks() { linkTypeId = a.Key, doculinks = a.ToList() }).ToList(); | ||||||
|                     return (true, result, null); |                     return (true, result, null); | ||||||
| @ -284,8 +325,7 @@ namespace DamageAssesment.Api.DocuLinks.Providers | |||||||
|                     result.documentsTranslations = mapper.Map<List<Db.DoculinkTranslation>, List<Models.DoculinkTranslation>>( |                     result.documentsTranslations = mapper.Map<List<Db.DoculinkTranslation>, List<Models.DoculinkTranslation>>( | ||||||
|                             DocumentDbContext.DocumentsTranslations.Where(a => a.DocumentId == result.Id).ToList()); |                             DocumentDbContext.DocumentsTranslations.Where(a => a.DocumentId == result.Id).ToList()); | ||||||
|  |  | ||||||
|                     result.doclinksAttachments = mapper.Map<List<Db.DoculinkAttachments>, List<Models.DoculinkAttachments>>( |                     result.doclinksAttachments = GetDocumentAttachment(id, ""); | ||||||
|                         DocumentDbContext.DoclinksAttachments.AsNoTracking().Where(a => a.DocumentId == id).ToList()); |  | ||||||
|                     return (true, result, null); |                     return (true, result, null); | ||||||
|                 } |                 } | ||||||
|                 return (false, null, "Not found"); |                 return (false, null, "Not found"); | ||||||
| @ -317,8 +357,7 @@ namespace DamageAssesment.Api.DocuLinks.Providers | |||||||
|                     result.linktypes = CreateMultiLanguageLinkTypeObject(GetLinkTypeTranslations(result.linkTypeId, language)); |                     result.linktypes = CreateMultiLanguageLinkTypeObject(GetLinkTypeTranslations(result.linkTypeId, language)); | ||||||
|                     result.titles = multilan.titles; |                     result.titles = multilan.titles; | ||||||
|                     result.description = multilan.description; |                     result.description = multilan.description; | ||||||
|                     result.doclinksAttachments = mapper.Map<List<Db.DoculinkAttachments>, List<Models.DoculinkAttachments>>( |                     result.doclinksAttachments = GetDocumentAttachment(id, language); | ||||||
|                         DocumentDbContext.DoclinksAttachments.AsNoTracking().Where(a => a.DocumentId == id).ToList()); |  | ||||||
|                     return (true, result, null); |                     return (true, result, null); | ||||||
|                 } |                 } | ||||||
|                 return (false, null, "Not found"); |                 return (false, null, "Not found"); | ||||||
| @ -349,7 +388,7 @@ namespace DamageAssesment.Api.DocuLinks.Providers | |||||||
|                 result.linktypes = CreateMultiLanguageLinkTypeObject(GetLinkTypeTranslations(Document.linkTypeId, "")); |                 result.linktypes = CreateMultiLanguageLinkTypeObject(GetLinkTypeTranslations(Document.linkTypeId, "")); | ||||||
|                 result.titles = multilan.titles; |                 result.titles = multilan.titles; | ||||||
|                 result.description = multilan.description; |                 result.description = multilan.description; | ||||||
|                 result.doclinksAttachments = Document.doclinksAttachments; |                 result.doclinksAttachments = GetDocumentAttachment(document.Id,""); | ||||||
|                 return (true, result, null); |                 return (true, result, null); | ||||||
|             } |             } | ||||||
|             catch (Exception ex) |             catch (Exception ex) | ||||||
| @ -391,7 +430,7 @@ namespace DamageAssesment.Api.DocuLinks.Providers | |||||||
|                         result.linktypes = CreateMultiLanguageLinkTypeObject(GetLinkTypeTranslations(document.linkTypeId, "")); |                         result.linktypes = CreateMultiLanguageLinkTypeObject(GetLinkTypeTranslations(document.linkTypeId, "")); | ||||||
|                         result.titles = multilan.titles; |                         result.titles = multilan.titles; | ||||||
|                         result.description = multilan.description; |                         result.description = multilan.description; | ||||||
|                         result.doclinksAttachments = Document.doclinksAttachments; |                         result.doclinksAttachments = GetDocumentAttachment(document.Id, ""); | ||||||
|                         return (true, result, "Successful"); |                         return (true, result, "Successful"); | ||||||
|                     } |                     } | ||||||
|                     else |                     else | ||||||
| @ -414,6 +453,35 @@ namespace DamageAssesment.Api.DocuLinks.Providers | |||||||
|                 return (false, null, ex.Message); |                 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) |         public async Task<(bool IsSuccess, Models.ResDoculink Document, string ErrorMessage)> DeleteDocumentAsync(int id) | ||||||
|         { |         { | ||||||
|  |  | ||||||
|  | |||||||
| @ -25,6 +25,41 @@ namespace DamageAssesment.Api.DocuLinks.Providers | |||||||
|             uploadpath = configuration.GetValue<string>("Fileupload:folderpath"); |             uploadpath = configuration.GetValue<string>("Fileupload:folderpath"); | ||||||
|             Deletepath = configuration.GetValue<string>("Fileupload:Deletepath"); |             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) |         public Models.Doculink UploadDocument(int counter, ReqDoculink documentInfo) | ||||||
|         { |         { | ||||||
| @ -44,19 +79,20 @@ namespace DamageAssesment.Api.DocuLinks.Providers | |||||||
|                         counter++; |                         counter++; | ||||||
|                         if (item.IsAttachments) |                         if (item.IsAttachments) | ||||||
|                         { |                         { | ||||||
|                             UserfileName = Path.GetFileName(item.FileName); |                             UserfileName = Path.GetFileName(item.FileName + item.FileExtension); | ||||||
|                             var fileName = String.Format("Document_{0}{1}", counter, item.FileExtension); |                             var fileName = String.Format("Document_{0}{1}", counter, item.FileExtension); | ||||||
|                             path = Path.Combine(fullDirectoryPath, fileName); |                             path = Path.Combine(fullDirectoryPath, fileName); | ||||||
|                             File.WriteAllBytes(path, Convert.FromBase64String(item.FileContent)); |                             File.WriteAllBytes(path, Convert.FromBase64String(item.FileContent)); | ||||||
|                         } |                         } | ||||||
|                         else |                         else | ||||||
|                             path = item.url; |                             path = item.url; | ||||||
|                         attachments.Add(new Models.DoculinkAttachments { docName=UserfileName,Path=path,IsAttachments=item.IsAttachments,CustomOrder=item.CustomOrder }); |                         attachments.Add(new Models.DoculinkAttachments { docName=UserfileName,Path=path,IsAttachments=item.IsAttachments,CustomOrder=item.CustomOrder,Language=item.Language }); | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|                 Documents=new Models.Doculink (){ linkTypeId = documentInfo.linkTypeId, |                 Documents=new Models.Doculink (){ linkTypeId = documentInfo.linkTypeId, | ||||||
|                     documentsTranslations = documentInfo.documentsTranslations,doclinksAttachments=attachments, |                     documentsTranslations = documentInfo.documentsTranslations,doclinksAttachments=attachments, | ||||||
|                     IsDeleted=false,CustomOrder=documentInfo.CustomOrder, IsActive =true}; |                     IsDeleted=false,CustomOrder=documentInfo.CustomOrder, IsActive =documentInfo.IsActive | ||||||
|  |                 }; | ||||||
|              |              | ||||||
|                 return Documents; |                 return Documents; | ||||||
|             } |             } | ||||||
| @ -85,21 +121,21 @@ namespace DamageAssesment.Api.DocuLinks.Providers | |||||||
|                     counter++; |                     counter++; | ||||||
|                     if (item.IsAttachments) |                     if (item.IsAttachments) | ||||||
|                     { |                     { | ||||||
|                         UserfileName = Path.GetFileName(item.FileName); |                         UserfileName = Path.GetFileName(item.FileName+item.FileExtension); | ||||||
|                         var fileName = String.Format("Document_{0}{1}", counter, item.FileExtension); |                         var fileName = String.Format("Document_{0}{1}", counter, item.FileExtension); | ||||||
|                         path = Path.Combine(fullDirectoryPath, fileName); |                         path = Path.Combine(fullDirectoryPath, fileName); | ||||||
|                         File.WriteAllBytes(path, Convert.FromBase64String(item.FileContent)); |                         File.WriteAllBytes(path, Convert.FromBase64String(item.FileContent)); | ||||||
|                     } |                     } | ||||||
|                     else |                     else | ||||||
|                         path = item.url; |                         path = item.url; | ||||||
|                     attachments.Add(new Models.DoculinkAttachments { docName = UserfileName, Path = path,IsAttachments=item.IsAttachments,CustomOrder=item.CustomOrder }); |                     attachments.Add(new Models.DoculinkAttachments { docName = UserfileName, Path = path,IsAttachments=item.IsAttachments,CustomOrder=item.CustomOrder,Language=item.Language }); | ||||||
|                 } |                 } | ||||||
|                 Models.Doculink Documents = new Models.Doculink() |                 Models.Doculink Documents = new Models.Doculink() | ||||||
|                 { |                 { | ||||||
|                     Id = documentInfo.Id, |                     Id = documentInfo.Id, | ||||||
|                     linkTypeId = documentInfo.linkTypeId, |                     linkTypeId = documentInfo.linkTypeId, | ||||||
|                     documentsTranslations=documentInfo.documentsTranslations, |                     documentsTranslations=documentInfo.documentsTranslations, | ||||||
|                     IsActive = true, |                     IsActive = documentInfo.IsActive, | ||||||
|                     IsDeleted=false, |                     IsDeleted=false, | ||||||
|                     CustomOrder = documentInfo.CustomOrder, |                     CustomOrder = documentInfo.CustomOrder, | ||||||
|                     doclinksAttachments = attachments |                     doclinksAttachments = attachments | ||||||
|  | |||||||
| @ -1,8 +0,0 @@ | |||||||
| { |  | ||||||
|   "Logging": { |  | ||||||
|     "LogLevel": { |  | ||||||
|       "Default": "Information", |  | ||||||
|       "Microsoft.AspNetCore": "Warning" |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
| } |  | ||||||
| @ -6,6 +6,12 @@ | |||||||
|     } |     } | ||||||
|   }, |   }, | ||||||
|   "AllowedHosts": "*", |   "AllowedHosts": "*", | ||||||
|  |   "ConnectionStrings": { | ||||||
|  |     //"DoculinConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;", | ||||||
|  |     //"DoculinConnection": "Server=localhost,1433;Database=da_survey_dev;User Id=sa;Password=Password123;TrustServerCertificate=True;" | ||||||
|  |     "DoculinConnection": "Server=207.180.248.35;Database=da_survey_dev;User Id=sa;Password=YourStrongPassw0rd;TrustServerCertificate=True;" | ||||||
|  |  | ||||||
|  |   }, | ||||||
|   "Fileupload": { |   "Fileupload": { | ||||||
|     "folderpath": "DASA_Documents/Active", |     "folderpath": "DASA_Documents/Active", | ||||||
|     "Deletepath": "DASA_Documents/Deleted" |     "Deletepath": "DASA_Documents/Deleted" | ||||||
|  | |||||||
| @ -12,8 +12,18 @@ | |||||||
|   <ItemGroup> |   <ItemGroup> | ||||||
|     <PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="12.0.1" /> |     <PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="12.0.1" /> | ||||||
|     <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.21" /> |     <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.21" /> | ||||||
|     <PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.5" /> |     <PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.9" /> | ||||||
|     <PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="7.0.5" /> |     <PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="7.0.5" /> | ||||||
|  |     <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="7.0.9"> | ||||||
|  |       <PrivateAssets>all</PrivateAssets> | ||||||
|  |       <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> | ||||||
|  |     </PackageReference> | ||||||
|  |     <PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="7.0.9" /> | ||||||
|  |     <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="7.0.9" /> | ||||||
|  |     <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="7.0.9"> | ||||||
|  |       <PrivateAssets>all</PrivateAssets> | ||||||
|  |       <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> | ||||||
|  |     </PackageReference> | ||||||
|     <PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.19.4" /> |     <PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.19.4" /> | ||||||
|     <PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" /> |     <PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" /> | ||||||
|   </ItemGroup> |   </ItemGroup> | ||||||
|  | |||||||
| @ -1,7 +1,9 @@ | |||||||
| using System.ComponentModel.DataAnnotations; | using System.ComponentModel.DataAnnotations; | ||||||
|  | using System.ComponentModel.DataAnnotations.Schema; | ||||||
|  |  | ||||||
| namespace DamageAssesment.Api.Employees.Db | namespace DamageAssesment.Api.Employees.Db | ||||||
| { | { | ||||||
|  |     [Table("Employees")] | ||||||
|     public class Employee |     public class Employee | ||||||
|     { |     { | ||||||
|         [Key] |         [Key] | ||||||
|  | |||||||
| @ -4,18 +4,23 @@ namespace DamageAssesment.Api.Employees.Db | |||||||
| { | { | ||||||
|     public class EmployeeDbContext: DbContext |     public class EmployeeDbContext: DbContext | ||||||
|     { |     { | ||||||
|         public DbSet<Db.Employee> Employees { get; set; } |         private IConfiguration _Configuration { get; set; } | ||||||
|         public EmployeeDbContext(DbContextOptions options) : base(options) |         public EmployeeDbContext(DbContextOptions options, IConfiguration configuration) : base(options) | ||||||
|         { |         { | ||||||
|  |             _Configuration = configuration; | ||||||
|  |         } | ||||||
|  |         protected override void OnConfiguring(DbContextOptionsBuilder options) | ||||||
|  |         { | ||||||
|  |             // connect to sql server with connection string from app settings | ||||||
|  |             options.UseSqlServer(_Configuration.GetConnectionString("EmployeeConnection")); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         protected override void OnModelCreating(ModelBuilder modelBuilder) |         protected override void OnModelCreating(ModelBuilder modelBuilder) | ||||||
|         { |         { | ||||||
|             base.OnModelCreating(modelBuilder); |             base.OnModelCreating(modelBuilder); | ||||||
|  |  | ||||||
|             modelBuilder.Entity<Employee>() |             modelBuilder.Entity<Employee>() | ||||||
|                 .Property(item => item.Id) |                 .Property(item => item.Id) | ||||||
|                 .ValueGeneratedOnAdd(); |                 .ValueGeneratedOnAdd(); | ||||||
|         } |         } | ||||||
|  |         public DbSet<Db.Employee> Employees { get; set; } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -6,12 +6,18 @@ using System.Reflection; | |||||||
|  |  | ||||||
| var builder = WebApplication.CreateBuilder(args); | var builder = WebApplication.CreateBuilder(args); | ||||||
|  |  | ||||||
| // Add services to the container. |  | ||||||
|  |  | ||||||
|  | // CORS setup to allow requests from any origin. | ||||||
|  | builder.Services.AddCors(p => p.AddPolicy("DamageAppCorsPolicy", build => { | ||||||
|  |     build.WithOrigins("*").AllowAnyMethod().AllowAnyHeader().AllowAnyOrigin(); | ||||||
|  | })); | ||||||
|  |  | ||||||
|  |  | ||||||
|  | // Add services to the container. | ||||||
| builder.Services.AddControllers(); | builder.Services.AddControllers(); | ||||||
| // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle | // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle | ||||||
| builder.Services.AddEndpointsApiExplorer(); | builder.Services.AddEndpointsApiExplorer(); | ||||||
| //builder.Services.AddSwaggerGen(); | // Add Swagger/OpenAPI documentation support. | ||||||
| builder.Services.AddSwaggerGen(c => | builder.Services.AddSwaggerGen(c => | ||||||
| { | { | ||||||
|     // Include XML comments from your assembly |     // Include XML comments from your assembly | ||||||
| @ -24,9 +30,11 @@ builder.Services.AddScoped<IEmployeesProvider, EmployeesProvider>(); | |||||||
| builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies()); //4/30 | builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies()); //4/30 | ||||||
| builder.Services.AddDbContext<EmployeeDbContext>(option => | builder.Services.AddDbContext<EmployeeDbContext>(option => | ||||||
| { | { | ||||||
|     option.UseInMemoryDatabase("Employees"); |     option.UseSqlServer("EmployeeConnection"); | ||||||
| }); | }); | ||||||
|  | builder.Services.AddCors(p => p.AddPolicy("DamageAppCorsPolicy", build => { | ||||||
|  |     build.WithOrigins("*").AllowAnyMethod().AllowAnyHeader().AllowAnyOrigin(); | ||||||
|  | })); | ||||||
| var app = builder.Build(); | var app = builder.Build(); | ||||||
|  |  | ||||||
| // Configure the HTTP request pipeline. | // Configure the HTTP request pipeline. | ||||||
| @ -43,6 +51,11 @@ if (app.Environment.IsDevelopment()) | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | app.UseCors("DamageAppCorsPolicy"); | ||||||
|  |  | ||||||
|  | // Enable CORS, authentication, and authorization middleware. | ||||||
|  | app.UseCors("DamageAppCorsPolicy"); | ||||||
|  |  | ||||||
| app.UseAuthorization(); | app.UseAuthorization(); | ||||||
|  |  | ||||||
| app.MapControllers(); | app.MapControllers(); | ||||||
|  | |||||||
| @ -77,7 +77,8 @@ namespace DamageAssesment.Api.Employees.Providers | |||||||
|                     EmployeeDbContext.Employees.Add(_employee); |                     EmployeeDbContext.Employees.Add(_employee); | ||||||
|                     Employee.Id = _employee.Id; |                     Employee.Id = _employee.Id; | ||||||
|                     EmployeeDbContext.SaveChanges(); |                     EmployeeDbContext.SaveChanges(); | ||||||
|                     return (true, Employee, null); |                     //return (true, Employee, null); | ||||||
|  |                     return (true, mapper.Map<Db.Employee, Models.Employee>(_employee), null); | ||||||
|                 } |                 } | ||||||
|                 return (false, null, "Employee code is already exits"); |                 return (false, null, "Employee code is already exits"); | ||||||
|             } |             } | ||||||
|  | |||||||
| @ -1,8 +0,0 @@ | |||||||
| { |  | ||||||
|   "Logging": { |  | ||||||
|     "LogLevel": { |  | ||||||
|       "Default": "Information", |  | ||||||
|       "Microsoft.AspNetCore": "Warning" |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
| } |  | ||||||
| @ -13,5 +13,11 @@ | |||||||
|     "endpoint1": "xxx", |     "endpoint1": "xxx", | ||||||
|     "endpoint2": "xxx", |     "endpoint2": "xxx", | ||||||
|     "endpoint3": "xxx" |     "endpoint3": "xxx" | ||||||
|  |   }, | ||||||
|  |   "ConnectionStrings": { | ||||||
|  |     //"EmployeeConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;", | ||||||
|  |     //"EmployeeConnection": "Server=localhost,1433;Database=da_survey_dev;User Id=sa;Password=Password123;TrustServerCertificate=True;" | ||||||
|  |     "EmployeeConnection": "Server=207.180.248.35;Database=da_survey_dev;User Id=sa;Password=YourStrongPassw0rd;TrustServerCertificate=True;" | ||||||
|  |  | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  | |||||||
| @ -11,6 +11,17 @@ | |||||||
|  |  | ||||||
|   <ItemGroup> |   <ItemGroup> | ||||||
|     <PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="12.0.1" /> |     <PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="12.0.1" /> | ||||||
|  |     <PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.9" /> | ||||||
|  |     <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="7.0.9"> | ||||||
|  |       <PrivateAssets>all</PrivateAssets> | ||||||
|  |       <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> | ||||||
|  |     </PackageReference> | ||||||
|  |     <PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="7.0.9" /> | ||||||
|  |     <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="7.0.9" /> | ||||||
|  |     <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="7.0.9"> | ||||||
|  |       <PrivateAssets>all</PrivateAssets> | ||||||
|  |       <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> | ||||||
|  |     </PackageReference> | ||||||
|     <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.21" /> |     <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.21" /> | ||||||
|     <PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.5" /> |     <PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.5" /> | ||||||
|     <PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="7.0.5" /> |     <PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="7.0.5" /> | ||||||
|  | |||||||
| @ -3,6 +3,7 @@ using System.ComponentModel.DataAnnotations.Schema; | |||||||
|  |  | ||||||
| namespace DamageAssesment.Api.Locations.Db | namespace DamageAssesment.Api.Locations.Db | ||||||
| { | { | ||||||
|  |     [Table("Locations")] | ||||||
|     public class Location |     public class Location | ||||||
|     { |     { | ||||||
|         [Key] |         [Key] | ||||||
| @ -20,6 +21,10 @@ namespace DamageAssesment.Api.Locations.Db | |||||||
|  |  | ||||||
|         [StringLength(2)] |         [StringLength(2)] | ||||||
|         public string SchoolType { get; set; } |         public string SchoolType { get; set; } | ||||||
|  |         public int? DataValue { get; set; } | ||||||
|  |         public int? Enrollment { get; set; } | ||||||
|  |         public double? Longitute { get; set; } | ||||||
|  |         public double? Latitude { get; set; } | ||||||
|  |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -4,6 +4,16 @@ namespace DamageAssesment.Api.Locations.Db | |||||||
| { | { | ||||||
|     public class LocationDbContext : DbContext |     public class LocationDbContext : DbContext | ||||||
|     { |     { | ||||||
|  |         private IConfiguration _Configuration { get; set; } | ||||||
|  |         public LocationDbContext(DbContextOptions options, IConfiguration configuration) : base(options) | ||||||
|  |         { | ||||||
|  |             _Configuration = configuration; | ||||||
|  |         } | ||||||
|  |         protected override void OnConfiguring(DbContextOptionsBuilder options) | ||||||
|  |         { | ||||||
|  |             // connect to sql server with connection string from app settings | ||||||
|  |             options.UseSqlServer(_Configuration.GetConnectionString("LocationConnection")); | ||||||
|  |         } | ||||||
|         public DbSet<Db.Location> Locations { get; set; } |         public DbSet<Db.Location> Locations { get; set; } | ||||||
|         public DbSet<Db.Region> Regions { get; set; } |         public DbSet<Db.Region> Regions { get; set; } | ||||||
|         public LocationDbContext(DbContextOptions options) : base(options) |         public LocationDbContext(DbContextOptions options) : base(options) | ||||||
|  | |||||||
| @ -1,7 +1,9 @@ | |||||||
| using System.ComponentModel.DataAnnotations; | using System.ComponentModel.DataAnnotations; | ||||||
|  | using System.ComponentModel.DataAnnotations.Schema; | ||||||
|  |  | ||||||
| namespace DamageAssesment.Api.Locations.Db | namespace DamageAssesment.Api.Locations.Db | ||||||
| { | { | ||||||
|  |     [Table("Regions")] | ||||||
|     public class Region |     public class Region | ||||||
|     { |     { | ||||||
|         [Key] |         [Key] | ||||||
|  | |||||||
| @ -11,5 +11,9 @@ namespace DamageAssesment.Api.Locations.Models | |||||||
|         public string Name { get; set; } |         public string Name { get; set; } | ||||||
|         public string MaintenanceCenter { get; set; } |         public string MaintenanceCenter { get; set; } | ||||||
|         public string SchoolType { get; set; } |         public string SchoolType { get; set; } | ||||||
|  |         public int? DataValue { get; set; } | ||||||
|  |         public int? Enrollment { get; set; } | ||||||
|  |         public double? Longitute { get; set; } | ||||||
|  |         public double? Latitude { get; set; } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -5,13 +5,18 @@ using Microsoft.EntityFrameworkCore; | |||||||
| using System.Reflection; | using System.Reflection; | ||||||
|  |  | ||||||
| var builder = WebApplication.CreateBuilder(args); | var builder = WebApplication.CreateBuilder(args); | ||||||
|  | // CORS setup to allow requests from any origin. | ||||||
|  | builder.Services.AddCors(p => p.AddPolicy("DamageAppCorsPolicy", build => { | ||||||
|  |     build.WithOrigins("*").AllowAnyMethod().AllowAnyHeader().AllowAnyOrigin(); | ||||||
|  | })); | ||||||
|  |  | ||||||
|  |  | ||||||
| // Add services to the container. | // Add services to the container. | ||||||
|  | // Add controller services and API Explorer for endpoint discovery. | ||||||
| builder.Services.AddControllers(); | builder.Services.AddControllers(); | ||||||
| // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle | // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle | ||||||
| builder.Services.AddEndpointsApiExplorer(); | builder.Services.AddEndpointsApiExplorer(); | ||||||
| //builder.Services.AddSwaggerGen(); | // Add Swagger/OpenAPI documentation support. | ||||||
| builder.Services.AddSwaggerGen(c => | builder.Services.AddSwaggerGen(c => | ||||||
| { | { | ||||||
|     // Include XML comments from your assembly |     // Include XML comments from your assembly | ||||||
| @ -24,8 +29,11 @@ builder.Services.AddScoped<IRegionsProvider, RegionsProvider>(); | |||||||
| builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies()); //4/30 | builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies()); //4/30 | ||||||
| builder.Services.AddDbContext<LocationDbContext>(option => | builder.Services.AddDbContext<LocationDbContext>(option => | ||||||
| { | { | ||||||
|     option.UseInMemoryDatabase("Locations"); |     option.UseSqlServer("LocationConnection"); | ||||||
| }); | }); | ||||||
|  | builder.Services.AddCors(p => p.AddPolicy("DamageAppCorsPolicy", build => { | ||||||
|  |     build.WithOrigins("*").AllowAnyMethod().AllowAnyHeader().AllowAnyOrigin(); | ||||||
|  | })); | ||||||
| var app = builder.Build(); | var app = builder.Build(); | ||||||
|  |  | ||||||
| // Configure the HTTP request pipeline. | // Configure the HTTP request pipeline. | ||||||
| @ -44,6 +52,11 @@ if (app.Environment.IsDevelopment()) | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | app.UseCors("DamageAppCorsPolicy"); | ||||||
|  |  | ||||||
|  | // Enable CORS, authentication, and authorization middleware. | ||||||
|  | app.UseCors("DamageAppCorsPolicy"); | ||||||
|  |  | ||||||
| app.UseAuthorization(); | app.UseAuthorization(); | ||||||
|  |  | ||||||
| app.MapControllers(); | app.MapControllers(); | ||||||
|  | |||||||
| @ -28,6 +28,8 @@ namespace DamageAssesment.Api.Locations.Providers | |||||||
|                 var locations = await locationDbContext.Locations.AsNoTracking().ToListAsync(); |                 var locations = await locationDbContext.Locations.AsNoTracking().ToListAsync(); | ||||||
|                 if (locations != null) |                 if (locations != null) | ||||||
|                 { |                 { | ||||||
|  |                     int maxenrollment = (int)locations.Max(a => a.Enrollment); | ||||||
|  |                     foreach (Db.Location item in locations) { item.DataValue = GetHeatmapdata(item.Enrollment, maxenrollment); } | ||||||
|                     logger?.LogInformation($"{locations.Count} Locations(s) found"); |                     logger?.LogInformation($"{locations.Count} Locations(s) found"); | ||||||
|                     var result = mapper.Map<IEnumerable<Db.Location>, IEnumerable<Models.Location>>(locations); |                     var result = mapper.Map<IEnumerable<Db.Location>, IEnumerable<Models.Location>>(locations); | ||||||
|                     return (true, result, null); |                     return (true, result, null); | ||||||
| @ -46,9 +48,12 @@ namespace DamageAssesment.Api.Locations.Providers | |||||||
|             try |             try | ||||||
|             { |             { | ||||||
|                 logger?.LogInformation("Query Location"); |                 logger?.LogInformation("Query Location"); | ||||||
|  |  | ||||||
|  |                 int maxenrollment = (int)await locationDbContext.Locations.AsNoTracking().MaxAsync(a => a.Enrollment); | ||||||
|                 var location = await locationDbContext.Locations.AsNoTracking().FirstOrDefaultAsync(q => q.Id == Id); |                 var location = await locationDbContext.Locations.AsNoTracking().FirstOrDefaultAsync(q => q.Id == Id); | ||||||
|                 if (location != null) |                 if (location != null) | ||||||
|                 { |                 {if(maxenrollment>0) | ||||||
|  |                         location.DataValue = GetHeatmapdata(location.Enrollment, maxenrollment); | ||||||
|                     logger?.LogInformation($"{location}  found"); |                     logger?.LogInformation($"{location}  found"); | ||||||
|                     var result = mapper.Map<Db.Location, Models.Location>(location); |                     var result = mapper.Map<Db.Location, Models.Location>(location); | ||||||
|                     return (true, result, null); |                     return (true, result, null); | ||||||
| @ -61,6 +66,10 @@ namespace DamageAssesment.Api.Locations.Providers | |||||||
|                 return (false, null, ex.Message); |                 return (false, null, ex.Message); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |         private int GetHeatmapdata(int? enrollment,int maxenrollment) | ||||||
|  |         { | ||||||
|  |             return (enrollment != null ? enrollment.Value : 0) * 100 / maxenrollment; | ||||||
|  |         } | ||||||
|         public async Task<(bool IsSuccess, Models.Location Location, string ErrorMessage)> PostLocationAsync(Models.Location location) |         public async Task<(bool IsSuccess, Models.Location Location, string ErrorMessage)> PostLocationAsync(Models.Location location) | ||||||
|         { |         { | ||||||
|             try |             try | ||||||
| @ -139,9 +148,9 @@ namespace DamageAssesment.Api.Locations.Providers | |||||||
|         { |         { | ||||||
|             if (!locationDbContext.Locations.Any()) |             if (!locationDbContext.Locations.Any()) | ||||||
|             { |             { | ||||||
|                 locationDbContext.Locations.Add(new Db.Location() { LocationCode = "0091", RegionId = 5, Name = "BOB GRAHAM EDUCATION CENTER", MaintenanceCenter = "1", SchoolType = "K8" }); |                 locationDbContext.Locations.Add(new Db.Location() { LocationCode = "0091", RegionId = 5, Name = "BOB GRAHAM EDUCATION CENTER", MaintenanceCenter = "1", SchoolType = "K8", DataValue = 25,Enrollment=780,Latitude= 25.83604,Longitute= -80.21618 }); | ||||||
|                 locationDbContext.Locations.Add(new Db.Location() { LocationCode = "0092", RegionId = 1, Name = "NORMAN S. EDELCUP/SUNNY ISLES BEACH K-8", MaintenanceCenter = "1", SchoolType = "K8" }); |                 locationDbContext.Locations.Add(new Db.Location() { LocationCode = "0092", RegionId = 1, Name = "NORMAN S. EDELCUP/SUNNY ISLES BEACH K-8", MaintenanceCenter = "1", SchoolType = "K8", DataValue = 46, Enrollment = 650, Latitude = 20.83604, Longitute = -40.21618 }); | ||||||
|                 locationDbContext.Locations.Add(new Db.Location() { LocationCode = "7511", RegionId = 4, Name = "MIAMI SPRINGS SHS", MaintenanceCenter = "2", SchoolType = "S" }); |                 locationDbContext.Locations.Add(new Db.Location() { LocationCode = "7511", RegionId = 4, Name = "MIAMI SPRINGS SHS", MaintenanceCenter = "2", SchoolType = "S", DataValue = 12, Enrollment = 500, Latitude = 53.83604, Longitute = -60.21618 }); | ||||||
|                 //locationDbContext.Locations.Add(new Db.Location() { Id = 3, LocationCode = "Loc3", RegionId = 3, Name = "BOB GRAHAM EDUCATION CENTER 3", MaintenanceCenter = "1", SchoolType = "US" }); |                 //locationDbContext.Locations.Add(new Db.Location() { Id = 3, LocationCode = "Loc3", RegionId = 3, Name = "BOB GRAHAM EDUCATION CENTER 3", MaintenanceCenter = "1", SchoolType = "US" }); | ||||||
|                 //locationDbContext.Locations.Add(new Db.Location() { Id = 4, LocationCode = "Loc4", RegionId = 1, Name = "BOB GRAHAM EDUCATION CENTER 4", MaintenanceCenter = "1", SchoolType = "US" }); |                 //locationDbContext.Locations.Add(new Db.Location() { Id = 4, LocationCode = "Loc4", RegionId = 1, Name = "BOB GRAHAM EDUCATION CENTER 4", MaintenanceCenter = "1", SchoolType = "US" }); | ||||||
|                 //locationDbContext.Locations.Add(new Db.Location() { Id = 5, LocationCode = "Loc5", RegionId = 2, Name = "BOB GRAHAM EDUCATION CENTER 5", MaintenanceCenter = "1", SchoolType = "US" }); |                 //locationDbContext.Locations.Add(new Db.Location() { Id = 5, LocationCode = "Loc5", RegionId = 2, Name = "BOB GRAHAM EDUCATION CENTER 5", MaintenanceCenter = "1", SchoolType = "US" }); | ||||||
|  | |||||||
| @ -1,8 +0,0 @@ | |||||||
| { |  | ||||||
|   "Logging": { |  | ||||||
|     "LogLevel": { |  | ||||||
|       "Default": "Information", |  | ||||||
|       "Microsoft.AspNetCore": "Warning" |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
| } |  | ||||||
| @ -8,5 +8,11 @@ | |||||||
|       "Microsoft.AspNetCore": "Warning" |       "Microsoft.AspNetCore": "Warning" | ||||||
|     } |     } | ||||||
|   }, |   }, | ||||||
|   "AllowedHosts": "*" |   "AllowedHosts": "*", | ||||||
|  |   "ConnectionStrings": { | ||||||
|  |     //"LocationConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;", | ||||||
|  |     // "LocationConnection": "Server=localhost,1433;Database=da_survey_dev;User Id=sa;Password=Password123;TrustServerCertificate=True;" | ||||||
|  |     "LocationConnection": "Server=207.180.248.35;Database=da_survey_dev;User Id=sa;Password=YourStrongPassw0rd;TrustServerCertificate=True;" | ||||||
|  |  | ||||||
|  |   } | ||||||
| } | } | ||||||
|  | |||||||
| @ -1,4 +1,5 @@ | |||||||
| using DamageAssesment.Api.Questions.Interfaces; | using DamageAssesment.Api.Questions.Interfaces; | ||||||
|  | using DamageAssesment.Api.Questions.Models; | ||||||
| using Microsoft.AspNetCore.Mvc; | using Microsoft.AspNetCore.Mvc; | ||||||
|  |  | ||||||
| namespace DamageAssesment.Api.Questions.Controllers | namespace DamageAssesment.Api.Questions.Controllers | ||||||
| @ -89,6 +90,46 @@ namespace DamageAssesment.Api.Questions.Controllers | |||||||
|             return CreatedAtRoute("DefaultApi", new { id = question.Id }, question); |             return CreatedAtRoute("DefaultApi", new { id = question.Id }, question); | ||||||
|         } |         } | ||||||
|         /// <summary> |         /// <summary> | ||||||
|  |         /// POST request for creating a multiple question (multilingual). | ||||||
|  |         /// </summary> | ||||||
|  |         [HttpPost("questions/multiple")] | ||||||
|  |         public async Task<IActionResult> CreateQuestions(List<Models.Question> questions) | ||||||
|  |         { | ||||||
|  |             if (questions != null) | ||||||
|  |             { | ||||||
|  |                 var result = await this.questionsProvider.PostQuestionsAsync(questions); | ||||||
|  |                 if (result.IsSuccess) | ||||||
|  |                 { | ||||||
|  |                     return Ok(result.Question); | ||||||
|  |                 } | ||||||
|  |                 if (result.ErrorMessage == "Not Found") | ||||||
|  |                     return NotFound(result.ErrorMessage); | ||||||
|  |  | ||||||
|  |                 return BadRequest(result.ErrorMessage); | ||||||
|  |             } | ||||||
|  |             return CreatedAtRoute("DefaultApi",questions); | ||||||
|  |         } | ||||||
|  |         /// <summary> | ||||||
|  |         /// PUT request for update a multiple question (multilingual) for survey. | ||||||
|  |         /// </summary> | ||||||
|  |         [HttpPut("questions/multiple/{surveyid}")] | ||||||
|  |         public async Task<IActionResult> CreateQuestions(int surveyid, List<Models.Question> questions) | ||||||
|  |         { | ||||||
|  |             if (questions != null) | ||||||
|  |             { | ||||||
|  |                 var result = await this.questionsProvider.PutQuestionsAsync(surveyid,questions); | ||||||
|  |                 if (result.IsSuccess) | ||||||
|  |                 { | ||||||
|  |                     return Ok(result.Question); | ||||||
|  |                 } | ||||||
|  |                 if (result.ErrorMessage == "Not Found") | ||||||
|  |                     return NotFound(result.ErrorMessage); | ||||||
|  |  | ||||||
|  |                 return BadRequest(result.ErrorMessage); | ||||||
|  |             } | ||||||
|  |             return CreatedAtRoute("DefaultApi", questions); | ||||||
|  |         } | ||||||
|  |         /// <summary> | ||||||
|         /// POST request for creating a new question (multilingual). |         /// POST request for creating a new question (multilingual). | ||||||
|         /// </summary> |         /// </summary> | ||||||
|  |  | ||||||
|  | |||||||
| @ -11,6 +11,17 @@ | |||||||
|  |  | ||||||
|   <ItemGroup> |   <ItemGroup> | ||||||
|     <PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="12.0.1" /> |     <PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="12.0.1" /> | ||||||
|  |     <PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.9" /> | ||||||
|  |     <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="7.0.9"> | ||||||
|  |       <PrivateAssets>all</PrivateAssets> | ||||||
|  |       <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> | ||||||
|  |     </PackageReference> | ||||||
|  |     <PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="7.0.9" /> | ||||||
|  |     <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="7.0.9" /> | ||||||
|  |     <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="7.0.9"> | ||||||
|  |       <PrivateAssets>all</PrivateAssets> | ||||||
|  |       <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> | ||||||
|  |     </PackageReference> | ||||||
|     <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.21" /> |     <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.21" /> | ||||||
|     <PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.5" /> |     <PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.5" /> | ||||||
|     <PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="7.0.5" /> |     <PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="7.0.5" /> | ||||||
|  | |||||||
| @ -3,6 +3,7 @@ using System.ComponentModel.DataAnnotations; | |||||||
|  |  | ||||||
| namespace DamageAssesment.Api.Questions.Db | namespace DamageAssesment.Api.Questions.Db | ||||||
| { | { | ||||||
|  |     [Table("QuestionCategoryTrans")] | ||||||
|     public class CategoryTranslation |     public class CategoryTranslation | ||||||
|     { |     { | ||||||
|         [Key] |         [Key] | ||||||
|  | |||||||
| @ -3,6 +3,7 @@ using System.ComponentModel.DataAnnotations.Schema; | |||||||
|  |  | ||||||
| namespace DamageAssesment.Api.Questions.Db | namespace DamageAssesment.Api.Questions.Db | ||||||
| { | { | ||||||
|  |     [Table("Questions")] | ||||||
|     public class Question |     public class Question | ||||||
|     { |     { | ||||||
|         [Key] |         [Key] | ||||||
|  | |||||||
| @ -1,8 +1,10 @@ | |||||||
| using System.Buffers.Text; | using System.Buffers.Text; | ||||||
| using System.ComponentModel.DataAnnotations; | using System.ComponentModel.DataAnnotations; | ||||||
|  | using System.ComponentModel.DataAnnotations.Schema; | ||||||
|  |  | ||||||
| namespace DamageAssesment.Api.Questions.Db | namespace DamageAssesment.Api.Questions.Db | ||||||
| { | { | ||||||
|  |     [Table("QuestionCategories")] | ||||||
|     public class QuestionCategory |     public class QuestionCategory | ||||||
|     { |     { | ||||||
|         [Key] |         [Key] | ||||||
|  | |||||||
| @ -6,6 +6,16 @@ namespace DamageAssesment.Api.Questions.Db | |||||||
| { | { | ||||||
|     public class QuestionDbContext : DbContext |     public class QuestionDbContext : DbContext | ||||||
|     { |     { | ||||||
|  |         private IConfiguration _Configuration { get; set; } | ||||||
|  |         public QuestionDbContext(DbContextOptions options, IConfiguration configuration) : base(options) | ||||||
|  |         { | ||||||
|  |             _Configuration = configuration; | ||||||
|  |         } | ||||||
|  |         protected override void OnConfiguring(DbContextOptionsBuilder options) | ||||||
|  |         { | ||||||
|  |             // connect to sql server with connection string from app settings | ||||||
|  |             options.UseSqlServer(_Configuration.GetConnectionString("QuestionConnection")); | ||||||
|  |         } | ||||||
|         public DbSet<Db.Question> Questions { get; set; } |         public DbSet<Db.Question> Questions { get; set; } | ||||||
|         public DbSet<Db.QuestionType> QuestionTypes { get; set; } |         public DbSet<Db.QuestionType> QuestionTypes { get; set; } | ||||||
|         public DbSet<Db.QuestionsTranslation> QuestionsTranslations { get; set; } |         public DbSet<Db.QuestionsTranslation> QuestionsTranslations { get; set; } | ||||||
|  | |||||||
| @ -1,7 +1,9 @@ | |||||||
| using System.ComponentModel.DataAnnotations; | using System.ComponentModel.DataAnnotations; | ||||||
|  | using System.ComponentModel.DataAnnotations.Schema; | ||||||
|  |  | ||||||
| namespace DamageAssesment.Api.Questions.Db | namespace DamageAssesment.Api.Questions.Db | ||||||
| { | { | ||||||
|  |     [Table("QuestionTypes")] | ||||||
|     public class QuestionType |     public class QuestionType | ||||||
|     { |     { | ||||||
|         [Key] |         [Key] | ||||||
|  | |||||||
| @ -3,6 +3,7 @@ using System.ComponentModel.DataAnnotations.Schema; | |||||||
|  |  | ||||||
| namespace DamageAssesment.Api.Questions.Db | namespace DamageAssesment.Api.Questions.Db | ||||||
| { | { | ||||||
|  |     [Table("QuestionTrans")] | ||||||
|     public class QuestionsTranslation |     public class QuestionsTranslation | ||||||
|     { |     { | ||||||
|         [Key] |         [Key] | ||||||
|  | |||||||
| @ -8,6 +8,8 @@ namespace DamageAssesment.Api.Questions.Interfaces | |||||||
|         Task<(bool IsSuccess, IEnumerable<Models.MultiLanguage> Questions, string ErrorMessage)> GetQuestionsAsync(string language); |         Task<(bool IsSuccess, IEnumerable<Models.MultiLanguage> Questions, string ErrorMessage)> GetQuestionsAsync(string language); | ||||||
|         Task<(bool IsSuccess, List<SurveyQuestions> SurveyQuestions, string ErrorMessage)> GetSurveyQuestionAsync(int surveyId,string language); |         Task<(bool IsSuccess, List<SurveyQuestions> SurveyQuestions, string ErrorMessage)> GetSurveyQuestionAsync(int surveyId,string language); | ||||||
|         Task<(bool IsSuccess, Models.MultiLanguage Question, string ErrorMessage)> PostQuestionAsync(Models.Question Question); |         Task<(bool IsSuccess, Models.MultiLanguage Question, string ErrorMessage)> PostQuestionAsync(Models.Question Question); | ||||||
|  |         Task<(bool IsSuccess, IEnumerable<Models.MultiLanguage> Question, string ErrorMessage)> PostQuestionsAsync(List<Models.Question> Questions); | ||||||
|  |         Task<(bool IsSuccess, IEnumerable<Models.MultiLanguage> Question, string ErrorMessage)> PutQuestionsAsync(int surveyId,List<Models.Question> Questions); | ||||||
|         Task<(bool IsSuccess, Models.MultiLanguage Question, string ErrorMessage)> UpdateQuestionAsync(Models.Question Question); |         Task<(bool IsSuccess, Models.MultiLanguage Question, string ErrorMessage)> UpdateQuestionAsync(Models.Question Question); | ||||||
|         Task<(bool IsSuccess, Models.MultiLanguage Question, string ErrorMessage)> DeleteQuestionAsync(int id); |         Task<(bool IsSuccess, Models.MultiLanguage Question, string ErrorMessage)> DeleteQuestionAsync(int id); | ||||||
|  |  | ||||||
|  | |||||||
| @ -5,6 +5,7 @@ | |||||||
|         public int CategoryId { get; set; } |         public int CategoryId { get; set; } | ||||||
|         public string IconName { get; set; } |         public string IconName { get; set; } | ||||||
|         public string IconLibrary { get; set; } |         public string IconLibrary { get; set; } | ||||||
|  |         public object CategoryNames { get; set; } | ||||||
|         public List<MultiLanguage> QuestionsText { get; set; } |         public List<MultiLanguage> QuestionsText { get; set; } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -15,8 +15,14 @@ builder.Services.AddControllers(); | |||||||
| builder.Services.AddScoped<IQuestionsProvider, QuestionsProvider>(); | builder.Services.AddScoped<IQuestionsProvider, QuestionsProvider>(); | ||||||
| builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies()); | builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies()); | ||||||
|  |  | ||||||
|  | // CORS setup to allow requests from any origin. | ||||||
|  | builder.Services.AddCors(p => p.AddPolicy("DamageAppCorsPolicy", build => { | ||||||
|  |     build.WithOrigins("*").AllowAnyMethod().AllowAnyHeader().AllowAnyOrigin(); | ||||||
|  | })); | ||||||
|  |  | ||||||
|  | // Add controller services and API Explorer for endpoint discovery. | ||||||
| builder.Services.AddEndpointsApiExplorer(); | builder.Services.AddEndpointsApiExplorer(); | ||||||
| //builder.Services.AddSwaggerGen(); | // Add Swagger/OpenAPI documentation support. | ||||||
| builder.Services.AddSwaggerGen(c => | builder.Services.AddSwaggerGen(c => | ||||||
| { | { | ||||||
|     // Include XML comments from your assembly |     // Include XML comments from your assembly | ||||||
| @ -26,8 +32,11 @@ builder.Services.AddSwaggerGen(c => | |||||||
| }); | }); | ||||||
| builder.Services.AddDbContext<QuestionDbContext>(option => | builder.Services.AddDbContext<QuestionDbContext>(option => | ||||||
| { | { | ||||||
|     option.UseInMemoryDatabase("Questions"); |     option.UseSqlServer("QuestionConnection"); | ||||||
| }); | }); | ||||||
|  | builder.Services.AddCors(p => p.AddPolicy("DamageAppCorsPolicy", build => { | ||||||
|  |     build.WithOrigins("*").AllowAnyMethod().AllowAnyHeader().AllowAnyOrigin(); | ||||||
|  | })); | ||||||
| var app = builder.Build(); | var app = builder.Build(); | ||||||
|  |  | ||||||
| // Configure the HTTP request pipeline. | // Configure the HTTP request pipeline. | ||||||
| @ -44,6 +53,9 @@ if (app.Environment.IsDevelopment()) | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | // Enable CORS, authentication, and authorization middleware. | ||||||
|  | app.UseCors("DamageAppCorsPolicy"); | ||||||
| app.UseAuthorization(); | app.UseAuthorization(); | ||||||
|  |  | ||||||
| app.MapControllers(); | app.MapControllers(); | ||||||
|  | |||||||
| @ -31,8 +31,7 @@ namespace DamageAssesment.Api.Questions.Providers | |||||||
|                 questionDbContext.QuestionTypes.Add(new Db.QuestionType() { TypeText = "TextBox" }); |                 questionDbContext.QuestionTypes.Add(new Db.QuestionType() { TypeText = "TextBox" }); | ||||||
|                 questionDbContext.SaveChanges(); |                 questionDbContext.SaveChanges(); | ||||||
|             } |             } | ||||||
|  |             if (!questionDbContext.QuestionsTranslations.Any()) | ||||||
|             if (!questionDbContext.QuestionCategories.Any()) |  | ||||||
|             { |             { | ||||||
|                 questionDbContext.QuestionCategories.Add(new Db.QuestionCategory() { IconName = "Flooding", IconLibrary = "https://example.com/images/img1.png" }); |                 questionDbContext.QuestionCategories.Add(new Db.QuestionCategory() { IconName = "Flooding", IconLibrary = "https://example.com/images/img1.png" }); | ||||||
|                 questionDbContext.QuestionCategories.Add(new Db.QuestionCategory() { IconName = "Electrical", IconLibrary = "https://example.com/images/img2.png" }); |                 questionDbContext.QuestionCategories.Add(new Db.QuestionCategory() { IconName = "Electrical", IconLibrary = "https://example.com/images/img2.png" }); | ||||||
| @ -65,14 +64,51 @@ namespace DamageAssesment.Api.Questions.Providers | |||||||
|             if (!questionDbContext.Questions.Any()) |             if (!questionDbContext.Questions.Any()) | ||||||
|             { |             { | ||||||
|                 var question1 = new Db.Question() { QuestionTypeId = 1, SurveyId = 1, QuestionNumber = 1, IsRequired = true, Comment = false, Key = true, CategoryId = 1 }; |                 var question1 = new Db.Question() { QuestionTypeId = 1, SurveyId = 1, QuestionNumber = 1, IsRequired = true, Comment = false, Key = true, CategoryId = 1 }; | ||||||
|                 var question2 = new Db.Question() { QuestionTypeId = 1, SurveyId = 1, QuestionNumber = 2, IsRequired = false, Comment = true, Key = false, CategoryId = 1 }; |                 var question2 = new Db.Question() { QuestionTypeId = 1, SurveyId = 1, QuestionNumber = 2, IsRequired = false, Comment = true, Key = false, CategoryId = 2 }; | ||||||
|                 var question3 = new Db.Question() { QuestionTypeId = 1, SurveyId = 2, QuestionNumber = 1, IsRequired = true, Comment = false, Key = true, CategoryId = 1 }; |                 var question3 = new Db.Question() { QuestionTypeId = 1, SurveyId = 2, QuestionNumber = 1, IsRequired = true, Comment = false, Key = true, CategoryId = 1 }; | ||||||
|                 var question4 = new Db.Question() { QuestionTypeId = 1, SurveyId = 2, QuestionNumber = 2, IsRequired = false, Comment = true, Key = false, CategoryId = 1 }; |                 var question4 = new Db.Question() { QuestionTypeId = 1, SurveyId = 2, QuestionNumber = 2, IsRequired = false, Comment = true, Key = false, CategoryId = 2 }; | ||||||
|  |                 var question5 = new Db.Question() { QuestionTypeId = 1, SurveyId = 3, QuestionNumber = 1, IsRequired = true, Comment = false, Key = true, CategoryId = 1 }; | ||||||
|  |                 var question6 = new Db.Question() { QuestionTypeId = 1, SurveyId = 3, QuestionNumber = 2, IsRequired = false, Comment = true, Key = false, CategoryId = 2 }; | ||||||
|  |                 var question7 = new Db.Question() { QuestionTypeId = 1, SurveyId = 3, QuestionNumber = 1, IsRequired = true, Comment = false, Key = true, CategoryId = 3}; | ||||||
|  |                 var question8 = new Db.Question() { QuestionTypeId = 1, SurveyId = 3, QuestionNumber = 2, IsRequired = false, Comment = true, Key = false, CategoryId = 4 }; | ||||||
|  |                 var question9 = new Db.Question() { QuestionTypeId = 1, SurveyId = 3, QuestionNumber = 1, IsRequired = true, Comment = true, Key = true, CategoryId = 5 }; | ||||||
|  |                 var question10 = new Db.Question() { QuestionTypeId = 1, SurveyId = 3, QuestionNumber = 2, IsRequired = false, Comment = false, Key = true, CategoryId = 1 }; | ||||||
|  |                 var question11 = new Db.Question() { QuestionTypeId = 1, SurveyId = 3, QuestionNumber = 1, IsRequired = true, Comment = false, Key = false, CategoryId = 2 }; | ||||||
|  |                 var question12 = new Db.Question() { QuestionTypeId = 1, SurveyId = 3, QuestionNumber = 2, IsRequired = false, Comment = true, Key = true, CategoryId = 3 }; | ||||||
|  |                 var question13 = new Db.Question() { QuestionTypeId = 1, SurveyId = 3, QuestionNumber = 1, IsRequired = true, Comment = false, Key = true, CategoryId = 4 }; | ||||||
|  |                 var question14 = new Db.Question() { QuestionTypeId = 1, SurveyId = 3, QuestionNumber = 2, IsRequired = false, Comment = true, Key = false, CategoryId = 5 }; | ||||||
|  |                 var question15 = new Db.Question() { QuestionTypeId = 1, SurveyId = 3, QuestionNumber = 1, IsRequired = true, Comment = false, Key = false, CategoryId = 1 }; | ||||||
|  |                 var question16 = new Db.Question() { QuestionTypeId = 1, SurveyId = 3, QuestionNumber = 2, IsRequired = false, Comment = true, Key = true, CategoryId = 2 }; | ||||||
|  |                 var question17 = new Db.Question() { QuestionTypeId = 1, SurveyId = 3, QuestionNumber = 1, IsRequired = true, Comment = false, Key = false, CategoryId = 3 }; | ||||||
|  |                 var question18 = new Db.Question() { QuestionTypeId = 1, SurveyId = 3, QuestionNumber = 2, IsRequired = false, Comment = true, Key = false, CategoryId = 4 }; | ||||||
|  |                 var question19 = new Db.Question() { QuestionTypeId = 1, SurveyId = 3, QuestionNumber = 1, IsRequired = true, Comment = false, Key = true, CategoryId = 5 }; | ||||||
|  |                 var question20 = new Db.Question() { QuestionTypeId = 1, SurveyId = 3, QuestionNumber = 2, IsRequired = false, Comment = true, Key = false, CategoryId = 1 }; | ||||||
|  |                 var question21 = new Db.Question() { QuestionTypeId = 1, SurveyId = 3, QuestionNumber = 1, IsRequired = true, Comment = false, Key = true, CategoryId = 2 }; | ||||||
|  |                 var question22 = new Db.Question() { QuestionTypeId = 1, SurveyId = 3, QuestionNumber = 2, IsRequired = false, Comment = true, Key = true, CategoryId = 3 }; | ||||||
|  |  | ||||||
|                 questionDbContext.Questions.Add(question1); |                 questionDbContext.Questions.Add(question1); | ||||||
|                 questionDbContext.Questions.Add(question2); |                 questionDbContext.Questions.Add(question2); | ||||||
|                 questionDbContext.Questions.Add(question3); |                 questionDbContext.Questions.Add(question3); | ||||||
|                 questionDbContext.Questions.Add(question4); |                 questionDbContext.Questions.Add(question4); | ||||||
|  |                 questionDbContext.Questions.Add(question5); | ||||||
|  |                 questionDbContext.Questions.Add(question6); | ||||||
|  |                 questionDbContext.Questions.Add(question7); | ||||||
|  |                 questionDbContext.Questions.Add(question8); | ||||||
|  |                 questionDbContext.Questions.Add(question9); | ||||||
|  |                 questionDbContext.Questions.Add(question10); | ||||||
|  |                 questionDbContext.Questions.Add(question11); | ||||||
|  |                 questionDbContext.Questions.Add(question12); | ||||||
|  |                 questionDbContext.Questions.Add(question13); | ||||||
|  |                 questionDbContext.Questions.Add(question14); | ||||||
|  |                 questionDbContext.Questions.Add(question15); | ||||||
|  |                 questionDbContext.Questions.Add(question16); | ||||||
|  |                 questionDbContext.Questions.Add(question17); | ||||||
|  |                 questionDbContext.Questions.Add(question18); | ||||||
|  |                 questionDbContext.Questions.Add(question19); | ||||||
|  |                 questionDbContext.Questions.Add(question20); | ||||||
|  |                 questionDbContext.Questions.Add(question21); | ||||||
|  |                 questionDbContext.Questions.Add(question22); | ||||||
|  |  | ||||||
|                 questionDbContext.SaveChanges(); |                 questionDbContext.SaveChanges(); | ||||||
|             } |             } | ||||||
|  |  | ||||||
| @ -90,6 +126,64 @@ namespace DamageAssesment.Api.Questions.Providers | |||||||
|                 questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 4, QuestionText = "Are the grounds flooded ?", Language = "en" }); |                 questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 4, QuestionText = "Are the grounds flooded ?", Language = "en" }); | ||||||
|                 questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 4, QuestionText = "Les terrains sont-ils inondés ?", Language = "fr" }); |                 questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 4, QuestionText = "Les terrains sont-ils inondés ?", Language = "fr" }); | ||||||
|                 questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 4, QuestionText = "¿Están inundados los terrenos?", Language = "es" }); |                 questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 4, QuestionText = "¿Están inundados los terrenos?", Language = "es" }); | ||||||
|  |  | ||||||
|  |                 questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 5, QuestionText = "Can you open?", Language = "en" }); | ||||||
|  |                 questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 6, QuestionText = "Is debris blocking access?", Language = "en" }); | ||||||
|  |                 questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 7, QuestionText = "Are the grounds flooded?", Language = "en" }); | ||||||
|  |                 questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 8, QuestionText = "Is the access blocked by flooding?", Language = "en" }); | ||||||
|  |                 questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 9, QuestionText = "Are any utility wires down?", Language = "en" }); | ||||||
|  |                 questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 10, QuestionText = "Do you have damage to windows, doors, or walls?", Language = "en" }); | ||||||
|  |                 questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 11, QuestionText = "Do you have roof damage?", Language = "en" }); | ||||||
|  |                 questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 12, QuestionText = "Do you have major water intrusion?", Language = "en" }); | ||||||
|  |                 questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 13, QuestionText = "Are any portable classrooms damaged and unusable?", Language = "en" }); | ||||||
|  |                 questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 14, QuestionText = "Does your facility need to be secured/boarded?", Language = "en" }); | ||||||
|  |                 questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 15, QuestionText = "Are you without commercial power?", Language = "en" }); | ||||||
|  |                 questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 16, QuestionText = "Are you without water pressure?", Language = "en" }); | ||||||
|  |                 questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 17, QuestionText = "Are you without telephones?", Language = "en" }); | ||||||
|  |                 questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 18, QuestionText = "Are traffic signals damaged/missing?", Language = "en" }); | ||||||
|  |                 questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 19, QuestionText = "Are you without an operable fire alarm?", Language = "en" }); | ||||||
|  |                 questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 20, QuestionText = "Are you without an operable public address?", Language = "en" }); | ||||||
|  |                 questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 21, QuestionText = "Do you have major debris?", Language = "en" }); | ||||||
|  |                 questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 22, QuestionText = "Are there any problems or issues not addressed above that would impede you from opening? If yes, please explain below?", Language = "en" }); | ||||||
|  |  | ||||||
|  |                 questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 5, QuestionText = "Pouvez-vous ouvrir ?", Language = "fr" }); | ||||||
|  |                 questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 6, QuestionText = "Est-ce que des débris bloquent l'accès ?", Language = "fr" }); | ||||||
|  |                 questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 7, QuestionText = "Les terrains sont-ils inondés ?", Language = "fr" }); | ||||||
|  |                 questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 8, QuestionText = "L'accès est-il bloqué par des inondations ?", Language = "fr" }); | ||||||
|  |                 questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 9, QuestionText = "Des câbles d'utilité sont-ils tombés ?", Language = "fr" }); | ||||||
|  |                 questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 10, QuestionText = "Avez-vous des dommages aux fenêtres, portes ou murs ?", Language = "fr" }); | ||||||
|  |                 questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 11, QuestionText = "Avez-vous des dommages au toit ?", Language = "fr" }); | ||||||
|  |                 questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 12, QuestionText = "Avez-vous une intrusion d'eau majeure ?", Language = "fr" }); | ||||||
|  |                 questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 13, QuestionText = "Les salles de classe portables sont-elles endommagées et inutilisables ?", Language = "fr" }); | ||||||
|  |                 questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 14, QuestionText = "Votre établissement a-t-il besoin d'être sécurisé/protégé ?", Language = "fr" }); | ||||||
|  |                 questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 15, QuestionText = "Êtes-vous sans alimentation électrique commerciale ?", Language = "fr" }); | ||||||
|  |                 questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 16, QuestionText = "Êtes-vous sans pression d'eau ?", Language = "fr" }); | ||||||
|  |                 questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 17, QuestionText = "Êtes-vous sans téléphones ?", Language = "fr" }); | ||||||
|  |                 questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 18, QuestionText = "Les feux de circulation sont-ils endommagés/absents ?", Language = "fr" }); | ||||||
|  |                 questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 19, QuestionText = "N'avez-vous pas d'alarme incendie fonctionnelle ?", Language = "fr" }); | ||||||
|  |                 questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 20, QuestionText = "N'avez-vous pas de système de sonorisation opérationnel ?", Language = "fr" }); | ||||||
|  |                 questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 21, QuestionText = "Avez-vous une grande quantité de débris ?", Language = "fr" }); | ||||||
|  |                 questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 22, QuestionText = "Y a-t-il des problèmes ou des problèmes non abordés ci-dessus qui vous empêcheraient d'ouvrir ? Si oui, veuillez expliquer ci-dessous.", Language = "fr" }); | ||||||
|  |  | ||||||
|  |                 questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 5, QuestionText = "¿Puedes abrir ?", Language = "es" }); | ||||||
|  |                 questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 6, QuestionText = "¿Los escombros bloquean el acceso?", Language = "es" }); | ||||||
|  |                 questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 7, QuestionText = "¿Están inundados los terrenos?", Language = "es" }); | ||||||
|  |                 questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 8, QuestionText = "¿El acceso está bloqueado por inundaciones?", Language = "es" }); | ||||||
|  |                 questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 9, QuestionText = "¿Hay cables de utilidad caídos?", Language = "es" }); | ||||||
|  |                 questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 10, QuestionText = "¿Tienes daños en ventanas, puertas o paredes?", Language = "es" }); | ||||||
|  |                 questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 11, QuestionText = "¿Tienes daños en el techo?", Language = "es" }); | ||||||
|  |                 questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 12, QuestionText = "¿Tienes una gran intrusión de agua?", Language = "es" }); | ||||||
|  |                 questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 13, QuestionText = "¿Hay aulas portátiles dañadas e inutilizables?", Language = "es" }); | ||||||
|  |                 questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 14, QuestionText = "¿Tu instalación necesita ser asegurada/tabicada?", Language = "es" }); | ||||||
|  |                 questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 15, QuestionText = "¿No tienes energía comercial?", Language = "es" }); | ||||||
|  |                 questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 16, QuestionText = "¿No tienes presión de agua?", Language = "es" }); | ||||||
|  |                 questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 17, QuestionText = "¿No tienes teléfonos?", Language = "es" }); | ||||||
|  |                 questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 18, QuestionText = "¿Los semáforos están dañados/faltan?", Language = "es" }); | ||||||
|  |                 questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 19, QuestionText = "¿No tienes una alarma de incendios operativa?", Language = "es" }); | ||||||
|  |                 questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 20, QuestionText = "¿No tienes un sistema de megafonía operativo?", Language = "es" }); | ||||||
|  |                 questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 21, QuestionText = "¿Tienes una gran cantidad de escombros?", Language = "es" }); | ||||||
|  |                 questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { QuestionId = 22, QuestionText = "¿Hay algún problema o asunto no abordado anteriormente que le impida abrir? Si es así, por favor explíquelo a continuación.", Language = "es" }); | ||||||
|  |  | ||||||
|                 questionDbContext.SaveChanges(); |                 questionDbContext.SaveChanges(); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| @ -219,6 +313,7 @@ namespace DamageAssesment.Api.Questions.Providers | |||||||
|                             CategoryId = item.Id, |                             CategoryId = item.Id, | ||||||
|                             IconLibrary = item.IconLibrary, |                             IconLibrary = item.IconLibrary, | ||||||
|                             IconName = item.IconName, |                             IconName = item.IconName, | ||||||
|  |                             CategoryNames= CreateCategoryMultiLanguageObject(GetCategoryTranslations(item.Id, language)), | ||||||
|                             QuestionsText = GetSurveyQuestion(mapper.Map<List<Db.Question>, List<Models.MultiLanguage>>(questions.Where(a => a.CategoryId == item.Id).ToList()), language) |                             QuestionsText = GetSurveyQuestion(mapper.Map<List<Db.Question>, List<Models.MultiLanguage>>(questions.Where(a => a.CategoryId == item.Id).ToList()), language) | ||||||
|                         }); |                         }); | ||||||
|                     } |                     } | ||||||
| @ -239,17 +334,71 @@ namespace DamageAssesment.Api.Questions.Providers | |||||||
|             try |             try | ||||||
|             { |             { | ||||||
|                 logger?.LogInformation("Query Question"); |                 logger?.LogInformation("Query Question"); | ||||||
|  |                 var result = InsertQuestion(Question); | ||||||
|  |                 return (true, result, null); | ||||||
|  |             } | ||||||
|  |             catch (Exception ex) | ||||||
|  |             { | ||||||
|  |                 logger?.LogError(ex.ToString()); | ||||||
|  |                 return (false, null, ex.Message); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         private Models.MultiLanguage InsertQuestion(Models.Question Question) | ||||||
|  |         { | ||||||
|             var dbquestion = mapper.Map<Models.Question, Db.Question>(Question); |             var dbquestion = mapper.Map<Models.Question, Db.Question>(Question); | ||||||
|             var dbquestiontranslation = mapper.Map<List<Models.QuestionsTranslation>, List<Db.QuestionsTranslation>>(Question.Questions); |             var dbquestiontranslation = mapper.Map<List<Models.QuestionsTranslation>, List<Db.QuestionsTranslation>>(Question.Questions); | ||||||
|             dbquestion.QuestionTypeId = questionDbContext.QuestionTypes.Where(a => a.TypeText == Question.TypeText).Select(a => a.Id).FirstOrDefault(); |             dbquestion.QuestionTypeId = questionDbContext.QuestionTypes.Where(a => a.TypeText == Question.TypeText).Select(a => a.Id).FirstOrDefault(); | ||||||
|             questionDbContext.Questions.Add(dbquestion); |             questionDbContext.Questions.Add(dbquestion); | ||||||
|  |             questionDbContext.SaveChanges(); | ||||||
|             dbquestiontranslation.ForEach(i => i.QuestionId = dbquestion.Id); |             dbquestiontranslation.ForEach(i => i.QuestionId = dbquestion.Id); | ||||||
|             questionDbContext.QuestionsTranslations.AddRange(dbquestiontranslation); |             questionDbContext.QuestionsTranslations.AddRange(dbquestiontranslation); | ||||||
|             questionDbContext.SaveChanges(); |             questionDbContext.SaveChanges(); | ||||||
|             Question.Id = dbquestion.Id; |             Question.Id = dbquestion.Id; | ||||||
|             var result = mapper.Map<Db.Question, Models.MultiLanguage>(dbquestion); |             var result = mapper.Map<Db.Question, Models.MultiLanguage>(dbquestion); | ||||||
|             result.Text = CreateMultiLanguageObject(GetQuestionsTranslations(result.Id, "")); |             result.Text = CreateMultiLanguageObject(GetQuestionsTranslations(result.Id, "")); | ||||||
|                 return (true, result, null); |             return result; | ||||||
|  |         } | ||||||
|  |         public async Task<(bool IsSuccess, IEnumerable<Models.MultiLanguage> Question, string ErrorMessage)> PostQuestionsAsync(List<Models.Question> Questions) | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 List<Models.MultiLanguage> results = new List<MultiLanguage>(); | ||||||
|  |                logger?.LogInformation("Query Question"); | ||||||
|  |                 foreach (Models.Question Question in Questions) | ||||||
|  |                 { | ||||||
|  |                     results.Add(InsertQuestion(Question)); | ||||||
|  |                 } | ||||||
|  |                 return (true, results, null); | ||||||
|  |             } | ||||||
|  |             catch (Exception ex) | ||||||
|  |             { | ||||||
|  |                 logger?.LogError(ex.ToString()); | ||||||
|  |                 return (false, null, ex.Message); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |        | ||||||
|  |         public async Task<(bool IsSuccess, IEnumerable<Models.MultiLanguage> Question, string ErrorMessage)> PutQuestionsAsync(int surveyId, List<Models.Question> Questions) | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 var questions=await questionDbContext.Questions.AsNoTracking().Where(a=>a.SurveyId == surveyId).ToListAsync(); | ||||||
|  |                 if (questions != null) | ||||||
|  |                 { | ||||||
|  |                     List<int> questionids=questions.Select(a=>a.Id).ToList(); | ||||||
|  |                     var questiontrans = await questionDbContext.QuestionsTranslations.AsNoTracking().Where(x => questionids.Contains(x.QuestionId)).ToListAsync(); | ||||||
|  |                     if (questiontrans != null) | ||||||
|  |                         questionDbContext.QuestionsTranslations.RemoveRange(questiontrans); | ||||||
|  |                     questionDbContext.Questions.RemoveRange(questions); | ||||||
|  |                     questionDbContext.SaveChanges(); | ||||||
|  |                 } | ||||||
|  |                 List<Models.MultiLanguage> results = new List<MultiLanguage>(); | ||||||
|  |                 logger?.LogInformation("Query Question"); | ||||||
|  |                 foreach (Models.Question Question in Questions) | ||||||
|  |                 { | ||||||
|  |                     Question.SurveyId = surveyId; | ||||||
|  |                     results.Add(InsertQuestion(Question)); | ||||||
|  |                 } | ||||||
|  |                 return (true, results, null); | ||||||
|             } |             } | ||||||
|             catch (Exception ex) |             catch (Exception ex) | ||||||
|             { |             { | ||||||
| @ -290,8 +439,11 @@ namespace DamageAssesment.Api.Questions.Providers | |||||||
|  |  | ||||||
|                 if (question != null) |                 if (question != null) | ||||||
|                 { |                 { | ||||||
|  |                     var questiontrans=await questionDbContext.QuestionsTranslations.AsNoTracking().Where(x=>x.QuestionId== id).ToListAsync(); | ||||||
|                     var result = mapper.Map<Db.Question, Models.MultiLanguage>(question); |                     var result = mapper.Map<Db.Question, Models.MultiLanguage>(question); | ||||||
|                     result.Text = CreateMultiLanguageObject(GetQuestionsTranslations(result.Id, "")); |                     result.Text = CreateMultiLanguageObject(GetQuestionsTranslations(result.Id, "")); | ||||||
|  |                     if(questiontrans!=null) | ||||||
|  |                         questionDbContext.QuestionsTranslations.RemoveRange(questiontrans); | ||||||
|                     questionDbContext.Questions.Remove(question); |                     questionDbContext.Questions.Remove(question); | ||||||
|                     questionDbContext.SaveChanges(); |                     questionDbContext.SaveChanges(); | ||||||
|                     return (true, result, $"QuestionID {id} deleted Successfuly"); |                     return (true, result, $"QuestionID {id} deleted Successfuly"); | ||||||
|  | |||||||
| @ -1,8 +0,0 @@ | |||||||
| { |  | ||||||
|   "Logging": { |  | ||||||
|     "LogLevel": { |  | ||||||
|       "Default": "Information", |  | ||||||
|       "Microsoft.AspNetCore": "Warning" |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
| } |  | ||||||
| @ -8,5 +8,11 @@ | |||||||
|       "Microsoft.AspNetCore": "Warning" |       "Microsoft.AspNetCore": "Warning" | ||||||
|     } |     } | ||||||
|   }, |   }, | ||||||
|   "AllowedHosts": "*" |   "AllowedHosts": "*", | ||||||
|  |   "ConnectionStrings": { | ||||||
|  |     //"QuestionConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;" | ||||||
|  |     // "QuestionConnection": "Server=localhost,1433;Database=da_survey_dev;User Id=sa;Password=Password123;TrustServerCertificate=True;" | ||||||
|  |     "QuestionConnection": "Server=207.180.248.35;Database=da_survey_dev;User Id=sa;Password=YourStrongPassw0rd;TrustServerCertificate=True;" | ||||||
|  |  | ||||||
|  |   } | ||||||
| } | } | ||||||
|  | |||||||
| @ -10,7 +10,7 @@ | |||||||
|   </PropertyGroup> |   </PropertyGroup> | ||||||
|  |  | ||||||
|   <ItemGroup> |   <ItemGroup> | ||||||
|     <PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.5" /> |     <PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.9" /> | ||||||
|     <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.5.0" /> |     <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.5.0" /> | ||||||
|     <PackageReference Include="Moq" Version="4.18.4" /> |     <PackageReference Include="Moq" Version="4.18.4" /> | ||||||
|     <PackageReference Include="xunit" Version="2.4.2" /> |     <PackageReference Include="xunit" Version="2.4.2" /> | ||||||
|  | |||||||
| @ -75,8 +75,19 @@ namespace DamageAssesment.Api.Questions.Test | |||||||
|             return new Questions.Models.Question { Id = 1, Questions=QuestionsTranslations, TypeText = "Text 1", SurveyId = 1, QuestionNumber = 1, IsRequired = true, Comment = false, Key = true, CategoryId=1}; |             return new Questions.Models.Question { Id = 1, Questions=QuestionsTranslations, TypeText = "Text 1", SurveyId = 1, QuestionNumber = 1, IsRequired = true, Comment = false, Key = true, CategoryId=1}; | ||||||
|  |  | ||||||
|         } |         } | ||||||
|  |         public static async Task<List<Questions.Models.Question>> getInputQuestionsData() | ||||||
|     |         { | ||||||
|  |             Models.QuestionsTranslation QuestionsTranslation = new Models.QuestionsTranslation() | ||||||
|  |             { | ||||||
|  |                 Language = "en", | ||||||
|  |                 QuestionText = "Sample question" | ||||||
|  |             }; | ||||||
|  |             List<Models.QuestionsTranslation> QuestionsTranslations = new List<Models.QuestionsTranslation>(); | ||||||
|  |             List<Models.Question> Questions = new List<Models.Question>(); | ||||||
|  |             QuestionsTranslations.Add(QuestionsTranslation); | ||||||
|  |             Questions.Models.Question question = new Questions.Models.Question() { Id = 1, Questions = QuestionsTranslations, TypeText = "Text 1", SurveyId = 1, QuestionNumber = 1, IsRequired = true, Comment = false, Key = true, CategoryId = 1 }; | ||||||
|  |               Questions.Add(question); | ||||||
|  |             return Questions; | ||||||
|  |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -110,6 +110,33 @@ namespace DamageAssesment.Api.Questions.Test | |||||||
|  |  | ||||||
|             Assert.Equal(400, result.StatusCode); |             Assert.Equal(400, result.StatusCode); | ||||||
|         } |         } | ||||||
|  |         [Fact(DisplayName = "Post Questions - Ok case")] | ||||||
|  |         public async Task PostQuestionsAsync_ShouldReturnStatusCode200() | ||||||
|  |         { | ||||||
|  |             var mockQuestionService = new Mock<IQuestionsProvider>(); | ||||||
|  |             var mockResponse = await MockData.getOkResponse(); | ||||||
|  |             var mockInputQuestion = await MockData.getInputQuestionsData(); | ||||||
|  |             mockQuestionService.Setup(service => service.PostQuestionsAsync(mockInputQuestion)).ReturnsAsync(mockResponse); | ||||||
|  |  | ||||||
|  |             var QuestionProvider = new QuestionsController(mockQuestionService.Object); | ||||||
|  |             var result = (OkObjectResult)await QuestionProvider.CreateQuestions(mockInputQuestion); | ||||||
|  |  | ||||||
|  |             Assert.Equal(200, result.StatusCode); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         [Fact(DisplayName = "Post Questions - BadRequest case")] | ||||||
|  |         public async Task PostQuestionsAsync_ShouldReturnStatusCode400() | ||||||
|  |         { | ||||||
|  |             var mockQuestionService = new Mock<IQuestionsProvider>(); | ||||||
|  |             var mockInputQuestion = await MockData.getInputQuestionData(); | ||||||
|  |             var mockResponse = await MockData.getBadRequestResponse(); | ||||||
|  |             mockQuestionService.Setup(service => service.UpdateQuestionAsync(mockInputQuestion)).ReturnsAsync(mockResponse); | ||||||
|  |  | ||||||
|  |             var QuestionProvider = new QuestionsController(mockQuestionService.Object); | ||||||
|  |             var result = (BadRequestObjectResult)await QuestionProvider.UpdateQuestion(mockInputQuestion); | ||||||
|  |  | ||||||
|  |             Assert.Equal(400, result.StatusCode); | ||||||
|  |         } | ||||||
|  |  | ||||||
|         [Fact(DisplayName = "Put Question - Ok case")] |         [Fact(DisplayName = "Put Question - Ok case")] | ||||||
|         public async Task PutQuestionAsync_ShouldReturnStatusCode200() |         public async Task PutQuestionAsync_ShouldReturnStatusCode200() | ||||||
|  | |||||||
| @ -12,9 +12,11 @@ namespace DamageAssesment.SurveyResponses.Test | |||||||
|     public class SurveyResponsesServiceTest |     public class SurveyResponsesServiceTest | ||||||
|     { |     { | ||||||
|         Mock<ISurveysResponse> mockSurveyResponseService; |         Mock<ISurveysResponse> mockSurveyResponseService; | ||||||
|  |         Mock<IExcelExportService> mockExcelExportService; | ||||||
|         public SurveyResponsesServiceTest() |         public SurveyResponsesServiceTest() | ||||||
|         { |         { | ||||||
|             mockSurveyResponseService = new Mock<ISurveysResponse>(); |             mockSurveyResponseService = new Mock<ISurveysResponse>(); | ||||||
|  |             mockExcelExportService = new Mock<IExcelExportService>(); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         [Fact(DisplayName = "Get Responses - Ok case")] |         [Fact(DisplayName = "Get Responses - Ok case")] | ||||||
| @ -23,7 +25,7 @@ namespace DamageAssesment.SurveyResponses.Test | |||||||
|             SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject(); |             SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject(); | ||||||
|             var mockResponse = await MockData.getOkResponse(mockRequestObject); |             var mockResponse = await MockData.getOkResponse(mockRequestObject); | ||||||
|             mockSurveyResponseService.Setup(service => service.GetSurveyResponsesAsync(1)).ReturnsAsync(mockResponse); |             mockSurveyResponseService.Setup(service => service.GetSurveyResponsesAsync(1)).ReturnsAsync(mockResponse); | ||||||
|             var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object); |             var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object); | ||||||
|             var result = (OkObjectResult)await surveyResponseProvider.GetSurveyResponsesAsync(1); |             var result = (OkObjectResult)await surveyResponseProvider.GetSurveyResponsesAsync(1); | ||||||
|             Assert.Equal(200, result.StatusCode); |             Assert.Equal(200, result.StatusCode); | ||||||
|         } |         } | ||||||
| @ -33,7 +35,7 @@ namespace DamageAssesment.SurveyResponses.Test | |||||||
|         { |         { | ||||||
|             var mockResponse = await MockData.getResponse(); |             var mockResponse = await MockData.getResponse(); | ||||||
|             mockSurveyResponseService.Setup(service => service.GetSurveyResponsesAsync(1)).ReturnsAsync(mockResponse); |             mockSurveyResponseService.Setup(service => service.GetSurveyResponsesAsync(1)).ReturnsAsync(mockResponse); | ||||||
|             var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object); |             var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object); | ||||||
|             var result = (BadRequestObjectResult)await surveyResponseProvider.GetSurveyResponsesAsync(1); |             var result = (BadRequestObjectResult)await surveyResponseProvider.GetSurveyResponsesAsync(1); | ||||||
|             Assert.Equal(400, result.StatusCode); |             Assert.Equal(400, result.StatusCode); | ||||||
|         } |         } | ||||||
| @ -44,7 +46,7 @@ namespace DamageAssesment.SurveyResponses.Test | |||||||
|             SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject(); |             SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject(); | ||||||
|             var mockResponse = await MockData.getOkResponse(); |             var mockResponse = await MockData.getOkResponse(); | ||||||
|             mockSurveyResponseService.Setup(service => service.GetSurveyResponsesBySurveyAsync(1, 1)).ReturnsAsync(mockResponse); |             mockSurveyResponseService.Setup(service => service.GetSurveyResponsesBySurveyAsync(1, 1)).ReturnsAsync(mockResponse); | ||||||
|             var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object); |             var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object); | ||||||
|             var result = (OkObjectResult)await surveyResponseProvider.GetSurveyResponsesAsync(1, 1); |             var result = (OkObjectResult)await surveyResponseProvider.GetSurveyResponsesAsync(1, 1); | ||||||
|             Assert.Equal(200, result.StatusCode); |             Assert.Equal(200, result.StatusCode); | ||||||
|         } |         } | ||||||
| @ -54,7 +56,7 @@ namespace DamageAssesment.SurveyResponses.Test | |||||||
|         { |         { | ||||||
|             var mockResponse = await MockData.getResponse(); |             var mockResponse = await MockData.getResponse(); | ||||||
|             mockSurveyResponseService.Setup(service => service.GetSurveyResponsesBySurveyAsync(1, 1)).ReturnsAsync(mockResponse); |             mockSurveyResponseService.Setup(service => service.GetSurveyResponsesBySurveyAsync(1, 1)).ReturnsAsync(mockResponse); | ||||||
|             var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object); |             var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object); | ||||||
|             var result = (NoContentResult)await surveyResponseProvider.GetSurveyResponsesAsync(1, 1); |             var result = (NoContentResult)await surveyResponseProvider.GetSurveyResponsesAsync(1, 1); | ||||||
|             Assert.Equal(204, result.StatusCode); |             Assert.Equal(204, result.StatusCode); | ||||||
|         } |         } | ||||||
| @ -68,7 +70,7 @@ namespace DamageAssesment.SurveyResponses.Test | |||||||
|             SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject(); |             SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject(); | ||||||
|             var mockResponse = await MockData.getOkResponse(); |             var mockResponse = await MockData.getOkResponse(); | ||||||
|             mockSurveyResponseService.Setup(service => service.GetSurveyResponsesBySurveyAndLocationAsync(1, 1, 1)).ReturnsAsync(mockResponse); |             mockSurveyResponseService.Setup(service => service.GetSurveyResponsesBySurveyAndLocationAsync(1, 1, 1)).ReturnsAsync(mockResponse); | ||||||
|             var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object); |             var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object); | ||||||
|             var result = (OkObjectResult)await surveyResponseProvider.GetSurveyResponsesBySurveyAndLocationAsync(1, 1, 1); |             var result = (OkObjectResult)await surveyResponseProvider.GetSurveyResponsesBySurveyAndLocationAsync(1, 1, 1); | ||||||
|             Assert.Equal(200, result.StatusCode); |             Assert.Equal(200, result.StatusCode); | ||||||
|         } |         } | ||||||
| @ -78,7 +80,7 @@ namespace DamageAssesment.SurveyResponses.Test | |||||||
|         { |         { | ||||||
|             var mockResponse = await MockData.getResponse(); |             var mockResponse = await MockData.getResponse(); | ||||||
|             mockSurveyResponseService.Setup(service => service.GetSurveyResponsesBySurveyAndLocationAsync(1, 1, 1)).ReturnsAsync(mockResponse); |             mockSurveyResponseService.Setup(service => service.GetSurveyResponsesBySurveyAndLocationAsync(1, 1, 1)).ReturnsAsync(mockResponse); | ||||||
|             var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object); |             var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object); | ||||||
|             var result = (NoContentResult)await surveyResponseProvider.GetSurveyResponsesBySurveyAndLocationAsync(1, 1, 1); |             var result = (NoContentResult)await surveyResponseProvider.GetSurveyResponsesBySurveyAndLocationAsync(1, 1, 1); | ||||||
|             Assert.Equal(204, result.StatusCode); |             Assert.Equal(204, result.StatusCode); | ||||||
|         } |         } | ||||||
| @ -89,7 +91,7 @@ namespace DamageAssesment.SurveyResponses.Test | |||||||
|             SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject(); |             SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject(); | ||||||
|             var mockResponse = await MockData.getOkResponse(); |             var mockResponse = await MockData.getOkResponse(); | ||||||
|             mockSurveyResponseService.Setup(service => service.GetResponsesByAnswerAsync(1, 1, "Yes", 1)).ReturnsAsync(mockResponse); |             mockSurveyResponseService.Setup(service => service.GetResponsesByAnswerAsync(1, 1, "Yes", 1)).ReturnsAsync(mockResponse); | ||||||
|             var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object); |             var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object); | ||||||
|             var result = (OkObjectResult)await surveyResponseProvider.GetSurveyResponsesByAnswerAsyncAsync(1, 1, "Yes", 1); |             var result = (OkObjectResult)await surveyResponseProvider.GetSurveyResponsesByAnswerAsyncAsync(1, 1, "Yes", 1); | ||||||
|             Assert.Equal(200, result.StatusCode); |             Assert.Equal(200, result.StatusCode); | ||||||
|         } |         } | ||||||
| @ -99,7 +101,7 @@ namespace DamageAssesment.SurveyResponses.Test | |||||||
|         { |         { | ||||||
|             var mockResponse = await MockData.getResponse(); |             var mockResponse = await MockData.getResponse(); | ||||||
|             mockSurveyResponseService.Setup(service => service.GetResponsesByAnswerAsync(1, 1, "Yes", 1)).ReturnsAsync(mockResponse); |             mockSurveyResponseService.Setup(service => service.GetResponsesByAnswerAsync(1, 1, "Yes", 1)).ReturnsAsync(mockResponse); | ||||||
|             var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object); |             var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object); | ||||||
|             var result = (NoContentResult)await surveyResponseProvider.GetSurveyResponsesByAnswerAsyncAsync(1, 1, "Yes", 1); |             var result = (NoContentResult)await surveyResponseProvider.GetSurveyResponsesByAnswerAsyncAsync(1, 1, "Yes", 1); | ||||||
|             Assert.Equal(204, result.StatusCode); |             Assert.Equal(204, result.StatusCode); | ||||||
|         } |         } | ||||||
| @ -111,7 +113,7 @@ namespace DamageAssesment.SurveyResponses.Test | |||||||
|             SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject(); |             SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject(); | ||||||
|             var mockResponse = await MockData.getOkResponse(); |             var mockResponse = await MockData.getOkResponse(); | ||||||
|             mockSurveyResponseService.Setup(service => service.GetAnswersByRegionAsync(1, 1)).ReturnsAsync(mockResponse); |             mockSurveyResponseService.Setup(service => service.GetAnswersByRegionAsync(1, 1)).ReturnsAsync(mockResponse); | ||||||
|             var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object); |             var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object); | ||||||
|             var result = (OkObjectResult)await surveyResponseProvider.GetAnswersByRegionAsync(1, 1); |             var result = (OkObjectResult)await surveyResponseProvider.GetAnswersByRegionAsync(1, 1); | ||||||
|             Assert.Equal(200, result.StatusCode); |             Assert.Equal(200, result.StatusCode); | ||||||
|         } |         } | ||||||
| @ -121,7 +123,7 @@ namespace DamageAssesment.SurveyResponses.Test | |||||||
|         { |         { | ||||||
|             var mockResponse = await MockData.getResponse(); |             var mockResponse = await MockData.getResponse(); | ||||||
|             mockSurveyResponseService.Setup(service => service.GetAnswersByRegionAsync(1, 1)).ReturnsAsync(mockResponse); |             mockSurveyResponseService.Setup(service => service.GetAnswersByRegionAsync(1, 1)).ReturnsAsync(mockResponse); | ||||||
|             var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object); |             var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object); | ||||||
|             var result = (NoContentResult)await surveyResponseProvider.GetAnswersByRegionAsync(1, 1); |             var result = (NoContentResult)await surveyResponseProvider.GetAnswersByRegionAsync(1, 1); | ||||||
|             Assert.Equal(204, result.StatusCode); |             Assert.Equal(204, result.StatusCode); | ||||||
|         } |         } | ||||||
| @ -132,7 +134,7 @@ namespace DamageAssesment.SurveyResponses.Test | |||||||
|             SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject(); |             SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject(); | ||||||
|             var mockResponse = await MockData.getOkResponse(); |             var mockResponse = await MockData.getOkResponse(); | ||||||
|             mockSurveyResponseService.Setup(service => service.GetSurveyResponsesByMaintenanceCenterAsync(1, 1)).ReturnsAsync(mockResponse); |             mockSurveyResponseService.Setup(service => service.GetSurveyResponsesByMaintenanceCenterAsync(1, 1)).ReturnsAsync(mockResponse); | ||||||
|             var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object); |             var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object); | ||||||
|             var result = (OkObjectResult)await surveyResponseProvider.GetAnswersByMaintenaceCentersync(1, 1); |             var result = (OkObjectResult)await surveyResponseProvider.GetAnswersByMaintenaceCentersync(1, 1); | ||||||
|             Assert.Equal(200, result.StatusCode); |             Assert.Equal(200, result.StatusCode); | ||||||
|         } |         } | ||||||
| @ -142,7 +144,7 @@ namespace DamageAssesment.SurveyResponses.Test | |||||||
|         { |         { | ||||||
|             var mockResponse = await MockData.getResponse(); |             var mockResponse = await MockData.getResponse(); | ||||||
|             mockSurveyResponseService.Setup(service => service.GetSurveyResponsesByMaintenanceCenterAsync(1, 1)).ReturnsAsync(mockResponse); |             mockSurveyResponseService.Setup(service => service.GetSurveyResponsesByMaintenanceCenterAsync(1, 1)).ReturnsAsync(mockResponse); | ||||||
|             var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object); |             var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object); | ||||||
|             var result = (NoContentResult)await surveyResponseProvider.GetAnswersByMaintenaceCentersync(1, 1); |             var result = (NoContentResult)await surveyResponseProvider.GetAnswersByMaintenaceCentersync(1, 1); | ||||||
|             Assert.Equal(204, result.StatusCode); |             Assert.Equal(204, result.StatusCode); | ||||||
|         } |         } | ||||||
| @ -153,7 +155,7 @@ namespace DamageAssesment.SurveyResponses.Test | |||||||
|             SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject(); |             SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject(); | ||||||
|             var mockResponse = await MockData.getOkResponse(); |             var mockResponse = await MockData.getOkResponse(); | ||||||
|             mockSurveyResponseService.Setup(service => service.GetSurveyResponseByIdAsync(1)).ReturnsAsync(mockResponse); |             mockSurveyResponseService.Setup(service => service.GetSurveyResponseByIdAsync(1)).ReturnsAsync(mockResponse); | ||||||
|             var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object); |             var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object); | ||||||
|             var result = (OkObjectResult)await surveyResponseProvider.GetSurveyResponseByIdAsync(1); |             var result = (OkObjectResult)await surveyResponseProvider.GetSurveyResponseByIdAsync(1); | ||||||
|             Assert.Equal(200, result.StatusCode); |             Assert.Equal(200, result.StatusCode); | ||||||
|         } |         } | ||||||
| @ -163,7 +165,7 @@ namespace DamageAssesment.SurveyResponses.Test | |||||||
|         { |         { | ||||||
|             var mockResponse = await MockData.getResponse(); |             var mockResponse = await MockData.getResponse(); | ||||||
|             mockSurveyResponseService.Setup(service => service.GetSurveyResponseByIdAsync(1)).ReturnsAsync(mockResponse); |             mockSurveyResponseService.Setup(service => service.GetSurveyResponseByIdAsync(1)).ReturnsAsync(mockResponse); | ||||||
|             var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object); |             var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object); | ||||||
|             var result = (NoContentResult)await surveyResponseProvider.GetSurveyResponseByIdAsync(1); |             var result = (NoContentResult)await surveyResponseProvider.GetSurveyResponseByIdAsync(1); | ||||||
|             Assert.Equal(204, result.StatusCode); |             Assert.Equal(204, result.StatusCode); | ||||||
|         } |         } | ||||||
| @ -175,7 +177,7 @@ namespace DamageAssesment.SurveyResponses.Test | |||||||
|             SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject(); |             SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject(); | ||||||
|             var mockResponse = await MockData.getOkResponse(mockRequestObject); |             var mockResponse = await MockData.getOkResponse(mockRequestObject); | ||||||
|             mockSurveyResponseService.Setup(service => service.PostSurveyResponseAsync(mockRequestObject)).ReturnsAsync(mockResponse); |             mockSurveyResponseService.Setup(service => service.PostSurveyResponseAsync(mockRequestObject)).ReturnsAsync(mockResponse); | ||||||
|             var surveyResponseController = new SurveyResponsesController(mockSurveyResponseService.Object); |             var surveyResponseController = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object); | ||||||
|             var result = (OkObjectResult)await surveyResponseController.PostSurveysAsync(mockRequestObject); |             var result = (OkObjectResult)await surveyResponseController.PostSurveysAsync(mockRequestObject); | ||||||
|             Assert.Equal(200, result.StatusCode); |             Assert.Equal(200, result.StatusCode); | ||||||
|         } |         } | ||||||
| @ -186,7 +188,7 @@ namespace DamageAssesment.SurveyResponses.Test | |||||||
|             SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject(); |             SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject(); | ||||||
|             var mockResponse = await MockData.getResponse(); |             var mockResponse = await MockData.getResponse(); | ||||||
|             mockSurveyResponseService.Setup(service => service.PostSurveyResponseAsync(mockRequestObject)).ReturnsAsync(mockResponse); |             mockSurveyResponseService.Setup(service => service.PostSurveyResponseAsync(mockRequestObject)).ReturnsAsync(mockResponse); | ||||||
|             var surveyResponseController = new SurveyResponsesController(mockSurveyResponseService.Object); |             var surveyResponseController = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object); | ||||||
|             var result = (BadRequestObjectResult)await surveyResponseController.PostSurveysAsync(mockRequestObject); |             var result = (BadRequestObjectResult)await surveyResponseController.PostSurveysAsync(mockRequestObject); | ||||||
|             Assert.Equal(400, result.StatusCode); |             Assert.Equal(400, result.StatusCode); | ||||||
|         } |         } | ||||||
| @ -197,7 +199,7 @@ namespace DamageAssesment.SurveyResponses.Test | |||||||
|             SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject(); |             SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject(); | ||||||
|             var mockResponse = await MockData.getOkResponse(mockRequestObject); |             var mockResponse = await MockData.getOkResponse(mockRequestObject); | ||||||
|             mockSurveyResponseService.Setup(service => service.PutSurveyResponseAsync(1, mockRequestObject)).ReturnsAsync(mockResponse); |             mockSurveyResponseService.Setup(service => service.PutSurveyResponseAsync(1, mockRequestObject)).ReturnsAsync(mockResponse); | ||||||
|             var surveyResponseController = new SurveyResponsesController(mockSurveyResponseService.Object); |             var surveyResponseController = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object); | ||||||
|             var result = (OkObjectResult)await surveyResponseController.PutSurveyResponseAsync(1, mockRequestObject); |             var result = (OkObjectResult)await surveyResponseController.PutSurveyResponseAsync(1, mockRequestObject); | ||||||
|             Assert.Equal(200, result.StatusCode); |             Assert.Equal(200, result.StatusCode); | ||||||
|         } |         } | ||||||
| @ -208,7 +210,7 @@ namespace DamageAssesment.SurveyResponses.Test | |||||||
|             SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject(); |             SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject(); | ||||||
|             var mockResponse = await MockData.getResponse(); |             var mockResponse = await MockData.getResponse(); | ||||||
|             mockSurveyResponseService.Setup(service => service.PutSurveyResponseAsync(1, mockRequestObject)).ReturnsAsync(mockResponse); ; |             mockSurveyResponseService.Setup(service => service.PutSurveyResponseAsync(1, mockRequestObject)).ReturnsAsync(mockResponse); ; | ||||||
|             var surveyResponseController = new SurveyResponsesController(mockSurveyResponseService.Object); |             var surveyResponseController = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object); | ||||||
|             var result = (BadRequestObjectResult)await surveyResponseController.PutSurveyResponseAsync(1, mockRequestObject); |             var result = (BadRequestObjectResult)await surveyResponseController.PutSurveyResponseAsync(1, mockRequestObject); | ||||||
|             Assert.Equal(400, result.StatusCode); |             Assert.Equal(400, result.StatusCode); | ||||||
|         } |         } | ||||||
| @ -219,7 +221,7 @@ namespace DamageAssesment.SurveyResponses.Test | |||||||
|             SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject(); |             SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject(); | ||||||
|             var mockResponse = await MockData.getOkResponse(mockRequestObject); |             var mockResponse = await MockData.getOkResponse(mockRequestObject); | ||||||
|             mockSurveyResponseService.Setup(service => service.DeleteSurveyResponseAsync(1)).ReturnsAsync(mockResponse); |             mockSurveyResponseService.Setup(service => service.DeleteSurveyResponseAsync(1)).ReturnsAsync(mockResponse); | ||||||
|             var surveyResponseController = new SurveyResponsesController(mockSurveyResponseService.Object); |             var surveyResponseController = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object); | ||||||
|             var result = (OkObjectResult)await surveyResponseController.DeleteSurveyResponseAsync(1); |             var result = (OkObjectResult)await surveyResponseController.DeleteSurveyResponseAsync(1); | ||||||
|             Assert.Equal(200, result.StatusCode); |             Assert.Equal(200, result.StatusCode); | ||||||
|         } |         } | ||||||
| @ -229,7 +231,7 @@ namespace DamageAssesment.SurveyResponses.Test | |||||||
|         { |         { | ||||||
|             var mockResponse = await MockData.getResponse(); |             var mockResponse = await MockData.getResponse(); | ||||||
|             mockSurveyResponseService.Setup(service => service.DeleteSurveyResponseAsync(1)).ReturnsAsync(mockResponse); ; |             mockSurveyResponseService.Setup(service => service.DeleteSurveyResponseAsync(1)).ReturnsAsync(mockResponse); ; | ||||||
|             var surveyResponseController = new SurveyResponsesController(mockSurveyResponseService.Object); |             var surveyResponseController = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object); | ||||||
|             var result = (NotFoundResult)await surveyResponseController.DeleteSurveyResponseAsync(1); |             var result = (NotFoundResult)await surveyResponseController.DeleteSurveyResponseAsync(1); | ||||||
|             Assert.Equal(404, result.StatusCode); |             Assert.Equal(404, result.StatusCode); | ||||||
|         } |         } | ||||||
|  | |||||||
| @ -8,10 +8,12 @@ namespace DamageAssesment.Api.Responses.Controllers | |||||||
|     public class SurveyResponsesController : ControllerBase |     public class SurveyResponsesController : ControllerBase | ||||||
|     { |     { | ||||||
|         private readonly ISurveysResponse surveyResponseProvider; |         private readonly ISurveysResponse surveyResponseProvider; | ||||||
|  |         private readonly IExcelExportService excelExportService; | ||||||
|  |  | ||||||
|         public SurveyResponsesController(ISurveysResponse surveyResponseProvider) |         public SurveyResponsesController(ISurveysResponse surveyResponseProvider, IExcelExportService excelExportService) | ||||||
|         { |         { | ||||||
|             this.surveyResponseProvider = surveyResponseProvider; |             this.surveyResponseProvider = surveyResponseProvider; | ||||||
|  |             this.excelExportService = excelExportService; | ||||||
|         } |         } | ||||||
|         /// <summary> |         /// <summary> | ||||||
|         /// GET request for retrieving survey responses. |         /// GET request for retrieving survey responses. | ||||||
| @ -198,6 +200,9 @@ namespace DamageAssesment.Api.Responses.Controllers | |||||||
|             else |             else | ||||||
|                 return BadRequest(result.ErrorMessage); |                 return BadRequest(result.ErrorMessage); | ||||||
|         } |         } | ||||||
|  |         /// <summary> | ||||||
|  |         /// Get All active surveys . | ||||||
|  |         /// </summary> | ||||||
|         [Route("responses/surveys/active")] |         [Route("responses/surveys/active")] | ||||||
|         [Route("responses/surveys/active/{language:alpha}")] |         [Route("responses/surveys/active/{language:alpha}")] | ||||||
|         [Route("responses/surveys/active/{employeeid:int}")] |         [Route("responses/surveys/active/{employeeid:int}")] | ||||||
| @ -212,6 +217,23 @@ namespace DamageAssesment.Api.Responses.Controllers | |||||||
|             } |             } | ||||||
|             return NoContent(); |             return NoContent(); | ||||||
|         } |         } | ||||||
|  |         /// <summary> | ||||||
|  |         /// Export all survey response data based on survey id. | ||||||
|  |         /// </summary> | ||||||
|  |         [HttpGet] | ||||||
|  |         [Route("responses/surveys/export/{surveyid}")] | ||||||
|  |         public async Task<ActionResult> GetExcelSurveysAsync(int surveyid, string language, bool IsAdmin = false) | ||||||
|  |         { | ||||||
|  |             var result = await this.surveyResponseProvider.ExportSurveyResponsesAsync(surveyid, language, IsAdmin); | ||||||
|  |             if (result.IsSuccess && result.surveyResponses.Count > 0) | ||||||
|  |             { | ||||||
|  |  | ||||||
|  |                 byte[] fileContents = excelExportService.ExportToExcel<object>(result.surveyResponses); | ||||||
|  |                 return File(fileContents, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "data.xlsx"); | ||||||
|  |                 //return Ok(result.Surveys); | ||||||
|  |             } | ||||||
|  |             return NoContent(); | ||||||
|  |         } | ||||||
|         //[Route("responses/surveys/active")] |         //[Route("responses/surveys/active")] | ||||||
|         //[Route("responses/surveys/active/{language:alpha}")] |         //[Route("responses/surveys/active/{language:alpha}")] | ||||||
|         //[HttpGet] |         //[HttpGet] | ||||||
| @ -224,6 +246,10 @@ namespace DamageAssesment.Api.Responses.Controllers | |||||||
|         //    } |         //    } | ||||||
|         //    return NoContent(); |         //    return NoContent(); | ||||||
|         //} |         //} | ||||||
|  |  | ||||||
|  |         /// <summary> | ||||||
|  |         /// Get all historical surveys . | ||||||
|  |         /// </summary> | ||||||
|         [Route("responses/surveys/historic")] |         [Route("responses/surveys/historic")] | ||||||
|         [Route("responses/surveys/historic/{language:alpha}")] |         [Route("responses/surveys/historic/{language:alpha}")] | ||||||
|         [Route("responses/surveys/historic/{employeeid:int}")] |         [Route("responses/surveys/historic/{employeeid:int}")] | ||||||
|  | |||||||
| @ -11,6 +11,21 @@ | |||||||
|  |  | ||||||
|   <ItemGroup> |   <ItemGroup> | ||||||
|     <PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="12.0.1" /> |     <PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="12.0.1" /> | ||||||
|  |     <PackageReference Include="ClosedXML" Version="0.102.1" /> | ||||||
|  |     <PackageReference Include="EPPlus" Version="6.2.10" /> | ||||||
|  |     <PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.9" /> | ||||||
|  |     <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="7.0.9"> | ||||||
|  |       <PrivateAssets>all</PrivateAssets> | ||||||
|  |       <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> | ||||||
|  |     </PackageReference> | ||||||
|  |     <PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="7.0.9" /> | ||||||
|  |     <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="7.0.9" /> | ||||||
|  |     <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="7.0.9"> | ||||||
|  |       <PrivateAssets>all</PrivateAssets> | ||||||
|  |       <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> | ||||||
|  |     </PackageReference> | ||||||
|  |     <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="7.0.0" /> | ||||||
|  |     <PackageReference Include="Microsoft.Extensions.Http.Polly" Version="7.0.9" /> | ||||||
|     <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.21" /> |     <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.21" /> | ||||||
|     <PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.5" /> |     <PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.5" /> | ||||||
|     <PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="7.0.5" /> |     <PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="7.0.5" /> | ||||||
|  | |||||||
| @ -3,6 +3,7 @@ using System.ComponentModel.DataAnnotations.Schema; | |||||||
|  |  | ||||||
| namespace DamageAssesment.Api.Responses.Db | namespace DamageAssesment.Api.Responses.Db | ||||||
| { | { | ||||||
|  |     [Table("SurveyResponses")] | ||||||
|     public class SurveyResponse |     public class SurveyResponse | ||||||
|     { |     { | ||||||
|         [Key] |         [Key] | ||||||
|  | |||||||
| @ -4,12 +4,17 @@ namespace DamageAssesment.Api.Responses.Db | |||||||
| { | { | ||||||
|     public class SurveyResponseDbContext:DbContext |     public class SurveyResponseDbContext:DbContext | ||||||
|     { |     { | ||||||
|         public DbSet<Db.SurveyResponse> SurveyResponses { get; set; } |         private IConfiguration _Configuration { get; set; } | ||||||
|  |         public SurveyResponseDbContext(DbContextOptions options, IConfiguration configuration) : base(options) | ||||||
|         public SurveyResponseDbContext(DbContextOptions options) : base(options) |  | ||||||
|         { |         { | ||||||
|  |             _Configuration = configuration; | ||||||
|         } |         } | ||||||
|  |         protected override void OnConfiguring(DbContextOptionsBuilder options) | ||||||
|  |         { | ||||||
|  |             // connect to sql server with connection string from app settings | ||||||
|  |             options.UseSqlServer(_Configuration.GetConnectionString("ResponsesConnection")); | ||||||
|  |         } | ||||||
|  |         public DbSet<Db.SurveyResponse> SurveyResponses { get; set; } | ||||||
|  |  | ||||||
|         protected override void OnModelCreating(ModelBuilder modelBuilder) |         protected override void OnModelCreating(ModelBuilder modelBuilder) | ||||||
|         { |         { | ||||||
|  | |||||||
| @ -0,0 +1,7 @@ | |||||||
|  | namespace DamageAssesment.Api.Responses.Interfaces | ||||||
|  | { | ||||||
|  |     public interface IExcelExportService | ||||||
|  |     { | ||||||
|  |         public byte[] ExportToExcel<T1>(List<object> responses); | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -4,8 +4,9 @@ namespace DamageAssesment.Api.Responses.Interfaces | |||||||
| { | { | ||||||
|     public interface IQuestionServiceProvider |     public interface IQuestionServiceProvider | ||||||
|     { |     { | ||||||
|         Task<List<Question>> getQuestionsAsync(); |         Task<List<Question>> getQuestionsAsync(string language); | ||||||
|         Task<List<SurveyQuestions>> getSurveyQuestionsAsync(int surveyId); |         Task<List<SurveyQuestions>> getSurveyQuestionsAsync(int surveyId); | ||||||
|         Task<Question> getQuestionsAsync(int questionId); |         Task<Question> getQuestionsAsync(int questionId); | ||||||
|  |         Task<List<QuestionCategory>> GetQuestionCategoriesAsync(string? language); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -9,6 +9,7 @@ namespace DamageAssesment.Api.Responses.Interfaces | |||||||
|         Task<(bool IsSuccess, Models.SurveyResponse SurveyResponse, string ErrorMessage)> PostSurveyResponseAsync(Models.SurveyResponse surveyResponse); |         Task<(bool IsSuccess, Models.SurveyResponse SurveyResponse, string ErrorMessage)> PostSurveyResponseAsync(Models.SurveyResponse surveyResponse); | ||||||
|         // Task<(bool IsSuccess,dynamic surveyResponses, string ErrorMessage)> GetSurveyResponseAsync(int responseId); |         // Task<(bool IsSuccess,dynamic surveyResponses, string ErrorMessage)> GetSurveyResponseAsync(int responseId); | ||||||
|         Task<(bool IsSuccess, dynamic surveyResponses, string ErrorMessage)> GetSurveyResponsesAsync(int employeeid); |         Task<(bool IsSuccess, dynamic surveyResponses, string ErrorMessage)> GetSurveyResponsesAsync(int employeeid); | ||||||
|  |         Task<(bool IsSuccess, List<object> surveyResponses, string ErrorMessage)> ExportSurveyResponsesAsync(int surveyId, string language, bool IsAdmin); | ||||||
|         Task<(bool IsSuccess, dynamic Surveys, string ErrorMessage)> GetActiveSurveysAsync(int? employeeid, string language); |         Task<(bool IsSuccess, dynamic Surveys, string ErrorMessage)> GetActiveSurveysAsync(int? employeeid, string language); | ||||||
|         Task<(bool IsSuccess, dynamic Surveys, string ErrorMessage)> GetHistoricSurveysAsync(int? employeeid, string language); |         Task<(bool IsSuccess, dynamic Surveys, string ErrorMessage)> GetHistoricSurveysAsync(int? employeeid, string language); | ||||||
|         Task<(bool IsSuccess, Models.SurveyResponse SurveyResponse, string ErrorMessage)> PutSurveyResponseAsync(int Id, Models.SurveyResponse surveyResponse); |         Task<(bool IsSuccess, Models.SurveyResponse SurveyResponse, string ErrorMessage)> PutSurveyResponseAsync(int Id, Models.SurveyResponse surveyResponse); | ||||||
|  | |||||||
| @ -11,6 +11,7 @@ namespace DamageAssesment.Api.Responses.Models | |||||||
|  |  | ||||||
|         public int? AnswerId { get; set; } |         public int? AnswerId { get; set; } | ||||||
|         public bool IsDeleted { get; set; } |         public bool IsDeleted { get; set; } | ||||||
|  |         public string FileName { get; set; } | ||||||
|  |  | ||||||
|         public Attachment(int answerId, string uri) |         public Attachment(int answerId, string uri) | ||||||
|         { |         { | ||||||
|  | |||||||
| @ -4,8 +4,13 @@ | |||||||
|     { |     { | ||||||
|         public int Id { get; set; } |         public int Id { get; set; } | ||||||
|         public int RegionId { get; set; } |         public int RegionId { get; set; } | ||||||
|  |         public string LocationCode { get; set; } | ||||||
|         public string Name { get; set; } |         public string Name { get; set; } | ||||||
|         public string MaintenanceCenter { get; set; } |         public string MaintenanceCenter { get; set; } | ||||||
|         public string SchoolType { get; set; } |         public string SchoolType { get; set; } | ||||||
|  |         public int? DataValue { get; set; } | ||||||
|  |         public int? Enrollment { get; set; } | ||||||
|  |         public double? Longitute { get; set; } | ||||||
|  |         public double? Latitude { get; set; } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -0,0 +1,10 @@ | |||||||
|  | namespace DamageAssesment.Api.Responses.Models | ||||||
|  | { | ||||||
|  |     public class QuestionCategory | ||||||
|  |     { | ||||||
|  |         public int Id { get; set; } | ||||||
|  |         public string IconName { get; set; } | ||||||
|  |         public string IconLibrary { get; set; } | ||||||
|  |         public object Titles { get; set; } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -2,13 +2,20 @@ | |||||||
|  |  | ||||||
| namespace DamageAssesment.Api.Responses.Models | namespace DamageAssesment.Api.Responses.Models | ||||||
| { | { | ||||||
|  |     public enum SurveyStatus | ||||||
|  |     { | ||||||
|  |         PENDING, | ||||||
|  |         ACTIVE, | ||||||
|  |         INACTIVE | ||||||
|  |     } | ||||||
|     public class Survey |     public class Survey | ||||||
|     { |     { | ||||||
|         public int Id { get; set; } |         public int Id { get; set; } | ||||||
|         public bool IsEnabled { get; set; } |         public bool IsEnabled { get; set; } | ||||||
|         public DateTime StartDate { get; set; } |         public DateTime? StartDate { get; set; } | ||||||
|         public DateTime EndDate { get; set; } |         public DateTime? EndDate { get; set; } | ||||||
|         public DateTime CreatedDate { get; set; } |         public DateTime CreatedDate { get; set; } | ||||||
|  |         public string Status { get; set; } | ||||||
|         public Dictionary<string, string> Titles { get; set; } |         public Dictionary<string, string> Titles { get; set; } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -0,0 +1,24 @@ | |||||||
|  | namespace DamageAssesment.Api.Responses.Models | ||||||
|  | { | ||||||
|  |     public class SurveyExport | ||||||
|  |     { | ||||||
|  |         public int Id { get; set; } | ||||||
|  |         public string SurveyQuestion { get; set; }   | ||||||
|  |         public string Answer { get; set; } | ||||||
|  |         public string Category { get; set; } | ||||||
|  |  | ||||||
|  |         public string School { get; set; } | ||||||
|  |         public string Location { get; set; } | ||||||
|  |         public string Region { get; set; } | ||||||
|  |  | ||||||
|  |         public string MC { get; set; } | ||||||
|  |         public string ResponseDate { get; set; } | ||||||
|  |         public string Notes { get; set; } | ||||||
|  |  | ||||||
|  |         public string Attachment1 { get; set; } | ||||||
|  |         public string Attachment2 { get; set; } | ||||||
|  |         public string Attachment3 { get; set; } | ||||||
|  |         public string Attachment4 { get; set; } | ||||||
|  |         public string Attachment5 { get; set; } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -16,6 +16,10 @@ const int intervalForCircuitBraker = 5; //5 seconds | |||||||
| // Add services to the container. | // Add services to the container. | ||||||
|  |  | ||||||
| builder.Services.AddControllers(); | builder.Services.AddControllers(); | ||||||
|  | // CORS setup to allow requests from any origin. | ||||||
|  | builder.Services.AddCors(p => p.AddPolicy("DamageAppCorsPolicy", build => { | ||||||
|  |     build.WithOrigins("*").AllowAnyMethod().AllowAnyHeader().AllowAnyOrigin(); | ||||||
|  | })); | ||||||
| // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle | // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle | ||||||
|  |  | ||||||
| builder.Services.AddScoped<ISurveysResponse, SurveyResponsesProvider>(); | builder.Services.AddScoped<ISurveysResponse, SurveyResponsesProvider>(); | ||||||
| @ -26,6 +30,7 @@ builder.Services.AddScoped<IQuestionServiceProvider, QuestionServiceProvider>(); | |||||||
| builder.Services.AddScoped<IEmployeeServiceProvider, EmployeeServiceProvider>(); | builder.Services.AddScoped<IEmployeeServiceProvider, EmployeeServiceProvider>(); | ||||||
| builder.Services.AddScoped<IAttachmentServiceProvider, AttachmentServiceProvider>(); | builder.Services.AddScoped<IAttachmentServiceProvider, AttachmentServiceProvider>(); | ||||||
| builder.Services.AddScoped<ISurveyServiceProvider, SurveyServiceProvider>(); | builder.Services.AddScoped<ISurveyServiceProvider, SurveyServiceProvider>(); | ||||||
|  | builder.Services.AddScoped<IExcelExportService, ExcelExportService>(); | ||||||
|  |  | ||||||
| builder.Services.AddHttpClient<IHttpUtil, HttpUtil>(). | builder.Services.AddHttpClient<IHttpUtil, HttpUtil>(). | ||||||
|     AddTransientHttpErrorPolicy(policy => policy.WaitAndRetryAsync(maxApiCallRetries, _ => TimeSpan.FromSeconds(intervalToRetry))). |     AddTransientHttpErrorPolicy(policy => policy.WaitAndRetryAsync(maxApiCallRetries, _ => TimeSpan.FromSeconds(intervalToRetry))). | ||||||
| @ -35,6 +40,7 @@ builder.Services.AddHttpClient<IHttpUtil, HttpUtil>(). | |||||||
| builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies()); | builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies()); | ||||||
| builder.Services.AddEndpointsApiExplorer(); | builder.Services.AddEndpointsApiExplorer(); | ||||||
| //builder.Services.AddSwaggerGen(); | //builder.Services.AddSwaggerGen(); | ||||||
|  | // Add Swagger/OpenAPI documentation support. | ||||||
| builder.Services.AddSwaggerGen(c => | builder.Services.AddSwaggerGen(c => | ||||||
| { | { | ||||||
|     // Include XML comments from your assembly |     // Include XML comments from your assembly | ||||||
| @ -44,8 +50,11 @@ builder.Services.AddSwaggerGen(c => | |||||||
| }); | }); | ||||||
| builder.Services.AddDbContext<SurveyResponseDbContext>(option => | builder.Services.AddDbContext<SurveyResponseDbContext>(option => | ||||||
| { | { | ||||||
|     option.UseInMemoryDatabase("Responses"); |     option.UseSqlServer("ResponsesConnection"); | ||||||
| }); | }); | ||||||
|  | builder.Services.AddCors(p => p.AddPolicy("DamageAppCorsPolicy", build => { | ||||||
|  |     build.WithOrigins("*").AllowAnyMethod().AllowAnyHeader().AllowAnyOrigin(); | ||||||
|  | })); | ||||||
| var app = builder.Build(); | var app = builder.Build(); | ||||||
|  |  | ||||||
| // Configure the HTTP request pipeline. | // Configure the HTTP request pipeline. | ||||||
| @ -55,6 +64,7 @@ if (app.Environment.IsDevelopment()) | |||||||
|     app.UseSwaggerUI(); |     app.UseSwaggerUI(); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | app.UseCors("DamageAppCorsPolicy"); | ||||||
| app.UseAuthorization(); | app.UseAuthorization(); | ||||||
|  |  | ||||||
| app.MapControllers(); | app.MapControllers(); | ||||||
|  | |||||||
| @ -0,0 +1,62 @@ | |||||||
|  | using ClosedXML.Excel; | ||||||
|  | using DamageAssesment.Api.Responses.Interfaces; | ||||||
|  | using DamageAssesment.Api.Responses.Models; | ||||||
|  | using OfficeOpenXml; | ||||||
|  | using System.Collections.Generic; | ||||||
|  |  | ||||||
|  | namespace DamageAssesment.Api.Responses.Providers | ||||||
|  | { | ||||||
|  |     public class ExcelExportService: IExcelExportService | ||||||
|  |     { | ||||||
|  |         public byte[] ExportToExcel<T1>(List<object> responses) | ||||||
|  |         {  | ||||||
|  |             ExcelPackage.LicenseContext = LicenseContext.NonCommercial; | ||||||
|  |             using (var package = new ExcelPackage()) | ||||||
|  |             { | ||||||
|  |                 // Create the first worksheet and populate it with responses | ||||||
|  |                 var workSheet1 = package.Workbook.Worksheets.Add("responses"); | ||||||
|  |                 PopulateWorksheet(workSheet1, responses); | ||||||
|  |                 return package.GetAsByteArray(); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         private void PopulateWorksheet(ExcelWorksheet worksheet, List<object> data) | ||||||
|  |         { | ||||||
|  |             if (data.Count > 0) | ||||||
|  |             { | ||||||
|  |                 var properties = data[0].GetType().GetProperties(); | ||||||
|  |                 List<int> IsAttchments = new List<int>(); | ||||||
|  |                 // Add column headers | ||||||
|  |                 for (int col = 1; col <= properties.Length; col++) | ||||||
|  |                 { | ||||||
|  |                     worksheet.Cells[1, col].Value = properties[col - 1].Name; | ||||||
|  |                     if(properties[col - 1].Name.ToLower().Contains("attachment")) | ||||||
|  |                         IsAttchments.Add(col); | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 // Add data | ||||||
|  |                 for (int row = 2; row <= data.Count + 1; row++) | ||||||
|  |                 { | ||||||
|  |                     for (int col = 1; col <= properties.Length; col++) | ||||||
|  |                     { | ||||||
|  |                         | ||||||
|  |                             string value = Convert.ToString(properties[col - 1].GetValue(data[row - 2])); | ||||||
|  |                         if (IsAttchments.Where(a => a == col).Count() > 0 && !string.IsNullOrEmpty(value)) | ||||||
|  |                         { | ||||||
|  |                             List<string> attachments = value.Split("##").ToList(); | ||||||
|  |                             try | ||||||
|  |                             { | ||||||
|  |                                 Uri linkUri = new Uri(attachments[1]); | ||||||
|  |                                 worksheet.Cells[row, col].Value = attachments[0]; | ||||||
|  |                                 worksheet.Cells[row, col].Style.Font.UnderLine = true; | ||||||
|  |                             } | ||||||
|  |                             catch { worksheet.Cells[row, col].Value = attachments[1]; } | ||||||
|  |                         } | ||||||
|  |                         else | ||||||
|  |                             worksheet.Cells[row, col].Value = value; | ||||||
|  |                          | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -3,6 +3,9 @@ using DamageAssesment.Api.Responses.Db; | |||||||
| using DamageAssesment.Api.Responses.Interfaces; | using DamageAssesment.Api.Responses.Interfaces; | ||||||
| using DamageAssesment.Api.Responses.Models; | using DamageAssesment.Api.Responses.Models; | ||||||
| using Microsoft.EntityFrameworkCore; | using Microsoft.EntityFrameworkCore; | ||||||
|  | using Microsoft.EntityFrameworkCore.Metadata.Internal; | ||||||
|  | using System.Reflection; | ||||||
|  | using System.Text.Json; | ||||||
|  |  | ||||||
| namespace DamageAssesment.Api.Responses.Providers | namespace DamageAssesment.Api.Responses.Providers | ||||||
| { | { | ||||||
| @ -43,7 +46,6 @@ namespace DamageAssesment.Api.Responses.Providers | |||||||
|                 // Create and save SurveyResponse records with references to existing Employee and Location records |                 // Create and save SurveyResponse records with references to existing Employee and Location records | ||||||
|                 surveyResponseDbContext.SurveyResponses.Add(new Db.SurveyResponse { SurveyId = 1, EmployeeId = 1, LocationId = 1, ClientDevice = "Mobile", Latitude = 98.8767, Longitute = -129.9897, KeyAnswerResult = "true", CreatedDate = DateTime.Now }); |                 surveyResponseDbContext.SurveyResponses.Add(new Db.SurveyResponse { SurveyId = 1, EmployeeId = 1, LocationId = 1, ClientDevice = "Mobile", Latitude = 98.8767, Longitute = -129.9897, KeyAnswerResult = "true", CreatedDate = DateTime.Now }); | ||||||
|                 surveyResponseDbContext.SurveyResponses.Add(new Db.SurveyResponse { SurveyId = 1, EmployeeId = 2, LocationId = 2, ClientDevice = "Mobile", Latitude = 98.8767, Longitute = -129.9897, KeyAnswerResult = "true", CreatedDate = DateTime.Now }); |                 surveyResponseDbContext.SurveyResponses.Add(new Db.SurveyResponse { SurveyId = 1, EmployeeId = 2, LocationId = 2, ClientDevice = "Mobile", Latitude = 98.8767, Longitute = -129.9897, KeyAnswerResult = "true", CreatedDate = DateTime.Now }); | ||||||
|  |  | ||||||
|                 surveyResponseDbContext.SaveChanges(); |                 surveyResponseDbContext.SaveChanges(); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| @ -54,16 +56,20 @@ namespace DamageAssesment.Api.Responses.Providers | |||||||
|             try |             try | ||||||
|             { |             { | ||||||
|                 logger?.LogInformation("Querying to get SurveyResponse object from DB"); |                 logger?.LogInformation("Querying to get SurveyResponse object from DB"); | ||||||
|                 IQueryable<Db.SurveyResponse> listSurveyResponse = null; |                 List<Db.SurveyResponse> listSurveyResponse = null; | ||||||
|                 if (employeeid == 0) |                 if (employeeid == 0) | ||||||
|                 { |                 { | ||||||
|                     listSurveyResponse = surveyResponseDbContext.SurveyResponses.Where(s => s.SurveyId == surveyId); |                     listSurveyResponse = surveyResponseDbContext.SurveyResponses.Where(s => s.SurveyId == surveyId).ToList(); | ||||||
|                 } |                 } | ||||||
|                 else |                 else | ||||||
|                 { |                 { | ||||||
|                     listSurveyResponse = surveyResponseDbContext.SurveyResponses.Where(s => s.SurveyId == surveyId && s.EmployeeId == employeeid); |                     listSurveyResponse = surveyResponseDbContext.SurveyResponses.Where(s => s.SurveyId == surveyId && s.EmployeeId == employeeid).ToList(); | ||||||
|                 } |                 } | ||||||
|  |                 listSurveyResponse = listSurveyResponse | ||||||
|  |                .OrderByDescending(obj => obj.Id) | ||||||
|  |                .GroupBy(obj => new { obj.SurveyId,  obj.LocationId })//obj.EmployeeId, | ||||||
|  |                .Select(group => group.FirstOrDefault())  // or .FirstOrDefault() if you want to handle empty groups | ||||||
|  |                .ToList(); | ||||||
|                 if (listSurveyResponse.Any()) |                 if (listSurveyResponse.Any()) | ||||||
|                 { |                 { | ||||||
|                     var answers = await getAnswersByRegionAndSurveyIdAsync(listSurveyResponse); |                     var answers = await getAnswersByRegionAndSurveyIdAsync(listSurveyResponse); | ||||||
| @ -119,7 +125,7 @@ namespace DamageAssesment.Api.Responses.Providers | |||||||
|                 logger?.LogInformation("Querying to get SurveyResponse object from DB"); |                 logger?.LogInformation("Querying to get SurveyResponse object from DB"); | ||||||
|                 //get all the survey that already taken by the employee |                 //get all the survey that already taken by the employee | ||||||
|                 var surveys = await surveyServiceProvider.getSurveysAsync(language); |                 var surveys = await surveyServiceProvider.getSurveysAsync(language); | ||||||
|                 surveys = surveys.Where(s => s.IsEnabled == true && s.StartDate <= DateTime.Now && s.EndDate >= DateTime.Now).ToList(); |                 surveys = surveys.Where(s => s.IsEnabled == true && s.Status == SurveyStatus.ACTIVE.ToString()).ToList(); | ||||||
|                 if (employeeid == null || employeeid == 0) |                 if (employeeid == null || employeeid == 0) | ||||||
|                     return (true, surveys, null); |                     return (true, surveys, null); | ||||||
|                 List<int> listOfsurveysId = await surveyResponseDbContext.SurveyResponses.Where(x => x.EmployeeId == employeeid.Value).Select(y => y.SurveyId).ToListAsync(); |                 List<int> listOfsurveysId = await surveyResponseDbContext.SurveyResponses.Where(x => x.EmployeeId == employeeid.Value).Select(y => y.SurveyId).ToListAsync(); | ||||||
| @ -141,11 +147,10 @@ namespace DamageAssesment.Api.Responses.Providers | |||||||
|  |  | ||||||
|                 var surveys = await surveyServiceProvider.getSurveysAsync(language); |                 var surveys = await surveyServiceProvider.getSurveysAsync(language); | ||||||
|                 // returning only historic data: end date is less than current date. |                 // returning only historic data: end date is less than current date. | ||||||
|                 surveys = surveys.Where(s => s.EndDate < DateTime.Now).ToList(); |                 surveys = surveys.Where(s => s.Status == SurveyStatus.INACTIVE.ToString()).ToList(); | ||||||
|                 if (employeeid == null || employeeid == 0) |                 if (employeeid == null || employeeid == 0) | ||||||
|                     return (true, surveys, null); |                     return (true, surveys, null); | ||||||
|                 var surveyResponses = await surveyResponseDbContext.SurveyResponses.Where(x => x.EmployeeId == employeeid).ToListAsync(); |                 var surveyResponses = await surveyResponseDbContext.SurveyResponses.Where(x => x.EmployeeId == employeeid).ToListAsync(); | ||||||
|  |  | ||||||
|                 var historicSurveys = from s in surveys |                 var historicSurveys = from s in surveys | ||||||
|                                       from r in surveyResponses |                                       from r in surveyResponses | ||||||
|                                       where s.Id == r.SurveyId |                                       where s.Id == r.SurveyId | ||||||
| @ -308,6 +313,26 @@ namespace DamageAssesment.Api.Responses.Providers | |||||||
|                 return (false, null, ex.Message); |                 return (false, null, ex.Message); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |         public async Task<(bool IsSuccess, List<object> surveyResponses, string ErrorMessage)> ExportSurveyResponsesAsync(int surveyId, string language, bool isadmin) | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 var responses = await getAllSurveyResponsesExcelAsync(surveyId, language, isadmin); | ||||||
|  |  | ||||||
|  |                 if (responses != null) | ||||||
|  |                     return (true, responses, "Request Successful."); | ||||||
|  |                 else | ||||||
|  |                 { | ||||||
|  |                     responses = null; | ||||||
|  |                     return (true, responses, "Empty object returned"); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             catch (Exception ex) | ||||||
|  |             { | ||||||
|  |                 logger?.LogError(ex.ToString()); | ||||||
|  |                 return (false, null, ex.Message); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|         public async Task<(bool IsSuccess, Models.SurveyResponse SurveyResponse, string ErrorMessage)> PostSurveyResponseAsync(Models.SurveyResponse surveyResponse) |         public async Task<(bool IsSuccess, Models.SurveyResponse SurveyResponse, string ErrorMessage)> PostSurveyResponseAsync(Models.SurveyResponse surveyResponse) | ||||||
|         { |         { | ||||||
| @ -396,14 +421,13 @@ namespace DamageAssesment.Api.Responses.Providers | |||||||
|         } |         } | ||||||
|  |  | ||||||
|         //Method to get Answers by region with surveyId as input parameter |         //Method to get Answers by region with surveyId as input parameter | ||||||
|         private async Task<dynamic> getAnswersByRegionAndSurveyIdAsync(IQueryable<Db.SurveyResponse> surveyResponses) |         private async Task<dynamic> getAnswersByRegionAndSurveyIdAsync(List<Db.SurveyResponse> surveyResponses) | ||||||
|         { |         { | ||||||
|             try |             try | ||||||
|             { |             { | ||||||
|                 var answersList = await answerServiceProvider.getAnswersAsync(); |                 var answersList = await answerServiceProvider.getAnswersAsync(); | ||||||
|                 if (answersList == null || !answersList.Any()) |                 if (answersList == null || !answersList.Any()) | ||||||
|                     return null; |                     return null; | ||||||
|  |  | ||||||
|                 //get all the answers for the particular survey |                 //get all the answers for the particular survey | ||||||
|                 var surveyAnswers = answersList.Join( |                 var surveyAnswers = answersList.Join( | ||||||
|                                        surveyResponses, |                                        surveyResponses, | ||||||
| @ -488,20 +512,22 @@ namespace DamageAssesment.Api.Responses.Providers | |||||||
|             { |             { | ||||||
|                 var employee = await employeeServiceProvider.getEmployeeAsync(surveyResponse.EmployeeId); |                 var employee = await employeeServiceProvider.getEmployeeAsync(surveyResponse.EmployeeId); | ||||||
|                 var answers = await answerServiceProvider.GetAnswersByResponseIdAsync(surveyResponse.Id); |                 var answers = await answerServiceProvider.GetAnswersByResponseIdAsync(surveyResponse.Id); | ||||||
|                 var allQuestions = await questionServiceProvider.getQuestionsAsync(); |                 var allQuestions = await questionServiceProvider.getQuestionsAsync(null); | ||||||
|                 var questions = allQuestions.Where(s => s.SurveyId == surveyResponse.SurveyId); |                 var questions = allQuestions.Where(s => s.SurveyId == surveyResponse.SurveyId); | ||||||
|                 var attachments = await attachmentServiceProvider.getAttachmentsAsync(); |                 var attachments = await attachmentServiceProvider.getAttachmentsAsync(); | ||||||
|  |                 var Locations = await locationServiceProvider.getLocationsAsync(); | ||||||
|                 var result = new |                 var location = Locations.Where(a => a.Id == surveyResponse.LocationId).FirstOrDefault(); | ||||||
|                 { |                 var result = new{ | ||||||
|                     surveyResponse.Id, |                     surveyResponse.Id, | ||||||
|                     surveyResponse.SurveyId, |                     surveyResponse.SurveyId, | ||||||
|                     surveyResponse.LocationId, |                     surveyResponse.LocationId, | ||||||
|                     surveyResponse.EmployeeId, |                     surveyResponse.EmployeeId, | ||||||
|                     surveyResponse.ClientDevice, |                     surveyResponse.ClientDevice, | ||||||
|                     surveyResponse.KeyAnswerResult, |                     surveyResponse.KeyAnswerResult, | ||||||
|                     surveyResponse.Longitute, |                     DataValue=(location!=null?location.DataValue:0), | ||||||
|                     surveyResponse.Latitude, |                     Enrollment= (location != null ? location.Enrollment : 0), | ||||||
|  |                     Longitute = (location != null ? location.Longitute : surveyResponse.Longitute), | ||||||
|  |                     Latitude=(location != null ? location.Latitude : surveyResponse.Latitude), | ||||||
|                     Employee = employee, |                     Employee = employee, | ||||||
|                     answers = from ans in answers |                     answers = from ans in answers | ||||||
|                               select new |                               select new | ||||||
| @ -542,9 +568,14 @@ namespace DamageAssesment.Api.Responses.Providers | |||||||
|                     surveyResonses = await surveyResponseDbContext.SurveyResponses.Where(x => x.SurveyId == surveyId && x.EmployeeId == employeeid).ToListAsync(); |                     surveyResonses = await surveyResponseDbContext.SurveyResponses.Where(x => x.SurveyId == surveyId && x.EmployeeId == employeeid).ToListAsync(); | ||||||
|                     employee = await employeeServiceProvider.getEmployeeAsync(employeeid); |                     employee = await employeeServiceProvider.getEmployeeAsync(employeeid); | ||||||
|                 } |                 } | ||||||
|  |                 surveyResonses = surveyResonses | ||||||
|  |                 .OrderByDescending(obj => obj.Id) | ||||||
|  |                 .GroupBy(obj => new { obj.SurveyId, obj.LocationId })//obj.EmployeeId, | ||||||
|  |                 .Select(group => group.FirstOrDefault())  // or .FirstOrDefault() if you want to handle empty groups | ||||||
|  |                 .ToList(); | ||||||
|                 var answers = await answerServiceProvider.getAnswersAsync(); |                 var answers = await answerServiceProvider.getAnswersAsync(); | ||||||
|                 var questions = await questionServiceProvider.getQuestionsAsync(); |                 var questions = await questionServiceProvider.getQuestionsAsync(null); | ||||||
|  |                 var Locations = await locationServiceProvider.getLocationsAsync(); | ||||||
|                 var surveyQuestions = from q in questions where q.SurveyId == surveyId select q; |                 var surveyQuestions = from q in questions where q.SurveyId == surveyId select q; | ||||||
|  |  | ||||||
|                 //var surveyQuestions = await questionServiceProvider.getSurveyQuestionsAsync(surveyId); |                 //var surveyQuestions = await questionServiceProvider.getSurveyQuestionsAsync(surveyId); | ||||||
| @ -554,6 +585,7 @@ namespace DamageAssesment.Api.Responses.Providers | |||||||
|                 if (employeeid == 0) |                 if (employeeid == 0) | ||||||
|                 { |                 { | ||||||
|                     var result = from r in surveyResonses |                     var result = from r in surveyResonses | ||||||
|  |                                  join loc in Locations on r.LocationId equals loc.Id | ||||||
|                                  select new |                                  select new | ||||||
|                                  { |                                  { | ||||||
|                                      r.Id, |                                      r.Id, | ||||||
| @ -561,16 +593,18 @@ namespace DamageAssesment.Api.Responses.Providers | |||||||
|                                      r.LocationId, |                                      r.LocationId, | ||||||
|                                      r.EmployeeId, |                                      r.EmployeeId, | ||||||
|                                      r.ClientDevice, |                                      r.ClientDevice, | ||||||
|                                      r.KeyAnswerResult, |                                     // r.KeyAnswerResult, | ||||||
|                                      r.Longitute, |                                      loc.DataValue, | ||||||
|                                      r.Latitude, |                                      loc.Enrollment, | ||||||
|                                      Employee = (from e in employees where e.Id == r.EmployeeId select new { e.Id, e.Name, e.BirthDate, e.Email, e.OfficePhoneNumber }).SingleOrDefault(), |                                      loc.Longitute, | ||||||
|  |                                      loc.Latitude, | ||||||
|  |                                     // Employee = (from e in employees where e.Id == r.EmployeeId select new { e.Id, e.Name, e.BirthDate, e.Email, e.OfficePhoneNumber }).SingleOrDefault(), | ||||||
|                                      answers = from ans in answers |                                      answers = from ans in answers | ||||||
|                                                where ans.SurveyResponseId == r.Id |                                                where ans.SurveyResponseId == r.Id | ||||||
|                                                select new |                                                select new | ||||||
|                                                { |                                                { | ||||||
|                                                    ans.Id, |                                                    ans.Id, | ||||||
|                                                    ans.QuestionId, |                                                 //   ans.QuestionId, | ||||||
|                                                    ans.AnswerText, |                                                    ans.AnswerText, | ||||||
|                                                    ans.Comment, |                                                    ans.Comment, | ||||||
|                                                    Questions = (from q in surveyQuestions where q.Id == ans.QuestionId select new { q.Id, q.QuestionNumber, q.CategoryId, q.Text }).SingleOrDefault(), |                                                    Questions = (from q in surveyQuestions where q.Id == ans.QuestionId select new { q.Id, q.QuestionNumber, q.CategoryId, q.Text }).SingleOrDefault(), | ||||||
| @ -588,6 +622,7 @@ namespace DamageAssesment.Api.Responses.Providers | |||||||
|                         _employee = new { employee.Id, employee.Name, employee.BirthDate, employee.Email, employee.OfficePhoneNumber }; |                         _employee = new { employee.Id, employee.Name, employee.BirthDate, employee.Email, employee.OfficePhoneNumber }; | ||||||
|                     } |                     } | ||||||
|                     var result = from r in surveyResonses |                     var result = from r in surveyResonses | ||||||
|  |                                  join loc in Locations on r.LocationId equals loc.Id | ||||||
|                                  select new |                                  select new | ||||||
|                                  { |                                  { | ||||||
|                                      r.Id, |                                      r.Id, | ||||||
| @ -595,16 +630,18 @@ namespace DamageAssesment.Api.Responses.Providers | |||||||
|                                      r.LocationId, |                                      r.LocationId, | ||||||
|                                      r.EmployeeId, |                                      r.EmployeeId, | ||||||
|                                      r.ClientDevice, |                                      r.ClientDevice, | ||||||
|                                      r.KeyAnswerResult, |                                    //  r.KeyAnswerResult, | ||||||
|                                      r.Longitute, |                                      loc.DataValue, | ||||||
|                                      r.Latitude, |                                      loc.Enrollment, | ||||||
|                                      Employee = _employee, |                                      loc.Longitute, | ||||||
|  |                                      loc.Latitude, | ||||||
|  |                                    //  Employee = _employee, | ||||||
|                                      answers = from ans in answers |                                      answers = from ans in answers | ||||||
|                                                where ans.SurveyResponseId == r.Id |                                                where ans.SurveyResponseId == r.Id | ||||||
|                                                select new |                                                select new | ||||||
|                                                { |                                                { | ||||||
|                                                    ans.Id, |                                                    ans.Id, | ||||||
|                                                    ans.QuestionId, |                                              //      ans.QuestionId, | ||||||
|                                                    ans.AnswerText, |                                                    ans.AnswerText, | ||||||
|                                                    ans.Comment, |                                                    ans.Comment, | ||||||
|                                                    Questions = (from q in questions where q.Id == ans.QuestionId select new { q.Id, q.QuestionNumber, q.CategoryId, q.Text }).SingleOrDefault(), |                                                    Questions = (from q in questions where q.Id == ans.QuestionId select new { q.Id, q.QuestionNumber, q.CategoryId, q.Text }).SingleOrDefault(), | ||||||
| @ -650,10 +687,12 @@ namespace DamageAssesment.Api.Responses.Providers | |||||||
|  |  | ||||||
|  |  | ||||||
|                 var answers = await answerServiceProvider.getAnswersAsync(); |                 var answers = await answerServiceProvider.getAnswersAsync(); | ||||||
|                 var questions = await questionServiceProvider.getQuestionsAsync(); |                 var questions = await questionServiceProvider.getQuestionsAsync(null); | ||||||
|                 var attachments = await attachmentServiceProvider.getAttachmentsAsync(); |                 var attachments = await attachmentServiceProvider.getAttachmentsAsync(); | ||||||
|  |  | ||||||
|  |                 var Locations = await locationServiceProvider.getLocationsAsync(); | ||||||
|                 var result = from r in surveyResonses |                 var result = from r in surveyResonses | ||||||
|  |                              join loc in Locations on r.LocationId equals loc.Id | ||||||
|                              select new |                              select new | ||||||
|                              { |                              { | ||||||
|                                  r.Id, |                                  r.Id, | ||||||
| @ -661,16 +700,18 @@ namespace DamageAssesment.Api.Responses.Providers | |||||||
|                                  r.LocationId, |                                  r.LocationId, | ||||||
|                                  r.EmployeeId, |                                  r.EmployeeId, | ||||||
|                                  r.ClientDevice, |                                  r.ClientDevice, | ||||||
|                                  r.KeyAnswerResult, |                                //  r.KeyAnswerResult, | ||||||
|                                  r.Longitute, |                                  loc.DataValue, | ||||||
|                                  r.Latitude, |                                  loc.Enrollment, | ||||||
|                                  Employee = employeeid != 0 ? _employee : (from e in employees where r.EmployeeId == e.Id select new { e.Id, e.Name, e.BirthDate, e.Email, e.OfficePhoneNumber }).SingleOrDefault(), |                                  loc.Longitute, | ||||||
|  |                                  loc.Latitude, | ||||||
|  |                                //  Employee = employeeid != 0 ? _employee : (from e in employees where r.EmployeeId == e.Id select new { e.Id, e.Name, e.BirthDate, e.Email, e.OfficePhoneNumber }).SingleOrDefault(), | ||||||
|                                  answers = from ans in answers |                                  answers = from ans in answers | ||||||
|                                            where ans.SurveyResponseId == r.Id |                                            where ans.SurveyResponseId == r.Id | ||||||
|                                            select new |                                            select new | ||||||
|                                            { |                                            { | ||||||
|                                                ans.Id, |                                                ans.Id, | ||||||
|                                                ans.QuestionId, |                                          //      ans.QuestionId, | ||||||
|                                                ans.AnswerText, |                                                ans.AnswerText, | ||||||
|                                                ans.Comment, |                                                ans.Comment, | ||||||
|                                                Questions = (from q in questions where q.Id == ans.QuestionId select new { q.Id, q.QuestionNumber, q.CategoryId, q.Text }).SingleOrDefault(), |                                                Questions = (from q in questions where q.Id == ans.QuestionId select new { q.Id, q.QuestionNumber, q.CategoryId, q.Text }).SingleOrDefault(), | ||||||
| @ -687,7 +728,136 @@ namespace DamageAssesment.Api.Responses.Providers | |||||||
|                 return null; |                 return null; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |         //Method to get All Survey Responses for excel export | ||||||
|  |         private async Task<List<object>> getAllSurveyResponsesExcelAsync(int surveyId, string language, bool isadmin) | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 if (string.IsNullOrEmpty(language)) language = "en"; | ||||||
|  |                 List<Db.SurveyResponse> surveyResonses; | ||||||
|  |                 surveyResonses = await surveyResponseDbContext.SurveyResponses.Where(a => a.SurveyId == surveyId).ToListAsync(); | ||||||
|  |                 var answers = await answerServiceProvider.getAnswersAsync(); | ||||||
|  |                 var Locations = await locationServiceProvider.getLocationsAsync(); | ||||||
|  |                 var regions = await regionServiceProvider.getRegionsAsync(); | ||||||
|  |                 var questions = await questionServiceProvider.getQuestionsAsync(language); | ||||||
|  |                 var categories = await questionServiceProvider.GetQuestionCategoriesAsync(language); | ||||||
|  |                 var attachments = await attachmentServiceProvider.getAttachmentsAsync(); | ||||||
|  |                 List<object> questionLists = new List<object>(); | ||||||
|  |                 var allques = from res in surveyResonses | ||||||
|  |                               join loc in Locations on res.LocationId equals loc.Id | ||||||
|  |                               join reg in regions on loc.RegionId equals reg.Id | ||||||
|  |                               join ans in answers on res.Id equals ans.SurveyResponseId | ||||||
|  |                               join q in questions on ans.QuestionId equals q.Id | ||||||
|  |                               join qc in categories on q.CategoryId equals qc.Id | ||||||
|  |                               select new | ||||||
|  |                               { | ||||||
|  |                                   responseId = res.Id, | ||||||
|  |                                   questionId = q.Id, | ||||||
|  |                                   QuestionNumber = q.QuestionNumber, | ||||||
|  |                                   Category = JsonSerializer.Deserialize<Dictionary<string, string>>(qc.Titles.ToString())[language], | ||||||
|  |                                   question = q.Text[language], | ||||||
|  |                                   answerId = ans.Id, | ||||||
|  |                                   AnswerText = ans.AnswerText, | ||||||
|  |                                   Comment = ans.Comment, | ||||||
|  |                                   Location = loc.LocationCode, | ||||||
|  |                                   school = loc.Name, | ||||||
|  |                                   Region = reg.Name, | ||||||
|  |                                   MC = loc.MaintenanceCenter, | ||||||
|  |                                   ResponseDate = res.CreatedDate, | ||||||
|  |                                   EmployeeId = res.EmployeeId, | ||||||
|  |                                   ClientDevice = res.ClientDevice, | ||||||
|  |                                   Attachments = attachments.Where(a => a.AnswerId == ans.Id).Select(a => a.FileName + "##" + a.URI).ToList() | ||||||
|  |                               }; | ||||||
|  |                 List<object> allresoponses = new List<object>(); | ||||||
|  |                 foreach (var item in allques) | ||||||
|  |                 { | ||||||
|  |  | ||||||
|  |                     List<string> ansattachments = item.Attachments.ToList(); | ||||||
|  |  | ||||||
|  |                     //// Initialize the attachment dictionary | ||||||
|  |                     //var attachmentsobject = new Dictionary<string, string>(); | ||||||
|  |                     //for (int i = 0; i < ansattachments.Count; i++) | ||||||
|  |                     //{ | ||||||
|  |                     //    attachmentsobject["Attachment"+(i+1).ToString()] = ansattachments[i]; | ||||||
|  |                     //} | ||||||
|  |  | ||||||
|  |  | ||||||
|  |                     string[] variables = new string[5]; | ||||||
|  |                     for (int i = 0; i < 5; i++) // Assuming you want to assign 5 values | ||||||
|  |                     { | ||||||
|  |                         if (i < ansattachments.Count()) | ||||||
|  |                         { | ||||||
|  |                             variables[i] = ansattachments[i]; | ||||||
|  |                         } | ||||||
|  |                         else | ||||||
|  |                         { | ||||||
|  |                             variables[i] = string.Empty; // or null, or any other default value | ||||||
|  |                         } | ||||||
|  |                     } | ||||||
|  |  | ||||||
|  |                     // Now, you can access the values using the variables | ||||||
|  |                     string att1 = variables[0], att2 = variables[1], att3 = variables[2], att4 = variables[3], att5 = variables[4]; | ||||||
|  |                     object response; | ||||||
|  |                     if (isadmin) | ||||||
|  |                     { | ||||||
|  |                         response = new | ||||||
|  |                         { | ||||||
|  |                             SurveyQuestion = item.question, | ||||||
|  |                             Answer = item.AnswerText, | ||||||
|  |                             Category = item.Category, | ||||||
|  |                             School = item.school, | ||||||
|  |                             Location = item.Location, | ||||||
|  |                             Region = item.Region, | ||||||
|  |                             MC = item.MC, | ||||||
|  |                             ResponseDate = item.ResponseDate.ToString(), | ||||||
|  |                             Notes = item.Comment, | ||||||
|  |                             Attachment1 = att1, | ||||||
|  |                             Attachment2 = att2, | ||||||
|  |                             Attachment3 = att3, | ||||||
|  |                             Attachment4 = att4, | ||||||
|  |                             Attachment5 = att5, | ||||||
|  |                             User = item.EmployeeId, | ||||||
|  |                             DeviceType = item.ClientDevice, | ||||||
|  |                             Reference = item.responseId | ||||||
|  |                         }; | ||||||
|  |                         // Add the attachment dictionary to the response object | ||||||
|  |                         // response = new { response, Attachments = attachments }; | ||||||
|  |                     } | ||||||
|  |                     else | ||||||
|  |                     { | ||||||
|  |                         response = new | ||||||
|  |                         { | ||||||
|  |                             SurveyQuestion = item.question, | ||||||
|  |                             Answer = item.AnswerText, | ||||||
|  |                             Category = item.Category, | ||||||
|  |                             School = item.school, | ||||||
|  |                             Location = item.Location, | ||||||
|  |                             Region = item.Region, | ||||||
|  |                             MC = item.MC, | ||||||
|  |                             ResponseDate = item.ResponseDate.ToString(), | ||||||
|  |                             Notes = item.Comment, | ||||||
|  |                             Attachment1 = att1, | ||||||
|  |                             Attachment2 = att2, | ||||||
|  |                             Attachment3 = att3, | ||||||
|  |                             Attachment4 = att4, | ||||||
|  |                             Attachment5 = att5 | ||||||
|  |                         }; | ||||||
|  |  | ||||||
|  |                         // Add the attachment dictionary to the response object | ||||||
|  |                         //  response = new { response, Attachments = attachments }; | ||||||
|  |                     } | ||||||
|  |                     allresoponses.Add(response); | ||||||
|  |                 } | ||||||
|  |                 return allresoponses; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |             } | ||||||
|  |             catch (Exception ex) | ||||||
|  |             { | ||||||
|  |                 logger?.LogError($"Exception Found : {ex.Message} - Ref: SurveyResponsesProvider.getSurveyResponseBySurveyIdAsync()"); | ||||||
|  |                 return null; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|         //Method to get Answers By Maintenance Center by surveyId |         //Method to get Answers By Maintenance Center by surveyId | ||||||
|         private async Task<dynamic> getResultsByMaintenanceCenterAsync(int surveyId, int employeeid) |         private async Task<dynamic> getResultsByMaintenanceCenterAsync(int surveyId, int employeeid) | ||||||
| @ -782,13 +952,19 @@ namespace DamageAssesment.Api.Responses.Providers | |||||||
|                         _employee = new { employee.Id, employee.Name, employee.BirthDate, employee.Email, employee.OfficePhoneNumber }; |                         _employee = new { employee.Id, employee.Name, employee.BirthDate, employee.Email, employee.OfficePhoneNumber }; | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|  |                 surveyResonses = surveyResonses | ||||||
|  |                 .OrderByDescending(obj => obj.Id) | ||||||
|  |                 .GroupBy(obj => new { obj.SurveyId,  obj.LocationId }) //obj.EmployeeId, | ||||||
|  |                 .Select(group => group.FirstOrDefault())  // or .FirstOrDefault() if you want to handle empty groups | ||||||
|  |                 .ToList(); | ||||||
|                 var answers = await answerServiceProvider.getAnswersAsync(); |                 var answers = await answerServiceProvider.getAnswersAsync(); | ||||||
|                 var questions = await questionServiceProvider.getQuestionsAsync(); |                 var questions = await questionServiceProvider.getQuestionsAsync(null); | ||||||
|                 var surveyQuestions = from q in questions where q.SurveyId == surveyId select q; |                 var surveyQuestions = from q in questions where q.SurveyId == surveyId select q; | ||||||
|                 var attachments = await attachmentServiceProvider.getAttachmentsAsync(); |                 var attachments = await attachmentServiceProvider.getAttachmentsAsync(); | ||||||
|  |  | ||||||
|  |                 var Locations = await locationServiceProvider.getLocationsAsync(); | ||||||
|                 var result = from r in surveyResonses |                 var result = from r in surveyResonses | ||||||
|  |                              join loc in Locations on r.LocationId equals loc.Id | ||||||
|                              select new |                              select new | ||||||
|                              { |                              { | ||||||
|                                  r.Id, |                                  r.Id, | ||||||
| @ -796,16 +972,18 @@ namespace DamageAssesment.Api.Responses.Providers | |||||||
|                                  r.LocationId, |                                  r.LocationId, | ||||||
|                                  r.EmployeeId, |                                  r.EmployeeId, | ||||||
|                                  r.ClientDevice, |                                  r.ClientDevice, | ||||||
|                                  r.KeyAnswerResult, |                                //  r.KeyAnswerResult, | ||||||
|                                  r.Longitute, |                                  loc.DataValue, | ||||||
|                                  r.Latitude, |                                  loc.Enrollment, | ||||||
|                                  Employee = employeeid != 0 ? _employee : (from e in employees where r.EmployeeId == e.Id select new { e.Id, e.Name, e.BirthDate, e.Email, e.OfficePhoneNumber }).SingleOrDefault(), |                                  loc.Longitute, | ||||||
|  |                                  loc.Latitude, | ||||||
|  |                                //  Employee = employeeid != 0 ? _employee : (from e in employees where r.EmployeeId == e.Id select new { e.Id, e.Name, e.BirthDate, e.Email, e.OfficePhoneNumber }).SingleOrDefault(), | ||||||
|                                  answers = from ans in answers |                                  answers = from ans in answers | ||||||
|                                            where ans.SurveyResponseId == r.Id |                                            where ans.SurveyResponseId == r.Id | ||||||
|  |  | ||||||
|                                            select new |                                            select new | ||||||
|                                            { |                                            { | ||||||
|                                                ans.QuestionId, |                                           //     ans.QuestionId, | ||||||
|                                                ans.Id, |                                                ans.Id, | ||||||
|                                                ans.AnswerText, |                                                ans.AnswerText, | ||||||
|                                                ans.Comment, |                                                ans.Comment, | ||||||
| @ -849,13 +1027,18 @@ namespace DamageAssesment.Api.Responses.Providers | |||||||
|                         _employee = new { employee.Id, employee.Name, employee.BirthDate, employee.Email, employee.OfficePhoneNumber }; |                         _employee = new { employee.Id, employee.Name, employee.BirthDate, employee.Email, employee.OfficePhoneNumber }; | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|  |                 surveyResponses = surveyResponses | ||||||
|  |                 .OrderByDescending(obj => obj.Id) | ||||||
|  |                 .GroupBy(obj => new { obj.SurveyId, obj.LocationId })//, obj.EmployeeId | ||||||
|  |                 .Select(group => group.FirstOrDefault())  // or .FirstOrDefault() if you want to handle empty groups | ||||||
|  |                 .ToList(); | ||||||
|                 //var surveyResponses = await surveyResponseDbContext.Responses.Where(x => x.SurveyId == survey.Id).ToListAsync(); |                 //var surveyResponses = await surveyResponseDbContext.Responses.Where(x => x.SurveyId == survey.Id).ToListAsync(); | ||||||
|                 // var employees = await employeeServiceProvider.getEmployeesAsync(); |                 // var employees = await employeeServiceProvider.getEmployeesAsync(); | ||||||
|                 var answers = await answerServiceProvider.getAnswersAsync(); |                 var answers = await answerServiceProvider.getAnswersAsync(); | ||||||
|                 var attachments = await attachmentServiceProvider.getAttachmentsAsync(); |                 var attachments = await attachmentServiceProvider.getAttachmentsAsync(); | ||||||
|  |                 var Locations = await locationServiceProvider.getLocationsAsync(); | ||||||
|                 var result = from r in surveyResponses |                 var result = from r in surveyResponses | ||||||
|  |                              join loc in Locations on r.LocationId equals loc.Id | ||||||
|                              select new |                              select new | ||||||
|                              { |                              { | ||||||
|                                  r.Id, |                                  r.Id, | ||||||
| @ -863,10 +1046,12 @@ namespace DamageAssesment.Api.Responses.Providers | |||||||
|                                  r.LocationId, |                                  r.LocationId, | ||||||
|                                  r.EmployeeId, |                                  r.EmployeeId, | ||||||
|                                  r.ClientDevice, |                                  r.ClientDevice, | ||||||
|                                  r.KeyAnswerResult, |                              //    r.KeyAnswerResult, | ||||||
|                                  r.Longitute, |                                  loc.DataValue, | ||||||
|                                  r.Latitude, |                                  loc.Enrollment, | ||||||
|                                  Employee = employeeid != 0 ? _employee : (from e in employees where r.EmployeeId == e.Id select new { e.Id, e.Name, e.BirthDate, e.Email, e.OfficePhoneNumber }).SingleOrDefault(), |                                  loc.Longitute, | ||||||
|  |                                  loc.Latitude, | ||||||
|  |                                //  Employee = employeeid != 0 ? _employee : (from e in employees where r.EmployeeId == e.Id select new { e.Id, e.Name, e.BirthDate, e.Email, e.OfficePhoneNumber }).SingleOrDefault(), | ||||||
|                                  answers = from ans in answers |                                  answers = from ans in answers | ||||||
|                                            where ans.SurveyResponseId == r.Id |                                            where ans.SurveyResponseId == r.Id | ||||||
|                                            && ans.QuestionId == question.Id |                                            && ans.QuestionId == question.Id | ||||||
| @ -874,7 +1059,7 @@ namespace DamageAssesment.Api.Responses.Providers | |||||||
|  |  | ||||||
|                                            select new |                                            select new | ||||||
|                                            { |                                            { | ||||||
|                                                ans.QuestionId, |                                               // ans.QuestionId, | ||||||
|                                                AnswerId = ans.Id, |                                                AnswerId = ans.Id, | ||||||
|                                                ans.AnswerText, |                                                ans.AnswerText, | ||||||
|                                                ans.Comment, |                                                ans.Comment, | ||||||
|  | |||||||
| @ -10,10 +10,12 @@ namespace DamageAssesment.Api.Responses.Services | |||||||
|         { |         { | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         public async Task<List<Question>> getQuestionsAsync() |         public async Task<List<Question>> getQuestionsAsync(string language) | ||||||
|         { |         { | ||||||
|             try |             try | ||||||
|             { |             { | ||||||
|  |                 if (!string.IsNullOrEmpty(language)) | ||||||
|  |                     url = url + "/" + language; | ||||||
|                 var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null); |                 var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null); | ||||||
|                 var questions = JsonConvert.DeserializeObject<List<Question>>(responseJsonString); |                 var questions = JsonConvert.DeserializeObject<List<Question>>(responseJsonString); | ||||||
|  |  | ||||||
| @ -27,6 +29,27 @@ namespace DamageAssesment.Api.Responses.Services | |||||||
|                 return new List<Question>(); |                 return new List<Question>(); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |         public async Task<List<QuestionCategory>> GetQuestionCategoriesAsync(string? language) | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 url = urlBase + configuration.GetValue<string>("RessourceSettings:QuestionCategory"); | ||||||
|  |                  | ||||||
|  |                 if (!string.IsNullOrEmpty(language)) | ||||||
|  |                     url = url + "/" + language; | ||||||
|  |                 var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null); | ||||||
|  |                 var questions = JsonConvert.DeserializeObject<List<QuestionCategory>>(responseJsonString); | ||||||
|  |  | ||||||
|  |                 if (questions == null || !questions.Any()) | ||||||
|  |                     return new List<QuestionCategory>(); | ||||||
|  |                 else return questions; | ||||||
|  |             } | ||||||
|  |             catch (Exception ex) | ||||||
|  |             { | ||||||
|  |                 logger?.LogError($"Exception Found : {ex.Message} - Ref: QuestionServiceProvider.GetQuestionCategoriesAsync()"); | ||||||
|  |                 return new List<QuestionCategory>(); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|          |          | ||||||
|         public async Task<List<SurveyQuestions>> getSurveyQuestionsAsync(int surveyId) |         public async Task<List<SurveyQuestions>> getSurveyQuestionsAsync(int surveyId) | ||||||
|         { |         { | ||||||
|  | |||||||
| @ -31,6 +31,7 @@ | |||||||
|     "EmployeeById": "/employees/{0}", |     "EmployeeById": "/employees/{0}", | ||||||
|     "Question": "/questions", |     "Question": "/questions", | ||||||
|     "QuestionById": "/questions/{0}", |     "QuestionById": "/questions/{0}", | ||||||
|  |     "QuestionCategory": "/questions/categories", | ||||||
|     "SurveyQuestion": "/questions/bysurvey/{0}", |     "SurveyQuestion": "/questions/bysurvey/{0}", | ||||||
|     "Survey": "/surveys", |     "Survey": "/surveys", | ||||||
|     "SurveyById": "/surveys/{0}", |     "SurveyById": "/surveys/{0}", | ||||||
| @ -39,5 +40,10 @@ | |||||||
|     "AnswerByResponse": "/answers/byresponse/{0}", |     "AnswerByResponse": "/answers/byresponse/{0}", | ||||||
|     "Location": "/locations", |     "Location": "/locations", | ||||||
|     "Region": "/regions" |     "Region": "/regions" | ||||||
|  |   }, | ||||||
|  |   "ConnectionStrings": { | ||||||
|  |     //"SurveyResponseConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;" | ||||||
|  |      //"ResponsesConnection": "Server=DESKTOP-OF5DPLQ\\SQLEXPRESS;Database=da_survey_dev;Trusted_Connection=True;TrustServerCertificate=True;" | ||||||
|  |     "ResponsesConnection": "Server=207.180.248.35;Database=da_survey_dev;User Id=sa;Password=YourStrongPassw0rd;TrustServerCertificate=True;" | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  | |||||||
| @ -0,0 +1,55 @@ | |||||||
|  | // <auto-generated /> | ||||||
|  | using DamageAssesment.Api.SurveyResponses.Db; | ||||||
|  | using Microsoft.EntityFrameworkCore; | ||||||
|  | using Microsoft.EntityFrameworkCore.Infrastructure; | ||||||
|  | using Microsoft.EntityFrameworkCore.Metadata; | ||||||
|  | using Microsoft.EntityFrameworkCore.Migrations; | ||||||
|  | using Microsoft.EntityFrameworkCore.Storage.ValueConversion; | ||||||
|  |  | ||||||
|  | #nullable disable | ||||||
|  |  | ||||||
|  | namespace DamageAssesment.Api.SurveyResponses.Migrations | ||||||
|  | { | ||||||
|  |     [DbContext(typeof(SurveyResponseDbContext))] | ||||||
|  |     [Migration("20230817221348_InitialSurveyResponse")] | ||||||
|  |     partial class InitialSurveyResponse | ||||||
|  |     { | ||||||
|  |         /// <inheritdoc /> | ||||||
|  |         protected override void BuildTargetModel(ModelBuilder modelBuilder) | ||||||
|  |         { | ||||||
|  | #pragma warning disable 612, 618 | ||||||
|  |             modelBuilder | ||||||
|  |                 .HasAnnotation("ProductVersion", "7.0.9") | ||||||
|  |                 .HasAnnotation("Relational:MaxIdentifierLength", 128); | ||||||
|  |  | ||||||
|  |             SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); | ||||||
|  |  | ||||||
|  |             modelBuilder.Entity("DamageAssesment.Api.SurveyResponses.Db.SurveyResponse", b => | ||||||
|  |                 { | ||||||
|  |                     b.Property<int>("Id") | ||||||
|  |                         .ValueGeneratedOnAdd() | ||||||
|  |                         .HasColumnType("int"); | ||||||
|  |  | ||||||
|  |                     SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id")); | ||||||
|  |  | ||||||
|  |                     b.Property<string>("EmployeeId") | ||||||
|  |                         .IsRequired() | ||||||
|  |                         .HasMaxLength(6) | ||||||
|  |                         .HasColumnType("nvarchar(6)"); | ||||||
|  |  | ||||||
|  |                     b.Property<string>("LocationId") | ||||||
|  |                         .IsRequired() | ||||||
|  |                         .HasMaxLength(4) | ||||||
|  |                         .HasColumnType("nvarchar(4)"); | ||||||
|  |  | ||||||
|  |                     b.Property<int>("SurveyId") | ||||||
|  |                         .HasColumnType("int"); | ||||||
|  |  | ||||||
|  |                     b.HasKey("Id"); | ||||||
|  |  | ||||||
|  |                     b.ToTable("SurveyResponses"); | ||||||
|  |                 }); | ||||||
|  | #pragma warning restore 612, 618 | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -0,0 +1,36 @@ | |||||||
|  | using Microsoft.EntityFrameworkCore.Migrations; | ||||||
|  |  | ||||||
|  | #nullable disable | ||||||
|  |  | ||||||
|  | namespace DamageAssesment.Api.SurveyResponses.Migrations | ||||||
|  | { | ||||||
|  |     /// <inheritdoc /> | ||||||
|  |     public partial class InitialSurveyResponse : Migration | ||||||
|  |     { | ||||||
|  |         /// <inheritdoc /> | ||||||
|  |         protected override void Up(MigrationBuilder migrationBuilder) | ||||||
|  |         { | ||||||
|  |             migrationBuilder.CreateTable( | ||||||
|  |                 name: "SurveyResponses", | ||||||
|  |                 columns: table => new | ||||||
|  |                 { | ||||||
|  |                     Id = table.Column<int>(type: "int", nullable: false) | ||||||
|  |                         .Annotation("SqlServer:Identity", "1, 1"), | ||||||
|  |                     SurveyId = table.Column<int>(type: "int", nullable: false), | ||||||
|  |                     LocationId = table.Column<string>(type: "nvarchar(4)", maxLength: 4, nullable: false), | ||||||
|  |                     EmployeeId = table.Column<string>(type: "nvarchar(6)", maxLength: 6, nullable: false) | ||||||
|  |                 }, | ||||||
|  |                 constraints: table => | ||||||
|  |                 { | ||||||
|  |                     table.PrimaryKey("PK_SurveyResponses", x => x.Id); | ||||||
|  |                 }); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         /// <inheritdoc /> | ||||||
|  |         protected override void Down(MigrationBuilder migrationBuilder) | ||||||
|  |         { | ||||||
|  |             migrationBuilder.DropTable( | ||||||
|  |                 name: "SurveyResponses"); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -0,0 +1,52 @@ | |||||||
|  | // <auto-generated /> | ||||||
|  | using DamageAssesment.Api.SurveyResponses.Db; | ||||||
|  | using Microsoft.EntityFrameworkCore; | ||||||
|  | using Microsoft.EntityFrameworkCore.Infrastructure; | ||||||
|  | using Microsoft.EntityFrameworkCore.Metadata; | ||||||
|  | using Microsoft.EntityFrameworkCore.Storage.ValueConversion; | ||||||
|  |  | ||||||
|  | #nullable disable | ||||||
|  |  | ||||||
|  | namespace DamageAssesment.Api.SurveyResponses.Migrations | ||||||
|  | { | ||||||
|  |     [DbContext(typeof(SurveyResponseDbContext))] | ||||||
|  |     partial class SurveyResponseDbContextModelSnapshot : 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.SurveyResponses.Db.SurveyResponse", b => | ||||||
|  |                 { | ||||||
|  |                     b.Property<int>("Id") | ||||||
|  |                         .ValueGeneratedOnAdd() | ||||||
|  |                         .HasColumnType("int"); | ||||||
|  |  | ||||||
|  |                     SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id")); | ||||||
|  |  | ||||||
|  |                     b.Property<string>("EmployeeId") | ||||||
|  |                         .IsRequired() | ||||||
|  |                         .HasMaxLength(6) | ||||||
|  |                         .HasColumnType("nvarchar(6)"); | ||||||
|  |  | ||||||
|  |                     b.Property<string>("LocationId") | ||||||
|  |                         .IsRequired() | ||||||
|  |                         .HasMaxLength(4) | ||||||
|  |                         .HasColumnType("nvarchar(4)"); | ||||||
|  |  | ||||||
|  |                     b.Property<int>("SurveyId") | ||||||
|  |                         .HasColumnType("int"); | ||||||
|  |  | ||||||
|  |                     b.HasKey("Id"); | ||||||
|  |  | ||||||
|  |                     b.ToTable("SurveyResponses"); | ||||||
|  |                 }); | ||||||
|  | #pragma warning restore 612, 618 | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -34,7 +34,55 @@ namespace DamageAssesment.Api.Surveys.Test | |||||||
|  |  | ||||||
|             Assert.Equal(204, result.StatusCode); |             Assert.Equal(204, result.StatusCode); | ||||||
|         } |         } | ||||||
|  |         [Fact(DisplayName = "Get active Surveys - Ok case")] | ||||||
|  |         public async Task GetActiveSurveysAsync_ShouldReturnStatusCode200() | ||||||
|  |         { | ||||||
|  |             var mockSurveyService = new Mock<ISurveyProvider>(); | ||||||
|  |             var mockResponse = await MockData.getOkResponse(); | ||||||
|  |             mockSurveyService.Setup(service => service.GetActiveSurveysAsync(true,null)).ReturnsAsync(mockResponse); | ||||||
|  |  | ||||||
|  |             var surveyProvider = new SurveysController(mockSurveyService.Object); | ||||||
|  |             var result = (OkObjectResult)await surveyProvider.GetActiveSurveysAsync(null); | ||||||
|  |  | ||||||
|  |             Assert.Equal(200, result.StatusCode); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         [Fact(DisplayName = "Get active Surveys - NoContent Case")] | ||||||
|  |         public async Task GetActiveSurveysAsync_ShouldReturnStatusCode204() | ||||||
|  |         { | ||||||
|  |             var mockSurveyService = new Mock<ISurveyProvider>(); | ||||||
|  |             var mockResponse = await MockData.getNoContentResponse(); | ||||||
|  |             mockSurveyService.Setup(service => service.GetActiveSurveysAsync(true,null)).ReturnsAsync(mockResponse); | ||||||
|  |  | ||||||
|  |             var surveyProvider = new SurveysController(mockSurveyService.Object); | ||||||
|  |             var result = (NoContentResult)await surveyProvider.GetActiveSurveysAsync(null); | ||||||
|  |  | ||||||
|  |             Assert.Equal(204, result.StatusCode); | ||||||
|  |         } | ||||||
|  |         [Fact(DisplayName = "Get inactive Surveys - Ok case")] | ||||||
|  |         public async Task GetInActiveSurveysAsync_ShouldReturnStatusCode200() | ||||||
|  |         { | ||||||
|  |             var mockSurveyService = new Mock<ISurveyProvider>(); | ||||||
|  |             var mockResponse = await MockData.getOkResponse(); | ||||||
|  |             mockSurveyService.Setup(service => service.GetActiveSurveysAsync(false, null)).ReturnsAsync(mockResponse); | ||||||
|  |  | ||||||
|  |             var surveyProvider = new SurveysController(mockSurveyService.Object); | ||||||
|  |             var result = (OkObjectResult)await surveyProvider.GetInActiveSurveysAsync(null); | ||||||
|  |  | ||||||
|  |             Assert.Equal(200, result.StatusCode); | ||||||
|  |         } | ||||||
|  |         [Fact(DisplayName = "Get in active Surveys - NoContent Case")] | ||||||
|  |         public async Task GetInActiveSurveysAsync_ShouldReturnStatusCode204() | ||||||
|  |         { | ||||||
|  |             var mockSurveyService = new Mock<ISurveyProvider>(); | ||||||
|  |             var mockResponse = await MockData.getNoContentResponse(); | ||||||
|  |             mockSurveyService.Setup(service => service.GetActiveSurveysAsync(false, null)).ReturnsAsync(mockResponse); | ||||||
|  |  | ||||||
|  |             var surveyProvider = new SurveysController(mockSurveyService.Object); | ||||||
|  |             var result = (NoContentResult)await surveyProvider.GetInActiveSurveysAsync(null); | ||||||
|  |  | ||||||
|  |             Assert.Equal(204, result.StatusCode); | ||||||
|  |         } | ||||||
|         [Fact(DisplayName = "Get Survey by Id - Ok case")] |         [Fact(DisplayName = "Get Survey by Id - Ok case")] | ||||||
|         public async Task GetSurveyAsync_ShouldReturnStatusCode200() |         public async Task GetSurveyAsync_ShouldReturnStatusCode200() | ||||||
|         { |         { | ||||||
|  | |||||||
| @ -27,7 +27,36 @@ namespace DamageAssesment.Api.Surveys.Controllers | |||||||
|             } |             } | ||||||
|             return NoContent(); |             return NoContent(); | ||||||
|         } |         } | ||||||
|  |         /// <summary> | ||||||
|  |         /// GET request for retrieving all active surveys. | ||||||
|  |         /// </summary> | ||||||
|  |         [Route("surveys/active")] | ||||||
|  |         [Route("surveys/active/{language:alpha}")] | ||||||
|  |         [HttpGet] | ||||||
|  |         public async Task<ActionResult> GetActiveSurveysAsync(string? language) | ||||||
|  |         { | ||||||
|  |             var result = await this.surveyProvider.GetActiveSurveysAsync(true,language); | ||||||
|  |             if (result.IsSuccess) | ||||||
|  |             { | ||||||
|  |                 return Ok(result.Surveys); | ||||||
|  |             } | ||||||
|  |             return NoContent(); | ||||||
|  |         } | ||||||
|  |         /// <summary> | ||||||
|  |         /// GET request for retrieving all inactive surveys. | ||||||
|  |         /// </summary> | ||||||
|  |         [Route("surveys/inactive")] | ||||||
|  |         [Route("surveys/inactive/{language:alpha}")] | ||||||
|  |         [HttpGet] | ||||||
|  |         public async Task<ActionResult> GetInActiveSurveysAsync(string? language) | ||||||
|  |         { | ||||||
|  |             var result = await this.surveyProvider.GetActiveSurveysAsync(false, language); | ||||||
|  |             if (result.IsSuccess) | ||||||
|  |             { | ||||||
|  |                 return Ok(result.Surveys); | ||||||
|  |             } | ||||||
|  |             return NoContent(); | ||||||
|  |         } | ||||||
|         /// <summary> |         /// <summary> | ||||||
|         /// GET request for retrieving surveys by ID. |         /// GET request for retrieving surveys by ID. | ||||||
|         /// </summary> |         /// </summary> | ||||||
|  | |||||||
| @ -11,6 +11,17 @@ | |||||||
|  |  | ||||||
|   <ItemGroup> |   <ItemGroup> | ||||||
|     <PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="12.0.1" /> |     <PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="12.0.1" /> | ||||||
|  |     <PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.9" /> | ||||||
|  |     <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="7.0.9"> | ||||||
|  |       <PrivateAssets>all</PrivateAssets> | ||||||
|  |       <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> | ||||||
|  |     </PackageReference> | ||||||
|  |     <PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="7.0.9" /> | ||||||
|  |     <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="7.0.9" /> | ||||||
|  |     <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="7.0.9"> | ||||||
|  |       <PrivateAssets>all</PrivateAssets> | ||||||
|  |       <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> | ||||||
|  |     </PackageReference> | ||||||
|     <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.21" /> |     <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.21" /> | ||||||
|     <PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.5" /> |     <PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.5" /> | ||||||
|     <PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="7.0.5" /> |     <PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="7.0.5" /> | ||||||
|  | |||||||
| @ -3,6 +3,7 @@ using System.ComponentModel.DataAnnotations.Schema; | |||||||
|  |  | ||||||
| namespace DamageAssesment.Api.Surveys.Db | namespace DamageAssesment.Api.Surveys.Db | ||||||
| { | { | ||||||
|  |     [Table("Surveys")] | ||||||
|     public class Survey |     public class Survey | ||||||
|     { |     { | ||||||
|         [Key] |         [Key] | ||||||
| @ -12,9 +13,9 @@ namespace DamageAssesment.Api.Surveys.Db | |||||||
|  |  | ||||||
|         public bool IsEnabled { get; set; } |         public bool IsEnabled { get; set; } | ||||||
|  |  | ||||||
|         public DateTime StartDate { get; set; } |         public DateTime? StartDate { get; set; } | ||||||
|  |  | ||||||
|         public DateTime EndDate { get; set; } |         public DateTime? EndDate { get; set; } | ||||||
|  |  | ||||||
|         public DateTime CreatedDate { get; set; } = DateTime.Now; |         public DateTime CreatedDate { get; set; } = DateTime.Now; | ||||||
|         /* |         /* | ||||||
|  | |||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user
	