diff --git a/.vs/survey-beta/config/applicationhost.config b/.vs/survey-beta/config/applicationhost.config
new file mode 100644
index 0000000..cdd2df8
--- /dev/null
+++ b/.vs/survey-beta/config/applicationhost.config
@@ -0,0 +1,1026 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/survey-beta/Controllers/AnalyticsController.cs b/survey-beta/Controllers/AnalyticsController.cs
index 72fbdce..5e9e4e8 100644
--- a/survey-beta/Controllers/AnalyticsController.cs
+++ b/survey-beta/Controllers/AnalyticsController.cs
@@ -24,9 +24,9 @@ namespace survey_beta.Controllers
}
[HttpGet("export/{surveyId}")]
- public IActionResult ExportSurveyData(string surveyId)
+ public async Task ExportSurveyData(string surveyId)
{
- return _analyticsServices.ExportSurveyDataToCsv(surveyId);
+ return await _analyticsServices.ExportResponsesToCsv(surveyId);
}
}
}
\ No newline at end of file
diff --git a/survey-beta/Controllers/ResponsesController.cs b/survey-beta/Controllers/ResponsesController.cs
index 51cd30e..9187102 100644
--- a/survey-beta/Controllers/ResponsesController.cs
+++ b/survey-beta/Controllers/ResponsesController.cs
@@ -1,40 +1,44 @@
-using Microsoft.AspNetCore.Http;
-using Microsoft.AspNetCore.Mvc;
+using Microsoft.AspNetCore.Mvc;
using survey_beta.DTOs.Response;
using survey_beta.Models;
+using System;
+using System.Threading.Tasks;
namespace survey_beta.Controllers
{
[Route("api/[controller]")]
[ApiController]
- public class ResponsesController : ControllerBase
+ public class ResponseController : ControllerBase
{
private readonly ResponsesService _responsesService;
- public ResponsesController(ResponsesService responsesService)
+ public ResponseController(ResponsesService responsesService)
{
_responsesService = responsesService;
}
[HttpPost("add")]
- public IActionResult AddResponse([FromBody] ResponseDto request)
+ public async Task CreateResponse([FromBody] ResponseDto request)
{
try
{
- _responsesService.AddResponse(request);
- return Ok("Response added successfully.");
+ await _responsesService.AddResponseAsync(request);
+ return Ok(new { message = "Response added successfully." });
}
catch (Exception ex)
{
- return BadRequest(new { message = ex.Message });
+ return BadRequest(new { error = ex.Message });
}
}
[HttpGet("survey/{surveyId}")]
- public IActionResult GetSurveyResponses(string surveyId)
+ public async Task GetSurveyResponses(string surveyId)
{
- var responses = _responsesService.GetSurveyResponses(surveyId);
- if (responses == null || responses.Count == 0) return NotFound("No responses found for this survey.");
+ var responses = await _responsesService.GetSurveyResponsesAsync(surveyId);
+ if (responses == null || responses.Count == 0)
+ {
+ return NotFound(new { message = "No responses found for this survey." });
+ }
return Ok(responses);
}
}
-}
\ No newline at end of file
+}
diff --git a/survey-beta/Controllers/SurveyController.cs b/survey-beta/Controllers/SurveyController.cs
index 6587a64..2949ee8 100644
--- a/survey-beta/Controllers/SurveyController.cs
+++ b/survey-beta/Controllers/SurveyController.cs
@@ -1,4 +1,5 @@
-using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNet.Identity;
+using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using survey_beta.DTOs.Create;
@@ -14,15 +15,22 @@ using System.Threading.Tasks;
public class SurveyController : ControllerBase
{
private readonly SurveyService _surveyService;
- private readonly UserManager _userManager;
+ private readonly Microsoft.AspNetCore.Identity.UserManager _userManager;
- public SurveyController(SurveyService surveyService, UserManager userManager)
+ public SurveyController(SurveyService surveyService, Microsoft.AspNetCore.Identity.UserManager userManager)
{
_surveyService = surveyService;
_userManager = userManager;
}
- [HttpGet("{id}")]
+ [HttpGet("GetAll")]
+ public async Task GetAllSurveys([FromQuery] string id = null)
+ {
+ var surveys = await _surveyService.GetAllSurveysAsync(id);
+ return Ok(surveys);
+ }
+
+ [HttpGet("GetSurveyById{id}")]
public async Task GetById(string id)
{
var userId = _userManager.GetUserId(User);
@@ -50,23 +58,17 @@ public class SurveyController : ControllerBase
return Ok(result);
}
- //[Authorize]
- [HttpPost]
- public async Task> CreateSurvey([FromBody] CreateSurveyDto request)
+ [HttpPost("Create-Survey")]
+ // [Authorize]
+ public async Task CreateSurvey([FromBody] CreateSurveyDto request)
{
- try
- {
- var survey = await _surveyService.CreateSurveyAsync(request);
- return CreatedAtAction(nameof(GetById), new { id = survey.Id }, survey);
- }
- catch (Exception ex)
- {
- return BadRequest(new { message = ex.Message });
- }
+ var userId = _userManager.GetUserId(User);
+ var survey = await _surveyService.CreateSurveyAsync(request, userId);
+ return Ok(survey);
}
//[Authorize]
- [HttpPut]
+ [HttpPut("EditSurvey{id}")]
public async Task UpdateSurvey([FromBody] UpdateSurveyDto request)
{
var success = await _surveyService.UpdateSurveyAsync(request);
@@ -75,7 +77,7 @@ public class SurveyController : ControllerBase
}
//[Authorize]
- [HttpPatch("publish/{id}")]
+ [HttpPatch("publish-Survey/{id}")]
public async Task PublishSurvey(string id)
{
var success = await _surveyService.PublishSurveyAsync(id);
@@ -84,7 +86,7 @@ public class SurveyController : ControllerBase
}
//[Authorize]
- [HttpPatch("unpublish/{id}")]
+ [HttpPatch("unpublish-Survey/{id}")]
public async Task UnpublishSurvey(string id)
{
var success = await _surveyService.UnpublishSurveyAsync(id);
@@ -93,7 +95,7 @@ public class SurveyController : ControllerBase
}
//[Authorize]
- [HttpDelete("{id}")]
+ [HttpDelete("Delete-Survey{id}")]
public async Task DeleteSurvey(string id)
{
var success = await _surveyService.DeleteSurveyAsync(id);
diff --git a/survey-beta/DTOs/Create/CreateQuestionDto.cs b/survey-beta/DTOs/Create/CreateQuestionDto.cs
index 73d6b50..bdc0a65 100644
--- a/survey-beta/DTOs/Create/CreateQuestionDto.cs
+++ b/survey-beta/DTOs/Create/CreateQuestionDto.cs
@@ -6,7 +6,7 @@ namespace survey_beta.DTOs.Create
public class CreateQuestionDto
{
public string Content { get; set; }
- public string SurveyId { get; set; }
+ //public string SurveyId { get; set; }
public List Choices { get; set; }
}
diff --git a/survey-beta/DTOs/Create/CreateSurveyDto.cs b/survey-beta/DTOs/Create/CreateSurveyDto.cs
index c60c16f..b3ca3e6 100644
--- a/survey-beta/DTOs/Create/CreateSurveyDto.cs
+++ b/survey-beta/DTOs/Create/CreateSurveyDto.cs
@@ -9,7 +9,7 @@ namespace survey_beta.DTOs.Create
public string Description { get; set; }
public string Category { get; set; }
public DateTime ExpirationDate { get; set; }
-
+ public bool IsPublished { get; set; }
public List Questions { get; set; }
}
}
diff --git a/survey-beta/DTOs/Default/AnswerDto.cs b/survey-beta/DTOs/Default/AnswerDto.cs
index 09debf4..deff6e2 100644
--- a/survey-beta/DTOs/Default/AnswerDto.cs
+++ b/survey-beta/DTOs/Default/AnswerDto.cs
@@ -3,8 +3,7 @@
public class AnswerDto
{
public string Id { get; set; } = Guid.NewGuid().ToString();
- public string Question { get; set; }
- public string AnswerText { get; set; }
+ public string QuestionId { get; set; }
public string ResponseId { get; set; }
}
}
diff --git a/survey-beta/DTOs/Default/ChoiceDto.cs b/survey-beta/DTOs/Default/ChoiceDto.cs
index fad381c..764908b 100644
--- a/survey-beta/DTOs/Default/ChoiceDto.cs
+++ b/survey-beta/DTOs/Default/ChoiceDto.cs
@@ -8,5 +8,6 @@ namespace survey_beta.DTOs.Default
public string Letter { get; set; }
public string Content { get; set; }
public string QuestionId { get; set; }
+ public bool IsCorrect { get; set; }
}
}
diff --git a/survey-beta/DTOs/Default/QuestionDto.cs b/survey-beta/DTOs/Default/QuestionDto.cs
index 4b919ec..d109cee 100644
--- a/survey-beta/DTOs/Default/QuestionDto.cs
+++ b/survey-beta/DTOs/Default/QuestionDto.cs
@@ -5,6 +5,8 @@
public string Id { get; set; } = Guid.NewGuid().ToString();
public string Content { get; set; }
public string SurveyId { get; set; }
- public List Choices { get; set; }
+ public string QuestionType { get; set; }
+ public string QuestionId { get; set; }
+ public IEnumerable Choices { get; set; }
}
}
diff --git a/survey-beta/DTOs/Default/ResponseDto.cs b/survey-beta/DTOs/Default/ResponseDto.cs
index dad8c85..332371f 100644
--- a/survey-beta/DTOs/Default/ResponseDto.cs
+++ b/survey-beta/DTOs/Default/ResponseDto.cs
@@ -1,12 +1,11 @@
-namespace survey_beta.DTOs.Default
-{
- public class ResponseDto
- {
- public string Id { get; set; } = Guid.NewGuid().ToString();
- public string IpAddress { get; set; }
- public string SurveyId { get; set; }
- public string Answer { get; set; }
- public DateTime CreatedAt { get; set; }
+using survey_beta.DTOs.Default;
- }
-}
+public class ResponseDto
+{
+ public string Id { get; set; }
+ public string SurveyId { get; set; }
+ public string Response { get; set; }
+ public string ResponseContent { get; set; }
+ public string? IpAddress { get; set; }
+ public ICollection Answers { get; set; }
+}
\ No newline at end of file
diff --git a/survey-beta/DTOs/Default/SurveyDto.cs b/survey-beta/DTOs/Default/SurveyDto.cs
index 8a4a73b..2d8cb9b 100644
--- a/survey-beta/DTOs/Default/SurveyDto.cs
+++ b/survey-beta/DTOs/Default/SurveyDto.cs
@@ -2,11 +2,12 @@
{
public class SurveyDto
{
- public string Id { get; set; } = Guid.NewGuid().ToString();
+ public string Id { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public string Category { get; set; }
public DateTime ExpirationDate { get; set; }
+ public DateTime CreatedAt { get; set; }
public bool IsPublished { get; set; }
public string AuthorId { get; set; }
public List Questions { get; set; }
diff --git a/survey-beta/DTOs/Response/ResponseDto.cs b/survey-beta/DTOs/Response/ResponseDto.cs
deleted file mode 100644
index 9b7bf88..0000000
--- a/survey-beta/DTOs/Response/ResponseDto.cs
+++ /dev/null
@@ -1,10 +0,0 @@
-namespace survey_beta.DTOs.Response
-{
- public class ResponseDto
- {
- public string Id { get; set; }
- public string IpAddress { get; set; }
- public string SurveyId { get; set; }
- public string Response { get; set; }
- }
-}
diff --git a/survey-beta/DataBaseContext/AppDbContext.cs b/survey-beta/DataBaseContext/AppDbContext.cs
index a1318a4..9e93612 100644
--- a/survey-beta/DataBaseContext/AppDbContext.cs
+++ b/survey-beta/DataBaseContext/AppDbContext.cs
@@ -1,10 +1,11 @@
-using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
+using Microsoft.AspNet.Identity.EntityFramework;
+using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
using survey_beta.Models;
namespace survey_beta.DataBaseContext
{
- public class AppDbContext : IdentityDbContext
+ public class AppDbContext : Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityDbContext
{
public DbSet Surveys { get; set; }
public DbSet Questions { get; set; }
@@ -31,10 +32,10 @@ namespace survey_beta.DataBaseContext
.OnDelete(DeleteBehavior.Cascade);
modelBuilder.Entity()
- .HasOne(q => q.Survey)
- .WithMany(s => s.Questions)
- .HasForeignKey(q => q.SurveyId)
- .OnDelete(DeleteBehavior.Cascade);
+ .HasIndex(q => q.SurveyId);
+ modelBuilder.Entity()
+ .HasIndex(c => c.QuestionId);
+
modelBuilder.Entity()
.HasOne(c => c.Question)
@@ -42,12 +43,6 @@ namespace survey_beta.DataBaseContext
.HasForeignKey(c => c.QuestionId)
.OnDelete(DeleteBehavior.Cascade);
- modelBuilder.Entity()
- .HasOne(a => a.Response)
- .WithMany(r => r.Answers)
- .HasForeignKey(a => a.ResponseId)
- .OnDelete(DeleteBehavior.Cascade);
-
modelBuilder.Entity()
.HasOne(a => a.Question)
.WithMany()
@@ -61,4 +56,4 @@ namespace survey_beta.DataBaseContext
.OnDelete(DeleteBehavior.Cascade);
}
}
-}
+}
\ No newline at end of file
diff --git a/survey-beta/Mappers/ChoiceMapper.cs b/survey-beta/Mappers/ChoiceMapper.cs
index 7dcff2e..9a4b1cd 100644
--- a/survey-beta/Mappers/ChoiceMapper.cs
+++ b/survey-beta/Mappers/ChoiceMapper.cs
@@ -1,4 +1,5 @@
-using survey_beta.DTOs.Create;
+#if false
+using survey_beta.DTOs.Create;
using survey_beta.DTOs.Default;
using survey_beta.Models;
@@ -28,3 +29,4 @@ namespace survey_beta.Mappers
}
}
}
+#endif
\ No newline at end of file
diff --git a/survey-beta/Mappers/Profiles/AnalyticsProfile.cs b/survey-beta/Mappers/Profiles/AnalyticsProfile.cs
new file mode 100644
index 0000000..af917c4
--- /dev/null
+++ b/survey-beta/Mappers/Profiles/AnalyticsProfile.cs
@@ -0,0 +1,27 @@
+using AutoMapper;
+using survey_beta.DTOs.Default;
+using survey_beta.DTOs.Response;
+using survey_beta.DTOs.Update;
+using survey_beta.Models;
+
+namespace survey_beta.Mappers.Profiles
+{
+ public class AnalyticsProfile : Profile
+ {
+ public AnalyticsProfile()
+ {
+ CreateMap()
+ .ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.Id))
+ .ForMember(dest => dest.SurveyId, opt => opt.MapFrom(src => src.SurveyId))
+ .ForMember(dest => dest.Answers, opt => opt.MapFrom(src => src.Answers));
+
+ CreateMap()
+ .ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.Id))
+ .ForMember(dest => dest.QuestionId, opt => opt.MapFrom(src => src.QuestionId));
+
+ CreateMap()
+ .ForMember(dest => dest.SurveyId, opt => opt.MapFrom(src => src.SurveyId))
+ .ForMember(dest => dest.TotalResponses, opt => opt.MapFrom(src => src.TotalResponses));
+ }
+ }
+}
diff --git a/survey-beta/Mappers/Profiles/AnswerProfile.cs b/survey-beta/Mappers/Profiles/AnswerProfile.cs
new file mode 100644
index 0000000..440ec73
--- /dev/null
+++ b/survey-beta/Mappers/Profiles/AnswerProfile.cs
@@ -0,0 +1,15 @@
+using AutoMapper;
+using survey_beta.DTOs.Default;
+using survey_beta.DTOs.Response;
+using survey_beta.Models;
+
+namespace survey_beta.Mappers.Profiles
+{
+ public class AnswerProfile : Profile
+ {
+ public AnswerProfile()
+ {
+ CreateMap();
+ }
+ }
+}
diff --git a/survey-beta/Mappers/Profiles/ChoiceProfile.cs b/survey-beta/Mappers/Profiles/ChoiceProfile.cs
new file mode 100644
index 0000000..4832fa9
--- /dev/null
+++ b/survey-beta/Mappers/Profiles/ChoiceProfile.cs
@@ -0,0 +1,15 @@
+using AutoMapper;
+using survey_beta.DTOs.Default;
+using survey_beta.DTOs.Response;
+using survey_beta.Models;
+
+namespace survey_beta.Mappers.Profiles
+{
+ public class ChoiceProfile : Profile
+ {
+ public ChoiceProfile()
+ {
+ CreateMap();
+ }
+ }
+}
diff --git a/survey-beta/Mappers/Profiles/MappingProfile.cs b/survey-beta/Mappers/Profiles/MappingProfile.cs
new file mode 100644
index 0000000..cfb12fc
--- /dev/null
+++ b/survey-beta/Mappers/Profiles/MappingProfile.cs
@@ -0,0 +1,22 @@
+using AutoMapper;
+using survey_beta.DTOs.Create;
+using survey_beta.DTOs.Default;
+using survey_beta.DTOs.Response;
+using survey_beta.DTOs.Update;
+using survey_beta.Models;
+
+public class MappingProfile : Profile
+{
+ public MappingProfile()
+ {
+ CreateMap().ForMember(dest => dest.Id, opt => opt.Ignore());
+ CreateMap().ForMember(dest => dest.Id, opt => opt.Ignore());
+ CreateMap().ForMember(dest => dest.Id, opt => opt.Ignore());
+
+ CreateMap();
+ CreateMap();
+ CreateMap();
+
+ CreateMap();
+ }
+}
diff --git a/survey-beta/Mappers/Profiles/QuestionProfile.cs b/survey-beta/Mappers/Profiles/QuestionProfile.cs
new file mode 100644
index 0000000..5c10967
--- /dev/null
+++ b/survey-beta/Mappers/Profiles/QuestionProfile.cs
@@ -0,0 +1,15 @@
+using AutoMapper;
+using survey_beta.DTOs.Default;
+using survey_beta.DTOs.Response;
+using survey_beta.Models;
+
+namespace survey_beta.Mappers.Profiles
+{
+ public class QuestionProfile : Profile
+ {
+ public QuestionProfile()
+ {
+ CreateMap();
+ }
+ }
+}
diff --git a/survey-beta/Mappers/Profiles/ResponseProfile.cs b/survey-beta/Mappers/Profiles/ResponseProfile.cs
new file mode 100644
index 0000000..3d48dec
--- /dev/null
+++ b/survey-beta/Mappers/Profiles/ResponseProfile.cs
@@ -0,0 +1,23 @@
+namespace survey_beta.Mappers.Profiles
+{
+ using AutoMapper;
+ using survey_beta.DTOs.Default;
+ using survey_beta.DTOs.Response;
+ using survey_beta.Models;
+ public class ResponseProfile : Profile
+ {
+ public ResponseProfile()
+ {
+ CreateMap()
+ .ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.Id))
+ .ForMember(dest => dest.SurveyId, opt => opt.MapFrom(src => src.SurveyId))
+ .ForMember(dest => dest.CreatedAt, opt => opt.MapFrom(src => DateTime.UtcNow))
+ .ForMember(dest => dest.Answers, opt => opt.MapFrom(src => src.Answers));
+
+ CreateMap()
+ .ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.Id))
+ .ForMember(dest => dest.ResponseId, opt => opt.MapFrom(src => src.ResponseId))
+ .ForMember(dest => dest.QuestionId, opt => opt.MapFrom(src => src.QuestionId));
+ }
+ }
+}
diff --git a/survey-beta/Mappers/Profiles/SurveyProfile.cs b/survey-beta/Mappers/Profiles/SurveyProfile.cs
new file mode 100644
index 0000000..6f4665c
--- /dev/null
+++ b/survey-beta/Mappers/Profiles/SurveyProfile.cs
@@ -0,0 +1,17 @@
+using AutoMapper;
+using survey_beta.DTOs.Create;
+using survey_beta.DTOs.Default;
+using survey_beta.DTOs.Response;
+using survey_beta.Models;
+
+namespace survey_beta.Mappers.Profiles
+{
+ public class SurveyProfile : Profile
+ {
+ public SurveyProfile()
+ {
+ CreateMap();
+ CreateMap();
+ }
+ }
+}
diff --git a/survey-beta/Mappers/Profiles/UserProfile.cs b/survey-beta/Mappers/Profiles/UserProfile.cs
new file mode 100644
index 0000000..fedf21b
--- /dev/null
+++ b/survey-beta/Mappers/Profiles/UserProfile.cs
@@ -0,0 +1,16 @@
+using AutoMapper;
+using survey_beta.DTOs.Create;
+using survey_beta.DTOs.Default;
+using survey_beta.Models;
+
+namespace survey_beta.Mappers.Profiles
+{
+ public class UserProfile : Profile
+ {
+ public UserProfile()
+ {
+ CreateMap();
+ CreateMap();
+ }
+ }
+}
diff --git a/survey-beta/Mappers/QuestionMapper.cs b/survey-beta/Mappers/QuestionMapper.cs
index 82e4121..e5115f0 100644
--- a/survey-beta/Mappers/QuestionMapper.cs
+++ b/survey-beta/Mappers/QuestionMapper.cs
@@ -1,4 +1,6 @@
-using survey_beta.DTOs.Create;
+#if false
+
+using survey_beta.DTOs.Create;
using survey_beta.DTOs.Default;
using survey_beta.Models;
@@ -22,8 +24,9 @@ namespace survey_beta.Mappers
{
Id = Guid.NewGuid().ToString(),
Content = dto.Content,
- SurveyId = dto.SurveyId
+ // SurveyId = dto.SurveyId
};
}
}
}
+#endif
diff --git a/survey-beta/Mappers/ResponseMapper.cs b/survey-beta/Mappers/ResponseMapper.cs
index 0f7aca3..20956d3 100644
--- a/survey-beta/Mappers/ResponseMapper.cs
+++ b/survey-beta/Mappers/ResponseMapper.cs
@@ -1,4 +1,5 @@
-using survey_beta.DTOs.Create;
+#if false
+using survey_beta.DTOs.Create;
using survey_beta.DTOs.Default;
using survey_beta.Models;
@@ -27,3 +28,4 @@ namespace survey_beta.Mappers
}
}
}
+#endif
\ No newline at end of file
diff --git a/survey-beta/Mappers/SurveyMapper.cs b/survey-beta/Mappers/SurveyMapper.cs
index 40ba7e5..0c42cf2 100644
--- a/survey-beta/Mappers/SurveyMapper.cs
+++ b/survey-beta/Mappers/SurveyMapper.cs
@@ -1,4 +1,5 @@
-using survey_beta.DTOs.Create;
+#if false
+using survey_beta.DTOs.Create;
using survey_beta.DTOs.Default;
using survey_beta.Models;
@@ -34,3 +35,4 @@ namespace survey_beta.Mappers
}
}
}
+#endif
\ No newline at end of file
diff --git a/survey-beta/Mappers/UserMapper.cs b/survey-beta/Mappers/UserMapper.cs
index 50a38de..60d238d 100644
--- a/survey-beta/Mappers/UserMapper.cs
+++ b/survey-beta/Mappers/UserMapper.cs
@@ -1,4 +1,5 @@
-using Microsoft.AspNetCore.Identity;
+#if false
+using Microsoft.AspNetCore.Identity;
using survey_beta.DTOs.Create;
using survey_beta.DTOs.Default;
using survey_beta.Models;
@@ -33,3 +34,4 @@ namespace survey_beta.Mappers
}
}
}
+#endif
\ No newline at end of file
diff --git a/survey-beta/Migrations/20250204184529_answer.Designer.cs b/survey-beta/Migrations/20250204184529_answer.Designer.cs
new file mode 100644
index 0000000..dc34387
--- /dev/null
+++ b/survey-beta/Migrations/20250204184529_answer.Designer.cs
@@ -0,0 +1,485 @@
+//
+using System;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
+using survey_beta.DataBaseContext;
+
+#nullable disable
+
+namespace survey_beta.Migrations
+{
+ [DbContext(typeof(AppDbContext))]
+ [Migration("20250204184529_answer")]
+ partial class answer
+ {
+ ///
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("ProductVersion", "9.0.1")
+ .HasAnnotation("Relational:MaxIdentifierLength", 63);
+
+ NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("text");
+
+ b.Property("ConcurrencyStamp")
+ .IsConcurrencyToken()
+ .HasColumnType("text");
+
+ b.Property("Name")
+ .HasMaxLength(256)
+ .HasColumnType("character varying(256)");
+
+ b.Property("NormalizedName")
+ .HasMaxLength(256)
+ .HasColumnType("character varying(256)");
+
+ b.HasKey("Id");
+
+ b.HasIndex("NormalizedName")
+ .IsUnique()
+ .HasDatabaseName("RoleNameIndex");
+
+ b.ToTable("AspNetRoles", (string)null);
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("ClaimType")
+ .HasColumnType("text");
+
+ b.Property("ClaimValue")
+ .HasColumnType("text");
+
+ b.Property("RoleId")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.HasIndex("RoleId");
+
+ b.ToTable("AspNetRoleClaims", (string)null);
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("ClaimType")
+ .HasColumnType("text");
+
+ b.Property("ClaimValue")
+ .HasColumnType("text");
+
+ b.Property("UserId")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("AspNetUserClaims", (string)null);
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b =>
+ {
+ b.Property("LoginProvider")
+ .HasColumnType("text");
+
+ b.Property("ProviderKey")
+ .HasColumnType("text");
+
+ b.Property("ProviderDisplayName")
+ .HasColumnType("text");
+
+ b.Property("UserId")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.HasKey("LoginProvider", "ProviderKey");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("AspNetUserLogins", (string)null);
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b =>
+ {
+ b.Property("UserId")
+ .HasColumnType("text");
+
+ b.Property("RoleId")
+ .HasColumnType("text");
+
+ b.HasKey("UserId", "RoleId");
+
+ b.HasIndex("RoleId");
+
+ b.ToTable("AspNetUserRoles", (string)null);
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b =>
+ {
+ b.Property("UserId")
+ .HasColumnType("text");
+
+ b.Property("LoginProvider")
+ .HasColumnType("text");
+
+ b.Property("Name")
+ .HasColumnType("text");
+
+ b.Property("Value")
+ .HasColumnType("text");
+
+ b.HasKey("UserId", "LoginProvider", "Name");
+
+ b.ToTable("AspNetUserTokens", (string)null);
+ });
+
+ modelBuilder.Entity("survey_beta.Models.Answer", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("text");
+
+ b.Property("ChoiceId")
+ .HasColumnType("text");
+
+ b.Property("QuestionId")
+ .HasColumnType("text");
+
+ b.Property("ResponseId")
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ChoiceId");
+
+ b.HasIndex("QuestionId");
+
+ b.HasIndex("ResponseId");
+
+ b.ToTable("Answers");
+ });
+
+ modelBuilder.Entity("survey_beta.Models.Choice", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("text");
+
+ b.Property("Content")
+ .HasColumnType("text");
+
+ b.Property("Letter")
+ .HasColumnType("text");
+
+ b.Property("QuestionId")
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.HasIndex("QuestionId");
+
+ b.ToTable("Choices");
+ });
+
+ modelBuilder.Entity("survey_beta.Models.Question", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("text");
+
+ b.Property("Content")
+ .HasColumnType("text");
+
+ b.Property("SurveyId")
+ .HasColumnType("text");
+
+ b.Property("Text")
+ .HasColumnType("text");
+
+ b.Property("Type")
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.HasIndex("SurveyId");
+
+ b.ToTable("Questions");
+ });
+
+ modelBuilder.Entity("survey_beta.Models.Response", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("text");
+
+ b.Property("CreatedAt")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("IpAddress")
+ .HasColumnType("text");
+
+ b.Property("SurveyId")
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.HasIndex("SurveyId");
+
+ b.ToTable("Responses");
+ });
+
+ modelBuilder.Entity("survey_beta.Models.Survey", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("text");
+
+ b.Property("AuthorId")
+ .HasColumnType("text");
+
+ b.Property("Category")
+ .HasColumnType("text");
+
+ b.Property("Description")
+ .HasColumnType("text");
+
+ b.Property("ExpirationDate")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("IsPublished")
+ .HasColumnType("boolean");
+
+ b.Property("Title")
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.HasIndex("AuthorId");
+
+ b.ToTable("Surveys");
+ });
+
+ modelBuilder.Entity("survey_beta.Models.User", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("text");
+
+ b.Property("AccessFailedCount")
+ .HasColumnType("integer");
+
+ b.Property("ConcurrencyStamp")
+ .IsConcurrencyToken()
+ .HasColumnType("text");
+
+ b.Property("Email")
+ .HasMaxLength(256)
+ .HasColumnType("character varying(256)");
+
+ b.Property("EmailConfirmed")
+ .HasColumnType("boolean");
+
+ b.Property("Fullname")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("LockoutEnabled")
+ .HasColumnType("boolean");
+
+ b.Property("LockoutEnd")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("NormalizedEmail")
+ .HasMaxLength(256)
+ .HasColumnType("character varying(256)");
+
+ b.Property("NormalizedUserName")
+ .HasMaxLength(256)
+ .HasColumnType("character varying(256)");
+
+ b.Property("PasswordHash")
+ .HasColumnType("text");
+
+ b.Property("PhoneNumber")
+ .HasColumnType("text");
+
+ b.Property("PhoneNumberConfirmed")
+ .HasColumnType("boolean");
+
+ b.Property("SecurityStamp")
+ .HasColumnType("text");
+
+ b.Property("TwoFactorEnabled")
+ .HasColumnType("boolean");
+
+ b.Property("UserName")
+ .HasMaxLength(256)
+ .HasColumnType("character varying(256)");
+
+ b.HasKey("Id");
+
+ b.HasIndex("NormalizedEmail")
+ .HasDatabaseName("EmailIndex");
+
+ b.HasIndex("NormalizedUserName")
+ .IsUnique()
+ .HasDatabaseName("UserNameIndex");
+
+ b.ToTable("AspNetUsers", (string)null);
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b =>
+ {
+ b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null)
+ .WithMany()
+ .HasForeignKey("RoleId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b =>
+ {
+ b.HasOne("survey_beta.Models.User", null)
+ .WithMany()
+ .HasForeignKey("UserId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b =>
+ {
+ b.HasOne("survey_beta.Models.User", null)
+ .WithMany()
+ .HasForeignKey("UserId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b =>
+ {
+ b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null)
+ .WithMany()
+ .HasForeignKey("RoleId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("survey_beta.Models.User", null)
+ .WithMany()
+ .HasForeignKey("UserId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b =>
+ {
+ b.HasOne("survey_beta.Models.User", null)
+ .WithMany()
+ .HasForeignKey("UserId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("survey_beta.Models.Answer", b =>
+ {
+ b.HasOne("survey_beta.Models.Choice", "Choice")
+ .WithMany()
+ .HasForeignKey("ChoiceId")
+ .OnDelete(DeleteBehavior.Cascade);
+
+ b.HasOne("survey_beta.Models.Question", "Question")
+ .WithMany()
+ .HasForeignKey("QuestionId")
+ .OnDelete(DeleteBehavior.Cascade);
+
+ b.HasOne("survey_beta.Models.Response", "Response")
+ .WithMany("Answers")
+ .HasForeignKey("ResponseId")
+ .OnDelete(DeleteBehavior.Cascade);
+
+ b.Navigation("Choice");
+
+ b.Navigation("Question");
+
+ b.Navigation("Response");
+ });
+
+ modelBuilder.Entity("survey_beta.Models.Choice", b =>
+ {
+ b.HasOne("survey_beta.Models.Question", "Question")
+ .WithMany("Choices")
+ .HasForeignKey("QuestionId")
+ .OnDelete(DeleteBehavior.Cascade);
+
+ b.Navigation("Question");
+ });
+
+ modelBuilder.Entity("survey_beta.Models.Question", b =>
+ {
+ b.HasOne("survey_beta.Models.Survey", "Survey")
+ .WithMany("Questions")
+ .HasForeignKey("SurveyId")
+ .OnDelete(DeleteBehavior.Cascade);
+
+ b.Navigation("Survey");
+ });
+
+ modelBuilder.Entity("survey_beta.Models.Response", b =>
+ {
+ b.HasOne("survey_beta.Models.Survey", "Survey")
+ .WithMany()
+ .HasForeignKey("SurveyId");
+
+ b.Navigation("Survey");
+ });
+
+ modelBuilder.Entity("survey_beta.Models.Survey", b =>
+ {
+ b.HasOne("survey_beta.Models.User", "Author")
+ .WithMany("Surveys")
+ .HasForeignKey("AuthorId")
+ .OnDelete(DeleteBehavior.Cascade);
+
+ b.Navigation("Author");
+ });
+
+ modelBuilder.Entity("survey_beta.Models.Question", b =>
+ {
+ b.Navigation("Choices");
+ });
+
+ modelBuilder.Entity("survey_beta.Models.Response", b =>
+ {
+ b.Navigation("Answers");
+ });
+
+ modelBuilder.Entity("survey_beta.Models.Survey", b =>
+ {
+ b.Navigation("Questions");
+ });
+
+ modelBuilder.Entity("survey_beta.Models.User", b =>
+ {
+ b.Navigation("Surveys");
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/survey-beta/Migrations/20250204184529_answer.cs b/survey-beta/Migrations/20250204184529_answer.cs
new file mode 100644
index 0000000..a2c1eba
--- /dev/null
+++ b/survey-beta/Migrations/20250204184529_answer.cs
@@ -0,0 +1,123 @@
+using Microsoft.EntityFrameworkCore.Migrations;
+
+#nullable disable
+
+namespace survey_beta.Migrations
+{
+ ///
+ public partial class answer : Migration
+ {
+ ///
+ protected override void Up(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.DropForeignKey(
+ name: "FK_Responses_Surveys_SurveyId",
+ table: "Responses");
+
+ migrationBuilder.AlterColumn(
+ name: "SurveyId",
+ table: "Responses",
+ type: "text",
+ nullable: true,
+ oldClrType: typeof(string),
+ oldType: "text");
+
+ migrationBuilder.AddColumn(
+ name: "IpAddress",
+ table: "Responses",
+ type: "text",
+ nullable: true);
+
+ migrationBuilder.AlterColumn(
+ name: "ResponseId",
+ table: "Answers",
+ type: "text",
+ nullable: true,
+ oldClrType: typeof(string),
+ oldType: "text");
+
+ migrationBuilder.AlterColumn(
+ name: "QuestionId",
+ table: "Answers",
+ type: "text",
+ nullable: true,
+ oldClrType: typeof(string),
+ oldType: "text");
+
+ migrationBuilder.AlterColumn(
+ name: "ChoiceId",
+ table: "Answers",
+ type: "text",
+ nullable: true,
+ oldClrType: typeof(string),
+ oldType: "text");
+
+ migrationBuilder.AddForeignKey(
+ name: "FK_Responses_Surveys_SurveyId",
+ table: "Responses",
+ column: "SurveyId",
+ principalTable: "Surveys",
+ principalColumn: "Id");
+ }
+
+ ///
+ protected override void Down(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.DropForeignKey(
+ name: "FK_Responses_Surveys_SurveyId",
+ table: "Responses");
+
+ migrationBuilder.DropColumn(
+ name: "IpAddress",
+ table: "Responses");
+
+ migrationBuilder.AlterColumn(
+ name: "SurveyId",
+ table: "Responses",
+ type: "text",
+ nullable: false,
+ defaultValue: "",
+ oldClrType: typeof(string),
+ oldType: "text",
+ oldNullable: true);
+
+ migrationBuilder.AlterColumn(
+ name: "ResponseId",
+ table: "Answers",
+ type: "text",
+ nullable: false,
+ defaultValue: "",
+ oldClrType: typeof(string),
+ oldType: "text",
+ oldNullable: true);
+
+ migrationBuilder.AlterColumn(
+ name: "QuestionId",
+ table: "Answers",
+ type: "text",
+ nullable: false,
+ defaultValue: "",
+ oldClrType: typeof(string),
+ oldType: "text",
+ oldNullable: true);
+
+ migrationBuilder.AlterColumn(
+ name: "ChoiceId",
+ table: "Answers",
+ type: "text",
+ nullable: false,
+ defaultValue: "",
+ oldClrType: typeof(string),
+ oldType: "text",
+ oldNullable: true);
+
+ migrationBuilder.AddForeignKey(
+ name: "FK_Responses_Surveys_SurveyId",
+ table: "Responses",
+ column: "SurveyId",
+ principalTable: "Surveys",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Cascade);
+ }
+ }
+}
diff --git a/survey-beta/Migrations/20250205124722_Choice.Designer.cs b/survey-beta/Migrations/20250205124722_Choice.Designer.cs
new file mode 100644
index 0000000..eea95df
--- /dev/null
+++ b/survey-beta/Migrations/20250205124722_Choice.Designer.cs
@@ -0,0 +1,487 @@
+//
+using System;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
+using survey_beta.DataBaseContext;
+
+#nullable disable
+
+namespace survey_beta.Migrations
+{
+ [DbContext(typeof(AppDbContext))]
+ [Migration("20250205124722_Choice")]
+ partial class Choice
+ {
+ ///
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("ProductVersion", "9.0.1")
+ .HasAnnotation("Relational:MaxIdentifierLength", 63);
+
+ NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("text");
+
+ b.Property("ConcurrencyStamp")
+ .IsConcurrencyToken()
+ .HasColumnType("text");
+
+ b.Property("Name")
+ .HasMaxLength(256)
+ .HasColumnType("character varying(256)");
+
+ b.Property("NormalizedName")
+ .HasMaxLength(256)
+ .HasColumnType("character varying(256)");
+
+ b.HasKey("Id");
+
+ b.HasIndex("NormalizedName")
+ .IsUnique()
+ .HasDatabaseName("RoleNameIndex");
+
+ b.ToTable("AspNetRoles", (string)null);
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("ClaimType")
+ .HasColumnType("text");
+
+ b.Property("ClaimValue")
+ .HasColumnType("text");
+
+ b.Property("RoleId")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.HasIndex("RoleId");
+
+ b.ToTable("AspNetRoleClaims", (string)null);
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("ClaimType")
+ .HasColumnType("text");
+
+ b.Property("ClaimValue")
+ .HasColumnType("text");
+
+ b.Property("UserId")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("AspNetUserClaims", (string)null);
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b =>
+ {
+ b.Property("LoginProvider")
+ .HasColumnType("text");
+
+ b.Property("ProviderKey")
+ .HasColumnType("text");
+
+ b.Property("ProviderDisplayName")
+ .HasColumnType("text");
+
+ b.Property("UserId")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.HasKey("LoginProvider", "ProviderKey");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("AspNetUserLogins", (string)null);
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b =>
+ {
+ b.Property("UserId")
+ .HasColumnType("text");
+
+ b.Property("RoleId")
+ .HasColumnType("text");
+
+ b.HasKey("UserId", "RoleId");
+
+ b.HasIndex("RoleId");
+
+ b.ToTable("AspNetUserRoles", (string)null);
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b =>
+ {
+ b.Property("UserId")
+ .HasColumnType("text");
+
+ b.Property("LoginProvider")
+ .HasColumnType("text");
+
+ b.Property("Name")
+ .HasColumnType("text");
+
+ b.Property("Value")
+ .HasColumnType("text");
+
+ b.HasKey("UserId", "LoginProvider", "Name");
+
+ b.ToTable("AspNetUserTokens", (string)null);
+ });
+
+ modelBuilder.Entity("survey_beta.Models.Answer", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("text");
+
+ b.Property("ChoiceId")
+ .HasColumnType("text");
+
+ b.Property("QuestionId")
+ .HasColumnType("text");
+
+ b.Property("ResponseId")
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ChoiceId");
+
+ b.HasIndex("QuestionId");
+
+ b.HasIndex("ResponseId");
+
+ b.ToTable("Answers");
+ });
+
+ modelBuilder.Entity("survey_beta.Models.Choice", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("text");
+
+ b.Property("Content")
+ .HasColumnType("text");
+
+ b.Property("Letter")
+ .HasColumnType("text");
+
+ b.Property("QuestionId")
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.HasIndex("QuestionId");
+
+ b.ToTable("Choices");
+ });
+
+ modelBuilder.Entity("survey_beta.Models.Question", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("text");
+
+ b.Property("Content")
+ .HasColumnType("text");
+
+ b.Property("SurveyId")
+ .HasColumnType("text");
+
+ b.Property("Text")
+ .HasColumnType("text");
+
+ b.Property("Type")
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.HasIndex("SurveyId");
+
+ b.ToTable("Questions");
+ });
+
+ modelBuilder.Entity("survey_beta.Models.Response", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("text");
+
+ b.Property("CreatedAt")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("IpAddress")
+ .HasColumnType("text");
+
+ b.Property("SurveyId")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.HasIndex("SurveyId");
+
+ b.ToTable("Responses");
+ });
+
+ modelBuilder.Entity("survey_beta.Models.Survey", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("text");
+
+ b.Property("AuthorId")
+ .HasColumnType("text");
+
+ b.Property("Category")
+ .HasColumnType("text");
+
+ b.Property("Description")
+ .HasColumnType("text");
+
+ b.Property("ExpirationDate")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("IsPublished")
+ .HasColumnType("boolean");
+
+ b.Property("Title")
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.HasIndex("AuthorId");
+
+ b.ToTable("Surveys");
+ });
+
+ modelBuilder.Entity("survey_beta.Models.User", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("text");
+
+ b.Property("AccessFailedCount")
+ .HasColumnType("integer");
+
+ b.Property("ConcurrencyStamp")
+ .IsConcurrencyToken()
+ .HasColumnType("text");
+
+ b.Property("Email")
+ .HasMaxLength(256)
+ .HasColumnType("character varying(256)");
+
+ b.Property("EmailConfirmed")
+ .HasColumnType("boolean");
+
+ b.Property("Fullname")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("LockoutEnabled")
+ .HasColumnType("boolean");
+
+ b.Property("LockoutEnd")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("NormalizedEmail")
+ .HasMaxLength(256)
+ .HasColumnType("character varying(256)");
+
+ b.Property("NormalizedUserName")
+ .HasMaxLength(256)
+ .HasColumnType("character varying(256)");
+
+ b.Property("PasswordHash")
+ .HasColumnType("text");
+
+ b.Property("PhoneNumber")
+ .HasColumnType("text");
+
+ b.Property("PhoneNumberConfirmed")
+ .HasColumnType("boolean");
+
+ b.Property("SecurityStamp")
+ .HasColumnType("text");
+
+ b.Property("TwoFactorEnabled")
+ .HasColumnType("boolean");
+
+ b.Property("UserName")
+ .HasMaxLength(256)
+ .HasColumnType("character varying(256)");
+
+ b.HasKey("Id");
+
+ b.HasIndex("NormalizedEmail")
+ .HasDatabaseName("EmailIndex");
+
+ b.HasIndex("NormalizedUserName")
+ .IsUnique()
+ .HasDatabaseName("UserNameIndex");
+
+ b.ToTable("AspNetUsers", (string)null);
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b =>
+ {
+ b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null)
+ .WithMany()
+ .HasForeignKey("RoleId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b =>
+ {
+ b.HasOne("survey_beta.Models.User", null)
+ .WithMany()
+ .HasForeignKey("UserId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b =>
+ {
+ b.HasOne("survey_beta.Models.User", null)
+ .WithMany()
+ .HasForeignKey("UserId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b =>
+ {
+ b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null)
+ .WithMany()
+ .HasForeignKey("RoleId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("survey_beta.Models.User", null)
+ .WithMany()
+ .HasForeignKey("UserId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b =>
+ {
+ b.HasOne("survey_beta.Models.User", null)
+ .WithMany()
+ .HasForeignKey("UserId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("survey_beta.Models.Answer", b =>
+ {
+ b.HasOne("survey_beta.Models.Choice", "Choice")
+ .WithMany()
+ .HasForeignKey("ChoiceId")
+ .OnDelete(DeleteBehavior.Cascade);
+
+ b.HasOne("survey_beta.Models.Question", "Question")
+ .WithMany()
+ .HasForeignKey("QuestionId")
+ .OnDelete(DeleteBehavior.Cascade);
+
+ b.HasOne("survey_beta.Models.Response", "Response")
+ .WithMany("Answers")
+ .HasForeignKey("ResponseId");
+
+ b.Navigation("Choice");
+
+ b.Navigation("Question");
+
+ b.Navigation("Response");
+ });
+
+ modelBuilder.Entity("survey_beta.Models.Choice", b =>
+ {
+ b.HasOne("survey_beta.Models.Question", "Question")
+ .WithMany("Choices")
+ .HasForeignKey("QuestionId")
+ .OnDelete(DeleteBehavior.Cascade);
+
+ b.Navigation("Question");
+ });
+
+ modelBuilder.Entity("survey_beta.Models.Question", b =>
+ {
+ b.HasOne("survey_beta.Models.Survey", "Survey")
+ .WithMany("Questions")
+ .HasForeignKey("SurveyId")
+ .OnDelete(DeleteBehavior.Cascade);
+
+ b.Navigation("Survey");
+ });
+
+ modelBuilder.Entity("survey_beta.Models.Response", b =>
+ {
+ b.HasOne("survey_beta.Models.Survey", "Survey")
+ .WithMany()
+ .HasForeignKey("SurveyId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("Survey");
+ });
+
+ modelBuilder.Entity("survey_beta.Models.Survey", b =>
+ {
+ b.HasOne("survey_beta.Models.User", "Author")
+ .WithMany("Surveys")
+ .HasForeignKey("AuthorId")
+ .OnDelete(DeleteBehavior.Cascade);
+
+ b.Navigation("Author");
+ });
+
+ modelBuilder.Entity("survey_beta.Models.Question", b =>
+ {
+ b.Navigation("Choices");
+ });
+
+ modelBuilder.Entity("survey_beta.Models.Response", b =>
+ {
+ b.Navigation("Answers");
+ });
+
+ modelBuilder.Entity("survey_beta.Models.Survey", b =>
+ {
+ b.Navigation("Questions");
+ });
+
+ modelBuilder.Entity("survey_beta.Models.User", b =>
+ {
+ b.Navigation("Surveys");
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/survey-beta/Migrations/20250205124722_Choice.cs b/survey-beta/Migrations/20250205124722_Choice.cs
new file mode 100644
index 0000000..181717b
--- /dev/null
+++ b/survey-beta/Migrations/20250205124722_Choice.cs
@@ -0,0 +1,82 @@
+using Microsoft.EntityFrameworkCore.Migrations;
+
+#nullable disable
+
+namespace survey_beta.Migrations
+{
+ ///
+ public partial class Choice : Migration
+ {
+ ///
+ protected override void Up(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.DropForeignKey(
+ name: "FK_Answers_Responses_ResponseId",
+ table: "Answers");
+
+ migrationBuilder.DropForeignKey(
+ name: "FK_Responses_Surveys_SurveyId",
+ table: "Responses");
+
+ migrationBuilder.AlterColumn(
+ name: "SurveyId",
+ table: "Responses",
+ type: "text",
+ nullable: false,
+ defaultValue: "",
+ oldClrType: typeof(string),
+ oldType: "text",
+ oldNullable: true);
+
+ migrationBuilder.AddForeignKey(
+ name: "FK_Answers_Responses_ResponseId",
+ table: "Answers",
+ column: "ResponseId",
+ principalTable: "Responses",
+ principalColumn: "Id");
+
+ migrationBuilder.AddForeignKey(
+ name: "FK_Responses_Surveys_SurveyId",
+ table: "Responses",
+ column: "SurveyId",
+ principalTable: "Surveys",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Cascade);
+ }
+
+ ///
+ protected override void Down(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.DropForeignKey(
+ name: "FK_Answers_Responses_ResponseId",
+ table: "Answers");
+
+ migrationBuilder.DropForeignKey(
+ name: "FK_Responses_Surveys_SurveyId",
+ table: "Responses");
+
+ migrationBuilder.AlterColumn(
+ name: "SurveyId",
+ table: "Responses",
+ type: "text",
+ nullable: true,
+ oldClrType: typeof(string),
+ oldType: "text");
+
+ migrationBuilder.AddForeignKey(
+ name: "FK_Answers_Responses_ResponseId",
+ table: "Answers",
+ column: "ResponseId",
+ principalTable: "Responses",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Cascade);
+
+ migrationBuilder.AddForeignKey(
+ name: "FK_Responses_Surveys_SurveyId",
+ table: "Responses",
+ column: "SurveyId",
+ principalTable: "Surveys",
+ principalColumn: "Id");
+ }
+ }
+}
diff --git a/survey-beta/Migrations/AppDbContextModelSnapshot.cs b/survey-beta/Migrations/AppDbContextModelSnapshot.cs
index 0e2e9a3..112eb8d 100644
--- a/survey-beta/Migrations/AppDbContextModelSnapshot.cs
+++ b/survey-beta/Migrations/AppDbContextModelSnapshot.cs
@@ -160,15 +160,12 @@ namespace survey_beta.Migrations
.HasColumnType("text");
b.Property("ChoiceId")
- .IsRequired()
.HasColumnType("text");
b.Property("QuestionId")
- .IsRequired()
.HasColumnType("text");
b.Property("ResponseId")
- .IsRequired()
.HasColumnType("text");
b.HasKey("Id");
@@ -235,6 +232,9 @@ namespace survey_beta.Migrations
b.Property("CreatedAt")
.HasColumnType("timestamp with time zone");
+ b.Property("IpAddress")
+ .HasColumnType("text");
+
b.Property("SurveyId")
.IsRequired()
.HasColumnType("text");
@@ -400,20 +400,16 @@ namespace survey_beta.Migrations
b.HasOne("survey_beta.Models.Choice", "Choice")
.WithMany()
.HasForeignKey("ChoiceId")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
+ .OnDelete(DeleteBehavior.Cascade);
b.HasOne("survey_beta.Models.Question", "Question")
.WithMany()
.HasForeignKey("QuestionId")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
+ .OnDelete(DeleteBehavior.Cascade);
b.HasOne("survey_beta.Models.Response", "Response")
.WithMany("Answers")
- .HasForeignKey("ResponseId")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
+ .HasForeignKey("ResponseId");
b.Navigation("Choice");
diff --git a/survey-beta/Models/Response.cs b/survey-beta/Models/Response.cs
index b58af4c..cbccf71 100644
--- a/survey-beta/Models/Response.cs
+++ b/survey-beta/Models/Response.cs
@@ -6,8 +6,8 @@ namespace survey_beta.Models
public class Response
{
public string Id { get; set; } = Guid.NewGuid().ToString();
- //public string IpAddress { get; set; }
- public string? SurveyId { get; set; }
+ public string? IpAddress { get; set; }
+ public string SurveyId { get; set; }
public Survey? Survey { get; set; }
public DateTime CreatedAt { get; set; } = DateTime.UtcNow;
public ICollection Answers { get; set; } = new List();
diff --git a/survey-beta/Program.cs b/survey-beta/Program.cs
index e17cd87..1091699 100644
--- a/survey-beta/Program.cs
+++ b/survey-beta/Program.cs
@@ -3,13 +3,14 @@ using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.IdentityModel.Tokens;
using survey_beta.DataBaseContext;
+using survey_beta.Mappers.Profiles;
using survey_beta.Models;
using System.Text;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContext(options =>
options.UseNpgsql(builder.Configuration.GetConnectionString("DefaultConnection")));
-
+// Add services to the container.
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
@@ -65,7 +66,14 @@ builder.Services.AddScoped();
builder.Services.AddScoped();
builder.Services.AddScoped();
builder.Services.AddScoped();
-
+builder.Services.AddAutoMapper(typeof(MappingProfile));
+builder.Services.AddAutoMapper(typeof(UserProfile));
+builder.Services.AddAutoMapper(typeof(ResponseProfile));
+builder.Services.AddAutoMapper(typeof(AnalyticsProfile));
+builder.Services.AddAutoMapper(typeof(AnswerProfile));
+builder.Services.AddAutoMapper(typeof(ChoiceProfile));
+builder.Services.AddAutoMapper(typeof(QuestionProfile));
+builder.Services.AddAutoMapper(typeof(SurveyProfile));
var app = builder.Build();
// HTTP request pipeline
@@ -74,7 +82,7 @@ if (app.Environment.IsDevelopment())
app.UseSwagger();
app.UseSwaggerUI();
}
-
+
app.UseHttpsRedirection();
app.UseAuthentication();
app.UseAuthorization();
diff --git a/survey-beta/Services/AnalyticsServices.cs b/survey-beta/Services/AnalyticsServices.cs
index 2709f8d..2d2ac11 100644
--- a/survey-beta/Services/AnalyticsServices.cs
+++ b/survey-beta/Services/AnalyticsServices.cs
@@ -1,33 +1,40 @@
-using Microsoft.AspNetCore.Http.HttpResults;
+using AutoMapper;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using survey_beta.DataBaseContext;
+using survey_beta.DTOs.Default;
using survey_beta.DTOs.Update;
using survey_beta.Models;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
+using System.Text;
public class AnalyticsServices
{
private readonly AppDbContext _context;
- public AnalyticsServices(AppDbContext context)
+ private readonly IMapper _mapper;
+
+ public AnalyticsServices(AppDbContext context, IMapper mapper)
{
_context = context;
+ _mapper = mapper;
}
+
public void UpdateAnalytics(string surveyId)
{
var responses = _context.Responses
.Where(r => r.SurveyId == surveyId)
.Include(r => r.Answers)
- .ThenInclude(a => a.Choice)
+ .ThenInclude(a => a.Choice)
.ToList();
var analyticsData = CalculateAnalytics(responses);
SaveAnalytics(surveyId, analyticsData);
}
+
private SurveyStats CalculateAnalytics(List responses)
{
var answerFrequency = new Dictionary();
@@ -38,24 +45,21 @@ public class AnalyticsServices
foreach (var answer in response.Answers)
{
var choiceText = answer.Choice?.Letter;
- if (choiceText != null)
+ if (!string.IsNullOrEmpty(choiceText))
{
if (answerFrequency.ContainsKey(choiceText))
- {
answerFrequency[choiceText]++;
- }
else
- {
answerFrequency[choiceText] = 1;
- }
}
- if (questionFrequency.ContainsKey(answer.Question?.Text))
+
+ var questionText = answer.Question?.Text;
+ if (!string.IsNullOrEmpty(questionText))
{
- questionFrequency[answer.Question.Text]++;
- }
- else
- {
- questionFrequency[answer.Question.Text] = 1;
+ if (questionFrequency.ContainsKey(questionText))
+ questionFrequency[questionText]++;
+ else
+ questionFrequency[questionText] = 1;
}
}
}
@@ -68,18 +72,17 @@ public class AnalyticsServices
QuestionFrequency = questionFrequency
};
}
+
private void SaveAnalytics(string surveyId, SurveyStats analyticsData)
{
- var analytics = new SurveyAnalytics
- {
- SurveyId = surveyId,
- TotalResponses = analyticsData.TotalResponses,
- CreatedAt = DateTime.UtcNow,
- };
+ var analytics = _mapper.Map(analyticsData);
+ analytics.SurveyId = surveyId;
+ analytics.CreatedAt = DateTime.UtcNow;
_context.Add(analytics);
_context.SaveChanges();
}
+
public SurveyStats GetAggregatedSurveyResponses(string surveyId)
{
var responses = _context.Responses
@@ -90,37 +93,34 @@ public class AnalyticsServices
return CalculateAnalytics(responses);
}
- public IActionResult ExportSurveyDataToCsv(string surveyId)
+
+ public async Task ExportResponsesToCsv(string surveyId)
{
- var responses = _context.Responses
+ var responses = await _context.Responses
.Where(r => r.SurveyId == surveyId)
.Include(r => r.Answers)
- .ThenInclude(a => a.Choice)
- .ToList();
- if (responses == null || responses.Count == 0)
- {
- return new ObjectResult("No responses found for this survey.")
- {
- StatusCode = 404
- };
- }
+ .ThenInclude(a => a.Question)
+ .Include(r => r.Answers)
+ .ThenInclude(a => a.Choice)
+ .ToListAsync();
- var csvData = new StringWriter();
- var csvHeader = "ResponseId,Question,ChoiceText";
- csvData.WriteLine(csvHeader);
+ var csvLines = new List
+ {
+ "ResponseId,Question,ChoiceText"
+ };
foreach (var response in responses)
{
foreach (var answer in response.Answers)
{
- var choiceText = answer.Choice?.Letter ?? "No Choice";
- var csvLine = $"{response.Id},{answer.Question?.Text},{choiceText}";
- csvData.WriteLine(csvLine);
+ var questionText = answer.Question.Content;
+ csvLines.Add($"{response.Id},{questionText}");
}
}
- var fileName = $"{surveyId}_responses.csv";
- var fileBytes = System.Text.Encoding.UTF8.GetBytes(csvData.ToString());
+ var fileName = "Survey_Responses.csv";
+ var fileBytes = Encoding.UTF8.GetBytes(string.Join(Environment.NewLine, csvLines));
+
return new FileContentResult(fileBytes, "text/csv")
{
FileDownloadName = fileName
diff --git a/survey-beta/Services/ResponsesServices.cs b/survey-beta/Services/ResponsesServices.cs
index 9e3e099..fc11c1d 100644
--- a/survey-beta/Services/ResponsesServices.cs
+++ b/survey-beta/Services/ResponsesServices.cs
@@ -1,44 +1,51 @@
-using Microsoft.EntityFrameworkCore;
+using AutoMapper;
+using Microsoft.EntityFrameworkCore;
using survey_beta.DataBaseContext;
using survey_beta.DTOs.Response;
using survey_beta.Models;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
-public class ResponsesService
+public class ResponsesService
{
private readonly AppDbContext _context;
- private readonly AnalyticsServices _analyticsService;
+ private readonly IMapper _mapper;
- public ResponsesService(AppDbContext context, AnalyticsServices analyticsService)
+ public ResponsesService(AppDbContext context, IMapper mapper)
{
_context = context;
- _analyticsService = analyticsService;
+ _mapper = mapper;
}
-
- public void AddResponse(ResponseDto request)
+ public async Task AddResponseAsync(ResponseDto responseDto)
{
var response = new Response
{
- SurveyId = request.SurveyId,
- Id = request.Id,
+ Id = responseDto.Id,
+ SurveyId = responseDto.SurveyId,
+ IpAddress = responseDto.IpAddress,
CreatedAt = DateTime.UtcNow,
-
- // CreatedAt = DateTime.UtcNow,
- //IpAddress= request.IpAddress
- //Answers = request.Answers.Select(a => new Answer
- //{
-
- // }).ToList()
};
- _context.Responses.Add(response);
- _context.SaveChanges();
- }
+ foreach (var answer in responseDto.Answers)
+ {
+ var answerEntity = new Answer
+ {
+ QuestionId = answer.QuestionId,
+ ResponseId = response.Id
+ };
+ response.Answers.Add(answerEntity);
+ }
- public List GetSurveyResponses(string surveyId)
+ await _context.Responses.AddAsync(response);
+ await _context.SaveChangesAsync();
+ }
+ public async Task> GetSurveyResponsesAsync(string surveyId)
{
- return _context.Responses
- .Where(r => r.SurveyId == surveyId)
- .Include(r => r.Answers)
- .ToList();
+ return await _context.Responses
+ .Where(r => r.SurveyId == surveyId)
+ .Include(r => r.Answers)
+ .ToListAsync();
}
}
\ No newline at end of file
diff --git a/survey-beta/Services/SurveyServices.cs b/survey-beta/Services/SurveyServices.cs
index 0d3a232..bfd348d 100644
--- a/survey-beta/Services/SurveyServices.cs
+++ b/survey-beta/Services/SurveyServices.cs
@@ -1,72 +1,71 @@
using Microsoft.AspNetCore.Http;
-using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using survey_beta.DataBaseContext;
using survey_beta.DTOs.Create;
-using survey_beta.DTOs.Default;
-using survey_beta.DTOs.Response;
using survey_beta.DTOs.Update;
+using survey_beta.DTOs.Response;
using survey_beta.Models;
-using System.Security.Claims;
+using AutoMapper;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using System;
+using survey_beta.DTOs.Default;
public class SurveyService
{
private readonly AppDbContext _context;
+ private readonly IMapper _mapper;
private readonly ResponsesService _responsesService;
- public SurveyService(AppDbContext context, ResponsesService responsesService)
+ public SurveyService(AppDbContext context, IMapper mapper, ResponsesService responsesService)
{
_context = context;
+ _mapper = mapper;
_responsesService = responsesService;
}
+ public async Task> GetAllSurveysAsync(string id = null)
+ {
+ IQueryable query = _context.Surveys.Include(s => s.Questions);
- public async Task GetSurveyByIdAsync(string id)
- {
- return await _context.Surveys
- .Include(s => s.Questions)
- .FirstOrDefaultAsync(s => s.Id == id);
- }
- public async Task> GetUserSurveysAsync(string userId)
- {
- return await _context.Surveys.Where(s => s.AuthorId == userId).ToListAsync();
- }
- public async Task CreateSurveyAsync(CreateSurveyDto request)
- {
- var survey = new Survey
+ if (!string.IsNullOrEmpty(id))
{
- Id = Guid.NewGuid().ToString(),
- Title = request.Title,
- Description = request.Description,
- Category = request.Category,
- ExpirationDate = request.ExpirationDate,
- AuthorId = null,
- Questions = request.Questions.Select(q => new Question
- {
- Id = Guid.NewGuid().ToString(),
- Text = q.Content,
- }).ToList()
- };
+ query = query.Where(s => s.Id == id);
+ }
+
+ var surveys = await query.ToListAsync();
+ return _mapper.Map>(surveys);
+ }
+ public async Task GetSurveyByIdAsync(string id)
+ {
+ var survey = await _context.Surveys.AsNoTracking()
+ .Include(s => s.Questions)
+ .ThenInclude(q => q.Choices)
+ .FirstOrDefaultAsync(s => s.Id == id);
+
+ return survey == null ? null : _mapper.Map(survey);
+ }
+ public async Task CreateSurveyAsync(CreateSurveyDto request, string userId)
+ {
+ var survey = _mapper.Map(request);
+ survey.Id = Guid.NewGuid().ToString();
+ survey.AuthorId = userId;
_context.Surveys.Add(survey);
await _context.SaveChangesAsync();
- return survey;
+ return _mapper.Map(survey);
}
-
public async Task UpdateSurveyAsync(UpdateSurveyDto request)
{
var survey = await _context.Surveys.FindAsync(request.Id);
if (survey == null) return false;
- survey.Title = request.Title;
- survey.Description = request.Description;
- survey.Category = request.Category;
- survey.ExpirationDate = request.ExpirationDate;
- survey.IsPublished = request.IsPublished;
-
+ _mapper.Map(request, survey);
await _context.SaveChangesAsync();
return true;
}
+
public async Task PublishSurveyAsync(string id)
{
var survey = await _context.Surveys.FindAsync(id);
@@ -76,6 +75,7 @@ public class SurveyService
await _context.SaveChangesAsync();
return true;
}
+
public async Task UnpublishSurveyAsync(string id)
{
var survey = await _context.Surveys.FindAsync(id);
@@ -85,27 +85,18 @@ public class SurveyService
await _context.SaveChangesAsync();
return true;
}
+
public async Task DeleteSurveyAsync(string id)
{
- var survey = await _context.Surveys.FindAsync(id);
+ var survey = await _context.Surveys.AsNoTracking()
+ .Include(s => s.Questions)
+ .ThenInclude(q => q.Choices)
+ .FirstOrDefaultAsync(s => s.Id == id);
+
if (survey == null) return false;
_context.Surveys.Remove(survey);
await _context.SaveChangesAsync();
return true;
}
- public async Task SubmitSurveyResponseAsync(string surveyId, survey_beta.DTOs.Response.ResponseDto responseDto)
- {
- var survey = await _context.Surveys
- .Include(s => s.Questions)
- .FirstOrDefaultAsync(s => s.Id == surveyId);
-
- if (survey == null)
- {
- return false;
- }
- _responsesService.AddResponse(responseDto);
-
- return true;
- }
}
diff --git a/survey-beta/Services/UsersServices.cs b/survey-beta/Services/UsersServices.cs
index a029ddc..10fc6e9 100644
--- a/survey-beta/Services/UsersServices.cs
+++ b/survey-beta/Services/UsersServices.cs
@@ -1,5 +1,4 @@
using Microsoft.AspNetCore.Identity;
-using Microsoft.EntityFrameworkCore;
using Microsoft.IdentityModel.Tokens;
using survey_beta.DTOs.Create;
using survey_beta.DTOs.Default;
@@ -7,19 +6,23 @@ using survey_beta.Models;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
+using AutoMapper;
public class UsersServices
{
private readonly UserManager _userManager;
private readonly SignInManager _signInManager;
private readonly IConfiguration _configuration;
+ private readonly IMapper _mapper;
- public UsersServices(UserManager userManager, SignInManager signInManager, IConfiguration configuration)
+ public UsersServices(UserManager userManager, SignInManager signInManager, IConfiguration configuration, IMapper mapper)
{
_userManager = userManager;
_signInManager = signInManager;
_configuration = configuration;
+ _mapper = mapper;
}
+
public async Task CreateUserAsync(CreateUserDto createUserDto)
{
var existingUser = await _userManager.FindByEmailAsync(createUserDto.Email);
@@ -28,12 +31,7 @@ public class UsersServices
throw new Exception("User with this email already exists.");
}
- var user = new User
- {
- UserName = createUserDto.Username,
- Email = createUserDto.Email,
- Fullname = createUserDto.Fullname
- };
+ var user = _mapper.Map(createUserDto);
var result = await _userManager.CreateAsync(user, createUserDto.Password);
if (!result.Succeeded)
@@ -41,14 +39,10 @@ public class UsersServices
throw new Exception("Failed to create user: " + string.Join(", ", result.Errors.Select(e => e.Description)));
}
- return new UserDto
- {
- Id = user.Id,
- Email = user.Email,
- Username = user.UserName,
- Fullname = user.Fullname,
- Token = GenerateJwtToken(user)
- };
+ var userDto = _mapper.Map(user);
+ userDto.Token = GenerateJwtToken(user);
+
+ return userDto;
}
public async Task SignInAsync(LoginDto loginDto)
{
@@ -64,14 +58,10 @@ public class UsersServices
throw new Exception("Invalid login attempt.");
}
- return new UserDto
- {
- Id = user.Id,
- Email = user.Email,
- Username = user.UserName,
- Fullname = user.Fullname,
- Token = GenerateJwtToken(user)
- };
+ var userDto = _mapper.Map