Skip to content

Commit

Permalink
feat(external agents): create external agent base code
Browse files Browse the repository at this point in the history
Also modified `DefaultTrustedClaimIssuer`

BREAKING CHANGE: `DefaultTrustedClaimIssuer` now extends `Identity`. This means its `identity:
Identity` property was removed. Since the class is now an extension of `Identity`, the did can be
obtained via the `did` property
  • Loading branch information
monitz87 committed Jun 11, 2021
1 parent 61c94f2 commit 1057de2
Show file tree
Hide file tree
Showing 9 changed files with 188 additions and 22 deletions.
35 changes: 35 additions & 0 deletions src/api/entities/AgentGroup.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import BigNumber from 'bignumber.js';

import { Context, Entity } from '~/internal';

export interface UniqueIdentifiers {
id: BigNumber;
}

/**
* Represents an external agent for a Security Token
*/
export class AgentGroup extends Entity<UniqueIdentifiers> {
/**
* @hidden
* Check if a value is of type [[UniqueIdentifiers]]
*/
public static isUniqueIdentifiers(identifier: unknown): identifier is UniqueIdentifiers {
const { id } = identifier as UniqueIdentifiers;

return id instanceof BigNumber;
}

public id: BigNumber;

/**
* @hidden
*/
public constructor(identifiers: UniqueIdentifiers, context: Context) {
super(identifiers, context);

const { id } = identifiers;

this.id = id;
}
}
18 changes: 5 additions & 13 deletions src/api/entities/DefaultTrustedClaimIssuer.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Context, Entity, Identity } from '~/internal';
import { Context, Identity } from '~/internal';
import { eventByAddedTrustedClaimIssuer } from '~/middleware/queries';
import { Query } from '~/middleware/types';
import { ClaimType, Ensured, EventIdentifier } from '~/types';
Expand All @@ -18,7 +18,7 @@ export interface Params {
/**
* Represents a default trusted claim issuer for a specific token in the Polymesh blockchain
*/
export class DefaultTrustedClaimIssuer extends Entity<UniqueIdentifiers> {
export class DefaultTrustedClaimIssuer extends Identity {
/**
* @hidden
* Check if a value is of type [[UniqueIdentifiers]]
Expand All @@ -29,11 +29,6 @@ export class DefaultTrustedClaimIssuer extends Entity<UniqueIdentifiers> {
return typeof did === 'string' && typeof ticker === 'string';
}

/**
* identity of the Trusted Claim Issuer
*/
public identity: Identity;

/**
* claim types for which this Claim Issuer is trusted. An undefined value means that the issuer is trusted for all claim types
*/
Expand All @@ -48,13 +43,10 @@ export class DefaultTrustedClaimIssuer extends Entity<UniqueIdentifiers> {
* @hidden
*/
public constructor(args: UniqueIdentifiers & Params, context: Context) {
const { trustedFor, ...identifiers } = args;
const { trustedFor, ticker, ...identifiers } = args;

super(identifiers, context);

const { did, ticker } = identifiers;

this.identity = new Identity({ did }, context);
this.ticker = ticker;
this.trustedFor = trustedFor;
}
Expand All @@ -66,14 +58,14 @@ export class DefaultTrustedClaimIssuer extends Entity<UniqueIdentifiers> {
* @note there is a possibility that the data is not ready by the time it is requested. In that case, `null` is returned
*/
public async addedAt(): Promise<EventIdentifier | null> {
const { ticker, identity, context } = this;
const { ticker, did, context } = this;

const {
data: { eventByAddedTrustedClaimIssuer: event },
} = await context.queryMiddleware<Ensured<Query, 'eventByAddedTrustedClaimIssuer'>>(
eventByAddedTrustedClaimIssuer({
ticker: padString(ticker, MAX_TICKER_LENGTH),
identityId: identity.did,
identityId: did,
})
);

Expand Down
37 changes: 37 additions & 0 deletions src/api/entities/ExternalAgent.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import { Context, Identity } from '~/internal';

export interface UniqueIdentifiers {
did: string;
ticker: string;
}

/**
* Represents an external agent for a Security Token
*/
export class ExternalAgent extends Identity {
/**
* @hidden
* Check if a value is of type [[UniqueIdentifiers]]
*/
public static isUniqueIdentifiers(identifier: unknown): identifier is UniqueIdentifiers {
const { did, ticker } = identifier as UniqueIdentifiers;

return typeof did === 'string' && typeof ticker === 'string';
}

/**
* ticker of the Security Token
*/
public ticker: string;

/**
* @hidden
*/
public constructor(identifiers: UniqueIdentifiers, context: Context) {
super(identifiers, context);

const { ticker } = identifiers;

this.ticker = ticker;
}
}
6 changes: 6 additions & 0 deletions src/api/entities/SecurityToken/ExternalAgents.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import { Namespace, SecurityToken } from '~/internal';

/**
* Handles all Security Token External Agents related functionality
*/
export class ExternalAgents extends Namespace<SecurityToken> {}
3 changes: 3 additions & 0 deletions src/api/entities/SecurityToken/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ import { Checkpoints } from './Checkpoints';
import { Compliance } from './Compliance';
import { CorporateActions } from './CorporateActions';
import { Documents } from './Documents';
import { ExternalAgents } from './ExternalAgents';
import { Issuance } from './Issuance';
import { Offerings } from './Offerings';
import { Settlements } from './Settlements';
Expand Down Expand Up @@ -98,6 +99,7 @@ export class SecurityToken extends Entity<UniqueIdentifiers> {
public offerings: Offerings;
public checkpoints: Checkpoints;
public corporateActions: CorporateActions;
public externalAgents: ExternalAgents;

/**
* @hidden
Expand All @@ -119,6 +121,7 @@ export class SecurityToken extends Entity<UniqueIdentifiers> {
this.offerings = new Offerings(this, context);
this.checkpoints = new Checkpoints(this, context);
this.corporateActions = new CorporateActions(this, context);
this.externalAgents = new ExternalAgents(this, context);

this.transferOwnership = createProcedureMethod(
{ getProcedureAndArgs: args => [transferTokenOwnership, { ticker, ...args }] },
Expand Down
48 changes: 48 additions & 0 deletions src/api/entities/__tests__/AgentGroup.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import BigNumber from 'bignumber.js';

import { AgentGroup, Context, Entity } from '~/internal';
import { dsMockUtils, entityMockUtils } from '~/testUtils/mocks';

describe('AgentGroup class', () => {
let context: Context;

beforeAll(() => {
dsMockUtils.initMocks();
entityMockUtils.initMocks();
});

beforeEach(() => {
context = dsMockUtils.getContextInstance();
});

afterEach(() => {
dsMockUtils.reset();
entityMockUtils.reset();
});

afterAll(() => {
dsMockUtils.cleanup();
entityMockUtils.cleanup();
});

test('should extend Entity', () => {
expect(AgentGroup.prototype instanceof Entity).toBe(true);
});

describe('constructor', () => {
test('should assign id to instance', () => {
const id = new BigNumber(1);
const agentGroup = new AgentGroup({ id }, context);

expect(agentGroup.id).toBe(id);
});
});

describe('method: isUniqueIdentifiers', () => {
test('should return true if the object conforms to the interface', () => {
expect(AgentGroup.isUniqueIdentifiers({ id: new BigNumber(1) })).toBe(true);
expect(AgentGroup.isUniqueIdentifiers({})).toBe(false);
expect(AgentGroup.isUniqueIdentifiers({ id: 1 })).toBe(false);
});
});
});
12 changes: 3 additions & 9 deletions src/api/entities/__tests__/DefaultTrustedClaimIssuer.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,11 @@
import BigNumber from 'bignumber.js';

import { Context, DefaultTrustedClaimIssuer, Entity } from '~/internal';
import { Context, DefaultTrustedClaimIssuer, Identity } from '~/internal';
import { eventByAddedTrustedClaimIssuer } from '~/middleware/queries';
import { dsMockUtils, entityMockUtils } from '~/testUtils/mocks';
import { MAX_TICKER_LENGTH } from '~/utils/constants';
import * as utilsInternalModule from '~/utils/internal';

jest.mock(
'~/api/entities/Identity',
require('~/testUtils/mocks/entities').mockIdentityModule('~/api/entities/Identity')
);

describe('DefaultTrustedClaimIssuer class', () => {
let context: Context;

Expand All @@ -34,18 +29,17 @@ describe('DefaultTrustedClaimIssuer class', () => {
});

test('should extend Entity', () => {
expect(DefaultTrustedClaimIssuer.prototype instanceof Entity).toBe(true);
expect(DefaultTrustedClaimIssuer.prototype instanceof Identity).toBe(true);
});

describe('constructor', () => {
test('should assign ticker and Identity to instance', () => {
const did = 'someDid';
const ticker = 'SOMETICKER';
const identity = entityMockUtils.getIdentityInstance({ did });
const trustedClaimIssuer = new DefaultTrustedClaimIssuer({ did, ticker }, context);

expect(trustedClaimIssuer.ticker).toBe(ticker);
expect(trustedClaimIssuer.identity).toEqual(identity);
expect(trustedClaimIssuer.did).toEqual(did);
});
});

Expand Down
49 changes: 49 additions & 0 deletions src/api/entities/__tests__/ExternalAgent.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
import { Context, ExternalAgent, Identity } from '~/internal';
import { dsMockUtils, entityMockUtils } from '~/testUtils/mocks';

describe('ExternalAgent class', () => {
let context: Context;

beforeAll(() => {
dsMockUtils.initMocks();
entityMockUtils.initMocks();
});

beforeEach(() => {
context = dsMockUtils.getContextInstance();
});

afterEach(() => {
dsMockUtils.reset();
entityMockUtils.reset();
});

afterAll(() => {
dsMockUtils.cleanup();
entityMockUtils.cleanup();
});

test('should extend Identity', () => {
expect(ExternalAgent.prototype instanceof Identity).toBe(true);
});

describe('constructor', () => {
test('should assign ticker and did to instance', () => {
const did = 'someDid';
const ticker = 'SOMETICKER';
const externalAgent = new ExternalAgent({ did, ticker }, context);

expect(externalAgent.ticker).toBe(ticker);
expect(externalAgent.did).toEqual(did);
});
});

describe('method: isUniqueIdentifiers', () => {
test('should return true if the object conforms to the interface', () => {
expect(ExternalAgent.isUniqueIdentifiers({ did: 'someDid', ticker: 'symbol' })).toBe(true);
expect(ExternalAgent.isUniqueIdentifiers({})).toBe(false);
expect(ExternalAgent.isUniqueIdentifiers({ did: 'someDid' })).toBe(false);
expect(ExternalAgent.isUniqueIdentifiers({ did: 1 })).toBe(false);
});
});
});
2 changes: 2 additions & 0 deletions src/internal.ts
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,8 @@ export { NumberedPortfolio } from '~/api/entities/NumberedPortfolio';
export { TransactionQueue } from '~/base/TransactionQueue';
export { Checkpoint } from '~/api/entities/Checkpoint';
export { CheckpointSchedule } from '~/api/entities/CheckpointSchedule';
export { ExternalAgent } from '~/api/entities/ExternalAgent';
export { AgentGroup } from '~/api/entities/AgentGroup';
export {
createCheckpointSchedule,
CreateCheckpointScheduleParams,
Expand Down

0 comments on commit 1057de2

Please sign in to comment.