SurveyVista/Web/Controllers/QuestionnaireResponseController.cs
2024-04-21 16:29:41 +02:00

163 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)
{
var questionnaire = _questionnaireRepository.GetQuestionnaireWithQuestionAndAnswer(id);
return View(MapToViewModel(questionnaire));
}
[HttpPost]
public IActionResult DisplayQuestionnaire([FromForm] ResponseQuestionnaireViewModel questionnaire)
{
//for (int i = 0; i < questionnaire.Questions.Count; i++)
//{
// var question = questionnaire.Questions[i];
// List<string> selectedTexts = new List<string>();
// // Assuming SelectedAnswerIds and SelectedTexts are parallel arrays
// for (int j = 0; j < question.SelectedAnswerIds.Count; j++)
// {
// int selectedId = question.SelectedAnswerIds[j];
// if (question.SelectedAnswerIds.Contains(selectedId)) // Ensure the ID was actually selected
// {
// selectedTexts.Add(question.SelectedText[j]);
// Console.WriteLine($"Selected Text{selectedTexts}")
// }
// }
// question.SelectedText = selectedTexts; // Now contains only the texts of selected answers
//}
// Process the updated model further as needed
/* return Json(questionnaire);*/ // Redirect to a results view, or handle as necessary
foreach (var question in questionnaire.Questions)
{
var dbQuestion = _context.Questions.Include(q => q.Answers).FirstOrDefault(q => q.Id == question.Id);
if (dbQuestion != null)
{
foreach (var selectedId in question.SelectedAnswerIds)
{
var selectedAnswer = dbQuestion.Answers.FirstOrDefault(a => a.Id == selectedId);
if (selectedAnswer != null)
{
Console.WriteLine($"Selected Answer Text: {selectedAnswer.Text}");
Console.WriteLine($"Selected Answer Id: {selectedAnswer.Id}");
// Here you could further process each selected answer, e.g., saving user responses
}
}
}
}
return Json(questionnaire);
}
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;
}
}
}
//// 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