From 62bb1bea37c9613117bf7a68913c950e2df53f1a Mon Sep 17 00:00:00 2001
From: Alexey Lunin <alexey.lunin@vereign.com>
Date: Tue, 22 Oct 2024 17:57:25 +0300
Subject: [PATCH] save did svdx, email, public keys in storage

---
 libs/askar/src/agent.utils.ts                 | 39 ++++++++++++++++++-
 .../src/askar/services/agent.ocm.service.ts   |  7 +++-
 2 files changed, 42 insertions(+), 4 deletions(-)

diff --git a/libs/askar/src/agent.utils.ts b/libs/askar/src/agent.utils.ts
index 1f49aa0..da302db 100644
--- a/libs/askar/src/agent.utils.ts
+++ b/libs/askar/src/agent.utils.ts
@@ -65,6 +65,7 @@ import {
   SvdxDidResolver,
   SvdxModule,
   DefaultIpfsClient,
+  SvdxRecordsApi,
 } from "@vereign/credo-did-svdx";
 
 import { SubjectInboundTransport } from "./askar/transports/agent.subject.inbound.transport";
@@ -204,9 +205,43 @@ export const generateDidWeb = async ({
   console.log(JSON.stringify(didDocumentInstance.toJSON(), null, 2));
 };
 
-export const generateRandomDidSvdx = async (agent: Agent) => {
+export const generateDidSvdxForEmail = async (agent: Agent, email: string) => {
   const seed = crypto.randomBytes(46).toString("hex");
-  return generateDidSvdx({ agent, seed });
+  const activeKey = await generateKey({ seed, agent });
+  const nextKey = await generateKey({ seed, agent }); // TODO Where to find next key?
+
+  const WalletKeyPair = createWalletKeyPairClass(agent.context.wallet);
+
+  const keyPair = new WalletKeyPair({
+    id: `key-1`,
+    controller: `did:svdx:${activeKey.fingerprint}`,
+    key: activeKey,
+    wallet: agent.context.wallet,
+  });
+
+  const didResult = await agent.dids.create({
+    method: "svdx",
+    options: {
+      inceptionKey: activeKey,
+      nextKey: nextKey,
+      signer: { signer: () => keyPair.signer() },
+    },
+  });
+  console.log(didResult);
+
+  if (!didResult.didState.didDocument) {
+    throw new Error("Could not create did svdx");
+  }
+
+  const svdxApi: SvdxRecordsApi = agent.modules["svdx"];
+  await svdxApi.save({
+    email: email,
+    did: didResult.didState.did!,
+    activeKey: activeKey.publicKeyBase58,
+    nextKey: nextKey.publicKeyBase58,
+  });
+
+  return didResult;
 };
 
 export const generateDidSvdx = async ({
diff --git a/libs/askar/src/askar/services/agent.ocm.service.ts b/libs/askar/src/askar/services/agent.ocm.service.ts
index 6b353ea..a650e9b 100644
--- a/libs/askar/src/askar/services/agent.ocm.service.ts
+++ b/libs/askar/src/askar/services/agent.ocm.service.ts
@@ -1,7 +1,7 @@
 import { Injectable, Logger } from "@nestjs/common";
 import { EntityNotFoundError, RequestSenderEmailVcDto } from "@ocm-engine/dtos";
 import { CatalogClient } from "../clients/catalog.client";
-import { generateRandomDidSvdx } from "../../agent.utils";
+import { generateDidSvdxForEmail } from "../../agent.utils";
 import { AskarService } from "./askar.service";
 import { IConfCatalog } from "@ocm-engine/config";
 import { ConfigService } from "@nestjs/config";
@@ -55,7 +55,10 @@ export class AgentOcmService {
       };
     }
 
-    const newDidSvdx = await generateRandomDidSvdx(this.askar.agent);
+    const newDidSvdx = await generateDidSvdxForEmail(
+      this.askar.agent,
+      dto.email,
+    );
 
     if (!newDidSvdx.didState.did) {
       throw new Error("Svdx did generation failed");
-- 
GitLab