using System.IO; using System.Linq; using System.Web; using System.Web.Mvc; using LeafWeb.Core.Models; using LeafWeb.Web.Attributes; using LeafWeb.Web.ViewModels.LeafInput; namespace LeafWeb.Web.Controllers { public class LeafInputController : ControllerBase { public ActionResult Index() { // initialize the session storage to retain SessionID between requests Session["placeholder"] = 0; return View(); } private FileInfo[] GetBackloadDirectoryFiles(string directoryName) { var path = Path.Combine(Server.MapPath("~/Files/"), directoryName + "\\"); var directory = new DirectoryInfo(path); if (!directory.Exists) { return new FileInfo[] {}; } return directory.GetFiles(); } private void DeleteBackloadDirectory(string directoryName) { var path = Path.Combine(Server.MapPath("~/Files/"), directoryName + "\\"); var directory = new DirectoryInfo(path); if (directory.Exists) { directory.Delete(true); } } [HttpParamAction] [HttpPost] public ActionResult Index(CreateViewModel viewModel) { // directory name is the sessionID var files = GetBackloadDirectoryFiles(Session.SessionID); if (!files.Any()) { ModelState.AddModelError("", "Must select at least one file"); } if (ModelState.IsValid && !IsHttpParamActionMatch()) { // Go to confirmation var confirmViewModel = new ConfirmViewModel(viewModel, files.Select(f => f.Name).ToArray()); return View("Confirm", confirmViewModel); } return View("Index"); } [HttpParamAction] [HttpPost] public ActionResult Confirm(CreateViewModel viewModel) { // directory name is the sessionID var files = GetBackloadDirectoryFiles(Session.SessionID); if (!files.Any()) { ModelState.AddModelError("", "Must select at least one file"); } if (ModelState.IsValid) { // convert viewModel into Model var model = viewModel.GetFileInput(); // load files into LeafInputFile var leafInputFiles = from f in files let bytes = System.IO.File.ReadAllBytes(f.FullName) select new LeafInputFile {Filename = f.Name, Contents = bytes}; // TODO: Save to db DeleteBackloadDirectory(Session.SessionID); SetStatusMessage( HttpUtility.HtmlEncode( $"A data set has submitted for '{viewModel.Identifier}' from '{viewModel.SiteId}'. " + $"When complete, an email will be delivered to {viewModel.Name} <{viewModel.Email}> with results."), StatusType.Success); return RedirectToAction("Index"); } return View("Index", viewModel); } } }