From aec690aa53ad35be189dc4060ebc7a74e4008816 Mon Sep 17 00:00:00 2001 From: circle33 Date: Sat, 4 Apr 2026 22:52:09 +0800 Subject: [PATCH] feat(tauri): add support for more database object types in DiffRequest Extended DiffRequestDto and related DTOs to support foreign keys, check constraints, views, triggers, and routines. Added corresponding conversion logic from DTOs to internal definitions. --- frontend/tauri/src/utils.rs | 220 +++++++++++++++++++++++++++++++++--- 1 file changed, 205 insertions(+), 15 deletions(-) diff --git a/frontend/tauri/src/utils.rs b/frontend/tauri/src/utils.rs index 3edc5cb..160ae08 100644 --- a/frontend/tauri/src/utils.rs +++ b/frontend/tauri/src/utils.rs @@ -86,11 +86,33 @@ pub struct DiffRequestDto { pub indexes: Vec, #[serde(default)] pub deleted_indexes: Vec, + #[serde(default)] + pub foreign_keys: Vec, + #[serde(default)] + pub deleted_foreign_keys: Vec, + #[serde(default)] + pub check_constraints: Vec, + #[serde(default)] + pub deleted_checks: Vec, + #[serde(default)] + pub views: Vec, + #[serde(default)] + pub deleted_views: Vec, + #[serde(default)] + pub triggers: Vec, + #[serde(default)] + pub deleted_triggers: Vec, + #[serde(default)] + pub routines: Vec, + #[serde(default)] + pub deleted_routines: Vec, } #[derive(Deserialize, Debug)] #[serde(rename_all = "camelCase")] pub struct ColumnDefinitionDto { + #[serde(default)] + pub id: String, #[serde(default)] pub name: String, #[serde(default)] @@ -103,12 +125,16 @@ pub struct ColumnDefinitionDto { #[serde(default)] pub is_auto_increment: bool, #[serde(default)] + pub is_identity: bool, + #[serde(default)] pub comment: String, pub length: Option, pub precision: Option, pub scale: Option, #[serde(default = "default_original_index")] pub original_index: i32, + #[serde(rename = "_original")] + pub original: Option>, } fn default_true() -> bool { true } @@ -117,12 +143,99 @@ fn default_original_index() -> i32 { -1 } #[derive(Deserialize, Debug)] #[serde(rename_all = "camelCase")] pub struct IndexDefinitionDto { + #[serde(default)] + pub id: String, #[serde(default)] pub name: String, #[serde(default)] pub columns: Vec, #[serde(default)] pub is_unique: bool, + #[serde(rename = "_original")] + pub original: Option>, +} + +#[derive(Deserialize, Debug)] +#[serde(rename_all = "camelCase")] +pub struct ForeignKeyDefinitionDto { + #[serde(default)] + pub id: String, + #[serde(default)] + pub name: String, + #[serde(default)] + pub columns: Vec, + #[serde(default)] + pub referenced_table: String, + #[serde(default)] + pub referenced_columns: Vec, + #[serde(default)] + pub on_delete: String, + #[serde(default)] + pub on_update: String, + #[serde(rename = "_original")] + pub original: Option>, +} + +#[derive(Deserialize, Debug)] +#[serde(rename_all = "camelCase")] +pub struct CheckConstraintDefinitionDto { + #[serde(default)] + pub id: String, + #[serde(default)] + pub name: String, + #[serde(default)] + pub expression: String, + #[serde(rename = "_original")] + pub original: Option>, +} + +#[derive(Deserialize, Debug)] +#[serde(rename_all = "camelCase")] +pub struct ViewDefinitionDto { + #[serde(default)] + pub id: String, + #[serde(default)] + pub name: String, + #[serde(default)] + pub definition: String, + #[serde(rename = "_original")] + pub original: Option>, +} + +#[derive(Deserialize, Debug)] +#[serde(rename_all = "camelCase")] +pub struct TriggerDefinitionDto { + #[serde(default)] + pub id: String, + #[serde(default)] + pub name: String, + #[serde(default)] + pub timing: String, + #[serde(default)] + pub event: String, + #[serde(default)] + pub table_name: String, + #[serde(default)] + pub definition: String, + #[serde(default = "default_true")] + pub enabled: bool, + #[serde(rename = "_original")] + pub original: Option>, +} + +#[derive(Deserialize, Debug)] +#[serde(rename_all = "camelCase")] +pub struct RoutineDefinitionDto { + #[serde(default)] + pub id: String, + #[serde(default)] + pub name: String, + #[serde(default)] + pub r#type: String, + #[serde(default)] + pub definition: String, + #[serde(rename = "_original")] + pub original: Option>, } impl From for ColumnDefinition { @@ -139,10 +252,10 @@ impl From for ColumnDefinition { precision: dto.precision.map(|i| json_to_prost_value(serde_json::Value::Number(i.into()))), scale: dto.scale.map(|i| json_to_prost_value(serde_json::Value::Number(i.into()))), enum_values: vec![], - id: "".to_string(), + id: dto.id, is_default_expression: false, - is_identity: false, - original: None, + is_identity: dto.is_identity, + original: dto.original.map(|o| Box::new(ColumnDefinition::from(*o))), original_index: dto.original_index, pk_constraint_name: "".to_string(), } @@ -155,8 +268,77 @@ impl From for IndexDefinition { name: dto.name, columns: dto.columns, is_unique: dto.is_unique, - id: "".to_string(), - original: None, + id: dto.id, + original: dto.original.map(|o| Box::new(IndexDefinition::from(*o))), + } + } +} + +use crate::vstable::{ + CheckConstraintDefinition, ForeignKeyDefinition, RoutineDefinition, TriggerDefinition, + ViewDefinition, +}; + +impl From for ForeignKeyDefinition { + fn from(dto: ForeignKeyDefinitionDto) -> Self { + ForeignKeyDefinition { + id: dto.id, + name: dto.name, + columns: dto.columns, + referenced_table: dto.referenced_table, + referenced_columns: dto.referenced_columns, + on_delete: dto.on_delete, + on_update: dto.on_update, + original: dto.original.map(|o| Box::new(ForeignKeyDefinition::from(*o))), + } + } +} + +impl From for CheckConstraintDefinition { + fn from(dto: CheckConstraintDefinitionDto) -> Self { + CheckConstraintDefinition { + id: dto.id, + name: dto.name, + expression: dto.expression, + original: dto.original.map(|o| Box::new(CheckConstraintDefinition::from(*o))), + } + } +} + +impl From for ViewDefinition { + fn from(dto: ViewDefinitionDto) -> Self { + ViewDefinition { + id: dto.id, + name: dto.name, + definition: dto.definition, + original: dto.original.map(|o| Box::new(ViewDefinition::from(*o))), + } + } +} + +impl From for TriggerDefinition { + fn from(dto: TriggerDefinitionDto) -> Self { + TriggerDefinition { + id: dto.id, + name: dto.name, + timing: dto.timing, + event: dto.event, + table_name: dto.table_name, + definition: dto.definition, + enabled: dto.enabled, + original: dto.original.map(|o| Box::new(TriggerDefinition::from(*o))), + } + } +} + +impl From for RoutineDefinition { + fn from(dto: RoutineDefinitionDto) -> Self { + RoutineDefinition { + id: dto.id, + name: dto.name, + r#type: dto.r#type, + definition: dto.definition, + original: dto.original.map(|o| Box::new(RoutineDefinition::from(*o))), } } } @@ -172,16 +354,24 @@ impl From for DiffRequest { deleted_columns: dto.deleted_columns.into_iter().map(|c| c.into()).collect(), indexes: dto.indexes.into_iter().map(|i| i.into()).collect(), deleted_indexes: dto.deleted_indexes.into_iter().map(|i| i.into()).collect(), - foreign_keys: vec![], - deleted_foreign_keys: vec![], - check_constraints: vec![], - deleted_checks: vec![], - views: vec![], - deleted_views: vec![], - triggers: vec![], - deleted_triggers: vec![], - routines: vec![], - deleted_routines: vec![], + foreign_keys: dto.foreign_keys.into_iter().map(|f| f.into()).collect(), + deleted_foreign_keys: dto + .deleted_foreign_keys + .into_iter() + .map(|f| f.into()) + .collect(), + check_constraints: dto + .check_constraints + .into_iter() + .map(|c| c.into()) + .collect(), + deleted_checks: dto.deleted_checks.into_iter().map(|c| c.into()).collect(), + views: dto.views.into_iter().map(|v| v.into()).collect(), + deleted_views: dto.deleted_views.into_iter().map(|v| v.into()).collect(), + triggers: dto.triggers.into_iter().map(|t| t.into()).collect(), + deleted_triggers: dto.deleted_triggers.into_iter().map(|t| t.into()).collect(), + routines: dto.routines.into_iter().map(|r| r.into()).collect(), + deleted_routines: dto.deleted_routines.into_iter().map(|r| r.into()).collect(), config: None, } }