radrootsd

JSON-RPC bridge for Radroots event publishing
git clone https://radroots.dev/git/radrootsd.git
Log | Files | Refs | README | LICENSE

commit 5e6eb64a8b55045e6df30fc0da2d1f568361f15f
parent b452c0cf6703b6d0f3a4f333fff125a9c343f41d
Author: triesap <triesap@radroots.dev>
Date:   Sat,  3 Jan 2026 18:42:53 +0000

jsonrpc: add events.farm.publish method

- Add events::farm module and wire into events/mod.rs
- Implement events.farm.publish with RadrootsFarm params and optional extra tags
- Build KIND_FARM event content and tags, then send to configured relays
- Merge farm module into root method registration

Diffstat:
Asrc/api/jsonrpc/methods/events/farm/mod.rs | 12++++++++++++
Asrc/api/jsonrpc/methods/events/farm/publish.rs | 50++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/api/jsonrpc/methods/events/mod.rs | 1+
Msrc/api/jsonrpc/methods/mod.rs | 1+
4 files changed, 64 insertions(+), 0 deletions(-)

diff --git a/src/api/jsonrpc/methods/events/farm/mod.rs b/src/api/jsonrpc/methods/events/farm/mod.rs @@ -0,0 +1,12 @@ +use anyhow::Result; +use jsonrpsee::server::RpcModule; + +use crate::api::jsonrpc::{MethodRegistry, RpcContext}; + +pub mod publish; + +pub fn module(ctx: RpcContext, registry: MethodRegistry) -> Result<RpcModule<RpcContext>> { + let mut m = RpcModule::new(ctx); + publish::register(&mut m, &registry)?; + Ok(m) +} diff --git a/src/api/jsonrpc/methods/events/farm/publish.rs b/src/api/jsonrpc/methods/events/farm/publish.rs @@ -0,0 +1,50 @@ +use anyhow::Result; +use jsonrpsee::server::RpcModule; +use serde::Deserialize; + +use crate::api::jsonrpc::nostr::{publish_response, PublishResponse}; +use crate::api::jsonrpc::{MethodRegistry, RpcContext, RpcError}; +use radroots_events::farm::RadrootsFarm; +use radroots_events::kinds::KIND_FARM; +use radroots_events_codec::farm::encode::farm_build_tags; +use radroots_nostr::prelude::{radroots_nostr_build_event, radroots_nostr_send_event}; + +#[derive(Debug, Deserialize)] +struct PublishFarmParams { + farm: RadrootsFarm, + #[serde(default)] + tags: Option<Vec<Vec<String>>>, +} + +pub fn register(m: &mut RpcModule<RpcContext>, registry: &MethodRegistry) -> Result<()> { + registry.track("events.farm.publish"); + m.register_async_method("events.farm.publish", |params, ctx, _| async move { + let relays = ctx.state.client.relays().await; + if relays.is_empty() { + return Err(RpcError::NoRelays); + } + + let PublishFarmParams { farm, tags } = params + .parse() + .map_err(|e| RpcError::InvalidParams(e.to_string()))?; + + let content = serde_json::to_string(&farm) + .map_err(|e| RpcError::InvalidParams(format!("invalid farm json: {e}")))?; + let mut tag_slices = + farm_build_tags(&farm).map_err(|e| RpcError::InvalidParams(e.to_string()))?; + if let Some(extra_tags) = tags { + tag_slices.extend(extra_tags); + } + + let builder = radroots_nostr_build_event(KIND_FARM, content, tag_slices) + .map_err(|e| RpcError::Other(format!("failed to build farm event: {e}")))?; + + let output = radroots_nostr_send_event(&ctx.state.client, builder) + .await + .map_err(|e| RpcError::Other(format!("failed to publish farm: {e}")))?; + + Ok::<PublishResponse, RpcError>(publish_response(output)) + })?; + + Ok(()) +} diff --git a/src/api/jsonrpc/methods/events/mod.rs b/src/api/jsonrpc/methods/events/mod.rs @@ -1,3 +1,4 @@ +pub mod farm; pub mod listing; pub mod post; pub mod profile; diff --git a/src/api/jsonrpc/methods/mod.rs b/src/api/jsonrpc/methods/mod.rs @@ -20,6 +20,7 @@ pub fn register_all( root.merge(events::profile::module(ctx.clone(), registry.clone())?)?; root.merge(events::post::module(ctx.clone(), registry.clone())?)?; root.merge(events::listing::module(ctx.clone(), registry.clone())?)?; + root.merge(events::farm::module(ctx.clone(), registry.clone())?)?; root.merge(domains::trade::module(ctx, registry)?)?; Ok(()) }