using System; using System.IO; using System.Linq; using System.Web; using System.Web.Mvc; using log4net; using LeafWeb.Core.Entities; using LeafWeb.Core.Utility; using LeafWeb.WebCms.App_Start; using LeafWeb.WebCms.Models; using Umbraco.Web; namespace LeafWeb.WebCms.Controllers { public class LeafInputController : BaseController { public ActionResult Create() { // initialize the session storage to retain SessionID between requests if (Session != null) Session["placeholder"] = 0; var viewModel = new LeafInputCreate(); HydrateCreateViewModel(viewModel); return PartialView(viewModel); } [HttpPost] public ActionResult Submit(LeafInputCreate viewModel) { // directory name is the sessionID var files = GetBackloadDirectoryFiles(Session.SessionID); if (!files.Any()) ModelState.AddModelError("Files", "Must select at least one file"); if (ModelState.ContainsKey("TermsOfService")) { ModelState.Remove("TermsOfService"); } var membershipHelper = new Umbraco.Web.Security.MembershipHelper(UmbracoContext.Current); var member = membershipHelper.GetCurrentMember(); if (member != null) { ModelState["Name"].Errors.Clear(); viewModel.Name = member.Name; ModelState["Email"].Errors.Clear(); viewModel.Email = member.GetProperty("Email").Value as string; ModelState["EmailConfirm"].Errors.Clear(); viewModel.EmailConfirm = viewModel.Email; } if (ModelState.IsValid) // HttpParamMatch indicates it's backing out from Confirm { // convert viewModel into Model var leafInput = viewModel.GetLeafInput(DataService); // load files into LeafInputFile leafInput.InputFiles = (from f in files let bytes = System.IO.File.ReadAllBytes(f.FullName) select new LeafInputFile { Filename = f.Name, Contents = bytes }).ToList(); // Save to db DataService.AddLeafInput(leafInput); DeleteBackloadDirectory(Session.SessionID); var msg = $"A data set has submitted for '{viewModel.Identifier}' from '{viewModel.SiteId}'. " + Environment.NewLine + $"When complete, an email will be delivered to {viewModel.Name} <{viewModel.Email}> with results."; SetStatusMessage( HttpUtility .HtmlEncode(msg) .Replace("\n", "
"), StatusType.Success); var logger = LogManager.GetLogger(GetType()); logger.Info($"LeafInput: {leafInput.Id} Added, {leafInput.Identifier}, {leafInput.SiteId}, {leafInput.Email}"); logger.Info($"LeafInputFiles: {leafInput.InputFiles.Select(f => f.Id.ToString()).Join(", ")}, Queued"); HangfireStartup.TriggerPiscalProcessQueue(); return RedirectToCurrentUmbracoPage(); } HydrateCreateViewModel(viewModel); return CurrentUmbracoPage(); } private void HydrateCreateViewModel(dynamic viewModel) { if (viewModel.PhotosynthesisType == null) viewModel.PhotosynthesisType = new SelectListViewModel(); if (viewModel.PhotosynthesisType.ListItems == null) viewModel.PhotosynthesisType.ListItems = GetPhotosynthesisTypeSelectList(); } // Callback from Piscal [ActionLog] public void NotifyComplete() { HangfireStartup.TriggerPiscalProcessQueue(); } private FileInfo[] GetBackloadDirectoryFiles(string directoryName) { var path = Path.Combine(Server.MapPath("~/Files/"), directoryName + "\\"); var directory = new DirectoryInfo(path); return !directory.Exists ? new FileInfo[] { } : 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); } } }