using System.Diagnostics;
using System.Security.Cryptography.X509Certificates;
using System.Text;
namespace IOL.GreatOffice.Api.Models.Misc;
public class AppConfiguration
{
public AppConfiguration()
{
}
public AppConfiguration(IConfiguration c)
{
DB_HOST = c.GetValue<string>(nameof(DB_HOST));
DB_PORT = c.GetValue<string>(nameof(DB_PORT));
DB_NAME = c.GetValue<string>(nameof(DB_NAME));
DB_USER = c.GetValue<string>(nameof(DB_USER));
DB_PASSWORD = c.GetValue<string>(nameof(DB_PASSWORD));
QUARTZ_DB_HOST = c.GetValue<string>(nameof(QUARTZ_DB_HOST));
QUARTZ_DB_NAME = c.GetValue<string>(nameof(QUARTZ_DB_NAME));
QUARTZ_DB_PASSWORD = c.GetValue<string>(nameof(QUARTZ_DB_PASSWORD));
QUARTZ_DB_USER = c.GetValue<string>(nameof(QUARTZ_DB_USER));
QUARTZ_DB_PORT = c.GetValue<string>(nameof(QUARTZ_DB_PORT));
APP_CERT = c.GetValue<string>(nameof(APP_CERT));
APP_AES_KEY = c.GetValue<string>(nameof(APP_AES_KEY));
SEQ_API_KEY = c.GetValue<string>(nameof(SEQ_API_KEY));
SEQ_API_URL = c.GetValue<string>(nameof(SEQ_API_URL));
POSTMARK_TOKEN = c.GetValue<string>(nameof(POSTMARK_TOKEN));
EMAIL_FROM_ADDRESS = c.GetValue<string>(nameof(EMAIL_FROM_ADDRESS));
CANONICAL_FRONTEND_URL = c.GetValue<string>(nameof(CANONICAL_FRONTEND_URL));
CANONICAL_BACKEND_URL = c.GetValue<string>(nameof(CANONICAL_BACKEND_URL));
ASPNETCORE_ENVIRONMENT = c.GetValue<string>(nameof(ASPNETCORE_ENVIRONMENT));
_configuration = c;
}
private static IConfiguration _configuration { get; set; }
/// <summary>
/// An reachable ip address or url that points to a postgres database.
/// </summary>
public string DB_HOST { get; set; }
/// <summary>
/// The port number to use with DB_HOST to point to the postgres database.
/// </summary>
public string DB_PORT { get; set; }
/// <summary>
/// The database user to authenticate against postgres with.
/// </summary>
public string DB_USER { get; set; }
/// <summary>
/// The password for the database user to authenticate against postgres with.
/// </summary>
public string DB_PASSWORD { get; set; }
/// <summary>
/// The name of the main app database.
/// </summary>
public string DB_NAME { get; set; }
/// <summary>
/// An reachable ip address or url that points to a postgres(quartz) database.
/// </summary>
public string QUARTZ_DB_HOST { get; set; }
/// <summary>
/// The port number to use with QUARTZ_DB_HOST to point to the postgres(quartz) database.
/// </summary>
public string QUARTZ_DB_PORT { get; set; }
/// <summary>
/// The database user to authenticate against postgres(quartz) with.
/// </summary>
public string QUARTZ_DB_USER { get; set; }
/// <summary>
/// The password for the database user to authenticate against postgres(quartz) with.
/// </summary>
public string QUARTZ_DB_PASSWORD { get; set; }
/// <summary>
/// The name of the quartz database.
/// </summary>
public string QUARTZ_DB_NAME { get; set; }
/// <summary>
/// API key to use when pushing logs to SEQ
/// </summary>
public string SEQ_API_KEY { get; set; }
/// <summary>
/// Url pointing to the seq instance that processes server logs
/// </summary>
public string SEQ_API_URL { get; set; }
/// <summary>
/// A token used when sending email via Postmakr
/// </summary>
public string POSTMARK_TOKEN { get; set; }
/// <summary>
/// The address to send emails from, needs to be setup as a sender in postmark
/// </summary>
public string EMAIL_FROM_ADDRESS { get; set; }
/// <summary>
/// The absolute url to the frontend app
/// </summary>
public string CANONICAL_FRONTEND_URL { get; set; }
/// <summary>
/// The absolute url to the backend api
/// </summary>
public string CANONICAL_BACKEND_URL { get; set; }
/// <summary>
/// A random string used to encrypt/decrypt for general purposes
/// </summary>
public string APP_AES_KEY { get; set; }
/// <summary>
/// A base64 string containing a passwordless pfx cert
/// </summary>
public string APP_CERT { get; set; }
/// <summary>
/// A string signaling to the framework what environment it is running in, usually Development, Testing or Production.
/// </summary>
public string ASPNETCORE_ENVIRONMENT { get; set; }
public X509Certificate2 CERT1() => new(Convert.FromBase64String(APP_CERT));
public object GetPublicObject()
{
return new
{
DB_HOST,
DB_PORT,
DB_USER,
DB_PASSWORD = DB_PASSWORD.Obfuscate(),
QUARTZ_DB_HOST,
QUARTZ_DB_PORT,
QUARTZ_DB_USER,
QUARTZ_DB_PASSWORD = QUARTZ_DB_PASSWORD.Obfuscate(),
SEQ_API_KEY = SEQ_API_KEY.Obfuscate(),
SEQ_API_URL,
POSTMARK_TOKEN = POSTMARK_TOKEN.Obfuscate(),
EMAIL_FROM_ADDRESS,
APP_AES_KEY = APP_AES_KEY.Obfuscate(),
CERT1 = CERT1().Thumbprint,
CANONICAL_FRONTEND_URL,
ASPNETCORE_ENVIRONMENT
};
}
public string GetEnvironmentVariable(string variableName, string fallback = "")
{
if (_configuration == default)
{
Debug.WriteLine("AppConfiguration was instantiated without a full IConfiguration");
return "";
}
if (fallback.HasValue()) return _configuration.GetValue(variableName, fallback);
return _configuration.GetValue<string>(variableName);
}
public string GetAppDatabaseConnectionString()
{
var builder = new StringBuilder();
builder.Append($"Server={DB_HOST};Port={DB_PORT};Database={DB_NAME};User Id={DB_USER};Password={DB_PASSWORD}");
if (ASPNETCORE_ENVIRONMENT == "Development")
{
builder.Append(";Include Error Detail=true");
}
Log.Debug("Using app database connection string: " + builder.ToString());
return builder.ToString();
}
public string GetQuartzDatabaseConnectionString()
{
var builder = new StringBuilder();
builder.Append($"Server={QUARTZ_DB_HOST};Port={QUARTZ_DB_PORT};Database={QUARTZ_DB_NAME};User Id={QUARTZ_DB_USER};Password={QUARTZ_DB_PASSWORD}");
if (ASPNETCORE_ENVIRONMENT == "Development")
{
builder.Append(";Include Error Detail=true");
}
Log.Debug("Using quartz database connection string: " + builder.ToString());
return builder.ToString();
}
public string GetAppVersion()
{
var versionFilePath = Path.Combine(AppPaths.AppData.HostPath, "version.txt");
if (!File.Exists(versionFilePath)) return "unknown-" + ASPNETCORE_ENVIRONMENT;
var versionText = File.ReadAllText(versionFilePath);
return versionText + "-" + ASPNETCORE_ENVIRONMENT;
}
}