use std::collections::BTreeMap;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SourceSummaryDto {
pub available: bool,
pub source_id: String,
pub source_type: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DiscoveredFeatureDto {
#[serde(default)]
pub constraints: Vec<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
pub is_identifier: bool,
pub is_relation: bool,
pub name: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub relation_target: Option<String>,
pub required: bool,
pub source_name: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub type_hint: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DiscoveredSortDto {
pub confidence: f64,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(default)]
pub features: Vec<DiscoveredFeatureDto>,
pub name: String,
pub source_name: String,
#[serde(default)]
pub suggested_parents: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DiscoveredSourceRelationDto {
pub cardinality: String,
pub confidence: f64,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub inverse_name: Option<String>,
pub relation_name: String,
pub source_sort: String,
pub target_sort: String,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct StructuredIngestionStatsDto {
pub columns_discovered: u64,
pub documents_rendered: u64,
pub elapsed_ms: u64,
pub entities_created: u64,
pub entities_extracted: u64,
pub records_processed: u64,
pub relations_created: u64,
pub relations_discovered: u64,
pub sorts_created: u64,
pub tables_discovered: u64,
pub terms_created: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RegisterSourceRequest {
pub source_id: String,
pub source_name: String,
pub source_type: String,
#[serde(default)]
pub config: BTreeMap<String, serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RegisterSourceResponse {
pub success: bool,
pub source_id: String,
pub source_type: String,
pub message: String,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct ListSourcesResponse {
#[serde(default)]
pub sources: Vec<SourceSummaryDto>,
pub total: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SourceDetailResponse {
pub source_id: String,
pub source_type: String,
pub available: bool,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct DiscoverSchemaRequest {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub sample_size: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub include_sample_data: Option<bool>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct DiscoverSchemaResponse {
pub source_id: String,
#[serde(default)]
pub sorts: Vec<DiscoveredSortDto>,
#[serde(default)]
pub relations: Vec<DiscoveredSourceRelationDto>,
pub total_columns: u64,
#[serde(default)]
pub warnings: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct IngestFromSourceRequest {
pub owner_id: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub type_filter: Option<Vec<String>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub max_records_per_type: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub batch_size: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub records_per_document: Option<u32>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct IngestFromSourceResponse {
pub success: bool,
pub source_id: String,
pub source_type: String,
#[serde(default)]
pub stats: StructuredIngestionStatsDto,
#[serde(default)]
pub errors: Vec<String>,
}