taler-rust

GNU Taler code in Rust. Largely core banking integrations.
Log | Files | Refs | Submodules | README | LICENSE

commit a3d34059da4b5d067acd7673e18ffae7ca229488
parent 8ac0bdbd74316b5f6957f40114c90a0b38c269e0
Author: Antoine A <>
Date:   Tue, 30 Dec 2025 19:44:22 +0100

common: refactoring and dependencies update

Diffstat:
MCargo.toml | 5+++++
Mtaler-cyclos/Cargo.toml | 6+-----
Mtaler-cyclos/src/api.rs | 19+++++++++++++------
Mtaler-cyclos/src/bin/cyclos-harness.rs | 14++++++--------
Mtaler-cyclos/src/config.rs | 8++++----
Mtaler-cyclos/src/db.rs | 130+++++++++++++++++++++++++++++++++++++-------------------------------------------
Mtaler-cyclos/src/main.rs | 2+-
Mtaler-cyclos/tests/api.rs | 1-
Mtaler-magnet-bank/Cargo.toml | 6++----
Mtaler-magnet-bank/src/api.rs | 15+++++++++++++--
Mtaler-magnet-bank/src/bin/magnet-bank-harness.rs | 31++++++++++++-------------------
Mtaler-magnet-bank/src/db.rs | 103++++++++++++++++++++++++++++++++++++++++---------------------------------------
12 files changed, 169 insertions(+), 171 deletions(-)

