// src/pages/admin_panel/add_table/loader.rs use anyhow::{anyhow, Result}; use tracing::debug; use crate::pages::admin_panel::add_table::state::AddTableState; use crate::services::grpc_client::GrpcClient; use common::proto::komp_ac::table_definition::{ ColumnDefinition as ProtoColumnDefinition, PostTableDefinitionRequest, TableLink as ProtoTableLink, }; /// Prepares and sends the request to save the new table definition via gRPC. pub async fn handle_save_table_action( grpc_client: &mut GrpcClient, add_table_state: &AddTableState, ) -> Result { if add_table_state.table_name.is_empty() { return Err(anyhow!("Table name cannot be empty.")); } if add_table_state.columns.is_empty() { return Err(anyhow!("Table must have at least one column.")); } let proto_columns: Vec = add_table_state .columns .iter() .map(|col| ProtoColumnDefinition { name: col.name.clone(), field_type: col.data_type.clone(), }) .collect(); let proto_indexes: Vec = add_table_state .indexes .iter() .filter(|idx| idx.selected) .map(|idx| idx.name.clone()) .collect(); let proto_links: Vec = add_table_state .links .iter() .filter(|link| link.selected) .map(|link| ProtoTableLink { linked_table_name: link.linked_table_name.clone(), required: false, }) .collect(); let request = PostTableDefinitionRequest { table_name: add_table_state.table_name.clone(), columns: proto_columns, indexes: proto_indexes, links: proto_links, profile_name: add_table_state.profile_name.clone(), }; debug!("Sending PostTableDefinitionRequest: {:?}", request); match grpc_client.post_table_definition(request).await { Ok(response) => { if response.success { Ok(format!( "Table '{}' saved successfully.", add_table_state.table_name )) } else { let error_message = if !response.sql.is_empty() { format!("Server failed to save table: {}", response.sql) } else { "Server failed to save table (unknown reason).".to_string() }; Err(anyhow!(error_message)) } } Err(e) => Err(anyhow!("gRPC call failed: {}", e)), } }