namespace Kbx.Shared.Integrations; public enum KbxIntegrationDeliveryState { Queued, Delivering, Retrying, Delivered, Failed, Suspended } public enum KbxIntegrationFailureKind { Transient, Permanent } public sealed record KbxIntegrationMessage( Guid MessageId, Guid TenantId, string IntegrationId, string AggregateType, string AggregateId, long? AggregateVersion, string Payload, string CorrelationId, DateTimeOffset CreatedAt); public sealed record KbxIntegrationAttemptResult( bool Succeeded, KbxIntegrationFailureKind? FailureKind = null, string? Code = null, string? Detail = null, int? HttpStatus = null, string? ExternalReference = null); public interface IKbxIntegrationAdapter { string IntegrationId { get; } ValueTask SendAsync(KbxIntegrationMessage message, CancellationToken cancellationToken); } public interface IKbxIntegrationAdapterRegistry { IKbxIntegrationAdapter GetRequired(string integrationId); }