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:
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(