app

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

commit 2a6d10aae11841e28157d41827abed8db9720d33
parent 97aae6663b067451e1c109feb14888b67de8c0fb
Author: triesap <triesap@radroots.dev>
Date:   Tue, 20 Jan 2026 17:23:43 +0000

app: persist notifications permission

- add notifications permission field to app data

- add datastore helper to store permission

- export helper for app flows

- add unit test for idb error mapping

Diffstat:
Mapp/src/bootstrap.rs | 40++++++++++++++++++++++++++++++++++------
Mapp/src/data.rs | 3+++
Mapp/src/lib.rs | 1+
3 files changed, 38 insertions(+), 6 deletions(-)

diff --git a/app/src/bootstrap.rs b/app/src/bootstrap.rs @@ -96,16 +96,31 @@ pub async fn app_datastore_clear_bootstrap<T: RadrootsClientDatastore>( Ok(()) } +pub async fn app_datastore_set_notifications_permission<T: RadrootsClientDatastore>( + datastore: &T, + key_maps: &AppKeyMapConfig, + permission: &str, +) -> AppInitResult<AppAppData> { + let mut data = match app_datastore_has_app_data(datastore, key_maps).await? { + true => app_datastore_read_app_data(datastore, key_maps).await?, + false => AppAppData::default(), + }; + data.notifications_permission = Some(permission.to_string()); + let value = app_datastore_write_app_data(datastore, key_maps, &data).await?; + Ok(value) +} + #[cfg(test)] mod tests { use super::{ app_datastore_clear_bootstrap, - app_datastore_has_app_data, - app_datastore_has_config, - app_datastore_read_app_data, - app_datastore_write_app_data, - app_datastore_write_config, -}; + app_datastore_has_app_data, + app_datastore_has_config, + app_datastore_read_app_data, + app_datastore_set_notifications_permission, + 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}; @@ -178,4 +193,17 @@ mod tests { .expect_err("idb undefined"); assert_eq!(err, AppInitError::Datastore(RadrootsClientDatastoreError::IdbUndefined)); } + + #[test] + fn set_notifications_permission_maps_idb_errors() { + let datastore = RadrootsClientWebDatastore::new(None); + let key_maps = app_key_maps_default(); + let err = futures::executor::block_on(app_datastore_set_notifications_permission( + &datastore, + &key_maps, + "granted", + )) + .expect_err("idb undefined"); + assert_eq!(err, AppInitError::Datastore(RadrootsClientDatastoreError::IdbUndefined)); + } } diff --git a/app/src/data.rs b/app/src/data.rs @@ -40,6 +40,7 @@ pub struct AppAppData { pub role: AppConfigRole, pub eula_date: String, pub nip05_key: Option<String>, + pub notifications_permission: Option<String>, } impl Default for AppAppData { @@ -49,6 +50,7 @@ impl Default for AppAppData { role: AppConfigRole::default(), eula_date: String::new(), nip05_key: None, + notifications_permission: None, } } } @@ -79,5 +81,6 @@ mod tests { assert_eq!(data.role, AppConfigRole::Public); assert_eq!(data.eula_date, ""); assert!(data.nip05_key.is_none()); + assert!(data.notifications_permission.is_none()); } } diff --git a/app/src/lib.rs b/app/src/lib.rs @@ -20,6 +20,7 @@ pub use bootstrap::{ app_datastore_has_app_data, app_datastore_has_config, app_datastore_read_app_data, + app_datastore_set_notifications_permission, app_datastore_write_app_data, app_datastore_write_config, };