fix: Improve status messages in StatusMonitorCollection

Enhanced error and warning message generation to use monitor names when available, include counts, proper pluralization, and append "Offline" when issues are present. Avoided multiple enumerations by converting to lists. "Room Ok." is shown when no issues are detected.
This commit is contained in:
Nick Genovese
2026-01-01 18:01:37 -06:00
parent 7910b7931e
commit f49901d3fa

View File

@@ -14,7 +14,7 @@ using PepperDash.Core;
namespace PepperDash.Essentials.Core namespace PepperDash.Essentials.Core
{ {
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>
public class StatusMonitorCollection : IStatusMonitor public class StatusMonitorCollection : IStatusMonitor
{ {
@@ -59,51 +59,61 @@ namespace PepperDash.Essentials.Core
void ProcessStatuses() void ProcessStatuses()
{ {
var InError = Monitors.Where(m => m.Status == MonitorStatus.InError); var InError = Monitors.Where(m => m.Status == MonitorStatus.InError).ToList();
var InWarning = Monitors.Where(m => m.Status == MonitorStatus.InWarning); var InWarning = Monitors.Where(m => m.Status == MonitorStatus.InWarning).ToList();
var IsOk = Monitors.Where(m => m.Status == MonitorStatus.IsOk); var IsOk = Monitors.Where(m => m.Status == MonitorStatus.IsOk).ToList();
MonitorStatus initialStatus; MonitorStatus initialStatus;
string prefix = "0:"; string prefix = "0:";
if (InError.Count() > 0) if (InError.Any())
{ {
initialStatus = MonitorStatus.InError; initialStatus = MonitorStatus.InError;
prefix = "3:"; prefix = "3:";
} }
else if (InWarning.Count() > 0) else if (InWarning.Any())
{ {
initialStatus = MonitorStatus.InWarning; initialStatus = MonitorStatus.InWarning;
prefix = "2:"; prefix = "2:";
} }
else if (IsOk.Count() > 0) else if (IsOk.Any())
initialStatus = MonitorStatus.IsOk; initialStatus = MonitorStatus.IsOk;
else else
initialStatus = MonitorStatus.StatusUnknown; initialStatus = MonitorStatus.StatusUnknown;
// Build the error message string // Build the error message string
if (InError.Count() > 0 || InWarning.Count() > 0) if (InError.Any() || InWarning.Any())
{ {
StringBuilder sb = new StringBuilder(prefix); var errorNames = InError
if (InError.Count() > 0) .Select(mon => mon.Parent is IKeyName keyName ? keyName.Name : mon.Parent.Key)
{ .ToList();
// Do string splits and joins var warningNames = InWarning
sb.Append(string.Format("{0} Errors:", InError.Count())); .Select(mon => mon.Parent is IKeyName keyName ? keyName.Name : mon.Parent.Key)
foreach (var mon in InError) .ToList();
sb.Append(string.Format("{0}, ", mon.Parent.Key));
} var sb = new StringBuilder(prefix);
if (InWarning.Count() > 0)
{ if (errorNames.Count > 0)
sb.Append(string.Format("{0} Warnings:", InWarning.Count())); {
foreach (var mon in InWarning) sb.Append($"{errorNames.Count} Error{(errorNames.Count > 1 ? "s" : "")}: ");
sb.Append(string.Format("{0}, ", mon.Parent.Key)); sb.Append(string.Join(", ", errorNames));
} }
Message = sb.ToString(); if (warningNames.Count > 0)
} {
else if (errorNames.Count > 0)
{ sb.Append("; ");
Message = "Room Ok.";
} sb.Append($"{warningNames.Count} Warning{(warningNames.Count > 1 ? "s" : "")}: ");
sb.Append(string.Join(", ", warningNames));
}
sb.Append(" Offline");
Message = sb.ToString();
}
else
{
Message = "Room Ok.";
}
// Want to fire even if status doesn't change because the message may. // Want to fire even if status doesn't change because the message may.
Status = initialStatus; Status = initialStatus;