diff --git a/Core/Configurations/ConfigurationBuilder.cs b/Core/Configurations/ConfigurationBuilder.cs index e771483..e3c29ff 100644 --- a/Core/Configurations/ConfigurationBuilder.cs +++ b/Core/Configurations/ConfigurationBuilder.cs @@ -29,19 +29,52 @@ namespace Core.Configurations } } - public class ConfigurationRoot : IConfigurationRoot + public class Configuration : IConfiguration { - List IConfigurationRoot.ConfigurationProviders { get; set; } + List _providers = []; + + public string this[string key] + { + get => GetConfiguration(_providers, key); + set => throw new NotSupportedException(); + } + + List IConfiguration.ConfigurationProviders + { + get { return _providers; } + set { _providers = value; } + } + + internal static string GetConfiguration(IList providers, string key) + { + string value = null; + foreach (var provider in providers) + { + var test = provider.Configuration().SelectToken(ConfigurationBinder.NormalizePath(key)); + + if (test != null) + value = test.ToString(); + } + + return value; + } + + + + } + public class ConfigurationRoot : Configuration, IConfigurationRoot + { + List IConfiguration.ConfigurationProviders { get; set; } public ConfigurationRoot(List configurationProviders) { - ((IConfigurationRoot)this).ConfigurationProviders = configurationProviders; + ((IConfiguration)this).ConfigurationProviders = configurationProviders; } } public static class ConfigurationBinder { - private static string NormalizePath(string path) + public static string NormalizePath(string path) { return path?.Replace(":", ".", StringComparison.Ordinal) ?? string.Empty; } diff --git a/Core/Configurations/IConfigurationRoot.cs b/Core/Configurations/IConfigurationRoot.cs index 2fb16c9..0dc36ee 100644 --- a/Core/Configurations/IConfigurationRoot.cs +++ b/Core/Configurations/IConfigurationRoot.cs @@ -1,7 +1,10 @@ namespace Core.Configurations { - public interface IConfigurationRoot - { + public interface IConfigurationRoot : IConfiguration { } + + public interface IConfiguration + { internal List ConfigurationProviders { get; set; } + string this[string key] { get; set; } } } diff --git a/Core/Configurations/SmartConfigProvider/IConfigurationRepository.cs b/Core/Configurations/SmartConfigProvider/IConfigurationRepository.cs index 65de740..079dd29 100644 --- a/Core/Configurations/SmartConfigProvider/IConfigurationRepository.cs +++ b/Core/Configurations/SmartConfigProvider/IConfigurationRepository.cs @@ -4,4 +4,5 @@ namespace Core.Configurations.SmartConfiguration; public interface IConfigurationRepository { IEnumerable GetActiveConfigurations(); -} \ No newline at end of file +} + diff --git a/Core/Configurations/SmartConfigProvider/SmartConfigExtension.cs b/Core/Configurations/SmartConfigProvider/SmartConfigExtension.cs index 62f7c29..cf32907 100644 --- a/Core/Configurations/SmartConfigProvider/SmartConfigExtension.cs +++ b/Core/Configurations/SmartConfigProvider/SmartConfigExtension.cs @@ -12,8 +12,26 @@ namespace Core.Configurations.SmartConfig { return builder.AddProvider(new SmartConfigProvider(builder, configKey, path)); } - } + public static IConfigurationBuilder AddSmartConfig(this IConfigurationBuilder builder, Action setupAction) + { + var options = new SmartConfigOptions(); + setupAction(options); + return builder.AddProvider(new SmartConfigProvider(options.GetRepository())); + } + } + public class SmartConfigOptions + { + private SmartConfiguration.IConfigurationRepository _repository; + + public SmartConfigOptions UseRepository(SmartConfiguration.IConfigurationRepository repository) + { + _repository = repository; + return this; + } + + internal SmartConfiguration.IConfigurationRepository GetRepository() => _repository; + } public class SmartConfigProvider : IConfigurationProvider { string _configKey; @@ -26,6 +44,8 @@ namespace Core.Configurations.SmartConfig public SmartConfigProvider() { } + public SmartConfigProvider(SmartConfiguration.IConfigurationRepository configurationProvider) + { } public SmartConfigProvider(IConfigurationBuilder builder, string configKey, string configurationFilePath) { _builder = builder; diff --git a/Core/Core.csproj b/Core/Core.csproj index dd31f27..2ba3f0a 100644 --- a/Core/Core.csproj +++ b/Core/Core.csproj @@ -13,6 +13,7 @@ + diff --git a/Core/Telemetry/Class1.cs b/Core/Telemetry/Class1.cs index 4792b38..6e8eeef 100644 --- a/Core/Telemetry/Class1.cs +++ b/Core/Telemetry/Class1.cs @@ -1,14 +1,5 @@ -using Seq.Api; -using Seq.Api.Client; -using Seq.Api.Model.Events; -using Seq.Api.Model.LogEvents; -using Seq.Api.Model.Shared; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; +using System.Text; using System.Text.Json; -using System.Threading.Tasks; namespace Core.Telemetry { diff --git a/Core/Telemetry/DebugTelemetryChannel.cs b/Core/Telemetry/DebugTelemetryChannel.cs index 6a7c54c..2ebf0ad 100644 --- a/Core/Telemetry/DebugTelemetryChannel.cs +++ b/Core/Telemetry/DebugTelemetryChannel.cs @@ -1,4 +1,5 @@ using Microsoft.ApplicationInsights.Channel; +using System.Net.Http.Headers; namespace Core.Telemetry { @@ -8,26 +9,38 @@ namespace Core.Telemetry public ITelemetryChannel _defaultChannel; static HttpClient _client = new HttpClient(); + static DebugTelemetryChannel() + { + _client = new HttpClient() + { + BaseAddress = new Uri("http://localhost:5341"), + Timeout = TimeSpan.FromSeconds(30) + }; + + _client.DefaultRequestHeaders.Accept.Clear(); + _client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); + } + + public DebugTelemetryChannel(string filePath) { - _client.BaseAddress = new Uri("http://localhost:5341"); _filePath = filePath; } public new void Send(ITelemetry telemetry) { var l = new SeqLogger(_client, "", ""); - //await l.LogToSeq( - // "Bruger {UserId} loggede ind", - // "Debug", - // new Dictionary { { "UserId", "12345" }, { "Counter", i++ } } - // ); + l.LogToSeq( + "Bruger {UserId} loggede ind", + "Debug", + new Dictionary { { "UserId", "12345" }, { "Counter", "i++" } } + ); if (telemetry is Microsoft.ApplicationInsights.DataContracts.TraceTelemetry trace) { - var severity = trace.SeverityLevel; - Console.WriteLine($"Trace severity: {severity}, Message: {trace.Message}"); + var severity = trace.SeverityLevel; + Console.WriteLine($"Trace severity: {severity}, Message: {trace.Message}"); } diff --git a/Core/Telemetry/SeqBackgroundService.cs b/Core/Telemetry/SeqBackgroundService.cs new file mode 100644 index 0000000..91ddcc5 --- /dev/null +++ b/Core/Telemetry/SeqBackgroundService.cs @@ -0,0 +1,56 @@ +using Microsoft.ApplicationInsights; +using Microsoft.Extensions.Hosting; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Channels; +using System.Threading.Tasks; + +namespace Core.Telemetry +{ + public class SeqBackgroundService : BackgroundService + { + private readonly Channel _channel; + private readonly HttpClient _client; + private readonly string _url; + private readonly TelemetryClient _telemetryClient; + + public SeqBackgroundService(TelemetryClient telemetryClient, Configurations.IConfiguration configuration) + { + _telemetryClient = telemetryClient; + _url = configuration["Seq:Url"]; // eller hvor din Seq URL kommer fra + _client = new HttpClient(); + _channel = Channel.CreateUnbounded(); + } + + public void EnqueueMessage(string message) + { + _channel.Writer.TryWrite(message); + } + + protected override async Task ExecuteAsync(CancellationToken stoppingToken) + { + while (!stoppingToken.IsCancellationRequested) + { + try + { + await foreach (var message in _channel.Reader.ReadAllAsync(stoppingToken)) + { + await _client.PostAsync(_url, new StringContent(message), stoppingToken); + } + } + catch (Exception ex) + { + _telemetryClient.TrackException(ex); + } + } + } + + public override async Task StopAsync(CancellationToken cancellationToken) + { + _channel.Writer.Complete(); + await base.StopAsync(cancellationToken); + } + } +} diff --git a/Tests/PostgresTests.cs b/Tests/PostgresTests.cs index 5d8f0ba..c0e79ea 100644 --- a/Tests/PostgresTests.cs +++ b/Tests/PostgresTests.cs @@ -57,10 +57,10 @@ namespace Tests [TestMethod] public async Task TryDbSetup() { - var conn = Container.Resolve(); + //var conn = Container.Resolve(); - var identitySystem = new Database.Core.DDL.SetupIdentitySystem(conn); - // identitySystem..CreateSystem("swp"); + //var identitySystem = new Database.Core.SetupIdentitySystem(conn); + //identitySystem.CreateSystem("swp"); } [TestMethod] diff --git a/Tests/appconfiguration.dev.json b/Tests/appconfiguration.dev.json index 188c29f..79333a6 100644 --- a/Tests/appconfiguration.dev.json +++ b/Tests/appconfiguration.dev.json @@ -1,7 +1,7 @@ { "AllowedHosts": "*", "ConnectionStrings": { - "DefaultConnection": "Host=192.168.1.57;Port=5432;Database=ptdb01;User Id=sathumper;Password=3911;" + "DefaultConnection": "Host=192.168.1.57;Port=5432;Database=sandbox;User Id=postgres;Password=3911;" }, "ApplicationInsights": { "ConnectionString": "InstrumentationKey=6d2e76ee-5343-4691-a5e3-81add43cb584;IngestionEndpoint=https://northeurope-0.in.applicationinsights.azure.com/"