Use `Did` in a bunch more places

Instead of showing just public keys we need to show the fully qualified
spec for a NID which is prefixed by `did🔑` While we want to maintain
`Author` and `ActorId` for internal use.

Signed-off-by: Sebastian Martinez <me@sebastinez.dev>
This commit is contained in:
Sebastian Martinez 2023-02-16 09:39:42 -03:00 committed by Alexis Sellier
parent 2b5552546c
commit b04451a1bd
No known key found for this signature in database
13 changed files with 76 additions and 70 deletions

1
Cargo.lock generated
View File

@ -1972,6 +1972,7 @@ dependencies = [
"hyper",
"lexopt",
"nonempty 0.8.1",
"pretty_assertions",
"radicle",
"radicle-cli",
"radicle-crypto",

View File

@ -10,7 +10,7 @@ ok Identity proposal '57332790a2eabc0b2fd8c7ff48c3579d5812d405' created 🌱
title: Add Alice
description: Add Alice as a delegate
status: open
author: z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi
author: did:key:z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi
Document Diff
@ -52,7 +52,7 @@ ok Identity proposal 'c3698d4e85f9d4c0ee536b34d6122fc7c81f7e2e' created 🌱
title: Add Bob
description: Add Bob as a delegate
status: open
author: z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi
author: did:key:z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi
Document Diff
@ -98,7 +98,7 @@ ok Accepted proposal ✓
title: Add Alice
description: Add Alice as a delegate
status: open
author: z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi
author: did:key:z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi
Document Diff
@ -123,7 +123,7 @@ Accepted
total: 1
keys: [
"z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi"
"did:key:z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi"
]
Rejected
@ -142,7 +142,7 @@ ok Committed new identity '29ae4b72f5a315328f06fbd68dc1c396a2d5c45e' 🌱
title: Add Alice
description: Add Alice as a delegate
status: committed
author: z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi
author: did:key:z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi
Document Diff
@ -167,7 +167,7 @@ Accepted
total: 1
keys: [
"z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi"
"did:key:z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi"
]
Rejected
@ -191,7 +191,7 @@ ok Accepted proposal ✓
title: Add Bob
description: Add Bob as a delegate
status: open
author: z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi
author: did:key:z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi
Document Diff
@ -216,7 +216,7 @@ Accepted
total: 1
keys: [
"z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi"
"did:key:z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi"
]
Rejected
@ -255,7 +255,7 @@ ok Revision 'z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi/4'
title: Add Bob
description: Add Bob as a delegate
status: open
author: z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi
author: did:key:z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi
Document Diff
@ -300,7 +300,7 @@ ok Revision 'z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi/6'
title: Add Bob
description: Add Bob as a delegate
status: open
author: z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi
author: did:key:z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi
Document Diff
@ -347,7 +347,7 @@ ok Accepted proposal ✓
title: Add Bob
description: Add Bob as a delegate
status: open
author: z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi
author: did:key:z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi
Document Diff
@ -372,7 +372,7 @@ Accepted
total: 1
keys: [
"z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi"
"did:key:z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi"
]
Rejected
@ -391,7 +391,7 @@ ok Committed new identity '60de897bc24898f6908fd1272633c0b15aa4096f' 🌱
title: Add Bob
description: Add Bob as a delegate
status: committed
author: z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi
author: did:key:z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi
Document Diff
@ -416,7 +416,7 @@ Accepted
total: 1
keys: [
"z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi"
"did:key:z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi"
]
Rejected

View File

@ -18,7 +18,7 @@ ok Identity proposal '06d9efa2a9aad06bfdf25a25690e1ec7db2c3c39' created 🌱
title: Add Bob
description: Add Bob as a delegate
status: open
author: z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi
author: did:key:z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi
Document Diff
@ -69,21 +69,21 @@ Next we have the number of `Accepted` reviews from delegates, starting
off with none:
Accepted
total: 0
keys: []
The same with `Rejected` reviews:
Rejected
total: 0
keys: []
Finally, we can see whether the `Quorum` was reached:
Quorum Reached
✗ no
Let's see what happens when we reject the change:
@ -94,7 +94,7 @@ ok Rejected proposal ✗
title: Add Bob
description: Add Bob as a delegate
status: open
author: z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi
author: did:key:z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi
Document Diff
@ -124,7 +124,7 @@ Rejected
total: 1
keys: [
"z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi"
"did:key:z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi"
]
Quorum Reached
@ -136,7 +136,7 @@ Our key was added to the `Rejected` set of `keys` and the `total`
increased to `1`.
Rejected
total: 1
keys: [
"z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi"
@ -150,7 +150,7 @@ ok Accepted proposal ✓
title: Add Bob
description: Add Bob as a delegate
status: open
author: z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi
author: did:key:z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi
Document Diff
@ -175,7 +175,7 @@ Accepted
total: 1
keys: [
"z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi"
"did:key:z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi"
]
Rejected
@ -192,16 +192,16 @@ Our key has changed from the `Rejected` set to the `Accepted` set
instead:
Accepted
total: 1
keys: [
"z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi"
"did:key:z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi"
]
As well as that, the `Quorum` has now been reached:
Quorum Reached
✓ yes
At this point, we can commit the proposal and update the identity:
@ -212,7 +212,7 @@ ok Committed new identity 'c96e764965aaeff1c6ea3e5b97e2b9828773c8b0' 🌱
title: Add Bob
description: Add Bob as a delegate
status: committed
author: z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi
author: did:key:z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi
Document Diff
@ -237,7 +237,7 @@ Accepted
total: 1
keys: [
"z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi"
"did:key:z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi"
]
Rejected
@ -259,7 +259,7 @@ ok Identity proposal 'dc00640d3152ea5f1df59f39f2f5983d2ad21810' created 🌱
title: Update threshold
description: Update to safer threshold
status: open
author: z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi
author: did:key:z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi
Document Diff
@ -303,7 +303,7 @@ ok Closed identity proposal 'dc00640d3152ea5f1df59f39f2f5983d2ad21810'
title: Update threshold
description: Update to safer threshold
status: closed
author: z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi
author: did:key:z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi
Document Diff
@ -360,7 +360,7 @@ $ rad id show dc00640d3152ea5f1df59f39f2f5983d2ad21810
title: Update threshold
description: Update to safer threshold
status: closed
author: z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi
author: did:key:z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi
Document Diff

View File

@ -232,7 +232,7 @@ pub fn find_unmerged_with_base(
workdir: &git::raw::Repository,
) -> anyhow::Result<Vec<(PatchId, Patch, Clock)>> {
// My patches.
let proposed: Vec<_> = patches.proposed_by(patches.public_key())?.collect();
let proposed: Vec<_> = patches.proposed_by(&patches.public_key().into())?.collect();
let mut matches = Vec::new();
for (id, patch, clock) in proposed {

View File

@ -32,7 +32,7 @@ pub fn run(
let mut other = Vec::new();
for (id, patch, _) in proposed {
if *patch.author().id() == me {
if patch.author().id().as_key() == &me {
own.push((id, patch));
} else {
other.push((id, patch));
@ -85,7 +85,7 @@ fn print(
) -> anyhow::Result<()> {
let target_head = common::patch_merge_target_oid(patch.target(), storage)?;
let you = patch.author().id() == whoami;
let you = patch.author().id().as_key() == whoami;
let prefix = "└─ ";
let mut author_info = vec![format!(
"{}* opened by {}",

View File

@ -42,6 +42,7 @@ version = "0.2.0"
[dev-dependencies]
hyper = { version = "0.14.17", default-features = false, features = ["client"] }
pretty_assertions = { version = "1.3.0" }
radicle-cli = { path = "../radicle-cli" }
radicle-crypto = { path = "../radicle-crypto" }
tempfile = { version = "3.3.0" }

View File

@ -9,8 +9,7 @@ use serde_json::{json, Value};
use radicle::cob::issue::{Issue, IssueId};
use radicle::cob::patch::{Patch, PatchId};
use radicle::cob::thread::{self, CommentId};
use radicle::cob::{OpId, Timestamp};
use radicle::identity::PublicKey;
use radicle::cob::{Author, OpId, Timestamp};
use radicle_surf::blob::Blob;
use radicle_surf::tree::Tree;
use radicle_surf::{Commit, Stats};
@ -130,11 +129,6 @@ fn name_in_path(path: &str) -> &str {
}
}
#[derive(Serialize)]
struct Author {
id: PublicKey,
}
#[derive(Serialize)]
#[serde(rename_all = "camelCase")]
struct Comment {
@ -156,9 +150,7 @@ impl<'a> FromIterator<(&'a CommentId, &'a thread::Comment)> for Comments {
for (id, comment) in iter {
comments.push(Comment {
id: id.to_owned(),
author: Author {
id: comment.author(),
},
author: comment.author().into(),
body: comment.body().to_owned(),
reactions: [],
timestamp: comment.timestamp(),

View File

@ -559,6 +559,7 @@ async fn patch_handler(
mod routes {
use axum::body::Body;
use axum::http::StatusCode;
use pretty_assertions::assert_eq;
use serde_json::json;
use crate::api::test::{self, get, patch, post, HEAD, HEAD_1, ISSUE_ID, PATCH_ID};
@ -1020,7 +1021,7 @@ mod routes {
{
"id": ISSUE_ID,
"author": {
"id": "z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi"
"id": "did:key:z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi"
},
"title": "Issue #1",
"state": {
@ -1031,7 +1032,7 @@ mod routes {
{
"id": "z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi/1",
"author": {
"id": "z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi"
"id": "did:key:z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi"
},
"body": "Change 'hello world' to 'hello everyone'",
"reactions": [],
@ -1083,7 +1084,7 @@ mod routes {
json!({
"id": CREATED_ISSUE_ID,
"author": {
"id": "z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi",
"id": "did:key:z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi",
},
"assignees": [],
"title": "Issue #2",
@ -1093,7 +1094,7 @@ mod routes {
"discussion": [{
"id": "z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi/1",
"author": {
"id": "z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi",
"id": "did:key:z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi",
},
"body": "Change 'hello world' to 'hello everyone'",
"reactions": [],
@ -1143,7 +1144,7 @@ mod routes {
json!({
"id": ISSUE_ID,
"author": {
"id": "z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi",
"id": "did:key:z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi",
},
"assignees": [],
"title": "Issue #1",
@ -1154,7 +1155,7 @@ mod routes {
{
"id": "z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi/1",
"author": {
"id": "z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi",
"id": "did:key:z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi",
},
"body": "Change 'hello world' to 'hello everyone'",
"reactions": [],
@ -1164,7 +1165,7 @@ mod routes {
{
"id": "z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi/5",
"author": {
"id": "z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi",
"id": "did:key:z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi",
},
"body": "This is first-level comment",
"reactions": [],
@ -1213,7 +1214,7 @@ mod routes {
json!({
"id": ISSUE_ID,
"author": {
"id": "z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi",
"id": "did:key:z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi",
},
"assignees": [],
"title": "Issue #1",
@ -1224,7 +1225,7 @@ mod routes {
{
"id": "z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi/1",
"author": {
"id": "z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi",
"id": "did:key:z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi",
},
"body": "Change 'hello world' to 'hello everyone'",
"reactions": [],
@ -1234,7 +1235,7 @@ mod routes {
{
"id": "z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi/5",
"author": {
"id": "z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi",
"id": "did:key:z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi",
},
"body": "This is a reply to the first comment",
"reactions": [],
@ -1260,7 +1261,7 @@ mod routes {
{
"id": PATCH_ID,
"author": {
"id": "z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi"
"id": "did:key:z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi"
},
"title": "A new `hello word`",
"description": "change `hello world` in README to something else",
@ -1291,7 +1292,7 @@ mod routes {
{
"id": PATCH_ID,
"author": {
"id": "z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi"
"id": "did:key:z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi"
},
"title": "A new `hello word`",
"description": "change `hello world` in README to something else",

View File

@ -10,19 +10,25 @@ pub use radicle_crdt::clock::Physical as Timestamp;
/// Author.
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct Author {
pub id: NodeId,
pub id: Did,
}
impl Author {
pub fn new(id: NodeId) -> Self {
Self { id }
pub fn new(id: impl Into<Did>) -> Self {
Self { id: id.into() }
}
pub fn id(&self) -> &NodeId {
pub fn id(&self) -> &Did {
&self.id
}
}
impl From<PublicKey> for Author {
fn from(value: PublicKey) -> Self {
Self::new(value)
}
}
#[derive(thiserror::Error, Debug)]
pub enum ReactionError {
#[error("invalid reaction")]

View File

@ -15,7 +15,7 @@ use crate::{
common::Timestamp,
store::{self, FromHistory as _, Transaction},
},
identity::{doc::DocError, Identity, IdentityError},
identity::{doc::DocError, Did, Identity, IdentityError},
prelude::Doc,
storage::{git as storage, RemoteId, WriteRepository},
};
@ -277,7 +277,7 @@ impl Proposal {
})
}
pub fn latest_by(&self, who: &PublicKey) -> Option<(&RevisionId, &Revision)> {
pub fn latest_by(&self, who: &Did) -> Option<(&RevisionId, &Revision)> {
self.revisions().rev().find_map(|(rid, r)| {
if r.author.id() == who {
Some((rid, r))
@ -409,20 +409,20 @@ impl Revision {
.filter_map(|(key, verdict)| verdict.get().map(|verdict| (key, verdict)))
}
pub fn accepted(&self) -> Vec<PublicKey> {
pub fn accepted(&self) -> Vec<Did> {
self.verdicts()
.filter_map(|(key, v)| match v {
Verdict::Accept(_) => Some(*key),
Verdict::Accept(_) => Some(key.into()),
Verdict::Reject => None,
})
.collect()
}
pub fn rejected(&self) -> Vec<PublicKey> {
pub fn rejected(&self) -> Vec<Did> {
self.verdicts()
.filter_map(|(key, v)| match v {
Verdict::Accept(_) => None,
Verdict::Reject => Some(*key),
Verdict::Reject => Some(key.into()),
})
.collect()
}

View File

@ -169,11 +169,12 @@ impl Issue {
self.tags.iter()
}
pub fn author(&self) -> Option<Author> {
pub fn author(&self) -> Author {
self.thread
.comments()
.next()
.map(|(_, c)| Author::new(c.author()))
.expect("Issue::author: at least one comment is present")
}
pub fn description(&self) -> Option<&str> {
@ -580,7 +581,7 @@ mod test {
assert_eq!(created, issue);
assert_eq!(issue.title(), "My first issue");
assert_eq!(issue.author(), Some(issues.author()));
assert_eq!(issue.author(), issues.author());
assert_eq!(issue.description(), Some("Blah blah blah."));
assert_eq!(issue.comments().count(), 1);
assert_eq!(issue.state(), &State::Open);

View File

@ -839,7 +839,7 @@ impl<'a> Patches<'a> {
/// Get patches proposed by the given key.
pub fn proposed_by<'b>(
&'b self,
who: &'b PublicKey,
who: &'b Did,
) -> Result<impl Iterator<Item = (PatchId, Patch, clock::Lamport)> + '_, Error> {
Ok(self
.proposed()?
@ -1027,7 +1027,7 @@ mod test {
let tmp = tempfile::tempdir().unwrap();
let (_, signer, project) = test::setup::context(&tmp);
let mut patches = Patches::open(*signer.public_key(), &project).unwrap();
let author = *signer.public_key();
let author: Did = signer.public_key().into();
let target = MergeTarget::Delegates;
let oid = git::Oid::from_str("e2a85016a458cd809c0ecee81f8c99613b0b0945").unwrap();
let base = git::Oid::from_str("cb18e95ada2bb38aadd8e6cef0963ce37a87add3").unwrap();

View File

@ -32,6 +32,10 @@ impl Did {
.map(Did)
.map_err(DidError::from)
}
pub fn as_key(&self) -> &crypto::PublicKey {
self.deref()
}
}
impl From<&crypto::PublicKey> for Did {