Files
OperationsMgr-CSharp/SaOperationsMgrWeb/Web/Controllers/Controller_Base.cs
T
2020-03-06 16:07:06 +00:00

346 lines
12 KiB
C#

using Microsoft.AspNetCore.Html;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Localization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using Sarand.Core.App;
using Sarand.Core.Base;
using Sarand.Core.Bus;
using Sarand.Core.CodeTypes;
using Sarand.Core.Security;
using Sarand.OperationsMgr.Core.App;
using Sarand.OperationsMgr.Web.App;
using Sarand.OperationsMgr.Web.Models;
using Sarand.OperationsMgr.Web.System;
using Sarand.Win.Dbas.Base;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace Sarand.OperationsMgr.Web.Controllers
{
//=======================================================================
public class Controller_Base : Controller
{
//-------------------------------------------------------------------
// Data members.
private List<TypeCodeDesc> assetTypes;
//-------------------------------------------------------------------
// Protected construction - use derived classes.
protected Controller_Base (OpnLocaliser localiser) : base()
{
Localiser = localiser;
// Initialise console (debug) logging listener.
if (Directory.Exists(App.LoggingRootFolder))
OpnConsoleListener.ConfigureDebugListener(App.LoggingRootFolder);
if (SacsSystem.DebugMode) Logger.Trace(GetType().Name + ".CTR");
}
//-------------------------------------------------------------------
// Properties.
protected SaOperationsMgrWebApp App { get { return SaOperationsMgrWebApp.GetInstance(); } }
public OpnLocaliser Localiser { get; }
//-------------------------------------------------------------------
// C u l t u r e
//-------------------------------------------------------------------
private string LanguageIso2
{
get
{
var feature = HttpContext.Features.Get<IRequestCultureFeature>();
return feature.RequestCulture.UICulture.TwoLetterISOLanguageName.ToLower();
}
}
//-------------------------------------------------------------------
// R e d i r e c t i o n L o c a t i o n s
//-------------------------------------------------------------------
protected enum RedirectLocation
{
Home,
Home_SessionExpired,
}
protected String GetRedirectLocation (RedirectLocation redirectLocation)
{
switch (redirectLocation)
{
case RedirectLocation.Home:
return "/Home";
case RedirectLocation.Home_SessionExpired:
return "/Home?SessionExpired";
}
return "";
}
//-------------------------------------------------------------------
// A c t i o n E v e n t s
//-------------------------------------------------------------------
public override void OnActionExecuting (ActionExecutingContext context)
{
//if (SacsSystem.DebugMode) Logger.Trace(GetType().Name + ".OnActionExecuting");
base.OnActionExecuting(context);
}
public override void OnActionExecuted (ActionExecutedContext context)
{
//if (SacsSystem.DebugMode) Logger.Trace(GetType().Name + ".OnActionExecuted");
ViewData["CopyrightNotice"] = new HtmlString(OpnSystem.GetCopyrightNotice(true));
// Refreh model properties.
Model_Base baseModel = ViewData.Model as Model_Base;
if (baseModel != null)
{
// Session data.
baseModel.SessionData = SessionData;
baseModel.AwaitingLogin = !ValidSession;
// Redirect locations.
baseModel.RedirectLocation.Home = GetRedirectLocation(RedirectLocation.Home);
baseModel.RedirectLocation.Home_SessionExpired = GetRedirectLocation(RedirectLocation.Home_SessionExpired);
}
// Store session data if present - as potentially modfied.
if (sessionData != null)
{
String sessionDataJson = JsonConvert.SerializeObject(sessionData);
HttpContext.Session.Set(SessionKey_SessionConfig, sessionDataEncoding.GetBytes(sessionDataJson));
if (baseModel != null)
baseModel.SessionIdx = SessionData.SessionContext.Index;
}
base.OnActionExecuted(context);
}
//-------------------------------------------------------------------
// M o d e l
//-------------------------------------------------------------------
protected void InitModel (Model_Base model)
{
model.AwaitingLogin = !ValidSession;
}
//-------------------------------------------------------------------
// S e s s i o n
//-------------------------------------------------------------------
private SessionData sessionData;
public static readonly String SessionKey_SessionConfig = "OpnUserSessionConfig";
private static readonly Encoding sessionDataEncoding = Encoding.UTF8;
private class OpnSessionDataContractResolver : DefaultContractResolver
{
// To allow private properties to be deserialised.
protected override List<MemberInfo> GetSerializableMembers (Type objectType)
{
var flags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
MemberInfo[] fields = objectType.GetFields(flags);
return fields
.Concat(objectType.GetProperties(flags).Where(propInfo => propInfo.CanWrite))
.ToList();
}
protected override IList<JsonProperty> CreateProperties (Type type, MemberSerialization memberSerialization)
{
return base.CreateProperties(type, MemberSerialization.Fields);
}
};
JsonSerializerSettings OpnSessionDataJsonSerializerSettings = new JsonSerializerSettings
{
ContractResolver = new OpnSessionDataContractResolver()
};
public bool ValidSession
{
get
{
return (SessionData != null && SysId.IsValid(SessionData.User.Id));
}
}
public SessionData SessionData
{
get
{
try
{
// Retrieve session data if not already in controller.
if (sessionData == null)
{
byte[] sessionDataBytes = null;
HttpContext.Session.TryGetValue(SessionKey_SessionConfig, out sessionDataBytes);
if (sessionDataBytes != null)
{
String sessionDataJson = sessionDataEncoding.GetString(sessionDataBytes);
sessionData = JsonConvert.DeserializeObject<SessionData>(sessionDataJson, OpnSessionDataJsonSerializerSettings);
}
}
return sessionData;
}
catch (Exception exc)
{
Logger.Warn(GetType().Name + ".SessionData " + exc.GetType().Name + " - " + exc.Message + exc.GetStackEntries().Concat("", "\n\t"));
}
return null;
}
}
protected bool OpenUserSession (OpnSessionContext sessioContext, SysId userId, String userCode, String userName)
{
// Validate user properties.
if (!SysId.IsValid(userId)) return false;
if (StringUtil.IsEmpty(userCode)) return false;
if (StringUtil.IsEmpty(userName)) return false;
// Close previous session.
CloseUserSession();
// Open session.
sessionData = new SessionData(sessioContext, userId, userCode, userName);
return true;
}
protected void CloseUserSession ()
{
HttpContext.Session.Clear();
sessionData = null;
}
//-------------------------------------------------------------------
// A j a x A c t i o n s
//-------------------------------------------------------------------
protected static readonly Encoding ajaxResponseEncoding = Encoding.UTF8;
public class AjaxResponse
{
// Response status.
public bool Success { get; set; } = false;
public bool SessionExpired { get; private set; } = false;
public bool GoHome { get; private set; } = false;
public AjaxResponse SetSessionExpired (String title, String text)
{
SessionExpired = true;
return SetMessage(title, text);
}
public AjaxResponse SetGoHome (String title, String text)
{
GoHome = true;
return SetMessage(title, text);
}
// Message - displays alert popup.
public class MessageData
{
public String Title { get; set; }
public String Text { get; set; }
}
public MessageData Message { get; private set; }
public AjaxResponse SetMessage (String title, String text)
{
Message = new MessageData() { Title = title, Text = text };
return this;
}
// Notification - briefly displays after response received.
public class NotificationData
{
public String Title { get; set; }
public String Message { get; set; }
}
public NotificationData Notification { get; private set; }
public bool HasNotification { get { return Notification != null; } }
public AjaxResponse SetNotification (String title, String message)
{
Notification = new NotificationData() { Title = title, Message = message };
return this;
}
// Paged data.
public class PagingData
{
public bool Paged { get { return (PageNo > 0 && PageLength > 0 && ItemTotal > PageLength); } }
public uint PageNo { get; set; } = 0;
public ushort PageLength { get; set; } = 0;
public uint PageCount { get { return (PageLength > 0 ? (uint)Math.Ceiling((decimal)ItemTotal / PageLength) : 0); } }
public uint ItemCount { get; set; } = 0;
public uint ItemTotal { get; set; } = 0;
}
public PagingData Paging { get; private set; }
public void SetPaging (uint pageNo, ushort pageLength, uint itemCount, uint itemTotal)
{
Paging = new PagingData() { PageNo = pageNo, PageLength = pageLength, ItemCount = itemCount, ItemTotal = itemTotal };
}
}
//-------------------------------------------------------------------
// S e s s i o n C o n t e x t
//-------------------------------------------------------------------
protected OpnSessionContext GetSessionContext ()
{
if (SessionData != null)
return SessionData.SessionContext;
Logger.Warn(GetType().Name + ".GetSessionContext() Session data is not available.");
return null;
}
protected OpnSessionContext GetSessionContext (ushort index)
{
try
{
return App.GetSessionContextConfig(index).SessionContext;
}
catch (Exception exc)
{
Logger.Warn(GetType().Name + ".GetSessionContext(" + index + ") " + exc.GetType().Name + " - " + exc.Message + exc.GetStackEntries().Concat("", "\n\t"));
}
return null;
}
//-------------------------------------------------------------------
// D a t a b a s e
//-------------------------------------------------------------------
private OpnSessionContext databaseSessionContext;
private SacsDatabase database = null;
protected SacsDatabase GetDatabase ()
{
try
{
return GetDatabase(GetSessionContext());
}
catch (Exception exc)
{
Logger.Warn(GetType().Name + ".GetDatabase() " + exc.GetType().Name + " - " + exc.Message + exc.GetStackEntries().Concat("", "\n\t"));
}
return null;
}
protected SacsDatabase GetDatabase (OpnSessionContext sessionContext)
{
if (databaseSessionContext != null && databaseSessionContext.Equals(sessionContext)) return database;
try
{
database = App.GetSessionContextConfig(sessionContext.Index).Database;
databaseSessionContext = sessionContext;
}
catch (Exception exc)
{
Logger.Warn(GetType().Name + ".GetDatabase(" + sessionContext.Index + "," + OpnSystem.GetInstanceCode(sessionContext.Instance) + ") " + exc.GetType().Name + " - " + exc.Message + exc.GetStackEntries().Concat("", "\n\t"));
}
return database;
}
//-------------------------------------------------------------------
// Managers.
//-------------------------------------------------------------------
// Security console.
private SaSecurityConsole securityConsole;
protected SaSecurityConsole SecurityConsole { get { if (securityConsole == null) securityConsole = OpnGlobals.ConsoleHelper.GetSecurityConsole(GetSessionContext()); return securityConsole; } }
// Code Type console.
private SaCodeTypeConsole codeTypeConsole;
protected SaCodeTypeConsole CodeTypeConsole { get { if (codeTypeConsole == null) codeTypeConsole = OpnGlobals.ConsoleHelper.GetCodeTypeConsole(GetSessionContext()); return codeTypeConsole; } }
//-------------------------------------------------------------------
// C o n s o l e s
//-------------------------------------------------------------------
//-------------------------------------------------------------------
}
//=======================================================================
}