using DevExpress.Utils;
using DevExpress.Web;
using DevExpress.Web.ASPxThemes;
using DevExpress.Web.Mvc;
using DevExpress.XtraPrinting;
using DevExpress.XtraScheduler;
using GreenTree.Nachtragsmanagement.Core.Authentication;
using GreenTree.Nachtragsmanagement.Core.Domain.Deviation;
using GreenTree.Nachtragsmanagement.Core.Domain.User;
using GreenTree.Nachtragsmanagement.Services.Appendix;
using GreenTree.Nachtragsmanagement.Services.Deviation;
using GreenTree.Nachtragsmanagement.Services.Logging;
using GreenTree.Nachtragsmanagement.Services.Misc;
using GreenTree.Nachtragsmanagement.Services.Scheduling;
using GreenTree.Nachtragsmanagement.Services.User;
using GreenTree.Nachtragsmanagement.Web.Framework.Authorization;
using GreenTree.Nachtragsmanagement.Web.Models.Global;
using GreenTree.Nachtragsmanagement.Web.Models.Misc;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace GreenTree.Nachtragsmanagement.Web.Controllers
{
public class MiscController : Controller
{
private readonly IMiscService _miscService;
private readonly IUserService _userService;
private readonly INotificationService _notificationService;
private readonly INotificationScheduler _notificationScheduler;
private readonly IUserHelper _userHelper;
private readonly ILogger _logger;
public MiscController(
IMiscService miscService,
IUserService userService,
INotificationService notificationService,
INotificationScheduler notificationScheduler,
IUserHelper userHelper,
ILogger logger)
{
_miscService = miscService;
_userService = userService;
_notificationService = notificationService;
_notificationScheduler = notificationScheduler;
_userHelper = userHelper;
_logger = logger;
ViewData["AllUsers"] = _userService.GetAllUsers();
ViewData["AllUsersWithRole"] =
_userService.GetAllUsers()
.Select(u => new
{
Id = u.Id,
Description = String.Format("{0} - {1}", u.Lastname,
String.Join(", ", u.Roles
.Select(r => r.Description)))
})
.ToList();
ViewData["AllNotificationPlugins"] =
_notificationService.GetNotificationPlugins();
}
#region MailNotifications
///
/// Basic mailNotification view function
///
[FunctionAuthorize(true, "Misc-MailNotifications")]
public ActionResult ViewMailNotifications()
{
var mailNotifications = _miscService.GetAllMailNotifications();
var mailNotificationModels = mailNotifications
.Select(u => MailNotificationDataModel.FromMailNotification(
u, false, _notificationService, _notificationScheduler))
.ToList();
return View("~/Views/Misc/MailNotifications.cshtml", mailNotificationModels);
}
///
/// Get JSON data of specific mailNotification
///
/// MailNotification id.
public ActionResult GetMailNotification(int id = -1)
{
var mailNotification = _miscService.GetMailNotificationById(id);
if (mailNotification == null)
return new JsonResult
{
Data = "notFound",
JsonRequestBehavior = JsonRequestBehavior.AllowGet
};
var mailNotificationModel = MailNotificationDataModel.FromMailNotification(
mailNotification, false, _notificationService, _notificationScheduler);
return new JsonResult
{
Data = JsonConvert.SerializeObject(mailNotificationModel),
JsonRequestBehavior = JsonRequestBehavior.AllowGet
};
}
///
/// Callback result for mailNotification grid
///
/// The height of the grid scrollable component.
public ActionResult PartialMailNotifications(int scrollHeight = -1)
{
var mailNotifications = _miscService.GetAllMailNotifications();
var mailNotificationModels = mailNotifications
.Select(u => MailNotificationDataModel.FromMailNotification(
u, false, _notificationService, _notificationScheduler))
.ToList();
ViewData["ScrollHeight"] = scrollHeight;
return PartialView("~/Views/Misc/_MailNotificationGridPartial.cshtml", mailNotificationModels);
}
///
/// Callback result for mailNotification job combobox
///
/// The system name of the corresponding notification plugin.
public ActionResult PartialNotificationPluginJobs(string pluginSystemName)
{
var notificationPlugin = _notificationService.GetNotificationPlugin(pluginSystemName);
if (notificationPlugin == null)
return PartialView("~/Views/Misc/_MailNotificationPluginJobsPartial.cshtml", null);
var mailNotificationModel = new MailNotificationDataModel
{
NotificationPlugin = notificationPlugin
};
return PartialView("~/Views/Misc/_MailNotificationPluginJobsPartial.cshtml", mailNotificationModel);
}
///
/// Export result for mailNotification grid
///
[HttpPost]
public ActionResult ExportPartialMailNotifications(GridViewExportFormat exportformat)
{
if (exportformat == null || String.IsNullOrEmpty(exportformat.Format))
return new EmptyResult();
var mailNotifications = _miscService.GetAllMailNotifications();
var mailNotificationModels = mailNotifications
.Select(u => MailNotificationDataModel.FromMailNotification(
u, false, _notificationService, _notificationScheduler))
.ToList();
var viewContext = new ViewContext();
var viewPage = new ViewPage();
var htmlHelper = new HtmlHelper(viewContext, viewPage);
var gridViewSettings = Extensions.GridViewSettingsHelper.MailNotificationGridViewSettings(htmlHelper);
switch (exportformat.Format.ToLower())
{
case "xlsx":
return GridViewExtension.ExportToXlsx(gridViewSettings, mailNotificationModels);
case "xls":
return GridViewExtension.ExportToXls(gridViewSettings, mailNotificationModels);
case "pdf":
return GridViewExtension.ExportToPdf(gridViewSettings, mailNotificationModels);
default:
return new EmptyResult();
}
}
///
/// Partial edit for editing of existing or for new mailNotification
///
/// Id for existing mailNotification, otherweise -1.
public ActionResult EditMailNotification(int id = -1)
{
var mailNotification = _miscService.GetMailNotificationById(id);
var mailNotificationModel = MailNotificationDataModel.FromMailNotification(
mailNotification, true, _notificationService, _notificationScheduler);
return PartialView("~/Views/Misc/_MailNotificationEditPartial.cshtml", mailNotificationModel);
}
///
/// Partial edit result if ModelState is valid, otherwise simple JSON result for success
///
/// MailNotification model to be saved.
[HttpPost, ValidateInput(false)]
public ActionResult EditMailNotification(MailNotificationDataModel mailNotificationModel)
{
try
{
if (!ModelState.IsValid)
{
foreach (var role in mailNotificationModel.UserValues)
mailNotificationModel.UserDescriptions.Add(
((IList)ViewData["AllUsers"])
.First(r => r.Id == role).Lastname);
var notificationPlugin = _notificationService.GetNotificationPlugin(mailNotificationModel.NotificationPluginSystemName);
if (notificationPlugin != null)
mailNotificationModel.NotificationPlugin = notificationPlugin;
return PartialView("~/Views/Misc/_MailNotificationEditPartial.cshtml", mailNotificationModel);
}
if (mailNotificationModel.CronExpression.Split(' ').Length == 5)
mailNotificationModel.CronExpression = mailNotificationModel.CronExpression + " *";
var selectedUsers = _userService.GetUsersByIds(mailNotificationModel.UserValues.ToArray());
if (mailNotificationModel.Id == -1)
{
var mailNotification = mailNotificationModel.ToMailNotification();
mailNotification.SetUsers(selectedUsers);
_miscService.InsertMailNotification(mailNotification);
_logger.Entity(mailNotification, Core.Domain.Logging.LogEntityActivity.Insert, _userHelper.FromCookies());
}
else
{
var mailNotification = _miscService.GetMailNotificationById(mailNotificationModel.Id);
mailNotification.CronExpression = mailNotificationModel.CronExpression;
mailNotification.NotificationPluginSystemName = mailNotificationModel.NotificationPluginSystemName;
mailNotification.NotificationJobSystemName = mailNotificationModel.NotificationJobSystemName;
mailNotification.SetUsers(selectedUsers);
_miscService.UpdateMailNotification(mailNotification);
_logger.Entity(mailNotification, Core.Domain.Logging.LogEntityActivity.Update, _userHelper.FromCookies());
}
_notificationScheduler.Start();
return new JsonResult
{
Data = "success"
};
}
catch (Exception ex)
{
_logger.Error("Fehler bei Speicherung einer Mail-Benachrichtigung.", ex, _userHelper.FromCookies());
return PartialView("~/Views/Shared/_PopupError.cshtml", ex);
}
}
///
/// Simple JSON result for deleting a specific mailNotification
///
/// MailNotification id.
[HttpPost]
public ActionResult DeleteMailNotification(int id)
{
try
{
var mailNotification = _miscService.GetMailNotificationById(id);
if (mailNotification != null)
_miscService.DeleteMailNotification(mailNotification);
_logger.Entity(mailNotification, Core.Domain.Logging.LogEntityActivity.Delete, _userHelper.FromCookies());
return new JsonResult
{
Data = "success"
};
}
catch (Exception ex)
{
_logger.Error("Fehler bei Löschung einer Mail-Benachrichtigung.", ex, _userHelper.FromCookies());
return PartialView("~/Views/Shared/_PopupError.cshtml", ex);
}
}
///
/// Processes the specific mailNotification
///
/// MailNotification id.
[HttpPost]
public ActionResult ProcessMailNotification(int id)
{
try
{
var mailNotification = _miscService.GetMailNotificationById(id);
if (mailNotification != null)
{
var notificationPlugin = _notificationService.GetNotificationPlugin(mailNotification.NotificationPluginSystemName);
notificationPlugin.ProcessNotifications(new[] { mailNotification });
}
return new JsonResult
{
Data = "success"
};
}
catch (Exception ex)
{
_logger.Error("Fehler bei Ausführung einer Mail-Benachrichtigung.", ex, _userHelper.FromCookies());
return PartialView("~/Views/Shared/_PopupError.cshtml", ex);
}
}
#endregion
#region Logs
///
/// Basic log view function
///
[FunctionAuthorize(true, "Misc-Logs")]
public ActionResult ViewLogs()
{
var logs = _logger.GetAllLogs();
var logModels = logs
.Select(u => LogDataModel.FromLog(u, false))
.ToList();
return View("~/Views/Misc/Logs.cshtml", logModels);
}
///
/// Get JSON data of specific log
///
/// Log id.
public ActionResult GetLog(int id = -1)
{
var log = _logger.GetLogById(id);
if (log == null)
return new JsonResult
{
Data = "notFound",
JsonRequestBehavior = JsonRequestBehavior.AllowGet
};
var logModel = LogDataModel.FromLog(log, false);
return new JsonResult
{
Data = JsonConvert.SerializeObject(logModel),
JsonRequestBehavior = JsonRequestBehavior.AllowGet
};
}
///
/// Callback result for log grid
///
/// The height of the grid scrollable component.
public ActionResult PartialLogs(int scrollHeight = -1)
{
var logs = _logger.GetAllLogs();
var logModels = logs
.Select(u => LogDataModel.FromLog(u, false))
.ToList();
ViewData["ScrollHeight"] = scrollHeight;
return PartialView("~/Views/Misc/_LogGridPartial.cshtml", logModels);
}
///
/// Export result for log grid
///
[HttpPost]
public ActionResult ExportPartialLogs(GridViewExportFormat exportformat)
{
if (exportformat == null || String.IsNullOrEmpty(exportformat.Format))
return new EmptyResult();
var logs = _logger.GetAllLogs();
var logModels = logs
.Select(u => LogDataModel.FromLog(u, false))
.ToList();
var viewContext = new ViewContext();
var viewPage = new ViewPage();
var htmlHelper = new HtmlHelper(viewContext, viewPage);
var gridViewSettings = Extensions.GridViewSettingsHelper.LogGridViewSettings(htmlHelper);
switch (exportformat.Format.ToLower())
{
case "xlsx":
return GridViewExtension.ExportToXlsx(gridViewSettings, logModels);
case "xls":
return GridViewExtension.ExportToXls(gridViewSettings, logModels);
case "pdf":
return GridViewExtension.ExportToPdf(gridViewSettings, logModels);
default:
return new EmptyResult();
}
}
///
/// Partial edit for editing of existing or for new log
///
/// Id for existing log, otherweise -1.
public ActionResult ViewLog(int id = -1)
{
var log = _logger.GetLogById(id);
var logModel = LogDataModel.FromLog(log, true);
return PartialView("~/Views/Misc/_LogViewPartial.cshtml", logModel);
}
///
/// Simple JSON result for deleting a specific log
///
/// Log id.
[HttpPost]
public ActionResult DeleteLog(int id)
{
try
{
var log = _logger.GetLogById(id);
if (log != null)
_logger.DeleteLog(log);
return new JsonResult
{
Data = "success"
};
}
catch (Exception ex)
{
_logger.Error("Fehler bei Löschung eines Logs.", ex, _userHelper.FromCookies());
return PartialView("~/Views/Shared/_PopupError.cshtml", ex);
}
}
#endregion
}
}