using BeWo.Data.Access; using BeWo.Data.Entities; using BeWo.Service.Attributes; using BeWo.Service.Core; using BeWo.Service.ServiceContracts.Enhanced; using BS.Shared.DataContracts; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Reflection; using System.ServiceModel; using System.ServiceModel.Web; using System.Text; using System.Threading.Tasks; namespace BeWo.Service.ServiceImplementations.Enhanced { [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Single)] public class StatusServiceImp : IStatusService { public ServerStatusDC GetStatus() { var result = new ServerStatusDC { ServerTime = DateTime.Now.ToString("o"), Version = Assembly.GetExecutingAssembly() .GetName().Version?.ToString() ?? "unbekannt", Services = new List() }; // Datenbankverbindung prüfen result.DatabaseOk = CheckDatabase(); // Einzelne Subsysteme prüfen //result.Services.Add(CheckService("Mail", CheckMail())); result.Services.Add(CheckService("AIModule", CheckAiModule())); result.Services.Add(CheckService("Web.config", CheckWebConfig())); var allHealthy = result.DatabaseOk && result.Services.All(x => x.IsOk); if (!allHealthy) { WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.InternalServerError; } return result; } private bool CheckDatabase() { try { // Leichter DB-Ping – z.B. eine einfache Abfrage über DAOFactory DAOFactory.GenericDAO.GetAll(); return true; } catch { return false; } } private bool CheckMail() { try { // z.B. SMTP-Verbindung kurz aufbauen und sofort schließen // Kann auch weggelassen / später ergänzt werden return true; } catch { return false; } } private string CheckAiModule() { try { // #1 var configPath = ConfigReader.GetConfigPath(SpecialConfig.CustomPreSystemPrompt); if (!File.Exists(configPath)) return "SpecialConfig.CustomPreSystemPrompt wurde nicht korrekt konfiguriert"; // #2 if (string.IsNullOrEmpty(MergedConfig.GetSecretSetting(WebSecretConfigSetting.Ollama2Key))) return "Ollama2Key wurde nicht korrekt konfiguriert"; return null; } catch { return "Fehler"; } } private string CheckWebConfig() { try { // #1 var url = MergedConfig.GetSetting(WebConfigSetting.AiPromptsUrl); if (string.IsNullOrWhiteSpace(url)) return "AiPromptsUrl wurde nicht korrekt konfiguriert"; return null; } catch { return "Fehler"; } } private ServiceStatusDC CheckService(string name, string error) { var ok = error is null; return CheckService(name, ok, error); } private ServiceStatusDC CheckService(string name, bool ok, string error) { return new ServiceStatusDC { Name = name, IsOk = ok, Message = ok ? "OK" : error }; } } }