echoes/backend/src/main.rs

113 lines
3.5 KiB
Rust
Raw Normal View History

// main.rs
/**
* API接口
*
*
* - GET /api/install:
* - GET /api/sql: SQL查询并返回结果
*/
mod config; // 配置模块
mod database;
mod secret;
use chrono::Duration;
// 数据库模块
use database::relational; // 引入关系型数据库
use once_cell::sync::Lazy; // 用于延迟初始化
use rocket::{get, http::Status, launch, response::status, routes, serde::json::Json}; // 引入Rocket框架相关功能
use std::sync::Arc;
// 引入Arc用于线程安全的引用计数
use tokio::sync::Mutex; // 引入Mutex用于异步锁
// 全局数据库连接变量
static DB: Lazy<Arc<Mutex<Option<relational::Database>>>> = Lazy::new(|| Arc::new(Mutex::new(None)));
/**
*
*/
async fn init_db(database: config::DbConfig) -> Result<(), Box<dyn std::error::Error>> {
let database = relational::Database::init(database).await?; // 初始化数据库
*DB.lock().await = Some(database); // 保存数据库实例
2024-11-11 01:38:58 +08:00
Ok(())
}
/**
*
*/
async fn get_db() -> Result<relational::Database, Box<dyn std::error::Error>> {
DB.lock()
.await
.clone()
.ok_or_else(|| "Database not initialized".into()) // 返回错误信息
}
/**
*
*/
#[get("/sql")]
async fn ssql() -> Result<Json<Vec<std::collections::HashMap<String, String>>>, status::Custom<String>> {
2024-11-11 01:38:58 +08:00
let db = get_db().await.map_err(|e| {
status::Custom(
Status::InternalServerError,
format!("Database error: {}", e), // 数据库错误信息
)
2024-11-11 01:38:58 +08:00
})?;
let query_result = db
.get_db()
.query("SELECT * FROM info".to_string())
2024-11-11 01:38:58 +08:00
.await
.map_err(|e| status::Custom(Status::InternalServerError, format!("Query error: {}", e)))?;
2024-11-11 01:38:58 +08:00
Ok(Json(query_result)) // 返回查询结果
}
/**
*
*/
2024-11-11 01:38:58 +08:00
#[get("/install")]
async fn install() -> status::Custom<String> {
get_db()
.await
.map(|_| status::Custom(Status::Ok, "Database connected successfully".into())) // 连接成功
.unwrap_or_else(|e| {
status::Custom(
Status::InternalServerError,
format!("Failed to connect: {}", e), // 连接失败信息
)
})
2024-11-11 01:38:58 +08:00
}
/**
* Rocket应用
*/
#[launch]
async fn rocket() -> _ {
let config = config::Config::read().expect("Failed to read config"); // 读取配置
init_db(config.db_config)
.await
.expect("Failed to connect to database"); // 初始化数据库连接
rocket::build().mount("/", routes![install, ssql]) // 挂载API路由
}
// fn main(){
// // secret::generate_key().expect("msg");
// // 创建claims
// let now = SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_secs() as i64;
// // 创建 Claims
// let claims = secret::CustomClaims {
// user_id: String::from("lsy"),
// device_ua: String::from("lsy"),
// };
// let t=String::from("eyJhbGciOiJFZERTQSJ9.eyJleHAiOjE3MzE3NTczMDMsIm5iZiI6MTczMTc1NzI4MywiaWF0IjoxNzMxNzU3MjgzLCJ1c2VyX2lkIjoibHN5IiwiZGV2aWNlX3VhIjoibHN5In0.C8t5XZFSKnnDVmc6WkY-gzGNSAP7lNAjP9yBjhdvIRO7r_QjDnfcm0INIqCt5cyvnRlE2rFJIx_axOfLx2QJAw");
// // 生成JWT
// let token = secret::generate_jwt(claims,Duration::seconds(20)).expect("msg");
// println!("{}", token);
// // 验证JWT
// let a=secret::validate_jwt(&t).expect("msg");
// println!("\n\n{}",a.user_id)
// }