using Elsa.Common; using Elsa.Diagnostics.StructuredLogs.Features; using Elsa.Diagnostics.StructuredLogs.Persistence.Relational.Contracts; using Elsa.Diagnostics.StructuredLogs.Persistence.Relational.Extensions; using Elsa.Diagnostics.StructuredLogs.Persistence.Relational.Options; using Elsa.Diagnostics.StructuredLogs.Persistence.Sqlite.Features; using Elsa.Diagnostics.StructuredLogs.Persistence.Sqlite.Options; using Elsa.Diagnostics.StructuredLogs.Persistence.Sqlite.Services; using Elsa.Extensions; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Options; namespace Elsa.Diagnostics.StructuredLogs.Persistence.Sqlite.Extensions; public static class SqliteStructuredLogsModuleExtensions { public static StructuredLogsFeature UseSqliteStorage(this StructuredLogsFeature feature, string connectionString, Action? configure = null) { feature.Module.Use(sqlite => { sqlite.ConfigureOptions = options => { options.ConnectionString = connectionString; configure?.Invoke(options); }; }); return feature; } public static StructuredLogsFeature UseSqliteStorage(this StructuredLogsFeature feature, Action? configure = null) { feature.Module.Use(sqlite => sqlite.ConfigureOptions = configure); return feature; } public static IServiceCollection AddSqliteStructuredLogPersistence(this IServiceCollection services, Action? configure = null) { if (configure != null) services.Configure(configure); services.AddOptions(); services.AddOptions().Configure>((relational, sqlite) => Copy(sqlite.Value.Relational, relational)); services.TryAddSingleton(); services.TryAddSingleton(); services.TryAddSingleton(); services.TryAddSingleton(); services.AddHostedService(sp => sp.GetRequiredService()); services.AddScoped(sp => sp.GetRequiredService()); services.AddRelationalStructuredLogPersistence(); return services; } private static void Copy(RelationalStructuredLogOptions source, RelationalStructuredLogOptions target) { target.WriteQueue.Capacity = source.WriteQueue.Capacity; target.WriteQueue.BatchSize = source.WriteQueue.BatchSize; target.WriteQueue.FlushInterval = source.WriteQueue.FlushInterval; target.WriteQueue.ShutdownFlushTimeout = source.WriteQueue.ShutdownFlushTimeout; target.Retention.MaxAge = source.Retention.MaxAge; target.Retention.MaxRows = source.Retention.MaxRows; target.Retention.CleanupOnStartup = source.Retention.CleanupOnStartup; } }