Some checks failed
Docs CI / lint-and-preview (push) Has been cancelled
AOC Guard CI / aoc-guard (push) Has been cancelled
AOC Guard CI / aoc-verify (push) Has been cancelled
Concelier Attestation Tests / attestation-tests (push) Has been cancelled
Export Center CI / export-ci (push) Has been cancelled
Notify Smoke Test / Notify Unit Tests (push) Has been cancelled
Notify Smoke Test / Notifier Service Tests (push) Has been cancelled
Notify Smoke Test / Notification Smoke Test (push) Has been cancelled
Policy Lint & Smoke / policy-lint (push) Has been cancelled
Scanner Analyzers / Discover Analyzers (push) Has been cancelled
Scanner Analyzers / Build Analyzers (push) Has been cancelled
Scanner Analyzers / Test Language Analyzers (push) Has been cancelled
Scanner Analyzers / Validate Test Fixtures (push) Has been cancelled
Scanner Analyzers / Verify Deterministic Output (push) Has been cancelled
Signals CI & Image / signals-ci (push) Has been cancelled
Signals Reachability Scoring & Events / reachability-smoke (push) Has been cancelled
Signals Reachability Scoring & Events / sign-and-upload (push) Has been cancelled
87 lines
3.0 KiB
C#
87 lines
3.0 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Text.Json;
|
|
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
using Microsoft.Extensions.DependencyInjection;
|
|
using StellaOps.DependencyInjection;
|
|
using StellaOps.Notify.Engine;
|
|
using StellaOps.Notify.Models;
|
|
|
|
namespace StellaOps.Notify.Connectors.Slack;
|
|
|
|
[ServiceBinding(typeof(INotifyChannelTestProvider), ServiceLifetime.Singleton)]
|
|
public sealed class SlackChannelTestProvider : INotifyChannelTestProvider
|
|
{
|
|
private static readonly JsonSerializerOptions JsonOptions = new(JsonSerializerDefaults.Web);
|
|
|
|
private static readonly string DefaultTitle = "Stella Ops Notify Preview";
|
|
|
|
public NotifyChannelType ChannelType => NotifyChannelType.Slack;
|
|
|
|
public Task<ChannelTestPreviewResult> BuildPreviewAsync(ChannelTestPreviewContext context, CancellationToken cancellationToken)
|
|
{
|
|
cancellationToken.ThrowIfCancellationRequested();
|
|
|
|
var title = !string.IsNullOrWhiteSpace(context.Request.Title)
|
|
? context.Request.Title!
|
|
: DefaultTitle;
|
|
var summary = !string.IsNullOrWhiteSpace(context.Request.Summary)
|
|
? context.Request.Summary!
|
|
: $"Preview generated for Slack destination at {context.Timestamp:O}.";
|
|
var bodyText = !string.IsNullOrWhiteSpace(context.Request.Body)
|
|
? context.Request.Body!
|
|
: summary;
|
|
var workspace = context.Channel.Config.Properties.TryGetValue("workspace", out var workspaceName)
|
|
? workspaceName
|
|
: null;
|
|
|
|
var contextElements = new List<object>
|
|
{
|
|
new { type = "mrkdwn", text = $"Preview generated {context.Timestamp:O} · Trace `{context.TraceId}`" }
|
|
};
|
|
|
|
if (!string.IsNullOrWhiteSpace(workspace))
|
|
{
|
|
contextElements.Add(new { type = "mrkdwn", text = $"Workspace: `{workspace}`" });
|
|
}
|
|
|
|
var payload = new
|
|
{
|
|
channel = context.Target,
|
|
text = $"{title}\n{bodyText}",
|
|
blocks = new object[]
|
|
{
|
|
new
|
|
{
|
|
type = "section",
|
|
text = new { type = "mrkdwn", text = $"*{title}*\n{bodyText}" }
|
|
},
|
|
new
|
|
{
|
|
type = "context",
|
|
elements = contextElements.ToArray()
|
|
}
|
|
}
|
|
};
|
|
|
|
var body = JsonSerializer.Serialize(payload, JsonOptions);
|
|
|
|
var preview = NotifyDeliveryRendered.Create(
|
|
NotifyChannelType.Slack,
|
|
NotifyDeliveryFormat.Slack,
|
|
context.Target,
|
|
title,
|
|
body,
|
|
summary,
|
|
context.Request.TextBody ?? bodyText,
|
|
context.Request.Locale,
|
|
ChannelTestPreviewUtilities.ComputeBodyHash(body),
|
|
context.Request.Attachments);
|
|
|
|
var metadata = SlackMetadataBuilder.Build(context);
|
|
|
|
return Task.FromResult(new ChannelTestPreviewResult(preview, metadata));
|
|
}
|
|
}
|