commit a3d34059da4b5d067acd7673e18ffae7ca229488
parent 8ac0bdbd74316b5f6957f40114c90a0b38c269e0
Author: Antoine A <>
Date: Tue, 30 Dec 2025 19:44:22 +0100
common: refactoring and dependencies update
Diffstat:
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