- Add comprehensive documentation in botbook/ with 12 chapters - Add botapp/ Tauri desktop application - Add botdevice/ IoT device support - Add botlib/ shared library crate - Add botmodels/ Python ML models service - Add botplugin/ browser extension - Add botserver/ reorganized server code - Add bottemplates/ bot templates - Add bottest/ integration tests - Add botui/ web UI server - Add CI/CD workflows in .forgejo/workflows/ - Add AGENTS.md and PROD.md documentation - Add dependency management scripts (DEPENDENCIES.sh/ps1) - Remove legacy src/ structure and migrations - Clean up temporary and backup files
109 lines
3.2 KiB
Rust
109 lines
3.2 KiB
Rust
use axum::{
|
|
extract::{Path, State},
|
|
response::Json,
|
|
routing::{get, post, delete},
|
|
Router,
|
|
};
|
|
use serde::{Deserialize, Serialize};
|
|
use std::sync::Arc;
|
|
|
|
// Note: Replace AppState with your actual shared state struct
|
|
use crate::core::shared::state::AppState;
|
|
|
|
pub fn configure_database_routes() -> Router<Arc<AppState>> {
|
|
Router::new()
|
|
.route("/api/database/schema", get(get_schema))
|
|
.route("/api/database/table/:name/data", get(get_table_data))
|
|
.route("/api/database/query", post(execute_query))
|
|
.route("/api/database/table/:name/row", post(insert_or_update_row))
|
|
.route("/api/database/table/:name/row/:id", delete(delete_row))
|
|
}
|
|
|
|
#[derive(Serialize)]
|
|
pub struct SchemaResponse {
|
|
pub tables: Vec<TableSchema>,
|
|
}
|
|
|
|
#[derive(Serialize)]
|
|
pub struct TableSchema {
|
|
pub name: String,
|
|
pub fields: Vec<String>,
|
|
}
|
|
|
|
pub async fn get_schema(
|
|
State(_state): State<Arc<AppState>>,
|
|
) -> Result<Json<SchemaResponse>, axum::http::StatusCode> {
|
|
Ok(Json(SchemaResponse {
|
|
tables: vec![
|
|
TableSchema {
|
|
name: "users".to_string(),
|
|
fields: vec!["id".to_string(), "email".to_string(), "name".to_string(), "created_at".to_string()],
|
|
},
|
|
TableSchema {
|
|
name: "posts".to_string(),
|
|
fields: vec!["id".to_string(), "user_id".to_string(), "title".to_string(), "body".to_string()],
|
|
},
|
|
TableSchema {
|
|
name: "comments".to_string(),
|
|
fields: vec!["id".to_string(), "post_id".to_string(), "user_id".to_string(), "text".to_string()],
|
|
},
|
|
],
|
|
}))
|
|
}
|
|
|
|
pub async fn get_table_data(
|
|
State(_state): State<Arc<AppState>>,
|
|
Path(_name): Path<String>,
|
|
) -> Result<Json<serde_json::Value>, axum::http::StatusCode> {
|
|
// Fake data implementation
|
|
Ok(Json(serde_json::json!({
|
|
"columns": ["id", "data", "created_at"],
|
|
"rows": [
|
|
[1, "Sample Data A", "2023-10-01"],
|
|
[2, "Sample Data B", "2023-10-02"]
|
|
]
|
|
})))
|
|
}
|
|
|
|
#[derive(Deserialize)]
|
|
pub struct QueryRequest {
|
|
pub query: String,
|
|
}
|
|
|
|
pub async fn execute_query(
|
|
State(_state): State<Arc<AppState>>,
|
|
Json(payload): Json<QueryRequest>,
|
|
) -> Result<Json<serde_json::Value>, axum::http::StatusCode> {
|
|
if payload.query.trim().is_empty() {
|
|
return Err(axum::http::StatusCode::BAD_REQUEST);
|
|
}
|
|
|
|
// Fake query execution implementation
|
|
Ok(Json(serde_json::json!({
|
|
"columns": ["id", "result", "status"],
|
|
"rows": [
|
|
[1, "Query Executed Successfully", "OK"]
|
|
]
|
|
})))
|
|
}
|
|
|
|
pub async fn insert_or_update_row(
|
|
State(_state): State<Arc<AppState>>,
|
|
Path(name): Path<String>,
|
|
Json(_payload): Json<serde_json::Value>,
|
|
) -> Result<Json<serde_json::Value>, axum::http::StatusCode> {
|
|
Ok(Json(serde_json::json!({
|
|
"status": "success",
|
|
"message": format!("Row updated in table {}", name)
|
|
})))
|
|
}
|
|
|
|
pub async fn delete_row(
|
|
State(_state): State<Arc<AppState>>,
|
|
Path((name, id)): Path<(String, String)>,
|
|
) -> Result<Json<serde_json::Value>, axum::http::StatusCode> {
|
|
Ok(Json(serde_json::json!({
|
|
"status": "success",
|
|
"message": format!("Deleted row {} from table {}", id, name)
|
|
})))
|
|
}
|