radrootsd

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

commit 97b26654219dc098f17a3aa3d7370d8430daa8e3
parent 184a472cd2c4532c86f63acdac17779458d8796e
Author: triesap <triesap@radroots.dev>
Date:   Sun,  4 Jan 2026 03:48:21 +0000

events: attach decoded post to post list rows

- Replace NostrEventView list with flattened PostRow fields
- Populate tags via event_tags and event_view_with_tags
- Decode RadrootsPost from content and store on each row
- Update tests to assert decoded post content is preserved

Diffstat:
Msrc/api/jsonrpc/methods/events/post/list.rs | 45+++++++++++++++++++++++++++++++++++++++++----
1 file changed, 41 insertions(+), 4 deletions(-)

diff --git a/src/api/jsonrpc/methods/events/post/list.rs b/src/api/jsonrpc/methods/events/post/list.rs @@ -3,7 +3,7 @@ use jsonrpsee::server::RpcModule; use serde::Serialize; use std::time::Duration; -use crate::api::jsonrpc::nostr::{event_view, NostrEventView}; +use crate::api::jsonrpc::nostr::{event_tags, event_view_with_tags}; use crate::api::jsonrpc::params::{ apply_time_bounds, limit_or, @@ -12,6 +12,8 @@ use crate::api::jsonrpc::params::{ EventListParams, }; use crate::api::jsonrpc::{MethodRegistry, RpcContext, RpcError}; +use radroots_events::post::RadrootsPost; +use radroots_events_codec::post::decode::post_from_content; use radroots_nostr::prelude::{ RadrootsNostrEvent, RadrootsNostrFilter, @@ -19,19 +21,53 @@ use radroots_nostr::prelude::{ }; #[derive(Clone, Debug, Serialize)] +struct PostRow { + id: String, + author: String, + created_at: u64, + kind: u32, + tags: Vec<Vec<String>>, + content: String, + sig: String, + post: Option<RadrootsPost>, +} + +#[derive(Clone, Debug, Serialize)] struct PostListResponse { - posts: Vec<NostrEventView>, + posts: Vec<PostRow>, } -fn build_post_rows<I>(events: I) -> Vec<NostrEventView> +fn build_post_rows<I>(events: I) -> Vec<PostRow> where I: IntoIterator<Item = RadrootsNostrEvent>, { - let mut items = events.into_iter().map(|ev| event_view(&ev)).collect::<Vec<_>>(); + let mut items = events + .into_iter() + .map(|ev| { + let tags = event_tags(&ev); + let post = parse_post_event(&ev); + let event = event_view_with_tags(&ev, tags); + PostRow { + id: event.id, + author: event.author, + created_at: event.created_at, + kind: event.kind, + tags: event.tags, + content: event.content, + sig: event.sig, + post, + } + }) + .collect::<Vec<_>>(); items.sort_by(|a, b| b.created_at.cmp(&a.created_at)); items } +fn parse_post_event(event: &RadrootsNostrEvent) -> Option<RadrootsPost> { + let kind = event.kind.as_u16() as u32; + post_from_content(kind, &event.content).ok() +} + pub fn register(m: &mut RpcModule<RpcContext>, registry: &MethodRegistry) -> Result<()> { registry.track("events.post.list"); m.register_async_method("events.post.list", |params, ctx, _| async move { @@ -132,5 +168,6 @@ mod tests { assert_eq!(posts.len(), 1); assert_eq!(posts[0].content, "hello"); assert_eq!(posts[0].tags, tags); + assert_eq!(posts[0].post.as_ref().unwrap().content, "hello"); } }