use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Integration {
pub id: String,
pub customer_id: String,
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
pub connector_config_id: String,
pub connector_name: String,
pub connector_display_name: String,
pub endpoint_id: String,
pub endpoint_url: String,
pub enabled: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub event_filter: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub transform_id: Option<String>,
pub retry_policy: serde_json::Value,
pub metadata: serde_json::Value,
#[serde(skip_serializing_if = "Option::is_none")]
pub last_triggered_at: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub last_success_at: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub last_failure_at: Option<String>,
pub failure_count: i32,
pub total_deliveries: i64,
pub total_failures: i64,
pub health_status: String,
pub created_at: String,
pub updated_at: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct IntegrationIn {
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
pub connector_config_id: String,
pub endpoint_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub event_filter: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub transform_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub retry_policy: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub enabled: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct IntegrationUpdate {
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub endpoint_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub event_filter: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub transform_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub retry_policy: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub enabled: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct IntegrationTestResponse {
pub success: bool,
pub event_id: String,
pub message: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct IntegrationEvent {
pub id: String,
pub integration_id: String,
pub event_type: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub source_event_id: Option<String>,
pub payload: serde_json::Value,
pub status: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub delivery_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub error_message: Option<String>,
pub attempts: i32,
#[serde(skip_serializing_if = "Option::is_none")]
pub duration_ms: Option<i32>,
pub created_at: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub processed_at: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct IntegrationStats {
pub total_events: i64,
pub delivered: i64,
pub failed: i64,
pub pending: i64,
pub filtered: i64,
#[serde(skip_serializing_if = "Option::is_none")]
pub avg_duration_ms: Option<f64>,
pub success_rate: f64,
pub last_24h_events: i64,
pub last_24h_failures: i64,
}