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 appConfigs = new Dictionary(); private Dictionary emailConfigs = new Dictionary(); 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 DbIdentifiers { get; } = new List(); public ISacsDatabase BusMgrDatabase { get; set; } } private readonly Dictionary sessionContexts = new Dictionary(); //------------------------------------------------------------------- // 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 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 GetDbIdentifiers(SbmSessionContext sessionContext) { return sessionContexts.GetValue(sessionContext.Index, null)?.DbIdentifiers ?? new List(); } 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. /// Initialise environment - from Startup. internal void InitWebHostEnvironment(IWebHostEnvironment env) { InitEnvironment(env); } /// Initialise environment - from internal (above) or unit tests. 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); } //------------------------------------------------------------------- } //======================================================================= }