app

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

commit 45db999099edb054f58993aa079c10567358878c
parent e350c249f51d4834e1a0c356a861f98a84672f7d
Author: triesap <triesap@radroots.dev>
Date:   Mon, 19 Jan 2026 19:19:35 +0000

app: bootstrap nostr key on init

- generate nostr key when keystore has no entries
- persist public key into datastore via key map
- preserve existing key when present
- map keystore bootstrap errors into init failures

Diffstat:
Mapp/src/init.rs | 27+++++++++++++++++++++++++++
1 file changed, 27 insertions(+), 0 deletions(-)

diff --git a/app/src/init.rs b/app/src/init.rs @@ -18,12 +18,15 @@ use crate::{ app_datastore_clear_bootstrap, app_datastore_has_app_data, app_datastore_has_config, + app_datastore_key_nostr_key, app_datastore_write_app_data, app_datastore_write_config, + app_keystore_nostr_ensure_key, AppAppData, AppConfig, AppConfigData, AppConfigError, + AppKeystoreError, AppKeyMapConfig, }; @@ -194,6 +197,30 @@ pub async fn app_init_backends(config: AppConfig) -> AppInitResult<AppBackends> .await?; } let nostr_keystore = RadrootsClientWebKeystoreNostr::new(Some(config.keystore.nostr_store)); + let nostr_public_key = app_keystore_nostr_ensure_key(&nostr_keystore) + .await + .map_err(|err| match err { + AppKeystoreError::Keystore(inner) => AppInitError::Keystore(inner), + })?; + let nostr_key = + app_datastore_key_nostr_key(&config.datastore.key_maps).map_err(AppInitError::Config)?; + match datastore.get(nostr_key).await { + Ok(existing) => { + if existing != nostr_public_key { + let _ = datastore + .set(nostr_key, &nostr_public_key) + .await + .map_err(AppInitError::Datastore)?; + } + } + Err(RadrootsClientDatastoreError::NoResult) => { + let _ = datastore + .set(nostr_key, &nostr_public_key) + .await + .map_err(AppInitError::Datastore)?; + } + Err(err) => return Err(AppInitError::Datastore(err)), + } Ok(AppBackends { config, datastore,