From 5bdc2ad1fba5346005e6e97ae0161d602d890163 Mon Sep 17 00:00:00 2001 From: Sebastian Martinez Date: Tue, 27 Feb 2024 16:43:19 +0100 Subject: [PATCH] httpd: Add author alias to reactions --- radicle-httpd/src/api/json.rs | 41 ++++++++++++++++++---------- radicle-httpd/src/api/v1/projects.rs | 21 ++++++++++---- 2 files changed, 42 insertions(+), 20 deletions(-) diff --git a/radicle-httpd/src/api/json.rs b/radicle-httpd/src/api/json.rs index 21ff0832..27ed4614 100644 --- a/radicle-httpd/src/api/json.rs +++ b/radicle-httpd/src/api/json.rs @@ -137,13 +137,10 @@ pub(crate) fn patch( "description": rev.description(), "edits": rev.edits().map(|e| edit(e, aliases)).collect::>(), "reactions": rev.reactions().iter().flat_map(|(location, reaction)| { - let reactions = reaction.iter().fold(BTreeMap::new(), |mut acc: BTreeMap<&Reaction, Vec<_>>, (author, emoji)| { + reactions(reaction.iter().fold(BTreeMap::new(), |mut acc: BTreeMap<&Reaction, Vec<_>>, (author, emoji)| { acc.entry(emoji).or_default().push(author); acc - }); - reactions.iter().map(|(emoji, authors)| - json!({ "location": location, "emoji": emoji, "authors": authors }) - ).collect::>() + }), location.as_ref(), aliases) }).collect::>(), "base": rev.base(), "oid": rev.head(), @@ -160,6 +157,28 @@ pub(crate) fn patch( }) } +/// Returns JSON for a `reaction`. +fn reactions( + reactions: BTreeMap<&Reaction, Vec<&ActorId>>, + location: Option<&CodeLocation>, + aliases: &impl AliasStore, +) -> Vec { + reactions + .into_iter() + .map(|(emoji, authors)| { + if let Some(l) = location { + json!({ "location": l, "emoji": emoji, "authors": authors.into_iter().map(|a| + author(&Author::from(*a), aliases.alias(a)) + ).collect::>()}) + } else { + json!({ "emoji": emoji, "authors": authors.into_iter().map(|a| + author(&Author::from(*a), aliases.alias(a)) + ).collect::>()}) + } + }) + .collect::>() +} + /// Returns JSON for an `author` and fills in `alias` when present. fn author(author: &Author, alias: Option) -> Value { match alias { @@ -212,9 +231,7 @@ fn issue_comment(id: &CommentId, comment: &Comment, aliases: &impl AliasStore) - "body": comment.body(), "edits": comment.edits().map(|e| edit(e, aliases)).collect::>(), "embeds": comment.embeds().to_vec(), - "reactions": comment.reactions().iter().map(|(emoji, authors)| - json!({ "emoji": emoji, "authors": authors }) - ).collect::>(), + "reactions": reactions(comment.reactions(), None, aliases), "timestamp": comment.timestamp().as_secs(), "replyTo": comment.reply_to(), "resolved": comment.is_resolved(), @@ -233,9 +250,7 @@ fn patch_comment( "body": comment.body(), "edits": comment.edits().map(|e| edit(e, aliases)).collect::>(), "embeds": comment.embeds().to_vec(), - "reactions": comment.reactions().iter().map(|(emoji, authors)| - json!({ "emoji": emoji, "authors": authors }) - ).collect::>(), + "reactions": reactions(comment.reactions(), None, aliases), "timestamp": comment.timestamp().as_secs(), "replyTo": comment.reply_to(), "location": comment.location(), @@ -255,9 +270,7 @@ fn review_comment( "body": comment.body(), "edits": comment.edits().map(|e| edit(e, aliases)).collect::>(), "embeds": comment.embeds().to_vec(), - "reactions": comment.reactions().iter().map(|(emoji, authors)| - json!({ "emoji": emoji, "authors": authors }) - ).collect::>(), + "reactions": reactions(comment.reactions(), None, aliases), "timestamp": comment.timestamp().as_secs(), "replyTo": comment.reply_to(), "location": comment.location(), diff --git a/radicle-httpd/src/api/v1/projects.rs b/radicle-httpd/src/api/v1/projects.rs index 7d26dc0b..8739907b 100644 --- a/radicle-httpd/src/api/v1/projects.rs +++ b/radicle-httpd/src/api/v1/projects.rs @@ -2297,7 +2297,9 @@ mod routes { "reactions": [ { "emoji": "🚀", - "authors": ["z6Mkk7oqY4pPxhMmGEotDYsFo97vhCj85BLY1H256HrJmjN8"] + "authors": [ + { "id": "did:key:z6Mkk7oqY4pPxhMmGEotDYsFo97vhCj85BLY1H256HrJmjN8" } + ], }, ], "timestamp": TIMESTAMP, @@ -3131,9 +3133,10 @@ mod routes { ], "reactions": [ { - "location": null, "emoji": "🙏", - "authors": ["z6Mkk7oqY4pPxhMmGEotDYsFo97vhCj85BLY1H256HrJmjN8"], + "authors": [ + { "id": "did:key:z6Mkk7oqY4pPxhMmGEotDYsFo97vhCj85BLY1H256HrJmjN8" } + ], }, { "location": { @@ -3149,7 +3152,9 @@ mod routes { } }, "emoji": "🚀", - "authors": ["z6Mkk7oqY4pPxhMmGEotDYsFo97vhCj85BLY1H256HrJmjN8"] + "authors": [ + { "id": "did:key:z6Mkk7oqY4pPxhMmGEotDYsFo97vhCj85BLY1H256HrJmjN8" } + ] }, ], "base": PARENT, @@ -3338,7 +3343,9 @@ mod routes { "reactions": [ { "emoji": "🚀", - "authors": ["z6Mkk7oqY4pPxhMmGEotDYsFo97vhCj85BLY1H256HrJmjN8"] + "authors": [ + { "id": "did:key:z6Mkk7oqY4pPxhMmGEotDYsFo97vhCj85BLY1H256HrJmjN8" } + ], }, ], "timestamp": TIMESTAMP, @@ -3581,7 +3588,9 @@ mod routes { "reactions": [ { "emoji": "🚀", - "authors": ["z6Mkk7oqY4pPxhMmGEotDYsFo97vhCj85BLY1H256HrJmjN8"], + "authors": [ + { "id": "did:key:z6Mkk7oqY4pPxhMmGEotDYsFo97vhCj85BLY1H256HrJmjN8" } + ], }, ], "timestamp": 1671125284,