diff --git a/Cargo.toml b/Cargo.toml index 875b4d00e210043b489f2a095cb27c83169c3809..814e5c74708f6d5976cd97f4f1ed118c30f9147d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -23,8 +23,8 @@ name = "custom-route-example" path = "examples/custom_route_example/src/main.rs" [[bin]] -name = "portal_route_example" -path = "examples/portal_route_example/src/main.rs" +name = "datamgr_route_example" +path = "examples/datamgr_route_example/src/main.rs" [dependencies] #feventbus = "0.3.0" diff --git a/examples/portal_route_example/Cargo.toml b/examples/datamgr_route_example/Cargo.toml similarity index 86% rename from examples/portal_route_example/Cargo.toml rename to examples/datamgr_route_example/Cargo.toml index f64832c10cd9ca4c6ea5794c1215510dd98be73f..9f3c95cceb1aab97bddad998b0b7c81b8029cf61 100644 --- a/examples/portal_route_example/Cargo.toml +++ b/examples/datamgr_route_example/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "portal_route_example" +name = "datamgr_route_example" version = "0.1.0" edition = "2021" diff --git a/examples/portal_route_example/build.rs b/examples/datamgr_route_example/build.rs similarity index 100% rename from examples/portal_route_example/build.rs rename to examples/datamgr_route_example/build.rs diff --git a/examples/portal_route_example/src/main.rs b/examples/datamgr_route_example/src/main.rs similarity index 61% rename from examples/portal_route_example/src/main.rs rename to examples/datamgr_route_example/src/main.rs index a5fd7a75ae88e0e2f7f6c94059082d864aa6925c..97835cea85f40d8744a46db547df0320def0a8ea 100644 --- a/examples/portal_route_example/src/main.rs +++ b/examples/datamgr_route_example/src/main.rs @@ -1,5 +1,5 @@ -use fleet_apiserver::portal_route::portal_api; -use fleet_apiserver::portal_route::route; +use fleet_apiserver::datamgr_route::datamgr_api; +use fleet_apiserver::datamgr_route::route; use fleet_apiserver::cores::plugin::PluginManager; use env_logger::{Builder, Target}; use std::ffi::CString; @@ -25,16 +25,16 @@ async fn main() { let plugin_manager = Arc::new(PluginManager::new()); - let data_plugin_manager = portal_api::NewPluginManager(); - let plugin_file_path = CString::new("/home/trickster/Downloads/ripple-remastered/plugins/release").unwrap(); - portal_api::LoadPluginsFromDirectory(data_plugin_manager, plugin_file_path.as_ptr()); + let data_plugin_manager = datamgr_api::NewPluginManager(); + let plugin_file_path = CString::new("/root/project/fleet-datamgr/plugins/release").unwrap(); + datamgr_api::LoadPluginsFromDirectory(data_plugin_manager, plugin_file_path.as_ptr()); route::init_plugin(plugin_manager.clone(), data_plugin_manager); if let Err(e) = fleet_apiserver::start_server(DATABASE_URL, ADDRESS, plugin_manager).await { eprintln!("Failed to start server: {}", e); } - portal_api::UnloadAllPlugins(data_plugin_manager); - portal_api::DeletePluginManager(data_plugin_manager); + datamgr_api::UnloadAllPlugins(data_plugin_manager); + datamgr_api::DeletePluginManager(data_plugin_manager); } } diff --git a/src/portal_route/portal_api.rs b/src/datamgr_route/datamgr_api.rs similarity index 49% rename from src/portal_route/portal_api.rs rename to src/datamgr_route/datamgr_api.rs index eafbe7ee7195891e65017b7754a7a5322bf2ff9b..e1705b23ed76f60bdbfe5fb4c96335510035f820 100644 --- a/src/portal_route/portal_api.rs +++ b/src/datamgr_route/datamgr_api.rs @@ -60,3 +60,60 @@ unsafe extern "C" { indexCount: *mut ::std::os::raw::c_int, ) -> *mut *const ::std::os::raw::c_char; } +unsafe extern "C" { + pub fn ReceiveNormalData( + pluginManager: *mut ::std::os::raw::c_void, + key: *const ::std::os::raw::c_char, + dataBuffer: *const ::std::os::raw::c_char, + count: ::std::os::raw::c_int, + ) -> ::std::os::raw::c_int; +} +unsafe extern "C" { + pub fn SetSyncAndRecycleStrategy( + pluginManager: *mut ::std::os::raw::c_void, + key: *const ::std::os::raw::c_char, + syncStrategy: *const ::std::os::raw::c_char, + recycleTime: *const ::std::os::raw::c_char, + recycleCascadeKeys: *const ::std::os::raw::c_char, + ) -> ::std::os::raw::c_int; +} +unsafe extern "C" { + pub fn SubmitUserRequest( + pluginManager: *mut ::std::os::raw::c_void, + key: *const ::std::os::raw::c_char, + userRequestBuffer: *const ::std::os::raw::c_char, + count: ::std::os::raw::c_int, + ) -> ::std::os::raw::c_int; +} +unsafe extern "C" { + pub fn FindDataLocation( + pluginManager: *mut ::std::os::raw::c_void, + key: *const ::std::os::raw::c_char, + dataLocationBuffer: *const ::std::os::raw::c_char, + count: ::std::os::raw::c_int, + ) -> ::std::os::raw::c_int; +} +unsafe extern "C" { + pub fn ReadData( + pluginManager: *mut ::std::os::raw::c_void, + key: *const ::std::os::raw::c_char, + dataBuffer: *const ::std::os::raw::c_char, + count: ::std::os::raw::c_int, + ) -> ::std::os::raw::c_int; +} +unsafe extern "C" { + pub fn RegisterTerminal( + pluginManager: *mut ::std::os::raw::c_void, + userToken: *const ::std::os::raw::c_char, + userDataBuffer: *const ::std::os::raw::c_char, + count: ::std::os::raw::c_int, + ) -> ::std::os::raw::c_int; +} +unsafe extern "C" { + pub fn GetTerminalInfo( + pluginManager: *mut ::std::os::raw::c_void, + userToken: *const ::std::os::raw::c_char, + userDataBuffer: *mut ::std::os::raw::c_char, + count: ::std::os::raw::c_int, + ) -> ::std::os::raw::c_int; +} \ No newline at end of file diff --git a/src/portal_route/mod.rs b/src/datamgr_route/mod.rs similarity index 40% rename from src/portal_route/mod.rs rename to src/datamgr_route/mod.rs index 1ead564ec55d6987a00526ed79a382cd7b661f7f..36f05a1b1143a5ce82201e3ba6d1ae304ff64775 100644 --- a/src/portal_route/mod.rs +++ b/src/datamgr_route/mod.rs @@ -1,2 +1,2 @@ -pub mod portal_api; +pub mod datamgr_api; pub mod route; \ No newline at end of file diff --git a/src/portal_route/route.rs b/src/datamgr_route/route.rs similarity index 52% rename from src/portal_route/route.rs rename to src/datamgr_route/route.rs index 093383fb39f4b1cfba311c69f7221158d784e671..c6cc32655ce983399e15def9174f490518ff385c 100644 --- a/src/portal_route/route.rs +++ b/src/datamgr_route/route.rs @@ -1,4 +1,4 @@ -use crate::portal_route::portal_api; +use crate::datamgr_route::datamgr_api; use std::ffi::CString; use std::ffi::CStr; use std::os::raw::c_char; @@ -79,7 +79,7 @@ impl DataApiRouteProvider { Err(_) => return HttpResponse::BadRequest().body("Invalid file description"), }; unsafe { - let ret = portal_api::UploadFile( + let ret = datamgr_api::UploadFile( DATA_PLUGIN_MANAGER, file_name.as_ptr(), file_content.as_ptr() as *const i8, @@ -115,12 +115,12 @@ impl DataApiRouteProvider { }; unsafe { - let ret = portal_api::UploadStatus( + let ret = datamgr_api::UploadStatus( DATA_PLUGIN_MANAGER, status.as_ptr() ); if ret == 1 { - HttpResponse::Ok().bodu("Upload status success") + HttpResponse::Ok().body("Upload status success") } else { HttpResponse::InternalServerError().finish() } @@ -148,7 +148,7 @@ impl DataApiRouteProvider { }; unsafe { - let ret = portal_api::UploadInstruction( + let ret = datamgr_api::UploadInstruction( DATA_PLUGIN_MANAGER, instruction.as_ptr() ); @@ -183,7 +183,7 @@ impl DataApiRouteProvider { unsafe { let mut file_length: i32 = 0; - let ret = portal_api::DownloadFile( + let ret = datamgr_api::DownloadFile( DATA_PLUGIN_MANAGER, file_name.as_ptr(), &mut file_length @@ -201,7 +201,7 @@ impl DataApiRouteProvider { fn list_file_handler(request: HttpRequest, body: Bytes) -> HttpResponse { unsafe { let mut index_count: i32 = 0; - let ret = portal_api::ListFiles(DATA_PLUGIN_MANAGER, &mut index_count); + let ret = datamgr_api::ListFiles(DATA_PLUGIN_MANAGER, &mut index_count); let c_array = ret as *const *const c_char; let mut vec = Vec::new(); for i in 0..index_count { @@ -245,7 +245,7 @@ impl DataApiRouteProvider { unsafe { let mut index_count: i32 = 0; - let ret = portal_api::QueryFile( + let ret = datamgr_api::QueryFile( DATA_PLUGIN_MANAGER, file_name.as_ptr(), &mut index_count @@ -282,6 +282,249 @@ impl DataApiRouteProvider { .body(json_res) } } + + fn receive_normal_data_handler(request: HttpRequest, body: Bytes) -> HttpResponse { + unsafe { + println!("receive_normal_data_handler"); + let header_key = request + .headers() + .get("x-data-key") + .unwrap() + .to_str() + .unwrap_or_default() + .to_string(); + let key = CString::new(header_key).unwrap(); + let size_str = request + .headers() + .get("x-data-size") + .unwrap() + .to_str() + .unwrap_or_default() + .to_string(); + let size = size_str.parse::().unwrap(); + let mut buffer = body.clone().to_vec(); + let c_buffer = buffer.as_mut_ptr() as *mut c_char; + let ret = datamgr_api::ReceiveNormalData( + DATA_PLUGIN_MANAGER, + key.as_ptr(), + c_buffer, + size, + ); + HttpResponse::Ok() + .append_header(("x-data-size", ret)) + .finish() + } + } + + fn set_sync_and_recycle_strategy_handler(request: HttpRequest, body: Bytes) -> HttpResponse { + unsafe { + println!("set_sync_and_recycle_strategy_handler"); + let header_key = request + .headers() + .get("x-data-key") + .unwrap() + .to_str() + .unwrap_or_default() + .to_string(); + let key = CString::new(header_key).unwrap(); + let header_sync_strategy = request + .headers() + .get("x-data-sync-strategy") + .unwrap() + .to_str() + .unwrap_or_default() + .to_string(); + let sync_strategy = CString::new(header_sync_strategy).unwrap(); + let header_recycle_time = request + .headers() + .get("x-data-recycle-time") + .unwrap() + .to_str() + .unwrap_or_default() + .to_string(); + let recycle_time = CString::new(header_recycle_time).unwrap(); + let header_recycle_cascade_keys = request + .headers() + .get("x-data-recycle-cascade-keys") + .unwrap() + .to_str() + .unwrap_or_default() + .to_string(); + let recycle_cascade_keys = CString::new(header_recycle_cascade_keys).unwrap(); + + let ret = datamgr_api::SetSyncAndRecycleStrategy( + DATA_PLUGIN_MANAGER, + key.as_ptr(), + sync_strategy.as_ptr(), + recycle_time.as_ptr(), + recycle_cascade_keys.as_ptr(), + ); + if ret == 1 { + // HttpResponse::Ok().finish() + } else { + // HttpResponse::InternalServerError().finish() + } + HttpResponse::Ok().finish() + } + } + + fn submit_user_request_handler(request: HttpRequest, body: Bytes) -> HttpResponse { + unsafe { + println!("submit_user_request_handler"); + let header_key = request + .headers() + .get("x-data-key") + .unwrap() + .to_str() + .unwrap_or_default() + .to_string(); + let key = CString::new(header_key).unwrap(); + let size_str = request + .headers() + .get("x-data-size") + .unwrap() + .to_str() + .unwrap_or_default() + .to_string(); + let size = size_str.parse::().unwrap(); + let mut buffer = body.clone().to_vec(); + let c_buffer = buffer.as_mut_ptr() as *mut c_char; + let ret = datamgr_api::SubmitUserRequest( + DATA_PLUGIN_MANAGER, + key.as_ptr(), + c_buffer, + size, + ); + HttpResponse::Ok() + .append_header(("x-data-size", ret)) + .finish() + } + } + + fn find_data_location_handler(request: HttpRequest, body: Bytes) -> HttpResponse { + unsafe { + println!("find_data_location_handler"); + let header_key = request + .headers() + .get("x-data-key") + .unwrap() + .to_str() + .unwrap_or_default() + .to_string(); + let key = CString::new(header_key).unwrap(); + let size = 1024; + let mut buffer = body.clone().to_vec(); + let c_buffer = buffer.as_mut_ptr() as *mut c_char; + let ret = datamgr_api::FindDataLocation( + DATA_PLUGIN_MANAGER, + key.as_ptr(), + c_buffer, + size, + ); + HttpResponse::Ok() + .append_header(("x-data-location", buffer[0..ret as usize].to_vec().clone())) + .finish() + } + } + + fn read_data_handler(request: HttpRequest, body: Bytes) -> HttpResponse { + unsafe { + println!("read_data_handler"); + let header_key = request + .headers() + .get("x-data-key") + .unwrap() + .to_str() + .unwrap_or_default() + .to_string(); + let key = CString::new(header_key).unwrap(); + let size_str = request + .headers() + .get("x-data-size") + .unwrap() + .to_str() + .unwrap_or_default() + .to_string(); + let size = size_str.parse::().unwrap(); + let mut buffer: Vec = vec![0; size as usize]; + let c_buffer = buffer.as_mut_ptr() as *mut c_char; + let ret = datamgr_api::ReadData( + DATA_PLUGIN_MANAGER, + key.as_ptr(), + c_buffer, + size, + ); + HttpResponse::Ok() + .append_header(("x-data-size", ret)) + .body(buffer[0..ret as usize].to_vec().clone()) + } + } + + fn register_terminal_handler(request: HttpRequest, body: Bytes) -> HttpResponse { + unsafe { + println!("register_terminal_handler"); + let header_user_token = request + .headers() + .get("x-data-user-token") + .unwrap() + .to_str() + .unwrap_or_default() + .to_string(); + let user_token = CString::new(header_user_token).unwrap(); + let size_str = request + .headers() + .get("x-data-user-data-size") + .unwrap() + .to_str() + .unwrap_or_default() + .to_string(); + let size = size_str.parse::().unwrap(); + let mut buffer = body.clone().to_vec(); + let c_buffer = buffer.as_mut_ptr() as *mut c_char; + let ret = datamgr_api::RegisterTerminal( + DATA_PLUGIN_MANAGER, + user_token.as_ptr(), + c_buffer, + size, + ); + HttpResponse::Ok() + .append_header(("x-data-user-data-size", ret)) + .finish() + } + } + + fn get_terminal_info_handler(request: HttpRequest, body: Bytes) -> HttpResponse { + unsafe { + println!("get_terminal_info_handler"); + let header_user_token = request + .headers() + .get("x-data-user-token") + .unwrap() + .to_str() + .unwrap_or_default() + .to_string(); + let user_token = CString::new(header_user_token).unwrap(); + let size_str = request + .headers() + .get("x-data-user-data-size") + .unwrap() + .to_str() + .unwrap_or_default() + .to_string(); + let size = size_str.parse::().unwrap(); + let mut buffer: Vec = vec![0; size as usize]; + let c_buffer = buffer.as_mut_ptr() as *mut c_char; + let ret = datamgr_api::GetTerminalInfo( + DATA_PLUGIN_MANAGER, + user_token.as_ptr(), + c_buffer, + size, + ); + HttpResponse::Ok() + .append_header(("x-data-user-data-size", ret)) + .body(buffer[0..ret as usize].to_vec().clone()) + } + } } impl CustomRouteProvider for DataApiRouteProvider { @@ -317,6 +560,41 @@ impl CustomRouteProvider for DataApiRouteProvider { path: "/data/self/fileinfo".to_string(), handler: Self::query_file_handler, }), + Box::new(SimpleRoute { + method: Method::POST, + path: "/data/v1/normal".to_string(), + handler: Self::receive_normal_data_handler, + }), + Box::new(SimpleRoute { + method: Method::POST, + path: "/data/v1/strategy".to_string(), + handler: Self::set_sync_and_recycle_strategy_handler, + }), + Box::new(SimpleRoute { + method: Method::POST, + path: "/data/v1/request".to_string(), + handler: Self::submit_user_request_handler, + }), + Box::new(SimpleRoute { + method: Method::HEAD, + path: "/data/v1/intelligence".to_string(), + handler: Self::find_data_location_handler, + }), + Box::new(SimpleRoute { + method: Method::GET, + path: "/data/v1/intelligence".to_string(), + handler: Self::read_data_handler, + }), + Box::new(SimpleRoute { + method: Method::POST, + path: "/data/v1/terminal".to_string(), + handler: Self::register_terminal_handler, + }), + Box::new(SimpleRoute { + method: Method::GET, + path: "/data/v1/terminal".to_string(), + handler: Self::get_terminal_info_handler, + }), ] } } diff --git a/src/lib.rs b/src/lib.rs index 9483d2910256bf5fbd819d44ab6d59e27b8a290f..c7cdad95426e1a3367a84fb38113df0770a11f12 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -9,7 +9,7 @@ pub mod cores; pub mod schema; pub mod db; pub mod custom_route; -pub mod portal_route; +pub mod datamgr_route; pub use cores::{prepare_app_state, start_server}; pub use cores::events::APIServerEventClient; diff --git a/tests/portal_test.rs b/tests/datamgr_test.rs similarity index 86% rename from tests/portal_test.rs rename to tests/datamgr_test.rs index 8fe189c6135d91bb6d00fd2026284d0c3f92bee1..17f9e7f25888e80a2a903e4720f48b9a962f7d1e 100644 --- a/tests/portal_test.rs +++ b/tests/datamgr_test.rs @@ -6,8 +6,8 @@ use std::sync::Arc; use std::sync::Mutex; use std::thread; use serde_json::Value; -use fleet_apiserver::portal_route::portal_api; -use fleet_apiserver::portal_route::route; +use fleet_apiserver::datamgr_route::datamgr_api; +use fleet_apiserver::datamgr_route::route; use fleet_apiserver::cores::plugin::PluginManager; const DATABASE_URL: &str = "sqlite://./test-database.sqlite"; @@ -23,27 +23,27 @@ extern "C" {} #[tokio::test] -async fn test_portal() -> Result<(), Box> { +async fn test_datamgr() -> Result<(), Box> { unsafe { let plugin_manager = Arc::new(PluginManager::new()); - let data_plugin_manager = Arc::new(Mutex::new(SafePtr(portal_api::NewPluginManager()))); + let data_plugin_manager = Arc::new(Mutex::new(SafePtr(datamgr_api::NewPluginManager()))); // portal-plugin.so 及 storage-plugin.so 的位置 - let plugin_file_path = std::ffi::CString::new("/home/trickster/Downloads/ripple-remastered/plugins/release").unwrap(); + let plugin_file_path = std::ffi::CString::new("/root/project/fleet-datamgr/plugins/release").unwrap(); let plugin_manager = plugin_manager.clone(); let data_plugin_manager = Arc::clone(&data_plugin_manager); let server_handle = thread::spawn(move || { let rt = Runtime::new().unwrap(); rt.block_on(async { - portal_api::LoadPluginsFromDirectory(data_plugin_manager.lock().unwrap().0, plugin_file_path.as_ptr()); + datamgr_api::LoadPluginsFromDirectory(data_plugin_manager.lock().unwrap().0, plugin_file_path.as_ptr()); route::init_plugin(plugin_manager.clone(), data_plugin_manager.lock().unwrap().0); if let Err(e) = fleet_apiserver::start_server(DATABASE_URL, ADDRESS, plugin_manager).await { eprintln!("Failed to start server: {}", e); } - portal_api::UnloadAllPlugins(data_plugin_manager.lock().unwrap().0); - portal_api::DeletePluginManager(data_plugin_manager.lock().unwrap().0); + datamgr_api::UnloadAllPlugins(data_plugin_manager.lock().unwrap().0); + datamgr_api::DeletePluginManager(data_plugin_manager.lock().unwrap().0); }); });