using Microsoft.Extensions.DependencyInjection; using StellaOps.DependencyInjection; using StellaOps.Notify.Engine; using StellaOps.Notify.Models; using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; namespace StellaOps.Notify.Connectors.Slack; [ServiceBinding(typeof(INotifyChannelHealthProvider), ServiceLifetime.Singleton)] public sealed class SlackChannelHealthProvider : INotifyChannelHealthProvider { public NotifyChannelType ChannelType => NotifyChannelType.Slack; public Task CheckAsync(ChannelHealthContext context, CancellationToken cancellationToken) { ArgumentNullException.ThrowIfNull(context); cancellationToken.ThrowIfCancellationRequested(); var builder = SlackMetadataBuilder.CreateBuilder(context) .Add("slack.channel.enabled", context.Channel.Enabled ? "true" : "false") .Add("slack.validation.targetPresent", HasConfiguredTarget(context.Channel) ? "true" : "false"); var metadata = builder.Build(); var status = ResolveStatus(context.Channel); var message = status switch { ChannelHealthStatus.Healthy => "Slack channel configuration validated.", ChannelHealthStatus.Degraded => "Slack channel is disabled; enable it to resume deliveries.", ChannelHealthStatus.Unhealthy => "Slack channel is missing a configured destination (target).", _ => "Slack channel diagnostics completed." }; return Task.FromResult(new ChannelHealthResult(status, message, metadata)); } private static ChannelHealthStatus ResolveStatus(NotifyChannel channel) { if (!HasConfiguredTarget(channel)) { return ChannelHealthStatus.Unhealthy; } if (!channel.Enabled) { return ChannelHealthStatus.Degraded; } return ChannelHealthStatus.Healthy; } private static bool HasConfiguredTarget(NotifyChannel channel) => !string.IsNullOrWhiteSpace(channel.Config.Target); }