Control - Repository initialisation.
This commit is contained in:
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user