diff --git a/radicle-httpd/src/api/v1/projects.rs b/radicle-httpd/src/api/v1/projects.rs index 69fdc0bd..5f351946 100644 --- a/radicle-httpd/src/api/v1/projects.rs +++ b/radicle-httpd/src/api/v1/projects.rs @@ -11,8 +11,10 @@ use serde_json::json; use tower_http::set_header::SetResponseHeaderLayer; use radicle::cob::issue::Issues; +use radicle::cob::thread::{self, CommentId}; +use radicle::cob::Timestamp; use radicle::git::raw::BranchType; -use radicle::identity::{Doc, Id}; +use radicle::identity::{Doc, Id, PublicKey}; use radicle::node::NodeId; use radicle::storage::{Oid, ReadRepository, WriteRepository, WriteStorage}; use radicle_surf::git::History; @@ -330,11 +332,11 @@ async fn issues_handler( .filter_map(|r| r.ok()) .map(|(id, issue, _)| { json!({ - "id": id, + "id": id.to_string(), "author": issue.author(), "title": issue.title(), - "status": issue.state(), - "discussion": issue.comments().collect::>(), + "state": issue.state(), + "discussion": issue.comments().collect::(), "tags": issue.tags().collect::>(), }) }) @@ -360,14 +362,50 @@ async fn issue_handler( "id": issue_id, "author": issue.author(), "title": issue.title(), - "status": issue.state(), - "discussion": issue.comments().collect::>(), + "state": issue.state(), + "discussion": issue.comments().collect::(), "tags": issue.tags().collect::>(), }); Ok::<_, Error>(Json(issue)) } +#[derive(Serialize)] +struct Author { + id: PublicKey, +} + +#[derive(Serialize)] +#[serde(rename_all = "camelCase")] +struct Comment { + author: Author, + body: String, + reactions: [String; 0], + timestamp: Timestamp, + reply_to: Option, +} + +#[derive(Serialize)] +struct Comments(Vec); + +impl<'a> FromIterator<(&'a CommentId, &'a thread::Comment)> for Comments { + fn from_iter>(iter: I) -> Self { + let mut comments = Vec::new(); + + for (comment_id, comment) in iter { + comments.push(Comment { + author: Author { id: comment_id.1 }, + body: comment.body.to_owned(), + reactions: [], + timestamp: comment.timestamp, + reply_to: comment.reply_to, + }); + } + + Comments(comments) + } +} + #[derive(Serialize)] struct Stats { branches: usize,