app

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

commit 379527f69b475c6767117dadcf9893f585d1b3af
parent 8c27088a83e5388d877c5302519f9f8b14af4f94
Author: triesap <triesap@radroots.dev>
Date:   Mon, 19 Jan 2026 18:34:51 +0000

app: add bootstrap health checks

- add health checks for config and app data presence
- map datastore errors into health results
- export bootstrap health checks from app crate
- add unit test for non-wasm error mapping

Diffstat:
Mapp/src/health.rs | 49++++++++++++++++++++++++++++++++++++++++++++++++-
Mapp/src/lib.rs | 2++
2 files changed, 50 insertions(+), 1 deletion(-)

diff --git a/app/src/health.rs b/app/src/health.rs @@ -73,7 +73,13 @@ impl AppHealthReport { } } -use crate::{app_key_maps_validate, AppKeyMapConfig}; +use crate::{ + app_datastore_has_app_data, + app_datastore_has_config, + app_key_maps_validate, + AppKeyMapConfig, +}; +use radroots_app_core::datastore::RadrootsClientDatastore; pub fn app_health_check_key_maps(key_maps: &AppKeyMapConfig) -> AppHealthCheckResult { match app_key_maps_validate(key_maps) { @@ -82,15 +88,40 @@ pub fn app_health_check_key_maps(key_maps: &AppKeyMapConfig) -> AppHealthCheckRe } } +pub async fn app_health_check_bootstrap_config<T: RadrootsClientDatastore>( + datastore: &T, + key_maps: &AppKeyMapConfig, +) -> AppHealthCheckResult { + match app_datastore_has_config(datastore, key_maps).await { + Ok(true) => AppHealthCheckResult::ok(), + Ok(false) => AppHealthCheckResult::error("missing"), + Err(err) => AppHealthCheckResult::error(err.to_string()), + } +} + +pub async fn app_health_check_bootstrap_app_data<T: RadrootsClientDatastore>( + datastore: &T, + key_maps: &AppKeyMapConfig, +) -> AppHealthCheckResult { + match app_datastore_has_app_data(datastore, key_maps).await { + Ok(true) => AppHealthCheckResult::ok(), + Ok(false) => AppHealthCheckResult::error("missing"), + Err(err) => AppHealthCheckResult::error(err.to_string()), + } +} + #[cfg(test)] mod tests { use super::{ app_health_check_key_maps, + app_health_check_bootstrap_app_data, + app_health_check_bootstrap_config, AppHealthCheckResult, AppHealthCheckStatus, AppHealthReport, }; use crate::AppKeyMapConfig; + use radroots_app_core::datastore::RadrootsClientWebDatastore; #[test] fn health_status_as_str() { @@ -130,4 +161,20 @@ mod tests { Some("error.app.config.key_map_missing") ); } + + #[test] + fn health_check_bootstrap_reports_idb_errors() { + let datastore = RadrootsClientWebDatastore::new(None); + let key_maps = crate::app_key_maps_default(); + let result = futures::executor::block_on(app_health_check_bootstrap_config( + &datastore, + &key_maps, + )); + assert_eq!(result.status, AppHealthCheckStatus::Error); + let result = futures::executor::block_on(app_health_check_bootstrap_app_data( + &datastore, + &key_maps, + )); + assert_eq!(result.status, AppHealthCheckStatus::Error); + } } diff --git a/app/src/lib.rs b/app/src/lib.rs @@ -20,6 +20,8 @@ pub use bootstrap::{ pub use context::{app_context, AppContext}; pub use data::{AppAppData, AppConfigData, AppConfigRole}; pub use health::{ + app_health_check_bootstrap_app_data, + app_health_check_bootstrap_config, app_health_check_key_maps, AppHealthCheckResult, AppHealthCheckStatus,