diff --git a/radicle-httpd/src/api/json.rs b/radicle-httpd/src/api/json.rs index 011ad99f..1a2dbe62 100644 --- a/radicle-httpd/src/api/json.rs +++ b/radicle-httpd/src/api/json.rs @@ -14,7 +14,7 @@ use radicle::cob::thread; use radicle::cob::thread::{CommentId, Thread}; use radicle::cob::{ActorId, Author, Reaction, Timestamp}; use radicle::git::RefString; -use radicle::node::tracking::store as TrackingStore; +use radicle::node::AliasStore; use radicle::prelude::NodeId; use radicle::storage::{git, refs, ReadRepository}; use radicle_surf::blob::Blob; @@ -96,7 +96,7 @@ pub(crate) fn tree(tree: &Tree, path: &str, stats: &Stats) -> Value { } /// Returns JSON for an `issue`. -pub(crate) fn issue(id: IssueId, issue: Issue, aliases: &TrackingStore::Config) -> Value { +pub(crate) fn issue(id: IssueId, issue: Issue, aliases: &impl AliasStore) -> Value { json!({ "id": id.to_string(), "author": author(&issue.author(), aliases.alias(issue.author().id())), @@ -116,7 +116,7 @@ pub(crate) fn patch( id: PatchId, patch: Patch, repo: &git::Repository, - aliases: &TrackingStore::Config, + aliases: &impl AliasStore, ) -> Value { json!({ "id": id.to_string(), @@ -249,7 +249,7 @@ impl<'a> Comment<'a> { id: &'a CommentId, comment: &'a thread::Comment, thread: &'a Thread, - aliases: &TrackingStore::Config, + aliases: &impl AliasStore, ) -> Self { let comment_author = Author::new(comment.author()); Self { diff --git a/radicle-httpd/src/api/v1/projects.rs b/radicle-httpd/src/api/v1/projects.rs index 38653962..41487f1e 100644 --- a/radicle-httpd/src/api/v1/projects.rs +++ b/radicle-httpd/src/api/v1/projects.rs @@ -15,6 +15,7 @@ use tower_http::set_header::SetResponseHeaderLayer; use radicle::cob::{issue, patch, thread, ActorId, Tag}; use radicle::identity::Id; use radicle::node::routing::Store; +use radicle::node::AliasStore; use radicle::node::NodeId; use radicle::storage::git::paths; use radicle::storage::{ReadRepository, ReadStorage, WriteRepository}; @@ -456,7 +457,7 @@ async fn issues_handler( let tracking_store = &ctx.profile.tracking()?; let issues = issues .into_iter() - .map(|(id, issue, _)| api::json::issue(id, issue, tracking_store)) + .map(|(id, issue, _)| api::json::issue(id, issue, &tracking_store)) .skip(page * per_page) .take(per_page) .collect::>(); @@ -578,7 +579,7 @@ async fn issue_handler( Ok::<_, Error>(Json(api::json::issue( issue_id.into(), issue, - tracking_store, + &tracking_store, ))) } @@ -740,7 +741,7 @@ async fn patches_handler( let tracking_store = &ctx.profile.tracking()?; let patches = patches .into_iter() - .map(|(id, patch, _)| api::json::patch(id, patch, &repo, tracking_store)) + .map(|(id, patch, _)| api::json::patch(id, patch, &repo, &tracking_store)) .skip(page * per_page) .take(per_page) .collect::>(); @@ -765,7 +766,7 @@ async fn patch_handler( patch_id.into(), patch, &repo, - tracking_store, + &tracking_store, ))) } diff --git a/radicle/src/node.rs b/radicle/src/node.rs index 46fbefa6..60b405e7 100644 --- a/radicle/src/node.rs +++ b/radicle/src/node.rs @@ -694,6 +694,12 @@ impl Handle for Node { } } +/// A trait for different sources which can potentially return an alias. +pub trait AliasStore { + /// Returns alias of a `NodeId`. + fn alias(&self, nid: &NodeId) -> Option; +} + #[cfg(test)] mod test { use super::*; diff --git a/radicle/src/node/tracking/store.rs b/radicle/src/node/tracking/store.rs index 4da5fa49..0c98a900 100644 --- a/radicle/src/node/tracking/store.rs +++ b/radicle/src/node/tracking/store.rs @@ -5,6 +5,7 @@ use std::{fmt, io, ops::Not as _, time}; use sqlite as sql; use thiserror::Error; +use crate::node::AliasStore; use crate::prelude::{Id, NodeId}; use super::{Node, Policy, Repo, Scope}; @@ -254,10 +255,12 @@ impl Config { } Ok(Box::new(entries.into_iter())) } +} +impl AliasStore for &Config { /// Retrieve `alias` of given node. /// Calls `Self::node_policy` under the hood. - pub fn alias(&self, nid: &NodeId) -> Option { + fn alias(&self, nid: &NodeId) -> Option { self.node_policy(nid) .map(|node| node.and_then(|n| n.alias)) .unwrap_or(None)