NAC_Blockchain/nac-onboarding-system/src/main.rs

115 lines
4.3 KiB
Rust
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// NAC资产一键上链系统 - 主程序
use actix_web::{web, App, HttpServer, middleware::Logger};
use std::env;
mod database;
mod error;
mod response;
mod models;
mod services;
mod handlers;
mod middleware;
use database::DbPool;
use services::Orchestrator;
use nac_sdk::adapters::{NACAdapter, config::NACConfig};
#[actix_web::main]
async fn main() -> std::io::Result<()> {
// 初始化日志
env_logger::init_from_env(env_logger::Env::new().default_filter_or("info"));
log::info!("========== NAC资产一键上链系统启动 ==========");
// 加载环境变量
dotenv::dotenv().ok();
// 数据库连接
let database_url = env::var("DATABASE_URL")
.unwrap_or_else(|_| "sqlite://nac_onboarding.db".to_string());
log::info!("连接数据库: {}", database_url);
let pool = DbPool::connect(&database_url).await
.expect("Failed to connect to database");
// 初始化数据库表
log::info!("初始化数据库表...");
database::init_db(&pool).await
.expect("Failed to initialize database");
// 创建NAC SDK适配器
log::info!("初始化NAC SDK适配器...");
let nac_config = NACConfig::default();
let adapter = NACAdapter::new(&nac_config).await
.expect("Failed to create NAC adapter");
// 创建编排引擎
log::info!("初始化编排引擎...");
let orchestrator = Orchestrator::new(pool.clone(), adapter);
// 服务器配置
let host = env::var("HOST").unwrap_or_else(|_| "0.0.0.0".to_string());
let port = env::var("PORT").unwrap_or_else(|_| "8080".to_string());
let bind_address = format!("{}:{}", host, port);
log::info!("========== 服务器启动成功 ==========");
log::info!("监听地址: {}", bind_address);
log::info!("API文档: http://{}/api/docs", bind_address);
// 启动HTTP服务器
HttpServer::new(move || {
App::new()
// 中间件
.wrap(Logger::default())
.wrap(middleware::create_cors())
// 共享状态
.app_data(web::Data::new(pool.clone()))
.app_data(web::Data::new(orchestrator.clone()))
// 静态文件
.service(actix_files::Files::new("/", "./static").index_file("index.html"))
// API路由
.service(
web::scope("/api")
// 认证API无需认证
.service(
web::scope("/auth")
.route("/register", web::post().to(handlers::register))
.route("/login", web::post().to(handlers::login))
)
// 资产API需要认证
.service(
web::scope("/assets")
.wrap(middleware::AuthMiddleware)
.route("", web::post().to(handlers::create_asset))
.route("", web::get().to(handlers::list_assets))
.route("/{asset_id}", web::get().to(handlers::get_asset))
.route("/{asset_id}/onboard", web::post().to(handlers::submit_onboarding))
.route("/{asset_id}/progress", web::get().to(handlers::query_progress))
.route("/{asset_id}/retry", web::post().to(handlers::retry_onboarding))
)
// 管理API需要管理员权限
.service(
web::scope("/admin")
.wrap(middleware::AuthMiddleware)
.route("/stats", web::get().to(handlers::get_stats))
.route("/users", web::get().to(handlers::list_all_users))
.route("/assets", web::get().to(handlers::list_all_assets))
.route("/records", web::get().to(handlers::list_all_records))
)
// 用户API需要认证
.service(
web::scope("/user")
.wrap(middleware::AuthMiddleware)
.route("/me", web::get().to(handlers::me))
)
)
})
.bind(&bind_address)?
.run()
.await
}