Add channel test providers for Email, Slack, Teams, and Webhook
- Implemented EmailChannelTestProvider to generate email preview payloads. - Implemented SlackChannelTestProvider to create Slack message previews. - Implemented TeamsChannelTestProvider for generating Teams Adaptive Card previews. - Implemented WebhookChannelTestProvider to create webhook payloads. - Added INotifyChannelTestProvider interface for channel-specific preview generation. - Created ChannelTestPreviewContracts for request and response models. - Developed NotifyChannelTestService to handle test send requests and generate previews. - Added rate limit policies for test sends and delivery history. - Implemented unit tests for service registration and binding. - Updated project files to include necessary dependencies and configurations.
This commit is contained in:
		@@ -76,6 +76,9 @@ internal sealed class MongoAttestorEntryRepository : IAttestorEntryRepository
 | 
			
		||||
        [BsonElement("signerIdentity")]
 | 
			
		||||
        public SignerIdentityDocument SignerIdentity { get; set; } = new();
 | 
			
		||||
 | 
			
		||||
        [BsonElement("mirror")]
 | 
			
		||||
        public MirrorDocument? Mirror { get; set; }
 | 
			
		||||
 | 
			
		||||
        public static AttestorEntryDocument FromDomain(AttestorEntry entry)
 | 
			
		||||
        {
 | 
			
		||||
            return new AttestorEntryDocument
 | 
			
		||||
@@ -109,6 +112,7 @@ internal sealed class MongoAttestorEntryRepository : IAttestorEntryRepository
 | 
			
		||||
                },
 | 
			
		||||
                Log = new LogDocument
 | 
			
		||||
                {
 | 
			
		||||
                    Backend = entry.Log.Backend,
 | 
			
		||||
                    Url = entry.Log.Url,
 | 
			
		||||
                    LogId = entry.Log.LogId
 | 
			
		||||
                },
 | 
			
		||||
@@ -120,7 +124,8 @@ internal sealed class MongoAttestorEntryRepository : IAttestorEntryRepository
 | 
			
		||||
                    Issuer = entry.SignerIdentity.Issuer,
 | 
			
		||||
                    SubjectAlternativeName = entry.SignerIdentity.SubjectAlternativeName,
 | 
			
		||||
                    KeyId = entry.SignerIdentity.KeyId
 | 
			
		||||
                }
 | 
			
		||||
                },
 | 
			
		||||
                Mirror = entry.Mirror is null ? null : MirrorDocument.FromDomain(entry.Mirror)
 | 
			
		||||
            };
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -155,6 +160,7 @@ internal sealed class MongoAttestorEntryRepository : IAttestorEntryRepository
 | 
			
		||||
                },
 | 
			
		||||
                Log = new AttestorEntry.LogDescriptor
 | 
			
		||||
                {
 | 
			
		||||
                    Backend = Log.Backend,
 | 
			
		||||
                    Url = Log.Url,
 | 
			
		||||
                    LogId = Log.LogId
 | 
			
		||||
                },
 | 
			
		||||
