Add retrieve by tx_id in owner_api

This commit is contained in:
Quentin Le Sceller 2018-11-12 19:18:54 +01:00
parent 1b65738504
commit 1b264595e3
No known key found for this signature in database
GPG key ID: 76248AC90C33D34F
9 changed files with 49 additions and 30 deletions

View file

@ -189,8 +189,9 @@ Return whether the outputs were validated against a node and an array of TxLogEn
* **URL**
*/v1/wallet/owner/retrieve_txs
*/v1/wallet/owner/retrieve_txs?refresh?id=x
* /v1/wallet/owner/retrieve_txs
* /v1/wallet/owner/retrieve_txs?refresh&id=x
* /v1/wallet/owner/retrieve_txs?tx_id=x
* **Method:**
@ -200,8 +201,9 @@ Return whether the outputs were validated against a node and an array of TxLogEn
**Optional:**
`refresh` to refresh from node
`tx_id=[number]` to retrieve only the specified output
* `refresh` to refresh from node
* `id=[number]` to retrieve only the specified output by id
* `tx_id=[string]` to retrieve only the specified output by tx id
* **Data Params**

View file

@ -524,7 +524,7 @@ pub fn wallet_command(wallet_args: &ArgMatches, config: GlobalWalletConfig) -> i
},
};
let (height, _) = api.node_height()?;
let (validated, txs) = api.retrieve_txs(true, tx_id)?;
let (validated, txs) = api.retrieve_txs(true, tx_id, None)?;
let include_status = !tx_id.is_some();
display::txs(
account,

View file

@ -22,6 +22,7 @@ use std::io::{Read, Write};
use std::marker::PhantomData;
use std::sync::Arc;
use util::Mutex;
use uuid::Uuid;
use serde_json as json;
@ -102,6 +103,7 @@ where
&self,
refresh_from_node: bool,
tx_id: Option<u32>,
tx_slate_id: Option<Uuid>,
) -> Result<(bool, Vec<TxLogEntry>), Error> {
let mut w = self.wallet.lock();
w.open_with_credentials()?;
@ -114,7 +116,7 @@ where
let res = Ok((
validated,
updater::retrieve_txs(&mut *w, tx_id, &parent_key_id)?,
updater::retrieve_txs(&mut *w, tx_id, tx_slate_id, &parent_key_id)?,
));
w.close()?;

View file

@ -198,7 +198,8 @@ where
req: &Request<Body>,
api: APIOwner<T, C, K>,
) -> Result<(bool, Vec<TxLogEntry>), Error> {
let mut id = None;
let mut tx_id = None;
let mut tx_slate_id = None;
let mut update_from_node = false;
let params = parse_params(req);
@ -208,10 +209,15 @@ where
}
if let Some(ids) = params.get("id") {
for i in ids {
id = Some(i.parse().unwrap());
tx_id = Some(i.parse().unwrap());
}
}
api.retrieve_txs(update_from_node, id)
if let Some(tx_slate_ids) = params.get("tx_id") {
for i in tx_slate_ids {
tx_slate_id = Some(i.parse().unwrap());
}
}
api.retrieve_txs(update_from_node, tx_id, tx_slate_id)
}
fn dump_stored_tx(

View file

@ -160,7 +160,7 @@ where
C: WalletClient,
K: Keychain,
{
let tx_vec = updater::retrieve_txs(wallet, Some(tx_id), &parent_key_id)?;
let tx_vec = updater::retrieve_txs(wallet, Some(tx_id), None, &parent_key_id)?;
if tx_vec.len() != 1 {
return Err(ErrorKind::TransactionDoesntExist(tx_id))?;
}
@ -190,7 +190,7 @@ where
C: WalletClient,
K: Keychain,
{
let tx_vec = updater::retrieve_txs(wallet, Some(tx_id), parent_key_id)?;
let tx_vec = updater::retrieve_txs(wallet, Some(tx_id), None, parent_key_id)?;
if tx_vec.len() != 1 {
return Err(ErrorKind::TransactionDoesntExist(tx_id))?;
}

View file

@ -17,6 +17,7 @@
use failure::ResultExt;
use std::collections::HashMap;
use uuid::Uuid;
use core::consensus::reward;
use core::core::{Output, TxKernel};
@ -80,6 +81,7 @@ where
pub fn retrieve_txs<T: ?Sized, C, K>(
wallet: &mut T,
tx_id: Option<u32>,
tx_slate_id: Option<Uuid>,
parent_key_id: &Identifier,
) -> Result<Vec<TxLogEntry>, Error>
where
@ -95,6 +97,13 @@ where
} else {
vec![]
}
} else if tx_slate_id.is_some() {
let tx = wallet.tx_log_iter().find(|t| t.tx_slate_id == tx_slate_id);
if let Some(t) = tx {
vec![t]
} else {
vec![]
}
} else {
wallet
.tx_log_iter()

View file

@ -134,7 +134,7 @@ fn accounts_test_impl(test_dir: &str) -> Result<(), libwallet::Error> {
assert_eq!(wallet1_info.total, 5 * reward);
assert_eq!(wallet1_info.amount_currently_spendable, (5 - cm) * reward);
// check tx log as well
let (_, txs) = api.retrieve_txs(true, None)?;
let (_, txs) = api.retrieve_txs(true, None, None)?;
assert_eq!(txs.len(), 5);
Ok(())
})?;
@ -153,7 +153,7 @@ fn accounts_test_impl(test_dir: &str) -> Result<(), libwallet::Error> {
assert_eq!(wallet1_info.total, 7 * reward);
assert_eq!(wallet1_info.amount_currently_spendable, 7 * reward);
// check tx log as well
let (_, txs) = api.retrieve_txs(true, None)?;
let (_, txs) = api.retrieve_txs(true, None, None)?;
assert_eq!(txs.len(), 7);
Ok(())
})?;
@ -172,7 +172,7 @@ fn accounts_test_impl(test_dir: &str) -> Result<(), libwallet::Error> {
assert_eq!(wallet1_info.total, 0,);
assert_eq!(wallet1_info.amount_currently_spendable, 0,);
// check tx log as well
let (_, txs) = api.retrieve_txs(true, None)?;
let (_, txs) = api.retrieve_txs(true, None, None)?;
assert_eq!(txs.len(), 0);
Ok(())
})?;
@ -200,7 +200,7 @@ fn accounts_test_impl(test_dir: &str) -> Result<(), libwallet::Error> {
let (wallet1_refreshed, wallet1_info) = api.retrieve_summary_info(true)?;
assert!(wallet1_refreshed);
assert_eq!(wallet1_info.last_confirmed_height, 13);
let (_, txs) = api.retrieve_txs(true, None)?;
let (_, txs) = api.retrieve_txs(true, None, None)?;
assert_eq!(txs.len(), 9);
Ok(())
})?;
@ -215,7 +215,7 @@ fn accounts_test_impl(test_dir: &str) -> Result<(), libwallet::Error> {
assert_eq!(wallet1_info.last_confirmed_height, 12);
let (_, wallet1_info) = api.retrieve_summary_info(true)?;
assert_eq!(wallet1_info.last_confirmed_height, 13);
let (_, txs) = api.retrieve_txs(true, None)?;
let (_, txs) = api.retrieve_txs(true, None, None)?;
println!("{:?}", txs);
assert_eq!(txs.len(), 5);
Ok(())
@ -226,7 +226,7 @@ fn accounts_test_impl(test_dir: &str) -> Result<(), libwallet::Error> {
let (wallet2_refreshed, wallet2_info) = api.retrieve_summary_info(true)?;
assert!(wallet2_refreshed);
assert_eq!(wallet2_info.last_confirmed_height, 13);
let (_, txs) = api.retrieve_txs(true, None)?;
let (_, txs) = api.retrieve_txs(true, None, None)?;
assert_eq!(txs.len(), 1);
Ok(())
})?;
@ -244,7 +244,7 @@ fn accounts_test_impl(test_dir: &str) -> Result<(), libwallet::Error> {
assert_eq!(wallet2_info.total, 0,);
assert_eq!(wallet2_info.amount_currently_spendable, 0,);
// check tx log as well
let (_, txs) = api.retrieve_txs(true, None)?;
let (_, txs) = api.retrieve_txs(true, None, None)?;
assert_eq!(txs.len(), 0);
Ok(())
})?;

