using FinlyticAnalyzer.Database; using FinlyticAnalyzer.Entities; using Microsoft.EntityFrameworkCore; namespace FinlyticAnalyzer.Services; public interface ISettingsDbService { /// /// Gets the analyzer settings asynchronously. /// Task GetSettingsAsync(); /// /// Saves the analyzer settings asynchronously. /// Task SaveSettingsAsync(AnalyzerSettingsEntity settings); /// /// Updates settings from a dictionary asynchronously. /// Task UpdateSettingsFromDictionaryAsync(Dictionary dictionary); } public class SettingsDbService : ISettingsDbService { private readonly AnalyzerDbContext _context; public SettingsDbService(AnalyzerDbContext context) { _context = context; } /// /// Gets the analyzer settings asynchronously. /// public async Task GetSettingsAsync() { var settings = await _context.Settings.AsNoTracking().FirstOrDefaultAsync(); if (settings == null) { settings = new AnalyzerSettingsEntity { Id = Guid.NewGuid() }; _context.Settings.Add(settings); await _context.SaveChangesAsync(); _context.ChangeTracker.Clear(); } return settings; } /// /// Saves the analyzer settings asynchronously. /// public async Task SaveSettingsAsync(AnalyzerSettingsEntity settings) { var existing = await _context.Settings.FirstOrDefaultAsync(); if (existing == null) { if (settings.Id == Guid.Empty) settings.Id = Guid.NewGuid(); _context.Settings.Add(settings); } else { existing.ScanCronSchedule = settings.ScanCronSchedule; existing.MinSignalScore = settings.MinSignalScore; existing.EnableLogMqttHealthPing = settings.EnableLogMqttHealthPing; existing.EnableLogMqttGeneral = settings.EnableLogMqttGeneral; existing.EnableLogAnalyzerAuto = settings.EnableLogAnalyzerAuto; existing.EnableLogAnalyzerManual = settings.EnableLogAnalyzerManual; existing.EnableLogDatabaseOps = settings.EnableLogDatabaseOps; existing.UpdatedAt = settings.UpdatedAt; _context.Settings.Update(existing); } await _context.SaveChangesAsync(); // Synchronize in-memory static filter values LogCategoryFilter.EnableLogMqttHealthPing = settings.EnableLogMqttHealthPing; LogCategoryFilter.EnableLogMqttGeneral = settings.EnableLogMqttGeneral; LogCategoryFilter.EnableLogAnalyzerAuto = settings.EnableLogAnalyzerAuto; LogCategoryFilter.EnableLogAnalyzerManual = settings.EnableLogAnalyzerManual; LogCategoryFilter.EnableLogDatabaseOps = settings.EnableLogDatabaseOps; return settings; } /// /// Updates settings from a dictionary asynchronously. /// public async Task UpdateSettingsFromDictionaryAsync(Dictionary dictionary) { var settings = await GetSettingsAsync(); foreach (var (key, value) in dictionary) { if (string.Equals(key, "ScanCronSchedule", StringComparison.OrdinalIgnoreCase) && !string.IsNullOrWhiteSpace(value)) settings.ScanCronSchedule = value.Trim(); else if (string.Equals(key, "MinSignalScore", StringComparison.OrdinalIgnoreCase) && double.TryParse(value, out var score)) settings.MinSignalScore = score; else if (string.Equals(key, "EnableLog_MqttHealthPing", StringComparison.OrdinalIgnoreCase) && bool.TryParse(value, out var b1)) settings.EnableLogMqttHealthPing = b1; else if (string.Equals(key, "EnableLog_MqttGeneral", StringComparison.OrdinalIgnoreCase) && bool.TryParse(value, out var b2)) settings.EnableLogMqttGeneral = b2; else if (string.Equals(key, "EnableLog_AnalyzerAuto", StringComparison.OrdinalIgnoreCase) && bool.TryParse(value, out var b3)) settings.EnableLogAnalyzerAuto = b3; else if (string.Equals(key, "EnableLog_AnalyzerManual", StringComparison.OrdinalIgnoreCase) && bool.TryParse(value, out var b4)) settings.EnableLogAnalyzerManual = b4; else if (string.Equals(key, "EnableLog_DatabaseOps", StringComparison.OrdinalIgnoreCase) && bool.TryParse(value, out var b5)) settings.EnableLogDatabaseOps = b5; } settings.UpdatedAt = DateTime.UtcNow; await SaveSettingsAsync(settings); } }