@@ -166,7 +172,8 @@ internal sealed class MongoAttestorEntryRepository : IAttestorEntryRepository
 | 
			
		||||
                    Issuer = SignerIdentity.Issuer,
 | 
			
		||||
                    SubjectAlternativeName = SignerIdentity.SubjectAlternativeName,
 | 
			
		||||
                    KeyId = SignerIdentity.KeyId
 | 
			
		||||
                }
 | 
			
		||||
                },
 | 
			
		||||
                Mirror = Mirror?.ToDomain()
 | 
			
		||||
            };
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -220,6 +227,9 @@ internal sealed class MongoAttestorEntryRepository : IAttestorEntryRepository
 | 
			
		||||
 | 
			
		||||
        internal sealed class LogDocument
 | 
			
		||||
        {
 | 
			
		||||
            [BsonElement("backend")]
 | 
			
		||||
            public string Backend { get; set; } = "primary";
 | 
			
		||||
 | 
			
		||||
            [BsonElement("url")]
 | 
			
		||||
            public string Url { get; set; } = string.Empty;
 | 
			
		||||
 | 
			
		||||
@@ -241,5 +251,92 @@ internal sealed class MongoAttestorEntryRepository : IAttestorEntryRepository
 | 
			
		||||
            [BsonElement("kid")]
 | 
			
		||||
            public string? KeyId { get; set; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        internal sealed class MirrorDocument
 | 
			
		||||
        {
 | 
			
		||||
            [BsonElement("backend")]
 | 
			
		||||
            public string Backend { get; set; } = string.Empty;
 | 
			
		||||
 | 
			
		||||
            [BsonElement("url")]
 | 
			
		||||
            public string Url { get; set; } = string.Empty;
 | 
			
		||||
 | 
			
		||||
            [BsonElement("uuid")]
 | 
			
		||||
            public string? Uuid { get; set; }
 | 
			
		||||
 | 
			
		||||
            [BsonElement("index")]
 | 
			
		||||
            public long? Index { get; set; }
 | 
			
		||||
 | 
			
		||||
            [BsonElement("status")]
 | 
			
		||||
            public string Status { get; set; } = "pending";
 | 
			
		||||
 | 
			
		||||
            [BsonElement("proof")]
 | 
			
		||||
            public ProofDocument? Proof { get; set; }
 | 
			
		||||
 | 
			
		||||
            [BsonElement("logId")]
 | 
			
		||||
            public string? LogId { get; set; }
 | 
			
		||||
 | 
			
		||||
            [BsonElement("error")]
 | 
			
		||||
            public string? Error { get; set; }
 | 
			
		||||
 | 
			
		||||
            public static MirrorDocument FromDomain(AttestorEntry.LogReplicaDescriptor mirror)
 | 
			
		||||
            {
 | 
			
		||||
                return new MirrorDocument
 | 
			
		||||
                {
 | 
			
		||||
                    Backend = mirror.Backend,
 | 
			
		||||
                    Url = mirror.Url,
 | 
			
		||||
                    Uuid = mirror.Uuid,
 | 
			
		||||
                    Index = mirror.Index,
 | 
			
		||||
                    Status = mirror.Status,
 | 
			
		||||
                    Proof = mirror.Proof is null ? null : new ProofDocument
 | 
			
		||||
                    {
 | 
			
		||||
                        Checkpoint = mirror.Proof.Checkpoint is null ? null : new CheckpointDocument
 | 
			
		||||
                        {
 | 
			
		||||
                            Origin = mirror.Proof.Checkpoint.Origin,
 | 
			
		||||
                            Size = mirror.Proof.Checkpoint.Size,
 | 
			
		||||
                            RootHash = mirror.Proof.Checkpoint.RootHash,
 | 
			
		||||
                            Timestamp = mirror.Proof.Checkpoint.Timestamp is null
 | 
			
		||||
                                ? null
 | 
			
		||||
                                : BsonDateTime.Create(mirror.Proof.Checkpoint.Timestamp.Value)
 | 
			
		||||
                        },
 | 
			
		||||
                        Inclusion = mirror.Proof.Inclusion is null ? null : new InclusionDocument
 | 
			
		||||
                        {
 | 
			
		||||
                            LeafHash = mirror.Proof.Inclusion.LeafHash,
 | 
			
		||||
                            Path = mirror.Proof.Inclusion.Path
 | 
			
		||||
                        }
 | 
			
		||||
                    },
 | 
			
		||||
                    LogId = mirror.LogId,
 | 
			
		||||
                    Error = mirror.Error
 | 
			
		||||
                };
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            public AttestorEntry.LogReplicaDescriptor ToDomain()
 | 
			
		||||
            {
 | 
			
		||||
                return new AttestorEntry.LogReplicaDescriptor
 | 
			
		||||
                {
 | 
			
		||||
                    Backend = Backend,
 | 
			
		||||
                    Url = Url,
 | 
			
		||||
                    Uuid = Uuid,
 | 
			
		||||
                    Index = Index,
 | 
			
		||||
                    Status = Status,
 | 
			
		||||
                    Proof = Proof is null ? null : new AttestorEntry.ProofDescriptor
 | 
			
		||||
                    {
 | 
			
		||||
                        Checkpoint = Proof.Checkpoint is null ? null : new AttestorEntry.CheckpointDescriptor
 | 
			
		||||
                        {
 | 
			
		||||
                            Origin = Proof.Checkpoint.Origin,
 | 
			
		||||
                            Size = Proof.Checkpoint.Size,
 | 
			
		||||
                            RootHash = Proof.Checkpoint.RootHash,
 | 
			
		||||
                            Timestamp = Proof.Checkpoint.Timestamp?.ToUniversalTime()
 | 
			
		||||
                        },
 | 
			
		||||
                        Inclusion = Proof.Inclusion is null ? null : new AttestorEntry.InclusionDescriptor
 | 
			
		||||
                        {
 | 
			
		||||
                            LeafHash = Proof.Inclusion.LeafHash,
 | 
			
		||||
                            Path = Proof.Inclusion.Path
 | 
			
		||||
                        }
 | 
			
		||||
                    },
 | 
			
		||||
                    LogId = LogId,
 | 
			
		||||
                    Error = Error
 | 
			
		||||
                };
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user