View file

@ -136,14 +136,14 @@ fn compare_wallet_restore(
// Overall wallet info should be the same
wallet::controller::owner_single_use(wallet_source.clone(), |api| {
src_info = Some(api.retrieve_summary_info(true)?.1);
src_txs = Some(api.retrieve_txs(true, None)?.1);
src_txs = Some(api.retrieve_txs(true, None, None)?.1);
src_accts = Some(api.accounts()?);
Ok(())
})?;
wallet::controller::owner_single_use(wallet_dest.clone(), |api| {
dest_info = Some(api.retrieve_summary_info(true)?.1);
dest_txs = Some(api.retrieve_txs(true, None)?.1);
dest_txs = Some(api.retrieve_txs(true, None, None)?.1);
dest_accts = Some(api.accounts()?);
Ok(())
})?;

View file

@ -118,7 +118,7 @@ fn basic_transaction_api(test_dir: &str) -> Result<(), libwallet::Error> {
// Check transaction log for wallet 1
wallet::controller::owner_single_use(wallet1.clone(), |api| {
let (_, wallet1_info) = api.retrieve_summary_info(true)?;
let (refreshed, txs) = api.retrieve_txs(true, None)?;
let (refreshed, txs) = api.retrieve_txs(true, None, None)?;
assert!(refreshed);
let fee = wallet::libtx::tx_fee(
wallet1_info.last_confirmed_height as usize - cm as usize,
@ -139,7 +139,7 @@ fn basic_transaction_api(test_dir: &str) -> Result<(), libwallet::Error> {
// Check transaction log for wallet 2
wallet::controller::owner_single_use(wallet2.clone(), |api| {
let (refreshed, txs) = api.retrieve_txs(true, None)?;
let (refreshed, txs) = api.retrieve_txs(true, None, None)?;
assert!(refreshed);
// we should have a transaction entry for this slate
let tx = txs.iter().find(|t| t.tx_slate_id == Some(slate.id));
@ -185,7 +185,7 @@ fn basic_transaction_api(test_dir: &str) -> Result<(), libwallet::Error> {
assert_eq!(wallet1_info.amount_immature, cm * reward + fee);
// check tx log entry is confirmed
let (refreshed, txs) = api.retrieve_txs(true, None)?;
let (refreshed, txs) = api.retrieve_txs(true, None, None)?;
assert!(refreshed);
let tx = txs.iter().find(|t| t.tx_slate_id == Some(slate.id));
assert!(tx.is_some());
@ -221,7 +221,7 @@ fn basic_transaction_api(test_dir: &str) -> Result<(), libwallet::Error> {
assert_eq!(wallet2_info.amount_currently_spendable, amount);
// check tx log entry is confirmed
let (refreshed, txs) = api.retrieve_txs(true, None)?;
let (refreshed, txs) = api.retrieve_txs(true, None, None)?;
assert!(refreshed);
let tx = txs.iter().find(|t| t.tx_slate_id == Some(slate.id));
assert!(tx.is_some());
@ -249,7 +249,7 @@ fn basic_transaction_api(test_dir: &str) -> Result<(), libwallet::Error> {
wallet::controller::owner_single_use(wallet1.clone(), |sender_api| {
let (refreshed, _wallet1_info) = sender_api.retrieve_summary_info(true)?;
assert!(refreshed);
let (_, txs) = sender_api.retrieve_txs(true, None)?;
let (_, txs) = sender_api.retrieve_txs(true, None, None)?;
// find the transaction
let tx = txs
@ -276,7 +276,7 @@ fn basic_transaction_api(test_dir: &str) -> Result<(), libwallet::Error> {
assert_eq!(wallet2_info.amount_currently_spendable, amount * 3);
// check tx log entry is confirmed
let (refreshed, txs) = api.retrieve_txs(true, None)?;
let (refreshed, txs) = api.retrieve_txs(true, None, None)?;
assert!(refreshed);
let tx = txs.iter().find(|t| t.tx_slate_id == Some(slate.id));
assert!(tx.is_some());
@ -346,7 +346,7 @@ fn tx_rollback(test_dir: &str) -> Result<(), libwallet::Error> {
wallet1_info.last_confirmed_height
);
assert!(refreshed);
let (_, txs) = api.retrieve_txs(true, None)?;
let (_, txs) = api.retrieve_txs(true, None, None)?;
// we should have a transaction entry for this slate
let tx = txs.iter().find(|t| t.tx_slate_id == Some(slate.id));
assert!(tx.is_some());
@ -371,7 +371,7 @@ fn tx_rollback(test_dir: &str) -> Result<(), libwallet::Error> {
// Check transaction log for wallet 2
wallet::controller::owner_single_use(wallet2.clone(), |api| {
let (refreshed, txs) = api.retrieve_txs(true, None)?;
let (refreshed, txs) = api.retrieve_txs(true, None, None)?;
assert!(refreshed);
let mut unconfirmed_count = 0;
let tx = txs.iter().find(|t| t.tx_slate_id == Some(slate.id));
@ -400,7 +400,7 @@ fn tx_rollback(test_dir: &str) -> Result<(), libwallet::Error> {
// can't roll back coinbase
let res = api.cancel_tx(1);
assert!(res.is_err());
let (_, txs) = api.retrieve_txs(true, None)?;
let (_, txs) = api.retrieve_txs(true, None, None)?;
let tx = txs
.iter()
.find(|t| t.tx_slate_id == Some(slate.id))
@ -427,7 +427,7 @@ fn tx_rollback(test_dir: &str) -> Result<(), libwallet::Error> {
// Wallet 2 rolls back
wallet::controller::owner_single_use(wallet2.clone(), |api| {
let (_, txs) = api.retrieve_txs(true, None)?;
let (_, txs) = api.retrieve_txs(true, None, None)?;
let tx = txs
.iter()
.find(|t| t.tx_slate_id == Some(slate.id))