use serde::{Deserialize, Serialize};
use serde_json::Value;
use std::collections::HashMap;
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct PageInfo {
#[serde(default)]
pub total: i64,
#[serde(default)]
pub limit: i64,
#[serde(default)]
pub offset: i64,
#[serde(default)]
pub end_cursor: Option<String>,
#[serde(default)]
pub has_next_page: bool,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct ListResult<T> {
pub nodes: Vec<T>,
pub page_info: PageInfo,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct RetryPolicy {
#[serde(default)]
pub max_attempts: i32,
#[serde(default)]
pub initial_delay: String,
#[serde(default)]
pub max_delay: String,
#[serde(default)]
pub backoff_factor: f64,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct BodyMatchRule {
#[serde(default)]
pub path: String,
#[serde(default)]
pub value: String,
#[serde(default)]
pub operator: String,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct FilterRule {
#[serde(default)]
pub operator: String,
#[serde(default)]
pub path: Option<String>,
#[serde(default)]
pub value: Option<Value>,
#[serde(default)]
pub rules: Option<Vec<FilterRule>>,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct FilterConfig {
#[serde(default)]
pub event_types: Option<Vec<String>>,
#[serde(default)]
pub regex: Option<Vec<String>>,
#[serde(default)]
pub body_match: Option<Vec<BodyMatchRule>>,
#[serde(default)]
pub rules: Option<Vec<FilterRule>>,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct TransformConfig {
#[serde(default)]
pub envelope: bool,
#[serde(default)]
pub headers: Option<HashMap<String, Value>>,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct ResponseConfig {
#[serde(default)]
pub status_code: i32,
#[serde(default)]
pub body: String,
#[serde(default)]
pub content_type: String,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct DedupConfig {
#[serde(default)]
pub strategy: String,
#[serde(default)]
pub fields: Option<Vec<String>>,
#[serde(default)]
pub window: Option<String>,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct OAuth2Config {
#[serde(default)]
pub token_url: String,
#[serde(default)]
pub client_id: String,
#[serde(default)]
pub client_secret: String,
#[serde(default)]
pub scopes: Vec<String>,
#[serde(default)]
pub audience: String,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct HealthConfig {
#[serde(default)]
pub window_hours: i32,
#[serde(default)]
pub disable_below: f64,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct EmailAlertConfig {
#[serde(default)]
pub to: Vec<String>,
#[serde(default)]
pub subject_template: Option<String>,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct SlackAlertConfig {
#[serde(default)]
pub webhook_url: String,
#[serde(default)]
pub channel: Option<String>,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct OtlpConfig {
#[serde(default)]
pub endpoint: String,
#[serde(default)]
pub headers: Option<HashMap<String, String>>,
#[serde(default)]
pub insecure: bool,
#[serde(default)]
pub sample_rate: f64,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct Source {
#[serde(default)]
pub id: String,
#[serde(default)]
pub name: String,
#[serde(default)]
pub slug: String,
#[serde(default)]
pub provider_type: String,
#[serde(default)]
pub verify_config: Option<Value>,
#[serde(default)]
pub status: String,
#[serde(default)]
pub rate_limit_rps: i32,
#[serde(default)]
pub spike_protection: bool,
#[serde(default)]
pub max_ingest_rps: i32,
#[serde(default)]
pub broker_config: Option<Value>,
#[serde(default)]
pub response_config: Option<ResponseConfig>,
#[serde(default)]
pub dedup_config: Option<DedupConfig>,
#[serde(default)]
pub created_at: String,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct Destination {
#[serde(default)]
pub id: String,
#[serde(default)]
pub name: String,
#[serde(default)]
pub url: String,
#[serde(default)]
pub signing_secret: String,
#[serde(default)]
pub status: String,
#[serde(default, rename = "type")]
pub type_: String,
#[serde(default)]
pub type_config: Option<Value>,
#[serde(default)]
pub timeout_ms: i32,
#[serde(default)]
pub rate_limit_rps: i32,
#[serde(default)]
pub retry_policy: Option<RetryPolicy>,
#[serde(default)]
pub headers: Option<HashMap<String, Value>>,
#[serde(default)]
pub auth_type: String,
#[serde(default)]
pub oauth2_config: Option<OAuth2Config>,
#[serde(default)]
pub mtls_cert: String,
#[serde(default)]
pub mtls_key: String,
#[serde(default)]
pub delivery_mode: String,
#[serde(default)]
pub poll_api_key_prefix: String,
#[serde(default)]
pub poll_api_key: String,
#[serde(default)]
pub ordered: bool,
#[serde(default)]
pub blocked_delivery_id: Option<String>,
#[serde(default = "default_health_score")]
pub health_score: f64,
#[serde(default)]
pub disabled_reason: Option<String>,
#[serde(default)]
pub health_config: Option<HealthConfig>,
#[serde(default = "default_output_format")]
pub output_format: String,
#[serde(default)]
pub created_at: String,
}
fn default_health_score() -> f64 {
1.0
}
fn default_output_format() -> String {
"default".to_string()
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct Subscription {
#[serde(default)]
pub id: String,
#[serde(default)]
pub name: String,
#[serde(default)]
pub source_id: String,
#[serde(default)]
pub destination_id: String,
#[serde(default)]
pub filter_config: Option<FilterConfig>,
#[serde(default)]
pub transform_config: Option<TransformConfig>,
#[serde(default)]
pub enabled: bool,
#[serde(default)]
pub created_at: String,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct Event {
#[serde(default)]
pub id: String,
#[serde(default)]
pub source_id: String,
#[serde(default)]
pub idempotency_key: String,
#[serde(default)]
pub event_type: String,
#[serde(default)]
pub headers: Option<HashMap<String, Value>>,
#[serde(default)]
pub raw_body: Option<String>,
#[serde(default)]
pub status: String,
#[serde(default)]
pub received_at: String,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct DeliveryAttempt {
#[serde(default)]
pub id: String,
#[serde(default)]
pub delivery_id: String,
#[serde(default)]
pub attempt_number: i32,
#[serde(default)]
pub response_status: i32,
#[serde(default)]
pub response_body: String,
#[serde(default)]
pub error: String,
#[serde(default)]
pub duration_ms: i32,
#[serde(default)]
pub attempted_at: String,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct Delivery {
#[serde(default)]
pub id: String,
#[serde(default)]
pub event_id: String,
#[serde(default)]
pub subscription_id: String,
#[serde(default)]
pub destination_id: String,
#[serde(default)]
pub status: String,
#[serde(default)]
pub attempts: i32,
#[serde(default)]
pub max_attempts: i32,
#[serde(default)]
pub next_attempt_at: Option<String>,
#[serde(default)]
pub created_at: String,
#[serde(default)]
pub delivery_attempts: Option<Vec<DeliveryAttempt>>,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct DlqEntry {
#[serde(default)]
pub id: String,
#[serde(default)]
pub delivery_id: String,
#[serde(default)]
pub event_id: String,
#[serde(default)]
pub last_error: String,
#[serde(default)]
pub replayed_at: Option<String>,
#[serde(default)]
pub created_at: String,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct ApiKey {
#[serde(default)]
pub id: String,
#[serde(default)]
pub name: String,
#[serde(default)]
pub key_prefix: String,
#[serde(default)]
pub scopes: Vec<String>,
#[serde(default)]
pub source_ids: Vec<String>,
#[serde(default)]
pub created_at: String,
#[serde(default)]
pub expires_at: Option<String>,
#[serde(default)]
pub revoked_at: Option<String>,
#[serde(default)]
pub last_used_at: Option<String>,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct ApiKeyWithSecret {
pub api_key: ApiKey,
pub raw_key: String,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct AlertRule {
#[serde(default)]
pub id: String,
#[serde(default)]
pub name: String,
#[serde(default)]
pub condition_type: String,
#[serde(default)]
pub threshold: i32,
#[serde(default)]
pub webhook_url: String,
#[serde(default = "default_alert_channel")]
pub channel: String,
#[serde(default)]
pub email_config: Option<EmailAlertConfig>,
#[serde(default)]
pub slack_config: Option<SlackAlertConfig>,
#[serde(default)]
pub cooldown: String,
#[serde(default)]
pub enabled: bool,
#[serde(default)]
pub created_at: String,
}
fn default_alert_channel() -> String {
"WEBHOOK".to_string()
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct Bookmark {
#[serde(default)]
pub id: String,
#[serde(default)]
pub event_id: String,
#[serde(default)]
pub name: String,
#[serde(default)]
pub notes: String,
#[serde(default)]
pub created_at: String,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct EventTypeSchema {
#[serde(default)]
pub id: String,
#[serde(default)]
pub event_type: String,
#[serde(default)]
pub description: String,
#[serde(default)]
pub schema: Option<Value>,
#[serde(default)]
pub example: Option<Value>,
#[serde(default)]
pub created_at: String,
#[serde(default)]
pub updated_at: String,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct Application {
#[serde(default)]
pub id: String,
#[serde(default)]
pub name: String,
#[serde(default)]
pub uid: String,
#[serde(default)]
pub created_at: String,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct Endpoint {
#[serde(default)]
pub id: String,
#[serde(default)]
pub application_id: String,
#[serde(default)]
pub url: String,
#[serde(default)]
pub signing_secret: String,
#[serde(default)]
pub filter_config: Option<FilterConfig>,
#[serde(default)]
pub status: String,
#[serde(default, rename = "type")]
pub type_: String,
#[serde(default)]
pub type_config: Option<Value>,
#[serde(default)]
pub rate_limit_rps: i32,
#[serde(default)]
pub timeout_ms: i32,
#[serde(default)]
pub retry_policy: Option<RetryPolicy>,
#[serde(default)]
pub headers: Option<HashMap<String, Value>>,
#[serde(default)]
pub auth_type: String,
#[serde(default)]
pub oauth2_config: Option<OAuth2Config>,
#[serde(default)]
pub mtls_cert: String,
#[serde(default)]
pub mtls_key: String,
#[serde(default)]
pub delivery_mode: String,
#[serde(default)]
pub poll_api_key_prefix: String,
#[serde(default)]
pub poll_api_key: String,
#[serde(default)]
pub ordered: bool,
#[serde(default)]
pub blocked_delivery_id: Option<String>,
#[serde(default = "default_health_score")]
pub health_score: f64,
#[serde(default)]
pub disabled_reason: Option<String>,
#[serde(default)]
pub health_config: Option<HealthConfig>,
#[serde(default = "default_output_format")]
pub output_format: String,
#[serde(default)]
pub created_at: String,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct Message {
#[serde(default)]
pub id: String,
#[serde(default)]
pub application_id: String,
#[serde(default)]
pub event_type: String,
#[serde(default)]
pub payload: Option<String>,
#[serde(default)]
pub idempotency_key: String,
#[serde(default)]
pub status: String,
#[serde(default)]
pub created_at: String,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct OutboundDeliveryAttempt {
#[serde(default)]
pub id: String,
#[serde(default)]
pub delivery_id: String,
#[serde(default)]
pub attempt_number: i32,
#[serde(default)]
pub response_status: i32,
#[serde(default)]
pub response_body: String,
#[serde(default)]
pub error: String,
#[serde(default)]
pub duration_ms: i32,
#[serde(default)]
pub attempted_at: String,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct OutboundDelivery {
#[serde(default)]
pub id: String,
#[serde(default)]
pub message_id: String,
#[serde(default)]
pub endpoint_id: String,
#[serde(default)]
pub status: String,
#[serde(default)]
pub attempts: i32,
#[serde(default)]
pub max_attempts: i32,
#[serde(default)]
pub next_attempt_at: Option<String>,
#[serde(default)]
pub created_at: String,
#[serde(default)]
pub delivery_attempts: Option<Vec<OutboundDeliveryAttempt>>,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct OutboundDlqEntry {
#[serde(default)]
pub id: String,
#[serde(default)]
pub delivery_id: String,
#[serde(default)]
pub message_id: String,
#[serde(default)]
pub last_error: String,
#[serde(default)]
pub replayed_at: Option<String>,
#[serde(default)]
pub created_at: String,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct SystemStatus {
#[serde(default)]
pub status: String,
#[serde(default)]
pub dlq_size: i64,
#[serde(default)]
pub outbound_dlq_size: i64,
#[serde(default)]
pub queue_depth: i64,
#[serde(default)]
pub active_workers: i32,
#[serde(default)]
pub total_workers: i32,
#[serde(default)]
pub uptime: i64,
#[serde(default)]
pub version: String,
#[serde(default)]
pub sources_total: i64,
#[serde(default)]
pub destinations_total: i64,
#[serde(default)]
pub subscriptions_total: i64,
#[serde(default)]
pub events_total: i64,
#[serde(default)]
pub events_failed: i64,
#[serde(default)]
pub deliveries_total: i64,
#[serde(default)]
pub deliveries_pending: i64,
#[serde(default)]
pub deliveries_delivered: i64,
#[serde(default)]
pub messages_total: i64,
#[serde(default)]
pub outbound_deliveries_total: i64,
#[serde(default)]
pub outbound_deliveries_pending: i64,
#[serde(default)]
pub outbound_deliveries_failed: i64,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct ReplayResult {
#[serde(default)]
pub deliveries: i64,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct PurgeResult {
#[serde(default)]
pub purged: i64,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct Transformation {
#[serde(default)]
pub id: String,
#[serde(default)]
pub name: String,
#[serde(default)]
pub description: String,
#[serde(default)]
pub code: String,
#[serde(default)]
pub enabled: bool,
#[serde(default)]
pub fail_open: bool,
#[serde(default)]
pub timeout_ms: i32,
#[serde(default)]
pub created_at: String,
#[serde(default)]
pub updated_at: String,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct TransformTestResult {
#[serde(default)]
pub success: bool,
#[serde(default)]
pub output: Option<Value>,
#[serde(default)]
pub error: String,
#[serde(default)]
pub duration_ms: i32,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct PortalToken {
#[serde(default)]
pub token: String,
#[serde(default)]
pub expires_at: String,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct Organization {
#[serde(default)]
pub id: String,
#[serde(default)]
pub name: String,
#[serde(default)]
pub slug: String,
#[serde(default)]
pub sso_enabled: bool,
#[serde(default)]
pub sso_provider: Option<String>,
#[serde(default)]
pub retention_events: i32,
#[serde(default)]
pub retention_messages: i32,
#[serde(default)]
pub otlp_config: Option<OtlpConfig>,
#[serde(default)]
pub created_at: String,
#[serde(default)]
pub updated_at: String,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct User {
#[serde(default)]
pub id: String,
#[serde(default)]
pub organization_id: String,
#[serde(default)]
pub email: String,
#[serde(default)]
pub name: String,
#[serde(default)]
pub role: String,
#[serde(default)]
pub last_login_at: Option<String>,
#[serde(default)]
pub created_at: String,
#[serde(default)]
pub updated_at: String,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct AuditLog {
#[serde(default)]
pub id: String,
#[serde(default)]
pub actor_type: String,
#[serde(default)]
pub actor_id: String,
#[serde(default)]
pub actor_name: String,
#[serde(default)]
pub action: String,
#[serde(default)]
pub resource_type: String,
#[serde(default)]
pub resource_id: String,
#[serde(default)]
pub org_id: String,
#[serde(default)]
pub ip_address: String,
#[serde(default)]
pub user_agent: String,
#[serde(default)]
pub details: Option<Value>,
#[serde(default)]
pub created_at: String,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct Stream {
#[serde(default)]
pub id: String,
#[serde(default)]
pub application_id: String,
#[serde(default)]
pub name: String,
#[serde(default)]
pub status: String,
#[serde(default)]
pub retention_days: i32,
#[serde(default)]
pub created_at: String,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct StreamConsumer {
#[serde(default)]
pub id: String,
#[serde(default)]
pub stream_id: String,
#[serde(default)]
pub name: String,
#[serde(default)]
pub cursor_sequence: i64,
#[serde(default)]
pub created_at: String,
#[serde(default)]
pub updated_at: String,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct StreamSink {
#[serde(default)]
pub id: String,
#[serde(default)]
pub stream_id: String,
#[serde(default)]
pub name: String,
#[serde(default)]
pub sink_type: String,
#[serde(default)]
pub config: HashMap<String, Value>,
#[serde(default)]
pub batch_size: i32,
#[serde(default)]
pub flush_interval: String,
#[serde(default)]
pub cursor_sequence: i64,
#[serde(default)]
pub status: String,
#[serde(default)]
pub last_flushed_at: Option<String>,
#[serde(default)]
pub created_at: String,
}