using Microsoft.Extensions.Options; using Npgsql; using Tau.Acuvim.Portal.Configuration; using Tau.Acuvim.Portal.DTOs; namespace Tau.Acuvim.Portal.Services; // Captures the DB connection-resolution source at startup so the App-config view // can show how the running container resolved its DB without re-parsing config. public sealed class DatabaseResolutionInfo { public DatabaseResolutionInfo(string source) => Source = source; public string Source { get; } public DateTime StartedAtUtc { get; } = DateTime.UtcNow; } public sealed class ConfigOverviewService( IOptions appOptions, IOptions dbOptions, IOptions grafanaOptions, IOptions monitoringOptions, IOptions authOptions, IHostEnvironment env, DatabaseResolutionInfo dbResolution) { public ConfigOverviewDto Build() { var (host, port, database) = ParseConnection(dbOptions.Value.ConnectionString); var application = new AppInfoDto( appOptions.Value.Name, env.EnvironmentName, appOptions.Value.PublicUrl); var database_ = new DatabaseInfoDto( dbOptions.Value.Provider, host, port, database, dbOptions.Value.MigrateOnStartup, dbOptions.Value.AutoProvisionLocalTimescaleDb, dbResolution.Source); var grafana = new GrafanaInfoDto( grafanaOptions.Value.BaseUrl, grafanaOptions.Value.InternalUrl, grafanaOptions.Value.EmbedPathPrefix, grafanaOptions.Value.EmbedMode, grafanaOptions.Value.DefaultDashboardUid, grafanaOptions.Value.AuthMode, grafanaOptions.Value.Dashboards.Count); var monitoring = new MonitoringInfoDto( monitoringOptions.Value.ChunkTimeInterval, monitoringOptions.Value.EnableHourlyAggregates); var auth = new AuthInfoDto( authOptions.Value.CookieName, authOptions.Value.RequireConfirmedEmail, authOptions.Value.DefaultAdminEmail); var assembly = typeof(ConfigOverviewService).Assembly.GetName(); var build = new BuildInfoDto( assembly.Version?.ToString() ?? "0.0.0", Environment.Version.ToString(), dbResolution.StartedAtUtc); return new ConfigOverviewDto(application, database_, grafana, monitoring, auth, build); } private static (string Host, int Port, string Database) ParseConnection(string connectionString) { if (string.IsNullOrWhiteSpace(connectionString)) return ("(unset)", 0, "(unset)"); try { var b = new NpgsqlConnectionStringBuilder(connectionString); return (b.Host ?? "(unset)", b.Port, b.Database ?? "(unset)"); } catch { return ("(unparseable)", 0, "(unparseable)"); } } }