Skip to content

Commit

Permalink
feat(did-manager): adddidManagerUpdate method for full DID document…
Browse files Browse the repository at this point in the history
… updates (#974)

fixes #971
this is also related to #960 and #948
  • Loading branch information
Eengineer1 committed Aug 3, 2022
1 parent d3b87f5 commit 5682b25
Show file tree
Hide file tree
Showing 7 changed files with 74 additions and 1 deletion.
22 changes: 22 additions & 0 deletions packages/core/src/types/IDIDManager.ts
@@ -1,3 +1,4 @@
import { DIDDocument } from 'did-resolver'
import { IPluginMethodMap, IAgentContext } from './IAgent'
import { IIdentifier, IService, IKey, MinimalImportableIdentifier } from './IIdentifier'
import { IKeyManager } from './IKeyManager'
Expand Down Expand Up @@ -124,6 +125,25 @@ export interface IDIDManagerGetOrCreateArgs {
options?: object
}

export interface IDIDManagerUpdateArgs {
/**
* Required. DID
*/
did: string

/**
* Required
*/
document: Partial<DIDDocument>

/**
* Identifier provider specific options
*/
options?: {
[x: string]: any
}
}

/**
* Input arguments for {@link IDIDManager.didManagerAddKey | didManagerAddKey}
* @public
Expand Down Expand Up @@ -300,6 +320,8 @@ export interface IDIDManager extends IPluginMethodMap {
context: IAgentContext<IKeyManager>,
): Promise<IIdentifier>

didManagerUpdate(args: IDIDManagerUpdateArgs, context: IAgentContext<IKeyManager>): Promise<IIdentifier>

/**
* Imports identifier
*/
Expand Down
7 changes: 6 additions & 1 deletion packages/did-manager/src/abstract-identifier-provider.ts
@@ -1,4 +1,4 @@
import { IIdentifier, IKey, IService, IAgentContext, IKeyManager } from '@veramo/core'
import { IIdentifier, IKey, IService, IAgentContext, IKeyManager, DIDDocument } from '@veramo/core'

/**
* An abstract class for the {@link @veramo/did-manager#DIDManager} identifier providers
Expand All @@ -10,6 +10,11 @@ export abstract class AbstractIdentifierProvider {
context: IAgentContext<IKeyManager>,
): Promise<Omit<IIdentifier, 'provider'>>

abstract updateIdentifier?(
args: { did: string, document: Partial<DIDDocument>, options?: { [x: string]: any } },
context: IAgentContext<IKeyManager>,
): Promise<IIdentifier>

abstract deleteIdentifier(args: IIdentifier, context: IAgentContext<IKeyManager>): Promise<boolean>

abstract addKey(
Expand Down
30 changes: 30 additions & 0 deletions packages/did-manager/src/id-manager.ts
Expand Up @@ -9,6 +9,7 @@ import {
IDIDManagerCreateArgs,
IDIDManagerGetByAliasArgs,
IDIDManagerGetOrCreateArgs,
IDIDManagerUpdateArgs,
IDIDManagerDeleteArgs,
IDIDManagerAddKeyArgs,
IDIDManagerRemoveKeyArgs,
Expand Down Expand Up @@ -55,6 +56,7 @@ export class DIDManager implements IAgentPlugin {
didManagerCreate: this.didManagerCreate.bind(this),
didManagerSetAlias: this.didManagerSetAlias.bind(this),
didManagerGetOrCreate: this.didManagerGetOrCreate.bind(this),
didManagerUpdate: this.didManagerUpdate.bind(this),
didManagerImport: this.didManagerImport.bind(this),
didManagerDelete: this.didManagerDelete.bind(this),
didManagerAddKey: this.didManagerAddKey.bind(this),
Expand Down Expand Up @@ -133,13 +135,41 @@ export class DIDManager implements IAgentPlugin {
): Promise<IIdentifier> {
try {
const providerName = provider || this.defaultProvider
// @ts-ignore
const identifier = await this.store.get({ alias, provider: providerName })
return identifier
} catch {
return this.didManagerCreate({ provider, alias, kms, options }, context)
}
}

/** {@inheritDoc @veramo/core#IDIDManager.didManagerUpdate} */
async didManagerUpdate(
{ did, document, options }: IDIDManagerUpdateArgs,
context: IAgentContext<IKeyManager>,
): Promise<IIdentifier> {
/**
* 1. Check if the identifier is already in the store
* 2. If not, throw
* 3. Check if provider implements updateIdentifier (handles ledger resolution logic)
* 4. If not, throw
* 5. If yes, execute updateIdentifier
* 6. Update the identifier in the store
* 7. Return the identifier
*/
const identifier = await this.store.get({ did })
const identifierProvider = this.getProvider(identifier.provider)
if (typeof identifierProvider?.updateIdentifier !== 'function') {
throw new Error(`not_supported: ${identifier?.provider} provider does not implement full document updates`)
}
const updatedIdentifier = await identifierProvider.updateIdentifier(
{ did, document, options },
context,
)
await this.store.import(updatedIdentifier)
return updatedIdentifier
}

/** {@inheritDoc @veramo/core#IDIDManager.didManagerSetAlias} */
async didManagerSetAlias(
{ did, alias }: IDIDManagerSetAliasArgs,
Expand Down
4 changes: 4 additions & 0 deletions packages/did-provider-ethr/src/ethr-did-provider.ts
Expand Up @@ -210,6 +210,10 @@ export class EthrDIDProvider extends AbstractIdentifierProvider {
return identifier
}

async updateIdentifier(args: { did: string; kms?: string | undefined; alias?: string | undefined; options?: any }, context: IAgentContext<IKeyManager>): Promise<IIdentifier> {
throw new Error('EthrDIDProvider updateIdentifier not supported yet.')
}

async deleteIdentifier(identifier: IIdentifier, context: IRequiredContext): Promise<boolean> {
for (const { kid } of identifier.keys) {
// FIXME: keys might be used by multiple DIDs or even independent
Expand Down
4 changes: 4 additions & 0 deletions packages/did-provider-key/src/key-did-provider.ts
Expand Up @@ -44,6 +44,10 @@ export class KeyDIDProvider extends AbstractIdentifierProvider {
return identifier
}

async updateIdentifier(args: { did: string; kms?: string | undefined; alias?: string | undefined; options?: any }, context: IAgentContext<IKeyManager>): Promise<IIdentifier> {
throw new Error('KeyDIDProvider updateIdentifier not supported yet.')
}

async deleteIdentifier(identifier: IIdentifier, context: IContext): Promise<boolean> {
for (const { kid } of identifier.keys) {
await context.agent.keyManagerDelete({ kid })
Expand Down
4 changes: 4 additions & 0 deletions packages/did-provider-web/src/web-did-provider.ts
Expand Up @@ -35,6 +35,10 @@ export class WebDIDProvider extends AbstractIdentifierProvider {
return identifier
}

async updateIdentifier(args: { did: string; kms?: string | undefined; alias?: string | undefined; options?: any }, context: IAgentContext<IKeyManager>): Promise<IIdentifier> {
throw new Error('WebDIDProvider updateIdentifier not supported yet.')
}

async deleteIdentifier(identifier: IIdentifier, context: IContext): Promise<boolean> {
for (const { kid } of identifier.keys) {
await context.agent.keyManagerDelete({ kid })
Expand Down
4 changes: 4 additions & 0 deletions packages/test-utils/src/fake-did.ts
Expand Up @@ -47,6 +47,10 @@ export class FakeDidProvider extends AbstractIdentifierProvider {
return identifier
}

async updateIdentifier(args: { did: string; kms?: string | undefined; alias?: string | undefined; options?: any }, context: IAgentContext<IKeyManager>): Promise<IIdentifier> {
throw new Error('FakeDIDProvider updateIdentifier not supported yet.')
}

async deleteIdentifier(identifier: IIdentifier, context: IAgentContext<IKeyManager>): Promise<boolean> {
for (const { kid } of identifier.keys) {
await context.agent.keyManagerDelete({ kid })
Expand Down

0 comments on commit 5682b25

Please sign in to comment.