diff --git a/Tsi1.Api/Tsi1.Api/Controllers/SurveyController.cs b/Tsi1.Api/Tsi1.Api/Controllers/SurveyController.cs index c05513baa8b3a89a686e1959d220d37defa0377f..c2bd326eb7bfb3134eb98f29aed587b72828b945 100644 --- a/Tsi1.Api/Tsi1.Api/Controllers/SurveyController.cs +++ b/Tsi1.Api/Tsi1.Api/Controllers/SurveyController.cs @@ -9,6 +9,7 @@ using Microsoft.AspNetCore.Mvc; using Tsi1.BusinessLayer.Dtos; using Tsi1.BusinessLayer.Helpers; using Tsi1.BusinessLayer.Interfaces; +using Tsi1.DataLayer.Entities; namespace Tsi1.Api.Controllers { @@ -83,11 +84,13 @@ namespace Tsi1.Api.Controllers return Ok(result.Data); } - [Authorize(Roles = UserTypes.FacultyAdmin + ", " + UserTypes.UdelarAdmin)] + [Authorize(Roles = UserTypes.FacultyAdmin + ", " + UserTypes.UdelarAdmin + ", " + UserTypes.Student)] [HttpGet("Get/{surveyId}")] public async Task<IActionResult> Get(int surveyId) { - var result = await _surveyService.GetGlobalSurvey(surveyId); + var userId = int.Parse(HttpContext.User.Claims.FirstOrDefault(x => x.Type == "Id").Value); + + var result = await _surveyService.Get(surveyId, userId); if (result.HasError) { @@ -97,5 +100,24 @@ namespace Tsi1.Api.Controllers return Ok(result.Data); } + [Authorize(Roles = UserTypes.Student)] + [HttpPost("Complete")] + public async Task<IActionResult> Complete(SurveyResponseCreateDto surveyResponse) + { + var userId = int.Parse(HttpContext.User.Claims.FirstOrDefault(x => x.Type == "Id").Value); + surveyResponse.UserId = userId; + + var result = await _surveyService.Complete(surveyResponse); + + if (result.HasError) + { + return NotFound(result.Message); + } + + return Ok(result.Data); + } + + + } } diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SectionItemDetailDto.cs b/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SectionItemDetailDto.cs index 9b6929057d90d5d05100f272a1818a7f01772e54..242f74d5178763ad580e4cd006ad5f71a698d645 100644 --- a/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SectionItemDetailDto.cs +++ b/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SectionItemDetailDto.cs @@ -11,5 +11,6 @@ namespace Tsi1.BusinessLayer.Dtos public int SectionItemTypeId { get; set; } public ForumPreviewDto Forum { get; set; } public FileDetailDto File { get; set; } + public SurveyDetailDto Survey { get; set; } } } diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyAnswerCreateDto.cs b/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyAnswerCreateDto.cs new file mode 100644 index 0000000000000000000000000000000000000000..2b261bbc014c40692bb438284506f3055d07cd66 --- /dev/null +++ b/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyAnswerCreateDto.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.Json.Serialization; + +namespace Tsi1.BusinessLayer.Dtos +{ + public class SurveyAnswerCreateDto + { + public int AnswerOptionId { get; set; } + public int SurveyQuestionId { get; set; } + } +} diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyAnswerDetailDto.cs b/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyAnswerDetailDto.cs new file mode 100644 index 0000000000000000000000000000000000000000..d51d83f915a2dc32286c2568e84987fcb880a64c --- /dev/null +++ b/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyAnswerDetailDto.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Tsi1.BusinessLayer.Dtos +{ + public class SurveyAnswerDetailDto + { + public int Id { get; set; } + public int AnswerOptionId { get; set; } + public int SurveyResponseId { get; set; } + public int SurveyQuestionId { get; set; } + } +} diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyDetailDto.cs b/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyDetailDto.cs index 8d265956a3ff56d3e342d832bc83f161608f1b40..7420c7c1e258d100eab7daed7e418a7833c49e36 100644 --- a/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyDetailDto.cs +++ b/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyDetailDto.cs @@ -11,6 +11,9 @@ namespace Tsi1.BusinessLayer.Dtos public bool IsGlobal { get; set; } public int TenantId { get; set; } - public ICollection<SurveyQuestionPreviewDto> SurveyQuestions { get; set; } + public List<SurveyQuestionPreviewDto> SurveyQuestions { get; set; } + + public SurveyResponseDetailDto SurveyResponse { get; set; } + } } diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyResponseCreateDto.cs b/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyResponseCreateDto.cs new file mode 100644 index 0000000000000000000000000000000000000000..2d8a31cf2b60df97ef20893561b9bf23f1edd8b1 --- /dev/null +++ b/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyResponseCreateDto.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.Json.Serialization; + +namespace Tsi1.BusinessLayer.Dtos +{ + public class SurveyResponseCreateDto + { + [JsonIgnore] + public int UserId { get; set; } + public int SurveyId { get; set; } + public List<SurveyAnswerCreateDto> SurveyAnswers { get; set; } + } +} diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyResponseDetailDto.cs b/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyResponseDetailDto.cs new file mode 100644 index 0000000000000000000000000000000000000000..70f064b0c2014ba58ec0b17032c1b3e39a0cdc41 --- /dev/null +++ b/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyResponseDetailDto.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Tsi1.BusinessLayer.Dtos +{ + public class SurveyResponseDetailDto + { + public int Id { get; set; } + public int UserId { get; set; } + public int SurveyId { get; set; } + public List<SurveyAnswerDetailDto> SurveyAnswers { get; set; } + } +} diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Helpers/MappingProfile.cs b/Tsi1.Api/Tsi1.BusinessLayer/Helpers/MappingProfile.cs index b6da4ce693a5224e87f7a5cb192e09723a3c58b7..1f30ef1cfdbb29e897c72ddc82dc175e8542b9b4 100644 --- a/Tsi1.Api/Tsi1.BusinessLayer/Helpers/MappingProfile.cs +++ b/Tsi1.Api/Tsi1.BusinessLayer/Helpers/MappingProfile.cs @@ -45,6 +45,10 @@ namespace Tsi1.BusinessLayer.Helpers CreateMap<Survey, SurveyDetailDto>(); CreateMap<SurveyQuestion, SurveyQuestionCreateDto>(); CreateMap<SurveyQuestion, SurveyQuestionPreviewDto>(); + CreateMap<SurveyResponse, SurveyResponseCreateDto>(); + CreateMap<SurveyResponse, SurveyResponseDetailDto>(); + CreateMap<SurveyAnswer, SurveyAnswerDetailDto>(); + CreateMap<SurveyAnswer, SurveyAnswerCreateDto>(); CreateMap<ForumCreateDto, Forum>(); CreateMap<ForumPreviewDto, Forum>(); @@ -79,6 +83,10 @@ namespace Tsi1.BusinessLayer.Helpers CreateMap<SurveyPreviewDto, Survey>(); CreateMap<SurveyQuestionCreateDto, SurveyQuestion>(); CreateMap<SurveyQuestionPreviewDto, SurveyQuestion>(); + CreateMap<SurveyResponseCreateDto, SurveyResponse>(); + CreateMap<SurveyResponseDetailDto, SurveyResponse>(); + CreateMap<SurveyAnswerDetailDto, SurveyAnswer>(); + CreateMap<SurveyAnswerCreateDto, SurveyAnswer>(); } } diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Interfaces/ISurveyService.cs b/Tsi1.Api/Tsi1.BusinessLayer/Interfaces/ISurveyService.cs index d77f1be63ab064dab9326b30cfc69134ae67d175..8ee85109c1928fae3f1eb262d664b5c6d97b780c 100644 --- a/Tsi1.Api/Tsi1.BusinessLayer/Interfaces/ISurveyService.cs +++ b/Tsi1.Api/Tsi1.BusinessLayer/Interfaces/ISurveyService.cs @@ -12,6 +12,7 @@ namespace Tsi1.BusinessLayer.Interfaces Task<ServiceResult<bool>> CreateGlobalSurvey(SurveyCreateDto newSurvey); Task<ServiceResult<bool>> DeleteGlobalSurvey(int surveyId, string userType, int tenantId); Task<ServiceResult<List<SurveyPreviewDto>>> GetAllGlobalSurvey(int tenantId, string userType); - Task<ServiceResult<SurveyDetailDto>> GetGlobalSurvey(int surveyId); + Task<ServiceResult<SurveyDetailDto>> Get(int surveyId, int userId); + Task<ServiceResult<bool>> Complete(SurveyResponseCreateDto surveyResponse); } } diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Services/SurveyService.cs b/Tsi1.Api/Tsi1.BusinessLayer/Services/SurveyService.cs index e8933693d701449b6961f9209ef5d94352117a2d..fe63136b4413efe7eea9c4df774dda73980184b8 100644 --- a/Tsi1.Api/Tsi1.BusinessLayer/Services/SurveyService.cs +++ b/Tsi1.Api/Tsi1.BusinessLayer/Services/SurveyService.cs @@ -103,14 +103,14 @@ namespace Tsi1.BusinessLayer.Services return result; } - public async Task<ServiceResult<SurveyDetailDto>> GetGlobalSurvey(int surveyId) + public async Task<ServiceResult<SurveyDetailDto>> Get(int surveyId, int userId) { var result = new ServiceResult<SurveyDetailDto>(); var survey = await _context.Surveys .Include(x => x.SurveyQuestions) .FirstOrDefaultAsync(x => x.Id == surveyId); - + if (survey == null) { result.HasError = true; @@ -118,7 +118,48 @@ namespace Tsi1.BusinessLayer.Services return result; } - result.Data = _mapper.Map<SurveyDetailDto>(survey); + var surveyResponse = await _context.SurveyResponses + .Include(x => x.SurveyAnswers) + .FirstOrDefaultAsync(x => x.SurveyId == surveyId && x.UserId == userId); + + var surveyResponseDto = _mapper.Map<SurveyResponseDetailDto>(surveyResponse); + var surveyDto = _mapper.Map<SurveyDetailDto>(survey); + surveyDto.SurveyResponse = surveyResponseDto; + + result.Data = surveyDto; + return result; + } + + public async Task<ServiceResult<bool>> Complete(SurveyResponseCreateDto surveyResponse) + { + var result = new ServiceResult<bool>(); + + var survey = await _context.Surveys + .FirstOrDefaultAsync(x => x.Id == surveyResponse.SurveyId); + + if (survey == null) + { + result.HasError = true; + result.AddMessage(string.Format(ErrorMessages.SurveyDoesNotExist, surveyResponse.SurveyId)); + return result; + } + + var existingSurveyResponse = await _context.SurveyResponses + .Include(x => x.SurveyAnswers) + .FirstOrDefaultAsync(x => x.SurveyId == surveyResponse.SurveyId && x.UserId == surveyResponse.UserId); + + if (existingSurveyResponse != null) + { + _mapper.Map(surveyResponse, existingSurveyResponse); + } + else + { + var newSurveyResponse = _mapper.Map<SurveyResponse>(surveyResponse); + _context.Add(newSurveyResponse); + } + + await _context.SaveChangesAsync(); + return result; } }