79 lines
2.5 KiB
Rust
79 lines
2.5 KiB
Rust
// 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<String> {
|
|
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<ProtoColumnDefinition> = add_table_state
|
|
.columns
|
|
.iter()
|
|
.map(|col| ProtoColumnDefinition {
|
|
name: col.name.clone(),
|
|
field_type: col.data_type.clone(),
|
|
})
|
|
.collect();
|
|
|
|
let proto_indexes: Vec<String> = add_table_state
|
|
.indexes
|
|
.iter()
|
|
.filter(|idx| idx.selected)
|
|
.map(|idx| idx.name.clone())
|
|
.collect();
|
|
|
|
let proto_links: Vec<ProtoTableLink> = 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)),
|
|
}
|
|
}
|