Files
Saxonite/SaxoniteWebApi/Api/App/SaxApplication_Api.cs
T
2024-04-24 17:16:49 +01:00

142 lines
6.2 KiB
C#

using Microsoft.Identity.Client;
using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.Helpers;
using Sarand.Net.Standard.Base.IO;
using Sarand.Net.Standard.Base.Utils;
using Saxonite.Net.Core.Web.Base.App;
using Saxonite.Net.Core.Web.Base.Helpers;
using Saxonite.Net.Standard.Base.App;
using Saxonite.Net.Standard.Base.Consoles;
using Saxonite.Net.Standard.Base.Helpers;
using Saxonite.Web.Api.Consoles;
using System.Text.RegularExpressions;
using static Saxonite.Net.Core.Web.Base.App.SaxAppConfig;
namespace Saxonite.Web.Api.App
{
//=======================================================================
public class SaxApplication_Api : SaxApplication_Web
{
//-------------------------------------------------------------------
// Data members.
private Dictionary<String, SaxAppConfig> appConfigs = new Dictionary<string, SaxAppConfig>();
private Dictionary<String, SaxEmailConfig> emailConfigs = new Dictionary<string, SaxEmailConfig>();
// Session contexts.
private class SessionContextData_Api : SessionContextData_Web
{
public SessionContextData_Api(SaxSessionContext_Web sessionContext) : base(sessionContext) { }
}
private readonly Dictionary<int, SessionContextData_Api> sessionContexts = new Dictionary<int, SessionContextData_Api>();
//-------------------------------------------------------------------
// Construction.
public SaxApplication_Api()
{
InitialiseTemporaryLoggingFolder();
try
{
AppInstance = this;
ConsoleHelper_Api = new SaxConsoleHelper_Api(this);
// Logging configuration.
SaLogger.LogFilenamePrefix = "Sax-Web-Api";
SaLogger.IncludeHostInFileMessage = false;
SaLogger.IncludeUserInFileMessage = false;
LoadConfiguration();
}
catch (Exception exc)
{
SaLogger.Error(GetType().Name + ".CTR " + ExceptionUtil.GetErrorStateMessage(exc));
throw;
}
}
//-------------------------------------------------------------------
// Properties.
public static SaxApplication_Api? AppInstance { get; private set; }
public override SaxConsoleHelper ConsoleHelper { get { return ConsoleHelper_Api; } }
public SaxConsoleHelper_Api ConsoleHelper_Api { get; private set; }
// Database.
public override ISacsDatabase? GetDatabase(SaxSessionContext sessionContext, Sax.Database databaseType)
{
return sessionContexts.GetValue(sessionContext.Index, null)?.Databases.GetValue(databaseType, null);
}
// Configuration.
public override SaxAppConfig AppConfig { get { return appConfigs.Values.ToList().getConfigForApplication(); } }
public override SaxEmailConfig EmailConfig { get { return emailConfigs.Values.ToList().getConfigForSession(AppConfig); } }
public override String SessionCookieName { get { return Sax.Config.Api.Session.Cookie.Name; } }
// Startup messages - for debugging. See Admin.Views._Layout.
public List<String> Messages { get; } = new List<String>();
//-------------------------------------------------------------------
// Initialisation.
private void LoadConfiguration()
{
try
{
// Environment.
environmentName = Environments.Development;
if (SaxSystem.ComputerName.EqualsCI("Sarand601"))
environmentName = Environments.Production;
// Load server configuration.
var builder =
new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: false)
.AddJsonFile($"appsettings.{environmentName}.json", optional: true, reloadOnChange: false)
.AddJsonFile($"appsettings.machine.{SaxSystem.ComputerName}.json", optional: true, reloadOnChange: false)
.AddEnvironmentVariables();
Stream configStream = SaxResourceHelper.GetResourceStream("appsettings.json", "Config");
if (configStream != null) builder.AddJsonStream(configStream);
configStream = SaxResourceHelper.GetResourceStream($"appsettings.{environmentName}.json", "Config");
if (configStream != null) builder.AddJsonStream(configStream);
configStream = SaxResourceHelper.GetResourceStream($"appsettings.machine.{SaxSystem.ComputerName}.json", "Config");
if (configStream != null) builder.AddJsonStream(configStream);
SaxConfiguration = builder.Build();
// Application configuration.
appConfigs = SaxAppConfigHelper.ExtractAppConfigs(SaxConfiguration.GetSection("AppConfigs"));
emailConfigs = SaxEmailConfigHelper.ExtractEmailConfigs(SaxConfiguration.GetSection("EmailConfigs"));
LoggingRootFolder = AppConfig.Logging.RootFolder;
// Ensure root log folder ends with Api folder.
if (!StringUtil.IsBlank(LoggingRootFolder) && !Regex.IsMatch(LoggingRootFolder, "[\\\\/]Api$", RegexOptions.IgnoreCase))
LoggingRootFolder = StringUtil.CombineFilePath(LoggingRootFolder, "Api");
// Application instance.
if (AppConfig.Instance.EqualsCI("Dev")) instanceType = Sax.InstanceType.Dev;
else if (AppConfig.Instance.ContainsCI("Q")) instanceType = Sax.InstanceType.QC;
else if (AppConfig.Instance.ContainsCI("UAT")) instanceType = Sax.InstanceType.UAT;
else if (AppConfig.Instance.EqualsCI("PreProd")) instanceType = Sax.InstanceType.UAT;
// Initialise hard-coded logging path.
if (StringUtil.IsBlank(LoggingRootFolder))
{
if (SaxSystem.ComputerName.EqualsCI("WIN-BPCLM1QUOMT"))
LoggingRootFolder = @"D:\Saxonite\Logs\" + (Development ? "Dev" : "Test");
}
if (DirectoryUtil.DirectoryExists(LoggingRootFolder))
SaLogger.LogFolder = LoggingRootFolder;
LogApplicationStart(SysUtil.Fn);
// Session context - only one context available/necessary (for now).
SessionContextData_Api sessionContextData = new SessionContextData_Api(new SaxSessionContext_Web(100, Sax.Application.Api));
ConfigureDatabaseConnection(sessionContextData, Sax.Database.Core);
ConfigureDatabaseConnection(sessionContextData, Sax.Database.Support);
sessionContexts.Add(sessionContextData.SessionContext.Index, sessionContextData);
SessionContext = sessionContextData.SessionContext;
}
catch (Exception exc)
{
SaLogger.Warn(SysUtil.Fn + " " + ExceptionUtil.GetLogMessage(exc, "loading application configuration", 8));
}
}
//-------------------------------------------------------------------
}
//=======================================================================
}