58 lines
2.0 KiB
C#
58 lines
2.0 KiB
C#
|
|
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<ChannelHealthResult> 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);
|
|
}
|