trying to make work multi profile setup
This commit is contained in:
@@ -4,6 +4,13 @@ use sqlx::{PgPool, Row};
|
|||||||
use serde_json::json;
|
use serde_json::json;
|
||||||
use common::proto::multieko2::table_definition::{PostTableDefinitionRequest, TableDefinitionResponse};
|
use common::proto::multieko2::table_definition::{PostTableDefinitionRequest, TableDefinitionResponse};
|
||||||
|
|
||||||
|
const VALID_DATA_TYPES: &[&str] = &["TEXT", "INTEGER", "BIGINT", "BOOLEAN", "TIMESTAMPTZ", "NUMERIC"];
|
||||||
|
|
||||||
|
// Add to validation section
|
||||||
|
fn is_valid_data_type(dt: &str) -> bool {
|
||||||
|
VALID_DATA_TYPES.contains(&dt.to_uppercase().as_str())
|
||||||
|
}
|
||||||
|
|
||||||
// Validate SQL identifiers
|
// Validate SQL identifiers
|
||||||
fn is_valid_identifier(s: &str) -> bool {
|
fn is_valid_identifier(s: &str) -> bool {
|
||||||
!s.is_empty() &&
|
!s.is_empty() &&
|
||||||
@@ -58,14 +65,21 @@ pub async fn post_table_definition(
|
|||||||
None
|
None
|
||||||
};
|
};
|
||||||
|
|
||||||
|
fn is_reserved_column(name: &str, linked_table: Option<&str>) -> bool {
|
||||||
|
let reserved = vec!["id", "deleted", "firma", "created_at"];
|
||||||
|
reserved.contains(&name) || linked_table.map(|lt| format!("{}_id", lt)) == Some(name.to_string())
|
||||||
|
}
|
||||||
|
|
||||||
// Validate columns and indexes (add data type support)
|
// Validate columns and indexes (add data type support)
|
||||||
let mut columns = Vec::new();
|
let mut columns = Vec::new();
|
||||||
for col_def in request.columns.drain(..) {
|
for col_def in request.columns.drain(..) {
|
||||||
let col_name = sanitize_identifier(&col_def.name);
|
let col_name = sanitize_identifier(&col_def.name);
|
||||||
if !is_valid_identifier(&col_name) {
|
if !is_valid_identifier(&col_name) {
|
||||||
return Err(Status::invalid_argument(format!("Invalid column name: {}", col_def.name)));
|
return Err(Status::invalid_argument("Invalid column name"));
|
||||||
|
}
|
||||||
|
if !is_valid_data_type(&col_def.data_type) {
|
||||||
|
return Err(Status::invalid_argument("Invalid data type"));
|
||||||
}
|
}
|
||||||
// Add data type validation here
|
|
||||||
columns.push(format!("\"{}\" {}", col_name, col_def.data_type));
|
columns.push(format!("\"{}\" {}", col_name, col_def.data_type));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -122,23 +136,48 @@ pub async fn post_table_definition(
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
fn generate_table_sql(table_name: &str, columns: &[String], indexes: &[String]) -> (String, Vec<String>) {
|
|
||||||
let columns_sql = columns.join(",\n ");
|
// Add system columns to SQL generation
|
||||||
|
fn generate_table_sql(
|
||||||
|
table_name: &str,
|
||||||
|
columns: &[String],
|
||||||
|
indexes: &[String],
|
||||||
|
linked_table: Option<&str>,
|
||||||
|
) -> (String, Vec<String>) {
|
||||||
|
let mut system_columns = vec![
|
||||||
|
"id BIGSERIAL PRIMARY KEY",
|
||||||
|
"deleted BOOLEAN NOT NULL DEFAULT FALSE",
|
||||||
|
"firma TEXT NOT NULL",
|
||||||
|
];
|
||||||
|
|
||||||
|
if let Some(linked) = linked_table {
|
||||||
|
system_columns.push(
|
||||||
|
format!("\"{}_id\" BIGINT NOT NULL REFERENCES \"{}\"(id)", linked, linked)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
let all_columns = system_columns
|
||||||
|
.iter()
|
||||||
|
.map(|s| s.to_string())
|
||||||
|
.chain(columns.iter().cloned())
|
||||||
|
.collect::<Vec<_>>();
|
||||||
|
|
||||||
let create_sql = format!(
|
let create_sql = format!(
|
||||||
"CREATE TABLE \"{}\" (
|
"CREATE TABLE \"{}\" (\n {},\n created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP\n)",
|
||||||
id BIGSERIAL PRIMARY KEY,
|
table_name,
|
||||||
deleted BOOLEAN NOT NULL DEFAULT FALSE,
|
all_columns.join(",\n ")
|
||||||
{},
|
);
|
||||||
created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP
|
|
||||||
)", table_name, columns_sql);
|
|
||||||
|
|
||||||
let index_sql = indexes.iter()
|
let mut system_indexes = vec![
|
||||||
.map(|i| format!(
|
format!("CREATE INDEX idx_{}_firma ON \"{}\" (firma)", table_name, table_name),
|
||||||
"CREATE INDEX idx_{}_{} ON \"{}\" (\"{}\")",
|
];
|
||||||
table_name, i, table_name, i
|
|
||||||
))
|
|
||||||
.collect();
|
|
||||||
|
|
||||||
(create_sql, index_sql)
|
if let Some(linked) = linked_table {
|
||||||
|
system_indexes.push(format!(
|
||||||
|
"CREATE INDEX idx_{}_{}_id ON \"{}\" (\"{}_id\")",
|
||||||
|
table_name, linked, table_name, linked
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
(create_sql, [system_indexes, indexes.to_vec()].concat())
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user