app

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

commit 413cb3de125c8712ed665bac99431c6530620485
parent 627003d498fca722f66ad994e48d696123d27e77
Author: triesap <triesap@radroots.dev>
Date:   Mon, 19 Jan 2026 18:03:54 +0000

app: add bootstrap reset helper

- add helper to delete bootstrap datastore entries
- call reset helper from app_init_reset when provided
- re-export bootstrap reset helper from app crate
- add unit test for reset error mapping

Diffstat:
Mapp/src/bootstrap.rs | 35++++++++++++++++++++++++++++++++++-
Mapp/src/init.rs | 16++++++++++++++--
Mapp/src/lib.rs | 6+++++-
3 files changed, 53 insertions(+), 4 deletions(-)

diff --git a/app/src/bootstrap.rs b/app/src/bootstrap.rs @@ -36,9 +36,30 @@ pub async fn app_datastore_write_app_data<T: RadrootsClientDatastore>( .map_err(AppInitError::Datastore) } +pub async fn app_datastore_clear_bootstrap<T: RadrootsClientDatastore>( + datastore: &T, + key_maps: &AppKeyMapConfig, +) -> AppInitResult<()> { + let cfg_key = app_datastore_obj_key_cfg_data(key_maps).map_err(AppInitError::Config)?; + datastore + .del_obj(cfg_key) + .await + .map_err(AppInitError::Datastore)?; + let app_key = app_datastore_obj_key_app_data(key_maps).map_err(AppInitError::Config)?; + datastore + .del_obj(app_key) + .await + .map_err(AppInitError::Datastore)?; + Ok(()) +} + #[cfg(test)] mod tests { - use super::{app_datastore_write_app_data, app_datastore_write_config}; + use super::{ + app_datastore_clear_bootstrap, + app_datastore_write_app_data, + app_datastore_write_config, + }; use crate::{app_key_maps_default, AppAppData, AppConfigData, AppInitError}; use radroots_app_core::datastore::{RadrootsClientDatastoreError, RadrootsClientWebDatastore}; @@ -69,4 +90,16 @@ mod tests { .expect_err("idb undefined"); assert_eq!(err, AppInitError::Datastore(RadrootsClientDatastoreError::IdbUndefined)); } + + #[test] + fn clear_bootstrap_maps_idb_errors() { + let datastore = RadrootsClientWebDatastore::new(None); + let key_maps = app_key_maps_default(); + let err = futures::executor::block_on(app_datastore_clear_bootstrap( + &datastore, + &key_maps, + )) + .expect_err("idb undefined"); + assert_eq!(err, AppInitError::Datastore(RadrootsClientDatastoreError::IdbUndefined)); + } } diff --git a/app/src/init.rs b/app/src/init.rs @@ -15,12 +15,14 @@ use radroots_app_core::idb::{ use radroots_app_core::keystore::{RadrootsClientKeystoreError, RadrootsClientWebKeystoreNostr}; use crate::{ + app_datastore_clear_bootstrap, app_datastore_write_app_data, app_datastore_write_config, AppAppData, AppConfig, AppConfigData, AppConfigError, + AppKeyMapConfig, }; #[cfg(target_arch = "wasm32")] @@ -149,7 +151,13 @@ pub fn app_init_mark_completed() { } } -pub fn app_init_reset() { +pub async fn app_init_reset<T: RadrootsClientDatastore>( + datastore: Option<&T>, + key_maps: Option<&AppKeyMapConfig>, +) -> AppInitResult<()> { + if let (Some(datastore), Some(key_maps)) = (datastore, key_maps) { + app_datastore_clear_bootstrap(datastore, key_maps).await?; + } #[cfg(target_arch = "wasm32")] { let window = window(); @@ -157,6 +165,7 @@ pub fn app_init_reset() { let _ = storage.remove_item(APP_INIT_STORAGE_KEY); } } + Ok(()) } pub async fn app_init_backends(config: AppConfig) -> AppInitResult<AppBackends> { @@ -242,7 +251,10 @@ mod tests { #[test] fn app_init_reset_is_noop_on_native() { super::app_init_mark_completed(); - super::app_init_reset(); + let result = futures::executor::block_on(super::app_init_reset::< + radroots_app_core::datastore::RadrootsClientWebDatastore, + >(None, None)); + assert!(result.is_ok()); } #[test] diff --git a/app/src/lib.rs b/app/src/lib.rs @@ -9,7 +9,11 @@ mod init; mod entry; pub use app::App; -pub use bootstrap::{app_datastore_write_app_data, app_datastore_write_config}; +pub use bootstrap::{ + app_datastore_clear_bootstrap, + app_datastore_write_app_data, + app_datastore_write_config, +}; pub use context::{app_context, AppContext}; pub use data::{AppAppData, AppConfigData, AppConfigRole}; pub use config::{