use crate::config::{FilterConfig, MappingConfig, TransformConfig};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct SyncTaskConfig {
#[serde(default = "generate_id")]
pub id: String,
#[serde(default = "default_source_name")]
pub source_name: String,
pub table: String,
pub index: String,
#[serde(default = "default_pk")]
pub primary_key: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub filter: Option<FilterConfig>,
#[serde(skip_serializing_if = "Option::is_none")]
pub transform: Option<TransformConfig>,
#[serde(skip_serializing_if = "Option::is_none")]
pub mapping: Option<MappingConfig>,
#[serde(default)]
pub full_sync_on_start: Option<bool>,
#[serde(default)]
pub options: SyncOptions,
#[serde(default = "default_true")]
pub auto_start: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub soft_delete: Option<SoftDeleteConfig>,
}
fn default_true() -> Option<bool> {
Some(true)
}
#[derive(Debug, Clone, Deserialize, Serialize, Default)]
pub struct FieldFilters {
pub include: Option<Vec<String>>,
pub exclude: Option<Vec<String>>,
pub expressions: Option<Vec<FilterExpression>>,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct FilterExpression {
pub field: String,
pub operator: FilterOperator,
pub value: serde_json::Value,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum FilterOperator {
Eq,
Ne,
Gt,
Gte,
Lt,
Lte,
In,
NotIn,
Like,
Regex,
}
#[derive(Debug, Clone, Deserialize, Serialize, Default)]
pub struct SyncOptions {
#[serde(default = "default_batch_size")]
pub batch_size: usize,
#[serde(default = "default_batch_timeout")]
pub batch_timeout_ms: u64,
#[serde(default)]
pub deduplicate: bool,
#[serde(default)]
pub retry: SyncRetryConfig,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct SyncRetryConfig {
#[serde(default = "default_max_retries")]
pub max_retries: u32,
#[serde(default = "default_initial_delay")]
pub initial_delay: u64,
#[serde(default = "default_max_delay")]
pub max_delay: u64,
#[serde(default = "default_multiplier")]
pub multiplier: f64,
}
impl Default for SyncRetryConfig {
fn default() -> Self {
Self {
max_retries: default_max_retries(),
initial_delay: default_initial_delay(),
max_delay: default_max_delay(),
multiplier: default_multiplier(),
}
}
}
fn default_pk() -> String {
"id".to_string()
}
fn default_batch_size() -> usize {
1000
}
fn default_batch_timeout() -> u64 {
1000 }
fn generate_id() -> String {
uuid::Uuid::new_v4().to_string()
}
fn default_source_name() -> String {
"primary".to_string()
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct SoftDeleteConfig {
pub field: String,
pub delete_values: Vec<serde_json::Value>,
#[serde(default = "default_true_bool")]
pub handle_on_full_sync: bool,
#[serde(default = "default_true_bool")]
pub handle_on_cdc: bool,
}
fn default_true_bool() -> bool {
true
}
fn default_max_retries() -> u32 {
3
}
fn default_initial_delay() -> u64 {
1
}
fn default_max_delay() -> u64 {
60
}
fn default_multiplier() -> f64 {
2.0
}