taler-rust

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

commit c6591e06b44a5b95df91e78f2b06f6a114ce0a69
parent 17738972b96f82774532dc162e80815f99feb7ee
Author: Antoine A <>
Date:   Tue,  3 Nov 2026 19:10:32 +0100

common: fix missing prepared transfer API in prod

Diffstat:
Madapters/taler-cyclos/src/api.rs | 36+++++++++++++++++++++---------------
Madapters/taler-cyclos/src/lib.rs | 28+++++++++++++++++++++-------
Madapters/taler-magnet-bank/src/api.rs | 30+++++++++++++++++++-----------
Madapters/taler-magnet-bank/src/lib.rs | 23++++++++++++++++-------
4 files changed, 77 insertions(+), 40 deletions(-)

diff --git a/adapters/taler-cyclos/src/api.rs b/adapters/taler-cyclos/src/api.rs @@ -423,7 +423,7 @@ impl Observability for CyclosApi { #[cfg(test)] mod test { use std::sync::{ - Arc, LazyLock, + LazyLock, atomic::{AtomicI64, Ordering}, }; @@ -431,8 +431,9 @@ mod test { use jiff::Timestamp; use sqlx::{PgPool, Row as _, postgres::PgRow}; use taler_api::{ + Serve, api::TalerRouter as _, - auth::AuthMethod, + config::{ApiCfg, AuthCfg}, db::TypeHelper as _, subject::{IncomingKey, OutgoingSubject}, }; @@ -462,7 +463,8 @@ mod test { }; use crate::{ - api::CyclosApi, + build_router, + config::ServeCfg, db::{self, TxIn, TxOutKind}, payto::{FullCyclosPayto, cyclos_payto}, }; @@ -476,18 +478,22 @@ mod test { }); async fn setup(pool: &PgPool) -> Router { - let api = Arc::new(CyclosApi::start( - pool.clone(), - CompactString::const_new("localhost"), - PAYTO.clone(), - Currency::TEST, - )); - Router::new() - .wire_gateway(api.clone(), AuthMethod::None) - .prepared_transfer(api.clone()) - .revenue(api.clone(), AuthMethod::None) - .observability(api, AuthMethod::None) - .finalize() + let cfg = ServeCfg { + payto: PAYTO.clone(), + root: CompactString::const_new("localhost"), + currency: Currency::TEST, + serve: Serve::Systemd, + wire_gateway: Some(ApiCfg { + auth: AuthCfg::None, + }), + revenue: Some(ApiCfg { + auth: AuthCfg::None, + }), + observability: Some(ApiCfg { + auth: AuthCfg::None, + }), + }; + build_router(&cfg, pool.clone()).await.finalize() } #[db_test] diff --git a/adapters/taler-cyclos/src/lib.rs b/adapters/taler-cyclos/src/lib.rs @@ -36,17 +36,31 @@ pub use crate::constants::CONFIG_SOURCE; pub async fn run_serve(cfg: &Config, pool: PgPool) -> anyhow::Result<()> { let cfg = ServeCfg::parse(cfg)?; - let api = Arc::new(CyclosApi::start(pool, cfg.root, cfg.payto, cfg.currency)); + build_router(&cfg, pool) + .await + .serve(&cfg.serve, None) + .await?; + Ok(()) +} + +async fn build_router(cfg: &ServeCfg, pool: PgPool) -> Router { + let api = Arc::new(CyclosApi::start( + pool, + cfg.root.clone(), + cfg.payto.clone(), + cfg.currency, + )); let mut router = Router::new(); - if let Some(cfg) = cfg.wire_gateway { - router = router.wire_gateway(api.clone(), cfg.auth.method()); + if let Some(cfg) = &cfg.wire_gateway { + router = router + .wire_gateway(api.clone(), cfg.auth.method()) + .prepared_transfer(api.clone()); } - if let Some(cfg) = cfg.revenue { + if let Some(cfg) = &cfg.revenue { router = router.revenue(api.clone(), cfg.auth.method()); } - if let Some(cfg) = cfg.observability { + if let Some(cfg) = &cfg.observability { router = router.observability(api, cfg.auth.method()); } - router.serve(&cfg.serve, None).await?; - Ok(()) + router } diff --git a/adapters/taler-magnet-bank/src/api.rs b/adapters/taler-magnet-bank/src/api.rs @@ -403,15 +403,16 @@ impl Observability for MagnetApi { mod test { use std::sync::{ - Arc, LazyLock, + LazyLock, atomic::{AtomicU64, Ordering}, }; use jiff::{Timestamp, Zoned}; use sqlx::{PgPool, Row as _, postgres::PgRow}; use taler_api::{ + Serve, api::TalerRouter as _, - auth::AuthMethod, + config::{ApiCfg, AuthCfg}, db::TypeHelper as _, subject::{IncomingKey, OutgoingSubject}, }; @@ -441,8 +442,8 @@ mod test { }; use crate::{ - FullHuPayto, - api::MagnetApi, + FullHuPayto, build_router, + config::ServeCfg, db::{self, TxIn, TxOutKind}, magnet_api::types::TxStatus, magnet_payto, @@ -456,13 +457,20 @@ mod test { LazyLock::new(|| payto("payto://iban/HU60162006491000639900000000?receiver-name=Unknown")); async fn setup(pool: &PgPool) -> Router { - let api = Arc::new(MagnetApi::start(pool.clone(), PAYTO.clone()).await); - Router::new() - .wire_gateway(api.clone(), AuthMethod::None) - .prepared_transfer(api.clone()) - .revenue(api.clone(), AuthMethod::None) - .observability(api, AuthMethod::None) - .finalize() + let cfg = ServeCfg { + payto: PAYTO.clone(), + serve: Serve::Systemd, + wire_gateway: Some(ApiCfg { + auth: AuthCfg::None, + }), + revenue: Some(ApiCfg { + auth: AuthCfg::None, + }), + observability: Some(ApiCfg { + auth: AuthCfg::None, + }), + }; + build_router(&cfg, pool.clone()).await.finalize() } #[db_test] diff --git a/adapters/taler-magnet-bank/src/lib.rs b/adapters/taler-magnet-bank/src/lib.rs @@ -39,19 +39,28 @@ pub mod worker; pub async fn run_serve(cfg: &Config, pool: PgPool) -> anyhow::Result<()> { let cfg = ServeCfg::parse(cfg)?; - let api = Arc::new(MagnetApi::start(pool, cfg.payto).await); + build_router(&cfg, pool) + .await + .serve(&cfg.serve, None) + .await?; + Ok(()) +} + +async fn build_router(cfg: &ServeCfg, pool: PgPool) -> Router { + let api = Arc::new(MagnetApi::start(pool, cfg.payto.clone()).await); let mut router = Router::new(); - if let Some(cfg) = cfg.wire_gateway { - router = router.wire_gateway(api.clone(), cfg.auth.method()); + if let Some(cfg) = &cfg.wire_gateway { + router = router + .wire_gateway(api.clone(), cfg.auth.method()) + .prepared_transfer(api.clone()); } - if let Some(cfg) = cfg.revenue { + if let Some(cfg) = &cfg.revenue { router = router.revenue(api.clone(), cfg.auth.method()); } - if let Some(cfg) = cfg.observability { + if let Some(cfg) = &cfg.observability { router = router.observability(api, cfg.auth.method()); } - router.serve(&cfg.serve, None).await?; - Ok(()) + router } #[derive(