use crate::config::types::{
AssetColumnConfig, EntityEventTrigger, McpEntityConfig, VersioningConfig,
};
use crate::config::ValidationRule;
use std::collections::{HashMap, HashSet};
#[derive(Clone, Debug)]
pub enum IncludeDirection {
ToOne,
ToMany,
}
#[derive(Clone, Debug)]
pub struct IncludeSpec {
pub name: String,
pub direction: IncludeDirection,
pub related_path_segment: String,
pub our_key_column: String,
pub their_key_column: String,
}
#[derive(Clone, Debug)]
pub enum PkType {
Uuid,
BigInt,
Int,
Text,
}
#[derive(Clone, Debug)]
pub struct ColumnInfo {
pub name: String,
pub pk_type: Option<PkType>,
pub nullable: bool,
pub has_default: bool,
pub pg_type: Option<String>,
pub is_asset: bool,
pub asset_is_array: bool,
pub asset_config: Option<AssetColumnConfig>,
}
#[derive(Clone, Debug)]
pub struct ResolvedEntity {
pub table_id: String,
pub schema_name: String,
pub table_name: String,
pub path_segment: String,
pub pk_columns: Vec<String>,
pub pk_type: PkType,
pub columns: Vec<ColumnInfo>,
pub operations: Vec<String>,
pub sensitive_columns: HashSet<String>,
pub includes: Vec<IncludeSpec>,
pub validation: HashMap<String, ValidationRule>,
pub events: Vec<EntityEventTrigger>,
pub archive_field: Option<String>,
pub package_id: String,
pub audit_log: bool,
pub parent_ref_column: Option<String>,
pub versioning: Option<VersioningConfig>,
pub mcp: Option<McpEntityConfig>,
pub extensible_columns: Vec<String>,
}
#[derive(Clone, Debug)]
pub struct ResolvedModel {
pub entities: Vec<ResolvedEntity>,
pub entity_by_path: HashMap<String, ResolvedEntity>,
}
impl ResolvedModel {
pub fn entity_by_path(&self, path: &str) -> Option<&ResolvedEntity> {
self.entity_by_path.get(path)
}
pub fn with_package_id(mut self, package_id: &str) -> Self {
for e in &mut self.entities {
e.package_id = package_id.to_string();
}
for e in self.entity_by_path.values_mut() {
e.package_id = package_id.to_string();
}
self
}
}