164 lines
5.4 KiB
C#
164 lines
5.4 KiB
C#
using Data;
|
|
using Microsoft.AspNetCore.Mvc;
|
|
using Microsoft.EntityFrameworkCore;
|
|
using Model;
|
|
using Newtonsoft.Json;
|
|
using Services.Interaces;
|
|
using System.Globalization;
|
|
using System.Security.Cryptography;
|
|
using System.Text;
|
|
using Web.ViewModel.AnswerVM;
|
|
using Web.ViewModel.QuestionnaireVM;
|
|
using Web.ViewModel.QuestionVM;
|
|
|
|
namespace Web.Controllers
|
|
{
|
|
public class QuestionnaireResponseController : Controller
|
|
{
|
|
private readonly IQuestionnaireRepository _questionnaireRepository;
|
|
private readonly SurveyContext _context;
|
|
|
|
public QuestionnaireResponseController(IQuestionnaireRepository questionnaireRepository,SurveyContext context)
|
|
{
|
|
_questionnaireRepository = questionnaireRepository;
|
|
_context = context;
|
|
}
|
|
public IActionResult Index()
|
|
{
|
|
|
|
return View();
|
|
}
|
|
|
|
public IActionResult Error()
|
|
{
|
|
ViewBag.ErrorMessage = "The survey link has expired. request a new link.";
|
|
|
|
return View();
|
|
}
|
|
|
|
public IActionResult DisplayQuestionnaire(int id,string t)
|
|
{
|
|
// Check if the token is null or empty
|
|
if (string.IsNullOrEmpty(t))
|
|
{
|
|
ViewBag.ErrorMessage = "The URL is invalid. Please provide a valid token.";
|
|
return View("Error");
|
|
}
|
|
|
|
// Split the token to extract the expiration date and time
|
|
string[] tokenParts = t.Split('|');
|
|
if (tokenParts.Length != 2)
|
|
{
|
|
ViewBag.ErrorMessage = "The URL is invalid. Please provide a valid token.";
|
|
return View("Error");
|
|
}
|
|
|
|
string expiryDateTimeString = tokenParts[1];
|
|
|
|
// Parse the expiration datetime in UTC format
|
|
if (!DateTime.TryParseExact(expiryDateTimeString, "yyyy-MM-ddTHH:mm:ssZ", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal, out DateTime expiryDateTimeUtc))
|
|
{
|
|
ViewBag.ErrorMessage = "The URL is invalid. Please provide a valid token.";
|
|
return View("Error");
|
|
}
|
|
|
|
// Convert the expiration datetime to local time
|
|
DateTime expiryDateTimeLocal = expiryDateTimeUtc.ToLocalTime();
|
|
|
|
// Check if the token is expired (accounting for UTC+2 offset)
|
|
if (expiryDateTimeLocal < DateTime.Now.AddHours(2))
|
|
{
|
|
|
|
return RedirectToAction(nameof(Error));
|
|
}
|
|
|
|
// Retrieve the questionnaire using the numeric ID
|
|
var questionnaire = _questionnaireRepository.GetQuestionnaireWithQuestionAndAnswer(id);
|
|
|
|
return View(MapToViewModel(questionnaire));
|
|
}
|
|
[HttpPost]
|
|
public IActionResult DisplayQuestionnaire([FromForm] ResponseQuestionnaireViewModel questionnaire)
|
|
{
|
|
//bool hasSubmitted = _context.Responses.Any(r => r.QuestionnaireId == questionnaire.Id && r.UserEmail == questionnaire.Email);
|
|
|
|
//if (hasSubmitted)
|
|
//{
|
|
// TempData["ErrorMessage"] = "You have already completed this survey.";
|
|
// return RedirectToAction("ThankYou");
|
|
//}
|
|
|
|
var response = new Response
|
|
{
|
|
QuestionnaireId = questionnaire.Id,
|
|
UserName = questionnaire.UserName,
|
|
UserEmail = questionnaire.Email,
|
|
SubmissionDate = DateTime.UtcNow,
|
|
ResponseDetails = questionnaire.Questions.Select(q => new ResponseDetail
|
|
{
|
|
QuestionId = q.Id,
|
|
QuestionType=q.Type,
|
|
// Handle TextResponse based on question type
|
|
TextResponse = (q.Type == QuestionType.Open_ended || q.Type == QuestionType.Text || q.Type==QuestionType.Slider)
|
|
? string.Join(" ", q.SelectedText) // Ensure SelectedText is appropriately used based on question type
|
|
: null,
|
|
ResponseAnswers = q.SelectedAnswerIds
|
|
.Select(aid => new ResponseAnswer { AnswerId = aid })
|
|
.ToList() // Ensure that the list is initialized correctly
|
|
}).ToList()
|
|
};
|
|
|
|
|
|
_context.Responses.Add(response);
|
|
_context.SaveChanges();
|
|
|
|
TempData["UserName"] = questionnaire.UserName;
|
|
|
|
return RedirectToAction(nameof(ThankYou));
|
|
|
|
}
|
|
|
|
[HttpGet]
|
|
public IActionResult ThankYou()
|
|
{
|
|
ViewBag.UserName = TempData["UserName"];
|
|
return View();
|
|
}
|
|
|
|
|
|
private ResponseQuestionnaireViewModel MapToViewModel(Questionnaire questionnaire)
|
|
{
|
|
var viewModel = new ResponseQuestionnaireViewModel
|
|
{
|
|
Id = questionnaire.Id,
|
|
Title = questionnaire.Title,
|
|
Description = questionnaire.Description,
|
|
Questions = questionnaire.Questions.Select(q => new ResponseQuestionViewModel
|
|
{
|
|
Id = q.Id,
|
|
Text = q.Text,
|
|
Type = q.Type,
|
|
Answers = q.Answers.Select(a => new ResponseAnswerViewModel
|
|
{
|
|
Id = a.Id,
|
|
Text = a.Text
|
|
}).ToList()
|
|
}).ToList()
|
|
};
|
|
|
|
return viewModel;
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|