use async_trait::async_trait; use axum::Router; use axum::routing::{get, post, put}; use erp_core::module::ErpModule; pub struct PluginModule; #[async_trait] impl ErpModule for PluginModule { fn name(&self) -> &str { "plugin" } fn dependencies(&self) -> Vec<&str> { vec!["auth", "config"] } fn as_any(&self) -> &dyn std::any::Any { self } } impl PluginModule { /// 插件管理路由(需要 JWT 认证) pub fn protected_routes() -> Router where crate::state::PluginState: axum::extract::FromRef, S: Clone + Send + Sync + 'static, { let admin_routes = Router::new() .route("/admin/plugins/upload", post(crate::handler::plugin_handler::upload_plugin::)) .route("/admin/plugins", get(crate::handler::plugin_handler::list_plugins::)) .route( "/admin/plugins/{id}", get(crate::handler::plugin_handler::get_plugin::) .delete(crate::handler::plugin_handler::purge_plugin::), ) .route( "/admin/plugins/{id}/schema", get(crate::handler::plugin_handler::get_plugin_schema::), ) .route( "/admin/plugins/{id}/install", post(crate::handler::plugin_handler::install_plugin::), ) .route( "/admin/plugins/{id}/enable", post(crate::handler::plugin_handler::enable_plugin::), ) .route( "/admin/plugins/{id}/disable", post(crate::handler::plugin_handler::disable_plugin::), ) .route( "/admin/plugins/{id}/uninstall", post(crate::handler::plugin_handler::uninstall_plugin::), ) .route( "/admin/plugins/{id}/health", get(crate::handler::plugin_handler::health_check_plugin::), ) .route( "/admin/plugins/{id}/config", put(crate::handler::plugin_handler::update_plugin_config::), ) .route( "/admin/plugins/{id}/upgrade", post(crate::handler::plugin_handler::upgrade_plugin::), ) .route( "/admin/plugins/{id}/validate", get(crate::handler::plugin_handler::validate_plugin::), ); // 插件数据 CRUD 路由 let data_routes = Router::new() .route( "/plugins/{plugin_id}/{entity}", get(crate::handler::data_handler::list_plugin_data::) .post(crate::handler::data_handler::create_plugin_data::), ) .route( "/plugins/{plugin_id}/{entity}/{id}", get(crate::handler::data_handler::get_plugin_data::) .put(crate::handler::data_handler::update_plugin_data::) .patch(crate::handler::data_handler::patch_plugin_data::) .delete(crate::handler::data_handler::delete_plugin_data::), ) // 数据统计路由 .route( "/plugins/{plugin_id}/{entity}/count", get(crate::handler::data_handler::count_plugin_data::), ) .route( "/plugins/{plugin_id}/{entity}/aggregate", get(crate::handler::data_handler::aggregate_plugin_data::), ) .route( "/plugins/{plugin_id}/{entity}/aggregate-multi", post(crate::handler::data_handler::aggregate_multi_plugin_data::), ) // 批量操作路由 .route( "/plugins/{plugin_id}/{entity}/batch", post(crate::handler::data_handler::batch_plugin_data::), ) // 时间序列路由 .route( "/plugins/{plugin_id}/{entity}/timeseries", get(crate::handler::data_handler::get_plugin_timeseries::), ) // 跨插件引用:批量标签解析 .route( "/plugins/{plugin_id}/{entity}/resolve-labels", post(crate::handler::data_handler::resolve_ref_labels::), ) // 数据导入导出 .route( "/plugins/{plugin_id}/{entity}/export", get(crate::handler::data_handler::export_plugin_data::), ) .route( "/plugins/{plugin_id}/{entity}/import", post(crate::handler::data_handler::import_plugin_data::), ) // 对账扫描 .route( "/plugins/{plugin_id}/reconcile", post(crate::handler::data_handler::reconcile_refs::), ); // 实体注册表路由 let registry_routes = Router::new() .route( "/plugin-registry/entities", get(crate::handler::data_handler::list_public_entities::), ); // 市场路由 let market_routes = Router::new() .route( "/market/entries", get(crate::handler::market_handler::list_market_entries::), ) .route( "/market/entries/{id}", get(crate::handler::market_handler::get_market_entry::), ) .route( "/market/entries/{id}/install", post(crate::handler::market_handler::install_from_market::), ) .route( "/market/entries/{id}/reviews", get(crate::handler::market_handler::list_market_reviews::) .post(crate::handler::market_handler::submit_market_review::), ); admin_routes.merge(data_routes).merge(registry_routes).merge(market_routes) } }