209 lines
9.2 KiB
C#
209 lines
9.2 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>();
|
|
// Session contexts.
|
|
private static ushort sessionContextIdx_Next = 100;
|
|
private ushort sessionContextIdx_Control = 0;
|
|
private class SessionContextData
|
|
{
|
|
public SessionContextData(SbmSessionContext_Web sessionContext)
|
|
{
|
|
SessionContext = sessionContext;
|
|
}
|
|
public SbmSessionContext_Web SessionContext { get; }
|
|
public ISacsDatabase ControlDatabase { get; set; }
|
|
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 exc;
|
|
}
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// 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(SbmSessionContext sessionContext)
|
|
{
|
|
return sessionContexts.GetValue(sessionContext.Index, null)?.ControlDatabase;
|
|
}
|
|
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)
|
|
{
|
|
String fn = GetType().Name + ".InitEnvironment";
|
|
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(fn);
|
|
|
|
// Control database connection.
|
|
SacsDatabaseConsole.OdbcConfig config = new SacsDatabaseConsole.OdbcConfig();
|
|
config.location = AppConfig.ControlDatabase.Location;
|
|
config.user = AppConfig.ControlDatabase.User;
|
|
config.pword = AppConfig.ControlDatabase.Password;
|
|
SacsDatabase controlDatabase = SacsDatabaseConsole.OpenOdbcDatabase(config);
|
|
if (controlDatabase.HasErrorState())
|
|
SaLogger.Warn(fn + " Control Database initialisation error: " + controlDatabase.ErrorStateMessage);
|
|
|
|
// BusinessMgr database connection.
|
|
config = new SacsDatabaseConsole.OdbcConfig();
|
|
config.location = AppConfig.BusMgrDatabase.Location;
|
|
config.user = AppConfig.BusMgrDatabase.User;
|
|
config.pword = AppConfig.BusMgrDatabase.Password;
|
|
SacsDatabase busMgrDatabase = SacsDatabaseConsole.OpenOdbcDatabase(config);
|
|
if (busMgrDatabase.HasErrorState())
|
|
SaLogger.Warn(fn + " BusMgr Database initialisation error: " + busMgrDatabase.ErrorStateMessage);
|
|
|
|
// Session context - only one context available/necessary (for now).
|
|
sessionContextIdx_Control = sessionContextIdx_Next++;
|
|
SessionContextData sessionContextData = new SessionContextData(new SbmSessionContext_Web(sessionContextIdx_Control, Sbm.Application.WebControl));
|
|
sessionContextData.ControlDatabase = controlDatabase;
|
|
sessionContextData.BusMgrDatabase = busMgrDatabase;
|
|
sessionContexts.Add(sessionContextData.SessionContext.Index, sessionContextData);
|
|
}
|
|
catch (Exception exc)
|
|
{
|
|
SaLogger.Error(fn + " " + ExceptionUtil.GetLogMessage(exc));
|
|
}
|
|
|
|
// Occasional startup processing.
|
|
SbmSessionContext sessionContext = GetSessionContext(sessionContextIdx_Control);
|
|
if (generateDatabaseDefinitions_Control)
|
|
GenerateDatabaseDefinition(sessionContext, SbmDbDfnGenerator.DatabaseInstance.Control, GetControlDatabase(sessionContext));
|
|
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(sessionContext, SbmDbDfnGenerator.DatabaseInstance.BusinessMgr, SacsDatabaseConsole.GenerateConnectionString(config));
|
|
}
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// Generate database definition.
|
|
private void GenerateDatabaseDefinition(SbmSessionContext sessionContext, SbmDbDfnGenerator.DatabaseInstance dbInstance, ISacsDatabase db)
|
|
{
|
|
if (!generateDatabaseDefinitions_BusMgr || !SbmSystem.DebugMode || sessionContext == null) return;
|
|
if (!StringUtil.EmptyOnNull(EnvironmentName).EqualsCI("Development")) return;
|
|
if (db == null || StringUtil.IsEmpty(db.ConnectionString)) return;
|
|
|
|
// Generate database definitions.
|
|
GenerateDatabaseDefinition(sessionContext, dbInstance, db.ConnectionString);
|
|
}
|
|
private void GenerateDatabaseDefinition(SbmSessionContext sessionContext, SbmDbDfnGenerator.DatabaseInstance dbInstance, String connectionString)
|
|
{
|
|
if (!generateDatabaseDefinitions_BusMgr || !SbmSystem.DebugMode || sessionContext == null) return;
|
|
if (!StringUtil.EmptyOnNull(EnvironmentName).EqualsCI("Development")) return;
|
|
if (StringUtil.IsEmpty(connectionString)) return;
|
|
|
|
// Generate database definitions.
|
|
SbmDbDfnGenerator.Generate(dbInstance, connectionString);
|
|
//SaUpdateLogDbDfnGenerator.Generate(database.ConnectionString);
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
}
|
|
//=======================================================================
|
|
}
|