commit b062c2fc5991a22edb36663452974e8d7805478c
parent 2639d04102ca1467f80230c29d6fbd0579172c3c
Author: triesap <triesap@radroots.dev>
Date: Wed, 21 Jan 2026 18:58:24 +0000
app: reset all state and logs
- reset datastore contents instead of clearing bootstrap record
- clear log store after destructive reset completes
- add reset error mapping for datastore failures
- keep setup gating updated after reset
Diffstat:
2 files changed, 25 insertions(+), 4 deletions(-)
diff --git a/app/src/app.rs b/app/src/app.rs
@@ -5,6 +5,7 @@ use leptos_router::components::{A, Route, Router, Routes};
use leptos_router::hooks::use_navigate;
use leptos_router::path;
+use radroots_app_core::datastore::RadrootsClientDatastore;
use radroots_app_core::idb::IDB_CONFIG_LOGS;
use crate::{
@@ -369,6 +370,13 @@ fn HomePage() -> impl IntoView {
.await
{
Ok(()) => {
+ let log_datastore = logs_datastore();
+ if let Err(err) = log_datastore.reset().await {
+ let reset_err = RadrootsAppInitError::Datastore(err);
+ let _ = app_log_error_emit(&reset_err);
+ reset_status.set(Some(reset_err.to_string()));
+ return;
+ }
reset_status.set(Some("reset_done".to_string()));
spawn_health_checks(
config,
diff --git a/app/src/init.rs b/app/src/init.rs
@@ -20,7 +20,6 @@ use radroots_app_core::keystore::{
};
use crate::{
- app_datastore_clear_bootstrap,
app_datastore_has_state,
app_datastore_read_state,
app_assets_geocoder_db_url,
@@ -348,12 +347,12 @@ pub fn app_init_mark_completed() {
pub async fn app_init_reset<T: RadrootsClientDatastore, K: RadrootsClientKeystoreNostr>(
datastore: Option<&T>,
- key_maps: Option<&RadrootsAppKeyMapConfig>,
+ _key_maps: Option<&RadrootsAppKeyMapConfig>,
keystore: Option<&K>,
) -> RadrootsAppInitResult<()> {
let _ = app_log_debug_emit("log.app.init.reset", "start", None);
- if let (Some(datastore), Some(key_maps)) = (datastore, key_maps) {
- app_datastore_clear_bootstrap(datastore, key_maps).await?;
+ if let Some(datastore) = datastore {
+ datastore.reset().await.map_err(RadrootsAppInitError::Datastore)?;
}
if let Some(keystore) = keystore {
keystore.reset().await.map_err(RadrootsAppInitError::Keystore)?;
@@ -527,6 +526,20 @@ mod tests {
assert!(result.is_ok());
}
+ #[test]
+ fn app_init_reset_maps_datastore_errors() {
+ let datastore = radroots_app_core::datastore::RadrootsClientWebDatastore::new(None);
+ let err = futures::executor::block_on(super::app_init_reset::<
+ radroots_app_core::datastore::RadrootsClientWebDatastore,
+ TestKeystore,
+ >(Some(&datastore), None, None))
+ .expect_err("datastore reset should error on native");
+ assert_eq!(
+ err,
+ RadrootsAppInitError::Datastore(RadrootsClientDatastoreError::IdbUndefined)
+ );
+ }
+
struct TestKeystore;
#[async_trait(?Send)]