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:
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, ®istry)?;
+ 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(())
}