Skip to content

Commit

Permalink
feat: add getCustodiedPortfolios to Identity.portfolios
Browse files Browse the repository at this point in the history
  • Loading branch information
monitz87 committed Nov 8, 2020
1 parent ce3f8ce commit 52c8a29
Show file tree
Hide file tree
Showing 2 changed files with 73 additions and 6 deletions.
37 changes: 35 additions & 2 deletions src/api/entities/Identity/Portfolios.ts
@@ -1,18 +1,19 @@
import BigNumber from 'bignumber.js';
import { PortfolioId } from 'polymesh-types/types';

import { DefaultPortfolio, Identity, Namespace, NumberedPortfolio } from '~/api/entities';
import { createPortfolio, deletePortfolio } from '~/api/procedures';
import { PolymeshError, TransactionQueue } from '~/base';
import { PortfolioNumber } from '~/polkadot';
import { ErrorCode } from '~/types';
import { numberToU64, stringToIdentityId, u64ToBigNumber } from '~/utils';
import { identityIdToString, numberToU64, stringToIdentityId, u64ToBigNumber } from '~/utils';

/**
* Handles all Portfolio related functionality on the Identity side
*/
export class Portfolios extends Namespace<Identity> {
/**
* Retrieve all the Portfolios for the Identity
* Retrieve all the Portfolios owned by this Identity
*/
public async getPortfolios(): Promise<[DefaultPortfolio, ...NumberedPortfolio[]]> {
const {
Expand Down Expand Up @@ -40,6 +41,38 @@ export class Portfolios extends Namespace<Identity> {
return portfolios;
}

/**
* Retrieve all Portfolios custodied by this Identity
*/
public async getCustodiedPortfolios(): Promise<(DefaultPortfolio | NumberedPortfolio)[]> {
const {
context,
context: {
polymeshApi: {
query: { portfolio },
},
},
parent: { did: custodianDid },
} = this;

const custodian = stringToIdentityId(custodianDid, context);
const portfolioEntries = await portfolio.portfoliosInCustody.entries(custodian);

return portfolioEntries.map(([{ args }]) => {
const { did: ownerDid, kind } = args[1] as PortfolioId;

const did = identityIdToString(ownerDid);

if (kind.isDefault) {
return new DefaultPortfolio({ did }, context);
}

const id = u64ToBigNumber(kind.asUser);

return new NumberedPortfolio({ did, id }, context);
});
}

/**
* Retrieve whether this Identity possesses a Portfolio with a certain ID
*/
Expand Down
42 changes: 38 additions & 4 deletions src/api/entities/Identity/__tests__/Portfolios.ts
Expand Up @@ -56,23 +56,57 @@ describe('Portfolios class', () => {
describe('method: getPortfolios', () => {
test('should retrieve all the portfolios for the identity', async () => {
dsMockUtils.createQueryStub('portfolio', 'portfolios', {
entries: [tuple([rawIdentityId, rawNumberedPortfolioId], dsMockUtils.createMockBytes())],
});

stringToIdentityIdStub.withArgs(did, mockContext).returns(rawIdentityId);
u64ToBigNumberStub.returns(numberedPortfolioId);

const result = await portfolios.getPortfolios();
expect(result).toHaveLength(2);
expect(result[0] instanceof DefaultPortfolio).toBe(true);
expect(result[1] instanceof NumberedPortfolio).toBe(true);
expect(result[0].owner.did).toEqual(did);
expect(result[1].id).toEqual(numberedPortfolioId);
});
});

describe('method: getCustodiedPortfolos', () => {
test('should retrieve all the Portfolios custodied by the Identity', async () => {
dsMockUtils.createQueryStub('portfolio', 'portfoliosInCustody', {
entries: [
tuple(
[dsMockUtils.createMockIdentityId(did), rawNumberedPortfolioId],
dsMockUtils.createMockBytes()
[
rawIdentityId,
dsMockUtils.createMockPortfolioId({
did: rawIdentityId,
kind: dsMockUtils.createMockPortfolioKind('Default'),
}),
],
dsMockUtils.createMockBool(true)
),
tuple(
[
rawIdentityId,
dsMockUtils.createMockPortfolioId({
did: rawIdentityId,
kind: dsMockUtils.createMockPortfolioKind({ User: rawNumberedPortfolioId }),
}),
],
dsMockUtils.createMockBool(true)
),
],
});

stringToIdentityIdStub.withArgs(did, mockContext).returns(rawIdentityId);
u64ToBigNumberStub.returns(numberedPortfolioId);

const result = await portfolios.getPortfolios();
const result = await portfolios.getCustodiedPortfolios();
expect(result).toHaveLength(2);
expect(result[0] instanceof DefaultPortfolio).toBe(true);
expect(result[1] instanceof NumberedPortfolio).toBe(true);
expect(result[0].owner.did).toEqual(did);
expect(result[1].id).toEqual(numberedPortfolioId);
expect((result[1] as NumberedPortfolio).id).toEqual(numberedPortfolioId);
});
});

Expand Down

0 comments on commit 52c8a29

Please sign in to comment.