115 lines
4.3 KiB
Rust
115 lines
4.3 KiB
Rust
// 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
|
||
}
|