commit 8dd581403ad6289de90ed9379c199b5a5834b33f
parent 067448ce7cccc440f9a71552bbf217c0ba0bfdbd
Author: Antoine A <>
Date: Wed, 2 Sep 2026 15:11:09 +0200
libeufin-bank: load WebUI from separate package
Diffstat:
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?;