app

Local-first trade for farms and co-ops
git clone https://radroots.dev/git/app.git
Log | Files | Refs | README | LICENSE

commit d47649d6ea91cf0643618d7660d4002baded551d
parent 0fe7930b924c4bea37dce2cfcbdc9f6bef29aa7e
Author: triesap <triesap@radroots.dev>
Date:   Mon, 19 Jan 2026 18:46:46 +0000

app: add aggregate health report

- add health check aggregator for datastore and keystore
- return per-check results in AppHealthReport
- cover aggregate health behavior in unit tests
- export aggregate check helper

Diffstat:
Mapp/src/health.rs | 29+++++++++++++++++++++++++++++
Mapp/src/lib.rs | 1+
2 files changed, 30 insertions(+), 0 deletions(-)

diff --git a/app/src/health.rs b/app/src/health.rs @@ -144,9 +144,24 @@ pub async fn app_health_check_keystore_access<T: RadrootsClientKeystoreNostr>( } } +pub async fn app_health_check_all<T: RadrootsClientDatastore, K: RadrootsClientKeystoreNostr>( + datastore: &T, + keystore: &K, + key_maps: &AppKeyMapConfig, +) -> AppHealthReport { + AppHealthReport { + key_maps: app_health_check_key_maps(key_maps), + bootstrap_config: app_health_check_bootstrap_config(datastore, key_maps).await, + bootstrap_app_data: app_health_check_bootstrap_app_data(datastore, key_maps).await, + datastore_roundtrip: app_health_check_datastore_roundtrip(datastore).await, + keystore: app_health_check_keystore_access(keystore).await, + } +} + #[cfg(test)] mod tests { use super::{ + app_health_check_all, app_health_check_key_maps, app_health_check_bootstrap_app_data, app_health_check_bootstrap_config, @@ -277,4 +292,18 @@ mod tests { futures::executor::block_on(app_health_check_keystore_access(&keystore)); assert_eq!(result.status, AppHealthCheckStatus::Error); } + + #[test] + fn health_check_all_reports_idb_errors() { + let datastore = RadrootsClientWebDatastore::new(None); + let keystore = RadrootsClientWebKeystoreNostr::new(None); + let key_maps = crate::app_key_maps_default(); + let report = + futures::executor::block_on(app_health_check_all(&datastore, &keystore, &key_maps)); + assert_eq!(report.key_maps.status, AppHealthCheckStatus::Ok); + assert_eq!(report.bootstrap_config.status, AppHealthCheckStatus::Error); + assert_eq!(report.bootstrap_app_data.status, AppHealthCheckStatus::Error); + assert_eq!(report.datastore_roundtrip.status, AppHealthCheckStatus::Error); + assert_eq!(report.keystore.status, AppHealthCheckStatus::Error); + } } diff --git a/app/src/lib.rs b/app/src/lib.rs @@ -20,6 +20,7 @@ pub use bootstrap::{ pub use context::{app_context, AppContext}; pub use data::{AppAppData, AppConfigData, AppConfigRole}; pub use health::{ + app_health_check_all, app_health_check_bootstrap_app_data, app_health_check_bootstrap_config, app_health_check_datastore_roundtrip,