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.Configuration;
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.Extensions;
using GreenTree.Nachtragsmanagement.Web.Framework.Authorization;
using GreenTree.Nachtragsmanagement.Web.Models.Config;
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.Net.Mime;
using System.Web;
using System.Web.Mvc;
using System.Web.UI;
using System.Web.UI.WebControls;
using static GreenTree.Nachtragsmanagement.Web.Extensions.MVCxGridViewGeneratorHelper;
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 IConfigurationService _configurationService;
private readonly IUserHelper _userHelper;
private readonly ILogger _logger;
public MiscController(
IMiscService miscService,
IUserService userService,
INotificationService notificationService,
INotificationScheduler notificationScheduler,
IConfigurationService configurationService,
IUserHelper userHelper,
ILogger logger)
{
_miscService = miscService;
_userService = userService;
_notificationService = notificationService;
_notificationScheduler = notificationScheduler;
_configurationService = configurationService;
_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);
}
///
/// 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 misc grid
///
[HttpPost]
public ActionResult ExportPartialLogs(string displayMode, string exportformat, string exportType)
{
if (String.IsNullOrEmpty(displayMode))
return new EmptyResult();
var currentUser = _userHelper.FromCookies();
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 System.Web.Mvc.HtmlHelper(viewContext, viewPage);
MVCxGridViewState gridViewState = (MVCxGridViewState)Session["LogGridViewState"];
var settings = GridViewSettingsHelper.LogGridViewSettings(htmlHelper);
if (gridViewState != null)
{
var generator = new MVCReportGeneratonHelper();
generator.CustomizeColumnsCollection += new CustomizeColumnsCollectionEventHandler(logGenerator_CustomizeColumnsCollection);
var report = generator.GenerateMVCReport(gridViewState, logModels, "Logliste");
if (displayMode == "popup")
return PartialView("~/Views/Shared/_PrintPopupPartial.cshtml",
new PrintGridModel(report, "Misc", "ExportPartialLogs", "devGridViewLog"));
else if (displayMode == "callback")
return PartialView("~/Views/Shared/_PrintDocumentViewerPartial.cshtml",
new PrintGridModel(report, "Misc", "ExportPartialLogs", "devGridViewLog"));
else if (displayMode == "export")
{
if (exportType != "print")
{
switch (exportformat.ToLower())
{
case "xlsx":
return GridViewExtension.ExportToXlsx(settings, logModels);
case "xls":
return GridViewExtension.ExportToXls(settings, logModels);
case "pdf":
generator.WritePdfToResponse(Response, "Logliste.pdf", DispositionTypeNames.Attachment.ToString());
break;
}
}
}
return new EmptyResult();
}
else
return new EmptyResult();
}
///
/// Customize created columns
///
private void logGenerator_CustomizeColumnsCollection(object source, ColumnsCreationEventArgs e)
{
foreach (var column in e.ColumnsInfo)
{
if (column.ColumnCaption == "#") { column.IsVisible = false; }
if (column.FieldName == "LogLevelDescription") { column.ColumnWidth = 60; }
if (column.FieldName == "ShortMessage") { column.ColumnWidth = 300; }
if (column.FieldName == "FullMessage") { column.IsVisible = false; column.IsDetail = true; }
if (column.FieldName == "IpAddress") { column.ColumnWidth = 70; }
if (column.FieldName == "UserDescription") { column.ColumnWidth = 70; }
if (column.FieldName == "EntityType") { column.ColumnWidth = 60; }
if (column.FieldName == "EntityId") { column.ColumnWidth = 50; }
if (column.FieldName == "CreatedOnUtc") { column.ColumnWidth = 70; }
}
}
///
/// 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
#region ConfigItems
///
/// Basic configItem view function
///
[FunctionAuthorize(true, "Misc-ConfigItems")]
public ActionResult ViewConfigItems()
{
var configItems = _configurationService.GetAllConfigItems();
var configItemModels = configItems
.Select(u => ConfigItemDataModel.FromConfigItem(u, false))
.ToList();
return View("~/Views/Config/View.cshtml", configItemModels);
}
///
/// Get JSON data of specific configItem
///
/// ConfigItem id.
public ActionResult GetConfigItem(int id = -1)
{
var configItem = _configurationService.GetConfigItemById(id);
if (configItem == null)
return new JsonResult
{
Data = "notFound",
JsonRequestBehavior = JsonRequestBehavior.AllowGet
};
var configItemModel = ConfigItemDataModel.FromConfigItem(configItem, false);
return new JsonResult
{
Data = JsonConvert.SerializeObject(configItemModel),
JsonRequestBehavior = JsonRequestBehavior.AllowGet
};
}
///
/// Callback result for configItem grid
///
/// The height of the grid scrollable component.
public ActionResult PartialConfigItems(int scrollHeight = -1)
{
var configItems = _configurationService.GetAllConfigItems();
var configItemModels = configItems
.Select(u => ConfigItemDataModel.FromConfigItem(u, false))
.ToList();
ViewData["ScrollHeight"] = scrollHeight;
return PartialView("~/Views/Config/_ConfigItemGridPartial.cshtml", configItemModels);
}
///
/// Partial edit for config item value
///
/// Value type.
public ActionResult GetValueTypePartialEdit(string typeFullName)
{
var model = new ConfigItemDataModel
{
TypeFullName = typeFullName
};
return PartialView("~/Views/Config/_ConfigItemValueEditPartial.cshtml", model);
}
///
/// Partial edit for editing of existing or for new configItem
///
/// Id for existing configItem, otherweise -1.
public ActionResult EditConfigItem(int id = -1)
{
var configItem = _configurationService.GetConfigItemById(id);
var configItemModel = ConfigItemDataModel.FromConfigItem(configItem, true);
return PartialView("~/Views/Config/_ConfigItemEditPartial.cshtml", configItemModel);
}
///
/// Partial edit result if ModelState is valid, otherwise simple JSON result for success
///
/// ConfigItem model to be saved.
[HttpPost, ValidateInput(false)]
public ActionResult EditConfigItem(ConfigItemDataModel configItemModel)
{
try
{
if (!ModelState.IsValid)
return PartialView("~/Views/Config/_ConfigItemEditPartial.cshtml", configItemModel);
if (configItemModel.Id == -1)
{
var configItem = configItemModel.ToConfigItem();
_configurationService.InsertConfigItem(configItem);
_logger.Entity(configItem, Core.Domain.Logging.LogEntityActivity.Insert, _userHelper.FromCookies());
}
else
{
var configItem = _configurationService.GetConfigItemById(configItemModel.Id);
configItem.Name = configItemModel.Name;
configItem.TypeFullName = configItemModel.TypeFullName;
configItem.Value = configItemModel.Value;
configItem.Description = configItemModel.Description;
_configurationService.UpdateConfigItem(configItem);
_logger.Entity(configItem, Core.Domain.Logging.LogEntityActivity.Update, _userHelper.FromCookies());
}
_notificationScheduler.Start();
return new JsonResult
{
Data = "success"
};
}
catch (Exception ex)
{
_logger.Error("Fehler bei Speicherung einer Einstellung.", ex, _userHelper.FromCookies());
return PartialView("~/Views/Shared/_PopupError.cshtml", ex);
}
}
///
/// Simple JSON result for deleting a specific configItem
///
/// ConfigItem id.
[HttpPost]
public ActionResult DeleteConfigItem(int id)
{
try
{
var configItem = _configurationService.GetConfigItemById(id);
if (configItem != null)
_configurationService.DeleteConfigItem(configItem);
_logger.Entity(configItem, Core.Domain.Logging.LogEntityActivity.Delete, _userHelper.FromCookies());
return new JsonResult
{
Data = "success"
};
}
catch (Exception ex)
{
_logger.Error("Fehler bei Löschung einer Einstellung.", ex, _userHelper.FromCookies());
return PartialView("~/Views/Shared/_PopupError.cshtml", ex);
}
}
#endregion
}
}