Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
credentialDefinitions.service.ts 2.86 KiB
import type { IndyVdrRegisterCredentialDefinitionOptions } from '@credo-ts/indy-vdr';
import type {
  EventAnonCredsCredentialDefinitionsGetAll,
  EventAnonCredsCredentialDefinitionsGetAllInput,
  EventAnonCredsCredentialDefinitionsGetById,
  EventAnonCredsCredentialDefinitionsGetByIdInput,
  EventAnonCredsCredentialDefinitionsRegister,
  EventAnonCredsCredentialDefinitionsRegisterInput,
} from '@ocm/shared';

import { Injectable } from '@nestjs/common';

import { WithTenantService } from '../withTenantService.js';

@Injectable()
export class CredentialDefinitionsService {
  public constructor(private withTenantService: WithTenantService) {}

  public async getAll({
    tenantId,
  }: EventAnonCredsCredentialDefinitionsGetAllInput): Promise<
    EventAnonCredsCredentialDefinitionsGetAll['data']
  > {
    return this.withTenantService.invoke(tenantId, async (t) =>
      (await t.modules.anoncreds.getCreatedCredentialDefinitions({})).map(
        ({ credentialDefinitionId, credentialDefinition }) => ({
          credentialDefinitionId,
          ...credentialDefinition,
        }),
      ),
    );
  }

  public async getById({
    tenantId,
    credentialDefinitionId,
  }: EventAnonCredsCredentialDefinitionsGetByIdInput): Promise<
    EventAnonCredsCredentialDefinitionsGetById['data']
  > {
    return this.withTenantService.invoke(tenantId, async (t) => {
      const { credentialDefinition } =
        await t.modules.anoncreds.getCredentialDefinition(
          credentialDefinitionId,
        );
      return credentialDefinition
        ? { credentialDefinitionId, ...credentialDefinition }
        : null;
    });
  }

  public async register({
    tenantId,
    schemaId,
    issuerDid,
    supportsRevocation,
    tag,
  }: EventAnonCredsCredentialDefinitionsRegisterInput): Promise<
    EventAnonCredsCredentialDefinitionsRegister['data']
  > {
    return this.withTenantService.invoke(tenantId, async (t) => {
      const { credentialDefinitionState } =
        await t.modules.anoncreds.registerCredentialDefinition<IndyVdrRegisterCredentialDefinitionOptions>(
          {
            credentialDefinition: {
              issuerId: issuerDid,
              schemaId,
              tag,
            },
            options: {
              endorserMode: 'internal',
              endorserDid: issuerDid,
              supportRevocation: supportsRevocation,
            },
          },
        );

      if (credentialDefinitionState.state !== 'finished') {
        throw new Error(
          `Error registering credentialDefinition: ${
            credentialDefinitionState.state === 'failed'
              ? credentialDefinitionState.reason
              : 'Not Finished'
          }`,
        );
      }

      return {
        credentialDefinitionId:
          credentialDefinitionState.credentialDefinitionId,
        ...credentialDefinitionState.credentialDefinition,
      };
    });
  }
}