diff --git a/src/database/db.rs b/src/database/db.rs index c91849c..47729e7 100644 --- a/src/database/db.rs +++ b/src/database/db.rs @@ -1,6 +1,6 @@ // sled db to store and fetch scenarios use crate::database::decode::decompress_string; -use crate::database::types::Urldata; +use crate::database::types::{TxInfo, Urldata}; use crate::error::Error as CrateError; use crate::scenarios::scenario_parse::generate_random_id; use crate::scenarios::scenario_types::Graph; @@ -36,10 +36,41 @@ pub struct Loghandler {} /// Polodb impl Loghandler { + /// read the logs.db pub fn read_db(&self) -> Result { let open: PoloDB = PoloDB::open_file("logs.db")?; return Ok(open); } + /// insert transaction to the Mempool + pub fn insert_tx( + &self, + scenario_id: String, + amount: String, + chain: String, + txType: String, + ) -> Result<(), Error> { + let db = self.read_db()?; + let tx_pool = format!("{}_txpool", scenario_id); + let collection = db.collection::(tx_pool.as_str()); + collection.insert_one(TxInfo { + amount: amount, + chain: chain, + txType: txType, + Date: "".to_string(), + })?; + Ok(()) + } + + /// get mempool for scenarioid + pub fn get_transactions(&self, scenario_id: String) -> Result, Error> { + let db = self.read_db()?; + let tx_pool = format!("{}_txpool", scenario_id); + + let collection = db.collection::(tx_pool.as_str()); + let entries = collection.find(None)?; // return all entries under parent key + let listan: Vec = entries.into_iter().map(|entry| entry.unwrap()).collect(); + Ok(listan) + } /// insert a log into the log files pub fn insert_logs(&self, scenario_id: String, message: String) -> Result<(), Error> { diff --git a/src/database/types.rs b/src/database/types.rs index 34884d2..4c5f2be 100644 --- a/src/database/types.rs +++ b/src/database/types.rs @@ -14,6 +14,19 @@ pub struct UrlResponse { pub shortUrl: String, } +#[derive(Debug, Deserialize, Serialize, Clone)] +pub struct TxQueue { + pub mempool: Vec, +} + +#[derive(Debug, Deserialize, Serialize, Clone)] +pub struct TxInfo { + pub chain: String, + pub amount: String, + pub txType: String, + pub Date: String, +} + #[derive(Debug, Deserialize, Serialize)] pub struct job_start { pub scenario_id: String, diff --git a/src/jobs/jobs.rs b/src/jobs/jobs.rs index 3003582..80dfa4d 100644 --- a/src/jobs/jobs.rs +++ b/src/jobs/jobs.rs @@ -60,19 +60,50 @@ pub async fn start_job_worker(scenario_id: String, delay: u64) -> Result<(), Err MultiNodes::Action(chain_node) => { let form_me = chain_node.clone().formData.expect(""); let txtype = form_me.action.expect("could not get tx type"); - let s_chain = form_me.actionData.clone().expect("could not get source.chain").source.chain; - let d_chain = form_me.actionData.clone().expect("could not get target.chain").target.chain; - let s_address = form_me.actionData.clone().expect("could not get source.address").source.address; - let d_address = form_me.actionData.clone().expect("could not get target address").target.address.expect("target address problem"); + let s_chain = form_me + .actionData + .clone() + .expect("could not get source.chain") + .source + .chain; + let d_chain = form_me + .actionData + .clone() + .expect("could not get target.chain") + .target + .chain; + let s_address = form_me + .actionData + .clone() + .expect("could not get source.address") + .source + .address; + let d_address = form_me + .actionData + .clone() + .expect("could not get target address") + .target + .address + .expect("target address problem"); - let d_amount = form_me.actionData.clone().expect("could not get source.amount").source.amount; - let s_assetid = form_me.actionData.clone().expect("could not get assetid").source.assetId.expect("no assetid").to_string(); - let log_entry_go = format!( - "Drafting {} tx from {} to {}", - txtype, s_chain, d_chain - ); - println!("Log entry go: {:?}", log_entry_go); - log_db.insert_logs(scenario_id.clone(), log_entry_go.clone())?; + let d_amount = form_me + .actionData + .clone() + .expect("could not get source.amount") + .source + .amount; + let s_assetid = form_me + .actionData + .clone() + .expect("could not get assetid") + .source + .assetId + .expect("no assetid") + .to_string(); + let log_entry_go = + format!("Drafting {} tx from {} to {}", txtype, s_chain, d_chain); + println!("Log entry go: {:?}", log_entry_go); + log_db.insert_logs(scenario_id.clone(), log_entry_go.clone())?; // let s_chain = chain_node.source_chain.clone(); // let d_chain = chain_node.dest_chain.clone(); @@ -80,11 +111,12 @@ pub async fn start_job_worker(scenario_id: String, delay: u64) -> Result<(), Err // let s_assetid = chain_node.assetid.clone(); // let d_address = chain_node.dest_address.clone(); // let tx_response: String = - let tx_response = match generate_tx(s_chain, d_chain, d_amount, s_assetid, d_address).await { - Ok(value) => value.txdata, // if all good return the txdata - _ => "Could not generate transaction".to_string(), - }; - log_db.insert_logs(scenario_id.clone(), tx_response.clone())?; + let tx_response = + match generate_tx(s_chain, d_chain, d_amount, s_assetid, d_address).await { + Ok(value) => value.txdata, // if all good return the txdata + _ => "Could not generate transaction".to_string(), + }; + log_db.insert_logs(scenario_id.clone(), tx_response.clone())?; println!("Action node: {:?}", chain_node); log_db diff --git a/src/routes.rs b/src/routes.rs index 1235d39..68f240c 100644 --- a/src/routes.rs +++ b/src/routes.rs @@ -3,7 +3,7 @@ use crate::database::db::{DBhandler, Loghandler}; use crate::database::decode::decompress_string; use crate::database::types::{ job_start, BroadcastInput, BroadcastStatus, GenericOut, GetUrlResponse, LogsOut, ScenarioInfo, - ScenarioInfoOut, UrlResponse, Urldata, + ScenarioInfoOut, TxInfo, TxQueue, UrlResponse, Urldata, }; use crate::jobs::threads::{thread_status, ThreadManager}; // ThreadInfo use crate::scenarios::scenario_parse::{multi_scenario_info, scenario_information}; @@ -116,6 +116,22 @@ pub async fn start_job( }); } +/// Threadbags mempool +#[post("/scenario/tx")] +pub async fn scenario_transactions( + data: web::Json, + db: web::Data, +) -> web::Json { + let scenario_id = data.into_inner().id; + + let output: Vec = match db.into_inner().get_transactions(scenario_id) { + Ok(value) => value.into_iter().map(|entry| entry).collect(), + _ => Vec::new(), + }; + + return web::Json(TxQueue { mempool: output }); +} + /* curl -X POST -H "Content-Type: application/json" -d '{"id": "H!Xz6LWvg"}' http://localhost:8081/scenario/info -v {"success":true,"result":[{"source_chain":"polkadot","source_address":"5GdvmQtUwByTt6Vkx41vtWvg5guyaH3BL2yn6iamg1RViiKD","dest_chain":"assetHub","dest_address":"5D7RT7vqgZKUoKxrPMihNeXBzhrmWjd5meprfUFhtrULJ4ng","assetid":"0","amount":"1","txtype":"swap","tx":"not set"},{"source_chain":"assetHub","source_address":"5D7RT7vqgZKUoKxrPMihNeXBzhrmWjd5meprfUFhtrULJ4ng","dest_chain":"hydraDx","dest_address":"5D7RT7vqgZKUoKxrPMihNeXBzhrmWjd5meprfUFhtrULJ4ng","assetid":"3","amount":"2","txtype":"swap","tx":"not set"},{"source_chain":"hydraDx","source_address":"5D7RT7vqgZKUoKxrPMihNeXBzhrmWjd5meprfUFhtrULJ4ng","dest_chain":"hydraDx","dest_address":"5D7RT7vqgZKUoKxrPMihNeXBzhrmWjd5meprfUFhtrULJ4ng","assetid":"5","amount":"2","txtype":"swap","tx":"not set"}]}