diff options
Diffstat (limited to 'adenosine-pds/src/repo.rs')
-rw-r--r-- | adenosine-pds/src/repo.rs | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/adenosine-pds/src/repo.rs b/adenosine-pds/src/repo.rs index ad9aade..1bfc581 100644 --- a/adenosine-pds/src/repo.rs +++ b/adenosine-pds/src/repo.rs @@ -1,5 +1,5 @@ -use crate::load_car_to_blockstore; use crate::mst::{collect_mst_keys, generate_mst, CommitNode, MetadataNode, RootNode}; +use crate::{load_car_to_blockstore, KeyPair}; use adenosine_cli::identifiers::{Did, Nsid, Tid}; use anyhow::{anyhow, ensure, Context, Result}; use ipfs_sqlite_block_store::BlockStore; @@ -235,6 +235,29 @@ impl RepoStore { Ok(mst_cid) } + /// High-level helper to write a batch of mutations to the repo corresponding to the DID, and + /// signing the resulting new root CID with the given keypair. + pub fn mutate_repo( + &mut self, + did: &Did, + mutations: &[Mutation], + signing_key: &KeyPair, + ) -> Result<Cid> { + let commit_cid = self.lookup_commit(did)?.unwrap(); + let last_commit = self.get_commit(&commit_cid)?; + let new_mst_cid = self + .update_mst(&last_commit.mst_cid, &mutations) + .context("updating MST in repo")?; + let new_root_cid = self.write_root( + last_commit.meta_cid, + Some(last_commit.commit_cid), + new_mst_cid, + )?; + // TODO: is this how signatures are supposed to work? + let sig = signing_key.sign_bytes(new_root_cid.to_string().as_bytes()); + self.write_commit(&did, new_root_cid, &sig) + } + /// returns the root commit from CAR file pub fn load_car(&mut self, car_path: &PathBuf, alias: &str) -> Result<Cid> { let cid = load_car_to_blockstore(&mut self.db, car_path, alias)?; |