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:
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");
}
}