libeufin

Integration and sandbox testing for FinTech APIs and data formats
Log | Files | Refs | Submodules | README | LICENSE

commit 8dd581403ad6289de90ed9379c199b5a5834b33f
parent 067448ce7cccc440f9a71552bbf217c0ba0bfdbd
Author: Antoine A <>
Date:   Wed,  2 Sep 2026 15:11:09 +0200

libeufin-bank: load WebUI from separate package

Diffstat:
M.gitmodules | 3+++
MMakefile | 16++++++++--------
MREADME | 1+
Mcontrib/ci/jobs/0-codespell/job.sh | 1-
Mdebian/control | 1+
Mdebian/libeufin-bank.install | 1-
Mlibeufin-bank/src/api.rs | 23++++++++++++++++++-----
Mlibeufin-bank/src/config.rs | 5++++-
Mlibeufin-bank/src/db.rs | 4++--
9 files changed, 37 insertions(+), 18 deletions(-)

diff --git a/.gitmodules b/.gitmodules @@ -1,3 +1,6 @@ +[submodule "build-system/taler-build-scripts"] + path = build-system/taler-build-scripts + url = ../build-common.git [submodule "doc/prebuilt"] path = doc/prebuilt url = ../taler-docs.git diff --git a/Makefile b/Makefile @@ -15,8 +15,8 @@ all: build build: cargo build --release --bin libeufin-bank --bin libeufin-nexus --bin libeufin-ebisync -.PHONY: install-nobuild-files -install-nobuild-files: +.PHONY: install-files +install-files: install -m 644 -D -t $(share_dir)/libeufin/config.d contrib/currencies.conf install -m 644 -D -t $(share_dir)/libeufin/config.d contrib/bank.conf install -m 644 -D -t $(share_dir)/libeufin/config.d contrib/nexus.conf @@ -37,20 +37,20 @@ install-nobuild-files: install -D -t $(bin_dir) contrib/libeufin-ebisync-dbconfig install -D -t $(bin_dir) contrib/libeufin-tan-*.sh install -d $(share_dir)/libeufin/spa - cp contrib/wallet-core/bank/* $(share_dir)/libeufin/spa/ + cp contrib/spa/* $(share_dir)/libeufin/spa/ install -d $(share_dir)/libeufin-ebisync/spa cp libeufin-ebisync/spa/* $(share_dir)/libeufin-ebisync/spa/ .PHONY: install -install: build install-nobuild-files +install: build install-files install -D -t $(bin_dir) target/release/libeufin-bank install -D -t $(bin_dir) target/release/libeufin-nexus install -D -t $(bin_dir) target/release/libeufin-ebisync .PHONY: check -check: install-nobuild-files - cargo clippy --all-targets +check: install-files cargo test + cargo clippy --all-targets .PHONY: doc doc: @@ -69,9 +69,9 @@ fmt: rustfmt-unstable --apply .PHONY: bank-bench-db -bank-bench-db: install-nobuild-files +bank-bench-db: install-files cargo test -rp libeufin-bank bench_db -- --nocapture .PHONY: nexus-bench-db -nexus-bench-db: install-nobuild-files +nexus-bench-db: install-files cargo test -rp libeufin-nexus bench_db -- --nocapture \ No newline at end of file diff --git a/README b/README @@ -90,3 +90,4 @@ with installation guidance. Note: the UI is an independent Web app that could even be served from a different host than the one running the backend. + diff --git a/contrib/ci/jobs/0-codespell/job.sh b/contrib/ci/jobs/0-codespell/job.sh @@ -14,7 +14,6 @@ configure~ */.git/* */target/* */contrib/ci/* -*/contrib/wallet-core/* */*.xsd */*.xml */testbench/test/* diff --git a/debian/control b/debian/control @@ -19,6 +19,7 @@ Package: libeufin-bank Architecture: any Depends: libeufin-common (= ${binary:Version}), + libeufin-bank-webui, ${misc:Depends}, ${shlibs:Depends} Recommends: nginx | apache2 | httpd, diff --git a/debian/libeufin-bank.install b/debian/libeufin-bank.install @@ -1,7 +1,6 @@ debian/etc/libeufin/libeufin-bank.conf etc/libeufin/ debian/etc/nginx/sites-available/libeufin-bank etc/nginx/sites-available/ debian/etc/apache2/sites-available/libeufin-bank.conf etc/apache2/sites-available/ -debian/etc/libeufin/settings.json etc/libeufin/ target/release/libeufin-bank usr/bin/ contrib/libeufin-bank-dbinit usr/bin/ diff --git a/libeufin-bank/src/api.rs b/libeufin-bank/src/api.rs @@ -17,7 +17,7 @@ * <http://www.gnu.org/licenses/> */ -use std::sync::Arc; +use std::{path::PathBuf, sync::Arc}; use axum::{ Json, Router, @@ -36,6 +36,7 @@ use taler_common::{ }; use taler_macros::{EnumMeta, api_config}; use tower_http::services::ServeDir; +use tracing::warn; use uuid::Uuid; use crate::{ @@ -201,12 +202,24 @@ async fn config(State(state): State<Arc<BankState>>) -> Response { pub fn bank_api(state: Arc<BankState>) -> Router { let router = Router::new().route("/config", get(config)); if let Some(path) = &state.cfg.spa_path { - router - .nest_service("/webui/", ServeDir::new(path)) - .route("/", get(async || Redirect::permanent("/webui/"))) + if !PathBuf::from(path).is_dir() { + warn!(target: "api", "SPA not found at '{path}'"); + if !state.cfg.fallback_spa.is_dir() { + warn!(target: "api", "SPA fallback not found at '{}'", state.cfg.fallback_spa.to_string_lossy()) + } + } + router.nest_service( + "/webui/", + ServeDir::new(path).fallback(ServeDir::new(&state.cfg.fallback_spa)), + ) + } else { - router + if !state.cfg.fallback_spa.is_dir() { + warn!(target: "api", "SPA fallback not found at '{}'", state.cfg.fallback_spa.to_string_lossy()) + } + router.nest_service("/webui/", ServeDir::new(&state.cfg.fallback_spa)) } + .route("/", get(async || Redirect::permanent("/webui/"))) .route( "/monitor", get( diff --git a/libeufin-bank/src/config.rs b/libeufin-bank/src/config.rs @@ -17,7 +17,7 @@ * <http://www.gnu.org/licenses/> */ -use std::collections::BTreeMap; +use std::{collections::BTreeMap, path::PathBuf}; use compact_str::CompactString; use jiff::Span; @@ -77,6 +77,7 @@ pub struct BankCfg { pub suggested_withdrawal_exchange: Option<String>, pub fiat: Option<(Currency, CurrencySpecification)>, pub spa_path: Option<String>, + pub fallback_spa: PathBuf, pub tan_channels: BTreeMap<TanChannel, (String, BTreeMap<CompactString, CompactString>)>, pub ctx: PaytoCtx, pub wire_method: WireMethod, @@ -177,6 +178,8 @@ impl BankCfg { suggested_withdrawal_exchange: s.str("suggested_withdrawal_exchange").opt()?, fiat, spa_path: s.path("spa").opt()?, + fallback_spa: PathBuf::from(cfg.section("paths").path("datadir").require()?) + .join("spa"), tan_channels, ctx: PaytoCtx { bic: s.parse("bic", "iban_payto_bic").opt()?, diff --git a/libeufin-bank/src/db.rs b/libeufin-bank/src/db.rs @@ -71,7 +71,7 @@ pub async fn setup_conversion( enabled: bool, ) -> anyhow::Result<()> { if enabled { - info!("Ensure conversion is enabled"); + info!(target: "db", "Ensure conversion is enabled"); match std::fs::read_to_string(format!("{}/libeufin-conversion-setup.sql", cfg.sql_dir)) { Ok(sql) => { sqlx::raw_sql(&sql).execute(&mut *db).await?; @@ -85,7 +85,7 @@ pub async fn setup_conversion( } }; } else { - info!("Ensure conversion is disabled"); + info!(target: "db", "Ensure conversion is disabled"); match std::fs::read_to_string(format!("{}/libeufin-conversion-drop.sql", cfg.sql_dir)) { Ok(sql) => { sqlx::raw_sql(&sql).execute(&mut *db).await?;