use async_trait::async_trait;
use crate::domain::entities::{ReiWebhook, WebhookDelivery, WebhookPayload};
use crate::domain::errors::DomainError;
#[async_trait]
pub trait TeiWebhook: Send + Sync {
async fn deliver(
&self,
webhook: &ReiWebhook,
payload: &WebhookPayload,
) -> Result<WebhookDelivery, DomainError>;
async fn deliver_with_retry(
&self,
webhook: &ReiWebhook,
payload: &WebhookPayload,
) -> Result<WebhookDelivery, DomainError> {
self.deliver(webhook, payload).await
}
async fn verify_endpoint(&self, url: &str) -> Result<bool, DomainError>;
fn sign_payload(&self, secret: &str, payload: &[u8]) -> String;
}
#[derive(Debug, Clone)]
pub struct WebhookDeliveryConfig {
pub retry_base_delay_ms: u64,
pub retry_max_delay_ms: u64,
pub user_agent: String,
}
impl Default for WebhookDeliveryConfig {
fn default() -> Self {
Self {
retry_base_delay_ms: 1000,
retry_max_delay_ms: 60000,
user_agent: "Kaiba-Webhook/1.0".to_string(),
}
}
}