Hovedgaden 3
@@ -558,6 +585,18 @@ namespace Web.Areas.Admin.Controllers
// If model state is not valid, return the view with validation errors
return View(viewModel);
}
+ public string GenerateExpiryToken(DateTime expiryDate)
+ {
+ // Generate a unique token, for example, using a cryptographic library or a GUID
+ string token = Guid.NewGuid().ToString();
+
+ // Append the expiration date to the token (you might want to encrypt it for security)
+ string tokenWithExpiry = $"{token}|{expiryDate.ToString("yyyy-MM-ddTHH:mm:ssZ")}";
+
+ return tokenWithExpiry;
+ }
+
+
}
}
diff --git a/Web/Areas/Admin/Views/Questionnaire/SendQuestionnaire.cshtml b/Web/Areas/Admin/Views/Questionnaire/SendQuestionnaire.cshtml
index ed1e4f3..6889216 100644
--- a/Web/Areas/Admin/Views/Questionnaire/SendQuestionnaire.cshtml
+++ b/Web/Areas/Admin/Views/Questionnaire/SendQuestionnaire.cshtml
@@ -30,6 +30,11 @@
+
+
+
+
+
diff --git a/Web/Controllers/QuestionnaireResponseController.cs b/Web/Controllers/QuestionnaireResponseController.cs
index 75c4a3e..e269b6f 100644
--- a/Web/Controllers/QuestionnaireResponseController.cs
+++ b/Web/Controllers/QuestionnaireResponseController.cs
@@ -1,7 +1,9 @@
using Microsoft.AspNetCore.Mvc;
using Services.Interaces;
+using System.Globalization;
using System.Security.Cryptography;
using System.Text;
+using Web.ViewModel.QuestionnaireVM;
namespace Web.Controllers
{
@@ -15,20 +17,102 @@ namespace Web.Controllers
}
public IActionResult Index()
{
+
return View();
}
- public IActionResult DisplayQuestionnaire(int id)
+ public IActionResult Error()
{
+ ViewBag.ErrorMessage = "The survey link has expired. request a new link.";
+
+ return View();
+ }
+
+ public IActionResult DisplayQuestionnaire(int id, string token)
+ {
+ // Check if the token is null or empty
+ if (string.IsNullOrEmpty(token))
+ {
+ 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 = token.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);
-
-
- // Display the questionnaire
+
return View(questionnaire);
}
-
+
+ //public IActionResult DisplayQuestionnaire(int id, string token)
+ //{
+ // // Check if the token is null or empty
+ // if (string.IsNullOrEmpty(token))
+ // {
+ // 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 = token.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 time zone offset)
+ // if (expiryDateTimeLocal >= DateTime.Now.AddHours(1))
+ // {
+
+ // return RedirectToAction(nameof(Error));
+ // }
+
+ // // Retrieve the questionnaire using the numeric ID
+ // var questionnaire = _questionnaireRepository.GetQuestionnaireWithQuestionAndAnswer(id);
+
+ // return View(questionnaire);
+ //}
+
+
}
}
diff --git a/Web/ViewModel/QuestionnaireVM/SendQuestionnaireViewModel.cs b/Web/ViewModel/QuestionnaireVM/SendQuestionnaireViewModel.cs
index 5bc1340..722704f 100644
--- a/Web/ViewModel/QuestionnaireVM/SendQuestionnaireViewModel.cs
+++ b/Web/ViewModel/QuestionnaireVM/SendQuestionnaireViewModel.cs
@@ -1,4 +1,5 @@
using NuGet.Protocol.Core.Types;
+using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
namespace Web.ViewModel.QuestionnaireVM
@@ -12,6 +13,10 @@ namespace Web.ViewModel.QuestionnaireVM
[Required]
public string? Email { get; set; }
+ [Required]
+ [DisplayName("Set expiration date and time for the URL")]
+ public DateTime? ExpirationDateTime { get; set; }
+
public int QuestionnaireId { get; set; }
}
diff --git a/Web/Views/QuestionnaireResponse/DisplayQuestionnaire.cshtml b/Web/Views/QuestionnaireResponse/DisplayQuestionnaire.cshtml
index a7fda96..1c04715 100644
--- a/Web/Views/QuestionnaireResponse/DisplayQuestionnaire.cshtml
+++ b/Web/Views/QuestionnaireResponse/DisplayQuestionnaire.cshtml
@@ -3,128 +3,192 @@
ViewData["Title"] = "DisplayQuestionnaire";
Layout = "~/Views/Shared/_QuestionnaireResponse.cshtml";
}
-
-
-
-
-
@Html.Raw(Model.Description)
- @{
- int questionNumber = 1; // Counter for question numbers, starting from 1
- }
+