- Delete dead Notify Worker (NoOp handler) - Move 51 source files (endpoints, contracts, services, compat stores) - Transform namespaces from Notifier.WebService to Notify.WebService - Update DI registrations, WebSocket support, v2 endpoint mapping - Comment out notifier-web in compose, update gateway routes - Update architecture docs, port registry, rollout matrix - Notifier Worker stays as separate delivery engine container Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
129 lines
4.4 KiB
C#
129 lines
4.4 KiB
C#
using System.Text.Json.Serialization;
|
|
|
|
namespace StellaOps.Notify.WebService.Contracts;
|
|
|
|
/// <summary>
|
|
/// Request to create or update a notification rule.
|
|
/// </summary>
|
|
public sealed record RuleCreateRequest
|
|
{
|
|
public required string RuleId { get; init; }
|
|
public required string Name { get; init; }
|
|
public string? Description { get; init; }
|
|
public bool Enabled { get; init; } = true;
|
|
public required RuleMatchRequest Match { get; init; }
|
|
public required List<RuleActionRequest> Actions { get; init; }
|
|
public Dictionary<string, string>? Labels { get; init; }
|
|
public Dictionary<string, string>? Metadata { get; init; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// Request to update an existing rule.
|
|
/// </summary>
|
|
public sealed record RuleUpdateRequest
|
|
{
|
|
public string? Name { get; init; }
|
|
public string? Description { get; init; }
|
|
public bool? Enabled { get; init; }
|
|
public RuleMatchRequest? Match { get; init; }
|
|
public List<RuleActionRequest>? Actions { get; init; }
|
|
public Dictionary<string, string>? Labels { get; init; }
|
|
public Dictionary<string, string>? Metadata { get; init; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// Request to upsert a rule (v2 API).
|
|
/// </summary>
|
|
public sealed record RuleUpsertRequest
|
|
{
|
|
public string? Name { get; init; }
|
|
public string? Description { get; init; }
|
|
public bool? Enabled { get; init; }
|
|
public RuleMatchRequest? Match { get; init; }
|
|
public List<RuleActionRequest>? Actions { get; init; }
|
|
public Dictionary<string, string>? Labels { get; init; }
|
|
public Dictionary<string, string>? Metadata { get; init; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// Rule match criteria.
|
|
/// </summary>
|
|
public sealed record RuleMatchRequest
|
|
{
|
|
public List<string>? EventKinds { get; init; }
|
|
public List<string>? Namespaces { get; init; }
|
|
public List<string>? Repositories { get; init; }
|
|
public List<string>? Digests { get; init; }
|
|
public List<string>? Labels { get; init; }
|
|
public List<string>? ComponentPurls { get; init; }
|
|
public string? MinSeverity { get; init; }
|
|
public List<string>? Verdicts { get; init; }
|
|
public bool? KevOnly { get; init; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// Rule action configuration.
|
|
/// </summary>
|
|
public sealed record RuleActionRequest
|
|
{
|
|
public required string ActionId { get; init; }
|
|
public required string Channel { get; init; }
|
|
public string? Template { get; init; }
|
|
public string? Digest { get; init; }
|
|
public string? Throttle { get; init; } // ISO 8601 duration
|
|
public string? Locale { get; init; }
|
|
public bool Enabled { get; init; } = true;
|
|
public Dictionary<string, string>? Metadata { get; init; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// Rule response DTO.
|
|
/// </summary>
|
|
public sealed record RuleResponse
|
|
{
|
|
public required string RuleId { get; init; }
|
|
public required string TenantId { get; init; }
|
|
public required string Name { get; init; }
|
|
public string? Description { get; init; }
|
|
public required bool Enabled { get; init; }
|
|
public required RuleMatchResponse Match { get; init; }
|
|
public required List<RuleActionResponse> Actions { get; init; }
|
|
public Dictionary<string, string>? Labels { get; init; }
|
|
public Dictionary<string, string>? Metadata { get; init; }
|
|
public string? CreatedBy { get; init; }
|
|
public DateTimeOffset CreatedAt { get; init; }
|
|
public string? UpdatedBy { get; init; }
|
|
public DateTimeOffset UpdatedAt { get; init; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// Rule match response.
|
|
/// </summary>
|
|
public sealed record RuleMatchResponse
|
|
{
|
|
public List<string> EventKinds { get; init; } = [];
|
|
public List<string> Namespaces { get; init; } = [];
|
|
public List<string> Repositories { get; init; } = [];
|
|
public List<string> Digests { get; init; } = [];
|
|
public List<string> Labels { get; init; } = [];
|
|
public List<string> ComponentPurls { get; init; } = [];
|
|
public string? MinSeverity { get; init; }
|
|
public List<string> Verdicts { get; init; } = [];
|
|
public bool KevOnly { get; init; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// Rule action response.
|
|
/// </summary>
|
|
public sealed record RuleActionResponse
|
|
{
|
|
public required string ActionId { get; init; }
|
|
public required string Channel { get; init; }
|
|
public string? Template { get; init; }
|
|
public string? Digest { get; init; }
|
|
public string? Throttle { get; init; }
|
|
public string? Locale { get; init; }
|
|
public required bool Enabled { get; init; }
|
|
public Dictionary<string, string>? Metadata { get; init; }
|
|
}
|