Files
BusinessMgr-2019/SaBusinessMgrCoreWebControl/Control/App/SbmApplication_Control.cs
T
2024-06-13 14:32:44 +01:00

235 lines
10 KiB
C#

using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Sarand.BusinessMgr.Net.Core.Web.App;
using Sarand.BusinessMgr.Net.Core.Web.Helpers;
using Sarand.BusinessMgr.Net.Standard.Base.App;
using Sarand.BusinessMgr.Net.Standard.Base.Consoles;
using Sarand.BusinessMgr.Net.Standard.Dbas.Utils;
using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.IO;
using Sarand.Net.Standard.Base.Utils;
using Sarand.Net.Standard.Dbas.Base;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace Sarand.BusinessMgr.Net.Core.Web.Control.App
{
//=======================================================================
public class SbmApplication_Control : SbmApplication_Web
{
//-------------------------------------------------------------------
// Data members.
private bool generateDatabaseDefinitions_Control = true;
private bool generateDatabaseDefinitions_BusMgr = true;
private PropertySet propertySet;
private Dictionary<String, SbmAppConfig> appConfigs = new Dictionary<string, SbmAppConfig>();
private Dictionary<String, SbmEmailConfig> emailConfigs = new Dictionary<string, SbmEmailConfig>();
ushort sessionContextIdx_Control = 0;
// Singular databases.
private ISacsDatabase controlDatabase = null;
private ISacsDatabase templateDatabase = null;
// Session contexts.
private static ushort sessionContextIdx_Next = 100;
private class SessionContextData
{
public SessionContextData(SbmSessionContext_Web sessionContext)
{
SessionContext = sessionContext;
}
public SbmSessionContext_Web SessionContext { get; }
public List<string> DbIdentifiers { get; } = new List<string>();
public ISacsDatabase BusMgrDatabase { get; set; }
}
private readonly Dictionary<ushort, SessionContextData> sessionContexts = new Dictionary<ushort, SessionContextData>();
//-------------------------------------------------------------------
// Construction.
public SbmApplication_Control(IConfiguration configuration)
{
InitialiseTemporaryLoggingFolder();
try
{
propertySet = new PropertySet();
SbmGlobals.System = (System_Web = new SbmSystem_Web(propertySet));
Configuration = configuration;
}
catch (Exception exc)
{
SaLogger.Error($"{GetType().Name}.CTR {ExceptionUtil.GetErrorStateMessage(exc)}");
throw;
}
}
//-------------------------------------------------------------------
// Properties.
// Application Configuration.
public override SbmAppConfig AppConfig { get { return appConfigs.Values.ToList().getConfigForApplication(); } }
// Session Configuration.
public override String SessionCookieName { get { return Sbm.Config.Control.Session.Cookie.Name; } }
public override List<ushort> GetSessionContextIdxs()
{
return sessionContexts.Values.Select(item => item.SessionContext.Index).ToList();
}
public override SbmSessionContext GetSessionContext(ushort index)
{
return sessionContexts.GetValue(index, null)?.SessionContext ?? null;
}
public override ISacsDatabase GetControlDatabase()
{
return controlDatabase;
}
public override ISacsDatabase GetTemplateDatabase()
{
return templateDatabase;
}
public override List<string> GetDbIdentifiers(SbmSessionContext sessionContext)
{
return sessionContexts.GetValue(sessionContext.Index, null)?.DbIdentifiers ?? new List<string>();
}
public override ISacsDatabase GetBusMgrDatabase(SbmSessionContext sessionContext)
{
return sessionContexts.GetValue(sessionContext.Index, null)?.BusMgrDatabase;
}
public override SbmEmailConfig EmailConfig { get { return emailConfigs.Values.ToList().getConfigForSession(AppConfig); } }
//-------------------------------------------------------------------
// Initialisation.
/// <summary>Initialise environment - from Startup.</summary>
internal void InitWebHostEnvironment(IWebHostEnvironment env)
{
InitEnvironment(env);
}
/// <summary>Initialise environment - from internal (above) or unit tests.</summary>
protected void InitEnvironment(IWebHostEnvironment env)
{
Development = env.IsDevelopment();
environmentName = env.EnvironmentName;
SaLogger.LogFilenamePrefix = "Sbm-Web-Adm";
SaLogger.IncludeHostInFileMessage = false;
SaLogger.IncludeUserInFileMessage = false;
try
{
// Load server configuration.
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: false)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: false)
.AddJsonFile($"appsettings.machine.{SbmSystem.ComputerName}.json", optional: false, reloadOnChange: false)
.AddEnvironmentVariables();
SbmConfiguration = builder.Build();
// Application configuration.
appConfigs = SbmAppConfigHelper.ExtractAppConfigs(SbmConfiguration.GetSection("AppConfigs"));
emailConfigs = SbmEmailConfigHelper.ExtractEmailConfigs(SbmConfiguration.GetSection("EmailConfigs"));
LoggingRootFolder = AppConfig.Logging.RootFolder;
// Application instance.
if (AppConfig.Instance.EqualsCI("Dev")) instanceType = Sbm.InstanceType.Dev;
else if (AppConfig.Instance.ContainsCI("Q")) instanceType = Sbm.InstanceType.QC;
else if (AppConfig.Instance.ContainsCI("UAT")) instanceType = Sbm.InstanceType.UAT;
else if (AppConfig.Instance.EqualsCI("PreProd")) instanceType = Sbm.InstanceType.UAT;
// Initialise hard-coded logging path.
if (StringUtil.IsEmpty(LoggingRootFolder))
{
if (SbmSystem.ComputerName.EqualsCI("WIN-BPCLM1QUOMT"))
LoggingRootFolder = @"D:\Sbmonite\Logs\" + (Development ? "Dev" : "Test");
}
if (DirectoryUtil.DirectoryExists(LoggingRootFolder))
SaLogger.LogFolder = LoggingRootFolder;
LogApplicationStart($"{SysUtil.Fn}");
// Control database connection.
SacsDatabaseConsole.OdbcConfig odbcConfig = new SacsDatabaseConsole.OdbcConfig();
odbcConfig.location = AppConfig.ControlDatabase.Location;
odbcConfig.user = AppConfig.ControlDatabase.User;
odbcConfig.pword = AppConfig.ControlDatabase.Password;
controlDatabase = SacsDatabaseConsole.OpenOdbcDatabase(odbcConfig);
if (controlDatabase.HasErrorState())
SaLogger.Warn($"{SysUtil.Fn} Control Database initialisation error: " + controlDatabase.ErrorStateMessage);
// Template database connection.
if (AppConfig.TemplateDatabase != null)
{
odbcConfig = new SacsDatabaseConsole.OdbcConfig();
odbcConfig.location = AppConfig.TemplateDatabase.Location;
odbcConfig.user = AppConfig.TemplateDatabase.User;
odbcConfig.pword = AppConfig.TemplateDatabase.Password;
templateDatabase = SacsDatabaseConsole.OpenOdbcDatabase(odbcConfig);
if (templateDatabase.HasErrorState())
SaLogger.Warn($"{SysUtil.Fn} Template Database initialisation error: " + controlDatabase.ErrorStateMessage);
}
// BusinessMgr database connections.
foreach (SbmAppConfig.DatabaseConfig dbConfig in AppConfig.BusMgrDatabases)
{
odbcConfig = new SacsDatabaseConsole.OdbcConfig();
odbcConfig.location = dbConfig.Location;
odbcConfig.user = dbConfig.User;
odbcConfig.pword = dbConfig.Password;
SacsDatabase busMgrDatabase = SacsDatabaseConsole.OpenOdbcDatabase(odbcConfig);
if (busMgrDatabase.HasErrorState())
SaLogger.Warn($"{SysUtil.Fn} BusMgr Database: " + busMgrDatabase.DatabaseName + ". Initialisation error: " + busMgrDatabase.ErrorStateMessage);
// Session context.
ushort sessionContextIdx = sessionContextIdx_Next++;
if (sessionContextIdx_Control < 1)
sessionContextIdx_Control = sessionContextIdx;
SessionContextData sessionContextData = new SessionContextData(new SbmSessionContext_Web(sessionContextIdx, Sbm.Application.WebControl));
sessionContextData.DbIdentifiers.AddRange(dbConfig.Identifiers);
sessionContextData.BusMgrDatabase = busMgrDatabase;
sessionContexts.Add(sessionContextData.SessionContext.Index, sessionContextData);
}
}
catch (Exception exc)
{
SaLogger.Error($"{SysUtil.Fn} " + ExceptionUtil.GetLogMessage(exc));
}
// Occasional startup processing.
if (generateDatabaseDefinitions_Control)
GenerateDatabaseDefinition(SbmDbDfnGenerator.DatabaseInstance.Control, GetControlDatabase());
if (generateDatabaseDefinitions_BusMgr)
{
// Use the 'template' database connection parameters.
SacsDatabaseConsole.OdbcConfig config = new SacsDatabaseConsole.OdbcConfig();
config.location = AppConfig.TemplateDatabase.Location;
config.user = AppConfig.TemplateDatabase.User;
config.pword = AppConfig.TemplateDatabase.Password;
GenerateDatabaseDefinition(SbmDbDfnGenerator.DatabaseInstance.BusinessMgr, GetTemplateDatabase());
}
}
//-------------------------------------------------------------------
// Generate database definition.
private void GenerateDatabaseDefinition(SbmDbDfnGenerator.DatabaseInstance dbInstance, ISacsDatabase db)
{
if (!generateDatabaseDefinitions_BusMgr || !SbmSystem.DebugMode) return;
if (!StringUtil.EmptyOnNull(EnvironmentName).EqualsCI("Development")) return;
if (db == null || StringUtil.IsEmpty(db.ConnectionString)) return;
// Generate database definitions.
GenerateDatabaseDefinition(dbInstance, db.ConnectionString);
}
private void GenerateDatabaseDefinition(SbmDbDfnGenerator.DatabaseInstance dbInstance, String connectionString)
{
if (!generateDatabaseDefinitions_BusMgr || !SbmSystem.DebugMode) return;
if (!StringUtil.EmptyOnNull(EnvironmentName).EqualsCI("Development")) return;
if (StringUtil.IsEmpty(connectionString)) return;
// Generate database definitions.
SbmDbDfnGenerator.Generate(dbInstance, connectionString);
//SaUpdateLogDbDfnGenerator.Generate(database.ConnectionString);
}
//-------------------------------------------------------------------
}
//=======================================================================
}