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
new file mode 100644
index 0000000..5e9e4e8
--- /dev/null
+++ b/survey-beta/Controllers/AnalyticsController.cs
@@ -0,0 +1,32 @@
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
+
+namespace survey_beta.Controllers
+{
+ [Route("api/[controller]")]
+ [ApiController]
+ public class AnalyticsController : ControllerBase
+ {
+ private readonly AnalyticsServices _analyticsServices;
+
+ public AnalyticsController(AnalyticsServices analyticsServices)
+ {
+ _analyticsServices = analyticsServices;
+ }
+
+ [HttpGet("survey/{surveyId}")]
+ public IActionResult GetSurveyAnalytics(string surveyId)
+ {
+ var analytics = _analyticsServices.GetAggregatedSurveyResponses(surveyId);
+ if (analytics == null) return NotFound("Survey analytics not found.");
+ return Ok(analytics);
+ }
+
+ [HttpGet("export/{surveyId}")]
+ public async Task ExportSurveyData(string 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
new file mode 100644
index 0000000..9187102
--- /dev/null
+++ b/survey-beta/Controllers/ResponsesController.cs
@@ -0,0 +1,44 @@
+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 ResponseController : ControllerBase
+ {
+ private readonly ResponsesService _responsesService;
+
+ public ResponseController(ResponsesService responsesService)
+ {
+ _responsesService = responsesService;
+ }
+
+ [HttpPost("add")]
+ public async Task CreateResponse([FromBody] ResponseDto request)
+ {
+ try
+ {
+ await _responsesService.AddResponseAsync(request);
+ return Ok(new { message = "Response added successfully." });
+ }
+ catch (Exception ex)
+ {
+ return BadRequest(new { error = ex.Message });
+ }
+ }
+ [HttpGet("survey/{surveyId}")]
+ public async Task GetSurveyResponses(string surveyId)
+ {
+ 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);
+ }
+ }
+}
diff --git a/survey-beta/Controllers/SurveyController.cs b/survey-beta/Controllers/SurveyController.cs
new file mode 100644
index 0000000..2949ee8
--- /dev/null
+++ b/survey-beta/Controllers/SurveyController.cs
@@ -0,0 +1,105 @@
+using Microsoft.AspNet.Identity;
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Identity;
+using Microsoft.AspNetCore.Mvc;
+using survey_beta.DTOs.Create;
+using survey_beta.DTOs.Response;
+using survey_beta.DTOs.Update;
+using survey_beta.Models;
+using System.Linq;
+using System.Security.Claims;
+using System.Threading.Tasks;
+
+[Route("api/[controller]")]
+[ApiController]
+public class SurveyController : ControllerBase
+{
+ private readonly SurveyService _surveyService;
+ private readonly Microsoft.AspNetCore.Identity.UserManager _userManager;
+
+ public SurveyController(SurveyService surveyService, Microsoft.AspNetCore.Identity.UserManager userManager)
+ {
+ _surveyService = surveyService;
+ _userManager = userManager;
+ }
+
+ [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);
+ var survey = await _surveyService.GetSurveyByIdAsync(id);
+
+ if (survey == null)
+ {
+ return NotFound();
+ }
+
+ if (userId != survey.AuthorId)
+ {
+ return Forbid();
+ }
+
+ var result = new SurveyResponseDto
+ {
+ Id = survey.Id,
+ Title = survey.Title,
+ Description = survey.Description,
+ Category = survey.Category,
+ ExpirationDate = survey.ExpirationDate,
+ IsPublished = survey.IsPublished,
+ };
+
+ return Ok(result);
+ }
+ [HttpPost("Create-Survey")]
+ // [Authorize]
+ public async Task CreateSurvey([FromBody] CreateSurveyDto request)
+ {
+ var userId = _userManager.GetUserId(User);
+ var survey = await _surveyService.CreateSurveyAsync(request, userId);
+ return Ok(survey);
+ }
+
+ //[Authorize]
+ [HttpPut("EditSurvey{id}")]
+ public async Task UpdateSurvey([FromBody] UpdateSurveyDto request)
+ {
+ var success = await _surveyService.UpdateSurveyAsync(request);
+ if (!success) return NotFound(new { message = "Survey not found." });
+ return NoContent();
+ }
+
+ //[Authorize]
+ [HttpPatch("publish-Survey/{id}")]
+ public async Task PublishSurvey(string id)
+ {
+ var success = await _surveyService.PublishSurveyAsync(id);
+ if (!success) return NotFound(new { message = "Survey not found." });
+ return NoContent();
+ }
+
+ //[Authorize]
+ [HttpPatch("unpublish-Survey/{id}")]
+ public async Task UnpublishSurvey(string id)
+ {
+ var success = await _surveyService.UnpublishSurveyAsync(id);
+ if (!success) return NotFound(new { message = "Survey not found." });
+ return NoContent();
+ }
+
+ //[Authorize]
+ [HttpDelete("Delete-Survey{id}")]
+ public async Task DeleteSurvey(string id)
+ {
+ var success = await _surveyService.DeleteSurveyAsync(id);
+ if (!success) return NotFound(new { message = "Survey not found." });
+ return NoContent();
+ }
+}
diff --git a/survey-beta/Controllers/UsersController.cs b/survey-beta/Controllers/UsersController.cs
new file mode 100644
index 0000000..2240d1d
--- /dev/null
+++ b/survey-beta/Controllers/UsersController.cs
@@ -0,0 +1,90 @@
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Mvc;
+using survey_beta.DTOs.Create;
+using survey_beta.DTOs.Default;
+
+[Route("api/[controller]")]
+[ApiController]
+public class UserController : ControllerBase
+{
+ private readonly UsersServices _usersServices;
+
+ public UserController(UsersServices usersServices)
+ {
+ _usersServices = usersServices;
+ }
+
+ [HttpPost("register")]
+ public async Task> Register([FromBody] CreateUserDto createUserDto)
+ {
+ try
+ {
+ var user = await _usersServices.CreateUserAsync(createUserDto);
+ return Ok(user);
+ }
+ catch (Exception ex)
+ {
+ return BadRequest(ex.Message);
+ }
+ }
+
+ [HttpPost("login")]
+ public async Task> Login([FromBody] LoginDto loginDto)
+ {
+ try
+ {
+ var user = await _usersServices.SignInAsync(loginDto);
+ return Ok(user);
+ }
+ catch (Exception ex)
+ {
+ return Unauthorized(ex.Message);
+ }
+ }
+ //[Authorize]
+ [HttpGet("{id}")]
+ public async Task GetUserById(string id)
+ {
+ try
+ {
+ var user = await _usersServices.GetUserByIdAsync(id);
+ return Ok(user);
+ }
+ catch (Exception ex)
+ {
+ return NotFound(new { message = ex.Message });
+ }
+ }
+ //[Authorize]
+ [HttpGet("by-username/{username}")]
+ public async Task GetUserByUsername(string username)
+ {
+ try
+ {
+ var user = await _usersServices.GetUserByUsernameAsync(username);
+ return Ok(user);
+ }
+ catch (Exception ex)
+ {
+ return NotFound(new { message = ex.Message });
+ }
+ }
+ //[Authorize]
+ [HttpGet("All-Users")]
+ public async Task GetAllUsers()
+ {
+ var users = await _usersServices.GetAllUsersAsync();
+ return Ok(users);
+ }
+ [HttpDelete("Delete-User")]
+ public async Task DeleteUser(string id)
+ {
+ var users = await _usersServices.GetUserByIdAsync(id);
+ if (users == null)
+ return NotFound();
+ var result = await _usersServices.DeleteUsersAsync(id);
+ return Ok(result);
+ }
+
+
+}
diff --git a/survey-beta/DTOs/Create/CreateChoiceDto.cs b/survey-beta/DTOs/Create/CreateChoiceDto.cs
new file mode 100644
index 0000000..ee52977
--- /dev/null
+++ b/survey-beta/DTOs/Create/CreateChoiceDto.cs
@@ -0,0 +1,8 @@
+namespace survey_beta.DTOs.Create
+{
+ public class CreateChoiceDto
+ {
+ public string Letter { get; set; }
+ public string Content { get; set; }
+ }
+}
diff --git a/survey-beta/DTOs/Create/CreateQuestionDto.cs b/survey-beta/DTOs/Create/CreateQuestionDto.cs
new file mode 100644
index 0000000..bdc0a65
--- /dev/null
+++ b/survey-beta/DTOs/Create/CreateQuestionDto.cs
@@ -0,0 +1,13 @@
+using System;
+using System.Collections.Generic;
+
+namespace survey_beta.DTOs.Create
+{
+ public class CreateQuestionDto
+ {
+ public string Content { get; set; }
+ //public string SurveyId { get; set; }
+
+ public List Choices { get; set; }
+ }
+}
diff --git a/survey-beta/DTOs/Create/CreateResponseDto.cs b/survey-beta/DTOs/Create/CreateResponseDto.cs
new file mode 100644
index 0000000..1e52617
--- /dev/null
+++ b/survey-beta/DTOs/Create/CreateResponseDto.cs
@@ -0,0 +1,10 @@
+namespace survey_beta.DTOs.Create
+{
+ public class CreateResponseDto
+ {
+ public string IpAddress { get; set; }
+ public string SurveyId { get; set; }
+ public string Id { get; set; } = Guid.NewGuid().ToString();
+ public string? Answer { get; set; }
+ }
+}
diff --git a/survey-beta/DTOs/Create/CreateSurveyDto.cs b/survey-beta/DTOs/Create/CreateSurveyDto.cs
new file mode 100644
index 0000000..b3ca3e6
--- /dev/null
+++ b/survey-beta/DTOs/Create/CreateSurveyDto.cs
@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+
+namespace survey_beta.DTOs.Create
+{
+ public class CreateSurveyDto
+ {
+ public string Title { get; set; }
+ 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/Create/CreateUserDto.cs b/survey-beta/DTOs/Create/CreateUserDto.cs
new file mode 100644
index 0000000..00a7957
--- /dev/null
+++ b/survey-beta/DTOs/Create/CreateUserDto.cs
@@ -0,0 +1,10 @@
+namespace survey_beta.DTOs.Create
+{
+ public class CreateUserDto
+ {
+ public string? Email { get; set; }
+ public string? Username { get; set; }
+ public string? Fullname { get; set; }
+ public string? Password { get; set; }
+ }
+}
diff --git a/survey-beta/DTOs/Create/LoginDto.cs b/survey-beta/DTOs/Create/LoginDto.cs
new file mode 100644
index 0000000..6412503
--- /dev/null
+++ b/survey-beta/DTOs/Create/LoginDto.cs
@@ -0,0 +1,8 @@
+namespace survey_beta.DTOs.Create
+{
+ public class LoginDto
+ {
+ public string Username { get; set; }
+ public string Password { get; set; }
+ }
+}
diff --git a/survey-beta/DTOs/Default/AnswerDto.cs b/survey-beta/DTOs/Default/AnswerDto.cs
new file mode 100644
index 0000000..deff6e2
--- /dev/null
+++ b/survey-beta/DTOs/Default/AnswerDto.cs
@@ -0,0 +1,9 @@
+namespace survey_beta.DTOs.Default
+{
+ public class AnswerDto
+ {
+ public string Id { get; set; } = Guid.NewGuid().ToString();
+ 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
new file mode 100644
index 0000000..764908b
--- /dev/null
+++ b/survey-beta/DTOs/Default/ChoiceDto.cs
@@ -0,0 +1,13 @@
+using System;
+
+namespace survey_beta.DTOs.Default
+{
+ public class ChoiceDto
+ {
+ public string Id { get; set; } = Guid.NewGuid().ToString();
+ 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
new file mode 100644
index 0000000..d109cee
--- /dev/null
+++ b/survey-beta/DTOs/Default/QuestionDto.cs
@@ -0,0 +1,12 @@
+namespace survey_beta.DTOs.Default
+{
+ public class QuestionDto
+ {
+ public string Id { get; set; } = Guid.NewGuid().ToString();
+ public string Content { get; set; }
+ public string SurveyId { 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
new file mode 100644
index 0000000..332371f
--- /dev/null
+++ b/survey-beta/DTOs/Default/ResponseDto.cs
@@ -0,0 +1,11 @@
+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
new file mode 100644
index 0000000..2d8cb9b
--- /dev/null
+++ b/survey-beta/DTOs/Default/SurveyDto.cs
@@ -0,0 +1,15 @@
+namespace survey_beta.DTOs.Default
+{
+ public class SurveyDto
+ {
+ 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/Default/SurveyParametersDto.cs b/survey-beta/DTOs/Default/SurveyParametersDto.cs
new file mode 100644
index 0000000..9d489da
--- /dev/null
+++ b/survey-beta/DTOs/Default/SurveyParametersDto.cs
@@ -0,0 +1,8 @@
+namespace survey_beta.DTOs.Default
+{
+ public class SurveyParametersDto
+ {
+ public string? AuthorId { get; set; }
+ public string? Category { get; set; }
+ }
+}
diff --git a/survey-beta/DTOs/Default/UserDto.cs b/survey-beta/DTOs/Default/UserDto.cs
new file mode 100644
index 0000000..5b51da9
--- /dev/null
+++ b/survey-beta/DTOs/Default/UserDto.cs
@@ -0,0 +1,11 @@
+namespace survey_beta.DTOs.Default
+{
+ public class UserDto
+ {
+ public string? Id { get; set; }
+ public string? Email { get; set; }
+ public string? Username { get; set; }
+ public string? Fullname { get; set; }
+ public string Token { get; set; }
+ }
+}
diff --git a/survey-beta/DTOs/Default/UserInfoDto.cs b/survey-beta/DTOs/Default/UserInfoDto.cs
new file mode 100644
index 0000000..667f5a3
--- /dev/null
+++ b/survey-beta/DTOs/Default/UserInfoDto.cs
@@ -0,0 +1,6 @@
+namespace survey_beta.DTOs.Default
+{
+ public class UserInfoDto
+ {
+ }
+}
diff --git a/survey-beta/DTOs/Response/AnswerRequest.cs b/survey-beta/DTOs/Response/AnswerRequest.cs
new file mode 100644
index 0000000..8bdbd8c
--- /dev/null
+++ b/survey-beta/DTOs/Response/AnswerRequest.cs
@@ -0,0 +1,8 @@
+namespace survey_beta.DTOs.Response
+{
+ public class AnswerRequest
+ {
+ public string Question { get; set; }
+ public string AnswerText { get; set; }
+ }
+}
diff --git a/survey-beta/DTOs/Response/AuthorResponseDto.cs b/survey-beta/DTOs/Response/AuthorResponseDto.cs
new file mode 100644
index 0000000..9efa70c
--- /dev/null
+++ b/survey-beta/DTOs/Response/AuthorResponseDto.cs
@@ -0,0 +1,9 @@
+namespace survey_beta.DTOs.Response
+{
+ public class AuthorResponseDto
+ {
+ public string Id { get; set; }
+ public string Fullname { get; set; }
+ public string Username { get; set; }
+ }
+}
diff --git a/survey-beta/DTOs/Response/CreatorResponseDto.cs b/survey-beta/DTOs/Response/CreatorResponseDto.cs
new file mode 100644
index 0000000..a9b81d3
--- /dev/null
+++ b/survey-beta/DTOs/Response/CreatorResponseDto.cs
@@ -0,0 +1,10 @@
+namespace survey_beta.DTOs.Response
+{
+ public class CreatorResponseDto
+ {
+ public string Id { get; set; }
+ // public string? IpAddress { get; set; }
+ public string SurveyId { get; set; }
+ //public List Answers { get; set; }
+ }
+}
diff --git a/survey-beta/DTOs/Response/SurveyResponse.cs b/survey-beta/DTOs/Response/SurveyResponse.cs
new file mode 100644
index 0000000..b04203c
--- /dev/null
+++ b/survey-beta/DTOs/Response/SurveyResponse.cs
@@ -0,0 +1,12 @@
+namespace survey_beta.DTOs.Response
+{
+ public class SurveyResponseDto
+ {
+ 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 bool IsPublished { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/survey-beta/DTOs/Update/SurveyAnalytics.cs b/survey-beta/DTOs/Update/SurveyAnalytics.cs
new file mode 100644
index 0000000..2b4417d
--- /dev/null
+++ b/survey-beta/DTOs/Update/SurveyAnalytics.cs
@@ -0,0 +1,9 @@
+namespace survey_beta.DTOs.Update
+{
+ public class SurveyAnalytics
+ {
+ public string SurveyId { get; set; }
+ public int TotalResponses { get; set; }
+ public DateTime CreatedAt { get; set; }
+ }
+}
diff --git a/survey-beta/DTOs/Update/SurveyStats.cs b/survey-beta/DTOs/Update/SurveyStats.cs
new file mode 100644
index 0000000..3a02421
--- /dev/null
+++ b/survey-beta/DTOs/Update/SurveyStats.cs
@@ -0,0 +1,10 @@
+namespace survey_beta.DTOs.Update
+{
+ public class SurveyStats
+ {
+ public string? SurveyId { get; set; }
+ public int TotalResponses { get; set; }
+ public Dictionary? AnswerFrequency { get; set; }
+ public Dictionary? QuestionFrequency { get; set; }
+ }
+}
diff --git a/survey-beta/DTOs/Update/UpdateSurveyDto.cs b/survey-beta/DTOs/Update/UpdateSurveyDto.cs
new file mode 100644
index 0000000..ccedc74
--- /dev/null
+++ b/survey-beta/DTOs/Update/UpdateSurveyDto.cs
@@ -0,0 +1,12 @@
+namespace survey_beta.DTOs.Update
+{
+ public class UpdateSurveyDto
+ {
+ 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 bool IsPublished { get; set; }
+ }
+}
diff --git a/survey-beta/DataBaseContext/AppDbContext.cs b/survey-beta/DataBaseContext/AppDbContext.cs
index efca097..9e93612 100644
--- a/survey-beta/DataBaseContext/AppDbContext.cs
+++ b/survey-beta/DataBaseContext/AppDbContext.cs
@@ -1,10 +1,12 @@
-using Microsoft.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 : DbContext
+ public class AppDbContext : Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityDbContext
{
- public DbSet Users { get; set; }
public DbSet Surveys { get; set; }
public DbSet Questions { get; set; }
public DbSet Choices { get; set; }
@@ -14,43 +16,44 @@ namespace survey_beta.DataBaseContext
public AppDbContext(DbContextOptions options) : base(options)
{
}
+
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
+ base.OnModelCreating(modelBuilder);
+
+ modelBuilder.Entity()
+ .Property(u => u.Fullname)
+ .IsRequired();
+
modelBuilder.Entity()
.HasOne(s => s.Author)
.WithMany(u => u.Surveys)
- .HasForeignKey(s => s.AuthorId);
+ .HasForeignKey(s => s.AuthorId)
+ .OnDelete(DeleteBehavior.Cascade);
modelBuilder.Entity()
- .HasOne(q => q.Survey)
- .WithMany(s => s.Questions)
- .HasForeignKey(q => q.SurveyId);
+ .HasIndex(q => q.SurveyId);
+ modelBuilder.Entity()
+ .HasIndex(c => c.QuestionId);
+
modelBuilder.Entity()
.HasOne(c => c.Question)
.WithMany(q => q.Choices)
- .HasForeignKey(c => c.QuestionId);
-
- modelBuilder.Entity()
- .HasOne(r => r.Survey)
- .WithMany(s => s.Responses)
- .HasForeignKey(r => r.SurveyId);
-
- modelBuilder.Entity()
- .HasOne(a => a.Response)
- .WithMany(r => r.Answers)
- .HasForeignKey(a => a.ResponseId);
+ .HasForeignKey(c => c.QuestionId)
+ .OnDelete(DeleteBehavior.Cascade);
modelBuilder.Entity()
.HasOne(a => a.Question)
.WithMany()
- .HasForeignKey(a => a.QuestionId);
+ .HasForeignKey(a => a.QuestionId)
+ .OnDelete(DeleteBehavior.Cascade);
modelBuilder.Entity()
.HasOne(a => a.Choice)
- .WithMany()
- .HasForeignKey(a => a.ChoiceId);
+ .WithMany()
+ .HasForeignKey(a => a.ChoiceId)
+ .OnDelete(DeleteBehavior.Cascade);
}
}
-}
-
+}
\ No newline at end of file
diff --git a/survey-beta/Mappers/ChoiceMapper.cs b/survey-beta/Mappers/ChoiceMapper.cs
new file mode 100644
index 0000000..9a4b1cd
--- /dev/null
+++ b/survey-beta/Mappers/ChoiceMapper.cs
@@ -0,0 +1,32 @@
+#if false
+using survey_beta.DTOs.Create;
+using survey_beta.DTOs.Default;
+using survey_beta.Models;
+
+namespace survey_beta.Mappers
+{
+ public class ChoiceMapper
+ {
+ public static ChoiceDto ToDto(Choice choice)
+ {
+ return new ChoiceDto
+ {
+ Id = choice.Id,
+ Letter = choice.Letter,
+ Content = choice.Content,
+ QuestionId = choice.QuestionId
+ };
+ }
+
+ public static Choice ToEntity(CreateChoiceDto dto)
+ {
+ return new Choice
+ {
+ Id = Guid.NewGuid().ToString(),
+ Letter = dto.Letter,
+ Content = dto.Content,
+ };
+ }
+ }
+}
+#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
new file mode 100644
index 0000000..e5115f0
--- /dev/null
+++ b/survey-beta/Mappers/QuestionMapper.cs
@@ -0,0 +1,32 @@
+#if false
+
+using survey_beta.DTOs.Create;
+using survey_beta.DTOs.Default;
+using survey_beta.Models;
+
+namespace survey_beta.Mappers
+{
+ public class QuestionMapper
+ {
+ public static QuestionDto ToDto(Question question)
+ {
+ return new QuestionDto
+ {
+ Id = question.Id,
+ Content = question.Content,
+ SurveyId = question.SurveyId
+ };
+ }
+
+ public static Question ToEntity(CreateQuestionDto dto)
+ {
+ return new Question
+ {
+ Id = Guid.NewGuid().ToString(),
+ Content = dto.Content,
+ // SurveyId = dto.SurveyId
+ };
+ }
+ }
+}
+#endif
diff --git a/survey-beta/Mappers/ResponseMapper.cs b/survey-beta/Mappers/ResponseMapper.cs
new file mode 100644
index 0000000..20956d3
--- /dev/null
+++ b/survey-beta/Mappers/ResponseMapper.cs
@@ -0,0 +1,31 @@
+#if false
+using survey_beta.DTOs.Create;
+using survey_beta.DTOs.Default;
+using survey_beta.Models;
+
+namespace survey_beta.Mappers
+{
+ public class ResponseMapper
+ {
+ public static ResponseDto ToDto(Response response)
+ {
+ return new ResponseDto
+ {
+ Id = response.Id,
+ // IpAddress = response.IpAddress,
+ SurveyId = response.SurveyId
+ };
+ }
+
+ public static Response ToEntity(CreateResponseDto dto)
+ {
+ return new Response
+ {
+ Id = Guid.NewGuid().ToString(),
+ //IpAddress = dto.IpAddress,
+ SurveyId = dto.SurveyId
+ };
+ }
+ }
+}
+#endif
\ No newline at end of file
diff --git a/survey-beta/Mappers/SurveyMapper.cs b/survey-beta/Mappers/SurveyMapper.cs
new file mode 100644
index 0000000..0c42cf2
--- /dev/null
+++ b/survey-beta/Mappers/SurveyMapper.cs
@@ -0,0 +1,38 @@
+#if false
+using survey_beta.DTOs.Create;
+using survey_beta.DTOs.Default;
+using survey_beta.Models;
+
+namespace survey_beta.Mappers
+{
+ public class SurveyMapper
+ {
+ public static SurveyDto ToDto(Survey survey)
+ {
+ return new SurveyDto
+ {
+ Id = survey.Id,
+ Title = survey.Title,
+ Description = survey.Description,
+ Category = survey.Category,
+ IsPublished = survey.IsPublished,
+ AuthorId = survey.AuthorId
+ };
+ }
+
+ public static Survey ToEntity(CreateSurveyDto dto, string authorId)
+ {
+ return new Survey
+ {
+ Id = Guid.NewGuid().ToString(),
+ Title = dto.Title,
+ Description = dto.Description,
+ Category = dto.Category,
+ ExpirationDate = dto.ExpirationDate,
+ IsPublished = false,
+ AuthorId = authorId
+ };
+ }
+ }
+}
+#endif
\ No newline at end of file
diff --git a/survey-beta/Mappers/UserMapper.cs b/survey-beta/Mappers/UserMapper.cs
new file mode 100644
index 0000000..60d238d
--- /dev/null
+++ b/survey-beta/Mappers/UserMapper.cs
@@ -0,0 +1,37 @@
+#if false
+using Microsoft.AspNetCore.Identity;
+using survey_beta.DTOs.Create;
+using survey_beta.DTOs.Default;
+using survey_beta.Models;
+
+namespace survey_beta.Mappers
+{
+ public class UserMapper
+ {
+ public static UserDto ToDto(User user)
+ {
+ return new UserDto
+ {
+ Id = user.Id,
+ Email = user.Email,
+ Username = user.UserName,
+ Fullname = user.Fullname
+ };
+ }
+
+ public static User ToEntity(CreateUserDto dto, IPasswordHasher passwordHasher)
+ {
+ var user = new User
+ {
+ Id = Guid.NewGuid().ToString(),
+ Email = dto.Email,
+ UserName = dto.Username,
+ Fullname = dto.Fullname,
+ };
+
+ user.PasswordHash = passwordHasher.HashPassword(user, dto.Password);
+ return user;
+ }
+ }
+}
+#endif
\ No newline at end of file
diff --git a/survey-beta/Migrations/20250126102512_intit.Designer.cs b/survey-beta/Migrations/20250126102512_intit.Designer.cs
new file mode 100644
index 0000000..83d72c9
--- /dev/null
+++ b/survey-beta/Migrations/20250126102512_intit.Designer.cs
@@ -0,0 +1,307 @@
+//
+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("20250126102512_intit")]
+ partial class intit
+ {
+ ///
+ 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("survey_beta.Models.Answer", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("text");
+
+ b.Property("ChoiceId")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("QuestionId")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("ResponseId")
+ .IsRequired()
+ .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")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("Letter")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("QuestionId")
+ .IsRequired()
+ .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")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("SurveyId")
+ .IsRequired()
+ .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("IpAddress")
+ .IsRequired()
+ .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")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("Category")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("Description")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("ExpirationDate")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("IsPublished")
+ .HasColumnType("boolean");
+
+ b.Property("Title")
+ .IsRequired()
+ .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")
+ .HasColumnType("text");
+
+ b.Property("Email")
+ .HasColumnType("text");
+
+ b.Property("EmailConfirmed")
+ .HasColumnType("boolean");
+
+ b.Property("Fullname")
+ .HasColumnType("text");
+
+ b.Property("LockoutEnabled")
+ .HasColumnType("boolean");
+
+ b.Property("LockoutEnd")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("NormalizedEmail")
+ .HasColumnType("text");
+
+ b.Property("NormalizedUserName")
+ .HasColumnType("text");
+
+ 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")
+ .HasColumnType("text");
+
+ b.Property("Username")
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.ToTable("User");
+ });
+
+ modelBuilder.Entity("survey_beta.Models.Answer", b =>
+ {
+ b.HasOne("survey_beta.Models.Choice", "Choice")
+ .WithMany()
+ .HasForeignKey("ChoiceId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("survey_beta.Models.Question", "Question")
+ .WithMany()
+ .HasForeignKey("QuestionId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("survey_beta.Models.Response", "Response")
+ .WithMany("Answers")
+ .HasForeignKey("ResponseId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ 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)
+ .IsRequired();
+
+ b.Navigation("Question");
+ });
+
+ modelBuilder.Entity("survey_beta.Models.Question", b =>
+ {
+ b.HasOne("survey_beta.Models.Survey", "Survey")
+ .WithMany("Questions")
+ .HasForeignKey("SurveyId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("Survey");
+ });
+
+ modelBuilder.Entity("survey_beta.Models.Response", b =>
+ {
+ b.HasOne("survey_beta.Models.Survey", "Survey")
+ .WithMany("Responses")
+ .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)
+ .IsRequired();
+
+ 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");
+
+ b.Navigation("Responses");
+ });
+
+ modelBuilder.Entity("survey_beta.Models.User", b =>
+ {
+ b.Navigation("Surveys");
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/survey-beta/Migrations/20250126102512_intit.cs b/survey-beta/Migrations/20250126102512_intit.cs
new file mode 100644
index 0000000..881f454
--- /dev/null
+++ b/survey-beta/Migrations/20250126102512_intit.cs
@@ -0,0 +1,212 @@
+using System;
+using Microsoft.EntityFrameworkCore.Migrations;
+
+#nullable disable
+
+namespace survey_beta.Migrations
+{
+ ///
+ public partial class intit : Migration
+ {
+ ///
+ protected override void Up(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.CreateTable(
+ name: "User",
+ columns: table => new
+ {
+ Id = table.Column(type: "text", nullable: false),
+ Username = table.Column(type: "text", nullable: true),
+ Fullname = table.Column(type: "text", nullable: true),
+ Email = table.Column(type: "text", nullable: true),
+ PasswordHash = table.Column(type: "text", nullable: true),
+ UserName = table.Column(type: "text", nullable: true),
+ NormalizedUserName = table.Column(type: "text", nullable: true),
+ NormalizedEmail = table.Column(type: "text", nullable: true),
+ EmailConfirmed = table.Column(type: "boolean", nullable: false),
+ SecurityStamp = table.Column(type: "text", nullable: true),
+ ConcurrencyStamp = table.Column(type: "text", nullable: true),
+ PhoneNumber = table.Column(type: "text", nullable: true),
+ PhoneNumberConfirmed = table.Column(type: "boolean", nullable: false),
+ TwoFactorEnabled = table.Column(type: "boolean", nullable: false),
+ LockoutEnd = table.Column(type: "timestamp with time zone", nullable: true),
+ LockoutEnabled = table.Column(type: "boolean", nullable: false),
+ AccessFailedCount = table.Column(type: "integer", nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_User", x => x.Id);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "Surveys",
+ columns: table => new
+ {
+ Id = table.Column(type: "text", nullable: false),
+ Title = table.Column(type: "text", nullable: false),
+ Description = table.Column(type: "text", nullable: false),
+ Category = table.Column(type: "text", nullable: false),
+ ExpirationDate = table.Column(type: "timestamp with time zone", nullable: false),
+ IsPublished = table.Column(type: "boolean", nullable: false),
+ AuthorId = table.Column(type: "text", nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_Surveys", x => x.Id);
+ table.ForeignKey(
+ name: "FK_Surveys_User_AuthorId",
+ column: x => x.AuthorId,
+ principalTable: "User",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Cascade);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "Questions",
+ columns: table => new
+ {
+ Id = table.Column(type: "text", nullable: false),
+ Content = table.Column(type: "text", nullable: false),
+ SurveyId = table.Column(type: "text", nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_Questions", x => x.Id);
+ table.ForeignKey(
+ name: "FK_Questions_Surveys_SurveyId",
+ column: x => x.SurveyId,
+ principalTable: "Surveys",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Cascade);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "Responses",
+ columns: table => new
+ {
+ Id = table.Column(type: "text", nullable: false),
+ IpAddress = table.Column(type: "text", nullable: false),
+ SurveyId = table.Column(type: "text", nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_Responses", x => x.Id);
+ table.ForeignKey(
+ name: "FK_Responses_Surveys_SurveyId",
+ column: x => x.SurveyId,
+ principalTable: "Surveys",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Cascade);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "Choices",
+ columns: table => new
+ {
+ Id = table.Column(type: "text", nullable: false),
+ Letter = table.Column(type: "text", nullable: false),
+ Content = table.Column(type: "text", nullable: false),
+ QuestionId = table.Column(type: "text", nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_Choices", x => x.Id);
+ table.ForeignKey(
+ name: "FK_Choices_Questions_QuestionId",
+ column: x => x.QuestionId,
+ principalTable: "Questions",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Cascade);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "Answers",
+ columns: table => new
+ {
+ Id = table.Column(type: "text", nullable: false),
+ ResponseId = table.Column(type: "text", nullable: false),
+ QuestionId = table.Column(type: "text", nullable: false),
+ ChoiceId = table.Column(type: "text", nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_Answers", x => x.Id);
+ table.ForeignKey(
+ name: "FK_Answers_Choices_ChoiceId",
+ column: x => x.ChoiceId,
+ principalTable: "Choices",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Cascade);
+ table.ForeignKey(
+ name: "FK_Answers_Questions_QuestionId",
+ column: x => x.QuestionId,
+ principalTable: "Questions",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Cascade);
+ table.ForeignKey(
+ name: "FK_Answers_Responses_ResponseId",
+ column: x => x.ResponseId,
+ principalTable: "Responses",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Cascade);
+ });
+
+ migrationBuilder.CreateIndex(
+ name: "IX_Answers_ChoiceId",
+ table: "Answers",
+ column: "ChoiceId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_Answers_QuestionId",
+ table: "Answers",
+ column: "QuestionId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_Answers_ResponseId",
+ table: "Answers",
+ column: "ResponseId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_Choices_QuestionId",
+ table: "Choices",
+ column: "QuestionId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_Questions_SurveyId",
+ table: "Questions",
+ column: "SurveyId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_Responses_SurveyId",
+ table: "Responses",
+ column: "SurveyId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_Surveys_AuthorId",
+ table: "Surveys",
+ column: "AuthorId");
+ }
+
+ ///
+ protected override void Down(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.DropTable(
+ name: "Answers");
+
+ migrationBuilder.DropTable(
+ name: "Choices");
+
+ migrationBuilder.DropTable(
+ name: "Responses");
+
+ migrationBuilder.DropTable(
+ name: "Questions");
+
+ migrationBuilder.DropTable(
+ name: "Surveys");
+
+ migrationBuilder.DropTable(
+ name: "User");
+ }
+ }
+}
diff --git a/survey-beta/Migrations/20250128174252_Controllers.Designer.cs b/survey-beta/Migrations/20250128174252_Controllers.Designer.cs
new file mode 100644
index 0000000..4d447b8
--- /dev/null
+++ b/survey-beta/Migrations/20250128174252_Controllers.Designer.cs
@@ -0,0 +1,502 @@
+//
+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("20250128174252_Controllers")]
+ partial class Controllers
+ {
+ ///
+ 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")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("QuestionId")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("ResponseId")
+ .IsRequired()
+ .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")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("Letter")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("QuestionId")
+ .IsRequired()
+ .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")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("SurveyId")
+ .IsRequired()
+ .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("IpAddress")
+ .IsRequired()
+ .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")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("Category")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("Description")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("ExpirationDate")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("IsPublished")
+ .HasColumnType("boolean");
+
+ b.Property("Title")
+ .IsRequired()
+ .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")
+ .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.Property("Username")
+ .HasColumnType("text");
+
+ 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)
+ .IsRequired();
+
+ b.HasOne("survey_beta.Models.Question", "Question")
+ .WithMany()
+ .HasForeignKey("QuestionId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("survey_beta.Models.Response", "Response")
+ .WithMany("Answers")
+ .HasForeignKey("ResponseId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ 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)
+ .IsRequired();
+
+ b.Navigation("Question");
+ });
+
+ modelBuilder.Entity("survey_beta.Models.Question", b =>
+ {
+ b.HasOne("survey_beta.Models.Survey", "Survey")
+ .WithMany("Questions")
+ .HasForeignKey("SurveyId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("Survey");
+ });
+
+ modelBuilder.Entity("survey_beta.Models.Response", b =>
+ {
+ b.HasOne("survey_beta.Models.Survey", "Survey")
+ .WithMany("Responses")
+ .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)
+ .IsRequired();
+
+ 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");
+
+ b.Navigation("Responses");
+ });
+
+ modelBuilder.Entity("survey_beta.Models.User", b =>
+ {
+ b.Navigation("Surveys");
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/survey-beta/Migrations/20250128174252_Controllers.cs b/survey-beta/Migrations/20250128174252_Controllers.cs
new file mode 100644
index 0000000..bcc355b
--- /dev/null
+++ b/survey-beta/Migrations/20250128174252_Controllers.cs
@@ -0,0 +1,332 @@
+using Microsoft.EntityFrameworkCore.Migrations;
+using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
+
+#nullable disable
+
+namespace survey_beta.Migrations
+{
+ ///
+ public partial class Controllers : Migration
+ {
+ ///
+ protected override void Up(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.DropForeignKey(
+ name: "FK_Surveys_User_AuthorId",
+ table: "Surveys");
+
+ migrationBuilder.DropPrimaryKey(
+ name: "PK_User",
+ table: "User");
+
+ migrationBuilder.RenameTable(
+ name: "User",
+ newName: "AspNetUsers");
+
+ migrationBuilder.AlterColumn(
+ name: "UserName",
+ table: "AspNetUsers",
+ type: "character varying(256)",
+ maxLength: 256,
+ nullable: true,
+ oldClrType: typeof(string),
+ oldType: "text",
+ oldNullable: true);
+
+ migrationBuilder.AlterColumn(
+ name: "NormalizedUserName",
+ table: "AspNetUsers",
+ type: "character varying(256)",
+ maxLength: 256,
+ nullable: true,
+ oldClrType: typeof(string),
+ oldType: "text",
+ oldNullable: true);
+
+ migrationBuilder.AlterColumn(
+ name: "NormalizedEmail",
+ table: "AspNetUsers",
+ type: "character varying(256)",
+ maxLength: 256,
+ nullable: true,
+ oldClrType: typeof(string),
+ oldType: "text",
+ oldNullable: true);
+
+ migrationBuilder.AlterColumn(
+ name: "Email",
+ table: "AspNetUsers",
+ type: "character varying(256)",
+ maxLength: 256,
+ nullable: true,
+ oldClrType: typeof(string),
+ oldType: "text",
+ oldNullable: true);
+
+ migrationBuilder.AddPrimaryKey(
+ name: "PK_AspNetUsers",
+ table: "AspNetUsers",
+ column: "Id");
+
+ migrationBuilder.CreateTable(
+ name: "AspNetRoles",
+ columns: table => new
+ {
+ Id = table.Column(type: "text", nullable: false),
+ Name = table.Column(type: "character varying(256)", maxLength: 256, nullable: true),
+ NormalizedName = table.Column(type: "character varying(256)", maxLength: 256, nullable: true),
+ ConcurrencyStamp = table.Column(type: "text", nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_AspNetRoles", x => x.Id);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "AspNetUserClaims",
+ columns: table => new
+ {
+ Id = table.Column(type: "integer", nullable: false)
+ .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
+ UserId = table.Column(type: "text", nullable: false),
+ ClaimType = table.Column(type: "text", nullable: true),
+ ClaimValue = table.Column(type: "text", nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_AspNetUserClaims", x => x.Id);
+ table.ForeignKey(
+ name: "FK_AspNetUserClaims_AspNetUsers_UserId",
+ column: x => x.UserId,
+ principalTable: "AspNetUsers",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Cascade);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "AspNetUserLogins",
+ columns: table => new
+ {
+ LoginProvider = table.Column(type: "text", nullable: false),
+ ProviderKey = table.Column(type: "text", nullable: false),
+ ProviderDisplayName = table.Column(type: "text", nullable: true),
+ UserId = table.Column(type: "text", nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_AspNetUserLogins", x => new { x.LoginProvider, x.ProviderKey });
+ table.ForeignKey(
+ name: "FK_AspNetUserLogins_AspNetUsers_UserId",
+ column: x => x.UserId,
+ principalTable: "AspNetUsers",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Cascade);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "AspNetUserTokens",
+ columns: table => new
+ {
+ UserId = table.Column(type: "text", nullable: false),
+ LoginProvider = table.Column(type: "text", nullable: false),
+ Name = table.Column(type: "text", nullable: false),
+ Value = table.Column(type: "text", nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_AspNetUserTokens", x => new { x.UserId, x.LoginProvider, x.Name });
+ table.ForeignKey(
+ name: "FK_AspNetUserTokens_AspNetUsers_UserId",
+ column: x => x.UserId,
+ principalTable: "AspNetUsers",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Cascade);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "AspNetRoleClaims",
+ columns: table => new
+ {
+ Id = table.Column(type: "integer", nullable: false)
+ .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
+ RoleId = table.Column(type: "text", nullable: false),
+ ClaimType = table.Column(type: "text", nullable: true),
+ ClaimValue = table.Column(type: "text", nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_AspNetRoleClaims", x => x.Id);
+ table.ForeignKey(
+ name: "FK_AspNetRoleClaims_AspNetRoles_RoleId",
+ column: x => x.RoleId,
+ principalTable: "AspNetRoles",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Cascade);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "AspNetUserRoles",
+ columns: table => new
+ {
+ UserId = table.Column(type: "text", nullable: false),
+ RoleId = table.Column(type: "text", nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_AspNetUserRoles", x => new { x.UserId, x.RoleId });
+ table.ForeignKey(
+ name: "FK_AspNetUserRoles_AspNetRoles_RoleId",
+ column: x => x.RoleId,
+ principalTable: "AspNetRoles",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Cascade);
+ table.ForeignKey(
+ name: "FK_AspNetUserRoles_AspNetUsers_UserId",
+ column: x => x.UserId,
+ principalTable: "AspNetUsers",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Cascade);
+ });
+
+ migrationBuilder.CreateIndex(
+ name: "EmailIndex",
+ table: "AspNetUsers",
+ column: "NormalizedEmail");
+
+ migrationBuilder.CreateIndex(
+ name: "UserNameIndex",
+ table: "AspNetUsers",
+ column: "NormalizedUserName",
+ unique: true);
+
+ migrationBuilder.CreateIndex(
+ name: "IX_AspNetRoleClaims_RoleId",
+ table: "AspNetRoleClaims",
+ column: "RoleId");
+
+ migrationBuilder.CreateIndex(
+ name: "RoleNameIndex",
+ table: "AspNetRoles",
+ column: "NormalizedName",
+ unique: true);
+
+ migrationBuilder.CreateIndex(
+ name: "IX_AspNetUserClaims_UserId",
+ table: "AspNetUserClaims",
+ column: "UserId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_AspNetUserLogins_UserId",
+ table: "AspNetUserLogins",
+ column: "UserId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_AspNetUserRoles_RoleId",
+ table: "AspNetUserRoles",
+ column: "RoleId");
+
+ migrationBuilder.AddForeignKey(
+ name: "FK_Surveys_AspNetUsers_AuthorId",
+ table: "Surveys",
+ column: "AuthorId",
+ principalTable: "AspNetUsers",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Cascade);
+ }
+
+ ///
+ protected override void Down(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.DropForeignKey(
+ name: "FK_Surveys_AspNetUsers_AuthorId",
+ table: "Surveys");
+
+ migrationBuilder.DropTable(
+ name: "AspNetRoleClaims");
+
+ migrationBuilder.DropTable(
+ name: "AspNetUserClaims");
+
+ migrationBuilder.DropTable(
+ name: "AspNetUserLogins");
+
+ migrationBuilder.DropTable(
+ name: "AspNetUserRoles");
+
+ migrationBuilder.DropTable(
+ name: "AspNetUserTokens");
+
+ migrationBuilder.DropTable(
+ name: "AspNetRoles");
+
+ migrationBuilder.DropPrimaryKey(
+ name: "PK_AspNetUsers",
+ table: "AspNetUsers");
+
+ migrationBuilder.DropIndex(
+ name: "EmailIndex",
+ table: "AspNetUsers");
+
+ migrationBuilder.DropIndex(
+ name: "UserNameIndex",
+ table: "AspNetUsers");
+
+ migrationBuilder.RenameTable(
+ name: "AspNetUsers",
+ newName: "User");
+
+ migrationBuilder.AlterColumn(
+ name: "UserName",
+ table: "User",
+ type: "text",
+ nullable: true,
+ oldClrType: typeof(string),
+ oldType: "character varying(256)",
+ oldMaxLength: 256,
+ oldNullable: true);
+
+ migrationBuilder.AlterColumn(
+ name: "NormalizedUserName",
+ table: "User",
+ type: "text",
+ nullable: true,
+ oldClrType: typeof(string),
+ oldType: "character varying(256)",
+ oldMaxLength: 256,
+ oldNullable: true);
+
+ migrationBuilder.AlterColumn(
+ name: "NormalizedEmail",
+ table: "User",
+ type: "text",
+ nullable: true,
+ oldClrType: typeof(string),
+ oldType: "character varying(256)",
+ oldMaxLength: 256,
+ oldNullable: true);
+
+ migrationBuilder.AlterColumn(
+ name: "Email",
+ table: "User",
+ type: "text",
+ nullable: true,
+ oldClrType: typeof(string),
+ oldType: "character varying(256)",
+ oldMaxLength: 256,
+ oldNullable: true);
+
+ migrationBuilder.AddPrimaryKey(
+ name: "PK_User",
+ table: "User",
+ column: "Id");
+
+ migrationBuilder.AddForeignKey(
+ name: "FK_Surveys_User_AuthorId",
+ table: "Surveys",
+ column: "AuthorId",
+ principalTable: "User",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Cascade);
+ }
+ }
+}
diff --git a/survey-beta/Migrations/20250131114349_ControllersServices.Designer.cs b/survey-beta/Migrations/20250131114349_ControllersServices.Designer.cs
new file mode 100644
index 0000000..55f13d4
--- /dev/null
+++ b/survey-beta/Migrations/20250131114349_ControllersServices.Designer.cs
@@ -0,0 +1,500 @@
+//
+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("20250131114349_ControllersServices")]
+ partial class ControllersServices
+ {
+ ///
+ 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