diff --git a/Cargo.toml b/Cargo.toml @@ -60,3 +60,8 @@ ed25519-dalek = { version = "2.1.1", default-features = false, features = [ ] } rand_core = { version = "0.6.4" } compact_str = { version = "0.9.0", features = ["serde", "sqlx-postgres"] } +reqwest = { version = "0.13", default-features = false, features = [ + "json", + "rustls", + "query" +] } diff --git a/taler-cyclos/Cargo.toml b/taler-cyclos/Cargo.toml @@ -9,11 +9,7 @@ repository.workspace = true license-file.workspace = true [dependencies] -reqwest = { version = "0.12", default-features = false, features = [ - "json", - "rustls-tls", - "stream", -] } +reqwest = { workspace = true, features = ["stream"] } sqlx.workspace = true serde_json = { workspace = true, features = ["raw_value"] } jiff = { workspace = true, features = ["serde"] } diff --git a/taler-cyclos/src/api.rs b/taler-cyclos/src/api.rs @@ -37,7 +37,7 @@ use tokio::sync::watch::Sender; use crate::{ FullCyclosPayto, - db::{self, AddIncomingResult, TxInAdmin}, + db::{self, AddIncomingResult, Transfer, TxInAdmin}, }; pub struct CyclosApi { @@ -98,9 +98,14 @@ impl WireGateway for CyclosApi { let creditor = FullCyclosPayto::try_from(&req.credit_account)?; let result = db::make_transfer( &self.pool, - &req, - *creditor.id, - &creditor.name, + &Transfer { + request_uid: req.request_uid, + amount: req.amount.decimal(), + exchange_base_url: req.exchange_base_url, + wtid: req.wtid, + creditor_id: *creditor.id, + creditor_name: creditor.name, + }, &Timestamp::now(), ) .await?; @@ -174,7 +179,8 @@ impl WireGateway for CyclosApi { &TxInAdmin { amount: req.amount.decimal(), subject: format!("Admin incoming {}", req.reserve_pub), - debtor, + debtor_id: *debtor.id, + debtor_name: debtor.name, metadata: IncomingSubject::Reserve(req.reserve_pub), }, &Timestamp::now(), @@ -201,7 +207,8 @@ impl WireGateway for CyclosApi { &TxInAdmin { amount: req.amount.decimal(), subject: format!("Admin incoming KYC:{}", req.account_pub), - debtor, + debtor_id: *debtor.id, + debtor_name: debtor.name, metadata: IncomingSubject::Kyc(req.account_pub), }, &Timestamp::now(), diff --git a/taler-cyclos/src/bin/cyclos-harness.rs b/taler-cyclos/src/bin/cyclos-harness.rs @@ -28,12 +28,11 @@ use taler_common::{ CommonArgs, api_common::{EddsaPublicKey, HashCode, ShortHashCode, rand_edsa_pub_key}, api_params::{History, Page}, - api_wire::{IncomingBankTransaction, TransferRequest, TransferState}, + api_wire::{IncomingBankTransaction, TransferState}, config::Config, taler_main, types::{ - amount::{Amount, Currency, Decimal, decimal}, - payto::payto, + amount::{Currency, Decimal, decimal}, url, }, }; @@ -183,15 +182,14 @@ impl<'a> Harness<'a> { async fn custom_transfer(&self, amount: Decimal, creditor_id: u64, creditor_name: &str) -> u64 { let res = db::make_transfer( self.pool, - &TransferRequest { + &db::Transfer { request_uid: HashCode::rand(), - amount: Amount::new_decimal(&self.currency, amount), + amount, exchange_base_url: url("https://test.com"), wtid: ShortHashCode::rand(), - credit_account: payto("payto://"), + creditor_id, + creditor_name: CompactString::new(creditor_name), }, - creditor_id, - creditor_name, &Timestamp::now(), ) .await diff --git a/taler-cyclos/src/config.rs b/taler-cyclos/src/config.rs @@ -150,7 +150,7 @@ impl SetupCfg { .opt()?, name: main_s.str("NAME").opt()?, host: HostCfg::parse(cfg, &main)?, - currency: main.currency + currency: main.currency, }) } } @@ -168,7 +168,7 @@ pub struct WorkerCfg { impl WorkerCfg { pub fn parse(cfg: &Config) -> Result<Self, ValueErr> { - let main = MainCfg::parse(&cfg)?; + let main = MainCfg::parse(cfg)?; let sect = cfg.section("cyclos-worker"); Ok(Self { frequency: sect.duration("FREQUENCY").require()?, @@ -185,7 +185,7 @@ impl WorkerCfg { .require()?, host: HostCfg::parse(cfg, &main)?, currency: main.currency, - root: main.root + root: main.root, }) } } @@ -194,7 +194,7 @@ impl WorkerCfg { pub struct HarnessCfg { pub worker: WorkerCfg, pub username: String, - pub password: String + pub password: String, } impl HarnessCfg { diff --git a/taler-cyclos/src/db.rs b/taler-cyclos/src/db.rs @@ -18,6 +18,7 @@ use std::fmt::Display; use compact_str::CompactString; use jiff::Timestamp; +use reqwest::Url; use serde::{Serialize, de::DeserializeOwned}; use sqlx::{PgConnection, PgExecutor, PgPool, QueryBuilder, Row, postgres::PgRow}; use taler_api::{ @@ -25,11 +26,12 @@ use taler_api::{ subject::{IncomingSubject, OutgoingSubject}, }; use taler_common::{ + api_common::{HashCode, ShortHashCode}, api_params::{History, Page}, api_revenue::RevenueIncomingBankTransaction, api_wire::{ - IncomingBankTransaction, OutgoingBankTransaction, TransferListStatus, TransferRequest, - TransferState, TransferStatus, + IncomingBankTransaction, OutgoingBankTransaction, TransferListStatus, TransferState, + TransferStatus, }, config::Config, types::{ @@ -175,7 +177,8 @@ impl Display for Initiated { pub struct TxInAdmin { pub amount: Decimal, pub subject: String, - pub debtor: FullCyclosPayto, + pub debtor_id: u64, + pub debtor_name: CompactString, pub metadata: IncomingSubject, } @@ -210,8 +213,8 @@ pub async fn register_tx_in_admin( ) .bind_decimal(&tx.amount) .bind(&tx.subject) - .bind(*tx.debtor.id as i64) - .bind(&tx.debtor.name) + .bind(tx.debtor_id as i64) + .bind(&tx.debtor_name) .bind_timestamp(now) .bind(tx.metadata.ty()) .bind(tx.metadata.key()) @@ -344,27 +347,35 @@ pub enum TransferResult { WtidReuse, } +#[derive(Debug, Clone)] +pub struct Transfer { + pub request_uid: HashCode, + pub amount: Decimal, + pub exchange_base_url: Url, + pub wtid: ShortHashCode, + pub creditor_id: u64, + pub creditor_name: CompactString, +} + pub async fn make_transfer<'a>( db: impl PgExecutor<'a>, - req: &TransferRequest, - creditor_id: u64, - creditor_name: &str, + tx: &Transfer, now: &Timestamp, ) -> sqlx::Result<TransferResult> { - let subject = format!("{} {}", req.wtid, req.exchange_base_url); + let subject = format!("{} {}", tx.wtid, tx.exchange_base_url); sqlx::query( " SELECT out_request_uid_reuse, out_wtid_reuse, out_initiated_row_id, out_initiated_at FROM taler_transfer($1, $2, $3, ($4, $5)::taler_amount, $6, $7, $8, $9) ", ) - .bind(req.request_uid.as_ref()) - .bind(req.wtid.as_ref()) + .bind(tx.request_uid.as_ref()) + .bind(tx.wtid.as_ref()) .bind(&subject) - .bind_amount(&req.amount) - .bind(req.exchange_base_url.as_str()) - .bind(creditor_id as i64) - .bind(creditor_name) + .bind_decimal(&tx.amount) + .bind(tx.exchange_base_url.as_str()) + .bind(tx.creditor_id as i64) + .bind(&tx.creditor_name) .bind_timestamp(now) .try_map(|r: PgRow| { Ok(if r.try_get(0)? { @@ -835,10 +846,9 @@ mod test { use taler_common::{ api_common::{EddsaPublicKey, HashCode, ShortHashCode}, api_params::{History, Page}, - api_wire::{TransferRequest, TransferState}, + api_wire::TransferState, types::{ - amount::{Currency, amount, decimal}, - payto::payto, + amount::{Currency, decimal}, url, utils::now_sql_stable_timestamp, }, @@ -847,10 +857,9 @@ mod test { use crate::{ constants::CONFIG_SOURCE, - cyclos_payto, db::{ self, AddIncomingResult, AddOutgoingResult, BounceResult, ChargebackFailureResult, - TransferResult, TxIn, TxInAdmin, TxOut, TxOutKind, + Transfer, TransferResult, TxIn, TxInAdmin, TxOut, TxOutKind, }, }; @@ -1036,7 +1045,8 @@ mod test { let tx = TxInAdmin { amount: decimal("10"), subject: "subject".to_owned(), - debtor: cyclos_payto("payto://cyclos/localhost/31000163100000000?receiver-name=name"), + debtor_id: 31000163100000000, + debtor_name: "Name".into(), metadata: IncomingSubject::Reserve(EddsaPublicKey::rand()), }; // Insert @@ -1115,17 +1125,14 @@ mod test { assert!(matches!( db::make_transfer( &mut *db, - &TransferRequest { + &Transfer { request_uid: HashCode::rand(), - amount: amount("HUF:10"), + amount: decimal("10"), exchange_base_url: url("https://exchange.test.com/"), wtid: ShortHashCode::rand(), - credit_account: payto( - "payto://cyclos/localhost/31000163100000000?receiver-name=name" - ), + creditor_id: 31000163100000000, + creditor_name: "Name".into() }, - 31000163100000000, - "Name", &now ) .await @@ -1244,18 +1251,19 @@ mod test { Vec::new() ); - let req = TransferRequest { + let req = Transfer { request_uid: HashCode::rand(), - amount: amount("HUF:10"), + amount: decimal("10"), exchange_base_url: url("https://exchange.test.com/"), wtid: ShortHashCode::rand(), - credit_account: payto("payto://iban/HU02162000031000164800000000?receiver-name=name"), + creditor_id: 31000163100000000, + creditor_name: "Name".into(), }; let now = now_sql_stable_timestamp(); let later = now + Span::new().hours(2); // Insert assert_eq!( - db::make_transfer(&mut db, &req, 31000163100000000, "Name", &now) + db::make_transfer(&mut db, &req, &now) .await .expect("transfer"), TransferResult::Success { @@ -1265,7 +1273,7 @@ mod test { ); // Idempotent assert_eq!( - db::make_transfer(&mut db, &req, 31000163100000000, "Name", &later) + db::make_transfer(&mut db, &req, &later) .await .expect("transfer"), TransferResult::Success { @@ -1277,12 +1285,10 @@ mod test { assert_eq!( db::make_transfer( &mut db, - &TransferRequest { + &Transfer { wtid: ShortHashCode::rand(), ..req.clone() }, - 31000163100000000, - "Name", &now ) .await @@ -1293,12 +1299,10 @@ mod test { assert_eq!( db::make_transfer( &mut db, - &TransferRequest { + &Transfer { request_uid: HashCode::rand(), ..req.clone() }, - 31000163100000000, - "Name", &now ) .await @@ -1309,13 +1313,11 @@ mod test { assert_eq!( db::make_transfer( &mut db, - &TransferRequest { + &Transfer { request_uid: HashCode::rand(), wtid: ShortHashCode::rand(), ..req }, - 31000163100000000, - "Name", &later ) .await @@ -1471,17 +1473,14 @@ mod test { // Failure db::make_transfer( &mut db, - &TransferRequest { + &Transfer { request_uid: HashCode::rand(), - amount: amount(format!("{}:1", *CURRENCY)), + amount: decimal("1"), exchange_base_url: url("https://exchange.test.com/"), wtid: ShortHashCode::rand(), - credit_account: payto( - "payto://iban/HU02162000031000164800000000?receiver-name=name", - ), + creditor_id: 31000163100000000, + creditor_name: "Name".into(), }, - 31000163100000000, - "Name", &Timestamp::now(), ) .await @@ -1501,17 +1500,14 @@ mod test { // Success db::make_transfer( &mut db, - &TransferRequest { + &Transfer { request_uid: HashCode::rand(), - amount: amount(format!("{}:2", *CURRENCY)), + amount: decimal("1"), exchange_base_url: url("https://exchange.test.com/"), wtid: ShortHashCode::rand(), - credit_account: payto( - "payto://iban/HU02162000031000164800000000?receiver-name=name", - ), + creditor_id: 31000163100000000, + creditor_name: "Name".into(), }, - 31000163100000000, - "Name", &Timestamp::now(), ) .await @@ -1572,17 +1568,14 @@ mod test { for i in 0..3 { db::make_transfer( &mut db, - &TransferRequest { + &Transfer { request_uid: HashCode::rand(), - amount: amount(format!("{}:{}", *CURRENCY, i + 1)), + amount: decimal(format!("{}", i + 1)), exchange_base_url: url("https://exchange.test.com/"), wtid: ShortHashCode::rand(), - credit_account: payto( - "payto://iban/HU02162000031000164800000000?receiver-name=name", - ), + creditor_id: 31000163100000000, + creditor_name: "Name".into(), }, - 31000163100000000, - "Name", &Timestamp::now(), ) .await @@ -1597,17 +1590,14 @@ mod test { for i in 0..100 { db::make_transfer( &mut db, - &TransferRequest { + &Transfer { request_uid: HashCode::rand(), - amount: amount(format!("{}:{}", *CURRENCY, i + 1)), + amount: decimal(format!("{}", i + 1)), exchange_base_url: url("https://exchange.test.com/"), wtid: ShortHashCode::rand(), - credit_account: payto( - "payto://iban/HU02162000031000164800000000?receiver-name=name", - ), + creditor_id: 31000163100000000, + creditor_name: "Name".into(), }, - 31000163100000000, - "Name", &Timestamp::now(), ) .await diff --git a/taler-cyclos/src/main.rs b/taler-cyclos/src/main.rs @@ -112,7 +112,7 @@ async fn run(cmd: Command, cfg: &Config) -> anyhow::Result<()> { Command::Dev(cmd) => dev::dev(cfg, cmd).await?, Command::TalerDeployment(cmd) => match cmd { TalerDeployment::ExchangePayto => { - let main = MainCfg::parse(&cfg)?; + let main = MainCfg::parse(cfg)?; let payto = parse_account_payto(cfg, &main)?; println!("{payto}"); } diff --git a/taler-cyclos/tests/api.rs b/taler-cyclos/tests/api.rs @@ -33,7 +33,6 @@ use taler_common::{ use taler_cyclos::{ api::CyclosApi, constants::CONFIG_SOURCE, - cyclos_payto, db::{self, TxOutKind}, }; use taler_test_utils::{ diff --git a/taler-magnet-bank/Cargo.toml b/taler-magnet-bank/Cargo.toml @@ -9,16 +9,13 @@ repository.workspace = true license-file.workspace = true [dependencies] -reqwest = { version = "0.12", default-features = false, features = [ - "json", - "rustls-tls", -] } hmac = "0.12" sha1 = "0.10" p256 = { version = "0.13.2", features = ["alloc", "ecdsa"] } form_urlencoded = "1.2" percent-encoding = "2.3" rpassword = "7.4" +reqwest.workspace = true sqlx.workspace = true serde_json = { workspace = true, features = ["raw_value"] } jiff = { workspace = true, features = ["serde"] } @@ -38,6 +35,7 @@ base64.workspace = true rand_core.workspace = true owo-colors.workspace = true failure-injection.workspace = true +compact_str.workspace = true [dev-dependencies] taler-test-utils.workspace = true diff --git a/taler-magnet-bank/src/api.rs b/taler-magnet-bank/src/api.rs @@ -37,7 +37,7 @@ use tokio::sync::watch::Sender; use crate::{ FullHuPayto, constants::CURRENCY, - db::{self, AddIncomingResult, TxInAdmin}, + db::{self, AddIncomingResult, Transfer, TxInAdmin}, }; pub struct MagnetApi { @@ -87,7 +87,18 @@ impl TalerApi for MagnetApi { impl WireGateway for MagnetApi { async fn transfer(&self, req: TransferRequest) -> ApiResult<TransferResponse> { let creditor = FullHuPayto::try_from(&req.credit_account)?; - let result = db::make_transfer(&self.pool, &req, &creditor, &Timestamp::now()).await?; + let result = db::make_transfer( + &self.pool, + &Transfer { + request_uid: req.request_uid, + wtid: req.wtid, + amount: req.amount.decimal(), + creditor, + exchange_base_url: req.exchange_base_url, + }, + &Timestamp::now(), + ) + .await?; match result { db::TransferResult::Success { id, initiated_at } => Ok(TransferResponse { timestamp: initiated_at.into(), diff --git a/taler-magnet-bank/src/bin/magnet-bank-harness.rs b/taler-magnet-bank/src/bin/magnet-bank-harness.rs @@ -27,11 +27,11 @@ use taler_common::{ CommonArgs, api_common::{EddsaPublicKey, HashCode, ShortHashCode, rand_edsa_pub_key}, api_params::{History, Page}, - api_wire::{IncomingBankTransaction, TransferRequest, TransferState}, + api_wire::{IncomingBankTransaction, TransferState}, config::Config, db::{dbinit, pool}, taler_main, - types::{amount::amount, url}, + types::{amount::decimal, url}, }; use taler_magnet_bank::{ FullHuPayto, HuIban, @@ -135,17 +135,16 @@ impl<'a> Harness<'a> { ) } - async fn custom_transfer(&self, forint: u32, creditor: &FullHuPayto) -> u64 { + async fn custom_transfer(&self, forint: u32, creditor: FullHuPayto) -> u64 { let res = db::make_transfer( self.pool, - &TransferRequest { + &db::Transfer { request_uid: HashCode::rand(), - amount: amount(format!("HUF:{forint}")), + amount: decimal(format!("{forint}")), exchange_base_url: url("https://test.com"), wtid: ShortHashCode::rand(), - credit_account: creditor.as_payto(), + creditor, }, - creditor, &Timestamp::now(), ) .await @@ -157,7 +156,7 @@ impl<'a> Harness<'a> { } async fn transfer(&self, forint: u32) -> u64 { - self.custom_transfer(forint, &FullHuPayto::new(self.client.iban.clone(), "Name")) + self.custom_transfer(forint, FullHuPayto::new(self.client.iban.clone(), "Name")) .await } @@ -375,10 +374,7 @@ async fn logic_harness(cfg: &Config, reset: bool) -> anyhow::Result<()> { step("Test transfer transactions"); // Init a transfer to client let transfer_id = harness - .custom_transfer( - 102, - &FullHuPayto::new(harness.client.iban.clone(), "Client"), - ) + .custom_transfer(102, FullHuPayto::new(harness.client.iban.clone(), "Client")) .await; // Should send harness.worker().await?; @@ -398,10 +394,7 @@ async fn logic_harness(cfg: &Config, reset: bool) -> anyhow::Result<()> { step("Test transfer to self"); // Init a transfer to self let transfer_id = harness - .custom_transfer( - 101, - &FullHuPayto::new(harness.exchange.iban.clone(), "Self"), - ) + .custom_transfer(101, FullHuPayto::new(harness.exchange.iban.clone(), "Self")) .await; // Should failed harness.worker().await?; @@ -415,7 +408,7 @@ async fn logic_harness(cfg: &Config, reset: bool) -> anyhow::Result<()> { .await; step("Test transfer to unknown account"); - let transfer_id = harness.custom_transfer(103, &unknown_account).await; + let transfer_id = harness.custom_transfer(103, unknown_account.clone()).await; harness.worker().await?; harness .expect_transfer_status(transfer_id, TransferState::pending, None) @@ -555,10 +548,10 @@ async fn online_harness(config: &Config, reset: bool) -> anyhow::Result<()> { step("Test outgoing transactions"); let transfer_self = harness - .custom_transfer(1, &FullHuPayto::new(harness.exchange.iban.clone(), "Self")) + .custom_transfer(1, FullHuPayto::new(harness.exchange.iban.clone(), "Self")) .await; let transfer_id = harness - .custom_transfer(2, &FullHuPayto::new(harness.client.iban.clone(), "Client")) + .custom_transfer(2, FullHuPayto::new(harness.client.iban.clone(), "Client")) .await; balance.expect(-2).await; harness diff --git a/taler-magnet-bank/src/db.rs b/taler-magnet-bank/src/db.rs @@ -17,6 +17,7 @@ use std::fmt::Display; use jiff::{Timestamp, civil::Date, tz::TimeZone}; +use reqwest::Url; use serde::{Serialize, de::DeserializeOwned}; use sqlx::{PgConnection, PgExecutor, PgPool, QueryBuilder, Row, postgres::PgRow}; use taler_api::{ @@ -24,14 +25,18 @@ use taler_api::{ subject::{IncomingSubject, OutgoingSubject}, }; use taler_common::{ + api_common::{HashCode, ShortHashCode}, api_params::{History, Page}, api_revenue::RevenueIncomingBankTransaction, api_wire::{ - IncomingBankTransaction, OutgoingBankTransaction, TransferListStatus, TransferRequest, - TransferState, TransferStatus, + IncomingBankTransaction, OutgoingBankTransaction, TransferListStatus, TransferState, + TransferStatus, }, config::Config, - types::{amount::Amount, payto::PaytoImpl as _}, + types::{ + amount::{Amount, Decimal}, + payto::PaytoImpl as _, + }, }; use tokio::sync::watch::{Receiver, Sender}; @@ -361,26 +366,34 @@ pub enum TransferResult { WtidReuse, } +#[derive(Debug, Clone)] +pub struct Transfer { + pub request_uid: HashCode, + pub amount: Decimal, + pub exchange_base_url: Url, + pub wtid: ShortHashCode, + pub creditor: FullHuPayto, +} + pub async fn make_transfer<'a>( db: impl PgExecutor<'a>, - req: &TransferRequest, - creditor: &FullHuPayto, + tx: &Transfer, now: &Timestamp, ) -> sqlx::Result<TransferResult> { - let subject = format!("{} {}", req.wtid, req.exchange_base_url); + let subject = format!("{} {}", tx.wtid, tx.exchange_base_url); sqlx::query( " SELECT out_request_uid_reuse, out_wtid_reuse, out_initiated_row_id, out_initiated_at FROM taler_transfer($1, $2, $3, ($4, $5)::taler_amount, $6, $7, $8, $9) ", ) - .bind(req.request_uid.as_ref()) - .bind(req.wtid.as_ref()) + .bind(tx.request_uid.as_ref()) + .bind(tx.wtid.as_ref()) .bind(&subject) - .bind_amount(&req.amount) - .bind(req.exchange_base_url.as_str()) - .bind(creditor.iban()) - .bind(&creditor.name) + .bind_decimal(&tx.amount) + .bind(tx.exchange_base_url.as_str()) + .bind(tx.creditor.iban()) + .bind(&tx.creditor.name) .bind_timestamp(now) .try_map(|r: PgRow| { Ok(if r.try_get(0)? { @@ -800,13 +813,16 @@ mod test { use taler_common::{ api_common::{EddsaPublicKey, HashCode, ShortHashCode}, api_params::{History, Page}, - api_wire::TransferRequest, - types::{amount::amount, payto::payto, url, utils::now_sql_stable_timestamp}, + types::{ + amount::{amount, decimal}, + url, + utils::now_sql_stable_timestamp, + }, }; use tokio::sync::watch::Receiver; use crate::{ - constants::{CONFIG_SOURCE, CURRENCY}, + constants::CONFIG_SOURCE, db::{ self, AddIncomingResult, AddOutgoingResult, BounceResult, Initiated, OutFailureResult, TransferResult, TxIn, TxOut, TxOutKind, kv_get, kv_set, make_transfer, @@ -1079,16 +1095,13 @@ mod test { assert!(matches!( make_transfer( &mut *db, - &TransferRequest { + &db::Transfer { request_uid: HashCode::rand(), - amount: amount("HUF:10"), + amount: decimal("10"), exchange_base_url: url("https://exchange.test.com/"), wtid: ShortHashCode::rand(), - credit_account: payto( - "payto://iban/HU02162000031000164800000000?receiver-name=name" - ), + creditor: tx.creditor.clone() }, - &tx.creditor, &now ) .await @@ -1213,16 +1226,16 @@ mod test { ); // Initiated - let req = TransferRequest { + let req = db::Transfer { request_uid: HashCode::rand(), - amount: amount("HUF:10"), + amount: decimal("10"), exchange_base_url: url("https://exchange.test.com/"), wtid: ShortHashCode::rand(), - credit_account: payto("payto://iban/HU02162000031000164800000000?receiver-name=name"), + creditor: magnet_payto("payto://iban/HU30162000031000163100000000?receiver-name=name"), }; let payto = magnet_payto("payto://iban/HU30162000031000163100000000?receiver-name=name"); assert_eq!( - make_transfer(&mut db, &req, &payto, &now).await.unwrap(), + make_transfer(&mut db, &req, &now).await.unwrap(), TransferResult::Success { id: 1, initiated_at: now @@ -1303,21 +1316,18 @@ mod test { Vec::new() ); - let req = TransferRequest { + let req = db::Transfer { request_uid: HashCode::rand(), - amount: amount("HUF:10"), + amount: decimal("10"), exchange_base_url: url("https://exchange.test.com/"), wtid: ShortHashCode::rand(), - credit_account: payto("payto://iban/HU02162000031000164800000000?receiver-name=name"), + creditor: magnet_payto("payto://iban/HU02162000031000164800000000?receiver-name=name"), }; - let payto = magnet_payto("payto://iban/HU30162000031000163100000000?receiver-name=name"); let now = now_sql_stable_timestamp(); let later = now + Span::new().hours(2); // Insert assert_eq!( - make_transfer(&mut db, &req, &payto, &now) - .await - .expect("transfer"), + make_transfer(&mut db, &req, &now).await.expect("transfer"), TransferResult::Success { id: 1, initiated_at: now.into() @@ -1325,7 +1335,7 @@ mod test { ); // Idempotent assert_eq!( - make_transfer(&mut db, &req, &payto, &later) + make_transfer(&mut db, &req, &later) .await .expect("transfer"), TransferResult::Success { @@ -1337,11 +1347,10 @@ mod test { assert_eq!( make_transfer( &mut db, - &TransferRequest { + &db::Transfer { wtid: ShortHashCode::rand(), ..req.clone() }, - &payto, &now ) .await @@ -1352,11 +1361,10 @@ mod test { assert_eq!( make_transfer( &mut db, - &TransferRequest { + &db::Transfer { request_uid: HashCode::rand(), ..req.clone() }, - &payto, &now ) .await @@ -1367,12 +1375,11 @@ mod test { assert_eq!( make_transfer( &mut db, - &TransferRequest { + &db::Transfer { request_uid: HashCode::rand(), wtid: ShortHashCode::rand(), ..req }, - &payto, &later ) .await @@ -1584,16 +1591,13 @@ mod test { for i in 0..3 { make_transfer( &mut db, - &TransferRequest { + &db::Transfer { request_uid: HashCode::rand(), - amount: amount(format!("{}:{}", *CURRENCY, i + 1)), + amount: decimal(format!("{}", i + 1)), exchange_base_url: url("https://exchange.test.com/"), wtid: ShortHashCode::rand(), - credit_account: payto( - "payto://iban/HU02162000031000164800000000?receiver-name=name", - ), + creditor: magnet_payto.clone(), }, - &magnet_payto, &Timestamp::now(), ) .await @@ -1608,16 +1612,13 @@ mod test { for i in 0..100 { make_transfer( &mut db, - &TransferRequest { + &db::Transfer { request_uid: HashCode::rand(), - amount: amount(format!("{}:{}", *CURRENCY, i + 1)), + amount: decimal(format!("{}", i + 1)), exchange_base_url: url("https://exchange.test.com/"), wtid: ShortHashCode::rand(), - credit_account: payto( - "payto://iban/HU02162000031000164800000000?receiver-name=name", - ), + creditor: magnet_payto.clone(), }, - &magnet_payto, &Timestamp::now(), ) .await