Control - Repository initialisation.

This commit is contained in:
Andy Howard
2025-01-09 16:30:52 +00:00
parent d015470f58
commit 4a72043f00
103 changed files with 4324 additions and 469 deletions
@@ -20,6 +20,11 @@ using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Sarand.Net.Standard.Base.ReferenceData;
using Sarand.Net.Standard.Base.Bus;
using static Sarand.Net.Standard.Dbas.Base.SacsDatabaseConsole;
using Sarand.BusinessMgr.Net.Standard.Base.Bus.Control;
using Sarand.BusinessMgr.Net.Standard.Base.Mgr.Control;
using Sarand.Net.Standard.Base.Security;
namespace Sarand.BusinessMgr.Web.Control.App
{
@@ -30,6 +35,7 @@ namespace Sarand.BusinessMgr.Web.Control.App
// Data members.
private bool generateDatabaseDefinitions_Control = false;
private bool generateDatabaseDefinitions_BusMgr = false;
private static SbmApplication_Control appInstance;
private PropertySet propertySet;
private Dictionary<String, Net.Core.Web.App.SbmAppConfig> appConfigs = new Dictionary<string, Net.Core.Web.App.SbmAppConfig>();
private Dictionary<String, SbmEmailConfig> emailConfigs = new Dictionary<string, SbmEmailConfig>();
@@ -37,29 +43,45 @@ namespace Sarand.BusinessMgr.Web.Control.App
// Singular databases.
private ISacsDatabase controlDatabase = null;
private ISacsDatabase templateDatabase = null;
// Session contexts.
private static ushort sessionContextIdx_Next = 100;
private class SessionContextData
// Core Session contexts - to access Core database via repository configuration.
private static ushort sessionContextIdx_Next = 101;
private class CoreInstanceContextData
{
public SessionContextData(SbmSessionContext_Web sessionContext)
public CoreInstanceContextData(SbmSessionContext_Web sessionContext, SysId controlOwnerId, SysId controlRepositoryId)
{
SessionContext = sessionContext;
ControlOwnerId = controlOwnerId;
ControlRepositoryId = controlRepositoryId;
}
public SbmSessionContext_Web SessionContext { get; }
public SysId ControlOwnerId { get; }
public SysId ControlRepositoryId { get; }
public HashSet<string> RepositoryContexts { get; } = new HashSet<string>();
public ISacsDatabase BusMgrDatabase { get; set; }
// Core Instance config.
private SbmInstanceConfig instanceConfig = null;
public SbmInstanceConfig InstanceConfig
{
get
{
if (instanceConfig == null)
instanceConfig = new SbmInstanceConfig_Control(ControlOwnerId, ControlRepositoryId);
return instanceConfig;
}
}
}
private readonly Dictionary<ushort, SessionContextData> sessionContexts = new Dictionary<ushort, SessionContextData>();
private readonly Dictionary<ushort, CoreInstanceContextData> coreInstances = new Dictionary<ushort, CoreInstanceContextData>();
//-------------------------------------------------------------------
// Construction.
public SbmApplication_Control(IConfiguration configuration)
{
appInstance = this;
InitialiseTemporaryLoggingFolder();
try
{
propertySet = new PropertySet();
SbmGlobals.System = (System_Web = new SbmSystem_Web(propertySet));
SbmGlobals.System = (SbmGlobals_Web.System = (System_Web = new SbmSystem_Web(propertySet)));
Configuration = configuration;
}
catch (Exception exc)
@@ -71,53 +93,94 @@ namespace Sarand.BusinessMgr.Web.Control.App
//-------------------------------------------------------------------
// Properties.
public static SbmApplication_Control Instance { get { return appInstance; } }
// Application Configuration.
public override Net.Core.Web.App.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();
return coreInstances.Values.Select(item => item.SessionContext.Index).ToList();
}
public override SbmSessionContext GetSessionContextByIndex(ushort index)
{
return sessionContexts.GetValue(index, null)?.SessionContext ?? null;
return coreInstances.GetValue(index, null)?.SessionContext ?? null;
}
public override List<SbmSessionContext> GetSessionContexts()
{
return new List<SbmSessionContext>(sessionContexts.Values.Select(item => item.SessionContext));
return new List<SbmSessionContext>(coreInstances.Values.Select(item => item.SessionContext));
}
/// <summary>
/// Identify the Core session context by the Repository Id.
/// <para>If context not yet defined for Repository, load and then return index.</para>
/// <para>If repository not found, return 0.</para>
/// </summary>
public ushort GetCoreSessionIndexForControlRepository(SysId ownerId, SysId repositoryId)
{
using (DisposableCollection<SacsDisposable> disposables = new DisposableCollection<SacsDisposable>())
{
CoreInstanceContextData sessionContext = coreInstances.Values.FirstOrDefault(item => item.ControlRepositoryId.Equals(repositoryId));
if (sessionContext != null) return sessionContext.SessionContext.Index;
// Repository context not yet loaded.
SbmcInstanceMgr instanceMgr = System.CreateControlInstanceMgr();
disposables.Add(instanceMgr);
SbmcRepository repository = instanceMgr.GetRepositoryById(repositoryId);
disposables.Add(repository);
if (repository != null)
{
// Core database connection.
SacsDatabaseConsole.OdbcConfig odbcConfig = SbmCoreInstanceConsole_Control.GetRepositoryOdbcConfig(repository);
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;
CoreInstanceContextData sessionContextData = new CoreInstanceContextData(new SbmSessionContext_Web(sessionContextIdx, Sbm.Application.WebControl), ownerId, repositoryId);
sessionContextData.RepositoryContexts.Add(repository.Context);
sessionContextData.BusMgrDatabase = busMgrDatabase;
coreInstances.Add(sessionContextData.SessionContext.Index, sessionContextData);
return sessionContextData.SessionContext.Index;
}
}
return 0;
}
// Databases.
public override ISacsDatabase GetControlDatabase()
{
return controlDatabase;
}
public override ISacsDatabase GetTemplateDatabase()
{
return templateDatabase;
}
public override ISacsDatabase GetControlDatabase() { return controlDatabase; }
public override ISacsDatabase GetTemplateDatabase() { return templateDatabase; }
public override HashSet<string> GetRepositoryContexts(SbmSessionContext sessionContext)
{
return sessionContexts.GetValue(sessionContext.Index, null)?.RepositoryContexts ?? new HashSet<string>();
return coreInstances.GetValue(sessionContext.Index, null)?.RepositoryContexts ?? new HashSet<string>();
}
public override ISacsDatabase GetBusMgrDatabase(SbmSessionContext sessionContext)
{
return sessionContexts.GetValue(sessionContext.Index, null)?.BusMgrDatabase;
return coreInstances.GetValue(sessionContext.Index, null)?.BusMgrDatabase;
}
// Instance configuration.
public override SbmInstanceConfig GetInstanceConfig(SbmSessionContext sessionContext)
{
throw new NotSupportedException("InstanceConfig not supported in Control application.");
return coreInstances.GetValue(sessionContext.Index, null)?.InstanceConfig;
}
// Email configuration.
public override SbmEmailConfig EmailConfig { get { return emailConfigs.Values.ToList().getConfigForSession(AppConfig); } }
//-------------------------------------------------------------------
// Create Consoles.
// Consoles.
//-------------------------------------------------------------------
public override SaSecurityConsole CreateSecurityConsole(ISbmUserContext_Core userContext)
{
return new SbmSecurityConsole_Web(userContext);
}
public override SaReferenceDataConsole CreateReferenceDataConsole(ISbmUserContext_Core userContext)
{
return null;
}
public override SbmEmailConsole CreateEmailConsole(ISbmUserContext_Core userContext)
{
return new SbmEmailConsole_Control(EmailConfig);
@@ -173,9 +236,9 @@ namespace Sarand.BusinessMgr.Web.Control.App
// Control database connection.
SacsDatabaseConsole.OdbcConfig odbcConfig = new SacsDatabaseConsole.OdbcConfig();
odbcConfig.location = AppConfig.ControlDatabase.Location;
odbcConfig.user = AppConfig.ControlDatabase.User;
odbcConfig.pword = AppConfig.ControlDatabase.Password;
odbcConfig.Location = AppConfig.ControlDatabase.Location;
odbcConfig.User = AppConfig.ControlDatabase.User;
odbcConfig.Password = AppConfig.ControlDatabase.Password;
controlDatabase = SacsDatabaseConsole.OpenOdbcDatabase(odbcConfig);
if (controlDatabase.HasErrorState())
SaLogger.Warn($"{SysUtil.Fn} Control Database initialisation error: " + controlDatabase.ErrorStateMessage);
@@ -184,34 +247,13 @@ namespace Sarand.BusinessMgr.Web.Control.App
if (AppConfig.TemplateDatabase != null)
{
odbcConfig = new SacsDatabaseConsole.OdbcConfig();
odbcConfig.location = AppConfig.TemplateDatabase.Location;
odbcConfig.user = AppConfig.TemplateDatabase.User;
odbcConfig.pword = AppConfig.TemplateDatabase.Password;
odbcConfig.Location = AppConfig.TemplateDatabase.Location;
odbcConfig.User = AppConfig.TemplateDatabase.User;
odbcConfig.Password = AppConfig.TemplateDatabase.Password;
templateDatabase = SacsDatabaseConsole.OpenOdbcDatabase(odbcConfig);
if (templateDatabase.HasErrorState())
SaLogger.Warn($"{SysUtil.Fn} Template Database initialisation error: " + controlDatabase.ErrorStateMessage);
}
// BusinessMgr database connections.
foreach (Net.Core.Web.App.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.RepositoryContexts.UnionWith(dbConfig.Identifiers);
sessionContextData.BusMgrDatabase = busMgrDatabase;
sessionContexts.Add(sessionContextData.SessionContext.Index, sessionContextData);
}
}
catch (Exception exc)
{
@@ -225,9 +267,9 @@ namespace Sarand.BusinessMgr.Web.Control.App
{
// 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;
config.Location = AppConfig.TemplateDatabase.Location;
config.User = AppConfig.TemplateDatabase.User;
config.Password = AppConfig.TemplateDatabase.Password;
GenerateDatabaseDefinition(SbmDbDfnGenerator.DatabaseInstance.Core, GetTemplateDatabase());
}
}